ultra-builder-pro-cli 5.0.0 → 6.0.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/CHANGELOG.md +113 -3
- package/README.md +67 -478
- package/README.zh-CN.md +49 -422
- package/adapters/_shared/frontmatter.cjs +1 -18
- package/adapters/_shared/plugin-core.cjs +17 -83
- package/adapters/_shared/runtime-assets.cjs +6 -120
- package/adapters/claude.js +8 -24
- package/adapters/codex.js +16 -38
- package/bin/install.js +35 -57
- package/docs/PLUGIN-ISOLATION-CONTRACT.md +13 -101
- package/docs/examples/drive/claude-reviewer.sh +53 -0
- package/docs/examples/drive/claude-writer.sh +43 -0
- package/engine/FORMATS.md +1051 -0
- package/engine/checks.cjs +139 -0
- package/engine/cli.cjs +148 -0
- package/engine/completion.cjs +48 -0
- package/engine/context.cjs +94 -0
- package/engine/drive.cjs +220 -0
- package/engine/expect-worker.cjs +5 -0
- package/engine/expect.cjs +33 -0
- package/engine/formats.cjs +189 -0
- package/engine/git-state.cjs +112 -0
- package/engine/ledger.cjs +205 -0
- package/engine/loading.cjs +28 -0
- package/engine/merge.cjs +273 -0
- package/engine/milestone.cjs +89 -0
- package/engine/plan.cjs +232 -0
- package/engine/project.cjs +5 -0
- package/engine/signals.cjs +3 -0
- package/engine/states.cjs +175 -0
- package/hooks/session-start.cjs +54 -0
- package/package.json +17 -52
- package/skills/ultra/SKILL.md +395 -0
- package/.ultra-template/changes/abandoned/.gitkeep +0 -0
- package/.ultra-template/changes/active/.gitkeep +0 -1
- package/.ultra-template/changes/archive/.gitkeep +0 -1
- package/.ultra-template/contexts/TEMPLATE.md +0 -135
- package/.ultra-template/decisions/.gitkeep +0 -1
- package/.ultra-template/evidence/.gitkeep +0 -1
- package/.ultra-template/north-star.md +0 -52
- package/.ultra-template/project-brief.md +0 -28
- package/.ultra-template/research/.gitkeep +0 -1
- package/.ultra-template/specs/architecture.md +0 -81
- package/.ultra-template/specs/discovery.md +0 -74
- package/.ultra-template/specs/product.md +0 -80
- package/.ultra-template/specs/research-distillate.md +0 -57
- package/.ultra-template/tasks.json +0 -4
- package/.ultra-template/test-report.json +0 -44
- package/adapters/_shared/host-profile.cjs +0 -5
- package/adapters/grok.js +0 -242
- package/adapters/kimi.js +0 -232
- package/adapters/opencode.js +0 -408
- package/adapters/zcode.js +0 -375
- package/bin/delegate-worker.cjs +0 -5
- package/bin/delegate.cjs +0 -5
- package/docs/ARCHITECTURE.md +0 -274
- package/docs/ARTIFACT-AUTHORITY.md +0 -305
- package/docs/DECISIONS.md +0 -229
- package/docs/PHILOSOPHY.md +0 -261
- package/docs/RUNTIME-COMPAT-MATRIX.md +0 -315
- package/docs/SKILL-AUTHORING.md +0 -113
- package/docs/WORKFLOW-LIFECYCLE.md +0 -350
- package/docs/evals/adversarial-review-2026-08-14.md +0 -84
- package/docs/evals/ultra-5-0-journey-results.md +0 -62
- package/docs/evals/ultra-5-0-live-acp-conformance.md +0 -93
- package/docs/evals/ultra-5-0-route-journeys.md +0 -145
- package/docs/evals/zcode-automation-2026-08-14.md +0 -103
- package/hooks/README.md +0 -52
- package/hooks/_common.py +0 -1779
- package/hooks/adapters/codex.py +0 -295
- package/hooks/adapters/grok.py +0 -134
- package/hooks/adapters/kimi.py +0 -156
- package/hooks/adapters/zcode.py +0 -227
- package/hooks/block_dangerous_commands.py +0 -201
- package/hooks/compact_context.py +0 -224
- package/hooks/mid_workflow_recall.py +0 -47
- package/hooks/post_edit_guard.py +0 -215
- package/hooks/session_context.py +0 -741
- package/skills/ultra-change/SKILL.md +0 -165
- package/skills/ultra-change/references/change-contract.md +0 -199
- package/skills/ultra-change/references/execution-grant.md +0 -109
- package/skills/ultra-change/references/primary-transfer.md +0 -273
- package/skills/ultra-change/scripts/validate_primary_transfer.cjs +0 -1928
- package/skills/ultra-delegate/SKILL.md +0 -195
- package/skills/ultra-delegate/patches/zcode-acp-0.1.0-zcode-0.16.5.patch +0 -184
- package/skills/ultra-delegate/references/delegation-contract.md +0 -138
- package/skills/ultra-delegate/scripts/acp-conformance.cjs +0 -287
- package/skills/ultra-delegate/scripts/acp-driver.cjs +0 -762
- package/skills/ultra-delegate/scripts/agent-execution-driver.cjs +0 -320
- package/skills/ultra-delegate/scripts/cli-driver.cjs +0 -61
- package/skills/ultra-delegate/scripts/delegate-profiles/kimi-read-only.md +0 -15
- package/skills/ultra-delegate/scripts/delegate-profiles/kimi-write.md +0 -17
- package/skills/ultra-delegate/scripts/delegate-worker.cjs +0 -328
- package/skills/ultra-delegate/scripts/delegate.cjs +0 -690
- package/skills/ultra-delegate/scripts/delegate_wait.py +0 -86
- package/skills/ultra-delegate/scripts/host-profile.cjs +0 -267
- package/skills/ultra-deliver/SKILL.md +0 -194
- package/skills/ultra-deliver/references/baseline-reconciliation.md +0 -41
- package/skills/ultra-dev/SKILL.md +0 -265
- package/skills/ultra-dev/references/debugging.md +0 -22
- package/skills/ultra-domain-modeling/SKILL.md +0 -79
- package/skills/ultra-grilling/SKILL.md +0 -121
- package/skills/ultra-grilling/references/reframing.md +0 -76
- package/skills/ultra-init/SKILL.md +0 -143
- package/skills/ultra-init/references/brownfield-adoption.md +0 -32
- package/skills/ultra-init/scripts/init_project.cjs +0 -1031
- package/skills/ultra-plan/SKILL.md +0 -160
- package/skills/ultra-plan/references/task-evidence-v2.md +0 -300
- package/skills/ultra-plan/scripts/validate_task_evidence.cjs +0 -859
- package/skills/ultra-research/SKILL.md +0 -167
- package/skills/ultra-research/references/00-problem-validation.md +0 -36
- package/skills/ultra-research/references/01-opportunity-discovery.md +0 -33
- package/skills/ultra-research/references/02-market-assessment.md +0 -31
- package/skills/ultra-research/references/03-alternatives.md +0 -31
- package/skills/ultra-research/references/04-product-strategy.md +0 -41
- package/skills/ultra-research/references/05-assumptions-validation.md +0 -31
- package/skills/ultra-research/references/10-user-personas.md +0 -30
- package/skills/ultra-research/references/11-user-scenarios.md +0 -28
- package/skills/ultra-research/references/20-user-stories.md +0 -31
- package/skills/ultra-research/references/21-features-scope.md +0 -38
- package/skills/ultra-research/references/22-success-metrics.md +0 -33
- package/skills/ultra-research/references/30-architecture-context.md +0 -30
- package/skills/ultra-research/references/31-solution-strategy.md +0 -28
- package/skills/ultra-research/references/32-building-blocks.md +0 -28
- package/skills/ultra-research/references/40-deployment.md +0 -29
- package/skills/ultra-research/references/41-quality-risks.md +0 -28
- package/skills/ultra-research/references/99-synthesis.md +0 -59
- package/skills/ultra-research/references/north-star-v2.md +0 -168
- package/skills/ultra-research/references/wayfinding.md +0 -50
- package/skills/ultra-research/scripts/validate_north_star.cjs +0 -1174
- package/skills/ultra-review/SKILL.md +0 -275
- package/skills/ultra-review/references/adversarial-evaluation.md +0 -31
- package/skills/ultra-review/references/code.md +0 -17
- package/skills/ultra-review/references/comments.md +0 -12
- package/skills/ultra-review/references/design.md +0 -12
- package/skills/ultra-review/references/errors.md +0 -13
- package/skills/ultra-review/references/review-modes.md +0 -29
- package/skills/ultra-review/references/spec.md +0 -18
- package/skills/ultra-review/references/tests.md +0 -12
- package/skills/ultra-review/references/unified-schema.md +0 -284
- package/skills/ultra-review/references/worker-packet.md +0 -183
- package/skills/ultra-review/scripts/review_wait.py +0 -2943
- package/skills/ultra-status/SKILL.md +0 -209
- package/skills/ultra-status/references/route-contract.md +0 -100
- package/skills/ultra-tdd/SKILL.md +0 -91
- package/skills/ultra-tdd/references/templates/README.md +0 -20
- package/skills/ultra-tdd/references/templates/feature-flag-default-audit.sh +0 -79
- package/skills/ultra-tdd/references/templates/persistence-real.ts +0 -78
- package/skills/ultra-tdd/references/templates/testcontainer-postgres.py +0 -78
- package/skills/ultra-tdd/references/templates/testcontainer-postgres.ts +0 -73
- package/skills/ultra-tdd/references/templates/vertical-slice.ts +0 -66
- package/skills/ultra-tdd/references/test-execution.md +0 -23
- package/skills/ultra-test/SKILL.md +0 -244
- package/skills/ultra-test/references/export-syntax.md +0 -18
- package/skills/ultra-test/scripts/validate_review_transport.cjs +0 -549
- package/skills/ultra-test/scripts/worktree_digest.cjs +0 -576
- package/skills/ultra-think/SKILL.md +0 -56
- package/skills/ultra-think/references/autonomy-boundary.md +0 -48
- package/skills/ultra-think/references/interaction-boundary.md +0 -42
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { unique, problem } = require('./formats.cjs');
|
|
4
|
+
const { latest, lockPid } = require('./ledger.cjs');
|
|
5
|
+
const { planProblems, pendingPlans } = require('./plan.cjs');
|
|
6
|
+
|
|
7
|
+
function checkState(project, check, record, ids = check.covers) {
|
|
8
|
+
if (!record) return { state: 'unknown', reasons: ['not-run'] };
|
|
9
|
+
if (record.dirty) return { state: 'unknown', reasons: ['dirty-run'] };
|
|
10
|
+
const reasons = [];
|
|
11
|
+
if (check.fp !== record.check_fp) reasons.push('check-changed');
|
|
12
|
+
if (project.code !== record.code) reasons.push('code-changed');
|
|
13
|
+
if (project.shared !== record.shared) reasons.push('shared-changed');
|
|
14
|
+
for (const id of unique(ids)) {
|
|
15
|
+
if (!project.reqs.has(id) || project.reqs.get(id) !== record.reqs[id]) {
|
|
16
|
+
reasons.push(`req-changed:${id}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
if (reasons.length) return { state: 'stale', reasons };
|
|
20
|
+
return { state: { pass: 'green', fail: 'red', unknown: 'unknown' }[record.outcome],
|
|
21
|
+
reasons: record.outcome === 'pass' ? [] : [record.reason] };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function checkStates(project) {
|
|
25
|
+
const evidence = new Map();
|
|
26
|
+
for (const r of project.evidence) {
|
|
27
|
+
const previous = evidence.get(r.check);
|
|
28
|
+
if (!previous || r.at >= previous.at) evidence.set(r.check, r);
|
|
29
|
+
}
|
|
30
|
+
const checks = project.checks.map((c) => ({ id: c.id,
|
|
31
|
+
...checkState(project, c, evidence.get(c.id)), last_run: evidence.get(c.id)?.run ?? null }));
|
|
32
|
+
return { evidence, checks };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function requirementStates(project, evidence) {
|
|
36
|
+
return [...project.reqs.keys()].map((id) => {
|
|
37
|
+
const pairs = project.checks.filter((c) => c.covers.includes(id))
|
|
38
|
+
.map((c) => ({ id: c.id, ...checkState(project, c, evidence.get(c.id), [id]) }));
|
|
39
|
+
const state = !pairs.length ? 'uncovered'
|
|
40
|
+
: ['red', 'unknown', 'stale', 'green'].find((s) => pairs.some((p) => p.state === s));
|
|
41
|
+
return { id, milestone: project.milestones.find((m) => m.requirements.includes(id))?.id ?? null,
|
|
42
|
+
state, reasons: unique(pairs.flatMap((p) => p.reasons)), checks: pairs };
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function dependencies(project, node) {
|
|
47
|
+
const earlier = node.kind === 'cleanup' ? project.nodes.slice(0, project.nodes.indexOf(node))
|
|
48
|
+
.filter((n) => n.milestone === node.milestone).map((n) => n.id) : [];
|
|
49
|
+
return unique([...node.depends, ...earlier]);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function nodeStates(project) {
|
|
53
|
+
const ns = new Map(project.nodes.map((n) => [n.id, n]));
|
|
54
|
+
const states = new Map();
|
|
55
|
+
// Memoized recursion follows dependencies. The gate rejects cycles, so a valid
|
|
56
|
+
// graph terminates. Cache a blocked state before descending so status also
|
|
57
|
+
// terminates on a cycle before the gate has passed.
|
|
58
|
+
const nodeState = (id) => {
|
|
59
|
+
if (states.has(id)) return states.get(id);
|
|
60
|
+
const n = ns.get(id);
|
|
61
|
+
if (!n) return { state: 'blocked', reasons: [] };
|
|
62
|
+
const record = latest(project.completions, 'node', id);
|
|
63
|
+
const reasons = record ? unique(n.covers).filter((r) => !project.reqs.has(r)
|
|
64
|
+
|| project.reqs.get(r) !== record.reqs[r]).map((r) => `req-changed:${r}`) : [];
|
|
65
|
+
if (record && project.shared !== record.shared) reasons.unshift('shared-changed');
|
|
66
|
+
let state = 'blocked';
|
|
67
|
+
if (record) state = reasons.length ? 'stale' : 'done';
|
|
68
|
+
const result = { id, milestone: n.milestone, state, reasons };
|
|
69
|
+
states.set(id, result);
|
|
70
|
+
if (!record && dependencies(project, n).every((dep) => nodeState(dep).state === 'done')) {
|
|
71
|
+
result.state = 'ready';
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
};
|
|
75
|
+
return project.nodes.map((n) => nodeState(n.id));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function milestoneProgress(project, requirements, nodes, invariants) {
|
|
79
|
+
const closed = new Set(project.closures.map((c) => c.milestone));
|
|
80
|
+
const current = project.milestones.find((m) => !closed.has(m.id)) || project.milestones.at(-1);
|
|
81
|
+
const currentReqs = requirements.filter((r) => current?.requirements.includes(r.id));
|
|
82
|
+
const counts = { total: currentReqs.length,
|
|
83
|
+
green: 0, red: 0, stale: 0, unknown: 0, uncovered: 0 };
|
|
84
|
+
currentReqs.forEach((r) => counts[r.state]++);
|
|
85
|
+
const relevant = project.milestones.filter((m) => closed.has(m.id) || m.id === current?.id);
|
|
86
|
+
const reqIds = new Set(relevant.flatMap((m) => m.requirements));
|
|
87
|
+
const relevantNodes = nodes.filter((n) => relevant.some((m) => m.id === n.milestone));
|
|
88
|
+
const actionable = relevantNodes.find((n) => n.state === 'ready' || (n.state === 'stale'
|
|
89
|
+
&& dependencies(project, project.nodes.find((p) => p.id === n.id))
|
|
90
|
+
.every((dep) => nodes.some((d) => d.id === dep && d.state === 'done'))));
|
|
91
|
+
const ownNodes = nodes.filter((n) => n.milestone === current?.id);
|
|
92
|
+
let next = '无(受阻)';
|
|
93
|
+
if (actionable) next = actionable.id;
|
|
94
|
+
else if (requirements.some((r) => reqIds.has(r.id) && r.state !== 'green')
|
|
95
|
+
|| invariants.some((i) => i.state !== 'green')) next = '检查';
|
|
96
|
+
else if (current && project.milestones.every((m) => closed.has(m.id))) next = '全部完成';
|
|
97
|
+
else if (current && ownNodes.every((n) => n.state === 'done')) next = '里程碑门';
|
|
98
|
+
const closedIds = new Set(project.milestones.filter((m) => closed.has(m.id)
|
|
99
|
+
&& m.id !== current?.id).flatMap((m) => m.requirements));
|
|
100
|
+
const closed_not_green = requirements.filter((r) => closedIds.has(r.id)
|
|
101
|
+
&& r.state !== 'green').length;
|
|
102
|
+
const lastClosure = project.closures.reduce((at, record) => record.at > at ? record.at : at, '');
|
|
103
|
+
const plan_changes = project.plans.filter((p) => ['change', 'removed'].includes(p.type)
|
|
104
|
+
&& p.at > lastClosure).length;
|
|
105
|
+
return { milestone: current?.id ?? null, counts, next, closed_not_green, plan_changes };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function progressLine(progress, gate, dirty, invariants, drive) {
|
|
109
|
+
const { milestone, counts, next, plan_changes, closed_not_green } = progress;
|
|
110
|
+
let line = `${milestone ?? '无'} · ${counts.green}/${counts.total} 绿`;
|
|
111
|
+
for (const [key, label] of [['red', '红'], ['stale', '过期'], ['unknown', '未知'],
|
|
112
|
+
['uncovered', '未覆盖']]) {
|
|
113
|
+
if (counts[key]) line += ` · ${counts[key]} ${label}`;
|
|
114
|
+
}
|
|
115
|
+
line += ` · 下一项 ${next} · 本里程碑计划变更 ${plan_changes} 次`;
|
|
116
|
+
const notGreen = invariants.filter((i) => i.state !== 'green').length;
|
|
117
|
+
if (notGreen) line += ` · 不变量 ${notGreen} 未绿`;
|
|
118
|
+
if (closed_not_green) line += ` · 已关闭里程碑 ${closed_not_green} 项未绿`;
|
|
119
|
+
if (dirty) line += ' · 工作区未提交';
|
|
120
|
+
if (gate !== 'pass') {
|
|
121
|
+
line += gate === 'fail' ? ' · 计划门未通过' : ' · 计划门待重跑';
|
|
122
|
+
}
|
|
123
|
+
return line + (drive ? ' · drive 运行中' : '');
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function status(project) {
|
|
127
|
+
const drive = lockPid(project.root, 'drive');
|
|
128
|
+
const { evidence, checks } = checkStates(project);
|
|
129
|
+
const invariants = project.checks.filter((c) => Object.hasOwn(c, 'fix')).map((c) => {
|
|
130
|
+
const { id, state, reasons } = checks.find((s) => s.id === c.id);
|
|
131
|
+
return { id, state, reasons, fix: c.fix };
|
|
132
|
+
});
|
|
133
|
+
const requirements = requirementStates(project, evidence);
|
|
134
|
+
const nodes = nodeStates(project);
|
|
135
|
+
const progress = milestoneProgress(project, requirements, nodes, invariants);
|
|
136
|
+
const problems = planProblems(project);
|
|
137
|
+
let gate = 'pass';
|
|
138
|
+
if (problems.length) gate = 'fail';
|
|
139
|
+
else if (pendingPlans(project).length) gate = 'stale';
|
|
140
|
+
return { ...progress, line: progressLine(progress, gate, project.dirty, invariants, drive),
|
|
141
|
+
drive, gate, problems, warnings: project.warnings, dirty: project.dirty,
|
|
142
|
+
requirements, checks, nodes, invariants };
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function invariantProblems(state) {
|
|
146
|
+
return state.invariants.filter((i) => i.state !== 'green')
|
|
147
|
+
.map((i) => problem('invariant-not-green', `${i.id} is not green`,
|
|
148
|
+
i.state === 'red' ? i.fix : `Run \`ubp check ${i.id}\`.`));
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function retro(project) {
|
|
152
|
+
const since = project.closures.reduce((at, r) => !at || r.at > at ? r.at : at, null);
|
|
153
|
+
const classes = new Map();
|
|
154
|
+
const green = new Set();
|
|
155
|
+
const records = project.evidence.filter((r) => {
|
|
156
|
+
if (r.dirty) return false;
|
|
157
|
+
if (r.outcome === 'pass') { green.add(r.check); return false; }
|
|
158
|
+
return (!since || r.at > since) && (green.has(r.check)
|
|
159
|
+
|| ['timeout', 'expect-timeout', 'not-runnable', 'spawn-error'].includes(r.reason));
|
|
160
|
+
}).sort((a, b) => a.at < b.at ? -1 : a.at > b.at ? 1 : 0);
|
|
161
|
+
for (const r of records) {
|
|
162
|
+
const key = (r.error_line || r.reason).replace(/[0-9]+/gu, '#').replace(/\s+/gu, ' ').trim();
|
|
163
|
+
if (!classes.has(key)) classes.set(key, { class: key, count: 0, checks: [], runs: [] });
|
|
164
|
+
const entry = classes.get(key);
|
|
165
|
+
entry.count++;
|
|
166
|
+
entry.checks.push(r.check);
|
|
167
|
+
entry.runs.push(r.run);
|
|
168
|
+
}
|
|
169
|
+
const entries = [...classes.values()];
|
|
170
|
+
for (const entry of entries) entry.checks = unique(entry.checks).sort();
|
|
171
|
+
entries.sort((a, b) => b.count - a.count || (a.class < b.class ? -1 : a.class > b.class ? 1 : 0));
|
|
172
|
+
return { since, classes: entries };
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
module.exports = { status, invariantProblems, retro, dependencies };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const fs = require('node:fs');
|
|
5
|
+
const path = require('node:path');
|
|
6
|
+
const { spawnSync } = require('node:child_process');
|
|
7
|
+
|
|
8
|
+
function readInput() {
|
|
9
|
+
if (process.stdin.isTTY) return Promise.resolve('');
|
|
10
|
+
return new Promise((resolve) => {
|
|
11
|
+
let text = '';
|
|
12
|
+
const collect = (chunk) => { text += chunk; };
|
|
13
|
+
const finish = () => {
|
|
14
|
+
clearTimeout(timer);
|
|
15
|
+
process.stdin.off('data', collect);
|
|
16
|
+
process.stdin.destroy();
|
|
17
|
+
resolve(text);
|
|
18
|
+
};
|
|
19
|
+
const timer = setTimeout(finish, 1000);
|
|
20
|
+
process.stdin.setEncoding('utf8');
|
|
21
|
+
process.stdin.on('data', collect);
|
|
22
|
+
process.stdin.once('end', finish);
|
|
23
|
+
process.stdin.once('error', finish);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function projectRoot(cwd) {
|
|
28
|
+
let dir = path.resolve(cwd);
|
|
29
|
+
while (!fs.existsSync(path.join(dir, '.ultra', 'spec.md'))) {
|
|
30
|
+
const parent = path.dirname(dir);
|
|
31
|
+
if (parent === dir) return null;
|
|
32
|
+
dir = parent;
|
|
33
|
+
}
|
|
34
|
+
return dir;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async function main() {
|
|
38
|
+
let cwd = process.cwd();
|
|
39
|
+
try {
|
|
40
|
+
const value = JSON.parse(await readInput());
|
|
41
|
+
if (typeof value?.cwd === 'string' && value.cwd) cwd = value.cwd;
|
|
42
|
+
} catch { /* Missing or malformed input uses the process working directory. */ }
|
|
43
|
+
const root = projectRoot(cwd);
|
|
44
|
+
// A drive's writer or reviewer follows its brief, not the controller's method.
|
|
45
|
+
if (!root || process.env.UBP_DRIVE) return;
|
|
46
|
+
const result = spawnSync(process.execPath, [
|
|
47
|
+
path.join(__dirname, '..', 'engine', 'cli.cjs'), 'status', '--root', root,
|
|
48
|
+
], { encoding: 'utf8', timeout: 8000 });
|
|
49
|
+
if (result.stdout) process.stdout.write(result.stdout);
|
|
50
|
+
process.stdout.write('Use the ultra Skill to drive this project.\n');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// An advisory observation must never prevent a session from starting.
|
|
54
|
+
main().catch(() => {}).finally(() => { process.exitCode = 0; });
|
package/package.json
CHANGED
|
@@ -1,65 +1,33 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ultra-builder-pro-cli",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "6.0.0",
|
|
4
|
+
"description": "Project method and deterministic progress engine for Claude Code and Codex.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"ultra-builder-pro-cli": "bin/install.js",
|
|
7
7
|
"ubp": "bin/install.js"
|
|
8
8
|
},
|
|
9
9
|
"files": [
|
|
10
10
|
"bin",
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"skills/ultra
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"skills/ultra-deliver",
|
|
19
|
-
"skills/ultra-status",
|
|
20
|
-
"skills/ultra-think",
|
|
21
|
-
"skills/ultra-change",
|
|
22
|
-
"skills/ultra-delegate",
|
|
23
|
-
"skills/ultra-grilling",
|
|
24
|
-
"skills/ultra-domain-modeling",
|
|
25
|
-
"skills/ultra-tdd",
|
|
26
|
-
"hooks/_common.py",
|
|
27
|
-
"hooks/*.py",
|
|
28
|
-
"hooks/adapters/*.py",
|
|
29
|
-
"hooks/README.md",
|
|
30
|
-
"LICENSE",
|
|
31
|
-
"CHANGELOG.md",
|
|
11
|
+
"engine",
|
|
12
|
+
"adapters/claude.js",
|
|
13
|
+
"adapters/codex.js",
|
|
14
|
+
"adapters/_shared/*.cjs",
|
|
15
|
+
"skills/ultra",
|
|
16
|
+
"hooks/session-start.cjs",
|
|
17
|
+
"README.md",
|
|
32
18
|
"README.zh-CN.md",
|
|
33
|
-
".
|
|
34
|
-
"
|
|
35
|
-
"docs/ARCHITECTURE.md",
|
|
36
|
-
"docs/ARTIFACT-AUTHORITY.md",
|
|
37
|
-
"docs/WORKFLOW-LIFECYCLE.md",
|
|
38
|
-
"docs/SKILL-AUTHORING.md",
|
|
39
|
-
"docs/DECISIONS.md",
|
|
19
|
+
"CHANGELOG.md",
|
|
20
|
+
"LICENSE",
|
|
40
21
|
"docs/PLUGIN-ISOLATION-CONTRACT.md",
|
|
41
|
-
"docs/
|
|
42
|
-
"docs/evals/*.md",
|
|
43
|
-
"!**/*.pyc",
|
|
44
|
-
"!**/*.pyo",
|
|
45
|
-
"!**/*.test.cjs",
|
|
46
|
-
"!**/tests/**",
|
|
47
|
-
"!**/__pycache__/**"
|
|
22
|
+
"docs/examples/drive"
|
|
48
23
|
],
|
|
49
24
|
"keywords": [
|
|
50
25
|
"claude-code",
|
|
51
|
-
"opencode",
|
|
52
26
|
"codex",
|
|
53
|
-
"kimi-code",
|
|
54
|
-
"grok-build",
|
|
55
|
-
"zcode",
|
|
56
27
|
"agent",
|
|
57
28
|
"cli",
|
|
58
|
-
"multi-runtime",
|
|
59
29
|
"ultra-builder-pro",
|
|
60
|
-
"file-first"
|
|
61
|
-
"meta-prompting",
|
|
62
|
-
"context-engineering"
|
|
30
|
+
"file-first"
|
|
63
31
|
],
|
|
64
32
|
"author": "Ultra Builder Pro contributors",
|
|
65
33
|
"license": "MIT",
|
|
@@ -77,17 +45,14 @@
|
|
|
77
45
|
"scripts": {
|
|
78
46
|
"test": "npm run test:all",
|
|
79
47
|
"test:node": "node --test adapters/_shared/tests/*.test.cjs tests/*.test.cjs",
|
|
80
|
-
"test:all": "npm run test:node
|
|
81
|
-
"test:hooks": "pytest hooks/tests -q",
|
|
48
|
+
"test:all": "npm run test:node",
|
|
82
49
|
"verify:release": "npm run test:all && npm audit --omit=dev --audit-level=high",
|
|
83
50
|
"prepublishOnly": "npm run verify:release",
|
|
84
51
|
"install:claude": "node bin/install.js --claude --local",
|
|
85
|
-
"install:
|
|
86
|
-
"install:
|
|
87
|
-
"install:zcode": "node bin/install.js --zcode --global",
|
|
88
|
-
"install:all": "node bin/install.js --all --global"
|
|
52
|
+
"install:all": "node bin/install.js --all --global",
|
|
53
|
+
"install:codex": "node bin/install.js --codex --global"
|
|
89
54
|
},
|
|
90
55
|
"dependencies": {
|
|
91
|
-
"js-yaml": "^4.3.
|
|
56
|
+
"js-yaml": "^4.3.2"
|
|
92
57
|
}
|
|
93
58
|
}
|