ultra-builder-pro-cli 0.9.0 → 0.10.0

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.
Files changed (52) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README.md +11 -6
  3. package/adapters/_shared/codex-assets.cjs +10 -0
  4. package/adapters/_shared/handbook.cjs +2 -0
  5. package/adapters/_shared/runtime-assets.cjs +1 -0
  6. package/adapters/_shared/tests/handbook.test.cjs +3 -0
  7. package/adapters/_shared/tests/runtime-assets.test.cjs +1 -0
  8. package/adapters/kimi.js +2 -2
  9. package/adapters/opencode.js +46 -17
  10. package/adapters/tests/claude.test.cjs +4 -1
  11. package/adapters/tests/codex.test.cjs +4 -3
  12. package/adapters/tests/kimi.test.cjs +6 -2
  13. package/adapters/tests/opencode.test.cjs +46 -3
  14. package/docs/AGENT-CONTEXT.md +34 -12
  15. package/docs/ARCHITECTURE.md +31 -5
  16. package/docs/PLAN.zh-CN.md +3 -2
  17. package/docs/ROADMAP.md +5 -4
  18. package/docs/RUNTIME-COMPAT-MATRIX.md +7 -5
  19. package/docs/USER-HANDBOOK-CONTRACT.md +9 -2
  20. package/hooks/README.md +6 -4
  21. package/hooks/active_task_context.py +14 -0
  22. package/hooks/context_spine.py +218 -0
  23. package/hooks/health_check.py +1 -1
  24. package/hooks/workflow_context.py +16 -123
  25. package/hooks/workflow_resume.py +21 -0
  26. package/mcp-server/lib/change-workflow.cjs +89 -11
  27. package/mcp-server/lib/change-workflow.test.cjs +202 -7
  28. package/mcp-server/lib/context-spine.cjs +331 -0
  29. package/mcp-server/lib/context-spine.test.cjs +73 -0
  30. package/mcp-server/lib/spec-learning.cjs +191 -0
  31. package/mcp-server/lib/spec-learning.test.cjs +62 -0
  32. package/mcp-server/lib/state-db.cjs +72 -10
  33. package/mcp-server/lib/state-db.test.cjs +7 -2
  34. package/mcp-server/server.cjs +31 -1
  35. package/mcp-server/tests/db-ops.test.cjs +3 -3
  36. package/mcp-server/tests/server-contract.test.cjs +74 -0
  37. package/mcp-server/tests/state-db.test.cjs +20 -3
  38. package/package.json +1 -1
  39. package/skills/learn/SKILL.md +1 -0
  40. package/skills/ultra-change/SKILL.md +91 -118
  41. package/skills/ultra-deliver/SKILL.md +93 -221
  42. package/skills/ultra-dev/SKILL.md +81 -310
  43. package/skills/ultra-doctor/SKILL.md +1 -0
  44. package/skills/ultra-init/SKILL.md +1 -0
  45. package/skills/ultra-plan/SKILL.md +72 -292
  46. package/skills/ultra-review/SKILL.md +79 -407
  47. package/skills/ultra-status/SKILL.md +55 -168
  48. package/skills/ultra-test/SKILL.md +64 -183
  49. package/skills/ultra-think/SKILL.md +1 -0
  50. package/spec/cli-protocol.md +3 -0
  51. package/spec/mcp-tools.yaml +133 -4
  52. package/spec/schemas/state-db.sql +31 -0
@@ -1,239 +1,111 @@
1
1
  ---
2
2
  name: ultra-deliver
3
- description: "Converge and deliver a verified baseline or continuous change: reconcile specs, build/test, archive evidence, version, tag, and push."
3
+ description: "Converge an implementation, approved specification learning, independent review axes, and release evidence into one recoverable baseline."
4
+ user-invocable: true
4
5
  runtime: all
5
6
  mcp_tools_required:
6
7
  - change.list
7
8
  - change.get
8
9
  - change.context
10
+ - change.breadcrumb
11
+ - change.learning_resolve
9
12
  - change.converge
10
13
  - change.archive
11
14
  cli_fallback: "direct user interaction"
12
15
  ---
13
16
 
14
- # ultra-deliver — Phase 3.5
17
+ # ultra-deliver — Converge, Archive, Release
15
18
 
16
- Release the current working tree and close its continuous-change packet when
17
- one exists. `.ultra/test-report.json` is the test gate; `change.converge` is the
18
- deterministic closure gate; `.ultra/delivery-report.json` is the release report.
19
- Change lifecycle writes go through MCP only.
20
-
21
- ## Prerequisites (all validations are blocking)
19
+ Deliver the current baseline or one continuous-change packet. Change lifecycle writes
20
+ use MCP only; `.ultra/test-report.json`, review sessions, and delivery reports are
21
+ evidence artifacts.
22
22
 
23
- ### Validation 0 — Resolve continuous change
23
+ ## 1. Bind the delivery
24
24
 
25
- Call `change.list` for `active`, `blocked`, and `ready` work.
25
+ 1. Call `change.list` for active, blocked, and ready changes.
26
+ 2. Bind exactly one relevant change; require an id when ambiguous. Initial baseline
27
+ delivery may use `change_id: null`.
28
+ 3. Call `change.breadcrumb`. A stale/blocked context or incomplete linked task blocks.
29
+ 4. Verify `.ultra/test-report.json` exists, passed, matches the change, and records the
30
+ current full HEAD plus at least one public seam.
31
+ 5. Verify the latest review session matches the same HEAD and has passing independent
32
+ `spec_fidelity` and `engineering_standards` axes.
26
33
 
27
- - Exactly one relevant change → bind delivery to that id.
28
- - More than one → require an explicit id; never guess which change to archive.
29
- - None → allow initial-baseline delivery, but record `change_id: null`.
30
- - Active/blocked change → its linked tasks must all be completed and its
31
- `test-report.json.change_id` must match.
32
- - Ready change → do not rerun convergence blindly; verify its existing
33
- verification artifact still matches current HEAD before archive.
34
-
35
- ### Validation 1 — `/ultra-test` passed
36
-
37
- Read `.ultra/test-report.json`:
38
- - File must exist → else: "Run `/ultra-test` first" → **EXIT**
39
- - `passed === true` → else: show `blocking_issues`, **EXIT**
40
- - `git_commit === current HEAD` → else: "Code changed since last test;
41
- re-run `/ultra-test`" → **EXIT**
34
+ Do not reuse evidence from another checkout, commit, task set, or change.
42
35
 
43
- ### Validation 2 — No uncommitted changes
44
-
45
- `git status --porcelain` must be empty. If dirty, ask through the current
46
- Host's native user-interaction surface:
47
- - A: "Auto-commit all changes" → `git add -A && git commit -m "chore: pre-delivery cleanup"`
48
- - B: "Review changes first" → `git diff --stat` → re-ask
49
- - C: "Block delivery" → **EXIT**
50
-
51
- Commit failure (conflicts, hook rejection) → surface error and **EXIT**.
52
-
53
- ## Workflow
36
+ ## 2. Reconcile specification learning
54
37
 
55
- ### Step 1 — Documentation Update (MANDATORY)
56
-
57
- **1.1 CHANGELOG.md** (required):
58
- 1. `git log --oneline <last-tag>..HEAD`
59
- 2. Categorize by Conventional Commit type: `feat:` → Added, `fix:` → Fixed,
60
- `chore:` → Maintenance, `refactor:` → Changed, `docs:` → Documentation,
61
- `test:` → Tests, `perf:` → Performance.
62
- 3. Insert a new version section at the top of CHANGELOG.md.
63
- 4. Verify: Read CHANGELOG.md; confirm new version section exists.
64
-
65
- **1.2 Technical debt report** (required):
66
- 1. Grep source for `TODO:` / `FIXME:` / `HACK:` / `XXX:`.
67
- 2. Generate / refresh `.ultra/docs/technical-debt.md`:
68
- ```markdown
69
- # Technical Debt (<date>, <commit>)
70
- | File | Line | Kind | Note |
71
- |------|------|------|------|
72
- | src/foo.ts | 42 | TODO | "remove after v1.3" |
73
- ```
74
- 3. Verify: file reflects current grep output.
75
-
76
- **1.3 README.md** (conditional — public API changed):
77
- 1. Diff exported API signatures since last release (`git diff <last-tag>..HEAD -- 'src/**'`)
78
- 2. If signatures changed, update README usage examples
79
- 3. Verify examples match the new API
80
-
81
- **1.4 Baseline specification reconciliation** (continuous change):
82
-
83
- 1. Read `intent.md`, `delta/`, and `docs_impact` from the bound change.
84
- 2. Merge accepted deltas into the declared baseline documents.
85
- 3. Record every updated project-relative path as `baseline_updates`.
86
- 4. If no baseline file changes, write a specific `no_baseline_change_reason`.
87
- 5. Verify no `[NEEDS CLARIFICATION]` or unresolved delta remains for delivered behavior.
88
-
89
- **Checklist**:
90
- - [ ] CHANGELOG.md updated
91
- - [ ] technical-debt.md refreshed
92
- - [ ] README.md reflects current API (if applicable)
93
- - [ ] active delta reconciled into baseline, or explicit no-change rationale exists
94
-
95
- Any unchecked → fix, then continue.
96
-
97
- ### Step 2 — Production Build
98
-
99
- Detect build command (priority order):
100
- 1. `package.json → scripts.build` → `npm run build` (or `pnpm build`/`yarn build`
101
- based on lockfile)
102
- 2. `Makefile` → `make build` or `make release`
103
- 3. `Cargo.toml` → `cargo build --release`
104
- 4. `go.mod` → `go build ./...`
105
- 5. Nothing detected → ask the user for the command
106
-
107
- Non-zero exit → block with stderr captured, then ask the user:
108
- - A: "Fix error and retry"
109
- - B: "Abort delivery"
110
-
111
- ### Step 3 — Version + convergence + release
112
-
113
- **3.1 Determine version bump**:
114
- - `git log <last-tag>..HEAD --oneline` → analyze commit types
115
- - `feat:` → minor, `BREAKING CHANGE:` / `!:` → major, else patch
116
- - Display `<old> → <new>`; allow an explicit user override.
117
-
118
- **3.2 Update version in project files**:
119
- - `package.json`, `Cargo.toml`, `pyproject.toml`, etc.
120
- - Verify: read the file; confirm new version.
121
-
122
- **3.2a Re-run release evidence after docs/version edits**:
123
-
124
- - Run the exact relevant test, type-check, build, and package commands again.
125
- - Capture command, exit code, and result. Any non-zero exit blocks delivery.
126
- - Do not reuse a test report whose `change_id` or pre-change HEAD belongs to a
127
- different change as final evidence.
128
-
129
- **3.3 Release commit**:
130
- ```bash
131
- git add -A
132
- git commit -m "chore(release): v<X.Y.Z>"
133
- ```
134
- Verify with `git log -1 --oneline`.
135
-
136
- **3.4 Recompile context and converge the change** (skip only for initial baseline):
137
-
138
- For `active` or `blocked`, call `change.context` after the release commit so its
139
- git head and task set are current. Then call `change.converge` with the exact
140
- evidence required by kind:
141
-
142
- - `quick`: diff, tests, spec;
143
- - `standard` / `major`: diff, tests, spec, docs, review;
144
- - `incident`: diagnosis, diff, tests. The diagnosis evidence must point to the
145
- completed `diagnosis.md`; convergence separately validates all five required
146
- debugging sections and cannot be satisfied by the evidence string alone.
147
-
148
- Evidence must name concrete commands, artifacts, or file paths. If blockers are
149
- returned, stop before tag/push and route to the owning workflow. Do not weaken
150
- the change kind or mark failed evidence `not_applicable` merely to pass.
151
-
152
- **3.5 Archive after baseline reconciliation**:
153
-
154
- Call `change.archive` with the summary and either `baseline_updates` or the
155
- explicit no-change reason. This moves the packet from `changes/active` to the
156
- dated archive and records closure in state.db. Archive failure blocks release.
157
-
158
- **3.6 Git tag**:
159
- ```bash
160
- git tag v<X.Y.Z>
161
- ```
162
- Verify with `git tag -l v<X.Y.Z>`.
163
-
164
- **3.7 Push to remote**:
165
- ```bash
166
- git push origin main # release commit
167
- git push origin v<X.Y.Z> # version tag
168
- ```
169
- Verify with `git ls-remote --tags origin | grep v<X.Y.Z>`.
170
-
171
- **Release checklist**:
172
- - [ ] Version determined and displayed
173
- - [ ] Version file updated and verified
174
- - [ ] Release commit created and verified
175
- - [ ] Change context current, convergence ready, baseline reconciled, archive complete
176
- - [ ] Git tag created and verified
177
- - [ ] Commit and tag pushed and verified on remote
178
-
179
- Any failure → stop immediately; do NOT continue; surface last-step error.
180
-
181
- ### Step 4 — Persist `.ultra/delivery-report.json`
182
-
183
- ```jsonc
184
- {
185
- "timestamp": "<ISO8601>",
186
- "version": "<X.Y.Z>",
187
- "git_tag": "v<X.Y.Z>",
188
- "git_commit": "<HEAD SHA>",
189
- "change_id": "<archived-change-id-or-null>",
190
- "change_archive_path": "<path-or-null>",
191
- "convergence_ready": true,
192
- "baseline_updates": ["<project-relative-path>"],
193
- "changelog_updated": true,
194
- "technical_debt_refreshed": true,
195
- "build_success": true,
196
- "pushed": true
197
- }
198
- ```
199
-
200
- ### Step 5 — Report
201
-
202
- Print a tight release summary: change id/archive, baseline files reconciled,
203
- tag, commit, exact verification commands, outstanding technical-debt count,
204
- and next suggested action. After release, daily work starts with `/ultra-change`.
205
-
206
- ## Deliverables Checklist (final)
207
-
208
- - [ ] `/ultra-test` passed (verified via test-report.json)
209
- - [ ] Uncommitted changes handled
210
- - [ ] CHANGELOG + technical-debt refreshed (README if API changed)
211
- - [ ] Production build exit 0
212
- - [ ] Continuous change converged and archived (when present)
213
- - [ ] Version bumped, tagged, pushed
214
- - [ ] delivery-report.json written
215
-
216
- ## MCP → CLI fallback matrix
217
-
218
- | Purpose | MCP tool | CLI fallback |
219
- |---------|----------|--------------|
220
- | Resolve dirty-tree action | none | current Host's native user-interaction surface |
221
- | Override version bump | none | current Host's native user-interaction surface |
222
- | Resolve/bind change | `change.list` / `change.get` | none; fail closed |
223
- | Refresh context | `change.context` | none; fail closed |
224
- | Deterministic closure | `change.converge` / `change.archive` | none; fail closed |
225
-
226
- ## What this skill DOES NOT do
227
-
228
- - Does NOT replace `/ultra-test`; it re-runs the exact release evidence after
229
- documentation and version changes so the shipped commit is verified
230
- - Does NOT publish to npm / crates.io / PyPI (Phase 9 handles distribution)
231
- - Does NOT directly mutate state.db or external provider state
232
-
233
- ## Integration
234
-
235
- | | |
236
- |---|---|
237
- | **Input** | bound change (if any), test/review artifacts, current repo |
238
- | **Output** | archived change, reconciled baseline, delivery report, git tag + remote push |
239
- | **Next** | deploy/announce; next daily change begins with `/ultra-change` |
38
+ Call `change.get` for authoritative `learning_candidates`; use the packet's
39
+ `spec-learning.json` only as the inspectable projection.
40
+
41
+ - `proposed`: require approve or reject through `change.learning_resolve`.
42
+ - `approved`: update the declared baseline target, verify the edit, then mark `apply`.
43
+ - `rejected`: preserve the reason as decision evidence.
44
+ - `applied`: verify the target still contains the accepted behavior.
45
+
46
+ Any proposed or approved candidate blocks convergence. This is the mandatory path that
47
+ keeps baseline specs alive after daily changes; it is not cross-session memory.
48
+
49
+ Reconcile accepted `delta/` content and declared documentation impact into baseline
50
+ documents. Record `baseline_updates`, or a specific no-change reason. No unresolved
51
+ placeholder, unknown docs impact, or delivered-only-in-delta behavior may remain.
52
+
53
+ ## 3. Verify the release candidate
54
+
55
+ Require a clean, reviewed release commit. If changes remain, show the diff and obtain
56
+ explicit approval before committing. Never auto-stage unrelated user changes.
57
+
58
+ Run exact project commands for:
59
+
60
+ 1. focused regression/acceptance feedback loop;
61
+ 2. full relevant tests;
62
+ 3. static checks and production build;
63
+ 4. package/install/doctor smoke where the product is distributed;
64
+ 5. public-seam acceptance and rollback/recovery sanity.
65
+
66
+ Record commands, exit results, and current HEAD. Any post-test edit invalidates the
67
+ test and review gates.
68
+
69
+ ## 4. Compile final role context
70
+
71
+ Call `change.context` at the release commit with `role=review`, `gate=convergence`,
72
+ current required refs/digests, the public seam, exact verification command, and the
73
+ single next action `Archive the converged change`. Readiness must be `ready`.
74
+
75
+ ## 5. Converge
76
+
77
+ Call `change.converge` with evidence rows for:
78
+
79
+ - `diff`: reviewed release diff and public seam;
80
+ - `tests`: exact signal object (`command`, expected/observed red, observed green,
81
+ deterministic, duration when known) and seam;
82
+ - `spec`: baseline/delta and applied learning evidence;
83
+ - `docs`: updated paths or explicit non-applicability;
84
+ - `review`, `axis=spec_fidelity`;
85
+ - `review`, `axis=engineering_standards`;
86
+ - `diagnosis` for incidents.
87
+
88
+ Do not collapse the two review axes or substitute prose for the signal fields. If
89
+ convergence returns blockers, fix the named source and rerun the invalidated gates.
90
+
91
+ ## 6. Archive and release
92
+
93
+ After `ready=true`, call `change.archive` with summary and `baseline_updates` (or the
94
+ validated no-change reason). Then:
95
+
96
+ 1. determine the semantic version from user-visible compatibility;
97
+ 2. update version and changelog;
98
+ 3. rerun release verification if version files changed;
99
+ 4. create a non-force commit/tag and push only with explicit release authorization;
100
+ 5. publish the package/release through the repository's authenticated workflow;
101
+ 6. verify the remote tag/release and registry version independently.
102
+
103
+ Write `.ultra/delivery-report.json` with change id, archived status, commit, version,
104
+ commands, package/release identifiers, baseline updates, rollback notes, and timestamp.
105
+
106
+ ## Completion gate
107
+
108
+ Delivery is complete only when the change is archived, local and remote commit/tag
109
+ agree, registry/release verification is current, and the worktree contains no
110
+ unexplained scope. Report the outcome first, exact evidence next, and residual risks
111
+ last. Never say “published” based only on a local version bump.