@ikon85/agent-workflow-kit 0.38.0 → 0.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/kit-update/SKILL.md +33 -1
- package/.agents/skills/setup-workflow/SKILL.md +34 -3
- package/.agents/skills/setup-workflow/board-sync.md +6 -2
- package/.agents/skills/setup-workflow/workflow-advisories.md +34 -0
- package/.agents/skills/setup-workflow/worktree-lifecycle.md +31 -2
- package/.agents/skills/wrapup/SKILL.md +24 -0
- package/.claude/hooks/drift-guard.py +212 -21
- package/.claude/skills/kit-update/SKILL.md +33 -1
- package/.claude/skills/setup-workflow/SKILL.md +34 -3
- package/.claude/skills/setup-workflow/board-sync.md +6 -2
- package/.claude/skills/setup-workflow/workflow-advisories.md +34 -0
- package/.claude/skills/setup-workflow/worktree-lifecycle.md +31 -2
- package/.claude/skills/wrapup/SKILL.md +24 -0
- package/README.md +37 -0
- package/agent-workflow-kit.package.json +35 -19
- package/package.json +1 -1
- package/scripts/board_bootstrap.py +367 -0
- package/scripts/kit-update-pr.mjs +20 -7
- package/scripts/kit-update-pr.test.mjs +29 -0
- package/scripts/profile_globs.py +347 -0
- package/scripts/test_board_bootstrap.py +348 -0
- package/scripts/test_drift_guard_diagnostics.py +295 -0
- package/scripts/test_profile_globs.py +280 -0
- package/scripts/test_skill_setup_workflow_seeds.py +87 -0
- package/scripts/test_worktree_wrapup_contract.py +588 -0
- package/scripts/workflow-advisories/core.py +29 -4
- package/scripts/worktree-lifecycle/README.md +35 -4
- package/scripts/worktree-lifecycle/core.py +211 -60
- package/scripts/wrapup-land.py +179 -34
- package/src/cli.mjs +32 -1
- package/src/commands/update.mjs +30 -21
- package/src/consumer-migrations.json +19 -0
- package/src/lib/bundle.mjs +10 -0
- package/src/lib/consumerMigrations.mjs +161 -0
|
@@ -216,6 +216,15 @@ Worktree Lifecycle for this repository?"* Offer exactly **Yes**, **Later**, and
|
|
|
216
216
|
- **Disable** — remove only the exact kit-owned hook commands first, then set
|
|
217
217
|
`enabled: false`; retain the profile, setup policy, and unknown keys.
|
|
218
218
|
|
|
219
|
+
Whenever a profile already carries patterns — on **Yes** over an existing
|
|
220
|
+
section and on **Existing** — run
|
|
221
|
+
`python3 scripts/profile_globs.py docs/agents/workflow-capabilities.json` and
|
|
222
|
+
report every pattern it names. Patterns whose match set narrows or widens under
|
|
223
|
+
the shared dialect are a consumer decision: name them with their witness path,
|
|
224
|
+
mark the deletion-authority keys, and let the consumer rewrite them. Never
|
|
225
|
+
rewrite a pattern for them, and never accept a widened deletion-authority
|
|
226
|
+
pattern silently.
|
|
227
|
+
|
|
219
228
|
The default setup entry is
|
|
220
229
|
`python3 scripts/worktree-lifecycle/setup.py`; a proven consumer-native helper
|
|
221
230
|
may remain the configured `setupEntry` for parity. The handoff advisory always
|
|
@@ -273,6 +282,12 @@ repository?"* Offer exactly **Yes**, **Later**, and **No**.
|
|
|
273
282
|
- **Disable** — remove exact kit-owned commands first, then set `enabled:
|
|
274
283
|
false`; preserve every profile value and unknown key.
|
|
275
284
|
|
|
285
|
+
`baseline.sourceGlobs` and the `preRefactor`/`stopChecks` surface globs use the
|
|
286
|
+
same shared dialect as the Worktree Lifecycle patterns above. An adopted
|
|
287
|
+
profile written for the older whole-string matcher can change meaning, so run
|
|
288
|
+
`python3 scripts/profile_globs.py docs/agents/workflow-capabilities.json` and
|
|
289
|
+
report every pattern it names before treating the section as reconciled.
|
|
290
|
+
|
|
276
291
|
### 2f. Section A7 — Optional Safety Guardrails
|
|
277
292
|
|
|
278
293
|
> Safety Guardrails is a counted group of seven independently selectable
|
|
@@ -411,13 +426,29 @@ Seed `docs/agents/domain.md` from [domain.md](./domain.md).
|
|
|
411
426
|
|
|
412
427
|
**Skip entirely if Section A is not GitHub** → write `board-sync.md` with `state=not-applicable`, `mode=none`, a one-line "this project does not use a GitHub-Projects board" note. Terminal; never re-prompts.
|
|
413
428
|
|
|
414
|
-
**Preflight:** `gh auth status
|
|
429
|
+
**Preflight:** `gh auth status` (or `python3 scripts/board_bootstrap.py preflight --json` for the machine-readable answer). If `project`/`read:project` scope is missing, surface the exact remedy: `gh auth refresh -s project,read:project`, then fall through to the stub path below — without the write scope, never attempt creation.
|
|
415
430
|
|
|
416
|
-
**Discover (the
|
|
431
|
+
**Discover (the existing-board path):** `gh project list --owner <remote-owner> --format json`. If **exactly one** project clearly belongs to this repo's owner, read its fields: `gh project field-list <number> --owner <owner> --format json`. Record each field's `id`, `name`, `dataType` (single-select / number / text), and for single-selects the option `id`s. Write `board-sync.md` with `state=filled`, `mode=github-projects-v2`, the project node id + repo + the discovered field/option IDs, seeded from [board-sync.md](./board-sync.md). Fill the `<!-- board-sync:profile -->` **JSON block** (the machine SSOT `scripts/board_config.py` parses) — replace each `<…>` placeholder under `repo`/`project`/`fields` with the discovered value; leave the convention values (`labels`/`branchPrefixes`/`prMarkers`/`headings`) at their seeded defaults unless this project's conventions differ.
|
|
417
432
|
|
|
418
433
|
**Map the status roles (`fields.status.roles`):** the seeded map carries the recommended English stage names (`Idea/Triaged/Spec/In Progress/Review/Done`). Reconcile it against the **discovered** Status option names: an exact (case-sensitive) match keeps its seeded entry; for every role whose seeded name is NOT among the discovered options, ask the user which of their actual option names plays that role (a stage they don't have may be omitted from the map — say so). Never guess a mapping from similarity. Finish with a validation pass: every role value in the map MUST appear in `fields.status.options`, else fix before writing `state=filled`.
|
|
419
434
|
|
|
420
|
-
**
|
|
435
|
+
**Offer creation (no board found, scope present):** a fresh repo can reach a working board in this run — `gh project create` provisions the shell and `gh project field-create --single-select-options` provisions the Status single-select together with its options. Minting a GitHub Project is an outward, user-visible action, so **ask first and never create a board without an explicit yes**. Name the stage options the board will get (the seed's `fields.status.roles` values) in the question, and edit those role values in the seed *before* creating if the user wants a different stage vocabulary — they become the board's Status options verbatim. Present exactly two choices:
|
|
436
|
+
|
|
437
|
+
- **Create it now** — run the one creation path (never hand-assemble the `gh` sequence):
|
|
438
|
+
|
|
439
|
+
```bash
|
|
440
|
+
python3 scripts/board_bootstrap.py create --owner <owner> --repo <owner>/<repo> \
|
|
441
|
+
--title "<repo> Workflow" --seed <path of this skill folder>/board-sync.md \
|
|
442
|
+
--out docs/agents/board-sync.md
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
It re-checks the destination and the scope before it writes anything, creates the project, the Status single-select (option names read from the seed profile's `fields.status.roles` — the board's own stage vocabulary, never a literal), and the Wave / Cluster / Spec-Path / Plan-Path fields, then discovers the real field/option IDs via `gh project field-list` and writes `docs/agents/board-sync.md` at `state=filled`, `mode=github-projects-v2` **from that readback**. Show the user `--dry-run` output first if they want to see the exact sequence. Report the created project's number and URL, and that its Status roles now resolve.
|
|
446
|
+
|
|
447
|
+
- **Not now** — create nothing and take the stub path below unchanged.
|
|
448
|
+
|
|
449
|
+
**A non-zero exit is a stub, never a partial claim.** The helper writes no profile when the destination is consumer-owned, the scope is missing (exit 3), or creation/readback/validation fails — so a half-created board can never produce a profile claiming fields that do not exist. On any non-zero exit, relay its message (it names the project it created, if any, so the user can finish or delete it), then take the stub path; never hand-write a `state=filled` profile and never retry creation without asking again.
|
|
450
|
+
|
|
451
|
+
**Fallback (the single catch-all — declined / no board / >1 / ambiguous / scope error / read failure / creation failure):** write `board-sync.md` with `state=stub`, `mode=github-projects-v2`, and inline **instructions**: which fields the workflow profile needs (a Status single-select with your stage options; optionally a Wave number, a Cluster text, a Spec-Path / Plan-Path text), how to create the board in the GitHub UI / `gh`, and "then run `/setup-workflow` again — it will discover and fill the IDs." Retryable.
|
|
421
452
|
|
|
422
453
|
**Optional — Phase field + saved Views (Program route only):** never
|
|
423
454
|
auto-discovered or auto-created, unlike the fields above — a Phase field's
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
How the board-managed workflow skills (`to-prd`, `to-issues`, `board-to-waves`, …) address this project's GitHub-Projects board. A board stores its fields under opaque GraphQL IDs that differ per board, so they are recorded here rather than hardcoded in any skill.
|
|
4
4
|
|
|
5
5
|
`/setup-workflow` writes this file in one of three states (see the sentinel on the first line):
|
|
6
|
-
- **`state=filled`** — the IDs below were discovered from your board.
|
|
7
|
-
- **`state=stub`** — no single board was
|
|
6
|
+
- **`state=filled`** — the IDs below were discovered from your board (an existing one, or the one `/setup-workflow` offered to create for you).
|
|
7
|
+
- **`state=stub`** — no single board was filled: you declined the creation offer, `gh` lacked the `project` scope, several boards were ambiguous, or creation failed. Create the board (below) and re-run `/setup-workflow`.
|
|
8
8
|
- **`state=not-applicable`** (`mode=none`) — this project does not use a GitHub-Projects board.
|
|
9
9
|
|
|
10
10
|
## Board profile — fields the workflow skills use
|
|
@@ -106,6 +106,10 @@ their titles unchanged; set it once to match your board's language.
|
|
|
106
106
|
|
|
107
107
|
## If the IDs are not yet filled (stub)
|
|
108
108
|
|
|
109
|
+
**Let setup create the board.** Ensure `gh` has the scopes (`gh auth refresh -s project,read:project`) and re-run `/setup-workflow`: with no board and the scope present it *offers* to create one. On your yes it runs `scripts/board_bootstrap.py`, which creates the project plus the Status single-select (its options named after the `roles` map below) and the Wave / Cluster / Spec-Path / Plan-Path fields, reads the real IDs back, and rewrites this file at `state=filled`. Nothing is created without that explicit yes, and a failed run leaves this stub in place rather than a half-true profile.
|
|
110
|
+
|
|
111
|
+
**Or build it by hand:**
|
|
112
|
+
|
|
109
113
|
1. Create a GitHub-Projects (v2) board for this owner and add the fields above (at minimum a `Status` single-select with your stage options — the recommended stage names are `Idea, Triaged, Spec, In Progress, Review, Done`, matching the seeded `roles` defaults).
|
|
110
114
|
2. Ensure `gh` has the scopes: `gh auth refresh -s project,read:project`.
|
|
111
115
|
3. Re-run `/setup-workflow` — it discovers the board (`gh project field-list`) and fills the IDs here automatically.
|
|
@@ -74,6 +74,40 @@ key. Consumer values are never normalized on adoption.
|
|
|
74
74
|
Empty command surfaces are honest inactive defaults. Setup recommends concrete
|
|
75
75
|
project commands from the tools already present, then asks before activating.
|
|
76
76
|
|
|
77
|
+
## Profile glob dialect
|
|
78
|
+
|
|
79
|
+
`baseline.sourceGlobs`, `preRefactor.surfaces[].globs`, and
|
|
80
|
+
`stopChecks.surfaces[].globs` are matched by the one shared dialect in
|
|
81
|
+
`scripts/profile_globs.py` — the same matcher Worktree Lifecycle uses for its
|
|
82
|
+
scratch and landing-artifact policies. There is no second matcher and no
|
|
83
|
+
per-capability variant:
|
|
84
|
+
|
|
85
|
+
- `*` matches any run of characters inside one path segment, never `/`.
|
|
86
|
+
- `?` matches exactly one character inside one path segment.
|
|
87
|
+
- `[seq]` and `[!seq]` are per-segment character classes; `/` is always a
|
|
88
|
+
separator and never a class member.
|
|
89
|
+
- `**` as a complete segment matches zero or more segments, so a leading `**/`
|
|
90
|
+
also matches the repository root and `dir/**` also matches `dir` itself.
|
|
91
|
+
- Matching is always case-sensitive, on every host filesystem.
|
|
92
|
+
- A pattern must match the whole repository-relative path.
|
|
93
|
+
|
|
94
|
+
Thus `src/**` covers `src/a/b.ts`, `**/*.ts` covers both `index.ts` and
|
|
95
|
+
`src/index.ts`, and `*.ts` covers only a root-level file.
|
|
96
|
+
|
|
97
|
+
A profile written for the older whole-string matcher can therefore change
|
|
98
|
+
meaning. When adopting an existing profile, or after any kit update, review it:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
python3 scripts/profile_globs.py docs/agents/workflow-capabilities.json
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
The check names every pattern whose match set narrows or widens, prints the
|
|
105
|
+
concrete witness path that proves the difference, and separately flags patterns
|
|
106
|
+
that only matched case-insensitively on the previous matcher. Exit code 1 means
|
|
107
|
+
at least one pattern needs review. Report the named patterns and let the
|
|
108
|
+
consumer rewrite them; never migrate a pattern automatically. The check reads
|
|
109
|
+
the profile and never edits it.
|
|
110
|
+
|
|
77
111
|
## Hook ownership
|
|
78
112
|
|
|
79
113
|
- PreToolUse on Read:
|
|
@@ -99,11 +99,40 @@ If an existing enabled profile lacks the key, report one actionable setup
|
|
|
99
99
|
decision and leave the project layer unchanged until the consumer confirms the
|
|
100
100
|
derived list.
|
|
101
101
|
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
## Profile glob dialect
|
|
103
|
+
|
|
104
|
+
Every consumer-profile glob in this kit — Worktree Lifecycle and Workflow
|
|
105
|
+
Advisories alike — is matched by the one shared dialect in
|
|
106
|
+
`scripts/profile_globs.py`. There is no second matcher and no per-capability
|
|
107
|
+
variant:
|
|
108
|
+
|
|
109
|
+
- `*` matches any run of characters inside one path segment, never `/`.
|
|
110
|
+
- `?` matches exactly one character inside one path segment.
|
|
111
|
+
- `[seq]` and `[!seq]` are per-segment character classes; `/` is always a
|
|
112
|
+
separator and never a class member.
|
|
113
|
+
- `**` as a complete segment matches zero or more segments, so a leading `**/`
|
|
114
|
+
also matches the repository root and `dir/**` also matches `dir` itself.
|
|
115
|
+
- Matching is always case-sensitive, on every host filesystem.
|
|
116
|
+
- A pattern must match the whole repository-relative path.
|
|
117
|
+
|
|
104
118
|
Thus `**/__pycache__/**` covers root and nested caches, while `dist-kit/*` does
|
|
105
119
|
not cover `dist-kit/a/b`.
|
|
106
120
|
|
|
121
|
+
When adopting an existing profile, or after any kit update, review it before
|
|
122
|
+
trusting its patterns:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
python3 scripts/profile_globs.py docs/agents/workflow-capabilities.json
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
The check names every pattern whose match set narrows or widens against that
|
|
129
|
+
key's legacy matcher, prints the concrete witness path that proves the
|
|
130
|
+
difference, and marks the keys that carry deletion authority. Exit code 1 means
|
|
131
|
+
at least one pattern needs review. Report the named patterns and let the
|
|
132
|
+
consumer rewrite them; never migrate a pattern automatically and never treat a
|
|
133
|
+
widened deletion-authority pattern as an accepted default. The check reads the
|
|
134
|
+
profile and never edits it.
|
|
135
|
+
|
|
107
136
|
The shipped read-only inventory is
|
|
108
137
|
`python3 scripts/worktree-lifecycle/cleanup.py sweep`. The same profile powers
|
|
109
138
|
its branch issue extraction and scratch-only cleanup verdicts.
|
|
@@ -127,6 +127,30 @@ matching path; classify or move those blockers first. Do not use relinquish for
|
|
|
127
127
|
an exact unchanged frozen attempt: a normal retry validates that evidence and
|
|
128
128
|
resumes deterministically.
|
|
129
129
|
|
|
130
|
+
An attempt journaled under the superseded v1 contract is **legacy, not
|
|
131
|
+
corruption**. The STOP says so explicitly and names the same
|
|
132
|
+
`--abandon-unfinished-attempt` archive route; archival stays valid for a v1 and
|
|
133
|
+
a v2 receipt even without a creation baseline or a local main profile, and no
|
|
134
|
+
generated or consumer file is deleted or claimed on that route.
|
|
135
|
+
|
|
136
|
+
If canonical `origin/main` changed its scratch or generator policy *after* the
|
|
137
|
+
attempt started, the PR can merge and cleanup then STOPs with `worktree cleanup
|
|
138
|
+
policy differs from merged canonical origin/main`. That STOP stays fail-closed
|
|
139
|
+
and names its one supported route out:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
python3 scripts/wrapup-land.py land --branch "<branch>" --recover-canonical-cleanup
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
This resumes the teardown of an **already-merged** worktree only. It never reads
|
|
146
|
+
the stale worktree candidate policy: it re-reads the merged canonical policy,
|
|
147
|
+
requires the branch to already be an ancestor of canonical `origin/main`, and
|
|
148
|
+
revalidates each frozen landing identity against that canonical policy before
|
|
149
|
+
the ordinary shared assessment and removal run. Evidence the canonical policy no
|
|
150
|
+
longer names, a changed identity, and any pre-existing or foreign file are hard
|
|
151
|
+
STOPs that delete nothing. Re-running after a successful teardown is a no-op.
|
|
152
|
+
The flag is mutually exclusive with `--abandon-unfinished-attempt`.
|
|
153
|
+
|
|
130
154
|
### 6 · Post-merge (agent)
|
|
131
155
|
- **Sibling propagation:** for each `drift_markers` entry in the land report, append the note to the target issue's `vor_bau` section + re-stamp its `plan_revision`. Log-based markers → **write directly, then show what was written where** (mandatory report — visibility moved from a pre-gate into the report, decision 2026-07-06); fallback candidates the user hasn't confirmed yet → confirm first. Program context widens the target set to unbuilt wave-stubs/leaves and the Program-PRD itself — same append-only mechanism. **Exception:** appends to the Program-PRD or unbuilt wave-stubs do **not** re-stamp `plan_revision` — that stays reserved for structural wave-plan edits via the `to-waves` escalation path; a mere drift note must not stale-block published stubs.
|
|
132
156
|
- **Anchor close:** report says `anchor_complete: true` → `gh issue close <anchor> -c "Wave complete — all slices merged via PR #<pr>."` and verify board status Done. The guard keeps anchors away from every auto-close — this verified close is the only close path; without it the anchor stays silently open after the last slice. **Then re-run the upward propagation**: the land-time `program-sync` ran BEFORE this close, so on a wave-completing slice the Wellenplan still shows 🔄 and the Phasen-Gate stays unchecked — after the board shows Done, run `python3 scripts/board-sync.py program-sync <program-prd#>` once more (the report's `program_sync.program` names it; skip when the report says the parent is not a program). Board auto-rules can lag the close (Close→Done race) — verify Done first, that's what the token reads.
|
package/README.md
CHANGED
|
@@ -434,6 +434,12 @@ Until the explicit policy is committed, `wrapup-land` fails closed before
|
|
|
434
434
|
landing instead of assuming that no generated artifact is eligible for
|
|
435
435
|
session-owned cleanup.
|
|
436
436
|
|
|
437
|
+
You do not have to remember this note. `kit-update` carries a versioned
|
|
438
|
+
registry of required consumer migrations and names any outstanding one in its
|
|
439
|
+
preview and in its terminal report — interactively, under `--yes`, as JSON via
|
|
440
|
+
`update --json`, and in the automated update pull request. It reports the
|
|
441
|
+
decision you still owe; it never writes a cleanup policy for you.
|
|
442
|
+
|
|
437
443
|
### 0.33.0 — capability-gated orchestration
|
|
438
444
|
|
|
439
445
|
`kit-update` reconciles this release for you. These notes matter only if you
|
|
@@ -463,6 +469,37 @@ the old way. Decision record:
|
|
|
463
469
|
|
|
464
470
|
## Release notes
|
|
465
471
|
|
|
472
|
+
### 0.39.0 — self-explaining guards, one glob dialect, a board you can create
|
|
473
|
+
|
|
474
|
+
Nothing in this release requires a consumer action. `kit-update` reconciles it.
|
|
475
|
+
|
|
476
|
+
- **`kit-update` tells you what you still owe.** A versioned registry of
|
|
477
|
+
required consumer migrations is evaluated against your repository and named in
|
|
478
|
+
the preview and in the terminal report — interactively, under `--yes`, as JSON
|
|
479
|
+
via `update --json`, and in the automated update pull request. It reports a
|
|
480
|
+
decision you owe; it never writes a cleanup policy for you.
|
|
481
|
+
- **`setup-workflow` can create the GitHub-Projects board.** When your tracker
|
|
482
|
+
is GitHub and no board exists, setup now *offers* to provision one — Status
|
|
483
|
+
with its stage options plus the workflow fields — and writes the board profile
|
|
484
|
+
from a read-back of what was actually created. It asks first, and a decline
|
|
485
|
+
leaves the previous stub path byte-unchanged.
|
|
486
|
+
- **One repository-relative glob dialect.** Worktree Lifecycle and Workflow
|
|
487
|
+
Advisories now match consumer profile globs through the same matcher, so an
|
|
488
|
+
advisory and a deletion decision can never disagree about which paths a
|
|
489
|
+
pattern selects. A review command classifies your installed patterns and
|
|
490
|
+
reports, with a concrete witness path, any whose match set narrows or widens.
|
|
491
|
+
- **A merged worktree is never stranded.** A landing attempt that started before
|
|
492
|
+
canonical cleanup policy changed now has a supported recovery route, and a
|
|
493
|
+
landing journal written by the previous contract version is classified as
|
|
494
|
+
legacy rather than as corruption — with the exact safe command named in the
|
|
495
|
+
stop. Both routes revalidate frozen evidence against canonical policy and
|
|
496
|
+
delete strictly less than the ordinary path.
|
|
497
|
+
- **Guards say what happened and where.** A drift-blocked handoff now names the
|
|
498
|
+
checkout it evaluated (and says so explicitly when your working directory is a
|
|
499
|
+
sibling worktree of the same repository), a census status reports *what*
|
|
500
|
+
drifted rather than only *that* something did, and a handoff anchored on an
|
|
501
|
+
issue link no longer adopts an issue from a foreign repository.
|
|
502
|
+
|
|
466
503
|
### 0.38.0
|
|
467
504
|
|
|
468
505
|
- added: `docs/adr/0007-session-teardown-requires-provenance-bound-ownership.md`
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"kitVersion": "0.
|
|
2
|
+
"kitVersion": "0.39.0",
|
|
3
3
|
"files": [
|
|
4
4
|
{
|
|
5
5
|
"path": ".agents/skills/ask-matt/SKILL.md",
|
|
@@ -377,7 +377,7 @@
|
|
|
377
377
|
"ownerSkill": "kit-update",
|
|
378
378
|
"surface": "codex",
|
|
379
379
|
"installRole": "consumer",
|
|
380
|
-
"sha256": "
|
|
380
|
+
"sha256": "15d265be0c2b3b73c32f786644d271fffb4b269cf8e3c624c61296fe838dda9e",
|
|
381
381
|
"mode": 420,
|
|
382
382
|
"origin": "kit"
|
|
383
383
|
},
|
|
@@ -587,7 +587,7 @@
|
|
|
587
587
|
"ownerSkill": "setup-workflow",
|
|
588
588
|
"surface": "codex",
|
|
589
589
|
"installRole": "consumer",
|
|
590
|
-
"sha256": "
|
|
590
|
+
"sha256": "c6855a479c030f93be30f6fb65b36b8ca317251f9627fd3f6f0f994d9a8b64fb",
|
|
591
591
|
"mode": 420,
|
|
592
592
|
"origin": "kit"
|
|
593
593
|
},
|
|
@@ -687,7 +687,7 @@
|
|
|
687
687
|
"ownerSkill": "setup-workflow",
|
|
688
688
|
"surface": "codex",
|
|
689
689
|
"installRole": "consumer",
|
|
690
|
-
"sha256": "
|
|
690
|
+
"sha256": "4ef2a06e17e08f0fc0c5cc09e4414af67a186a73ca7634e8c378aab5b5638274",
|
|
691
691
|
"mode": 420,
|
|
692
692
|
"origin": "kit"
|
|
693
693
|
},
|
|
@@ -737,7 +737,7 @@
|
|
|
737
737
|
"ownerSkill": "setup-workflow",
|
|
738
738
|
"surface": "codex",
|
|
739
739
|
"installRole": "consumer",
|
|
740
|
-
"sha256": "
|
|
740
|
+
"sha256": "6ff4ad3980f0802b3b041e051d86fb4df7a65884c7ded98ff878e2cd584d80f1",
|
|
741
741
|
"mode": 420,
|
|
742
742
|
"origin": "kit"
|
|
743
743
|
},
|
|
@@ -757,7 +757,7 @@
|
|
|
757
757
|
"ownerSkill": "setup-workflow",
|
|
758
758
|
"surface": "codex",
|
|
759
759
|
"installRole": "consumer",
|
|
760
|
-
"sha256": "
|
|
760
|
+
"sha256": "bf68e0a80b212159f6838bc2bcd3e85714a70cceeff55ed019f87246175182e7",
|
|
761
761
|
"mode": 420,
|
|
762
762
|
"origin": "kit"
|
|
763
763
|
},
|
|
@@ -997,7 +997,7 @@
|
|
|
997
997
|
"ownerSkill": "wrapup",
|
|
998
998
|
"surface": "codex",
|
|
999
999
|
"installRole": "consumer",
|
|
1000
|
-
"sha256": "
|
|
1000
|
+
"sha256": "de5d451d23b019498104bd8e0ebcbf3385f37aad822496bdb0c47d7021de8761",
|
|
1001
1001
|
"mode": 420,
|
|
1002
1002
|
"origin": "kit"
|
|
1003
1003
|
},
|
|
@@ -1087,7 +1087,7 @@
|
|
|
1087
1087
|
"path": ".claude/hooks/drift-guard.py",
|
|
1088
1088
|
"kind": "hook",
|
|
1089
1089
|
"installRole": "consumer",
|
|
1090
|
-
"sha256": "
|
|
1090
|
+
"sha256": "1480bd322d988a546ed589a2420796b38bbf0f52300598a1dd9aa9ddbeb3ea1d",
|
|
1091
1091
|
"mode": 493,
|
|
1092
1092
|
"origin": "kit"
|
|
1093
1093
|
},
|
|
@@ -1699,7 +1699,7 @@
|
|
|
1699
1699
|
"ownerSkill": "kit-update",
|
|
1700
1700
|
"surface": "claude",
|
|
1701
1701
|
"installRole": "consumer",
|
|
1702
|
-
"sha256": "
|
|
1702
|
+
"sha256": "15d265be0c2b3b73c32f786644d271fffb4b269cf8e3c624c61296fe838dda9e",
|
|
1703
1703
|
"mode": 420,
|
|
1704
1704
|
"origin": "kit"
|
|
1705
1705
|
},
|
|
@@ -1929,7 +1929,7 @@
|
|
|
1929
1929
|
"ownerSkill": "setup-workflow",
|
|
1930
1930
|
"surface": "claude",
|
|
1931
1931
|
"installRole": "consumer",
|
|
1932
|
-
"sha256": "
|
|
1932
|
+
"sha256": "c6855a479c030f93be30f6fb65b36b8ca317251f9627fd3f6f0f994d9a8b64fb",
|
|
1933
1933
|
"mode": 420,
|
|
1934
1934
|
"origin": "kit"
|
|
1935
1935
|
},
|
|
@@ -2029,7 +2029,7 @@
|
|
|
2029
2029
|
"ownerSkill": "setup-workflow",
|
|
2030
2030
|
"surface": "claude",
|
|
2031
2031
|
"installRole": "consumer",
|
|
2032
|
-
"sha256": "
|
|
2032
|
+
"sha256": "4ef2a06e17e08f0fc0c5cc09e4414af67a186a73ca7634e8c378aab5b5638274",
|
|
2033
2033
|
"mode": 420,
|
|
2034
2034
|
"origin": "kit"
|
|
2035
2035
|
},
|
|
@@ -2079,7 +2079,7 @@
|
|
|
2079
2079
|
"ownerSkill": "setup-workflow",
|
|
2080
2080
|
"surface": "claude",
|
|
2081
2081
|
"installRole": "consumer",
|
|
2082
|
-
"sha256": "
|
|
2082
|
+
"sha256": "6ff4ad3980f0802b3b041e051d86fb4df7a65884c7ded98ff878e2cd584d80f1",
|
|
2083
2083
|
"mode": 420,
|
|
2084
2084
|
"origin": "kit"
|
|
2085
2085
|
},
|
|
@@ -2099,7 +2099,7 @@
|
|
|
2099
2099
|
"ownerSkill": "setup-workflow",
|
|
2100
2100
|
"surface": "claude",
|
|
2101
2101
|
"installRole": "consumer",
|
|
2102
|
-
"sha256": "
|
|
2102
|
+
"sha256": "bf68e0a80b212159f6838bc2bcd3e85714a70cceeff55ed019f87246175182e7",
|
|
2103
2103
|
"mode": 420,
|
|
2104
2104
|
"origin": "kit"
|
|
2105
2105
|
},
|
|
@@ -2347,7 +2347,7 @@
|
|
|
2347
2347
|
"ownerSkill": "wrapup",
|
|
2348
2348
|
"surface": "claude",
|
|
2349
2349
|
"installRole": "consumer",
|
|
2350
|
-
"sha256": "
|
|
2350
|
+
"sha256": "de5d451d23b019498104bd8e0ebcbf3385f37aad822496bdb0c47d7021de8761",
|
|
2351
2351
|
"mode": 420,
|
|
2352
2352
|
"origin": "kit"
|
|
2353
2353
|
},
|
|
@@ -2431,6 +2431,14 @@
|
|
|
2431
2431
|
"mode": 420,
|
|
2432
2432
|
"origin": "kit"
|
|
2433
2433
|
},
|
|
2434
|
+
{
|
|
2435
|
+
"path": "scripts/board_bootstrap.py",
|
|
2436
|
+
"kind": "script",
|
|
2437
|
+
"installRole": "consumer",
|
|
2438
|
+
"sha256": "52f4bc89fb078bb9a8735481488bc60d2be438c5c8175555195ac84775e40bfb",
|
|
2439
|
+
"mode": 493,
|
|
2440
|
+
"origin": "kit"
|
|
2441
|
+
},
|
|
2434
2442
|
{
|
|
2435
2443
|
"path": "scripts/board_config.py",
|
|
2436
2444
|
"kind": "script",
|
|
@@ -2555,7 +2563,7 @@
|
|
|
2555
2563
|
"path": "scripts/kit-update-pr.mjs",
|
|
2556
2564
|
"kind": "script",
|
|
2557
2565
|
"installRole": "consumer",
|
|
2558
|
-
"sha256": "
|
|
2566
|
+
"sha256": "17084eede8601d7cf7dd9da85f7738d618111797933a362c93627058fbd335d4",
|
|
2559
2567
|
"mode": 493,
|
|
2560
2568
|
"origin": "kit"
|
|
2561
2569
|
},
|
|
@@ -2623,6 +2631,14 @@
|
|
|
2623
2631
|
"mode": 493,
|
|
2624
2632
|
"origin": "kit"
|
|
2625
2633
|
},
|
|
2634
|
+
{
|
|
2635
|
+
"path": "scripts/profile_globs.py",
|
|
2636
|
+
"kind": "script",
|
|
2637
|
+
"installRole": "consumer",
|
|
2638
|
+
"sha256": "dd11f6e2513eb43813242ace8f4ea00e10b0fa33f4e13fd125afa4a654d61eff",
|
|
2639
|
+
"mode": 493,
|
|
2640
|
+
"origin": "kit"
|
|
2641
|
+
},
|
|
2626
2642
|
{
|
|
2627
2643
|
"path": "scripts/program_graph_parse.py",
|
|
2628
2644
|
"kind": "script",
|
|
@@ -2771,7 +2787,7 @@
|
|
|
2771
2787
|
"path": "scripts/workflow-advisories/core.py",
|
|
2772
2788
|
"kind": "script",
|
|
2773
2789
|
"installRole": "consumer",
|
|
2774
|
-
"sha256": "
|
|
2790
|
+
"sha256": "fcc13d24944a9b1534529e62cc1437617e394f6fe3402647c17cee4ea96aade5",
|
|
2775
2791
|
"mode": 420,
|
|
2776
2792
|
"origin": "kit"
|
|
2777
2793
|
},
|
|
@@ -2795,7 +2811,7 @@
|
|
|
2795
2811
|
"path": "scripts/worktree-lifecycle/core.py",
|
|
2796
2812
|
"kind": "script",
|
|
2797
2813
|
"installRole": "consumer",
|
|
2798
|
-
"sha256": "
|
|
2814
|
+
"sha256": "50c60de1e0238fa1f5cd627f67e57ca4f378275136691411487f36d7fda580dd",
|
|
2799
2815
|
"mode": 420,
|
|
2800
2816
|
"origin": "kit"
|
|
2801
2817
|
},
|
|
@@ -2811,7 +2827,7 @@
|
|
|
2811
2827
|
"path": "scripts/worktree-lifecycle/README.md",
|
|
2812
2828
|
"kind": "doc",
|
|
2813
2829
|
"installRole": "consumer",
|
|
2814
|
-
"sha256": "
|
|
2830
|
+
"sha256": "91cfa8ebb74872ccec1160c0a7b28edcfacea3217900805034dca0f0c8f39c05",
|
|
2815
2831
|
"mode": 420,
|
|
2816
2832
|
"origin": "kit"
|
|
2817
2833
|
},
|
|
@@ -2835,7 +2851,7 @@
|
|
|
2835
2851
|
"path": "scripts/wrapup-land.py",
|
|
2836
2852
|
"kind": "script",
|
|
2837
2853
|
"installRole": "consumer",
|
|
2838
|
-
"sha256": "
|
|
2854
|
+
"sha256": "476012558bb786070ce47458c6f0734ff110d5d957af72e13b20d49a37a03592",
|
|
2839
2855
|
"mode": 493,
|
|
2840
2856
|
"origin": "kit"
|
|
2841
2857
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ikon85/agent-workflow-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.39.0",
|
|
4
4
|
"description": "Portable AI-agent workflow skills (plan → execute → land → learn) for Claude Code & Codex — grilling, TDD, diagnosis, two-axis code review, cross-model Codex review, design & domain-modeling, plus a skill router (ask-matt). npx init/update/diff/uninstall.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|