ultra-builder-pro-cli 0.15.0 → 0.16.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 (42) hide show
  1. package/CHANGELOG.md +34 -1
  2. package/README.md +18 -11
  3. package/adapters/_shared/handbook.cjs +2 -1
  4. package/commands/ultra-change.md +1 -1
  5. package/commands/ultra-plan.md +1 -1
  6. package/commands/ultra-research.md +1 -1
  7. package/commands/ultra-think.md +2 -2
  8. package/docs/AGENT-CONTEXT.md +30 -13
  9. package/docs/ARCHITECTURE.md +24 -4
  10. package/docs/PLAN.zh-CN.md +3 -2
  11. package/docs/ROADMAP.md +5 -3
  12. package/docs/RUNTIME-COMPAT-MATRIX.md +4 -4
  13. package/docs/STATE-DB-ACCESS-POLICY.md +8 -6
  14. package/docs/USER-HANDBOOK-CONTRACT.md +8 -2
  15. package/docs/WORKFLOW-LIFECYCLE.md +89 -13
  16. package/mcp-server/lib/change-workflow.cjs +52 -4
  17. package/mcp-server/lib/context-spine.cjs +65 -3
  18. package/mcp-server/lib/decision-dialogue.cjs +713 -0
  19. package/mcp-server/lib/doctor.cjs +9 -0
  20. package/mcp-server/lib/project-breadcrumb.cjs +9 -0
  21. package/mcp-server/lib/state-db.cjs +29 -6
  22. package/mcp-server/lib/workflow-state.cjs +13 -0
  23. package/mcp-server/server.cjs +54 -0
  24. package/package.json +1 -1
  25. package/skills/ultra-change/SKILL.md +41 -12
  26. package/skills/ultra-deliver/SKILL.md +10 -3
  27. package/skills/ultra-dev/SKILL.md +11 -3
  28. package/skills/ultra-doctor/SKILL.md +10 -0
  29. package/skills/ultra-init/SKILL.md +6 -1
  30. package/skills/ultra-plan/SKILL.md +25 -5
  31. package/skills/ultra-research/SKILL.md +38 -23
  32. package/skills/ultra-review/SKILL.md +9 -3
  33. package/skills/ultra-status/SKILL.md +8 -4
  34. package/skills/ultra-test/SKILL.md +9 -3
  35. package/skills/ultra-think/SKILL.md +26 -12
  36. package/skills/ultra-think/references/decision-dialogue.md +130 -0
  37. package/spec/cli-protocol.md +11 -2
  38. package/spec/mcp-tools.yaml +299 -1
  39. package/spec/schemas/mcp-tools.schema.json +1 -1
  40. package/spec/schemas/state-db.sql +58 -0
  41. package/ultra-tools/cli.cjs +1 -1
  42. package/ultra-tools/commands/status.cjs +15 -0
@@ -60,7 +60,7 @@
60
60
  },
61
61
  "family": {
62
62
  "type": "string",
63
- "enum": ["task", "memory", "review", "impact", "skill", "session", "ask", "plan", "baseline", "change", "workflow", "system"]
63
+ "enum": ["task", "memory", "review", "impact", "skill", "session", "ask", "plan", "baseline", "change", "decision", "workflow", "system"]
64
64
  },
65
65
  "description": { "type": "string", "minLength": 10 },
66
66
  "phase": {
@@ -67,6 +67,7 @@ CREATE TABLE IF NOT EXISTS changes (
67
67
  contract_json TEXT NOT NULL DEFAULT '{}',
68
68
  classification_json TEXT NOT NULL DEFAULT '{}',
69
69
  research_disposition_json TEXT NOT NULL DEFAULT '{}',
70
+ alignment_thread_id TEXT REFERENCES decision_threads(id) ON DELETE SET NULL,
70
71
  base_commit TEXT,
71
72
  artifact_root TEXT NOT NULL,
72
73
  created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
@@ -403,6 +404,61 @@ CREATE UNIQUE INDEX IF NOT EXISTS workflow_steps_position
403
404
  CREATE INDEX IF NOT EXISTS workflow_steps_status
404
405
  ON workflow_steps(run_id, status, position);
405
406
 
407
+ -- ──────────────────────────── decision dialogue ─────────────────────────
408
+ -- The host owns reasoning and normalized decision content. MCP owns one-at-a-
409
+ -- time presentation, durable authority, checkpoints, and recovery. Raw prompts
410
+ -- and transcripts never belong in these tables.
411
+ CREATE TABLE IF NOT EXISTS decision_threads (
412
+ id TEXT PRIMARY KEY,
413
+ purpose TEXT NOT NULL,
414
+ mode TEXT NOT NULL DEFAULT 'guided'
415
+ CHECK (mode IN ('guided', 'fast', 'autonomous', 'diagnostic')),
416
+ status TEXT NOT NULL DEFAULT 'active'
417
+ CHECK (status IN ('active', 'checkpoint_ready', 'confirmed', 'cancelled')),
418
+ baseline_id TEXT REFERENCES baselines(id) ON DELETE SET NULL,
419
+ change_id TEXT REFERENCES changes(id) ON DELETE CASCADE,
420
+ workflow_run_id TEXT REFERENCES workflow_runs(id) ON DELETE CASCADE,
421
+ summary_json TEXT NOT NULL DEFAULT '{}',
422
+ checkpoint_json TEXT NOT NULL DEFAULT '{}',
423
+ started_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
424
+ updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
425
+ confirmed_at TEXT,
426
+ CHECK (baseline_id IS NOT NULL OR change_id IS NOT NULL OR workflow_run_id IS NOT NULL)
427
+ );
428
+
429
+ CREATE INDEX IF NOT EXISTS decision_threads_status
430
+ ON decision_threads(status, updated_at);
431
+ CREATE INDEX IF NOT EXISTS decision_threads_authority
432
+ ON decision_threads(baseline_id, change_id, workflow_run_id, status);
433
+
434
+ CREATE TABLE IF NOT EXISTS decision_items (
435
+ id TEXT PRIMARY KEY,
436
+ thread_id TEXT NOT NULL REFERENCES decision_threads(id) ON DELETE CASCADE,
437
+ sequence INTEGER NOT NULL CHECK (sequence > 0),
438
+ phase TEXT NOT NULL,
439
+ question TEXT NOT NULL,
440
+ why_now TEXT NOT NULL,
441
+ recommendation TEXT NOT NULL,
442
+ options_json TEXT NOT NULL DEFAULT '[]',
443
+ evidence_refs_json TEXT NOT NULL DEFAULT '[]',
444
+ dependency_ids_json TEXT NOT NULL DEFAULT '[]',
445
+ effects_json TEXT NOT NULL DEFAULT '{}',
446
+ blocking INTEGER NOT NULL DEFAULT 1 CHECK (blocking IN (0, 1)),
447
+ status TEXT NOT NULL DEFAULT 'open'
448
+ CHECK (status IN ('open', 'answered', 'delegated', 'deferred', 'superseded')),
449
+ resolution_json TEXT NOT NULL DEFAULT '{}',
450
+ supersedes_id TEXT REFERENCES decision_items(id) ON DELETE SET NULL,
451
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
452
+ updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
453
+ resolved_at TEXT,
454
+ UNIQUE (thread_id, sequence)
455
+ );
456
+
457
+ CREATE UNIQUE INDEX IF NOT EXISTS decision_items_one_open
458
+ ON decision_items(thread_id) WHERE status = 'open';
459
+ CREATE INDEX IF NOT EXISTS decision_items_status
460
+ ON decision_items(thread_id, status, sequence);
461
+
406
462
  -- ──────────────────────────── seed: schema_version ────────────────────────
407
463
  INSERT OR IGNORE INTO schema_version (version, description)
408
464
  VALUES ('4.5', 'Phase 2 initial — tasks/events/sessions/schema_version/migration_history/telemetry/specs_refs');
@@ -428,3 +484,5 @@ INSERT OR IGNORE INTO schema_version (version, description)
428
484
  VALUES ('14.0', 'Continuously revalidated baseline authority and persisted known-red acceptance');
429
485
  INSERT OR IGNORE INTO schema_version (version, description)
430
486
  VALUES ('15.0', 'Typed research semantics, complete change contracts, verified learning application, and reconciliation provenance');
487
+ INSERT OR IGNORE INTO schema_version (version, description)
488
+ VALUES ('16.0', 'Durable one-question decision dialogue, owner checkpoints, and workflow alignment gates');
@@ -38,7 +38,7 @@ SUBCOMMANDS:
38
38
  system doctor [--repair] | restore | rebaseline
39
39
  status [--cost] [--since <duration>] [--json]
40
40
  db init | checkpoint | vacuum | integrity | backup (Phase 2)
41
- migrate --from=<4.4|4.5> --to=<4.5|15.0> [--dry|--rollback]
41
+ migrate --from=<4.4|4.5> --to=<4.5|16.0> [--dry|--rollback]
42
42
  legacy-memory inspect | archive | prune --confirm DELETE_ULTRA_LEGACY_MEMORY
43
43
 
44
44
  --help / -h show this message
@@ -12,6 +12,7 @@ const path = require('node:path');
12
12
  const ops = require('../../mcp-server/lib/state-ops.cjs');
13
13
  const baselines = require('../../mcp-server/lib/baseline-workflow.cjs');
14
14
  const workflowState = require('../../mcp-server/lib/workflow-state.cjs');
15
+ const decisionDialogue = require('../../mcp-server/lib/decision-dialogue.cjs');
15
16
  const { readBreadcrumb } = require('../../mcp-server/lib/context-spine.cjs');
16
17
 
17
18
  const USAGE = `ultra-tools status [flags]
@@ -167,6 +168,12 @@ function buildStatusPanel(db, { since = null, limit = 3, rootDir = process.cwd()
167
168
  };
168
169
  }
169
170
  if (!Array.isArray(workflows.current)) workflows.current = [];
171
+ const decisions = tables.has('decision_threads') && tables.has('decision_items')
172
+ ? decisionDialogue.inspectDecisionHealth(db, { rootDir })
173
+ : {
174
+ status: 'unavailable', active: 0, awaiting_owner: 0, checkpoint_ready: 0,
175
+ deferred_blocking: 0, stale_artifacts: [], current: null, current_thread_id: null,
176
+ };
170
177
  let next;
171
178
  let breadcrumb = null;
172
179
  try {
@@ -242,6 +249,7 @@ function buildStatusPanel(db, { since = null, limit = 3, rootDir = process.cwd()
242
249
  period: { since: since || 'all-time' },
243
250
  baseline,
244
251
  workflows,
252
+ decisions,
245
253
  current_change: currentChange,
246
254
  current_task: currentTask,
247
255
  evidence,
@@ -287,6 +295,13 @@ function renderHuman(panel) {
287
295
  `Workflow: ${current.id} (${current.kind}/${current.status}) · step=${current.current_step || 'finalize'} · outputs=${current.output_health}`,
288
296
  );
289
297
  }
298
+ if (panel.decisions.current) {
299
+ lines.push(
300
+ `Decision: ${panel.decisions.current.id} (${panel.decisions.current.phase}) — ${panel.decisions.current.question}`,
301
+ );
302
+ } else if (panel.decisions.checkpoint_ready > 0) {
303
+ lines.push(`Decision checkpoint: ${panel.decisions.current_thread_id} awaits confirmation`);
304
+ }
290
305
  lines.push(
291
306
  `Changes: active=${panel.changes.active} blocked=${panel.changes.blocked} ready=${panel.changes.ready} archived=${panel.changes.archived}`,
292
307
  );