@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 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
@@ -48,7 +48,8 @@ items:
48
48
  requires:
49
49
  - runtime-readme
50
50
  mergeStrategy: overwrite_with_backup
51
- variables: []
51
+ variables:
52
+ - ukit.version
52
53
  enabledByDefault: true
53
54
  packs:
54
55
  - core
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ngockhoale/ukit",
3
- "version": "1.5.12",
3
+ "version": "1.5.14",
4
4
  "description": "Install/update an index-first AI workspace for Claude Code, Antigravity, OpenAI Codex, and OpenCode.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -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
- Worktrees to delete: .worktrees/task-001, ...
19
+ Branch to delete: handoff/integration (task worktrees already cleaned up during implement)
20
20
 
21
- This will NOT be archived. All work in worktrees will be discarded.
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 worktrees + branches
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
- # Remove any remaining task worktrees (should already be gone after review, but be safe)
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
- # Remove integration branch if still exists
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>` (the branch set at plan time).
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 "integration branch already exists"
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
- Wave structure is inferred from task `Dependencies` fields — read each `tasks/TASK-xxx.md`:
27
- - Wave 1: tasks where `Dependencies: none` (or all deps already `done`)
28
- - Wave 2: tasks whose deps are all in Wave 1
29
- - Wave N+1: tasks whose deps are all in Wave N or earlier
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 (branch from `handoff/integration`)
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; worktrees stay open until review-handoff cleans up)
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 — **independently, in its own worktree**:
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
- Run: cd .worktrees/task-xxx && <test command>
52
- Confirm RED (if immediately GREEN → test is wrong or feature already exists — flag this)
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 from INSIDE the worktree:
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 (required before reporting):
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 from task §1>"
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 name>
65
- EXECUTOR_MODEL: <exact model ID — mandatory, reviewer will refuse if missing>
66
- EXECUTOR_SUBAGENT: <subagent name or "-">
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: <any issues, or "none">
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 a separate session with code model.
74
-
75
- ### 3c — After all tasks in wave report back (orchestrator)
76
-
77
- For each task:
78
- - If `Status: PASS` AND `EXECUTOR_MODEL` present → merge into integration:
79
- ```bash
80
- if git merge handoff/task-xxx --no-ff -m "wave-merge(TASK-xxx)" --no-commit 2>/dev/null; then
81
- git commit -m "wave-merge(TASK-xxx)"
82
- # update INDEX.md: status → pending_review
83
- else
84
- git merge --abort
85
- # update INDEX.md: status → merge_conflict
86
- # append to task §Discussion: "merge_conflict with <previously merged tasks in this wave>"
87
- # report to human: rebase handoff/task-xxx on handoff/integration, re-run
88
- fi
89
- ```
90
- - If `Status: FAIL` → update INDEX.md: status → `blocked`
91
- - If `EXECUTOR_MODEL` missing → update INDEX.md: status → `needs_executor_report`; do not set pending_review
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 wave worktrees from `handoff/integration` (which now includes Wave N's code).
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
- Worktrees open: .worktrees/task-001, .worktrees/task-003
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
- ## Step 2 — Review each task
19
+ Checkout integration branch for verification:
20
+ ```bash
21
+ git checkout handoff/integration
22
+ ```
20
23
 
21
- **IMPORTANT: run tasks sequentially (not parallel) to avoid INDEX.md race conditions.**
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 (do this first, always)
28
+ ### 2a — Model isolation check (always first)
26
29
 
27
- Read `EXECUTOR_MODEL` from `## Executor Report` in task file.
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 model must differ from executor" |
33
- | missing / blank | any | REFUSE → `changes_requested`: "EXECUTOR_MODEL not reported — executor must re-run and fill in" |
34
- | "unknown" | present | proceed, add NOTES: "executor model unverified — human confirm before merge" |
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 (in the worktree, not main)
39
+ ### 2b — Re-run verification (on integration branch, no worktree needed)
37
40
 
38
41
  ```bash
39
- # Run INSIDE the task's worktree — not from root:
40
- cd .worktrees/task-xxx
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 — do not review code.
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
- # What this task added on top of its wave base:
50
- BASE_OF_TASK=$(git merge-base handoff/integration handoff/task-xxx)
51
- git diff $BASE_OF_TASK..handoff/task-xxx
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: approved | approved_minor | changes_requested | critical_block
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` for this task.
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
- **Only if all tasks are `approved` or `approved_minor`:**
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
- # Cleanup all task worktrees + branches
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: unexpected conflict on integration→BASE merge. Human must resolve manually.
87
+ # Report: conflict on integration→BASE. Human must resolve manually.
95
88
  fi
96
89
  ```
97
90
 
98
- **If any task has `changes_requested` or `critical_block`:**
99
- Keep all worktrees and integration branch open.
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 needs fix first)
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 approved + merged → `/ukit:clear-handoff`
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` agent (opus) per task for Steps 2a–2e. Orchestrator handles Steps 1, 2e (INDEX write), and Step 3.
117
- > Other tools: use strong model sequentially per task, same steps.
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"}}}}
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.5.7",
2
+ "version": "{{ukit.version}}",
3
3
  "agent": "claude-code",
4
4
  "autonomy": {
5
5
  "level": "balanced",