@ngockhoale/ukit 1.5.19 → 1.5.21

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,25 +2,32 @@
2
2
 
3
3
  All notable changes to UKit are documented here.
4
4
 
5
+ ## 1.5.21 - 2026-06-09
6
+
7
+ ### Changed
8
+
9
+ - Renamed handoff slash commands from `*-handoff` to `handoff-*` convention: `handoff-status`, `handoff-create`, `handoff-implement`, `handoff-review`, `handoff-clear`. Old `*-handoff.md` files removed; manifests and skill routing updated.
10
+ - Auto-prune now targets `handoff-abort.md` (new name) instead of `clear-handoff.md`.
11
+
5
12
  ## 1.5.16 - 2026-06-06
6
13
 
7
14
  ### Changed
8
15
 
9
- - `clear-handoff`: added Step 2 — stage `docs/AI_HANDOFF/`, commit planning artifacts, merge `handoff/integration → $BASE`, push, delete integration branch. This is the **only** git commit+push in the entire handoff flow.
10
- - `review-handoff`: removed all merge/push instructions from Step 3. Reviewer now stops at "Run /ukit:clear-handoff" after all tasks approved.
11
- - Rule enforced: `create-handoff`, `implement-handoff`, `review-handoff` may only change files inside `docs/AI_HANDOFF/`. No commits to main, no pushes.
16
+ - `handoff-clear`: added Step 2 — stage `docs/AI_HANDOFF/`, commit planning artifacts, merge `handoff/integration → $BASE`, push, delete integration branch. This is the **only** git commit+push in the entire handoff flow.
17
+ - `handoff-review`: removed all merge/push instructions from Step 3. Reviewer now stops at "Run /ukit:handoff-clear" after all tasks approved.
18
+ - Rule enforced: `handoff-create`, `handoff-implement`, `handoff-review` may only change files inside `docs/AI_HANDOFF/`. No commits to main, no pushes.
12
19
 
13
20
  ## 1.5.15 - 2026-06-06
14
21
 
15
22
  ### Changed
16
23
 
17
- - `review-handoff`: removed automatic `git merge handoff/integration → $BASE`. Reviewer now stops after all tasks are approved and instructs the human to merge manually. Only the end user (or an explicit human prompt) may commit to the base branch.
24
+ - `handoff-review`: removed automatic `git merge handoff/integration → $BASE`. Reviewer now stops after all tasks are approved and instructs the human to merge manually. Only the end user (or an explicit human prompt) may commit to the base branch.
18
25
 
19
26
  ## 1.5.14 - 2026-06-05
20
27
 
21
28
  ### Added
22
29
 
23
- - 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`.
30
+ - Added 6 handoff slash commands to OpenCode template (`ukit-handoff-status`, `ukit-handoff-create`, `ukit-handoff-implement`, `ukit-handoff-review`, `ukit-handoff-clear`, `ukit-handoff-abort`). These now appear as Workflows in Kilo Code and slash commands in OpenCode after `ukit install`.
24
31
 
25
32
  ### Fixed
26
33
 
@@ -819,10 +819,10 @@ items:
819
819
  packs:
820
820
  - core
821
821
 
822
- - id: command-create-handoff
822
+ - id: command-handoff-create
823
823
  type: command
824
- sourceTemplate: .claude/commands/ukit/create-handoff.md
825
- targetPath: .claude/commands/ukit/create-handoff.md
824
+ sourceTemplate: .claude/commands/ukit/handoff-create.md
825
+ targetPath: .claude/commands/ukit/handoff-create.md
826
826
  requires:
827
827
  - docs-ai-handoff
828
828
  mergeStrategy: overwrite_with_backup
@@ -831,48 +831,48 @@ items:
831
831
  packs:
832
832
  - core
833
833
 
834
- - id: command-implement-handoff
834
+ - id: command-handoff-implement
835
835
  type: command
836
- sourceTemplate: .claude/commands/ukit/implement-handoff.md
837
- targetPath: .claude/commands/ukit/implement-handoff.md
836
+ sourceTemplate: .claude/commands/ukit/handoff-implement.md
837
+ targetPath: .claude/commands/ukit/handoff-implement.md
838
838
  requires:
839
- - command-create-handoff
839
+ - command-handoff-create
840
840
  mergeStrategy: overwrite_with_backup
841
841
  variables: []
842
842
  enabledByDefault: true
843
843
  packs:
844
844
  - core
845
845
 
846
- - id: command-review-handoff
846
+ - id: command-handoff-review
847
847
  type: command
848
- sourceTemplate: .claude/commands/ukit/review-handoff.md
849
- targetPath: .claude/commands/ukit/review-handoff.md
848
+ sourceTemplate: .claude/commands/ukit/handoff-review.md
849
+ targetPath: .claude/commands/ukit/handoff-review.md
850
850
  requires:
851
- - command-create-handoff
851
+ - command-handoff-create
852
852
  mergeStrategy: overwrite_with_backup
853
853
  variables: []
854
854
  enabledByDefault: true
855
855
  packs:
856
856
  - core
857
857
 
858
- - id: command-clear-handoff
858
+ - id: command-handoff-clear
859
859
  type: command
860
- sourceTemplate: .claude/commands/ukit/clear-handoff.md
861
- targetPath: .claude/commands/ukit/clear-handoff.md
860
+ sourceTemplate: .claude/commands/ukit/handoff-clear.md
861
+ targetPath: .claude/commands/ukit/handoff-clear.md
862
862
  requires:
863
- - command-create-handoff
863
+ - command-handoff-create
864
864
  mergeStrategy: overwrite_with_backup
865
865
  variables: []
866
866
  enabledByDefault: true
867
867
  packs:
868
868
  - core
869
869
 
870
- - id: command-status-handoff
870
+ - id: command-handoff-status
871
871
  type: command
872
- sourceTemplate: .claude/commands/ukit/status-handoff.md
873
- targetPath: .claude/commands/ukit/status-handoff.md
872
+ sourceTemplate: .claude/commands/ukit/handoff-status.md
873
+ targetPath: .claude/commands/ukit/handoff-status.md
874
874
  requires:
875
- - command-create-handoff
875
+ - command-handoff-create
876
876
  mergeStrategy: overwrite_with_backup
877
877
  variables: []
878
878
  enabledByDefault: true
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ngockhoale/ukit",
3
- "version": "1.5.19",
3
+ "version": "1.5.21",
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",
@@ -20,7 +20,7 @@ const AUTO_PRUNE_OBSOLETE_PREFIXES = [
20
20
 
21
21
  const AUTO_PRUNE_OBSOLETE_PATHS = new Set([
22
22
  '.claude/ukit/.env.example',
23
- '.claude/commands/ukit/abort-handoff.md',
23
+ '.claude/commands/ukit/handoff-abort.md',
24
24
  ]);
25
25
 
26
26
  function normalizeRelativePath(relativePath) {
@@ -1549,7 +1549,7 @@ export async function checkHandoffBudget(rootDir) {
1549
1549
  oversizedFiles: oversizedFiles.map((f) => f.file),
1550
1550
  overBudget,
1551
1551
  warning,
1552
- action: warning ? 'clear-handoff' : null,
1552
+ action: warning ? 'handoff-clear' : null,
1553
1553
  };
1554
1554
  }
1555
1555
 
@@ -75,7 +75,7 @@ Wave structure is NOT stored here — inferred from task `Dependencies` fields a
75
75
  - Task count + IDs
76
76
  - Dependency graph (text form: TASK-001 → TASK-003, TASK-002 independent)
77
77
  - Any `needs_breakdown` tasks + reason
78
- - Next step: "Switch to Sonnet/unic-code → run `/ukit:implement-handoff`"
78
+ - Next step: "Switch to Sonnet/unic-code → run `/ukit:handoff-implement`"
79
79
 
80
80
  ## Rules
81
81
 
@@ -1,4 +1,4 @@
1
- # /ukit:clear-handoff — Emergency Reset
1
+ # /ukit:handoff-clear — Emergency Reset
2
2
 
3
3
  **Role: CLEANUP UTILITY**
4
4
  **Tool: any**
@@ -60,4 +60,4 @@ Handoff docs reset. Ready for new cycle.
60
60
  > Claude Code: spawn `ukit-small-task-maintainer` (haiku).
61
61
  > Other tools: lite model, follow steps 1–5.
62
62
 
63
- **Next:** `/ukit:create-handoff <new problem description>`
63
+ **Next:** `/ukit:handoff-create <new problem description>`
@@ -1,4 +1,4 @@
1
- # /ukit:create-handoff — Phase 1 + 2: Plan
1
+ # /ukit:handoff-create — Phase 1 + 2: Plan
2
2
 
3
3
  **Role: PLANNER**
4
4
  **Tool: any** (Claude Code / Codex / Antigravity / Kilo / OpenCode — your choice)
@@ -9,7 +9,8 @@
9
9
  ## Problem / feature
10
10
  $ARGUMENTS
11
11
 
12
- > **Can be run multiple times.** If the plan or tasks aren't satisfactory after the first run, re-run `/ukit:create-handoff` to refine until the plan is good — as long as no task has been implemented yet.
12
+ > **Can be run multiple times.** If the plan or tasks aren't satisfactory after the first run, re-run `/ukit:handoff-create` to refine until the plan is good — as long as no task has been implemented yet.
13
+ > **NO git commit. NO git push.** This phase only writes docs files. No code changes.
13
14
 
14
15
  ---
15
16
 
@@ -79,4 +80,4 @@ Switch to strongest model. Use Step 1 summary — do NOT re-read files.
79
80
 
80
81
  ---
81
82
 
82
- **Next:** switch to code model → `/ukit:implement-handoff`
83
+ **Next:** switch to code model → `/ukit:handoff-implement`
@@ -1,4 +1,4 @@
1
- # /ukit:implement-handoff — Phase 3: Execute
1
+ # /ukit:handoff-implement — Phase 3: Execute
2
2
 
3
3
  **Role: EXECUTOR (orchestrated)**
4
4
  **Tool: any** (Claude Code / Codex / Antigravity / Kilo / OpenCode — your choice)
@@ -8,6 +8,8 @@
8
8
  $ARGUMENTS
9
9
  _Empty = all `ready` tasks. Or: "TASK-001" for a specific task._
10
10
 
11
+ > **NO git commit. NO git push. Ever.** AI only makes file changes. Human commits when ready.
12
+
11
13
  ---
12
14
 
13
15
  ## Step 1 — Setup
@@ -16,11 +18,13 @@ Read `docs/AI_HANDOFF/ACTIVE.md` → get `Base: <BASE>`.
16
18
  Read `docs/AI_HANDOFF/INDEX.md` → collect `ready` tasks (or specific task from $ARGUMENTS).
17
19
  If no ready tasks → report and stop.
18
20
 
19
- Create integration branch (once per cycle, skip if already exists):
21
+ Verify working tree is clean before starting:
20
22
  ```bash
21
- git branch handoff/integration $BASE 2>/dev/null || echo "already exists"
23
+ git status # must be clean — no uncommitted changes
22
24
  ```
23
25
 
26
+ If working tree is dirty → stop. Ask human to commit or stash first.
27
+
24
28
  ## Step 2 — Build wave groups
25
29
 
26
30
  Read each `tasks/TASK-xxx.md` for `Dependencies` field:
@@ -33,15 +37,15 @@ Read each `tasks/TASK-xxx.md` for `Dependencies` field:
33
37
 
34
38
  For each wave:
35
39
 
36
- ### 3a — Create worktrees (from `handoff/integration`)
40
+ ### 3a — Create worktrees (from `$BASE`, no extra branch)
37
41
  ```bash
38
- git worktree add -b handoff/task-xxx .worktrees/task-xxx handoff/integration
42
+ git worktree add -b handoff/task-xxx .worktrees/task-xxx $BASE
39
43
  # (omit -b if branch already exists)
40
44
  ```
41
45
 
42
46
  ### 3b — Run tasks in parallel (one agent/session per task)
43
47
 
44
- Each executor does independently in its own worktree:
48
+ Each executor works independently in its own worktree — **NO git commit, NO git add**:
45
49
 
46
50
  ```
47
51
  Read docs/AI_HANDOFF/tasks/TASK-xxx.md
@@ -55,17 +59,13 @@ TDD — mandatory:
55
59
  cd .worktrees/task-xxx && <each verification command>
56
60
  Paste full output.
57
61
 
58
- Commit in worktree:
59
- git -C .worktrees/task-xxx add -A
60
- git -C .worktrees/task-xxx commit -m "feat(TASK-xxx): <intent>"
61
- COMMIT_SHA=$(git -C .worktrees/task-xxx rev-parse HEAD)
62
+ DO NOT run: git add, git commit, git push — leave files as-is in worktree.
62
63
 
63
64
  Executor Report (append to task file — do NOT touch INDEX.md):
64
65
  ## Executor Report
65
66
  EXECUTOR_TOOL: <tool>
66
67
  EXECUTOR_MODEL: <exact model ID — mandatory>
67
68
  EXECUTOR_SUBAGENT: <name or "-">
68
- COMMIT_SHA: <sha>
69
69
  Verification Output: <paste>
70
70
  Status: PASS | FAIL
71
71
  Note: <issues or "none">
@@ -74,25 +74,31 @@ Executor Report (append to task file — do NOT touch INDEX.md):
74
74
  > Claude Code: spawn `feature-implementer` agents in parallel (one per task).
75
75
  > Other tools: open each task in separate session with code model.
76
76
 
77
- ### 3c — Orchestrator: merge + IMMEDIATELY delete worktree
77
+ ### 3c — Orchestrator: copy changes to main + IMMEDIATELY delete worktree
78
78
 
79
79
  For each task that reported back:
80
80
 
81
81
  **PASS + EXECUTOR_MODEL present:**
82
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
83
+ WORKTREE=".worktrees/task-xxx"
84
+
85
+ # Copy modified tracked files to main working tree
86
+ git -C "$WORKTREE" diff --name-only | while read f; do
87
+ mkdir -p "$(dirname "$f")"
88
+ cp "$WORKTREE/$f" "$f"
89
+ done
90
+
91
+ # Copy new untracked files
92
+ git -C "$WORKTREE" ls-files --others --exclude-standard | while read f; do
93
+ mkdir -p "$(dirname "$f")"
94
+ cp "$WORKTREE/$f" "$f"
95
+ done
96
+
97
+ # Delete worktree and branch immediately
98
+ git worktree remove "$WORKTREE" --force
99
+ git branch -D handoff/task-xxx
100
+
101
+ # update INDEX.md: status → pending_review
96
102
  ```
97
103
 
98
104
  **FAIL:**
@@ -113,31 +119,20 @@ git branch -D handoff/task-xxx
113
119
  **Worktrees are always deleted immediately** — no exceptions.
114
120
 
115
121
  ### 3d — Next wave
116
- Branch new worktrees from `handoff/integration` (now includes Wave N). Repeat 3a–3c.
122
+ Create new worktrees from `$BASE`. Repeat 3a–3c.
117
123
 
118
- ## Step 4 — Finalize: squash merge + cleanup
124
+ ## Step 4 — Finalize: verify cleanup
119
125
 
120
- All waves complete. Bring all changes back to `$BASE` as a staged diff — no auto-commit.
126
+ All waves complete. Verify:
121
127
 
122
128
  ```bash
123
- git checkout $BASE
124
-
125
- # Stage all integration changes without committing
126
- git merge --squash handoff/integration
127
-
128
- # Delete integration branch
129
- git branch -D handoff/integration
130
-
131
- # Safety-net: remove any stray task worktrees/branches
132
- git worktree list | grep '.worktrees/task-' | awk '{print $1}' | while read wt; do
133
- name=$(basename "$wt")
134
- git worktree remove "$wt" --force 2>/dev/null
135
- git branch -D "handoff/$name" 2>/dev/null
136
- done
137
- git worktree prune
129
+ git worktree list # must show only main worktree
130
+ git branch | grep handoff # must be empty
131
+ git status # shows uncommitted changes — this is expected
132
+ git diff --stat # summary of everything that changed
138
133
  ```
139
134
 
140
- All changes are now **staged on `$BASE`**. No branches or worktrees remain.
135
+ All changes are in the **main working tree as uncommitted files**. No branches or worktrees remain.
141
136
 
142
137
  ## Step 5 — Report
143
138
 
@@ -145,8 +140,8 @@ All changes are now **staged on `$BASE`**. No branches or worktrees remain.
145
140
  Wave summary:
146
141
  Wave 1: TASK-001 [pending_review], TASK-002 [blocked]
147
142
  Wave 2: TASK-003 [pending_review]
148
- All branches and worktrees removed.
149
- Staged diff on $BASE — ready for review.
143
+ All worktrees and branches removed.
144
+ Uncommitted changes in working tree — human commits when ready.
150
145
  ```
151
146
 
152
- **Next:** switch to strong model → `/ukit:review-handoff`
147
+ **Next:** switch to strong model → `/ukit:handoff-review`
@@ -1,4 +1,4 @@
1
- # /ukit:review-handoff — Phase 4: Review
1
+ # /ukit:handoff-review — Phase 4: Review
2
2
 
3
3
  **Role: REVIEWER**
4
4
  **Tool: any** (Claude Code / Codex / Antigravity / Kilo / OpenCode — your choice)
@@ -8,6 +8,8 @@
8
8
  $ARGUMENTS
9
9
  _Empty = all `pending_review` tasks. Or: "TASK-001" for a specific task._
10
10
 
11
+ > **NO git commit. NO git push.** Reviewer only reads and reports. Human decides when to commit.
12
+
11
13
  ---
12
14
 
13
15
  ## Step 1 — Setup
@@ -16,15 +18,15 @@ Read `docs/AI_HANDOFF/ACTIVE.md` → get `Base: <BASE>`.
16
18
  Read `docs/AI_HANDOFF/INDEX.md` → collect `pending_review` tasks (or specific task).
17
19
  If none → report and stop.
18
20
 
19
- Verify we are on `$BASE` with staged changes from implement-handoff:
21
+ Verify there are uncommitted changes from handoff-implement:
20
22
  ```bash
21
- git status # should show staged changes, no handoff branches/worktrees
22
- git diff --staged --stat # summary of everything implement-handoff merged
23
+ git status # should show modified/new files, no handoff branches/worktrees
24
+ git diff --stat # summary of all changes
23
25
  ```
24
26
 
25
- If `git diff --staged` is empty → implement-handoff was not completed. Stop and re-run it.
27
+ If `git diff` is empty and `git status` is clean → handoff-implement was not completed. Stop and re-run it.
26
28
 
27
- ## Step 2 — Review the staged diff
29
+ ## Step 2 — Review the diff
28
30
 
29
31
  ### 2a — Model isolation check (always first)
30
32
 
@@ -34,10 +36,10 @@ Read `EXECUTOR_MODEL` from each task file `## Executor Report`.
34
36
  |----------------|------------|--------|
35
37
  | present, ≠ yours | present | proceed |
36
38
  | present, == yours | present | REFUSE → `changes_requested`: "reviewer ≠ executor required" |
37
- | missing / blank | any | REFUSE → `changes_requested`: "EXECUTOR_MODEL missing — re-run implement" |
39
+ | missing / blank | any | REFUSE → `changes_requested`: "EXECUTOR_MODEL missing — re-run handoff-implement" |
38
40
  | "unknown" | present | proceed + NOTES: "executor model unverified — human confirm" |
39
41
 
40
- ### 2b — Re-run verification (on staged working tree)
42
+ ### 2b — Re-run verification
41
43
 
42
44
  ```bash
43
45
  <each command from §Verification Commands across all tasks>
@@ -48,7 +50,8 @@ If any command fails → verdict: `critical_block`. Stop.
48
50
  ### 2c — Review unified diff
49
51
 
50
52
  ```bash
51
- git diff --staged # full staged diff vs $BASE
53
+ git diff # all uncommitted changes vs $BASE
54
+ git status # overview of modified/new/deleted files
52
55
  ```
53
56
 
54
57
  Review as one unified diff — correctness, regression risk, security, edge cases, maintainability.
@@ -79,26 +82,20 @@ Set `status = NEXT_STATUS_FOR_INDEX`. Orchestrator writes INDEX, not the reviewe
79
82
 
80
83
  Update INDEX.md: all approved tasks → `done`.
81
84
 
82
- Commit the staged changes:
83
- ```bash
84
- git add docs/AI_HANDOFF/
85
- git commit -m "feat: complete handoff cycle"
86
- git push origin $BASE
87
- ```
85
+ **DO NOT commit. DO NOT push.** Leave the working tree as-is for human review.
88
86
 
89
87
  Report:
90
88
  ```
91
- ✅ All tasks approved and committed to $BASE.
92
- Handoff cycle complete.
89
+ ✅ All tasks approved.
90
+ Uncommitted changes are in the working tree — human commits when ready.
91
+ git diff --stat ← review summary
92
+ git add . && git commit -m "..." ← when ready
93
93
  ```
94
94
 
95
95
  **Any `changes_requested` or `critical_block`:**
96
96
 
97
- Do NOT commit. Unstage all changes and re-open the cycle:
98
- ```bash
99
- git restore --staged .
100
- ```
101
- Report which tasks need fixes. Executor re-runs `/ukit:implement-handoff TASK-xxx`.
97
+ Report which files need fixes. Executor re-runs `/ukit:handoff-implement TASK-xxx`.
98
+ Changes from the failed task remain in the working tree — executor fixes them in place (no new worktree needed for simple fixes).
102
99
 
103
100
  ## Step 4 — Report
104
101
 
@@ -106,12 +103,12 @@ Report which tasks need fixes. Executor re-runs `/ukit:implement-handoff TASK-xx
106
103
  Review summary:
107
104
  TASK-001: approved
108
105
  TASK-002: changes_requested — see §Discussion
109
- Result: committed to $BASE | changes requested (staged reset, re-implement needed)
106
+ Working tree: unchanged — human commits when satisfied
110
107
  ```
111
108
 
112
109
  **Next:**
113
- - All approved → done. Committed to `$BASE`.
114
- - Has fixes → unstage (`git restore --staged .`) + executor re-runs `/ukit:implement-handoff TASK-xxx`
110
+ - All approved → human reviews `git diff` and commits manually.
111
+ - Has fixes → executor re-runs `/ukit:handoff-implement TASK-xxx`
115
112
 
116
113
  > Claude Code: spawn `code-reviewer` (opus) per task for 2a–2d. Orchestrator handles 1, 2e, 3.
117
114
  > Other tools: strong model sequentially per task, same steps.
@@ -1,4 +1,4 @@
1
- # /ukit:status-handoff — Dashboard (read-only)
1
+ # /ukit:handoff-status — Dashboard (read-only)
2
2
 
3
3
  **Role: OBSERVER**
4
4
  **Tool: any**
@@ -39,10 +39,10 @@ Integration branch: handoff/integration [exists | not created yet]
39
39
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
40
40
 
41
41
  Next action:
42
- pending_review tasks → /ukit:review-handoff
43
- ready tasks → /ukit:implement-handoff
44
- all done → /ukit:clear-handoff
45
- no active cycle → /ukit:create-handoff <description>
42
+ pending_review tasks → /ukit:handoff-review
43
+ ready tasks → /ukit:handoff-implement
44
+ all done → /ukit:handoff-clear
45
+ no active cycle → /ukit:handoff-create <description>
46
46
  ```
47
47
 
48
48
  > Claude Code: spawn `ukit-small-task-maintainer` (haiku) with the above prompt.
@@ -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`)."},"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."}},"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-handoff-status":{"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-handoff-create":{"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-handoff-implement":{"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-handoff-review":{"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-handoff-clear":{"description":"Archive and reset the current handoff cycle.","agent":"build","template":"Read `.claude/commands/ukit/clear-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"}}}}