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.
- package/CHANGELOG.md +34 -1
- package/README.md +18 -11
- package/adapters/_shared/handbook.cjs +2 -1
- package/commands/ultra-change.md +1 -1
- package/commands/ultra-plan.md +1 -1
- package/commands/ultra-research.md +1 -1
- package/commands/ultra-think.md +2 -2
- package/docs/AGENT-CONTEXT.md +30 -13
- package/docs/ARCHITECTURE.md +24 -4
- package/docs/PLAN.zh-CN.md +3 -2
- package/docs/ROADMAP.md +5 -3
- package/docs/RUNTIME-COMPAT-MATRIX.md +4 -4
- package/docs/STATE-DB-ACCESS-POLICY.md +8 -6
- package/docs/USER-HANDBOOK-CONTRACT.md +8 -2
- package/docs/WORKFLOW-LIFECYCLE.md +89 -13
- package/mcp-server/lib/change-workflow.cjs +52 -4
- package/mcp-server/lib/context-spine.cjs +65 -3
- package/mcp-server/lib/decision-dialogue.cjs +713 -0
- package/mcp-server/lib/doctor.cjs +9 -0
- package/mcp-server/lib/project-breadcrumb.cjs +9 -0
- package/mcp-server/lib/state-db.cjs +29 -6
- package/mcp-server/lib/workflow-state.cjs +13 -0
- package/mcp-server/server.cjs +54 -0
- package/package.json +1 -1
- package/skills/ultra-change/SKILL.md +41 -12
- package/skills/ultra-deliver/SKILL.md +10 -3
- package/skills/ultra-dev/SKILL.md +11 -3
- package/skills/ultra-doctor/SKILL.md +10 -0
- package/skills/ultra-init/SKILL.md +6 -1
- package/skills/ultra-plan/SKILL.md +25 -5
- package/skills/ultra-research/SKILL.md +38 -23
- package/skills/ultra-review/SKILL.md +9 -3
- package/skills/ultra-status/SKILL.md +8 -4
- package/skills/ultra-test/SKILL.md +9 -3
- package/skills/ultra-think/SKILL.md +26 -12
- package/skills/ultra-think/references/decision-dialogue.md +130 -0
- package/spec/cli-protocol.md +11 -2
- package/spec/mcp-tools.yaml +299 -1
- package/spec/schemas/mcp-tools.schema.json +1 -1
- package/spec/schemas/state-db.sql +58 -0
- package/ultra-tools/cli.cjs +1 -1
- 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');
|
package/ultra-tools/cli.cjs
CHANGED
|
@@ -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|
|
|
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
|
);
|