@ikon85/agent-workflow-kit 0.18.0 → 0.20.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.
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: memory-lifecycle
3
+ description: "Preview and apply a consumer-owned memory lifecycle without crossing configured roots or overwriting active, archived, or recovery evidence. Use when a user wants to restore archived memories, inspect memory placement, or run an approved memory recovery."
4
+ ---
5
+
6
+ # Memory Lifecycle
7
+
8
+ Coordinate the current repository's memory placement and recovery through the
9
+ deterministic helper at `scripts/memory-lifecycle/index.mjs`. The helper owns
10
+ path validation, dry-run verdicts, exclusive restore writes, hashing, and
11
+ receipts. Keep this skill thin: do not reimplement those rules with shell file
12
+ operations.
13
+
14
+ ## Boundaries
15
+
16
+ - Work only below the consumer-owned roots in
17
+ `docs/agents/workflow-capabilities.json`.
18
+ - Never scan another repository or a user-global memory root that the current
19
+ consumer profile does not explicitly own.
20
+ - Treat active memories, archives, policy templates, and restore receipts as
21
+ consumer-owned. Never overwrite them.
22
+ - `init`, `update`, and an ordinary `setup-workflow` rerun must not enable this
23
+ capability or change placement, retention, restore, or pruning grants.
24
+ - Destructive pruning is outside the helper. It requires a separate preview and
25
+ explicit user approval; do not infer that approval from restore permission.
26
+
27
+ ## Consumer profile
28
+
29
+ Adopt the `memoryLifecycle` section of
30
+ `docs/agents/workflow-capabilities.json`. Missing or disabled configuration is
31
+ a valid no-write `disabled` result.
32
+
33
+ ```json
34
+ {
35
+ "memoryLifecycle": {
36
+ "enabled": true,
37
+ "activeRoot": ".memory/active",
38
+ "archiveRoot": ".memory/archive",
39
+ "receiptRoot": ".memory/receipts",
40
+ "approvals": { "restore": false, "prune": false },
41
+ "memories": [
42
+ { "path": "decisions/example.md", "enabled": true }
43
+ ]
44
+ }
45
+ }
46
+ ```
47
+
48
+ Preserve unknown profile keys. Every configured root and candidate path must be
49
+ repository-relative. Absolute paths, parent escapes, symlink traversal,
50
+ different-content collisions, and missing restore approval are refused.
51
+
52
+ ## Workflow
53
+
54
+ 1. **Preview.** Run:
55
+
56
+ ```sh
57
+ node scripts/memory-lifecycle/index.mjs
58
+ ```
59
+
60
+ This is the default no-write mode. Count the candidate paths and confirm each
61
+ appears exactly once as `create`, `restore`, `preserve`, `skip`, or `refuse`.
62
+ 2. **Review refusals.** Explain every refusal. Do not weaken root, symlink,
63
+ collision, or approval checks to make the run green.
64
+ 3. **Confirm recovery.** Before applying, require the consumer profile's
65
+ `approvals.restore` to already record the explicit restore grant. A chat
66
+ instruction does not silently rewrite the tracked policy.
67
+ 4. **Apply.** Run:
68
+
69
+ ```sh
70
+ node scripts/memory-lifecycle/index.mjs --apply
71
+ ```
72
+
73
+ The helper restores with exclusive-create semantics and keeps the archive.
74
+ A concurrent destination collision becomes `refused`, never an overwrite.
75
+ 5. **Read back.** Verify restored files by path and hash, not by printing memory
76
+ contents. Confirm the receipt has schema/source versions plus
77
+ `restored`/`skipped`/`refused` path verdicts and contains no memory content.
78
+ 6. **Rerun.** Run the preview again. An identical restored file is preserved;
79
+ the rerun writes no duplicate receipt.
80
+
81
+ Use `--profile <repository-relative-path>` only when the repository documents a
82
+ different consumer-owned profile location.
83
+
84
+ ## Final report
85
+
86
+ Report:
87
+
88
+ - dry-run counts for all five action classes;
89
+ - applied `restored`/`skipped`/`refused` counts;
90
+ - receipt path and source versions, without memory contents;
91
+ - archive-preservation and rerun/no-write result;
92
+ - any pruning request left pending explicit approval.
@@ -18,6 +18,7 @@ Use this section as the entry-point map for agent-assisted work. The individual
18
18
  - **Multi-session build from a PRD or issue:** use `implement` to drive `tdd` end-to-end, one red-green slice at a time.
19
19
  - **Implementation slice:** use `tdd` for one behavior at a time: RED, GREEN, then refactor.
20
20
  - **Build or refresh a project-local census:** use `census-update` to scan facts, resolve ambiguous decisions one at a time, and transactionally activate a counted census.
21
+ - **Preview or restore consumer-owned memories:** use `memory-lifecycle` to classify every configured path without writing, then apply an explicitly approved collision-safe restore with a content-free receipt.
21
22
  - **Finished slice:** use `wrapup` to prepare the branch, PR, and cleanup steps your repo expects.
22
23
  - **Kit release:** use `kit-release` to derive the shipped delta, confirm Semver, regenerate the manifest, run all gates, and then hand landing to `wrapup`.
23
24
  - **Kit update:** use `kit-update` to preview and transactionally apply a parity-verified scoped release without overwriting local modifications.
@@ -193,6 +193,9 @@ def load_worktree_lifecycle_core():
193
193
  if existing is not None:
194
194
  return existing
195
195
  path = Path(__file__).resolve().parents[2] / "scripts" / "worktree-lifecycle" / "core.py"
196
+ module_dir = str(path.parent)
197
+ if module_dir not in sys.path:
198
+ sys.path.insert(0, module_dir)
196
199
  spec = importlib.util.spec_from_file_location(_WORKTREE_CORE_MODULE, path)
197
200
  if spec is None or spec.loader is None:
198
201
  raise ImportError(f"cannot load Worktree Lifecycle core from {path}")
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env python3
2
+ """SessionStart adapter for profile-driven branch and worktree facts."""
3
+
4
+ import json
5
+ import sys
6
+ from pathlib import Path
7
+
8
+ from _hook_utils import hook_event_output, load_worktree_lifecycle_core
9
+
10
+
11
+ def main() -> int:
12
+ try:
13
+ json.load(sys.stdin)
14
+ core = load_worktree_lifecycle_core()
15
+ profile = core.load_profile(Path("docs/agents/workflow-capabilities.json"))
16
+ decision = core.evaluate(profile, core.collect_facts(Path.cwd()), "session-start", {})
17
+ except Exception:
18
+ return 0
19
+ if decision.action == "emit":
20
+ print(json.dumps(hook_event_output(decision.event_name, decision.message)))
21
+ return 0
22
+
23
+
24
+ if __name__ == "__main__":
25
+ raise SystemExit(main())
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env python3
2
+ """PostToolUse adapter for branch-changing shell commands."""
3
+
4
+ import json
5
+ import sys
6
+ from pathlib import Path
7
+
8
+ from _hook_utils import load_worktree_lifecycle_core
9
+
10
+
11
+ def main() -> int:
12
+ try:
13
+ payload = json.load(sys.stdin)
14
+ core = load_worktree_lifecycle_core()
15
+ profile = core.load_profile(Path("docs/agents/workflow-capabilities.json"))
16
+ decision = core.evaluate(profile, core.collect_facts(Path.cwd()), "branch-watch", payload)
17
+ except Exception:
18
+ return 0
19
+ if decision.action == "emit":
20
+ print(json.dumps({"systemMessage": decision.message}))
21
+ return 0
22
+
23
+
24
+ if __name__ == "__main__":
25
+ raise SystemExit(main())
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env python3
2
+ """PreToolUse adapter for commands that must run in their linked worktree."""
3
+
4
+ import json
5
+ import sys
6
+ from pathlib import Path
7
+
8
+ from _hook_utils import load_worktree_lifecycle_core
9
+
10
+
11
+ def main() -> int:
12
+ try:
13
+ payload = json.load(sys.stdin)
14
+ core = load_worktree_lifecycle_core()
15
+ profile = core.load_profile(Path("docs/agents/workflow-capabilities.json"))
16
+ decision = core.evaluate(profile, core.collect_facts(Path.cwd()), "command-cwd", payload)
17
+ except Exception:
18
+ return 0
19
+ if decision.action == "block":
20
+ print(decision.message, file=sys.stderr)
21
+ return 2
22
+ return 0
23
+
24
+
25
+ if __name__ == "__main__":
26
+ raise SystemExit(main())
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env python3
2
+ """PreToolUse adapter for issue-branch creation with active worktrees."""
3
+
4
+ import json
5
+ import sys
6
+ from pathlib import Path
7
+
8
+ from _hook_utils import load_worktree_lifecycle_core
9
+
10
+
11
+ def main() -> int:
12
+ try:
13
+ payload = json.load(sys.stdin)
14
+ core = load_worktree_lifecycle_core()
15
+ profile = core.load_profile(Path("docs/agents/workflow-capabilities.json"))
16
+ decision = core.evaluate(profile, core.collect_facts(Path.cwd()), "branch-create", payload)
17
+ except Exception:
18
+ return 0
19
+ if decision.action == "block":
20
+ print(decision.message, file=sys.stderr)
21
+ return 2
22
+ return 0
23
+
24
+
25
+ if __name__ == "__main__":
26
+ raise SystemExit(main())
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env python3
2
+ """PreToolUse adapter for tracked edits on protected worktrees."""
3
+
4
+ import json
5
+ import sys
6
+ from pathlib import Path
7
+
8
+ from _hook_utils import load_worktree_lifecycle_core
9
+
10
+
11
+ def main() -> int:
12
+ try:
13
+ payload = json.load(sys.stdin)
14
+ core = load_worktree_lifecycle_core()
15
+ profile = core.load_profile(Path("docs/agents/workflow-capabilities.json"))
16
+ decision = core.evaluate(profile, core.collect_facts(Path.cwd()), "edit", payload)
17
+ except Exception:
18
+ return 0
19
+ if decision.action == "block":
20
+ print(decision.message, file=sys.stderr)
21
+ return 2
22
+ return 0
23
+
24
+
25
+ if __name__ == "__main__":
26
+ raise SystemExit(main())
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: memory-lifecycle
3
+ description: "Preview and apply a consumer-owned memory lifecycle without crossing configured roots or overwriting active, archived, or recovery evidence. Use when a user wants to restore archived memories, inspect memory placement, or run an approved memory recovery."
4
+ ---
5
+
6
+ # Memory Lifecycle
7
+
8
+ Coordinate the current repository's memory placement and recovery through the
9
+ deterministic helper at `scripts/memory-lifecycle/index.mjs`. The helper owns
10
+ path validation, dry-run verdicts, exclusive restore writes, hashing, and
11
+ receipts. Keep this skill thin: do not reimplement those rules with shell file
12
+ operations.
13
+
14
+ ## Boundaries
15
+
16
+ - Work only below the consumer-owned roots in
17
+ `docs/agents/workflow-capabilities.json`.
18
+ - Never scan another repository or a user-global memory root that the current
19
+ consumer profile does not explicitly own.
20
+ - Treat active memories, archives, policy templates, and restore receipts as
21
+ consumer-owned. Never overwrite them.
22
+ - `init`, `update`, and an ordinary `setup-workflow` rerun must not enable this
23
+ capability or change placement, retention, restore, or pruning grants.
24
+ - Destructive pruning is outside the helper. It requires a separate preview and
25
+ explicit user approval; do not infer that approval from restore permission.
26
+
27
+ ## Consumer profile
28
+
29
+ Adopt the `memoryLifecycle` section of
30
+ `docs/agents/workflow-capabilities.json`. Missing or disabled configuration is
31
+ a valid no-write `disabled` result.
32
+
33
+ ```json
34
+ {
35
+ "memoryLifecycle": {
36
+ "enabled": true,
37
+ "activeRoot": ".memory/active",
38
+ "archiveRoot": ".memory/archive",
39
+ "receiptRoot": ".memory/receipts",
40
+ "approvals": { "restore": false, "prune": false },
41
+ "memories": [
42
+ { "path": "decisions/example.md", "enabled": true }
43
+ ]
44
+ }
45
+ }
46
+ ```
47
+
48
+ Preserve unknown profile keys. Every configured root and candidate path must be
49
+ repository-relative. Absolute paths, parent escapes, symlink traversal,
50
+ different-content collisions, and missing restore approval are refused.
51
+
52
+ ## Workflow
53
+
54
+ 1. **Preview.** Run:
55
+
56
+ ```sh
57
+ node scripts/memory-lifecycle/index.mjs
58
+ ```
59
+
60
+ This is the default no-write mode. Count the candidate paths and confirm each
61
+ appears exactly once as `create`, `restore`, `preserve`, `skip`, or `refuse`.
62
+ 2. **Review refusals.** Explain every refusal. Do not weaken root, symlink,
63
+ collision, or approval checks to make the run green.
64
+ 3. **Confirm recovery.** Before applying, require the consumer profile's
65
+ `approvals.restore` to already record the explicit restore grant. A chat
66
+ instruction does not silently rewrite the tracked policy.
67
+ 4. **Apply.** Run:
68
+
69
+ ```sh
70
+ node scripts/memory-lifecycle/index.mjs --apply
71
+ ```
72
+
73
+ The helper restores with exclusive-create semantics and keeps the archive.
74
+ A concurrent destination collision becomes `refused`, never an overwrite.
75
+ 5. **Read back.** Verify restored files by path and hash, not by printing memory
76
+ contents. Confirm the receipt has schema/source versions plus
77
+ `restored`/`skipped`/`refused` path verdicts and contains no memory content.
78
+ 6. **Rerun.** Run the preview again. An identical restored file is preserved;
79
+ the rerun writes no duplicate receipt.
80
+
81
+ Use `--profile <repository-relative-path>` only when the repository documents a
82
+ different consumer-owned profile location.
83
+
84
+ ## Final report
85
+
86
+ Report:
87
+
88
+ - dry-run counts for all five action classes;
89
+ - applied `restored`/`skipped`/`refused` counts;
90
+ - receipt path and source versions, without memory contents;
91
+ - archive-preservation and rerun/no-write result;
92
+ - any pruning request left pending explicit approval.
@@ -18,6 +18,7 @@ Use this section as the entry-point map for agent-assisted work. The individual
18
18
  - **Multi-session build from a PRD or issue:** use `implement` to drive `tdd` end-to-end, one red-green slice at a time.
19
19
  - **Implementation slice:** use `tdd` for one behavior at a time: RED, GREEN, then refactor.
20
20
  - **Build or refresh a project-local census:** use `census-update` to scan facts, resolve ambiguous decisions one at a time, and transactionally activate a counted census.
21
+ - **Preview or restore consumer-owned memories:** use `memory-lifecycle` to classify every configured path without writing, then apply an explicitly approved collision-safe restore with a content-free receipt.
21
22
  - **Finished slice:** use `wrapup` to prepare the branch, PR, and cleanup steps your repo expects.
22
23
  - **Kit release:** use `kit-release` to derive the shipped delta, confirm Semver, regenerate the manifest, run all gates, and then hand landing to `wrapup`.
23
24
  - **Kit update:** use `kit-update` to preview and transactionally apply a parity-verified scoped release without overwriting local modifications.
@@ -404,6 +404,16 @@
404
404
  "codex"
405
405
  ],
406
406
  "provenance": "own"
407
+ },
408
+ "memory-lifecycle": {
409
+ "class": "generic",
410
+ "publish": true,
411
+ "entryPoint": true,
412
+ "surfaces": [
413
+ "claude",
414
+ "codex"
415
+ ],
416
+ "provenance": "own"
407
417
  }
408
418
  }
409
419
  }
package/PROVENANCE.md CHANGED
@@ -33,7 +33,7 @@ carries Chase's `THIRD-PARTY-NOTICES.md`.
33
33
 
34
34
  retro, wrapup, spec-self-critique, board-to-waves, verify-spike, decision-gate,
35
35
  codex-adapter-sync, setup-pre-commit, code-review, orchestrate-wave,
36
- census-update — covered by the root LICENSE.
36
+ census-update, memory-lifecycle — covered by the root LICENSE.
37
37
  `setup-pre-commit` was rewritten from Matt Pocock's husky-based skill to a
38
38
  zero-dep native git `core.hooksPath` scaffold; nothing of the original
39
39
  mechanic remains (courtesy attribution).
package/README.md CHANGED
@@ -332,6 +332,26 @@ still reference. Flags: `--force` (overwrite pre-existing files on `init`),
332
332
 
333
333
  ## Release notes
334
334
 
335
+ ### 0.20.0
336
+
337
+ - added: `.claude/hooks/branch-context.py`
338
+ - added: `.claude/hooks/branch-watch.py`
339
+ - added: `.claude/hooks/enforce-worktree.py`
340
+ - added: `.claude/hooks/enforce-worktree-cwd.py`
341
+ - added: `.claude/hooks/enforce-worktree-discipline.py`
342
+ - added: `scripts/worktree-lifecycle/profile.py`
343
+ - added: `scripts/worktree-lifecycle/README.md`
344
+ - changed: `.claude/hooks/_hook_utils.py`
345
+ - changed: `scripts/worktree-lifecycle/core.py`
346
+
347
+ ### 0.19.0
348
+
349
+ - added: `.agents/skills/memory-lifecycle/SKILL.md`
350
+ - added: `.claude/skills/memory-lifecycle/SKILL.md`
351
+ - added: `scripts/memory-lifecycle/index.mjs`
352
+ - changed: `.agents/skills/setup-workflow/workflow-overview.md`
353
+ - changed: `.claude/skills/setup-workflow/workflow-overview.md`
354
+
335
355
  ### 0.18.0
336
356
 
337
357
  - added: `scripts/worktree-lifecycle/capabilities.json`
@@ -1,5 +1,5 @@
1
1
  {
2
- "kitVersion": "0.18.0",
2
+ "kitVersion": "0.20.0",
3
3
  "files": [
4
4
  {
5
5
  "path": ".agents/skills/ask-matt/SKILL.md",
@@ -352,6 +352,15 @@
352
352
  "mode": 420,
353
353
  "origin": "kit"
354
354
  },
355
+ {
356
+ "path": ".agents/skills/memory-lifecycle/SKILL.md",
357
+ "kind": "skill",
358
+ "ownerSkill": "memory-lifecycle",
359
+ "surface": "codex",
360
+ "sha256": "f4cd4a744044b59fd4ce6b7348e30f437ca4200f5f5bbae6e6aebdc30d6b3f35",
361
+ "mode": 420,
362
+ "origin": "kit"
363
+ },
355
364
  {
356
365
  "path": ".agents/skills/orchestrate-wave/references/builder-contract.md",
357
366
  "kind": "skill",
@@ -600,7 +609,7 @@
600
609
  "kind": "skill",
601
610
  "ownerSkill": "setup-workflow",
602
611
  "surface": "codex",
603
- "sha256": "b83fa87dc0226f21e01d31c91840b78d1ccad0a92e646de203fc3c003e9098f3",
612
+ "sha256": "c522a7de1b8eaa827a72880651a94aca6d066687e8c21b789d9008e3321f7362",
604
613
  "mode": 420,
605
614
  "origin": "kit"
606
615
  },
@@ -850,10 +859,24 @@
850
859
  {
851
860
  "path": ".claude/hooks/_hook_utils.py",
852
861
  "kind": "hook",
853
- "sha256": "4a4b57633578ee8eabdf8ae70437e590e1747d1df5d76c730e2164e23cdfc2ed",
862
+ "sha256": "58a7a8ad6cd4f1660e95343d7a0c637cf8aee92948a9c554befa5851723b3f48",
854
863
  "mode": 420,
855
864
  "origin": "kit"
856
865
  },
866
+ {
867
+ "path": ".claude/hooks/branch-context.py",
868
+ "kind": "hook",
869
+ "sha256": "96bbe56a292a89cdb76db0670c2c214678fa60c08e3de5b8db507149ba24c018",
870
+ "mode": 493,
871
+ "origin": "kit"
872
+ },
873
+ {
874
+ "path": ".claude/hooks/branch-watch.py",
875
+ "kind": "hook",
876
+ "sha256": "15c7565790e0b108c44175b7527a4bc2b8b244737d5598081e938d2dea032424",
877
+ "mode": 493,
878
+ "origin": "kit"
879
+ },
857
880
  {
858
881
  "path": ".claude/hooks/drift-guard.py",
859
882
  "kind": "hook",
@@ -861,6 +884,27 @@
861
884
  "mode": 493,
862
885
  "origin": "kit"
863
886
  },
887
+ {
888
+ "path": ".claude/hooks/enforce-worktree-cwd.py",
889
+ "kind": "hook",
890
+ "sha256": "14086536ceb3368a03b84ff550ba5e3db83d6c5198c41c80312507bf6640bb9f",
891
+ "mode": 493,
892
+ "origin": "kit"
893
+ },
894
+ {
895
+ "path": ".claude/hooks/enforce-worktree-discipline.py",
896
+ "kind": "hook",
897
+ "sha256": "5bd9fc7a7eea5e8b0778e8272e02b5d8c6c121ea3a168ef11a9c39344085e666",
898
+ "mode": 493,
899
+ "origin": "kit"
900
+ },
901
+ {
902
+ "path": ".claude/hooks/enforce-worktree.py",
903
+ "kind": "hook",
904
+ "sha256": "4a5d0247d89049dde0475680595fd785bfbd1b108cdd9c9697fd74e944f52c8b",
905
+ "mode": 493,
906
+ "origin": "kit"
907
+ },
864
908
  {
865
909
  "path": ".claude/hooks/skill-drift-hint.py",
866
910
  "kind": "hook",
@@ -1334,6 +1378,15 @@
1334
1378
  "mode": 420,
1335
1379
  "origin": "kit"
1336
1380
  },
1381
+ {
1382
+ "path": ".claude/skills/memory-lifecycle/SKILL.md",
1383
+ "kind": "skill",
1384
+ "ownerSkill": "memory-lifecycle",
1385
+ "surface": "claude",
1386
+ "sha256": "f4cd4a744044b59fd4ce6b7348e30f437ca4200f5f5bbae6e6aebdc30d6b3f35",
1387
+ "mode": 420,
1388
+ "origin": "kit"
1389
+ },
1337
1390
  {
1338
1391
  "path": ".claude/skills/orchestrate-wave/references/builder-contract.md",
1339
1392
  "kind": "skill",
@@ -1600,7 +1653,7 @@
1600
1653
  "kind": "skill",
1601
1654
  "ownerSkill": "setup-workflow",
1602
1655
  "surface": "claude",
1603
- "sha256": "b83fa87dc0226f21e01d31c91840b78d1ccad0a92e646de203fc3c003e9098f3",
1656
+ "sha256": "c522a7de1b8eaa827a72880651a94aca6d066687e8c21b789d9008e3321f7362",
1604
1657
  "mode": 420,
1605
1658
  "origin": "kit"
1606
1659
  },
@@ -2000,6 +2053,13 @@
2000
2053
  "mode": 493,
2001
2054
  "origin": "kit"
2002
2055
  },
2056
+ {
2057
+ "path": "scripts/memory-lifecycle/index.mjs",
2058
+ "kind": "script",
2059
+ "sha256": "d83a71891e9c070179a00d6413b18d073061eef75e50919a7f28b8510f7ca20d",
2060
+ "mode": 420,
2061
+ "origin": "kit"
2062
+ },
2003
2063
  {
2004
2064
  "path": "scripts/node_kind.py",
2005
2065
  "kind": "script",
@@ -2073,7 +2133,21 @@
2073
2133
  {
2074
2134
  "path": "scripts/worktree-lifecycle/core.py",
2075
2135
  "kind": "script",
2076
- "sha256": "eae5c6076611a36a8fa90e3aef3d1c49345110a392a7d7e9d95be8de00f8d9ff",
2136
+ "sha256": "36848a16ed7eaed1f731399efd2caf5771c9c5b48331771d6aedcbad2156e62a",
2137
+ "mode": 420,
2138
+ "origin": "kit"
2139
+ },
2140
+ {
2141
+ "path": "scripts/worktree-lifecycle/profile.py",
2142
+ "kind": "script",
2143
+ "sha256": "993b105efd2329b3a206b0c79399aff1c7840017362745966f9b158b1f165f09",
2144
+ "mode": 420,
2145
+ "origin": "kit"
2146
+ },
2147
+ {
2148
+ "path": "scripts/worktree-lifecycle/README.md",
2149
+ "kind": "doc",
2150
+ "sha256": "59b78826308404497545b0a0ba57ff50f4618be2f6838f64e6a8c18bce83ea7f",
2077
2151
  "mode": 420,
2078
2152
  "origin": "kit"
2079
2153
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ikon85/agent-workflow-kit",
3
- "version": "0.18.0",
3
+ "version": "0.20.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": {