ultra-builder-pro-cli 0.13.0 → 0.15.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 (172) hide show
  1. package/.ultra-template/docs/research/README.md +11 -7
  2. package/.ultra-template/specs/architecture.md +36 -36
  3. package/.ultra-template/specs/discovery.md +46 -33
  4. package/.ultra-template/specs/product.md +38 -29
  5. package/.ultra-template/specs/research-distillate.md +48 -0
  6. package/.ultra-template/tasks/contexts/TEMPLATE.md +11 -28
  7. package/CHANGELOG.md +86 -1
  8. package/README.md +40 -26
  9. package/adapters/_shared/codex-assets.cjs +29 -165
  10. package/adapters/_shared/file-ops.cjs +6 -2
  11. package/adapters/_shared/runtime-assets.cjs +1 -0
  12. package/adapters/claude.js +3 -2
  13. package/adapters/codex.js +1 -0
  14. package/adapters/kimi.js +3 -2
  15. package/adapters/opencode.js +33 -122
  16. package/agents/review-coordinator.md +9 -6
  17. package/docs/AGENT-CONTEXT.md +21 -11
  18. package/docs/ARCHITECTURE.md +41 -13
  19. package/docs/PLAN.zh-CN.md +3 -2
  20. package/docs/ROADMAP.md +9 -5
  21. package/docs/RUNTIME-COMPAT-MATRIX.md +6 -6
  22. package/docs/STATE-DB-ACCESS-POLICY.md +27 -25
  23. package/docs/WORKFLOW-LIFECYCLE.md +266 -0
  24. package/hooks/README.md +6 -1
  25. package/hooks/active_task_context.py +22 -50
  26. package/hooks/context_spine.py +61 -332
  27. package/hooks/health_check.py +29 -18
  28. package/hooks/pre_stop_check.py +28 -33
  29. package/hooks/subagent_tracker.py +54 -85
  30. package/hooks/workflow_checkpoint.py +39 -47
  31. package/hooks/workflow_context.py +4 -9
  32. package/hooks/workflow_resume.py +48 -128
  33. package/mcp-server/breadcrumb.cjs +22 -0
  34. package/mcp-server/hook-event.cjs +34 -0
  35. package/mcp-server/lib/archive-journal.cjs +17 -5
  36. package/mcp-server/lib/baseline-workflow.cjs +158 -18
  37. package/mcp-server/lib/change-workflow.cjs +550 -85
  38. package/mcp-server/lib/context-spine.cjs +242 -24
  39. package/mcp-server/lib/doctor.cjs +33 -3
  40. package/mcp-server/lib/init-project.cjs +210 -16
  41. package/mcp-server/lib/plan-store.cjs +4 -1
  42. package/mcp-server/lib/prd-parser.cjs +14 -41
  43. package/mcp-server/lib/pricing.cjs +7 -10
  44. package/mcp-server/lib/project-breadcrumb.cjs +145 -0
  45. package/mcp-server/lib/projector.cjs +57 -3
  46. package/mcp-server/lib/spec-learning.cjs +79 -2
  47. package/mcp-server/lib/state-db.cjs +145 -8
  48. package/mcp-server/lib/state-ops.cjs +160 -9
  49. package/mcp-server/lib/task-expander.cjs +9 -38
  50. package/mcp-server/lib/workflow-state.cjs +2292 -0
  51. package/mcp-server/server.cjs +182 -50
  52. package/orchestrator/daemon.cjs +1 -2
  53. package/orchestrator/dispatch-rules.cjs +5 -31
  54. package/orchestrator/planner/plan-builder.cjs +21 -12
  55. package/package.json +14 -6
  56. package/skills/cc-collab/SKILL.md +2 -2
  57. package/skills/codex-collab/SKILL.md +2 -3
  58. package/skills/ultra-change/SKILL.md +53 -68
  59. package/skills/ultra-change/references/change-contract.md +36 -0
  60. package/skills/ultra-deliver/SKILL.md +69 -79
  61. package/skills/ultra-deliver/references/baseline-reconciliation.md +20 -0
  62. package/skills/ultra-dev/SKILL.md +54 -59
  63. package/skills/ultra-doctor/SKILL.md +40 -71
  64. package/skills/ultra-init/SKILL.md +96 -103
  65. package/skills/ultra-init/references/brownfield-adoption.md +2 -2
  66. package/skills/ultra-plan/SKILL.md +79 -75
  67. package/skills/ultra-plan/references/semantic-preflight.md +18 -0
  68. package/skills/ultra-research/SKILL.md +87 -60
  69. package/skills/ultra-research/references/00-problem-validation.md +36 -0
  70. package/skills/ultra-research/references/01-opportunity-discovery.md +33 -0
  71. package/skills/ultra-research/references/02-market-assessment.md +30 -0
  72. package/skills/ultra-research/references/03-competitive-landscape.md +31 -0
  73. package/skills/ultra-research/references/04-product-strategy.md +32 -0
  74. package/skills/ultra-research/references/05-assumptions-validation.md +31 -0
  75. package/skills/ultra-research/references/10-user-personas.md +29 -0
  76. package/skills/ultra-research/references/11-user-scenarios.md +28 -0
  77. package/skills/ultra-research/references/20-user-stories.md +30 -0
  78. package/skills/ultra-research/references/21-features-scope.md +29 -0
  79. package/skills/ultra-research/references/22-success-metrics.md +28 -0
  80. package/skills/ultra-research/references/30-architecture-context.md +30 -0
  81. package/skills/ultra-research/references/31-solution-strategy.md +28 -0
  82. package/skills/ultra-research/references/32-building-blocks.md +28 -0
  83. package/skills/ultra-research/references/40-deployment.md +29 -0
  84. package/skills/ultra-research/references/41-quality-risks.md +28 -0
  85. package/skills/ultra-research/references/99-synthesis.md +35 -0
  86. package/skills/ultra-review/SKILL.md +57 -73
  87. package/skills/ultra-review/references/review-modes.md +27 -0
  88. package/skills/ultra-review/references/unified-schema.md +25 -0
  89. package/skills/ultra-review/scripts/review_wait.py +40 -3
  90. package/skills/ultra-status/SKILL.md +41 -45
  91. package/skills/ultra-test/SKILL.md +48 -55
  92. package/skills/ultra-verify/SKILL.md +22 -31
  93. package/skills/ultra-verify/references/{confidence-system.md → evidence-status.md} +3 -3
  94. package/skills/ultra-verify/scripts/verify_wait.py +54 -54
  95. package/spec/cli-protocol.md +7 -2
  96. package/spec/mcp-tools.yaml +422 -73
  97. package/spec/schemas/baseline-reconciliation.v1.schema.json +73 -0
  98. package/spec/schemas/delivery-report.v1.schema.json +111 -0
  99. package/spec/schemas/mcp-tools.schema.json +1 -1
  100. package/spec/schemas/state-db.sql +82 -1
  101. package/spec/schemas/tasks.v4.5.schema.json +8 -1
  102. package/spec/schemas/test-report.v1.schema.json +194 -0
  103. package/ultra-tools/cli.cjs +1 -1
  104. package/ultra-tools/commands/migrate.cjs +3 -3
  105. package/ultra-tools/commands/status.cjs +213 -12
  106. package/.ultra-template/delivery-report.json +0 -9
  107. package/.ultra-template/test-report.json +0 -8
  108. package/adapters/_shared/tests/file-ops.test.cjs +0 -54
  109. package/adapters/_shared/tests/frontmatter.test.cjs +0 -47
  110. package/adapters/_shared/tests/handbook.test.cjs +0 -101
  111. package/adapters/_shared/tests/path-rewrite.test.cjs +0 -60
  112. package/adapters/_shared/tests/provenance.test.cjs +0 -133
  113. package/adapters/_shared/tests/resolve-target.test.cjs +0 -75
  114. package/adapters/_shared/tests/runtime-assets.test.cjs +0 -131
  115. package/adapters/_shared/tests/settings-merge.test.cjs +0 -85
  116. package/adapters/_shared/tests/validate.test.cjs +0 -30
  117. package/adapters/tests/claude.test.cjs +0 -137
  118. package/adapters/tests/codex-hook.test.cjs +0 -115
  119. package/adapters/tests/codex.test.cjs +0 -423
  120. package/adapters/tests/kimi-hook.test.cjs +0 -122
  121. package/adapters/tests/kimi.test.cjs +0 -259
  122. package/adapters/tests/opencode.test.cjs +0 -371
  123. package/mcp-server/lib/archive-journal.test.cjs +0 -35
  124. package/mcp-server/lib/baseline-workflow.test.cjs +0 -477
  125. package/mcp-server/lib/change-workflow.test.cjs +0 -971
  126. package/mcp-server/lib/context-spine.test.cjs +0 -93
  127. package/mcp-server/lib/doctor.test.cjs +0 -148
  128. package/mcp-server/lib/llm-client.cjs +0 -157
  129. package/mcp-server/lib/llm-client.test.cjs +0 -156
  130. package/mcp-server/lib/plan-store.test.cjs +0 -132
  131. package/mcp-server/lib/prd-parser.test.cjs +0 -171
  132. package/mcp-server/lib/runtime-state.test.cjs +0 -92
  133. package/mcp-server/lib/spec-learning.test.cjs +0 -67
  134. package/mcp-server/lib/state-db.test.cjs +0 -314
  135. package/mcp-server/lib/task-expander.test.cjs +0 -324
  136. package/mcp-server/lib/topo.test.cjs +0 -158
  137. package/mcp-server/tests/circuit-breaker.test.cjs +0 -125
  138. package/mcp-server/tests/commit-hash-flow.test.cjs +0 -117
  139. package/mcp-server/tests/concurrency-update.test.cjs +0 -96
  140. package/mcp-server/tests/concurrency.test.cjs +0 -112
  141. package/mcp-server/tests/db-ops.test.cjs +0 -121
  142. package/mcp-server/tests/init-project.test.cjs +0 -393
  143. package/mcp-server/tests/migrate.test.cjs +0 -232
  144. package/mcp-server/tests/projector.test.cjs +0 -162
  145. package/mcp-server/tests/server-contract.test.cjs +0 -1471
  146. package/mcp-server/tests/staleness.test.cjs +0 -190
  147. package/mcp-server/tests/state-db.test.cjs +0 -106
  148. package/mcp-server/tests/state-ops.test.cjs +0 -449
  149. package/mcp-server/tests/tagged-tasks.test.cjs +0 -163
  150. package/mcp-server/tests/telemetry.test.cjs +0 -219
  151. package/orchestrator/planner/expand-prompt.cjs +0 -62
  152. package/orchestrator/planner/expand-prompt.test.cjs +0 -52
  153. package/orchestrator/planner/plan-builder.test.cjs +0 -165
  154. package/orchestrator/planner/prd-prompt.cjs +0 -44
  155. package/orchestrator/planner/prd-prompt.test.cjs +0 -30
  156. package/orchestrator/tests/auto-merge.test.cjs +0 -216
  157. package/orchestrator/tests/daemon.test.cjs +0 -311
  158. package/orchestrator/tests/dispatch-rules.test.cjs +0 -124
  159. package/orchestrator/tests/parallel-orchestrator.test.cjs +0 -233
  160. package/orchestrator/tests/phase-8b-gate.test.cjs +0 -183
  161. package/orchestrator/tests/recovery.test.cjs +0 -190
  162. package/orchestrator/tests/session-runner.test.cjs +0 -314
  163. package/orchestrator/tests/skill-miner.test.cjs +0 -147
  164. package/orchestrator/tests/worktree-manager.test.cjs +0 -148
  165. package/skills/ultra-research/references/architecture.md +0 -38
  166. package/skills/ultra-research/references/problem-product.md +0 -39
  167. package/skills/ultra-research/references/quality-delivery.md +0 -34
  168. package/skills/ultra-research/references/synthesis.md +0 -38
  169. package/skills/ultra-research/references/users-scope.md +0 -40
  170. package/ultra-tools/legacy-memory.test.cjs +0 -80
  171. package/ultra-tools/status-command.test.cjs +0 -181
  172. package/ultra-tools/system-command.test.cjs +0 -309
@@ -1,162 +0,0 @@
1
- 'use strict';
2
-
3
- const test = require('node:test');
4
- const assert = require('node:assert/strict');
5
- const fs = require('node:fs');
6
- const os = require('node:os');
7
- const path = require('node:path');
8
-
9
- const Ajv = require('ajv/dist/2020');
10
- const addFormats = require('ajv-formats');
11
-
12
- const REPO_ROOT = path.resolve(__dirname, '..', '..');
13
- const TASKS_SCHEMA = path.join(REPO_ROOT, 'spec', 'schemas', 'tasks.v4.5.schema.json');
14
-
15
- const { initStateDb, closeStateDb } = require('../lib/state-db.cjs');
16
- const ops = require('../lib/state-ops.cjs');
17
- const projector = require('../lib/projector.cjs');
18
-
19
- const ajv = new Ajv({ allErrors: true, strict: false });
20
- addFormats(ajv);
21
- const validateTasksJson = ajv.compile(JSON.parse(fs.readFileSync(TASKS_SCHEMA, 'utf8')));
22
-
23
- function tmpProject() {
24
- const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'ubp-proj-'));
25
- const dbPath = path.join(dir, '.ultra', 'state.db');
26
- const init = initStateDb(dbPath);
27
- return { dir, dbPath, db: init.db };
28
- }
29
-
30
- function readJson(p) {
31
- return JSON.parse(fs.readFileSync(p, 'utf8'));
32
- }
33
-
34
- test('projectTasks emits a v4.5-conformant tasks.json', () => {
35
- const { dir, db } = tmpProject();
36
- try {
37
- ops.createTask(db, { id: 'p-1', title: 'first', type: 'feature', priority: 'P1', tag: 'main', estimated_days: 2.5 });
38
- ops.createTask(db, { id: 'p-2', title: 'second', type: 'bugfix', priority: 'P2' });
39
- ops.updateTaskStatus(db, 'p-1', 'in_progress');
40
-
41
- const out = projector.projectTasks(db, {}, { rootDir: dir });
42
- assert.equal(out.count, 2);
43
-
44
- const projection = readJson(out.path);
45
- assert.equal(projection.schema_version, '4.5');
46
- assert.equal(projection.source, '.ultra/state.db');
47
- assert.equal(projection.tasks.length, 2);
48
- assert.ok(validateTasksJson(projection), `ajv failed: ${ajv.errorsText(validateTasksJson.errors)}`);
49
-
50
- const p1 = projection.tasks.find((t) => t.id === 'p-1');
51
- assert.equal(p1.status, 'in_progress');
52
- assert.equal(p1.estimated_days, 2.5);
53
- closeStateDb(db);
54
- } finally {
55
- fs.rmSync(dir, { recursive: true, force: true });
56
- }
57
- });
58
-
59
- test('projectContext rebuilds header but preserves the body', () => {
60
- const { dir, db } = tmpProject();
61
- try {
62
- ops.createTask(db, { id: 'cx-1', title: 'context test', type: 'feature', priority: 'P1' });
63
- const ctxFile = path.join(dir, '.ultra', 'tasks', 'contexts', 'task-cx-1.md');
64
- fs.mkdirSync(path.dirname(ctxFile), { recursive: true });
65
- fs.writeFileSync(ctxFile, '---\nstale: header\n---\n\n# body that must survive\n\nUser notes go here.\n');
66
-
67
- ops.updateTaskStatus(db, 'cx-1', 'in_progress');
68
- projector.projectContext(db, 'cx-1', {}, { rootDir: dir });
69
-
70
- const text = fs.readFileSync(ctxFile, 'utf8');
71
- assert.match(text, /^---\n/, 'must start with frontmatter');
72
- assert.match(text, /status: in_progress/);
73
- assert.match(text, /schema_version: 4\.5/);
74
- assert.match(text, /# body that must survive/);
75
- assert.match(text, /User notes go here\./);
76
- closeStateDb(db);
77
- } finally {
78
- fs.rmSync(dir, { recursive: true, force: true });
79
- }
80
- });
81
-
82
- test('projectContext removes the legacy body status banner while preserving task content', () => {
83
- const { dir, db } = tmpProject();
84
- try {
85
- ops.createTask(db, {
86
- id: 'legacy-body', title: 'legacy context body', type: 'feature', priority: 'P1',
87
- context_file: '.ultra/tasks/contexts/task-legacy-body.md',
88
- });
89
- const ctxFile = path.join(dir, '.ultra', 'tasks', 'contexts', 'task-legacy-body.md');
90
- fs.mkdirSync(path.dirname(ctxFile), { recursive: true });
91
- fs.writeFileSync(ctxFile, [
92
- '# Task legacy-body',
93
- '',
94
- '> **Status**: pending | **Priority**: P1 | **Complexity**: 4',
95
- '',
96
- '## Context',
97
- 'Keep this body.',
98
- '',
99
- ].join('\n'));
100
-
101
- projector.projectContext(db, 'legacy-body', {}, { rootDir: dir });
102
- const text = fs.readFileSync(ctxFile, 'utf8');
103
- assert.match(text, /status: pending/);
104
- assert.doesNotMatch(text, /> \*\*Status\*\*:/);
105
- assert.match(text, /# Task legacy-body/);
106
- assert.match(text, /Keep this body\./);
107
- closeStateDb(db);
108
- } finally {
109
- fs.rmSync(dir, { recursive: true, force: true });
110
- }
111
- });
112
-
113
- test('manual edits to tasks.json are overwritten on the next projectAll', () => {
114
- const { dir, db } = tmpProject();
115
- try {
116
- ops.createTask(db, { id: 'ow-1', title: 'overwrite', type: 'feature', priority: 'P0' });
117
- projector.projectAll(db, { rootDir: dir });
118
-
119
- const tasksJson = path.join(dir, '.ultra', 'tasks', 'tasks.json');
120
- fs.writeFileSync(tasksJson, JSON.stringify({ tampered: true }));
121
- assert.deepEqual(readJson(tasksJson), { tampered: true });
122
-
123
- ops.patchTask(db, 'ow-1', { tag: 'main' });
124
- projector.projectAll(db, { rootDir: dir });
125
-
126
- const restored = readJson(tasksJson);
127
- assert.equal(restored.schema_version, '4.5');
128
- assert.equal(restored.tasks[0].id, 'ow-1');
129
- closeStateDb(db);
130
- } finally {
131
- fs.rmSync(dir, { recursive: true, force: true });
132
- }
133
- });
134
-
135
- test('projectAll completes within 1s after a state.db write (PLAN AC)', () => {
136
- const { dir, db } = tmpProject();
137
- try {
138
- for (let i = 0; i < 30; i++) {
139
- ops.createTask(db, { id: `s-${i}`, title: `s${i}`, type: 'feature', priority: 'P3' });
140
- }
141
- const start = Date.now();
142
- const out = projector.projectAll(db, { rootDir: dir });
143
- const elapsed = Date.now() - start;
144
- assert.ok(elapsed <= 1000, `projectAll took ${elapsed}ms, must be <= 1000ms`);
145
- assert.equal(out.tasks_json.count, 30);
146
- assert.equal(out.contexts.length, 30);
147
- closeStateDb(db);
148
- } finally {
149
- fs.rmSync(dir, { recursive: true, force: true });
150
- }
151
- });
152
-
153
- test('projectContext is a no-op for unknown task ids', () => {
154
- const { dir, db } = tmpProject();
155
- try {
156
- const r = projector.projectContext(db, 'no-such-task', {}, { rootDir: dir });
157
- assert.equal(r, null);
158
- closeStateDb(db);
159
- } finally {
160
- fs.rmSync(dir, { recursive: true, force: true });
161
- }
162
- });