Afk init
Part of the afk pipeline. One-time, idempotent bootstrap for a repository — detect build/test/lint commands, write .afk/config.md, ignore .afk/, and record the plugin root. Run once per repo before the other afk skills. Triggers include "/afk-init", "set up afk", "initialise afk".From its SKILL.md
npx -y skills add jimmy1992abc/afk --skill afk-initAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
3.4 KB, as published. Nobody here has run it
afk-init
Prepare a repository so the afk pipeline works in it. Idempotent: safe to re-run;
it fills gaps and never overwrites a value a developer set by hand. The pipeline
skills run this same bootstrap automatically when .afk/ is absent, so it
rarely needs invoking by hand — /afk-init is for an explicit re-detect.
Steps
-
Confirm the repo. Require a git working tree with a remote; stop with a clear message if either is absent.
-
Create
.afk/(withruns/inside) if missing, in the repository's main working tree — the firstworktreeline ofgit worktree list --porcelain— so every linked worktree resolves the same.afk/. -
Write
.afk/config.mdfrom the plugin'stemplates/afk-config.example.mdonly when it does not already exist — never clobber an existing config. -
Detect commands. Fill any blank
test/lint/buildline from the project's own manifest or task runner. Leave a line blank and say so when nothing is found — never guess a command. -
Record
pluginRoot. Resolve the plugin's install location (${CLAUDE_PLUGIN_ROOT}when set, else the directory this skill loaded from) into.afk/config.md, so bundled helpers resolve under a drop-in install where the env var is unset. When a value is already recorded, ask the helper what to do with it rather than deciding by hand — an install cache path is version-keyed, so a value written before an update names a directory that does not contain the skills now running:node "<plugin-root>/lib/plugin-root.mjs" --configured <recorded> --resolved <resolved>It prints
{ action, root, reason }:record(nothing recorded yet),refresh(the recorded value is a superseded version of this same install — write the resolved one), orkeep(a custom or manual root, which is a deliberate choice and survives). Report the reason either way. -
Ignore
.afk/. Append the line from the plugin'stemplates/gitignore-snippet.txt, if absent, toinfo/excludeundergit rev-parse --path-format=absolute --git-common-dir. That file is shared by every linked worktree and is not tracked, so one write covers.afk/wherever it is read from without dirtying a checkout that another session may have mid-work on another branch. -
Surface the update notice. Run
node "<plugin-root>/scripts/update-check.mjs"and pass on any line it prints. It is silent when current, offline, or opted out, and never blocks — a stale install is otherwise invisible to anyone who does not run the fullafkdriver. Installing the update is the host's job and the operator's call; never self-update from a skill. -
Report each action as created / updated / already present.
Rules
- Idempotent and non-destructive: existing values win; re-runs only fill gaps.
The one exception is a
pluginRootthat names a superseded version of the install now running — a stale cache path is an expired fact, not a choice. - Secrets never enter
.afk/config.md; keys stay in the environment. - A blank or absent
config.mdis valid — the pipeline resolves safe defaults.