@ngockhoale/ukit 1.5.13 → 1.5.16
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 +24 -0
- package/manifests/platform.full.yaml +2 -1
- package/package.json +1 -1
- package/templates/.claude/commands/ukit/clear-handoff.md +32 -13
- package/templates/.claude/commands/ukit/review-handoff.md +14 -13
- 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,30 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to UKit are documented here.
|
|
4
4
|
|
|
5
|
+
## 1.5.16 - 2026-06-06
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
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.
|
|
12
|
+
|
|
13
|
+
## 1.5.15 - 2026-06-06
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
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.
|
|
18
|
+
|
|
19
|
+
## 1.5.14 - 2026-06-05
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
|
|
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`.
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
|
|
27
|
+
- `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.
|
|
28
|
+
|
|
5
29
|
## 1.5.7 - 2026-06-02
|
|
6
30
|
|
|
7
31
|
### Fixed
|
package/package.json
CHANGED
|
@@ -27,26 +27,45 @@ 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 —
|
|
30
|
+
## Step 2 — Merge + commit + push to $BASE
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
This is the **only step in the entire handoff that commits and pushes to the base branch.**
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
git checkout $BASE
|
|
36
|
+
|
|
37
|
+
# Stage handoff planning docs (written to workspace during create-handoff, never committed yet)
|
|
38
|
+
git add docs/AI_HANDOFF/
|
|
39
|
+
if ! git diff --staged --quiet; then
|
|
40
|
+
git commit -m "docs(handoff): add cycle planning artifacts"
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
# Merge integration branch (code changes from implement-handoff worktrees)
|
|
44
|
+
if git merge handoff/integration --no-ff -m "feat: complete handoff cycle"; then
|
|
45
|
+
git push origin $BASE
|
|
46
|
+
git branch -D handoff/integration
|
|
47
|
+
else
|
|
48
|
+
git merge --abort
|
|
49
|
+
echo "⛔ Merge conflict on handoff/integration → $BASE. Resolve manually, then re-run /ukit:clear-handoff."
|
|
50
|
+
exit 1
|
|
51
|
+
fi
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Step 3 — Cleanup stray worktrees (safety net)
|
|
55
|
+
|
|
56
|
+
Task worktrees are deleted immediately during implement — none should remain. Safety net only:
|
|
34
57
|
|
|
35
58
|
```bash
|
|
36
|
-
# Safety net: remove any stray task worktrees (should already be gone)
|
|
37
59
|
git worktree list | grep '.worktrees/task-' | awk '{print $1}' | while read wt; do
|
|
38
60
|
name=$(basename $wt)
|
|
39
61
|
git worktree remove $wt --force 2>/dev/null
|
|
40
62
|
git branch -D handoff/$name 2>/dev/null
|
|
41
63
|
done
|
|
42
64
|
|
|
43
|
-
# Integration branch cleanup (removed by review-handoff on success, but safety net here too)
|
|
44
|
-
git branch -D handoff/integration 2>/dev/null
|
|
45
|
-
|
|
46
65
|
git worktree prune
|
|
47
66
|
```
|
|
48
67
|
|
|
49
|
-
## Step
|
|
68
|
+
## Step 4 — Archive cycle
|
|
50
69
|
|
|
51
70
|
Read INDEX.md for cycle ID and task list.
|
|
52
71
|
Write `docs/AI_HANDOFF/archive/cycle-NNN.md`:
|
|
@@ -57,7 +76,7 @@ Write `docs/AI_HANDOFF/archive/cycle-NNN.md`:
|
|
|
57
76
|
```
|
|
58
77
|
If `archive/` has > 3 files → delete oldest, append 1-line summary to `HISTORY.md`.
|
|
59
78
|
|
|
60
|
-
## Step
|
|
79
|
+
## Step 5 — Reset state files
|
|
61
80
|
|
|
62
81
|
```
|
|
63
82
|
PLAN.md → "# PLAN\n_(empty)_"
|
|
@@ -66,11 +85,11 @@ ACTIVE.md → "# ACTIVE\n_(no active cycle)_"
|
|
|
66
85
|
tasks/TASK-*.md → delete all (keep _TEMPLATE.md)
|
|
67
86
|
```
|
|
68
87
|
|
|
69
|
-
## Step
|
|
88
|
+
## Step 6 — Report
|
|
70
89
|
|
|
71
|
-
Cycle NNN
|
|
90
|
+
Cycle NNN merged + pushed to $BASE. X tasks completed. Worktrees removed. Ready for new cycle.
|
|
72
91
|
|
|
73
|
-
> Claude Code: spawn `ukit-small-task-maintainer` (haiku) with steps 1–
|
|
74
|
-
> Other tools: use lite model, follow steps 1–
|
|
92
|
+
> Claude Code: spawn `ukit-small-task-maintainer` (haiku) with steps 1–6.
|
|
93
|
+
> Other tools: use lite model, follow steps 1–6 above.
|
|
75
94
|
|
|
76
95
|
**Next:** `/ukit:create-handoff <new problem description>`
|
|
@@ -77,31 +77,32 @@ Set `status = NEXT_STATUS_FOR_INDEX`. Orchestrator writes INDEX, not the reviewe
|
|
|
77
77
|
## Step 3 — After all tasks reviewed
|
|
78
78
|
|
|
79
79
|
**All `approved` or `approved_minor`:**
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
80
|
+
|
|
81
|
+
Update INDEX.md: all approved tasks → `done`.
|
|
82
|
+
|
|
83
|
+
**STOP. Do not commit, do not push, do not merge.** Only `docs/AI_HANDOFF/` was touched during this entire cycle. The merge + commit + push happens exclusively in `/ukit:clear-handoff`.
|
|
84
|
+
|
|
85
|
+
Report:
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
✅ All tasks approved. Cycle ready to finalize.
|
|
89
|
+
Run: /ukit:clear-handoff
|
|
89
90
|
```
|
|
90
91
|
|
|
91
92
|
**Any `changes_requested` or `critical_block`:**
|
|
92
|
-
Keep `handoff/integration` open
|
|
93
|
+
Keep `handoff/integration` open. Report which tasks need fixes.
|
|
93
94
|
|
|
94
95
|
## Step 4 — Report
|
|
95
96
|
|
|
96
97
|
```
|
|
97
98
|
Review summary:
|
|
98
|
-
TASK-001: approved
|
|
99
|
+
TASK-001: approved
|
|
99
100
|
TASK-002: changes_requested — see §Discussion
|
|
100
|
-
Integration:
|
|
101
|
+
Integration: ready for clear-handoff | pending (fix TASK-002 first)
|
|
101
102
|
```
|
|
102
103
|
|
|
103
104
|
**Next:**
|
|
104
|
-
- All
|
|
105
|
+
- All approved → `/ukit:clear-handoff` (does the merge + commit + push)
|
|
105
106
|
- Has fixes → executor re-runs `/ukit:implement-handoff TASK-xxx`
|
|
106
107
|
|
|
107
108
|
> Claude Code: spawn `code-reviewer` (opus) per task for 2a–2d. Orchestrator handles 1, 2e, 3.
|
|
@@ -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"}}}}
|