[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7488EWBKFTDPTZDDFJ4SVM8":3,"skill-same:01M7488EWBKFTDPTZDDFJ4SVM8":53},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":25,"commitSha":26,"skillDirectory":27,"forksCount":28,"repositoryHtmlUrl":29,"repositoryHomepageUrl":6,"ownerHtmlUrl":30,"ownerBlogUrl":31,"ownerDescription":6,"updatedAt":32,"install":33,"resources":46},"01M7488EWBKFTDPTZDDFJ4SVM8","specs-git",null,"Runs a command's specs-repository start and end (specs-preflight, commit-artifacts) through specs-git.py, and says which of its lines to print and where.","ihudak\u002Fai-workflows","ihudak","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F827159?v=4","01M71QAWS87D2T727PGSV234KJ","Ivan Gudak","01M71QAWT84GDCCC530H890X43",2,"MIT","https:\u002F\u002Fgithub.com\u002Fihudak\u002Fai-workflows\u002Fblob\u002Fmain\u002Fplugins\u002Fworkflows-core\u002Fskills\u002Fspecs-git\u002FSKILL.md",[],[],"2026-11-11 15:11:14",false,"---\nname: specs-git\ndescription: Runs a command's specs-repository start and end (specs-preflight, commit-artifacts) through specs-git.py, and says which of its lines to print and where.\nuser-invocable: false\nallowed-tools: Bash, Skill\n---\n\n# specs-git — a run's specs-repository start and end\n\nThe argument names the entry point: `start`, `end` or `declined`. `workflows-core:specs-repo-git` §3 to §8 are the rules, and `${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fspecs-git.py` runs them and asks nothing. This text is what your run executes; it never reads that reference to run its start or its end. A run that another command started `--inline` (`\u002Fdocs-brand` under `\u002Fdocs-init`) calls none of this.\n\n## The call\n\nEach call is one Bash call, with a timeout of 600000 ms:\n\n```bash\npython3 \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fspecs-git.py\" --specs \"${SPECS_PATH-}\" \u003Cstart|end> --command \u002F\u003Cname> …\n```\n\nWhere your run took `$SPECS_PATH` from the *Set SPECS_PATH* answer, open the call with `export SPECS_PATH='\u003Cthe value>';`. Pass:\n\n- `--command \u002F\u003Cname>` — the command now running, as its commit message names it: `\u002Fcreate-ard`, `\u002Fscan`, `\u002Ffeedback` — the slash and the name, never the plugin.\n- `--key \u003CK>` (start), once for each key of the run key set, as `${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fspecs-git\u002Frun-key-set.md` defines it — read that file before your first start call, unless its text is in this conversation word for word. Where your command's start paragraph names its key set, take its words.\n- `--commit-key \u003CK>` (start and end) — the one key the run addressed: an Epic run's own key, never its parent's; a slice's key; where several, the first resolved. At start, only where it is already resolved. At end, the key your command's commit paragraph names for `\u003CKEY>`. Omit it for none; the commit then reads `NOISSUE`.\n- `--register-rebuild \u003Cpath>` (start and end) — only where your command hands `register_rebuild`: that path.\n- `--rerun` (start) — only on a second start in one run with a changed key set: `\u002Fdocument` and `\u002Frelease-notes`, after the operator entered a slice key at their BRD-container stop.\n- `--started \u003Cstamp>` (end, and start with `--rerun` or `--resume`) — the `started` field of your last `start` JSON (*Start*), so that the call reads and writes your run's own record; *Declined*'s call takes it too. Omit it where no `start` call of yours has printed JSON, and on a start that carries neither `--rerun` nor `--resume`, where it is a usage error.\n- `--no-preflight` (end) — where your run stopped before its start call.\n- `--misrooted-stdin` (end) — where your run carries `specs_git: misrooted` from anything but this skill's start — `specs-root-check`'s `SPECS_PATH_INSIDE_TREE:` stop, `env-check`'s `Environment changed:` line, or `session-hygiene` §6's `RESUME_ENVIRONMENT_CHANGED:` line — with that notice, verbatim, on stdin: `\u003C\u003C'EOF'`, the notice, `EOF`.\n- `--session-branch-created \u003Csha7>` (end) — where a session-branch `commit` or `lift` that your command, or its handoff, ran printed `created: true` (`\u002Fimplement` keeps it as run-state `session_branch_created`): the `\u003Cbase short sha>` taken then.\n- `--declined '\u003Cpath>'` (end), once for each path — only where a `declined` call below could not run.\n\n## Start\n\nMake the call where your command's start step stands, once its run key set is known. Then **print every entry of the JSON's `print`, verbatim and in order, as your next output** — the `Environment:` line first, then each notice or line, an entry of several lines inside a `text` fence. These are the lines your command's text tells you to emit at its preflight: print each once. For the rest of the run, read the preflight's results from the last `start` JSON — the first call's, or that of the last `start --rerun` or `start --resume` made since: `specs_git` (`blocked` or `misrooted`), `default`, `default_ref`, `remote`, `offline` and `offline_clause`, `session_branch`, `branch`, `b2_left`, `stay`, `start_dirty`, `midrun` and `started` — wherever your command's text reads them, `started` as the `--started` your later calls carry (*The call*), and `stay`, `start_dirty` and `midrun` wherever you run your end by hand (below). A `replaced` field names a record of this command in this session that your start did not take as its own — set aside, or, with `parked: true`, kept for that run's own end, still protecting its branch where its run key set differs from yours, your run then being typed mid-run under the oldest run open on that branch, which `midrun` names — that one, or an earlier one; it changes nothing you do.\n\n## End\n\nMake the call where your command's commit step stands: its last action, or the step before a phase that hands the session elsewhere. Its `print` is any line that comes before the run's `Specs repo:` line — a failed catch-up's, say — then that line, then any notice it repeats, then any line that follows it. Put them where your command says — in its final report, or here as the run's last output — verbatim, in order and once; nothing after them restates the report.\n\n## When the JSON names `next`\n\nPrint that call's `print` first. Then run `next.run` exactly as given, as a Bash call of its own with `next.timeout_ms` as its timeout, and treat what it returns the same way, until `next` is null. Where such a call ends with no exit status of its own — the harness stopped it at its timeout — run `next.on_timeout`, or, where that is null, the same call again. Where a first `start` or `end` call ends that way, make it again with `--resume` added.\n\n## Declined\n\nWhere a handoff's consent choice is answered with its second or third option, run `python3 \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fspecs-git.py\" declined --command \u002F\u003Cname> --started \u003Cstamp> --path '\u003Cpath>'`, `--started` as *The call* gives it, and one `--path` for each path of that handoff's `deliverable_paths`. It prints nothing for you to show. Where it exits 2 on a line that does not begin `specs-git: not run (usage:`, keep the paths and pass them to your end as `--declined`.\n\n## Where the script cannot start\n\nExit 2 means it did nothing: one `specs-git: not run (…)` line on stderr. Where that line begins `specs-git: not run (usage:`, your call was wrong: correct it and make it again. Otherwise print the line and run this entry point by hand from the reference — `Skill(skill: \"workflows-core:reference\", args: \"specs-repo-git\")`, then its §3 for start or its §4 for end — and, where this is your start, run your end by hand too. JSON with `error` set did part of its work and says so in `print`: print it and go on; never run that entry point again by hand. Where the call that exited 2 is your end and the script ran your start, the stay §4 step 1 reads is your last `start` call's `stay` field, the snapshot that call's `start_dirty` field, and the open run your run was typed under (§3.5) that call's `midrun` field; where that call named a `next` your run never made, or made only for the harness to stop it, §4 step 1's ask for a start that never finished its preflight is yours, on that call's `branch`. Where §4 step 1 then takes the landing or the here form, save where its (1) says neither the landing nor the here form commits anything, make in place of its steps 2 to 4 the call `python3 \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fspecs-git.py\" --specs \"${SPECS_PATH-}\" land --branch \u003Cbranch> --default-ref \u003Cdefault_ref> --command \u002F\u003Cname>` — one Bash call with a timeout of 600000 ms, opened with `export SPECS_PATH='\u003Cthe value>';` where *The call* opens your end call with it; `\u003Cbranch>` the branch HEAD stands on, `\u003Cdefault_ref>` your last `start` call's `default_ref` field — with `--commit-key \u003CK>` and `--register-rebuild \u003Cpath>` as your `end` call carries them, `--snapshot -` where `start_dirty` is not null, with it, as JSON, on stdin (`\u003C\u003C'EOF'`, the JSON, `EOF`), and `--here` for the here form. Then do what §4 step 1's *By hand* paragraph, which names this call, says its `status` leads to; where it exits 2 on a line that does not begin `specs-git: not run (usage:`, or its JSON has `error` set, do what that paragraph says of that, in place of this section's own exit-2 rule.\n\n## Citations\n\nWhich citations of `workflows-core:specs-repo-git`, by name or by its file's path, this text and the script's output serve, and which still read the reference, is the `reference` loader's paragraph on `specs-repo-git`. The run key set is `run-key-set.md`, beside this file.\n","# specs-git — a run's specs-repository start and end\n\nThe argument names the entry point: `start`, `end` or `declined`. `workflows-core:specs-repo-git` §3 to §8 are the rules, and `${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fspecs-git.py` runs them and asks nothing. This text is what your run executes; it never reads that reference to run its start or its end. A run that another command started `--inline` (`\u002Fdocs-brand` under `\u002Fdocs-init`) calls none of this.\n\n## The call\n\nEach call is one Bash call, with a timeout of 600000 ms:\n\n```bash\npython3 \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fspecs-git.py\" --specs \"${SPECS_PATH-}\" \u003Cstart|end> --command \u002F\u003Cname> …\n```\n\nWhere your run took `$SPECS_PATH` from the *Set SPECS_PATH* answer, open the call with `export SPECS_PATH='\u003Cthe value>';`. Pass:\n\n- `--command \u002F\u003Cname>` — the command now running, as its commit message names it: `\u002Fcreate-ard`, `\u002Fscan`, `\u002Ffeedback` — the slash and the name, never the plugin.\n- `--key \u003CK>` (start), once for each key of the run key set, as `${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fspecs-git\u002Frun-key-set.md` defines it — read that file before your first start call, unless its text is in this conversation word for word. Where your command's start paragraph names its key set, take its words.\n- `--commit-key \u003CK>` (start and end) — the one key the run addressed: an Epic run's own key, never its parent's; a slice's key; where several, the first resolved. At start, only where it is already resolved. At end, the key your command's commit paragraph names for `\u003CKEY>`. Omit it for none; the commit then reads `NOISSUE`.\n- `--register-rebuild \u003Cpath>` (start and end) — only where your command hands `register_rebuild`: that path.\n- `--rerun` (start) — only on a second start in one run with a changed key set: `\u002Fdocument` and `\u002Frelease-notes`, after the operator entered a slice key at their BRD-container stop.\n- `--started \u003Cstamp>` (end, and start with `--rerun` or `--resume`) — the `started` field of your last `start` JSON (*Start*), so that the call reads and writes your run's own record; *Declined*'s call takes it too. Omit it where no `start` call of yours has printed JSON, and on a start that carries neither `--rerun` nor `--resume`, where it is a usage error.\n- `--no-preflight` (end) — where your run stopped before its start call.\n- `--misrooted-stdin` (end) — where your run carries `specs_git: misrooted` from anything but this skill's start — `specs-root-check`'s `SPECS_PATH_INSIDE_TREE:` stop, `env-check`'s `Environment changed:` line, or `session-hygiene` §6's `RESUME_ENVIRONMENT_CHANGED:` line — with that notice, verbatim, on stdin: `\u003C\u003C'EOF'`, the notice, `EOF`.\n- `--session-branch-created \u003Csha7>` (end) — where a session-branch `commit` or `lift` that your command, or its handoff, ran printed `created: true` (`\u002Fimplement` keeps it as run-state `session_branch_created`): the `\u003Cbase short sha>` taken then.\n- `--declined '\u003Cpath>'` (end), once for each path — only where a `declined` call below could not run.\n\n## Start\n\nMake the call where your command's start step stands, once its run key set is known. Then **print every entry of the JSON's `print`, verbatim and in order, as your next output** — the `Environment:` line first, then each notice or line, an entry of several lines inside a `text` fence. These are the lines your command's text tells you to emit at its preflight: print each once. For the rest of the run, read the preflight's results from the last `start` JSON — the first call's, or that of the last `start --rerun` or `start --resume` made since: `specs_git` (`blocked` or `misrooted`), `default`, `default_ref`, `remote`, `offline` and `offline_clause`, `session_branch`, `branch`, `b2_left`, `stay`, `start_dirty`, `midrun` and `started` — wherever your command's text reads them, `started` as the `--started` your later calls carry (*The call*), and `stay`, `start_dirty` and `midrun` wherever you run your end by hand (below). A `replaced` field names a record of this command in this session that your start did not take as its own — set aside, or, with `parked: true`, kept for that run's own end, still protecting its branch where its run key set differs from yours, your run then being typed mid-run under the oldest run open on that branch, which `midrun` names — that one, or an earlier one; it changes nothing you do.\n\n## End\n\nMake the call where your command's commit step stands: its last action, or the step before a phase that hands the session elsewhere. Its `print` is any line that comes before the run's `Specs repo:` line — a failed catch-up's, say — then that line, then any notice it repeats, then any line that follows it. Put them where your command says — in its final report, or here as the run's last output — verbatim, in order and once; nothing after them restates the report.\n\n## When the JSON names `next`\n\nPrint that call's `print` first. Then run `next.run` exactly as given, as a Bash call of its own with `next.timeout_ms` as its timeout, and treat what it returns the same way, until `next` is null. Where such a call ends with no exit status of its own — the harness stopped it at its timeout — run `next.on_timeout`, or, where that is null, the same call again. Where a first `start` or `end` call ends that way, make it again with `--resume` added.\n\n## Declined\n\nWhere a handoff's consent choice is answered with its second or third option, run `python3 \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fspecs-git.py\" declined --command \u002F\u003Cname> --started \u003Cstamp> --path '\u003Cpath>'`, `--started` as *The call* gives it, and one `--path` for each path of that handoff's `deliverable_paths`. It prints nothing for you to show. Where it exits 2 on a line that does not begin `specs-git: not run (usage:`, keep the paths and pass them to your end as `--declined`.\n\n## Where the script cannot start\n\nExit 2 means it did nothing: one `specs-git: not run (…)` line on stderr. Where that line begins `specs-git: not run (usage:`, your call was wrong: correct it and make it again. Otherwise print the line and run this entry point by hand from the reference — `Skill(skill: \"workflows-core:reference\", args: \"specs-repo-git\")`, then its §3 for start or its §4 for end — and, where this is your start, run your end by hand too. JSON with `error` set did part of its work and says so in `print`: print it and go on; never run that entry point again by hand. Where the call that exited 2 is your end and the script ran your start, the stay §4 step 1 reads is your last `start` call's `stay` field, the snapshot that call's `start_dirty` field, and the open run your run was typed under (§3.5) that call's `midrun` field; where that call named a `next` your run never made, or made only for the harness to stop it, §4 step 1's ask for a start that never finished its preflight is yours, on that call's `branch`. Where §4 step 1 then takes the landing or the here form, save where its (1) says neither the landing nor the here form commits anything, make in place of its steps 2 to 4 the call `python3 \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fspecs-git.py\" --specs \"${SPECS_PATH-}\" land --branch \u003Cbranch> --default-ref \u003Cdefault_ref> --command \u002F\u003Cname>` — one Bash call with a timeout of 600000 ms, opened with `export SPECS_PATH='\u003Cthe value>';` where *The call* opens your end call with it; `\u003Cbranch>` the branch HEAD stands on, `\u003Cdefault_ref>` your last `start` call's `default_ref` field — with `--commit-key \u003CK>` and `--register-rebuild \u003Cpath>` as your `end` call carries them, `--snapshot -` where `start_dirty` is not null, with it, as JSON, on stdin (`\u003C\u003C'EOF'`, the JSON, `EOF`), and `--here` for the here form. Then do what §4 step 1's *By hand* paragraph, which names this call, says its `status` leads to; where it exits 2 on a line that does not begin `specs-git: not run (usage:`, or its JSON has `error` set, do what that paragraph says of that, in place of this section's own exit-2 rule.\n\n## Citations\n\nWhich citations of `workflows-core:specs-repo-git`, by name or by its file's path, this text and the script's output serve, and which still read the reference, is the `reference` loader's paragraph on `specs-repo-git`. The run key set is `run-key-set.md`, beside this file.\n",{"name":5,"description":7,"allowed-tools":24,"user-invocable":20},"Bash, Skill","main","3016ead8b48448264b94f3010a43c48083319eca","plugins\u002Fworkflows-core\u002Fskills\u002Fspecs-git",0,"https:\u002F\u002Fgithub.com\u002Fihudak\u002Fai-workflows","https:\u002F\u002Fgithub.com\u002Fihudak","dynatrace.com","2026-11-14 01:44:58",{"source":8,"skillName":5,"commands":34,"prompt":44,"zipAvailable":45},[35,38,41],{"tool":36,"command":37},"npx","npx skills add ihudak\u002Fai-workflows --skill specs-git",{"tool":39,"command":40},"bunx","bunx skills add ihudak\u002Fai-workflows --skill specs-git",{"tool":42,"command":43},"pnpm","pnpm dlx skills add ihudak\u002Fai-workflows --skill specs-git","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fihudak\u002Fai-workflows\u002Fblob\u002Fmain\u002Fplugins\u002Fworkflows-core\u002Fskills\u002Fspecs-git\u002FSKILL.md",true,[47],{"path":48,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":51,"sourceHtmlUrl":52},"run-key-set.md","REFERENCE","参考文档",5173,"https:\u002F\u002Fgithub.com\u002Fihudak\u002Fai-workflows\u002Fblob\u002Fmain\u002Fplugins\u002Fworkflows-core\u002Fskills\u002Fspecs-git\u002Frun-key-set.md",[54,70,75,80,85,90],{"skillNo":55,"name":56,"nameZh":6,"description":57,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":58,"categories":59,"keywords":60,"publishedAt":69},"01M71QFDTG26ZYKHKXB4CSBZVF","reference","Read a shared workflows-core reference by name, and optionally one part of it.","https:\u002F\u002Fgithub.com\u002Fihudak\u002Fai-workflows\u002Fblob\u002Fmain\u002Fscripts\u002Ffixtures\u002Freference-parts\u002Fwrong_call_before_right_call\u002Fplugins\u002Fworkflows-core\u002Fskills\u002Freference\u002FSKILL.md",[],[56,61,62,63,64,65,66,67,68],"workflows","core","read","shared","name","it","by name","one","2026-11-10 13:02:02",{"skillNo":71,"name":56,"nameZh":6,"description":57,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":74,"publishedAt":69},"01M71QFBEB5WDC147RMWK5VT37","https:\u002F\u002Fgithub.com\u002Fihudak\u002Fai-workflows\u002Fblob\u002Fmain\u002Fscripts\u002Ffixtures\u002Freference-parts\u002Fwrong_call_after_right_call\u002Fplugins\u002Fworkflows-core\u002Fskills\u002Freference\u002FSKILL.md",[],[56,66,61,62,63,64,65,67,68],{"skillNo":76,"name":56,"nameZh":6,"description":57,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":69},"01M71QFA6J4A8KCGQ5NTA496P3","https:\u002F\u002Fgithub.com\u002Fihudak\u002Fai-workflows\u002Fblob\u002Fmain\u002Fscripts\u002Ffixtures\u002Freference-parts\u002Fwhole_load_before_free_sentence\u002Fplugins\u002Fworkflows-core\u002Fskills\u002Freference\u002FSKILL.md",[],[56,63,64,65,66,67,68,61,62],{"skillNo":81,"name":56,"nameZh":6,"description":57,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":69},"01M71QF8YR6ZTH1PB4JNWAPN7Z","https:\u002F\u002Fgithub.com\u002Fihudak\u002Fai-workflows\u002Fblob\u002Fmain\u002Fscripts\u002Ffixtures\u002Freference-parts\u002Funknown_part_request\u002Fplugins\u002Fworkflows-core\u002Fskills\u002Freference\u002FSKILL.md",[],[56,61,62,63,64,65,66,67,68],{"skillNo":86,"name":56,"nameZh":6,"description":57,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":87,"categories":88,"keywords":89,"publishedAt":69},"01M71QF7F9S397NQ00KX8A4CFW","https:\u002F\u002Fgithub.com\u002Fihudak\u002Fai-workflows\u002Fblob\u002Fmain\u002Fscripts\u002Ffixtures\u002Freference-parts\u002Ftwo_calls_one_sentence\u002Fplugins\u002Fworkflows-core\u002Fskills\u002Freference\u002FSKILL.md",[],[56,66,61,62,63,64,65,67,68],{"skillNo":91,"name":56,"nameZh":6,"description":57,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":69},"01M71QF660FXJ9R9EG4P1QNVM2","https:\u002F\u002Fgithub.com\u002Fihudak\u002Fai-workflows\u002Fblob\u002Fmain\u002Fscripts\u002Ffixtures\u002Freference-parts\u002Ftwo_calls_one_paragraph\u002Fplugins\u002Fworkflows-core\u002Fskills\u002Freference\u002FSKILL.md",[],[56,62,63,64,65,66,67,68,61]]