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.
Files changed (46) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +10 -0
  3. package/adapters/claude.js +104 -0
  4. package/adapters/codex.js +363 -40
  5. package/adapters/grok.js +1254 -58
  6. package/adapters/kimi.js +682 -13
  7. package/adapters/opencode.js +132 -11
  8. package/agents/code-reviewer.md +4 -5
  9. package/agents/debugger.md +8 -8
  10. package/docs/AGENT-CONTEXT.md +30 -4
  11. package/docs/ARCHITECTURE.md +24 -5
  12. package/docs/ARTIFACT-AUTHORITY.md +13 -0
  13. package/docs/COMMIT-HASH-BACKFILL.md +25 -18
  14. package/docs/RUNTIME-COMPAT-MATRIX.md +18 -2
  15. package/docs/STATE-DB-ACCESS-POLICY.md +8 -1
  16. package/mcp-server/lib/artifact-registry.cjs +188 -107
  17. package/mcp-server/lib/baseline-workflow.cjs +160 -23
  18. package/mcp-server/lib/change-packet.cjs +4 -32
  19. package/mcp-server/lib/change-workflow.cjs +36 -2755
  20. package/mcp-server/lib/context-envelope.cjs +124 -51
  21. package/mcp-server/lib/decision-records.cjs +164 -78
  22. package/mcp-server/lib/kernel-change-workflow.cjs +2029 -0
  23. package/mcp-server/lib/legacy-change-workflow.cjs +3032 -0
  24. package/mcp-server/lib/managed-file-write.cjs +56 -0
  25. package/mcp-server/lib/prd-parser.cjs +2 -2
  26. package/mcp-server/lib/stage-checkpoints.cjs +163 -9
  27. package/mcp-server/lib/state-db.cjs +186 -8
  28. package/mcp-server/lib/state-ops.cjs +214 -31
  29. package/mcp-server/lib/task-contract.cjs +404 -0
  30. package/mcp-server/lib/task-expander.cjs +8 -3
  31. package/mcp-server/lib/task-ledger.cjs +175 -62
  32. package/mcp-server/lib/ultra-facade.cjs +1895 -172
  33. package/mcp-server/lib/worker-packet.cjs +2 -2
  34. package/mcp-server/server.cjs +24 -5
  35. package/orchestrator/parallel-orchestrator.cjs +114 -27
  36. package/orchestrator/session-runner.cjs +25 -136
  37. package/package.json +1 -1
  38. package/skills/ultra-change/SKILL.md +6 -1
  39. package/skills/ultra-dev/SKILL.md +9 -4
  40. package/skills/ultra-plan/SKILL.md +13 -4
  41. package/skills/ultra-plan/references/semantic-preflight.md +6 -4
  42. package/spec/mcp-tools.yaml +114 -9
  43. package/spec/schemas/context-file.v4.5.schema.json +2 -2
  44. package/spec/schemas/state-db.sql +10 -6
  45. package/spec/schemas/task-ledger.v2.schema.json +23 -8
  46. 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
@@ -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,