@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.
- package/.agents/skills/memory-lifecycle/SKILL.md +92 -0
- package/.agents/skills/setup-workflow/workflow-overview.md +1 -0
- package/.claude/hooks/_hook_utils.py +3 -0
- package/.claude/hooks/branch-context.py +25 -0
- package/.claude/hooks/branch-watch.py +25 -0
- package/.claude/hooks/enforce-worktree-cwd.py +26 -0
- package/.claude/hooks/enforce-worktree-discipline.py +26 -0
- package/.claude/hooks/enforce-worktree.py +26 -0
- package/.claude/skills/memory-lifecycle/SKILL.md +92 -0
- package/.claude/skills/setup-workflow/workflow-overview.md +1 -0
- package/.claude/skills/skill-manifest.json +10 -0
- package/PROVENANCE.md +1 -1
- package/README.md +20 -0
- package/agent-workflow-kit.package.json +79 -5
- package/package.json +1 -1
- package/scripts/memory-lifecycle/index.mjs +247 -0
- package/scripts/memory-lifecycle/memory-lifecycle.test.mjs +170 -0
- package/scripts/worktree-lifecycle/README.md +37 -0
- package/scripts/worktree-lifecycle/core.py +194 -81
- package/scripts/worktree-lifecycle/profile.py +116 -0
- package/src/lib/bundle.mjs +12 -0
|
@@ -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.
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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.
|
|
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": {
|