@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 +12 -5
- package/manifests/platform.full.yaml +19 -19
- package/package.json +1 -1
- package/src/core/runInstallPipeline.js +1 -1
- package/src/index/taskRouting.js +1 -1
- package/templates/.claude/agents/handoff-planner.md +1 -1
- package/templates/.claude/commands/ukit/{clear-handoff.md → handoff-clear.md} +2 -2
- package/templates/.claude/commands/ukit/{create-handoff.md → handoff-create.md} +4 -3
- package/templates/.claude/commands/ukit/{implement-handoff.md → handoff-implement.md} +42 -47
- package/templates/.claude/commands/ukit/{review-handoff.md → handoff-review.md} +22 -25
- package/templates/.claude/commands/ukit/{status-handoff.md → handoff-status.md} +5 -5
- package/templates/adapter-presets/opencode/opencode.template.json +1 -1
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
|
|
10
|
-
- `review
|
|
11
|
-
- Rule enforced: `create
|
|
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
|
|
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
|
|
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
|
|
822
|
+
- id: command-handoff-create
|
|
823
823
|
type: command
|
|
824
|
-
sourceTemplate: .claude/commands/ukit/create
|
|
825
|
-
targetPath: .claude/commands/ukit/create
|
|
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
|
|
834
|
+
- id: command-handoff-implement
|
|
835
835
|
type: command
|
|
836
|
-
sourceTemplate: .claude/commands/ukit/implement
|
|
837
|
-
targetPath: .claude/commands/ukit/implement
|
|
836
|
+
sourceTemplate: .claude/commands/ukit/handoff-implement.md
|
|
837
|
+
targetPath: .claude/commands/ukit/handoff-implement.md
|
|
838
838
|
requires:
|
|
839
|
-
- command-create
|
|
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
|
|
846
|
+
- id: command-handoff-review
|
|
847
847
|
type: command
|
|
848
|
-
sourceTemplate: .claude/commands/ukit/review
|
|
849
|
-
targetPath: .claude/commands/ukit/review
|
|
848
|
+
sourceTemplate: .claude/commands/ukit/handoff-review.md
|
|
849
|
+
targetPath: .claude/commands/ukit/handoff-review.md
|
|
850
850
|
requires:
|
|
851
|
-
- command-create
|
|
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
|
|
858
|
+
- id: command-handoff-clear
|
|
859
859
|
type: command
|
|
860
|
-
sourceTemplate: .claude/commands/ukit/clear
|
|
861
|
-
targetPath: .claude/commands/ukit/clear
|
|
860
|
+
sourceTemplate: .claude/commands/ukit/handoff-clear.md
|
|
861
|
+
targetPath: .claude/commands/ukit/handoff-clear.md
|
|
862
862
|
requires:
|
|
863
|
-
- command-create
|
|
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
|
|
870
|
+
- id: command-handoff-status
|
|
871
871
|
type: command
|
|
872
|
-
sourceTemplate: .claude/commands/ukit/status
|
|
873
|
-
targetPath: .claude/commands/ukit/status
|
|
872
|
+
sourceTemplate: .claude/commands/ukit/handoff-status.md
|
|
873
|
+
targetPath: .claude/commands/ukit/handoff-status.md
|
|
874
874
|
requires:
|
|
875
|
-
- command-create
|
|
875
|
+
- command-handoff-create
|
|
876
876
|
mergeStrategy: overwrite_with_backup
|
|
877
877
|
variables: []
|
|
878
878
|
enabledByDefault: true
|
package/package.json
CHANGED
|
@@ -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
|
|
23
|
+
'.claude/commands/ukit/handoff-abort.md',
|
|
24
24
|
]);
|
|
25
25
|
|
|
26
26
|
function normalizeRelativePath(relativePath) {
|
package/src/index/taskRouting.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
63
|
+
**Next:** `/ukit:handoff-create <new problem description>`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# /ukit:create
|
|
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
|
|
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
|
|
83
|
+
**Next:** switch to code model → `/ukit:handoff-implement`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# /ukit:implement
|
|
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
|
-
|
|
21
|
+
Verify working tree is clean before starting:
|
|
20
22
|
```bash
|
|
21
|
-
git
|
|
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
|
|
40
|
+
### 3a — Create worktrees (from `$BASE`, no extra branch)
|
|
37
41
|
```bash
|
|
38
|
-
git worktree add -b handoff/task-xxx .worktrees/task-xxx
|
|
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
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
122
|
+
Create new worktrees from `$BASE`. Repeat 3a–3c.
|
|
117
123
|
|
|
118
|
-
## Step 4 — Finalize:
|
|
124
|
+
## Step 4 — Finalize: verify cleanup
|
|
119
125
|
|
|
120
|
-
All waves complete.
|
|
126
|
+
All waves complete. Verify:
|
|
121
127
|
|
|
122
128
|
```bash
|
|
123
|
-
git
|
|
124
|
-
|
|
125
|
-
#
|
|
126
|
-
git
|
|
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
|
|
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
|
|
149
|
-
|
|
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
|
|
147
|
+
**Next:** switch to strong model → `/ukit:handoff-review`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# /ukit: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
|
|
21
|
+
Verify there are uncommitted changes from handoff-implement:
|
|
20
22
|
```bash
|
|
21
|
-
git status
|
|
22
|
-
git diff --
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
92
|
-
|
|
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
|
-
|
|
98
|
-
|
|
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
|
-
|
|
106
|
+
Working tree: unchanged — human commits when satisfied
|
|
110
107
|
```
|
|
111
108
|
|
|
112
109
|
**Next:**
|
|
113
|
-
- All approved →
|
|
114
|
-
- Has fixes →
|
|
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
|
|
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
|
|
43
|
-
ready tasks → /ukit:implement
|
|
44
|
-
all done → /ukit:clear
|
|
45
|
-
no active cycle → /ukit:create
|
|
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
|
|
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"}}}}
|