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,7 +1,7 @@
1
- # Evidence-Based Confidence
1
+ # Evidence Status
2
2
 
3
- Cross-model agreement is a signal, not an authority. Assign confidence only after checking claims
4
- against source code, tests, runtime output, or primary documentation.
3
+ Cross-model agreement is a signal, not an authority. Classify the synthesis only after checking
4
+ consequential claims against source code, tests, runtime output, or primary documentation.
5
5
 
6
6
  ## Levels
7
7
 
@@ -1,19 +1,16 @@
1
1
  #!/usr/bin/env python3
2
- """File-based completion waiter for the Ultra Verify advisor.
3
-
4
- Poll the session directory until the expected output is non-empty and stable, or until timeout.
5
- The JSON result carries the operational status; timeout is not a process error.
6
- """
2
+ """Wait for one named advisor output file to become non-empty and stable."""
7
3
 
4
+ import argparse
8
5
  import json
6
+ import re
9
7
  import sys
10
8
  import time
11
9
  from pathlib import Path
12
10
 
13
11
  POLL_INTERVAL = 3
14
12
  DEFAULT_TIMEOUT = 1200
15
- ADVISOR = "codex"
16
- OUTPUT_FILE = "codex-output.md"
13
+ SAFE_ADVISOR = re.compile(r"^[a-zA-Z0-9_-]+$")
17
14
 
18
15
 
19
16
  def _file_size(path: Path) -> int:
@@ -23,71 +20,74 @@ def _file_size(path: Path) -> int:
23
20
  return -1
24
21
 
25
22
 
26
- def _check_output(session_path: Path) -> dict:
27
- output = session_path / OUTPUT_FILE
23
+ def _safe_output(value: str) -> Path:
24
+ result = Path(value)
25
+ if result.is_absolute() or len(result.parts) != 1 or result.name in {"", ".", ".."}:
26
+ raise argparse.ArgumentTypeError("--output must be one file name inside the session directory")
27
+ return result
28
+
29
+
30
+ def _arguments():
31
+ parser = argparse.ArgumentParser(description=__doc__)
32
+ parser.add_argument("session_path", type=Path)
33
+ parser.add_argument("--advisor", default="advisor")
34
+ parser.add_argument("--output", type=_safe_output, default=Path("advisor-output.md"))
35
+ parser.add_argument("--timeout", type=int, default=DEFAULT_TIMEOUT)
36
+ args = parser.parse_args()
37
+ if not SAFE_ADVISOR.fullmatch(args.advisor):
38
+ parser.error("--advisor must use letters, numbers, underscore, or hyphen")
39
+ if args.timeout < 0:
40
+ parser.error("--timeout must be non-negative")
41
+ if not args.session_path.is_dir():
42
+ parser.error(f"session directory not found: {args.session_path}")
43
+ return args
44
+
45
+
46
+ def _status(session_path: Path, advisor: str, output_name: Path) -> dict:
47
+ output = session_path / output_name
28
48
  if _file_size(output) > 0:
29
- return {"name": ADVISOR, "status": "complete", "file": str(output)}
30
- return {"name": ADVISOR, "status": "pending", "file": None}
49
+ return {"name": advisor, "status": "complete", "file": str(output)}
50
+ return {"name": advisor, "status": "pending", "file": None}
31
51
 
32
52
 
33
- def _timeout_status(session_path: Path) -> dict:
34
- output = session_path / OUTPUT_FILE
35
- error = session_path / f"{ADVISOR}-error.log"
53
+ def _timeout_status(session_path: Path, advisor: str, output_name: Path) -> dict:
54
+ output = session_path / output_name
55
+ error = session_path / f"{advisor}-error.log"
36
56
  output_size = _file_size(output)
37
57
  if output_size > 0:
38
- return {"name": ADVISOR, "status": "complete", "file": str(output)}
58
+ return {"name": advisor, "status": "complete", "file": str(output)}
39
59
  if _file_size(error) > 0:
40
- return {"name": ADVISOR, "status": "failed", "file": str(error)}
60
+ return {"name": advisor, "status": "failed", "file": str(error)}
41
61
  if output_size == 0:
42
- return {"name": ADVISOR, "status": "empty", "file": str(output)}
43
- return {"name": ADVISOR, "status": "pending", "file": None}
62
+ return {"name": advisor, "status": "empty", "file": str(output)}
63
+ return {"name": advisor, "status": "pending", "file": None}
44
64
 
45
65
 
46
66
  def main() -> None:
47
- if len(sys.argv) < 2:
48
- print(__doc__, file=sys.stderr)
49
- sys.exit(2)
50
-
51
- session_path = Path(sys.argv[1])
52
- timeout = DEFAULT_TIMEOUT
53
- if "--timeout" in sys.argv:
54
- idx = sys.argv.index("--timeout")
55
- if idx + 1 >= len(sys.argv):
56
- print("Error: --timeout requires an integer", file=sys.stderr)
57
- sys.exit(2)
58
- try:
59
- timeout = int(sys.argv[idx + 1])
60
- except ValueError:
61
- print(f"Error: --timeout must be integer: {sys.argv[idx + 1]}", file=sys.stderr)
62
- sys.exit(2)
63
- if timeout < 0:
64
- print("Error: --timeout must be non-negative", file=sys.stderr)
65
- sys.exit(2)
66
-
67
- if not session_path.is_dir():
68
- print(f"Error: session directory not found: {session_path}", file=sys.stderr)
69
- sys.exit(2)
70
-
71
- deadline = time.monotonic() + timeout
72
- previous_size = _file_size(session_path / OUTPUT_FILE)
67
+ args = _arguments()
68
+ output = args.session_path / args.output
69
+ deadline = time.monotonic() + args.timeout
70
+ previous_size = _file_size(output)
73
71
  while time.monotonic() < deadline:
74
- current_size = _file_size(session_path / OUTPUT_FILE)
75
- advisor = _check_output(session_path)
76
- stable = advisor["status"] == "complete" and current_size == previous_size
77
- if stable:
78
- elapsed = int(timeout - (deadline - time.monotonic()))
79
- print(json.dumps({"status": "complete", ADVISOR: advisor, "elapsed_seconds": elapsed}))
72
+ current_size = _file_size(output)
73
+ advisor = _status(args.session_path, args.advisor, args.output)
74
+ if advisor["status"] == "complete" and current_size == previous_size:
75
+ elapsed = int(args.timeout - (deadline - time.monotonic()))
76
+ print(json.dumps({
77
+ "status": "complete", "advisor": advisor, "elapsed_seconds": elapsed,
78
+ }))
80
79
  return
81
-
82
80
  state = "stabilizing" if advisor["status"] == "complete" else "waiting"
83
81
  remaining = max(0, int(deadline - time.monotonic()))
84
- sys.stderr.write(f"\r [0/1] {ADVISOR}:{state} ({remaining}s remaining) ")
82
+ sys.stderr.write(f"\r [0/1] {args.advisor}:{state} ({remaining}s remaining) ")
85
83
  sys.stderr.flush()
86
84
  previous_size = current_size
87
85
  time.sleep(POLL_INTERVAL)
88
86
 
89
- advisor = _timeout_status(session_path)
90
- print(json.dumps({"status": "timeout", ADVISOR: advisor, "elapsed_seconds": timeout}))
87
+ advisor = _timeout_status(args.session_path, args.advisor, args.output)
88
+ print(json.dumps({
89
+ "status": "timeout", "advisor": advisor, "elapsed_seconds": args.timeout,
90
+ }))
91
91
 
92
92
 
93
93
  if __name__ == "__main__":
@@ -91,7 +91,7 @@ as a fallback unless `ultra-tools <family> --help` lists it.
91
91
  | `task.expand` | `task expand` | 8a | mcp |
92
92
  | `task.parse_prd` | `task parse-prd` | 8a | mcp |
93
93
  | `task.dependency_topo` | `task topo` | 8a | mcp |
94
- | `task.append_event` | `task append-event` | 2 | any |
94
+ | `task.append_event` | `task append-event` | 2 | any (allowlisted observations only) |
95
95
  | `task.subscribe_events` | `task subscribe` | 2 | any |
96
96
  | `session.spawn` | `session spawn` | 4.5 | mcp |
97
97
  | `session.close` | `session close` | 4.5 | mcp |
@@ -114,6 +114,11 @@ as a fallback unless `ultra-tools <family> --help` lists it.
114
114
  | `change.learning_resolve` | `change learning-resolve` | 10 | mcp |
115
115
  | `change.converge` | `change converge` | 9 | mcp |
116
116
  | `change.archive` | `change archive` | 9 | mcp |
117
+ | `workflow.start` | `workflow start` | 13 | mcp |
118
+ | `workflow.get` | `workflow get` | 13 | any |
119
+ | `workflow.list` | `workflow list` | 13 | any |
120
+ | `workflow.step` | `workflow step` | 13 | mcp |
121
+ | `workflow.complete` | `workflow complete` | 13 | mcp |
117
122
  | `system.doctor` | `system doctor` | 9 | mcp |
118
123
  | `plan.export` | `plan export` | 8a | mcp |
119
124
  | `plan.get` | `plan get` | 8a | any |
@@ -126,7 +131,7 @@ the live MCP server; `system doctor` may additionally be exposed by the
126
131
  maintenance CLI because it is the recovery path when MCP startup is degraded.
127
132
  `task init-project --resume` preserves existing `.ultra` files and installs only
128
133
  missing current scaffold assets. Projection-only state uses the supported
129
- `migrate --from=4.4 --to=4.5` or `--from=4.5 --to=12.0` transition before resume.
134
+ `migrate --from=4.4 --to=4.5` or `--from=4.5 --to=15.0` transition before resume.
130
135
  `system doctor --repair` applies supported schema upgrades with a pre-migration
131
136
  backup before mechanical recovery.
132
137
  `system restore` requires the exact `REPLACE_CORRUPT_ULTRA_STATE` confirmation and a