ultra-builder-pro-cli 0.24.1 → 0.25.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 +63 -0
- package/README.md +10 -0
- package/adapters/claude.js +104 -0
- package/adapters/codex.js +363 -40
- package/adapters/grok.js +1254 -58
- package/adapters/kimi.js +682 -13
- package/adapters/opencode.js +132 -11
- package/agents/code-reviewer.md +4 -5
- package/agents/debugger.md +8 -8
- package/docs/AGENT-CONTEXT.md +30 -4
- package/docs/ARCHITECTURE.md +24 -5
- package/docs/ARTIFACT-AUTHORITY.md +13 -0
- package/docs/COMMIT-HASH-BACKFILL.md +25 -18
- package/docs/RUNTIME-COMPAT-MATRIX.md +18 -2
- package/docs/STATE-DB-ACCESS-POLICY.md +8 -1
- package/mcp-server/lib/artifact-registry.cjs +188 -107
- package/mcp-server/lib/baseline-workflow.cjs +160 -23
- package/mcp-server/lib/change-packet.cjs +4 -32
- package/mcp-server/lib/change-workflow.cjs +36 -2755
- package/mcp-server/lib/context-envelope.cjs +124 -51
- package/mcp-server/lib/decision-records.cjs +164 -78
- package/mcp-server/lib/kernel-change-workflow.cjs +2029 -0
- package/mcp-server/lib/legacy-change-workflow.cjs +3032 -0
- package/mcp-server/lib/managed-file-write.cjs +56 -0
- package/mcp-server/lib/prd-parser.cjs +2 -2
- package/mcp-server/lib/stage-checkpoints.cjs +163 -9
- package/mcp-server/lib/state-db.cjs +186 -8
- package/mcp-server/lib/state-ops.cjs +214 -31
- package/mcp-server/lib/task-contract.cjs +404 -0
- package/mcp-server/lib/task-expander.cjs +8 -3
- package/mcp-server/lib/task-ledger.cjs +175 -62
- package/mcp-server/lib/ultra-facade.cjs +1895 -172
- package/mcp-server/lib/worker-packet.cjs +2 -2
- package/mcp-server/server.cjs +24 -5
- package/orchestrator/parallel-orchestrator.cjs +114 -27
- package/orchestrator/session-runner.cjs +25 -136
- package/package.json +1 -1
- package/skills/ultra-change/SKILL.md +6 -1
- package/skills/ultra-dev/SKILL.md +9 -4
- package/skills/ultra-plan/SKILL.md +13 -4
- package/skills/ultra-plan/references/semantic-preflight.md +6 -4
- package/spec/mcp-tools.yaml +114 -9
- package/spec/schemas/context-file.v4.5.schema.json +2 -2
- package/spec/schemas/state-db.sql +10 -6
- package/spec/schemas/task-ledger.v2.schema.json +23 -8
- package/spec/schemas/tasks.v4.5.schema.json +34 -12
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,69 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.25.0] — 2026-07-31
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Added `task_outcome / attest_commit` as the sole model-facing path for recording
|
|
15
|
+
checkout-local integrated commit proof after durable Task completion.
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
- Published exact Task identifier, numeric, array, object, digest, and runtime-field
|
|
20
|
+
boundaries in the seven-tool MCP contract while keeping repository-defined Task,
|
|
21
|
+
Change, priority, risk, research, and slice labels under model ownership.
|
|
22
|
+
- Applied the same exact-input boundary to Baseline, Change, Decision, Artifact, Event,
|
|
23
|
+
Context, Checkpoint, Sync, Session, Archive, and Doctor calls. Unknown fields and
|
|
24
|
+
wrong scalar, enum, array, object, digest, or scope types are rejected before SQLite
|
|
25
|
+
affinity or downstream consumers can reinterpret them.
|
|
26
|
+
- Made Dev delivery publish durable completion before one integration commit, then
|
|
27
|
+
attest that commit locally without changing the Git-facing team ledger.
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
|
|
31
|
+
- Removed arbitrary Task patches and model-supplied commit hashes from
|
|
32
|
+
`task_outcome / complete`, eliminating the remaining self-referential or
|
|
33
|
+
bookkeeping-commit path.
|
|
34
|
+
- Fixed malformed semantic input and idempotency attempts escaping as transport or raw
|
|
35
|
+
SQLite errors. Correctable requests now return mutable diagnostics and enter bounded
|
|
36
|
+
rejected-attempt audit history without creating semantic authority.
|
|
37
|
+
- Fixed record, checkpoint, team-checkpoint publication, Session lease, Worker Packet,
|
|
38
|
+
and archive receipt failures leaving database rows, managed files, worktrees, or Git
|
|
39
|
+
checkpoint bytes partially committed. Each public mutation now commits its durable
|
|
40
|
+
receipt with the owned state or compensates the external effect before retry.
|
|
41
|
+
- Fixed Task deletion reporting a generic draft-state error before identifying the
|
|
42
|
+
exact durable Session, Artifact, checkpoint, Context, workflow-history, or recovery
|
|
43
|
+
reference that must be resolved.
|
|
44
|
+
- Added a linked active successor path for immutable archived or cancelled Changes
|
|
45
|
+
instead of requiring history mutation or direct SQLite repair.
|
|
46
|
+
- Removed the public Kernel's runtime dependency on the retired workflow supervisor;
|
|
47
|
+
the legacy Change implementation remains compatibility-only and is absent from all
|
|
48
|
+
five bundled host runtimes.
|
|
49
|
+
- Revoked an assigned Worker Packet when a parallel reservation is unwound, ensuring
|
|
50
|
+
the abandoned capability cannot later complete a Task without a live Session.
|
|
51
|
+
|
|
52
|
+
## [0.24.2] — 2026-07-31
|
|
53
|
+
|
|
54
|
+
### Changed
|
|
55
|
+
|
|
56
|
+
- Made the production Change facade single-mode and Kernel-only. The pre-v0.24
|
|
57
|
+
Change implementation is explicitly isolated for compatibility, while retired
|
|
58
|
+
workflow and dialogue rows remain read-only history with no public artifact owner
|
|
59
|
+
or invalidation writer.
|
|
60
|
+
- Made review and debug agents evidence-only: delegated workers can write only their
|
|
61
|
+
assigned report, while the primary host owns source remediation and final judgment.
|
|
62
|
+
|
|
63
|
+
### Fixed
|
|
64
|
+
|
|
65
|
+
- Preserved rejected semantic calls as bounded `ultra_kernel_attempt` audit history
|
|
66
|
+
visible through `ultra.context`, without creating the rejected semantic authority.
|
|
67
|
+
- Renamed misleading `_ultra.state_commit` response metadata to
|
|
68
|
+
`_ultra.projection_commit`; projection processing no longer resembles a semantic
|
|
69
|
+
acceptance receipt.
|
|
70
|
+
- Removed current Change-packet decisions and artifact invalidation from retired
|
|
71
|
+
workflow/dialogue tables while retaining safe migration and historical reads.
|
|
72
|
+
|
|
10
73
|
## [0.24.1] — 2026-07-31
|
|
11
74
|
|
|
12
75
|
### Changed
|
package/README.md
CHANGED
|
@@ -132,6 +132,11 @@ Retired fine-grained operation names are neither discoverable nor callable. Work
|
|
|
132
132
|
prose stays in Skills, model judgment stays with the host, and SQLite records what
|
|
133
133
|
happened rather than deciding what the model is allowed to think next.
|
|
134
134
|
|
|
135
|
+
Rejected semantic attempts remain visible as bounded `ultra_kernel_attempt` audit
|
|
136
|
+
diagnostics in the next `ultra.context`; they do not create rejected authority.
|
|
137
|
+
`_ultra.projection_commit` describes only generated-view processing, never semantic
|
|
138
|
+
acceptance. The production Change API has no legacy/current mode switch.
|
|
139
|
+
|
|
135
140
|
The enforcement gradient is:
|
|
136
141
|
|
|
137
142
|
```text
|
|
@@ -404,6 +409,11 @@ recommends the next capability from current context and owner intent; SQLite doe
|
|
|
404
409
|
encode the semantic route. Another public capability starts only after an explicit
|
|
405
410
|
user command or skill invocation.
|
|
406
411
|
|
|
412
|
+
Review and debug agents are evidence-only workers. They may inspect the assigned
|
|
413
|
+
checkout and write their declared report, but they never edit source or commit
|
|
414
|
+
authority. The primary host evaluates the evidence, applies any repair, and records
|
|
415
|
+
the verified outcome.
|
|
416
|
+
|
|
407
417
|
### Command interaction graph
|
|
408
418
|
|
|
409
419
|
Every solid handoff below means: the current capability returns context and checkpoint
|
package/adapters/claude.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
const fs = require('node:fs');
|
|
6
6
|
const os = require('node:os');
|
|
7
7
|
const path = require('node:path');
|
|
8
|
+
const { spawnSync } = require('node:child_process');
|
|
8
9
|
|
|
9
10
|
const {
|
|
10
11
|
copyTree,
|
|
@@ -53,6 +54,77 @@ function resolveRepoRoot(ctx = {}) {
|
|
|
53
54
|
return ctx.repoRoot || path.resolve(__dirname, '..');
|
|
54
55
|
}
|
|
55
56
|
|
|
57
|
+
function shouldRunHostCli(ctx = {}) {
|
|
58
|
+
if (typeof ctx.runHostCli === 'boolean') return ctx.runHostCli;
|
|
59
|
+
return ctx.scope === 'global' && !ctx.configDir;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function runClaudeCli(args, ctx = {}) {
|
|
63
|
+
const result = spawnSync(ctx.claudeBin || 'claude', args, {
|
|
64
|
+
encoding: 'utf8',
|
|
65
|
+
timeout: ctx.hostCliTimeoutMs || 30000,
|
|
66
|
+
killSignal: 'SIGKILL',
|
|
67
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
68
|
+
env: {
|
|
69
|
+
...process.env,
|
|
70
|
+
CLAUDE_CONFIG_DIR: resolveTarget(ctx),
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
if (result.error) {
|
|
74
|
+
if (result.error.code === 'ETIMEDOUT') {
|
|
75
|
+
const error = new Error(`claude ${args.join(' ')} timed out`);
|
|
76
|
+
error.code = 'HOST_CLI_TIMEOUT';
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
throw result.error;
|
|
80
|
+
}
|
|
81
|
+
if (result.status !== 0) {
|
|
82
|
+
const detail = (result.stderr || result.stdout || '').trim();
|
|
83
|
+
throw new Error(`claude ${args.join(' ')} failed${detail ? `: ${detail}` : ''}`);
|
|
84
|
+
}
|
|
85
|
+
return result.stdout;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function claudeMcpRow(output, identity) {
|
|
89
|
+
for (const rawLine of output.split(/\r?\n/)) {
|
|
90
|
+
const line = rawLine.trim();
|
|
91
|
+
if (line.slice(0, identity.length) !== identity) continue;
|
|
92
|
+
if (line[identity.length] !== ':') continue;
|
|
93
|
+
return line;
|
|
94
|
+
}
|
|
95
|
+
return '';
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function inspectClaudeHost(ctx = {}) {
|
|
99
|
+
const target = resolvePluginRoot(ctx);
|
|
100
|
+
const manifest = JSON.parse(
|
|
101
|
+
fs.readFileSync(path.join(target, '.claude-plugin', 'plugin.json'), 'utf8'),
|
|
102
|
+
);
|
|
103
|
+
const plugins = JSON.parse(runClaudeCli(['plugin', 'list', '--json'], ctx));
|
|
104
|
+
if (!Array.isArray(plugins)) throw new Error('claude plugin list --json did not return an array');
|
|
105
|
+
const plugin = plugins.find((entry) => entry?.id === `${PLUGIN_NAME}@skills-dir`);
|
|
106
|
+
const pluginOk = !!plugin
|
|
107
|
+
&& plugin.enabled === true
|
|
108
|
+
&& plugin.version === manifest.version
|
|
109
|
+
&& path.resolve(plugin.installPath || '') === path.resolve(target);
|
|
110
|
+
const mcpOutput = pluginOk
|
|
111
|
+
? runClaudeCli(['mcp', 'list'], ctx).replace(/\u001b\[[0-9;]*m/g, '')
|
|
112
|
+
: '';
|
|
113
|
+
const mcpLine = claudeMcpRow(
|
|
114
|
+
mcpOutput,
|
|
115
|
+
`plugin:${PLUGIN_NAME}:${MCP_SERVER_NAME}`,
|
|
116
|
+
);
|
|
117
|
+
const mcpOk = pluginOk
|
|
118
|
+
&& !!plugin.mcpServers?.[MCP_SERVER_NAME]
|
|
119
|
+
&& /\bConnected\b/i.test(mcpLine);
|
|
120
|
+
let detailsOk = false;
|
|
121
|
+
if (pluginOk) {
|
|
122
|
+
runClaudeCli(['plugin', 'details', `${PLUGIN_NAME}@skills-dir`], ctx);
|
|
123
|
+
detailsOk = true;
|
|
124
|
+
}
|
|
125
|
+
return { plugin, pluginOk, mcpOk, mcpOutput, detailsOk };
|
|
126
|
+
}
|
|
127
|
+
|
|
56
128
|
function copySkills(repoRoot, target, names) {
|
|
57
129
|
const copied = [];
|
|
58
130
|
for (const name of names) {
|
|
@@ -245,6 +317,37 @@ function doctor(ctx = {}) {
|
|
|
245
317
|
expectedAdapter: 'claude',
|
|
246
318
|
expectedPackageVersion: source.packageInfo.version,
|
|
247
319
|
});
|
|
320
|
+
if (shouldRunHostCli(ctx)) {
|
|
321
|
+
try {
|
|
322
|
+
const host = inspectClaudeHost(ctx);
|
|
323
|
+
report.checks.host_plugin = {
|
|
324
|
+
status: host.pluginOk && host.detailsOk ? 'pass' : 'fail',
|
|
325
|
+
};
|
|
326
|
+
report.checks.host_mcp = { status: host.mcpOk ? 'pass' : 'fail' };
|
|
327
|
+
if (!host.pluginOk || !host.detailsOk) {
|
|
328
|
+
report.issues.push({
|
|
329
|
+
code: 'HOST_PLUGIN_NOT_DISCOVERED',
|
|
330
|
+
plugin_id: `${PLUGIN_NAME}@skills-dir`,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
if (!host.mcpOk) {
|
|
334
|
+
report.issues.push({
|
|
335
|
+
code: 'HOST_MCP_NOT_DISCOVERED',
|
|
336
|
+
plugin_id: `${PLUGIN_NAME}@skills-dir`,
|
|
337
|
+
server: MCP_SERVER_NAME,
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
} catch (error) {
|
|
341
|
+
report.checks.host_plugin = { status: 'fail' };
|
|
342
|
+
report.checks.host_mcp = { status: 'fail' };
|
|
343
|
+
report.issues.push({
|
|
344
|
+
code: error.code === 'HOST_CLI_TIMEOUT'
|
|
345
|
+
? 'HOST_CLI_TIMEOUT'
|
|
346
|
+
: 'HOST_CLI_INSPECTION_FAILED',
|
|
347
|
+
message: error.message,
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
}
|
|
248
351
|
return applyNativeDoctor(report, path.join(resolvePluginRoot(ctx), 'runtime'));
|
|
249
352
|
}
|
|
250
353
|
|
|
@@ -265,6 +368,7 @@ module.exports = {
|
|
|
265
368
|
SOURCE_TAG,
|
|
266
369
|
MCP_SERVER_NAME,
|
|
267
370
|
buildHooksManifest,
|
|
371
|
+
inspectClaudeHost,
|
|
268
372
|
resolveTarget,
|
|
269
373
|
resolvePluginRoot,
|
|
270
374
|
install,
|