@ngockhoale/ukit 1.5.12 → 1.5.14
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/CHANGELOG.md +10 -0
- package/manifests/platform.full.yaml +2 -1
- package/package.json +1 -1
- package/templates/.claude/commands/ukit/abort-handoff.md +2 -2
- package/templates/.claude/commands/ukit/clear-handoff.md +6 -3
- package/templates/.claude/commands/ukit/implement-handoff.md +60 -41
- package/templates/.claude/commands/ukit/review-handoff.md +31 -40
- package/templates/adapter-presets/opencode/opencode.template.json +1 -1
- package/templates/ukit/storage/config.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to UKit are documented here.
|
|
4
4
|
|
|
5
|
+
## 1.5.14 - 2026-06-05
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Added 6 handoff slash commands to OpenCode template (`ukit-status-handoff`, `ukit-create-handoff`, `ukit-implement-handoff`, `ukit-review-handoff`, `ukit-clear-handoff`, `ukit-abort-handoff`). These now appear as Workflows in Kilo Code and slash commands in OpenCode after `ukit install`.
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- `templates/ukit/storage/config.json`: version was hardcoded as `"1.5.7"` instead of `"{{ukit.version}}"` — fixed so install always writes the current package version.
|
|
14
|
+
|
|
5
15
|
## 1.5.7 - 2026-06-02
|
|
6
16
|
|
|
7
17
|
### Fixed
|
package/package.json
CHANGED
|
@@ -16,9 +16,9 @@ Report the current state before doing anything:
|
|
|
16
16
|
⚠️ About to ABORT handoff cycle:
|
|
17
17
|
Cycle: <ID> Goal: <goal>
|
|
18
18
|
Tasks that will be lost: TASK-001 [in_progress], TASK-002 [ready], ...
|
|
19
|
-
|
|
19
|
+
Branch to delete: handoff/integration (task worktrees already cleaned up during implement)
|
|
20
20
|
|
|
21
|
-
This will NOT be archived. All work in
|
|
21
|
+
This will NOT be archived. All uncommitted work in integration branch will be discarded.
|
|
22
22
|
Respond "confirm abort" to proceed.
|
|
23
23
|
```
|
|
24
24
|
|
|
@@ -27,17 +27,20 @@ Fix all tasks first, then re-run /ukit:clear-handoff.
|
|
|
27
27
|
|
|
28
28
|
Only continue if ALL tasks are `done`.
|
|
29
29
|
|
|
30
|
-
## Step 2 — Cleanup
|
|
30
|
+
## Step 2 — Cleanup branches (safety net)
|
|
31
|
+
|
|
32
|
+
Task worktrees are deleted immediately during implement — none should remain.
|
|
33
|
+
This step is a safety net + integration branch cleanup:
|
|
31
34
|
|
|
32
35
|
```bash
|
|
33
|
-
#
|
|
36
|
+
# Safety net: remove any stray task worktrees (should already be gone)
|
|
34
37
|
git worktree list | grep '.worktrees/task-' | awk '{print $1}' | while read wt; do
|
|
35
38
|
name=$(basename $wt)
|
|
36
39
|
git worktree remove $wt --force 2>/dev/null
|
|
37
40
|
git branch -D handoff/$name 2>/dev/null
|
|
38
41
|
done
|
|
39
42
|
|
|
40
|
-
#
|
|
43
|
+
# Integration branch cleanup (removed by review-handoff on success, but safety net here too)
|
|
41
44
|
git branch -D handoff/integration 2>/dev/null
|
|
42
45
|
|
|
43
46
|
git worktree prune
|
|
@@ -12,89 +12,108 @@ _Empty = all `ready` tasks. Or: "TASK-001" for a specific task._
|
|
|
12
12
|
|
|
13
13
|
## Step 1 — Setup
|
|
14
14
|
|
|
15
|
-
Read `docs/AI_HANDOFF/ACTIVE.md` → get `Base: <BASE
|
|
15
|
+
Read `docs/AI_HANDOFF/ACTIVE.md` → get `Base: <BASE>`.
|
|
16
16
|
Read `docs/AI_HANDOFF/INDEX.md` → collect `ready` tasks (or specific task from $ARGUMENTS).
|
|
17
17
|
If no ready tasks → report and stop.
|
|
18
18
|
|
|
19
19
|
Create integration branch (once per cycle, skip if already exists):
|
|
20
20
|
```bash
|
|
21
|
-
git branch handoff/integration $BASE 2>/dev/null || echo "
|
|
21
|
+
git branch handoff/integration $BASE 2>/dev/null || echo "already exists"
|
|
22
22
|
```
|
|
23
23
|
|
|
24
24
|
## Step 2 — Build wave groups
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
- Wave 1:
|
|
28
|
-
- Wave
|
|
29
|
-
-
|
|
26
|
+
Read each `tasks/TASK-xxx.md` for `Dependencies` field:
|
|
27
|
+
- Wave 1: `Dependencies: none` (or all deps already `done`)
|
|
28
|
+
- Wave N+1: all deps are in Wave N or earlier
|
|
29
|
+
- Chain A→B→C = 3 waves of 1 task each (sequential, no parallel)
|
|
30
|
+
- Independent A, B, C = 1 wave of 3 tasks (parallel)
|
|
30
31
|
|
|
31
32
|
## Step 3 — Execute wave by wave
|
|
32
33
|
|
|
33
34
|
For each wave:
|
|
34
35
|
|
|
35
|
-
### 3a — Create worktrees (
|
|
36
|
+
### 3a — Create worktrees (from `handoff/integration`)
|
|
36
37
|
```bash
|
|
37
|
-
# For each task in this wave:
|
|
38
38
|
git worktree add -b handoff/task-xxx .worktrees/task-xxx handoff/integration
|
|
39
|
-
# (omit -b if branch already exists
|
|
39
|
+
# (omit -b if branch already exists)
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
### 3b — Run tasks in parallel (one agent/session per task)
|
|
43
43
|
|
|
44
|
-
Each executor does
|
|
44
|
+
Each executor does independently in its own worktree:
|
|
45
45
|
|
|
46
46
|
```
|
|
47
47
|
Read docs/AI_HANDOFF/tasks/TASK-xxx.md
|
|
48
48
|
|
|
49
49
|
TDD — mandatory:
|
|
50
50
|
1. Write tests from §Test Cases
|
|
51
|
-
|
|
52
|
-
Confirm RED (
|
|
51
|
+
cd .worktrees/task-xxx && <test command>
|
|
52
|
+
Confirm RED (immediately GREEN → test is wrong — flag this)
|
|
53
53
|
2. Implement → run → confirm GREEN
|
|
54
|
-
3. Run §Verification Commands
|
|
54
|
+
3. Run §Verification Commands inside the worktree:
|
|
55
55
|
cd .worktrees/task-xxx && <each verification command>
|
|
56
56
|
Paste full output.
|
|
57
57
|
|
|
58
|
-
Commit in worktree
|
|
58
|
+
Commit in worktree:
|
|
59
59
|
git -C .worktrees/task-xxx add -A
|
|
60
|
-
git -C .worktrees/task-xxx commit -m "feat(TASK-xxx): <intent
|
|
60
|
+
git -C .worktrees/task-xxx commit -m "feat(TASK-xxx): <intent>"
|
|
61
|
+
COMMIT_SHA=$(git -C .worktrees/task-xxx rev-parse HEAD)
|
|
61
62
|
|
|
62
63
|
Executor Report (append to task file — do NOT touch INDEX.md):
|
|
63
64
|
## Executor Report
|
|
64
|
-
EXECUTOR_TOOL: <tool
|
|
65
|
-
EXECUTOR_MODEL: <exact model ID — mandatory
|
|
66
|
-
EXECUTOR_SUBAGENT: <
|
|
65
|
+
EXECUTOR_TOOL: <tool>
|
|
66
|
+
EXECUTOR_MODEL: <exact model ID — mandatory>
|
|
67
|
+
EXECUTOR_SUBAGENT: <name or "-">
|
|
68
|
+
COMMIT_SHA: <sha>
|
|
67
69
|
Verification Output: <paste>
|
|
68
70
|
Status: PASS | FAIL
|
|
69
|
-
Note: <
|
|
71
|
+
Note: <issues or "none">
|
|
70
72
|
```
|
|
71
73
|
|
|
72
74
|
> Claude Code: spawn `feature-implementer` agents in parallel (one per task).
|
|
73
|
-
> Other tools: open each task in
|
|
74
|
-
|
|
75
|
-
### 3c —
|
|
76
|
-
|
|
77
|
-
For each task:
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
75
|
+
> Other tools: open each task in separate session with code model.
|
|
76
|
+
|
|
77
|
+
### 3c — Orchestrator: merge + IMMEDIATELY delete worktree
|
|
78
|
+
|
|
79
|
+
For each task that reported back:
|
|
80
|
+
|
|
81
|
+
**PASS + EXECUTOR_MODEL present:**
|
|
82
|
+
```bash
|
|
83
|
+
git checkout handoff/integration
|
|
84
|
+
if git merge handoff/task-xxx --no-ff -m "feat(TASK-xxx)" 2>/dev/null; then
|
|
85
|
+
# Delete worktree and branch immediately — no lingering
|
|
86
|
+
git worktree remove .worktrees/task-xxx --force
|
|
87
|
+
git branch -D handoff/task-xxx
|
|
88
|
+
# update INDEX.md: status → pending_review
|
|
89
|
+
else
|
|
90
|
+
git merge --abort
|
|
91
|
+
git worktree remove .worktrees/task-xxx --force
|
|
92
|
+
git branch -D handoff/task-xxx
|
|
93
|
+
# update INDEX.md: status → merge_conflict
|
|
94
|
+
# append to §Discussion: conflict with <previously merged tasks>
|
|
95
|
+
fi
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**FAIL:**
|
|
99
|
+
```bash
|
|
100
|
+
git worktree remove .worktrees/task-xxx --force
|
|
101
|
+
git branch -D handoff/task-xxx
|
|
102
|
+
# update INDEX.md: status → blocked
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**EXECUTOR_MODEL missing:**
|
|
106
|
+
```bash
|
|
107
|
+
git worktree remove .worktrees/task-xxx --force
|
|
108
|
+
git branch -D handoff/task-xxx
|
|
109
|
+
# update INDEX.md: status → needs_executor_report
|
|
110
|
+
```
|
|
92
111
|
|
|
93
112
|
**Orchestrator writes INDEX.md** — agents never touch INDEX directly.
|
|
113
|
+
**Worktrees are always deleted immediately** — no exceptions.
|
|
94
114
|
|
|
95
115
|
### 3d — Next wave
|
|
96
|
-
Branch new
|
|
97
|
-
Repeat 3a–3c.
|
|
116
|
+
Branch new worktrees from `handoff/integration` (now includes Wave N). Repeat 3a–3c.
|
|
98
117
|
|
|
99
118
|
## Step 4 — Report
|
|
100
119
|
|
|
@@ -103,7 +122,7 @@ Wave summary:
|
|
|
103
122
|
Wave 1: TASK-001 [pending_review], TASK-002 [blocked]
|
|
104
123
|
Wave 2: TASK-003 [pending_review]
|
|
105
124
|
Merge conflicts: none | TASK-xxx (needs rebase)
|
|
106
|
-
|
|
125
|
+
No worktrees remaining.
|
|
107
126
|
```
|
|
108
127
|
|
|
109
128
|
**Next:** switch to strong model → `/ukit:review-handoff`
|
|
@@ -16,39 +16,41 @@ Read `docs/AI_HANDOFF/ACTIVE.md` → get `Base: <BASE>`.
|
|
|
16
16
|
Read `docs/AI_HANDOFF/INDEX.md` → collect `pending_review` tasks (or specific task).
|
|
17
17
|
If none → report and stop.
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
Checkout integration branch for verification:
|
|
20
|
+
```bash
|
|
21
|
+
git checkout handoff/integration
|
|
22
|
+
```
|
|
20
23
|
|
|
21
|
-
|
|
24
|
+
## Step 2 — Review each task (sequential — no parallel to avoid INDEX race)
|
|
22
25
|
|
|
23
26
|
For each task:
|
|
24
27
|
|
|
25
|
-
### 2a — Model isolation check (
|
|
28
|
+
### 2a — Model isolation check (always first)
|
|
26
29
|
|
|
27
|
-
Read `EXECUTOR_MODEL` from `## Executor Report
|
|
30
|
+
Read `EXECUTOR_MODEL` from task file `## Executor Report`.
|
|
28
31
|
|
|
29
32
|
| Executor model | Your model | Action |
|
|
30
33
|
|----------------|------------|--------|
|
|
31
34
|
| present, ≠ yours | present | proceed |
|
|
32
|
-
| present, == yours | present | REFUSE → `changes_requested`: "reviewer
|
|
33
|
-
| missing / blank | any | REFUSE → `changes_requested`: "EXECUTOR_MODEL
|
|
34
|
-
| "unknown" | present | proceed
|
|
35
|
+
| present, == yours | present | REFUSE → `changes_requested`: "reviewer ≠ executor required" |
|
|
36
|
+
| missing / blank | any | REFUSE → `changes_requested`: "EXECUTOR_MODEL missing — re-run implement" |
|
|
37
|
+
| "unknown" | present | proceed + NOTES: "executor model unverified — human confirm" |
|
|
35
38
|
|
|
36
|
-
### 2b — Re-run verification (
|
|
39
|
+
### 2b — Re-run verification (on integration branch, no worktree needed)
|
|
37
40
|
|
|
38
41
|
```bash
|
|
39
|
-
#
|
|
40
|
-
|
|
41
|
-
<each command from §Verification Commands>
|
|
42
|
+
# Already on handoff/integration from Step 1
|
|
43
|
+
<each command from task §Verification Commands>
|
|
42
44
|
```
|
|
43
45
|
|
|
44
|
-
If any command fails → verdict: `critical_block`. Stop
|
|
46
|
+
If any command fails → verdict: `critical_block`. Stop.
|
|
45
47
|
|
|
46
|
-
### 2c — Review diff
|
|
48
|
+
### 2c — Review diff (per task, using COMMIT_SHA from Executor Report)
|
|
47
49
|
|
|
48
50
|
```bash
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
git diff $
|
|
51
|
+
COMMIT_SHA=<from Executor Report>
|
|
52
|
+
git show $COMMIT_SHA # what this task changed
|
|
53
|
+
git diff $COMMIT_SHA^..$COMMIT_SHA # same, as diff format
|
|
52
54
|
```
|
|
53
55
|
|
|
54
56
|
Check: correctness, regression risk, security, edge cases, maintainability.
|
|
@@ -65,53 +67,42 @@ FINDINGS:
|
|
|
65
67
|
critical: <file:line — what fails> | none
|
|
66
68
|
important: <file:line — risk> | none
|
|
67
69
|
minor: <style/naming> | none
|
|
68
|
-
NEXT_STATUS_FOR_INDEX:
|
|
70
|
+
NEXT_STATUS_FOR_INDEX: <status>
|
|
69
71
|
```
|
|
70
72
|
|
|
71
73
|
### 2e — Orchestrator updates INDEX.md
|
|
72
74
|
|
|
73
|
-
Set `status = NEXT_STATUS_FOR_INDEX
|
|
74
|
-
(Reviewer writes verdict to task file; orchestrator writes INDEX — same principle as implement.)
|
|
75
|
-
|
|
76
|
-
## Step 3 — After all tasks reviewed: handle integration
|
|
75
|
+
Set `status = NEXT_STATUS_FOR_INDEX`. Orchestrator writes INDEX, not the reviewer.
|
|
77
76
|
|
|
78
|
-
|
|
77
|
+
## Step 3 — After all tasks reviewed
|
|
79
78
|
|
|
79
|
+
**All `approved` or `approved_minor`:**
|
|
80
80
|
```bash
|
|
81
|
-
# Merge integration → BASE (single merge, one clean history entry)
|
|
82
81
|
git checkout $BASE
|
|
83
82
|
if git merge handoff/integration --no-ff -m "feat: handoff cycle complete"; then
|
|
84
|
-
|
|
85
|
-
for task in $(git worktree list | grep '.worktrees/task-' | awk '{print $1}'); do
|
|
86
|
-
name=$(basename $task)
|
|
87
|
-
git worktree remove $task --force
|
|
88
|
-
git branch -d handoff/$name 2>/dev/null || git branch -D handoff/$name
|
|
89
|
-
done
|
|
90
|
-
git branch -d handoff/integration
|
|
83
|
+
git branch -D handoff/integration
|
|
91
84
|
# INDEX.md: all approved tasks → done
|
|
92
85
|
else
|
|
93
86
|
git merge --abort
|
|
94
|
-
# Report:
|
|
87
|
+
# Report: conflict on integration→BASE. Human must resolve manually.
|
|
95
88
|
fi
|
|
96
89
|
```
|
|
97
90
|
|
|
98
|
-
**
|
|
99
|
-
Keep
|
|
100
|
-
Report which tasks need fixes.
|
|
91
|
+
**Any `changes_requested` or `critical_block`:**
|
|
92
|
+
Keep `handoff/integration` open for next implement round. Report which tasks need fixes.
|
|
101
93
|
|
|
102
94
|
## Step 4 — Report
|
|
103
95
|
|
|
104
96
|
```
|
|
105
97
|
Review summary:
|
|
106
|
-
TASK-001: approved — merged
|
|
98
|
+
TASK-001: approved — merged into BASE
|
|
107
99
|
TASK-002: changes_requested — see §Discussion
|
|
108
|
-
Integration: pending (TASK-002
|
|
109
|
-
Worktrees remaining: .worktrees/task-002
|
|
100
|
+
Integration: merged to BASE | pending (fix TASK-002 first)
|
|
110
101
|
```
|
|
111
102
|
|
|
112
103
|
**Next:**
|
|
113
|
-
- All
|
|
104
|
+
- All done → `/ukit:clear-handoff`
|
|
114
105
|
- Has fixes → executor re-runs `/ukit:implement-handoff TASK-xxx`
|
|
115
106
|
|
|
116
|
-
> Claude Code: spawn `code-reviewer`
|
|
117
|
-
> Other tools:
|
|
107
|
+
> Claude Code: spawn `code-reviewer` (opus) per task for 2a–2d. Orchestrator handles 1, 2e, 3.
|
|
108
|
+
> Other tools: strong model sequentially per task, same steps.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"$schema":"https://opencode.ai/config.json","default_agent":"build","share":"disabled","compaction":{"auto":true,"prune":true,"reserved":10000},"watcher":{"ignore":[".git/**","node_modules/**",".cache/**",".ukit/**",".claude/ukit/permission-usage.json",".claude/ukit/permission-audit.log"]},"permission":{"doom_loop":"deny"},"command":{"ukit-route":{"description":"Internal shared UKit route. Run at the start of every non-trivial task to get skill and context hints before writing code.","agent":"build","template":"Run `node .claude/ukit/index/route-task.mjs \"<task>\" --adapter opencode`; reuse `.claude/ukit/skill-router-state.json`."},"ukit-context":{"description":"Internal UKit context.","agent":"build","template":"Run `node .claude/ukit/index/resolve-context.mjs \"<intent>\" [--target <file>]`."},"ukit-verify":{"description":"Internal UKit verify lane.","agent":"build","template":"Run `node .claude/ukit/index/verify-context.mjs \"<intent>\" [--target <file>]`."},"ukit-triage":{"description":"Internal UKit triage.","agent":"build","template":"Run `node .claude/ukit/index/triage.mjs \"<error>\"`."},"ukit-query":{"description":"Internal UKit query.","agent":"build","template":"Run `node .claude/ukit/index/query-index.mjs \"<error|symbol|path>\"`."},"ukit-index":{"description":"Internal UKit index.","agent":"build","template":"Run `node .claude/ukit/index/refresh-index.mjs` (fallback: `node .claude/ukit/index/build-index.mjs`)."}},"agent":{"build":{"description":"UKit build agent. Follow AGENTS.md. For every non-trivial task: run /ukit-route first, use index-first loop, activate matching skill, never claim done after read-only steps. Keep internal ukit-* helpers hidden; users only need ukit install.","permission":{"edit":"allow","task":"allow","skill":"allow","bash":{"*":"ask","pwd":"allow","ls":"allow","ls *":"allow","find *":"allow","rg *":"allow","grep *":"allow","cat *":"allow","sed *":"allow","head *":"allow","tail *":"allow","wc *":"allow","echo *":"allow","printf *":"allow","awk *":"allow","tr *":"allow","cut *":"allow","sort *":"allow","uniq *":"allow","diff *":"allow","jq *":"allow","stat *":"allow","file *":"allow","which *":"allow","date *":"allow","basename *":"allow","dirname *":"allow","realpath *":"allow","xargs *":"allow","mkdir *":"allow","touch *":"allow","cp *":"allow","vitest *":"allow","jest *":"allow","git status":"allow","git status *":"allow","git diff":"allow","git diff *":"allow","git log":"allow","git log *":"allow","git show *":"allow","git grep *":"allow","git rev-parse *":"allow","git branch *":"allow","git stash list":"allow","git ls-files *":"allow","git tag *":"allow","node .claude/ukit/index/*":"allow","node .claude/ukit/runtime/*":"allow","{{runtime.packageManager}} test":"allow","{{runtime.packageManager}} test *":"allow","{{runtime.packageManager}} lint":"allow","{{runtime.packageManager}} lint *":"allow","{{runtime.packageManager}} typecheck":"allow","{{runtime.packageManager}} typecheck *":"allow","{{runtime.packageManager}} build":"allow","{{runtime.packageManager}} build *":"allow","npm run test":"allow","npm run test *":"allow","npm run lint":"allow","npm run lint *":"allow","npm run typecheck":"allow","npm run typecheck *":"allow","npm run build":"allow","npm run build *":"allow","pnpm test":"allow","pnpm test *":"allow","pnpm lint":"allow","pnpm lint *":"allow","pnpm typecheck":"allow","pnpm typecheck *":"allow","pnpm build":"allow","pnpm build *":"allow","pnpm run test":"allow","pnpm run test *":"allow","pnpm run lint":"allow","pnpm run lint *":"allow","pnpm run typecheck":"allow","pnpm run typecheck *":"allow","pnpm run build":"allow","pnpm run build *":"allow","bun test":"allow","bun test *":"allow","bun run test":"allow","bun run test *":"allow","bun run lint":"allow","bun run lint *":"allow","bun run typecheck":"allow","bun run typecheck *":"allow","bun run build":"allow","bun run build *":"allow","git commit":"ask","git commit *":"ask","git push":"ask","git push *":"ask","git clean":"deny","git clean *":"deny","git reset":"deny","git reset *":"deny","rm *":"deny"}}},"plan":{"permission":{"edit":"ask","bash":"ask"}}}}
|
|
1
|
+
{"$schema":"https://opencode.ai/config.json","default_agent":"build","share":"disabled","compaction":{"auto":true,"prune":true,"reserved":10000},"watcher":{"ignore":[".git/**","node_modules/**",".cache/**",".ukit/**",".claude/ukit/permission-usage.json",".claude/ukit/permission-audit.log"]},"permission":{"doom_loop":"deny"},"command":{"ukit-route":{"description":"Internal shared UKit route. Run at the start of every non-trivial task to get skill and context hints before writing code.","agent":"build","template":"Run `node .claude/ukit/index/route-task.mjs \"<task>\" --adapter opencode`; reuse `.claude/ukit/skill-router-state.json`."},"ukit-context":{"description":"Internal UKit context.","agent":"build","template":"Run `node .claude/ukit/index/resolve-context.mjs \"<intent>\" [--target <file>]`."},"ukit-verify":{"description":"Internal UKit verify lane.","agent":"build","template":"Run `node .claude/ukit/index/verify-context.mjs \"<intent>\" [--target <file>]`."},"ukit-triage":{"description":"Internal UKit triage.","agent":"build","template":"Run `node .claude/ukit/index/triage.mjs \"<error>\"`."},"ukit-query":{"description":"Internal UKit query.","agent":"build","template":"Run `node .claude/ukit/index/query-index.mjs \"<error|symbol|path>\"`."},"ukit-index":{"description":"Internal UKit index.","agent":"build","template":"Run `node .claude/ukit/index/refresh-index.mjs` (fallback: `node .claude/ukit/index/build-index.mjs`)."},"ukit-status-handoff":{"description":"Handoff dashboard — show current cycle status (read-only).","agent":"build","template":"Read `docs/AI_HANDOFF/INDEX.md`, `docs/AI_HANDOFF/ACTIVE.md`, and `docs/AI_HANDOFF/PLAN.md`. Report: active cycle name, task table with status, any blockers. No writes."},"ukit-create-handoff":{"description":"Create a new handoff cycle — Phase 1+2: write PLAN.md + TASK-xxx.md files.","agent":"build","template":"Read `.claude/commands/ukit/create-handoff.md` for full instructions, then execute. Description: <what to build>"},"ukit-implement-handoff":{"description":"Execute handoff tasks — Phase 3: implement the next Ready task.","agent":"build","template":"Read `.claude/commands/ukit/implement-handoff.md` for full instructions, then execute. Task ID (optional): <TASK-xxx>"},"ukit-review-handoff":{"description":"Review handoff results — Phase 4: verify implementation and give verdict.","agent":"build","template":"Read `.claude/commands/ukit/review-handoff.md` for full instructions, then execute. Task ID (optional): <TASK-xxx>"},"ukit-clear-handoff":{"description":"Archive and reset the current handoff cycle.","agent":"build","template":"Read `.claude/commands/ukit/clear-handoff.md` for full instructions, then execute."},"ukit-abort-handoff":{"description":"Force abandon the current handoff cycle without archiving.","agent":"build","template":"Read `.claude/commands/ukit/abort-handoff.md` for full instructions, then execute."}},"agent":{"build":{"description":"UKit build agent. Follow AGENTS.md. For every non-trivial task: run /ukit-route first, use index-first loop, activate matching skill, never claim done after read-only steps. Keep internal ukit-* helpers hidden; users only need ukit install.","permission":{"edit":"allow","task":"allow","skill":"allow","bash":{"*":"ask","pwd":"allow","ls":"allow","ls *":"allow","find *":"allow","rg *":"allow","grep *":"allow","cat *":"allow","sed *":"allow","head *":"allow","tail *":"allow","wc *":"allow","echo *":"allow","printf *":"allow","awk *":"allow","tr *":"allow","cut *":"allow","sort *":"allow","uniq *":"allow","diff *":"allow","jq *":"allow","stat *":"allow","file *":"allow","which *":"allow","date *":"allow","basename *":"allow","dirname *":"allow","realpath *":"allow","xargs *":"allow","mkdir *":"allow","touch *":"allow","cp *":"allow","vitest *":"allow","jest *":"allow","git status":"allow","git status *":"allow","git diff":"allow","git diff *":"allow","git log":"allow","git log *":"allow","git show *":"allow","git grep *":"allow","git rev-parse *":"allow","git branch *":"allow","git stash list":"allow","git ls-files *":"allow","git tag *":"allow","node .claude/ukit/index/*":"allow","node .claude/ukit/runtime/*":"allow","{{runtime.packageManager}} test":"allow","{{runtime.packageManager}} test *":"allow","{{runtime.packageManager}} lint":"allow","{{runtime.packageManager}} lint *":"allow","{{runtime.packageManager}} typecheck":"allow","{{runtime.packageManager}} typecheck *":"allow","{{runtime.packageManager}} build":"allow","{{runtime.packageManager}} build *":"allow","npm run test":"allow","npm run test *":"allow","npm run lint":"allow","npm run lint *":"allow","npm run typecheck":"allow","npm run typecheck *":"allow","npm run build":"allow","npm run build *":"allow","pnpm test":"allow","pnpm test *":"allow","pnpm lint":"allow","pnpm lint *":"allow","pnpm typecheck":"allow","pnpm typecheck *":"allow","pnpm build":"allow","pnpm build *":"allow","pnpm run test":"allow","pnpm run test *":"allow","pnpm run lint":"allow","pnpm run lint *":"allow","pnpm run typecheck":"allow","pnpm run typecheck *":"allow","pnpm run build":"allow","pnpm run build *":"allow","bun test":"allow","bun test *":"allow","bun run test":"allow","bun run test *":"allow","bun run lint":"allow","bun run lint *":"allow","bun run typecheck":"allow","bun run typecheck *":"allow","bun run build":"allow","bun run build *":"allow","git commit":"ask","git commit *":"ask","git push":"ask","git push *":"ask","git clean":"deny","git clean *":"deny","git reset":"deny","git reset *":"deny","rm *":"deny"}}},"plan":{"permission":{"edit":"ask","bash":"ask"}}}}
|