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.
- package/.ultra-template/docs/research/README.md +11 -7
- package/.ultra-template/specs/architecture.md +36 -36
- package/.ultra-template/specs/discovery.md +46 -33
- package/.ultra-template/specs/product.md +38 -29
- package/.ultra-template/specs/research-distillate.md +48 -0
- package/.ultra-template/tasks/contexts/TEMPLATE.md +11 -28
- package/CHANGELOG.md +86 -1
- package/README.md +40 -26
- package/adapters/_shared/codex-assets.cjs +29 -165
- package/adapters/_shared/file-ops.cjs +6 -2
- package/adapters/_shared/runtime-assets.cjs +1 -0
- package/adapters/claude.js +3 -2
- package/adapters/codex.js +1 -0
- package/adapters/kimi.js +3 -2
- package/adapters/opencode.js +33 -122
- package/agents/review-coordinator.md +9 -6
- package/docs/AGENT-CONTEXT.md +21 -11
- package/docs/ARCHITECTURE.md +41 -13
- package/docs/PLAN.zh-CN.md +3 -2
- package/docs/ROADMAP.md +9 -5
- package/docs/RUNTIME-COMPAT-MATRIX.md +6 -6
- package/docs/STATE-DB-ACCESS-POLICY.md +27 -25
- package/docs/WORKFLOW-LIFECYCLE.md +266 -0
- package/hooks/README.md +6 -1
- package/hooks/active_task_context.py +22 -50
- package/hooks/context_spine.py +61 -332
- package/hooks/health_check.py +29 -18
- package/hooks/pre_stop_check.py +28 -33
- package/hooks/subagent_tracker.py +54 -85
- package/hooks/workflow_checkpoint.py +39 -47
- package/hooks/workflow_context.py +4 -9
- package/hooks/workflow_resume.py +48 -128
- package/mcp-server/breadcrumb.cjs +22 -0
- package/mcp-server/hook-event.cjs +34 -0
- package/mcp-server/lib/archive-journal.cjs +17 -5
- package/mcp-server/lib/baseline-workflow.cjs +158 -18
- package/mcp-server/lib/change-workflow.cjs +550 -85
- package/mcp-server/lib/context-spine.cjs +242 -24
- package/mcp-server/lib/doctor.cjs +33 -3
- package/mcp-server/lib/init-project.cjs +210 -16
- package/mcp-server/lib/plan-store.cjs +4 -1
- package/mcp-server/lib/prd-parser.cjs +14 -41
- package/mcp-server/lib/pricing.cjs +7 -10
- package/mcp-server/lib/project-breadcrumb.cjs +145 -0
- package/mcp-server/lib/projector.cjs +57 -3
- package/mcp-server/lib/spec-learning.cjs +79 -2
- package/mcp-server/lib/state-db.cjs +145 -8
- package/mcp-server/lib/state-ops.cjs +160 -9
- package/mcp-server/lib/task-expander.cjs +9 -38
- package/mcp-server/lib/workflow-state.cjs +2292 -0
- package/mcp-server/server.cjs +182 -50
- package/orchestrator/daemon.cjs +1 -2
- package/orchestrator/dispatch-rules.cjs +5 -31
- package/orchestrator/planner/plan-builder.cjs +21 -12
- package/package.json +14 -6
- package/skills/cc-collab/SKILL.md +2 -2
- package/skills/codex-collab/SKILL.md +2 -3
- package/skills/ultra-change/SKILL.md +53 -68
- package/skills/ultra-change/references/change-contract.md +36 -0
- package/skills/ultra-deliver/SKILL.md +69 -79
- package/skills/ultra-deliver/references/baseline-reconciliation.md +20 -0
- package/skills/ultra-dev/SKILL.md +54 -59
- package/skills/ultra-doctor/SKILL.md +40 -71
- package/skills/ultra-init/SKILL.md +96 -103
- package/skills/ultra-init/references/brownfield-adoption.md +2 -2
- package/skills/ultra-plan/SKILL.md +79 -75
- package/skills/ultra-plan/references/semantic-preflight.md +18 -0
- package/skills/ultra-research/SKILL.md +87 -60
- package/skills/ultra-research/references/00-problem-validation.md +36 -0
- package/skills/ultra-research/references/01-opportunity-discovery.md +33 -0
- package/skills/ultra-research/references/02-market-assessment.md +30 -0
- package/skills/ultra-research/references/03-competitive-landscape.md +31 -0
- package/skills/ultra-research/references/04-product-strategy.md +32 -0
- package/skills/ultra-research/references/05-assumptions-validation.md +31 -0
- package/skills/ultra-research/references/10-user-personas.md +29 -0
- package/skills/ultra-research/references/11-user-scenarios.md +28 -0
- package/skills/ultra-research/references/20-user-stories.md +30 -0
- package/skills/ultra-research/references/21-features-scope.md +29 -0
- package/skills/ultra-research/references/22-success-metrics.md +28 -0
- package/skills/ultra-research/references/30-architecture-context.md +30 -0
- package/skills/ultra-research/references/31-solution-strategy.md +28 -0
- package/skills/ultra-research/references/32-building-blocks.md +28 -0
- package/skills/ultra-research/references/40-deployment.md +29 -0
- package/skills/ultra-research/references/41-quality-risks.md +28 -0
- package/skills/ultra-research/references/99-synthesis.md +35 -0
- package/skills/ultra-review/SKILL.md +57 -73
- package/skills/ultra-review/references/review-modes.md +27 -0
- package/skills/ultra-review/references/unified-schema.md +25 -0
- package/skills/ultra-review/scripts/review_wait.py +40 -3
- package/skills/ultra-status/SKILL.md +41 -45
- package/skills/ultra-test/SKILL.md +48 -55
- package/skills/ultra-verify/SKILL.md +22 -31
- package/skills/ultra-verify/references/{confidence-system.md → evidence-status.md} +3 -3
- package/skills/ultra-verify/scripts/verify_wait.py +54 -54
- package/spec/cli-protocol.md +7 -2
- package/spec/mcp-tools.yaml +422 -73
- package/spec/schemas/baseline-reconciliation.v1.schema.json +73 -0
- package/spec/schemas/delivery-report.v1.schema.json +111 -0
- package/spec/schemas/mcp-tools.schema.json +1 -1
- package/spec/schemas/state-db.sql +82 -1
- package/spec/schemas/tasks.v4.5.schema.json +8 -1
- package/spec/schemas/test-report.v1.schema.json +194 -0
- package/ultra-tools/cli.cjs +1 -1
- package/ultra-tools/commands/migrate.cjs +3 -3
- package/ultra-tools/commands/status.cjs +213 -12
- package/.ultra-template/delivery-report.json +0 -9
- package/.ultra-template/test-report.json +0 -8
- package/adapters/_shared/tests/file-ops.test.cjs +0 -54
- package/adapters/_shared/tests/frontmatter.test.cjs +0 -47
- package/adapters/_shared/tests/handbook.test.cjs +0 -101
- package/adapters/_shared/tests/path-rewrite.test.cjs +0 -60
- package/adapters/_shared/tests/provenance.test.cjs +0 -133
- package/adapters/_shared/tests/resolve-target.test.cjs +0 -75
- package/adapters/_shared/tests/runtime-assets.test.cjs +0 -131
- package/adapters/_shared/tests/settings-merge.test.cjs +0 -85
- package/adapters/_shared/tests/validate.test.cjs +0 -30
- package/adapters/tests/claude.test.cjs +0 -137
- package/adapters/tests/codex-hook.test.cjs +0 -115
- package/adapters/tests/codex.test.cjs +0 -423
- package/adapters/tests/kimi-hook.test.cjs +0 -122
- package/adapters/tests/kimi.test.cjs +0 -259
- package/adapters/tests/opencode.test.cjs +0 -371
- package/mcp-server/lib/archive-journal.test.cjs +0 -35
- package/mcp-server/lib/baseline-workflow.test.cjs +0 -477
- package/mcp-server/lib/change-workflow.test.cjs +0 -971
- package/mcp-server/lib/context-spine.test.cjs +0 -93
- package/mcp-server/lib/doctor.test.cjs +0 -148
- package/mcp-server/lib/llm-client.cjs +0 -157
- package/mcp-server/lib/llm-client.test.cjs +0 -156
- package/mcp-server/lib/plan-store.test.cjs +0 -132
- package/mcp-server/lib/prd-parser.test.cjs +0 -171
- package/mcp-server/lib/runtime-state.test.cjs +0 -92
- package/mcp-server/lib/spec-learning.test.cjs +0 -67
- package/mcp-server/lib/state-db.test.cjs +0 -314
- package/mcp-server/lib/task-expander.test.cjs +0 -324
- package/mcp-server/lib/topo.test.cjs +0 -158
- package/mcp-server/tests/circuit-breaker.test.cjs +0 -125
- package/mcp-server/tests/commit-hash-flow.test.cjs +0 -117
- package/mcp-server/tests/concurrency-update.test.cjs +0 -96
- package/mcp-server/tests/concurrency.test.cjs +0 -112
- package/mcp-server/tests/db-ops.test.cjs +0 -121
- package/mcp-server/tests/init-project.test.cjs +0 -393
- package/mcp-server/tests/migrate.test.cjs +0 -232
- package/mcp-server/tests/projector.test.cjs +0 -162
- package/mcp-server/tests/server-contract.test.cjs +0 -1471
- package/mcp-server/tests/staleness.test.cjs +0 -190
- package/mcp-server/tests/state-db.test.cjs +0 -106
- package/mcp-server/tests/state-ops.test.cjs +0 -449
- package/mcp-server/tests/tagged-tasks.test.cjs +0 -163
- package/mcp-server/tests/telemetry.test.cjs +0 -219
- package/orchestrator/planner/expand-prompt.cjs +0 -62
- package/orchestrator/planner/expand-prompt.test.cjs +0 -52
- package/orchestrator/planner/plan-builder.test.cjs +0 -165
- package/orchestrator/planner/prd-prompt.cjs +0 -44
- package/orchestrator/planner/prd-prompt.test.cjs +0 -30
- package/orchestrator/tests/auto-merge.test.cjs +0 -216
- package/orchestrator/tests/daemon.test.cjs +0 -311
- package/orchestrator/tests/dispatch-rules.test.cjs +0 -124
- package/orchestrator/tests/parallel-orchestrator.test.cjs +0 -233
- package/orchestrator/tests/phase-8b-gate.test.cjs +0 -183
- package/orchestrator/tests/recovery.test.cjs +0 -190
- package/orchestrator/tests/session-runner.test.cjs +0 -314
- package/orchestrator/tests/skill-miner.test.cjs +0 -147
- package/orchestrator/tests/worktree-manager.test.cjs +0 -148
- package/skills/ultra-research/references/architecture.md +0 -38
- package/skills/ultra-research/references/problem-product.md +0 -39
- package/skills/ultra-research/references/quality-delivery.md +0 -34
- package/skills/ultra-research/references/synthesis.md +0 -38
- package/skills/ultra-research/references/users-scope.md +0 -40
- package/ultra-tools/legacy-memory.test.cjs +0 -80
- package/ultra-tools/status-command.test.cjs +0 -181
- package/ultra-tools/system-command.test.cjs +0 -309
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
# Evidence
|
|
1
|
+
# Evidence Status
|
|
2
2
|
|
|
3
|
-
Cross-model agreement is a signal, not an authority.
|
|
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
|
-
"""
|
|
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
|
-
|
|
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
|
|
27
|
-
|
|
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":
|
|
30
|
-
return {"name":
|
|
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 /
|
|
35
|
-
error = session_path / f"{
|
|
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":
|
|
58
|
+
return {"name": advisor, "status": "complete", "file": str(output)}
|
|
39
59
|
if _file_size(error) > 0:
|
|
40
|
-
return {"name":
|
|
60
|
+
return {"name": advisor, "status": "failed", "file": str(error)}
|
|
41
61
|
if output_size == 0:
|
|
42
|
-
return {"name":
|
|
43
|
-
return {"name":
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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(
|
|
75
|
-
advisor =
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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] {
|
|
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({
|
|
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__":
|
package/spec/cli-protocol.md
CHANGED
|
@@ -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=
|
|
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
|