[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71FXVCDCSJSMH8HXAXE6EC3":3,"skill-same:01M71FXVCDCSJSMH8HXAXE6EC3":74},{"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":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":14,"repositoryHtmlUrl":55,"repositoryHomepageUrl":6,"ownerHtmlUrl":56,"ownerBlogUrl":57,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M71FXVCDCSJSMH8HXAXE6EC3","manage-change",null,"ALWAYS invoke this skill when claiming, releasing, submitting, advancing, lowering, closing Applied, or closing Abandoned a Change in the declared Change Store. NEVER assign a Change, write its Maturity or Lifecycle, or close its issue by hand.","outcomeeng\u002Fplugins","outcomeeng","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F257335685?v=4","01M71FRVRF36XYR3HRSCGFHK2R","Outcome Engineering","01M71FRVS4BZG17DWANFJ7EPNY",1,"MIT","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fproduct-tree\u002Fskills\u002Fmanage-change\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"manage change","manage","change","URL","when","invoke","remote","issue comment","claim","issues","render","gh pr","issue close","submit","parse","get","never","branch","fetch","ls","2026-11-10 10:12:30",false,"---\nname: manage-change\ndescription: >-\n  ALWAYS invoke this skill when claiming, releasing, submitting, advancing,\n  lowering, closing Applied, or closing Abandoned a Change in the declared\n  Change Store. NEVER assign a Change, write its Maturity or Lifecycle, or close\n  its issue by hand.\nargument-hint: \"\u003Cclaim|release|submit|advance|lower|applied|abandoned> \u003C#N | owner\u002Frepo#N | issue-url> [Maturity] [reason]\"\narguments: transition reference\nallowed-tools: Read, Write, Bash(gh issue view:*), Bash(gh issue list:*), Bash(gh issue edit:*), Bash(gh issue comment:*), Bash(gh issue close:*), Bash(gh pr view:*), Bash(gh pr checks:*), Bash(gh api graphql:*), Bash(gh api user --jq .login), Bash(gh api repos\u002F*\u002Fissues\u002F*\u002Fdependencies\u002Fblocked_by --method GET -F per_page=100), Bash(git status:*), Bash(git fetch:*), Bash(git switch:*), Bash(git branch --list:*), Bash(git ls-remote --heads origin:*), Bash(git worktree list --porcelain), Bash(git rev-parse:*), Bash(git merge-base --is-ancestor:*), Bash(git push -u origin HEAD:*), Bash(spx worktree status:*), Bash(spx diagnose:*), Bash(spx spec status:*), Bash(spx verification run render:*), Bash(spx verification run input:*), Bash(id -un), Bash(hostname -s),{!% if target == 'claude' %!} Bash(printenv CLAUDE_CODE_SESSION_ID), Agent,{!% else %!} Bash(printenv CODEX_THREAD_ID), {{! tool('spawn_agent') !}}, {{! tool('wait_agent') !}},{!% endif %!} {{! tool('use_skill') !}}\n---\n\n\u003Cobjective>\nOne Transition made on one Change in the declared Change Store — its Transition comment the newest comment, every field it changes written to its home, and the complete state read back — or a refusal naming the state or the actor the Transition requires, with nothing written.\n\u003C\u002Fobjective>\n\n\u003Crequired_reading>\n\nUse skill `product-tree:change-standards`. Its `\u003Ctransitions>` table, `transition-actor`, and `\u003Cgithub_store>` rules govern every step below by their slugs. Read its `references\u002Fgithub-store.md` for every read and write, the Transition comment, and the write discipline.\n\nUse skill `product-tree:commit-changes`. It commits the uncommitted session-owned work a `release` carries, in step 5.\n\nUse skill `product-tree:sync-base`. It brings the claimed branch current, in step 8.\n\n\u003C\u002Frequired_reading>\n\n\u003Cintake>\n\nTake `$transition` as one of `claim`, `release`, `submit`, `advance`, `lower`, `applied`, and `abandoned`; any other value, an empty one included, is refused naming the seven, with nothing read. Take `$reference` as `#N`, `owner\u002Frepo#N`, or an issue URL; any other form is refused naming the three. `advance` takes a target Maturity as its next token, and an `advance` to Applicable then takes the run token of the record's sealed audit run; `lower` takes a target Maturity and then its reason, the rest of the arguments; a missing or unknown Maturity, or a `lower` without a reason, is refused naming what it lacks. `claim` takes an optional absolute worktree root to claim for, which must hold no `.` or `..` segment; without it, the claim is for this session's worktree. No other Transition takes a further token.\n\n\u003C\u002Fintake>\n\n\u003Cworkflow>\n\n1. **Read the Change.** Resolve the store under `\u003Cstore_binding>` and read the issue, its fields, its comments, and its blockers under `\u003Creads>`. Resolve the current login with `gh api user --jq .login`, the session id with `{!% if target == 'claude' %!}printenv CLAUDE_CODE_SESSION_ID{!% else %!}printenv CODEX_THREAD_ID{!% endif %!}`, the user and host with `id -un` and `hostname -s`, and the worktree with `git rev-parse --show-toplevel`. Derive the Change's type under `change-type` from the store's Parent values under `\u003Creads>`. This session holds the Change when the issue's one assignee is the current login and the newest `claim` comment's `worktree` is this worktree; a session restart keeps the Claim under `claim-kept`, so the `session` may differ.\n2. **Check the state.** Refuse the Transition, naming the state found, unless the Change stands in the state its `transitions` row requires: `claim` an open Available Change with no assignee; `release` a Change this session holds; `submit` an Available Change this session holds; `advance` a Submitted Change that meets the condition of each Maturity up to the target under `maturity-ready`, or a Sliced Leaf this session holds that meets the Applicable condition; `lower` a Framed, Sliced, or Applicable Change whose target is lower than its Maturity; `applied` and `abandoned` an open Change. A closed issue, or a Lifecycle of Applied or Abandoned, refuses every Transition under `terminal`.\n3. **Check the actor.** Refuse the Transition, naming the actor `transition-actor` names, unless that actor makes it:\n   - `claim`: any session.\n   - `release` and `submit`: this session as holder.\n   - `advance` to Framed or Sliced, `lower` for a reopened judgment, `abandoned` of a Change no merge absorbs, and `applied` of a Parent: the Operator's explicit direction, given in this conversation or in an order from the Operator's delegate.\n   - `advance` of a Sliced Leaf to Applicable: this session as holder, once the Applicable condition holds as step 4 states.\n   - `lower` to Sliced by the Applier, for a decision line that differs from the reviewed line or a failed Application check, and by any session whose publish wrote the body of an Applicable record: this session, naming that cause in the reason.\n   - `lower` to Proposed for a reframe: this session as Refiner.\n   - `abandoned` of a Change a merge absorbs: this session as Refiner, on the Operator's direction.\n   - `applied` of a Leaf: this session as holder.\n4. **Check the condition.**\n   - For an `advance` to Sliced or Applicable, confirm `github-binding`: read the body's edit history and the Base field's change events under `\u003Creads>`, and require the current body and Base to equal those the review or the audit read, or the review to carry forward to them under `review-carry`. For Applicable, require each Node the record's infrastructure lines name to stand on the default branch with State Passing under `spx spec status --format json`, or a blocker to build it. Read the audit's sealed run with `spx verification run render --verification-type audit --scope-type file --scope \u003Cowner>\u002F\u003Crepo>#\u003CN> --run \u003Crun-token>` and its retained record with the same arguments to `spx verification run input`; advance only when the run is sealed `approved` with no finding and the retained record's body and `base` equal the current body and Base, under `audit-binding`.\n   - For `applied` of a Leaf, require every part of `leaf-applied`. Take the merge commit from the newest `release` comment's `handoff`, or from the pull request this session merged, with `gh pr view \u003Cpr> --json state,mergeCommit`; run `git fetch origin \u003Cdefault>` and require `git merge-base --is-ancestor \u003Cmerge-commit> origin\u002F\u003Cdefault>` to exit zero. Require each Node the Declarations name to hold every result its Malleability requires under `spx spec status --format json`, and every Declarations line to stand on the default branch. Require the audit at close: launch {!% if target == 'codex' %!}`product-tree_change-auditor`{!% else %!}`product-tree:change-auditor`{!% endif %!} once through the native subagent capability with the task message `\u003Cowner>\u002F\u003Crepo>#\u003CN> \u003Cabsolute checkout root>`, and close only when its sealed run is `approved` with no finding. A failed condition refuses the Transition, naming the part that failed.\n   - For `applied` of a Parent, require every Child closed under `\u003Creads>`.\n   - Before any write to Maturity or Lifecycle, run the option check of `\u003Cstore_options>`; a field whose options differ stops the Transition naming the field.\n5. **Prepare the checkout.** For a `claim` for another worktree, the comment's `worktree` is that root, and this step and step 8 leave every checkout as it is. For a `claim` for this worktree, run `spx worktree status` as a read-only check and require this session's `SessionStart` claim on the worktree; record no claim by hand. For `release`, run `git status --short --branch`: commit uncommitted session-owned work through `product-tree:commit-changes`, on the work branch `work\u002Fchange-\u003CN>` when the checkout is detached or on the default branch; push the branch with `git push -u origin HEAD:refs\u002Fheads\u002F\u003Cbranch>` and require the local and origin tips equal; run the preflight checks `spx\u002Flocal\u002Fmerging.md` declares, then `git switch --detach`, and the post-cleanup checks it declares. The live worktree claim stays with the session; never release it.\n6. **Write in order**, under `\u003Cwrite_discipline>`:\n   - `claim`: add the assignee, then post the `claim` comment.\n   - `release`: post the `release` comment with its `handoff`, remove the assignee, then write Lifecycle Available when it reads Submitted.\n   - `submit`: write Lifecycle Submitted, then post the `submit` comment.\n   - `advance`: write the target Maturity, then post the `advance` comment.\n   - `lower`: write the target Maturity, then post the `lower` comment with its `reason`. After a lower other than the Applier's to write a decision line, make the `release` Transition next under `lower-claim`.\n   - `applied`: post the `applied` comment, with `changeset` for a Leaf, remove the assignee, write Lifecycle Applied, then close the issue as completed.\n   - `abandoned`: post the `abandoned` comment, remove the assignee, write Lifecycle Abandoned, then close the issue as not planned.\n7. **Read back** under `\u003Cwrite_discipline>`: every field the Transition writes equals its target, every other field is unchanged, the assignee list is the intended holder or empty, and the Transition's own comment is the newest Transition comment.\n8. **Bring the branch.** After a `claim` for this worktree, read the newest `release` comment's `handoff.branch`. For a branch on origin, `git fetch origin \u003Cbranch>`; when `git worktree list --porcelain` shows another worktree holding it, run `git switch -c \u003Cbranch>-\u003Cn> origin\u002F\u003Cbranch>` with the first `\u003Cn>` from 2 for which `git branch --list` and `git ls-remote --heads origin` print nothing; otherwise `git switch \u003Cbranch>`. A failed fetch or switch leaves the Claim standing and the checkout unchanged, and is reported verbatim. Then use skill `product-tree:sync-base`.\n\n\u003C\u002Fworkflow>\n\n\u003Cresult>\n\nReturn the issue URL, the Transition, the readback values verbatim, and the comment's YAML block. A refusal returns the Transition, the state or the actor it required, the state found, and no write.\n\n\u003C\u002Fresult>\n\n\u003Cfailure_modes>\n\n**The assignee stood in for the holding session.** Claude treated the assignee as proof that this session held the Change while a second session of the same account worked in another worktree. One account runs several sessions, so the newest `claim` comment's worktree names the session's place; the assignee alone names only the account.\n\n**A partial Transition was repaired by guessing.** Claude's Lifecycle write failed after the comment landed, and Claude re-ran a later step to make the state look complete. Stop at the failed write, report the completed writes and the observed state, and leave the partial state visible.\n\n\u003C\u002Ffailure_modes>\n\n\u003Csuccess_criteria>\n\n- A Transition ran only on a Change in the state its row requires and for the actor `transition-actor` names; every other request was refused with nothing written.\n- Each Transition posted exactly one comment, a YAML block with the keys `log-keys` names and only the extra its row admits.\n- No write reached a Maturity, Lifecycle, Value, or Investment field whose options differ from the values the standards name.\n- The issue carries at most one assignee, and the readback shows every written field at its target and every other field unchanged.\n- A release left the work branch pushed and the worktree detached from it, and a claim brought the newest Handoff's branch into this worktree.\n\n\u003C\u002Fsuccess_criteria>\n","\u003Cobjective>\nOne Transition made on one Change in the declared Change Store — its Transition comment the newest comment, every field it changes written to its home, and the complete state read back — or a refusal naming the state or the actor the Transition requires, with nothing written.\n\u003C\u002Fobjective>\n\n\u003Crequired_reading>\n\nUse skill `product-tree:change-standards`. Its `\u003Ctransitions>` table, `transition-actor`, and `\u003Cgithub_store>` rules govern every step below by their slugs. Read its `references\u002Fgithub-store.md` for every read and write, the Transition comment, and the write discipline.\n\nUse skill `product-tree:commit-changes`. It commits the uncommitted session-owned work a `release` carries, in step 5.\n\nUse skill `product-tree:sync-base`. It brings the claimed branch current, in step 8.\n\n\u003C\u002Frequired_reading>\n\n\u003Cintake>\n\nTake `$transition` as one of `claim`, `release`, `submit`, `advance`, `lower`, `applied`, and `abandoned`; any other value, an empty one included, is refused naming the seven, with nothing read. Take `$reference` as `#N`, `owner\u002Frepo#N`, or an issue URL; any other form is refused naming the three. `advance` takes a target Maturity as its next token, and an `advance` to Applicable then takes the run token of the record's sealed audit run; `lower` takes a target Maturity and then its reason, the rest of the arguments; a missing or unknown Maturity, or a `lower` without a reason, is refused naming what it lacks. `claim` takes an optional absolute worktree root to claim for, which must hold no `.` or `..` segment; without it, the claim is for this session's worktree. No other Transition takes a further token.\n\n\u003C\u002Fintake>\n\n\u003Cworkflow>\n\n1. **Read the Change.** Resolve the store under `\u003Cstore_binding>` and read the issue, its fields, its comments, and its blockers under `\u003Creads>`. Resolve the current login with `gh api user --jq .login`, the session id with `{!% if target == 'claude' %!}printenv CLAUDE_CODE_SESSION_ID{!% else %!}printenv CODEX_THREAD_ID{!% endif %!}`, the user and host with `id -un` and `hostname -s`, and the worktree with `git rev-parse --show-toplevel`. Derive the Change's type under `change-type` from the store's Parent values under `\u003Creads>`. This session holds the Change when the issue's one assignee is the current login and the newest `claim` comment's `worktree` is this worktree; a session restart keeps the Claim under `claim-kept`, so the `session` may differ.\n2. **Check the state.** Refuse the Transition, naming the state found, unless the Change stands in the state its `transitions` row requires: `claim` an open Available Change with no assignee; `release` a Change this session holds; `submit` an Available Change this session holds; `advance` a Submitted Change that meets the condition of each Maturity up to the target under `maturity-ready`, or a Sliced Leaf this session holds that meets the Applicable condition; `lower` a Framed, Sliced, or Applicable Change whose target is lower than its Maturity; `applied` and `abandoned` an open Change. A closed issue, or a Lifecycle of Applied or Abandoned, refuses every Transition under `terminal`.\n3. **Check the actor.** Refuse the Transition, naming the actor `transition-actor` names, unless that actor makes it:\n   - `claim`: any session.\n   - `release` and `submit`: this session as holder.\n   - `advance` to Framed or Sliced, `lower` for a reopened judgment, `abandoned` of a Change no merge absorbs, and `applied` of a Parent: the Operator's explicit direction, given in this conversation or in an order from the Operator's delegate.\n   - `advance` of a Sliced Leaf to Applicable: this session as holder, once the Applicable condition holds as step 4 states.\n   - `lower` to Sliced by the Applier, for a decision line that differs from the reviewed line or a failed Application check, and by any session whose publish wrote the body of an Applicable record: this session, naming that cause in the reason.\n   - `lower` to Proposed for a reframe: this session as Refiner.\n   - `abandoned` of a Change a merge absorbs: this session as Refiner, on the Operator's direction.\n   - `applied` of a Leaf: this session as holder.\n4. **Check the condition.**\n   - For an `advance` to Sliced or Applicable, confirm `github-binding`: read the body's edit history and the Base field's change events under `\u003Creads>`, and require the current body and Base to equal those the review or the audit read, or the review to carry forward to them under `review-carry`. For Applicable, require each Node the record's infrastructure lines name to stand on the default branch with State Passing under `spx spec status --format json`, or a blocker to build it. Read the audit's sealed run with `spx verification run render --verification-type audit --scope-type file --scope \u003Cowner>\u002F\u003Crepo>#\u003CN> --run \u003Crun-token>` and its retained record with the same arguments to `spx verification run input`; advance only when the run is sealed `approved` with no finding and the retained record's body and `base` equal the current body and Base, under `audit-binding`.\n   - For `applied` of a Leaf, require every part of `leaf-applied`. Take the merge commit from the newest `release` comment's `handoff`, or from the pull request this session merged, with `gh pr view \u003Cpr> --json state,mergeCommit`; run `git fetch origin \u003Cdefault>` and require `git merge-base --is-ancestor \u003Cmerge-commit> origin\u002F\u003Cdefault>` to exit zero. Require each Node the Declarations name to hold every result its Malleability requires under `spx spec status --format json`, and every Declarations line to stand on the default branch. Require the audit at close: launch {!% if target == 'codex' %!}`product-tree_change-auditor`{!% else %!}`product-tree:change-auditor`{!% endif %!} once through the native subagent capability with the task message `\u003Cowner>\u002F\u003Crepo>#\u003CN> \u003Cabsolute checkout root>`, and close only when its sealed run is `approved` with no finding. A failed condition refuses the Transition, naming the part that failed.\n   - For `applied` of a Parent, require every Child closed under `\u003Creads>`.\n   - Before any write to Maturity or Lifecycle, run the option check of `\u003Cstore_options>`; a field whose options differ stops the Transition naming the field.\n5. **Prepare the checkout.** For a `claim` for another worktree, the comment's `worktree` is that root, and this step and step 8 leave every checkout as it is. For a `claim` for this worktree, run `spx worktree status` as a read-only check and require this session's `SessionStart` claim on the worktree; record no claim by hand. For `release`, run `git status --short --branch`: commit uncommitted session-owned work through `product-tree:commit-changes`, on the work branch `work\u002Fchange-\u003CN>` when the checkout is detached or on the default branch; push the branch with `git push -u origin HEAD:refs\u002Fheads\u002F\u003Cbranch>` and require the local and origin tips equal; run the preflight checks `spx\u002Flocal\u002Fmerging.md` declares, then `git switch --detach`, and the post-cleanup checks it declares. The live worktree claim stays with the session; never release it.\n6. **Write in order**, under `\u003Cwrite_discipline>`:\n   - `claim`: add the assignee, then post the `claim` comment.\n   - `release`: post the `release` comment with its `handoff`, remove the assignee, then write Lifecycle Available when it reads Submitted.\n   - `submit`: write Lifecycle Submitted, then post the `submit` comment.\n   - `advance`: write the target Maturity, then post the `advance` comment.\n   - `lower`: write the target Maturity, then post the `lower` comment with its `reason`. After a lower other than the Applier's to write a decision line, make the `release` Transition next under `lower-claim`.\n   - `applied`: post the `applied` comment, with `changeset` for a Leaf, remove the assignee, write Lifecycle Applied, then close the issue as completed.\n   - `abandoned`: post the `abandoned` comment, remove the assignee, write Lifecycle Abandoned, then close the issue as not planned.\n7. **Read back** under `\u003Cwrite_discipline>`: every field the Transition writes equals its target, every other field is unchanged, the assignee list is the intended holder or empty, and the Transition's own comment is the newest Transition comment.\n8. **Bring the branch.** After a `claim` for this worktree, read the newest `release` comment's `handoff.branch`. For a branch on origin, `git fetch origin \u003Cbranch>`; when `git worktree list --porcelain` shows another worktree holding it, run `git switch -c \u003Cbranch>-\u003Cn> origin\u002F\u003Cbranch>` with the first `\u003Cn>` from 2 for which `git branch --list` and `git ls-remote --heads origin` print nothing; otherwise `git switch \u003Cbranch>`. A failed fetch or switch leaves the Claim standing and the checkout unchanged, and is reported verbatim. Then use skill `product-tree:sync-base`.\n\n\u003C\u002Fworkflow>\n\n\u003Cresult>\n\nReturn the issue URL, the Transition, the readback values verbatim, and the comment's YAML block. A refusal returns the Transition, the state or the actor it required, the state found, and no write.\n\n\u003C\u002Fresult>\n\n\u003Cfailure_modes>\n\n**The assignee stood in for the holding session.** Claude treated the assignee as proof that this session held the Change while a second session of the same account worked in another worktree. One account runs several sessions, so the newest `claim` comment's worktree names the session's place; the assignee alone names only the account.\n\n**A partial Transition was repaired by guessing.** Claude's Lifecycle write failed after the comment landed, and Claude re-ran a later step to make the state look complete. Stop at the failed write, report the completed writes and the observed state, and leave the partial state visible.\n\n\u003C\u002Ffailure_modes>\n\n\u003Csuccess_criteria>\n\n- A Transition ran only on a Change in the state its row requires and for the actor `transition-actor` names; every other request was refused with nothing written.\n- Each Transition posted exactly one comment, a YAML block with the keys `log-keys` names and only the extra its row admits.\n- No write reached a Maturity, Lifecycle, Value, or Investment field whose options differ from the values the standards name.\n- The issue carries at most one assignee, and the readback shows every written field at its target and every other field unchanged.\n- A release left the work branch pushed and the worktree detached from it, and a claim brought the newest Handoff's branch into this worktree.\n\n\u003C\u002Fsuccess_criteria>\n",{"name":5,"arguments":49,"description":7,"allowed-tools":50,"argument-hint":51},"transition reference","Read, Write, Bash(gh issue view:*), Bash(gh issue list:*), Bash(gh issue edit:*), Bash(gh issue comment:*), Bash(gh issue close:*), Bash(gh pr view:*), Bash(gh pr checks:*), Bash(gh api graphql:*), Bash(gh api user --jq .login), Bash(gh api repos\u002F*\u002Fissues\u002F*\u002Fdependencies\u002Fblocked_by --method GET -F per_page=100), Bash(git status:*), Bash(git fetch:*), Bash(git switch:*), Bash(git branch --list:*), Bash(git ls-remote --heads origin:*), Bash(git worktree list --porcelain), Bash(git rev-parse:*), Bash(git merge-base --is-ancestor:*), Bash(git push -u origin HEAD:*), Bash(spx worktree status:*), Bash(spx diagnose:*), Bash(spx spec status:*), Bash(spx verification run render:*), Bash(spx verification run input:*), Bash(id -un), Bash(hostname -s),{!% if target == 'claude' %!} Bash(printenv CLAUDE_CODE_SESSION_ID), Agent,{!% else %!} Bash(printenv CODEX_THREAD_ID), {{! tool('spawn_agent') !}}, {{! tool('wait_agent') !}},{!% endif %!} {{! tool('use_skill') !}}","\u003Cclaim|release|submit|advance|lower|applied|abandoned> \u003C#N | owner\u002Frepo#N | issue-url> [Maturity] [reason]","main","978d51c51d68c99cffb2ba48f7cad9d2f07e5738","src\u002Fplugins\u002Fproduct-tree\u002Fskills\u002Fmanage-change","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins","https:\u002F\u002Fgithub.com\u002Foutcomeeng","https:\u002F\u002Foutcome.engineering","Spec-driven development for AI-assisted engineering","2026-11-10 01:06:33",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add outcomeeng\u002Fplugins --skill manage-change",{"tool":66,"command":67},"bunx","bunx skills add outcomeeng\u002Fplugins --skill manage-change",{"tool":69,"command":70},"pnpm","pnpm dlx skills add outcomeeng\u002Fplugins --skill manage-change","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fproduct-tree\u002Fskills\u002Fmanage-change\u002FSKILL.md",true,[],[75,81,113,129,146,159],{"skillNo":76,"name":77,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":44},"01M71G25RZTPQG9KJ00JCHC1F7","plugin","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Ftemplates\u002Fplugin\u002FSKILL.md",[],[77],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":95,"publishedAt":44},"01M71G23DCX3SV60H63HBBKQ6J","sanitize-powerpoint","ALWAYS invoke this skill when sanitizing, cleaning up, auditing, or aligning a PowerPoint (.pptx) deck — slide-master and layout structure, layout type attributes, stray fonts, non-theme colors, or layout naming. NEVER hand-edit pptx XML without this skill.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fwork\u002Fskills\u002Fsanitize-powerpoint\u002FSKILL.md",[87,90],{"categoryNo":88,"categoryName":89,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":91,"categoryName":92,"taxonomyType":93,"taxonomyTypeDesc":94},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[96,97,98,99,100,101,102,40,103,104,105,106,107,108,109,110,111,112,29,28],"sanitize powerpoint","powerpoint","sanitize","fonts","type","cleaning","structure","attributes","theme","pptx","naming","layout","deck","up","edit","xml","master",{"skillNo":114,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":119,"publishedAt":44},"01M71G21PQKBCDECHGVYSKPJW5","draw-excalidraw","ALWAYS invoke this skill when creating Excalidraw diagrams, visualizing workflows, architectures, or concepts. NEVER generate Excalidraw JSON without this skill.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fwork\u002Fskills\u002Fdraw-excalidraw\u002FSKILL.md",[],[120,121,122,123,124,40,29,125,126,28,127,128],"draw excalidraw","excalidraw","draw","diagrams","architectures","generate","workflows","concepts","json",{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":138,"publishedAt":44},"01M71G1ZMNGFD37RZYM620XM2C","typescript-test-standards","TypeScript test standards enforced across all skills. Loaded by other skills, not invoked directly.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Ftypescript\u002Fskills\u002Ftypescript-test-standards\u002FSKILL.md",[135],{"categoryNo":136,"categoryName":137,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[139,140,141,142,143,144,145],"typescript","typescript test standards","test","standards","false","read","across",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":155,"publishedAt":44},"01M71G1XBH0X1VCTR7269MDGSY","typescript-code-standards","TypeScript code standards enforced across all skills. Loaded by other skills, not invoked directly.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Ftypescript\u002Fskills\u002Ftypescript-code-standards\u002FSKILL.md",[152],{"categoryNo":153,"categoryName":154,"taxonomyType":93,"taxonomyTypeDesc":94},"01JBSEEDCAT000000000000030","开发工程师",[139,156,157,158,142,143,144,145],"code","typescript code standards","code standards",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":165,"publishedAt":44},"01M71G1TQ3VN45SJ75DFMJDB9W","typescript-architecture-standards","TypeScript ADR conventions enforced across architect and auditor skills. Loaded by other skills, not invoked directly.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Ftypescript\u002Fskills\u002Ftypescript-architecture-standards\u002FSKILL.md",[],[166,142,167,168,139,169,170,145,144,171,143,172],"architecture standards","typescript architecture standards","architecture","adr","architect","auditor","conventions"]