ultra-builder-pro-cli 0.5.3 → 0.7.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 (91) hide show
  1. package/.ultra-template/changes/active/.gitkeep +1 -0
  2. package/.ultra-template/changes/archive/.gitkeep +1 -0
  3. package/CHANGELOG.md +90 -14
  4. package/README.md +38 -32
  5. package/adapters/_shared/codex-assets.cjs +32 -151
  6. package/adapters/_shared/frontmatter.cjs +2 -2
  7. package/adapters/_shared/handbook.cjs +10 -10
  8. package/adapters/_shared/path-rewrite.cjs +0 -3
  9. package/adapters/_shared/runtime-assets.cjs +13 -4
  10. package/adapters/_shared/tests/handbook.test.cjs +4 -1
  11. package/adapters/_shared/tests/path-rewrite.test.cjs +1 -3
  12. package/adapters/_shared/tests/resolve-target.test.cjs +1 -11
  13. package/adapters/_shared/tests/runtime-assets.test.cjs +7 -6
  14. package/adapters/opencode.js +82 -26
  15. package/adapters/tests/claude.test.cjs +1 -4
  16. package/adapters/tests/codex.test.cjs +9 -8
  17. package/adapters/tests/opencode.test.cjs +17 -11
  18. package/bin/install.js +6 -28
  19. package/bin/orchestrator.js +12 -30
  20. package/commands/ultra-change.md +47 -0
  21. package/commands/ultra-deliver.md +14 -7
  22. package/commands/ultra-dev.md +6 -3
  23. package/commands/ultra-doctor.md +36 -0
  24. package/commands/ultra-init.md +4 -3
  25. package/commands/ultra-status.md +7 -5
  26. package/commands/ultra-test.md +2 -1
  27. package/docs/AGENT-CONTEXT.md +35 -28
  28. package/docs/ARCHITECTURE.md +49 -21
  29. package/docs/PLAN.zh-CN.md +67 -68
  30. package/docs/ROADMAP.md +17 -17
  31. package/docs/RUNTIME-COMPAT-MATRIX.md +63 -62
  32. package/hooks/README.md +8 -7
  33. package/hooks/active_task_context.py +22 -15
  34. package/hooks/health_check.py +136 -38
  35. package/hooks/workflow_context.py +120 -30
  36. package/mcp-server/lib/change-workflow.cjs +556 -0
  37. package/mcp-server/lib/change-workflow.test.cjs +259 -0
  38. package/mcp-server/lib/doctor.cjs +112 -0
  39. package/mcp-server/lib/doctor.test.cjs +86 -0
  40. package/mcp-server/lib/init-project.cjs +32 -6
  41. package/mcp-server/lib/pricing.cjs +0 -6
  42. package/mcp-server/lib/runtime-state.cjs +222 -0
  43. package/mcp-server/lib/runtime-state.test.cjs +92 -0
  44. package/mcp-server/lib/state-db.cjs +31 -8
  45. package/mcp-server/lib/state-ops.cjs +24 -3
  46. package/mcp-server/lib/telemetry.cjs +4 -0
  47. package/mcp-server/server.cjs +102 -10
  48. package/mcp-server/tests/db-ops.test.cjs +5 -1
  49. package/mcp-server/tests/init-project.test.cjs +45 -0
  50. package/mcp-server/tests/server-contract.test.cjs +140 -1
  51. package/mcp-server/tests/state-db.test.cjs +44 -7
  52. package/mcp-server/tests/state-ops.test.cjs +42 -0
  53. package/mcp-server/tests/telemetry.test.cjs +14 -0
  54. package/orchestrator/daemon.cjs +39 -0
  55. package/orchestrator/dispatch-rules.cjs +15 -4
  56. package/orchestrator/tests/daemon.test.cjs +63 -12
  57. package/orchestrator/tests/dispatch-rules.test.cjs +12 -10
  58. package/package.json +5 -7
  59. package/settings.json +1 -2
  60. package/skills/ultra-change/SKILL.md +140 -0
  61. package/skills/ultra-deliver/SKILL.md +81 -15
  62. package/skills/ultra-dev/SKILL.md +32 -12
  63. package/skills/ultra-doctor/SKILL.md +90 -0
  64. package/skills/ultra-init/SKILL.md +8 -6
  65. package/skills/ultra-review/SKILL.md +16 -0
  66. package/skills/ultra-status/SKILL.md +30 -7
  67. package/skills/ultra-test/SKILL.md +14 -2
  68. package/skills/ultra-verify/SKILL.md +22 -41
  69. package/skills/ultra-verify/evals/evals.json +22 -24
  70. package/skills/ultra-verify/references/confidence-system.md +15 -32
  71. package/skills/ultra-verify/references/cross-verify-modes.md +14 -59
  72. package/skills/ultra-verify/scripts/verify_wait.py +44 -81
  73. package/spec/cli-protocol.md +12 -1
  74. package/spec/mcp-tools.yaml +340 -4
  75. package/spec/schemas/mcp-tools.schema.json +1 -1
  76. package/spec/schemas/skill-manifest.schema.json +2 -2
  77. package/spec/schemas/state-db.sql +119 -2
  78. package/ultra-tools/cli.cjs +3 -0
  79. package/ultra-tools/commands/system.cjs +57 -0
  80. package/ultra-tools/system-command.test.cjs +53 -0
  81. package/adapters/_shared/md-to-toml.cjs +0 -54
  82. package/adapters/_shared/rtk-detect.cjs +0 -86
  83. package/adapters/_shared/tests/md-to-toml.test.cjs +0 -48
  84. package/adapters/_shared/tests/rtk-detect.test.cjs +0 -116
  85. package/adapters/gemini.js +0 -204
  86. package/adapters/tests/gemini.test.cjs +0 -112
  87. package/docs/LEGACY-HERMES.md +0 -1175
  88. package/orchestrator/code-graph-watcher.cjs +0 -121
  89. package/orchestrator/tests/code-graph-watcher.test.cjs +0 -183
  90. package/skills/gemini-collab/SKILL.md +0 -51
  91. package/skills/gemini-collab/evals/evals.json +0 -42
package/bin/install.js CHANGED
@@ -4,20 +4,19 @@
4
4
  * ultra-builder-pro-cli — multi-runtime installer.
5
5
  *
6
6
  * Distributes Ultra Builder Pro assets — commands, agents, skills, hooks,
7
- * MCP server — to Claude Code, OpenCode, Codex CLI, and Gemini CLI via
7
+ * MCP server — to Claude Code, OpenCode, and Codex CLI via
8
8
  * runtime-specific adapters under adapters/. Install is idempotent and
9
9
  * uses atomic writes; uninstall reverses via sentinel/manifest blocks.
10
10
  *
11
11
  * Usage:
12
12
  * npx ultra-builder-pro-cli [options]
13
13
  *
14
- * --claude / --opencode / --codex / --gemini select runtime(s)
14
+ * --claude / --opencode / --codex select runtime(s)
15
15
  * --all install to all supported runtimes
16
16
  * -g, --global install to runtime's global config dir
17
17
  * -l, --local install into current working directory
18
18
  * -u, --uninstall remove installed assets
19
19
  * -c, --config-dir <path> override config directory
20
- * --skip-rtk do not detect / install RTK hook
21
20
  * -h, --help show help
22
21
  */
23
22
 
@@ -29,8 +28,7 @@ const os = require('node:os');
29
28
 
30
29
  const pkg = require('../package.json');
31
30
  const { validateConfigDir } = require('../adapters/_shared/validate.cjs');
32
-
33
- const SUPPORTED_RUNTIMES = ['claude', 'opencode', 'codex', 'gemini'];
31
+ const { SUPPORTED_RUNTIMES } = require('../adapters/_shared/runtime-assets.cjs');
34
32
 
35
33
  const COLORS = {
36
34
  reset: '\x1b[0m',
@@ -58,7 +56,7 @@ function printBanner() {
58
56
  paint('cyan', ' ╚═════╝ ╚═════╝ ╚═╝ ╚═════╝╚══════╝╚═╝'),
59
57
  '',
60
58
  ` ${paint('bold', 'Ultra Builder Pro CLI')} ${paint('dim', 'v' + pkg.version)}`,
61
- ` ${paint('dim', 'Multi-runtime installer for Claude Code, OpenCode, Codex, Gemini')}`,
59
+ ` ${paint('dim', 'Multi-runtime installer for Claude Code, OpenCode, and Codex')}`,
62
60
  '',
63
61
  ];
64
62
  console.log(banner.join('\n'));
@@ -71,7 +69,6 @@ function printHelp() {
71
69
  ${paint('cyan', '--claude')} Claude Code
72
70
  ${paint('cyan', '--opencode')} OpenCode
73
71
  ${paint('cyan', '--codex')} Codex CLI (OpenAI)
74
- ${paint('cyan', '--gemini')} Gemini CLI (Google)
75
72
  ${paint('cyan', '--all')} all supported runtimes
76
73
 
77
74
  ${paint('yellow', 'Scope:')}
@@ -81,7 +78,6 @@ function printHelp() {
81
78
  ${paint('yellow', 'Other:')}
82
79
  ${paint('cyan', '-u, --uninstall')} remove installed assets
83
80
  ${paint('cyan', '-c, --config-dir')} override runtime's config directory (string path)
84
- ${paint('cyan', '--skip-rtk')} skip RTK hook registration (RTK is a soft dependency)
85
81
  ${paint('cyan', '-h, --help')} show this help
86
82
  ${paint('cyan', '-v, --version')} show CLI version
87
83
 
@@ -89,7 +85,7 @@ function printHelp() {
89
85
  ${paint('dim', '# Install to Claude Code globally')}
90
86
  npx ultra-builder-pro-cli --claude --global
91
87
 
92
- ${paint('dim', '# Install to all 4 runtimes locally in this repo')}
88
+ ${paint('dim', '# Install to all supported runtimes locally in this repo')}
93
89
  npx ultra-builder-pro-cli --all --local
94
90
 
95
91
  ${paint('dim', '# Uninstall from OpenCode')}
@@ -107,7 +103,6 @@ function parseArgs(argv) {
107
103
  help: false,
108
104
  version: false,
109
105
  configDir: null,
110
- skipRtk: false,
111
106
  };
112
107
 
113
108
  for (let i = 0; i < args.length; i++) {
@@ -116,7 +111,6 @@ function parseArgs(argv) {
116
111
  case '--claude': runtimes.add('claude'); break;
117
112
  case '--opencode': runtimes.add('opencode'); break;
118
113
  case '--codex': runtimes.add('codex'); break;
119
- case '--gemini': runtimes.add('gemini'); break;
120
114
  case '--all':
121
115
  SUPPORTED_RUNTIMES.forEach(r => runtimes.add(r));
122
116
  break;
@@ -125,7 +119,6 @@ function parseArgs(argv) {
125
119
  case '-u': case '--uninstall': flags.uninstall = true; break;
126
120
  case '-h': case '--help': flags.help = true; break;
127
121
  case '-v': case '--version': flags.version = true; break;
128
- case '--skip-rtk': flags.skipRtk = true; break;
129
122
  case '-c': case '--config-dir':
130
123
  flags.configDir = args[++i];
131
124
  if (!flags.configDir || flags.configDir.startsWith('-')) {
@@ -193,7 +186,7 @@ async function main() {
193
186
  }
194
187
 
195
188
  if (runtimes.length === 0) {
196
- bail('no runtime selected; use --claude / --opencode / --codex / --gemini / --all');
189
+ bail('no runtime selected; use --claude / --opencode / --codex / --all');
197
190
  }
198
191
 
199
192
  const scope = resolveScope(flags);
@@ -229,21 +222,6 @@ async function main() {
229
222
  process.exit(1);
230
223
  }
231
224
 
232
- // Phase 6.1 — RTK hook (soft dependency; install continues on absence).
233
- if (mode === 'install') {
234
- const rtk = require('../adapters/_shared/rtk-detect.cjs');
235
- const result = rtk.installHook({ skip: flags.skipRtk, scope });
236
- if (result.skipped) {
237
- console.log(` ${paint('dim', '⤼ rtk skipped (--skip-rtk)')}`);
238
- } else if (result.available && result.initialized) {
239
- console.log(` ${paint('green', '✓')} rtk hook registered (${result.version})`);
240
- } else if (result.available && !result.initialized) {
241
- console.log(` ${paint('yellow', '!')} rtk present but init failed: ${result.init_error}`);
242
- } else {
243
- console.log(` ${paint('dim', '⤼ ' + result.hint.replace(/\n/g, '\n '))}`);
244
- }
245
- }
246
-
247
225
  console.log(` ${paint('green', 'Done.')}`);
248
226
  }
249
227
 
@@ -22,6 +22,7 @@
22
22
  const fs = require('node:fs');
23
23
  const path = require('node:path');
24
24
  const { spawn } = require('node:child_process');
25
+ const { isSupportedRuntime } = require('../adapters/_shared/runtime-assets.cjs');
25
26
 
26
27
  const REPO_ROOT = process.env.UBP_REPO_ROOT || process.cwd();
27
28
  const PIDFILE = path.join(REPO_ROOT, '.ultra', 'orchestrator.pid');
@@ -46,8 +47,13 @@ function optInAllowed(settings) {
46
47
  }
47
48
 
48
49
  function parseRuntimes() {
49
- const raw = process.env.UBP_ORCH_RUNTIMES || 'claude,opencode,codex,gemini';
50
- return raw.split(',').map((s) => s.trim()).filter(Boolean);
50
+ const raw = process.env.UBP_ORCH_RUNTIMES || 'claude,opencode,codex';
51
+ const runtimes = [...new Set(raw.split(',').map((s) => s.trim()).filter(Boolean))];
52
+ const invalid = runtimes.filter((runtime) => !isSupportedRuntime(runtime));
53
+ if (invalid.length > 0) {
54
+ throw new Error(`unsupported orchestrator runtime(s): ${invalid.join(', ')}`);
55
+ }
56
+ return runtimes;
51
57
  }
52
58
 
53
59
  function cmdRun(opts = {}) {
@@ -61,48 +67,25 @@ function cmdRun(opts = {}) {
61
67
  }
62
68
  const { initStateDb } = require('../mcp-server/lib/state-db.cjs');
63
69
  const { runDaemon } = require('../orchestrator/daemon.cjs');
70
+ const runtimes = parseRuntimes();
64
71
  const { db } = initStateDb(path.join(REPO_ROOT, '.ultra', 'state.db'));
65
72
  const handle = runDaemon({
66
73
  db,
67
74
  repoRoot: REPO_ROOT,
68
- runtimes: parseRuntimes(),
75
+ runtimes,
69
76
  pollMs: Number(process.env.UBP_ORCH_POLL_MS || 1000),
70
77
  onError: (err) => process.stderr.write(`orchestrator error: ${err.message}\n`),
71
78
  });
72
79
 
73
- // Phase 6.4 — optional code-graph watcher (opt-in via settings or CLI).
74
- const watcherEnabled =
75
- opts.withGraphWatcher === true ||
76
- !!(settings && settings.orchestrator && settings.orchestrator.graph_watcher === true);
77
- let watcherHandle = null;
78
- if (watcherEnabled) {
79
- try {
80
- const { startWatcher } = require('../orchestrator/code-graph-watcher.cjs');
81
- const jsonlPath = path.join(REPO_ROOT, '.ultra', 'code-graph-events.jsonl');
82
- fs.mkdirSync(path.dirname(jsonlPath), { recursive: true });
83
- watcherHandle = startWatcher({
84
- repoRoot: REPO_ROOT,
85
- onBatch: (batch) => {
86
- try { fs.appendFileSync(jsonlPath, JSON.stringify(batch) + '\n'); }
87
- catch (err) { process.stderr.write(`graph-watcher write error: ${err.message}\n`); }
88
- },
89
- });
90
- process.stderr.write(`orchestrator: graph-watcher enabled → ${jsonlPath}\n`);
91
- } catch (err) {
92
- process.stderr.write(`orchestrator: graph-watcher disabled (${err.message})\n`);
93
- }
94
- }
95
-
96
80
  const shutdown = (signal) => {
97
81
  process.stderr.write(`orchestrator received ${signal}, stopping\n`);
98
82
  handle.stop();
99
- if (watcherHandle) watcherHandle.stop();
100
83
  try { db.close(); } catch (_) { /* ignore */ }
101
84
  process.exit(0);
102
85
  };
103
86
  process.on('SIGTERM', () => shutdown('SIGTERM'));
104
87
  process.on('SIGINT', () => shutdown('SIGINT'));
105
- process.stderr.write(`orchestrator running (pollMs=${Number(process.env.UBP_ORCH_POLL_MS || 1000)}, runtimes=${parseRuntimes().join(',')})\n`);
88
+ process.stderr.write(`orchestrator running (pollMs=${Number(process.env.UBP_ORCH_POLL_MS || 1000)}, runtimes=${runtimes.join(',')})\n`);
106
89
  // Keep process alive while the setInterval is unref'd.
107
90
  setInterval(() => {}, 60000);
108
91
  }
@@ -198,9 +181,8 @@ function usage() {
198
181
 
199
182
  const argv = process.argv.slice(2);
200
183
  const subcommand = argv[0];
201
- const runOpts = { withGraphWatcher: argv.includes('--with-graph-watcher') };
202
184
  switch (subcommand) {
203
- case 'run': cmdRun(runOpts); break;
185
+ case 'run': cmdRun(); break;
204
186
  case 'start': cmdStart(); break;
205
187
  case 'stop': cmdStop(); break;
206
188
  case 'status': cmdStatus(); break;
@@ -0,0 +1,47 @@
1
+ ---
2
+ description: Start or resume a continuous post-delivery change with bounded context, documentation impact, and linked authoritative tasks
3
+ argument-hint: "[change-id or title] [quick|standard|major|incident]"
4
+ allowed-tools: Read, Write, Edit, Bash, Grep, Glob, AskUserQuestion
5
+ model: opus
6
+ workflow-ref: "@skills/ultra-change/SKILL.md"
7
+ mcp_tools_required:
8
+ - change.create
9
+ - change.update
10
+ - change.get
11
+ - change.list
12
+ - change.context
13
+ - task.create
14
+ - task.list
15
+ ---
16
+
17
+ # /ultra-change
18
+
19
+ ## 目标
20
+
21
+ 把初始交付后的日常修复、功能、重构或事故变成一个持续可追踪的 change,避免
22
+ 代码、spec、测试证据和项目上下文逐步漂移。
23
+
24
+ ## Workflow
25
+
26
+ 完整流程见 `@skills/ultra-change/SKILL.md`:
27
+
28
+ 1. 先查 active/blocked change,匹配则恢复,避免重复创建。
29
+ 2. 按 `quick / standard / major / incident` 分类并声明 docs impact。
30
+ 3. 调 `change.create`,为 change 创建至少一个带 `change_id` 的 task。
31
+ 4. standard/major 写 delta + plan;调 `change.context` 编译最小上下文。
32
+ 5. 路由到 `/ultra-dev`、`/ultra-test`、`/ultra-review`、`/ultra-deliver`。
33
+
34
+ Memory 与代码图谱只允许以外部 provider 元数据引用出现;本命令不保存 provider
35
+ 正文,也不自动刷新外部 provider。
36
+
37
+ ## 用法
38
+
39
+ ```bash
40
+ /ultra-change auth-timeout quick
41
+ /ultra-change billing-redesign major
42
+ /ultra-change incident-2026-07-17 incident
43
+ ```
44
+
45
+ ## 下一步
46
+
47
+ 输出会给出 change id、artifact root、linked task 与准确的下一个 Ultra workflow。
@@ -1,18 +1,24 @@
1
1
  ---
2
- description: Release preparation — docs + build + version bump + tag + push, gated by /ultra-test pass
2
+ description: Converge and deliver a verified baseline or continuous change — reconcile specs, archive evidence, version, tag, and push
3
3
  argument-hint: "[version-type]"
4
4
  allowed-tools: Task, Read, Write, Edit, Bash, Grep, Glob, AskUserQuestion
5
5
  model: opus
6
6
  workflow-ref: "@skills/ultra-deliver/SKILL.md"
7
7
  cli_fallback: "direct user interaction"
8
+ mcp_tools_required:
9
+ - change.list
10
+ - change.get
11
+ - change.context
12
+ - change.converge
13
+ - change.archive
8
14
  ---
9
15
 
10
16
  # /ultra-deliver
11
17
 
12
18
  ## 目标
13
19
 
14
- `/ultra-test` 绿灯后做发布准备:更新 CHANGELOG + technical-debt + README →
15
- production build → 版本号 + git tag + push。写 `.ultra/delivery-report.json`。
20
+ `/ultra-test` 绿灯后,把 active delta 合并回 baseline,重跑发布证据,调用
21
+ `change.converge` 与 `change.archive`,再完成版本号、tag、push 和 delivery report。
16
22
 
17
23
  ## 参数
18
24
 
@@ -22,14 +28,15 @@ production build → 版本号 + git tag + push。写 `.ultra/delivery-report.js
22
28
 
23
29
  ## Workflow
24
30
 
25
- 完整 5 步见 `@skills/ultra-deliver/SKILL.md`(validations → 文档 → build → 版本发布 → 产物报告)。
31
+ 完整流程见 `@skills/ultra-deliver/SKILL.md`(绑定 change → baseline reconciliation →
32
+ build/test → release commit → context/convergence/archive → tag/push → report)。
26
33
 
27
34
  **命令入口做的事**:
28
35
  1. 读 `.ultra/test-report.json` 验 `passed=true` + `git_commit === HEAD`
29
36
  2. `git status` 清洁检查;不干净 → 通过 Host 原生提问界面选处理方式
30
- 3. 驱动 skill 跑文档 + build + 版本 + tag + push
31
- 4. 写 `.ultra/delivery-report.json`
32
- 5. 输出 release summary
37
+ 3. 有 active change 时合并 delta、刷新 context,并通过确定性 convergence gate
38
+ 4. archive 完成后才允许 tag/push
39
+ 5. 写带 change id、archive path、baseline updates 的 delivery report
33
40
 
34
41
  ## 用法
35
42
 
@@ -8,6 +8,8 @@ mcp_tools_required:
8
8
  - task.update
9
9
  - task.get
10
10
  - task.list
11
+ - change.get
12
+ - change.context
11
13
  ---
12
14
 
13
15
  # /ultra-dev
@@ -34,9 +36,10 @@ v4.4→v4.5 迁移,绝不从 `tasks.json` 回退或直接改投影。
34
36
  **命令入口做的事**:
35
37
  1. 读 `.ultra/workflow-state.json` 决定新跑 vs resume
36
38
  2. 首跑通过 Host 原生提问触发 Design Approval Gate
37
- 3. 驱动 skill 走 TDD + review 循环;状态仅通过 MCP `task.update`(双写消除)
38
- 4. Step 4.5 review 通过 `/ultra-review` 和 Host 原生 subagent 执行
39
- 5. Step 4.4 pre-review checkpoint 写入 workflow-state.json,不依赖 `/compact`
39
+ 3. 驱动 skill 走 TDD + review 循环;状态仅通过 MCP `task.update`
40
+ 4. task 有 `change_id` 时把需求变化写进 active delta,并用 `change.context` 刷新上下文
41
+ 5. Step 4.5 review 通过 `/ultra-review` 和 Host 原生 subagent 执行
42
+ 6. Step 4.4 pre-review checkpoint 写入 workflow-state.json,不依赖 `/compact`
40
43
 
41
44
  ## 用法
42
45
 
@@ -0,0 +1,36 @@
1
+ ---
2
+ description: Inspect Ultra runtime health and optionally run explicit backup-first mechanical recovery
3
+ argument-hint: "[--repair]"
4
+ allowed-tools: Read, Bash
5
+ model: opus
6
+ workflow-ref: "@skills/ultra-doctor/SKILL.md"
7
+ mcp_tools_required:
8
+ - system.doctor
9
+ cli_fallback: "system doctor"
10
+ ---
11
+
12
+ # /ultra-doctor
13
+
14
+ ## 目标
15
+
16
+ 诊断 state.db、projection、incident、session 和 active change artifact 的健康状态。
17
+ 默认只读;只有显式传入 `--repair` 才允许备份后执行机械恢复。
18
+
19
+ ## Workflow
20
+
21
+ 完整契约见 `@skills/ultra-doctor/SKILL.md`。
22
+
23
+ 1. 默认调用 `system.doctor {"repair": false}`。
24
+ 2. 只报告失败检查、incident、游标落后和归属边界。
25
+ 3. `--repair` 时必须先生成 state.db 备份,再恢复 orphan、消费 staleness event、
26
+ 重排超时中断或失败的 projection 并重新投影。
27
+ 4. 修复后重新读取报告;仍 degraded 就明确剩余阻塞,不宣称完成。
28
+
29
+ ## 用法
30
+
31
+ ```bash
32
+ /ultra-doctor
33
+ /ultra-doctor --repair
34
+ ```
35
+
36
+ Memory 和代码图谱属于外部 provider,本命令既不收集也不修复它们。
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Initialize Ultra Builder Pro project — scaffold .ultra/, seed tasks.json, optional git
2
+ description: Initialize Ultra Builder Pro project — scaffold .ultra/, initialize state.db and continuous-change directories, optional git
3
3
  argument-hint: <name> <type> <stack> [git]
4
4
  allowed-tools: Read, Write, Bash, Grep, Glob, AskUserQuestion
5
5
  model: opus
@@ -13,8 +13,9 @@ cli_fallback: "task init-project"
13
13
 
14
14
  ## 目标
15
15
 
16
- 搭 `.ultra/` 骨架(specs + tasks + docs + reports);写入带元数据的 `tasks.json`;
17
- 按需初始化 git。4 个 runtime 行为一致,不依赖 Claude 独占工具。
16
+ 搭 `.ultra/` 骨架(specs + tasks + changes + docs + reports),初始化权威
17
+ `state.db`,写入带元数据的初始 `tasks.json`,并按需初始化 git。Claude Code、
18
+ OpenCode、Codex 三个 runtime 行为一致。
18
19
 
19
20
  ## 参数
20
21
 
@@ -7,6 +7,8 @@ workflow-ref: "@skills/ultra-status/SKILL.md"
7
7
  mcp_tools_required:
8
8
  - task.list
9
9
  - task.get
10
+ - change.list
11
+ - system.doctor
10
12
  ---
11
13
 
12
14
  # /ultra-status
@@ -14,7 +16,7 @@ mcp_tools_required:
14
16
  ## 目标
15
17
 
16
18
  一次调用拿整个项目近况:任务进度(来自 state.db `task.list`)+ 测试状态(`test-report.json`)+
17
- 发布状态(`delivery-report.json`)+ 风险检测 + 下一步命令路由。只读。
19
+ 发布状态(`delivery-report.json`)+ active change + runtime health + 下一步命令路由。只读。
18
20
  任务状态只接受 MCP `task.list`/`task.get`;失败时原样报告并停止,绝不读取
19
21
  `tasks.json` 冒充权威数据。旧 v4.4 数据必须先执行正式迁移。
20
22
 
@@ -30,9 +32,9 @@ mcp_tools_required:
30
32
 
31
33
  **命令入口做的事**:
32
34
  1. 环境检查(state.db 可达 + 有 task)
33
- 2. `task.list` 拿全量;读 test-report / delivery-report
34
- 3. 算进度 + 风险(blocked / stalled / overdue / complexity spike / test stale)
35
- 4. 按当前 artifact 组合路由到下一个命令(/ultra-init → /ultra-research → /ultra-plan → /ultra-dev → /ultra-test → /ultra-deliver)
35
+ 2. `task.list` + `change.list` + read-only `system.doctor`;读 test/delivery report
36
+ 3. 算进度 + 风险(含 projection、incident、context/docs drift)
37
+ 4. 初始交付后不再显示终局 Done;健康 baseline 的下一项日常工作路由到 `/ultra-change`
36
38
 
37
39
  ## 用法
38
40
 
@@ -44,4 +46,4 @@ mcp_tools_required:
44
46
  ## 下一步
45
47
 
46
48
  看输出的 `▶ Next Up` 块。常见场景:有 pending → `/ultra-dev`;全绿 → `/ultra-test`;
47
- test passed → `/ultra-deliver`。
49
+ test passed → `/ultra-deliver`;已归档且 baseline 健康 → `/ultra-change`。
@@ -6,6 +6,7 @@ model: opus
6
6
  workflow-ref: "@skills/ultra-test/SKILL.md"
7
7
  mcp_tools_required:
8
8
  - task.list
9
+ - change.list
9
10
  ---
10
11
 
11
12
  # /ultra-test
@@ -33,7 +34,7 @@ completed-task 前置检查必须来自 MCP `task.list`;失败时停止,绝
33
34
  **命令入口做的事**:
34
35
  1. 探测项目类型 + `task.list` 确认 ≥1 completed
35
36
  2. 按 scope 跑 gates;失败进 auto-fix(最多 5 轮)
36
- 3. 写 `.ultra/test-report.json`(`passed` + gate-level 明细 + blocking_issues)
37
+ 3. 写 `.ultra/test-report.json`(change_id + exact commands + gate 明细 + blocking_issues)
37
38
  4. 通过 → 提示 `/ultra-deliver`
38
39
 
39
40
  ## 用法
@@ -1,16 +1,15 @@
1
1
  # Ultra Builder Pro — Agent Context
2
2
 
3
3
  Current shared runtime contract for the native Claude Code, OpenCode, and Codex
4
- plugins. Gemini CLI remains a compatibility adapter and is not the reference
5
- shape for the three first-class plugins.
4
+ plugins.
6
5
 
7
6
  ## 1. Ownership boundary
8
7
 
9
8
  Ultra Builder Pro owns only:
10
9
 
11
- - ten public workflows: `learn`, `ultra-init`, `ultra-research`, `ultra-plan`,
10
+ - twelve public workflows: `learn`, `ultra-init`, `ultra-research`, `ultra-plan`,
12
11
  `ultra-dev`, `ultra-test`, `ultra-review`, `ultra-deliver`, `ultra-status`, and
13
- `ultra-think`;
12
+ `ultra-think`, plus the daily `ultra-change` and diagnostic `ultra-doctor`;
14
13
  - four internal agent-only rule skills: `code-review-expert`, `security-rules`,
15
14
  `integration-rules`, and `testing-rules`;
16
15
  - the host-specific collaboration companions and `ultra-verify`;
@@ -25,39 +24,39 @@ not put it in a plugin until that allowlist classifies it.
25
24
  ## 2. Three-layer architecture
26
25
 
27
26
  ```text
28
- native command or skill -> MCP workflow-state operation -> CLI fallback
29
- |
30
- v
31
- .ultra/state.db
27
+ native command or skill -> MCP workflow-state operation -> .ultra/state.db
28
+ ^
29
+ |
30
+ selected CLI init / doctor / diagnostics / orchestration
32
31
  ```
33
32
 
34
33
  | Layer | Artifact | Contract |
35
34
  |---|---|---|
36
35
  | Skill/command | `skills/*/SKILL.md`, `commands/*.md` | Model-facing workflow and host-native entry point |
37
36
  | MCP | `mcp-server/server.cjs` | Authoritative typed operations over `.ultra/state.db` |
38
- | CLI | `ultra-tools`, `ubp-orchestrator` | Portable fallback, automation, and diagnostics |
37
+ | CLI | `ultra-tools`, `ubp-orchestrator` | Selected initialization, backup-first recovery, automation, and diagnostics; not a change-state mirror |
39
38
 
40
- `.ultra/state.db` is the only durable Ultra authority for tasks, sessions,
41
- events, telemetry, review evidence, and circuit-breaker state. `tasks.json`,
42
- context Markdown, execution plans, and reports are projections or workflow
43
- artifacts; never treat them as a second writable authority.
39
+ `.ultra/state.db` is the only durable Ultra authority for changes, tasks,
40
+ sessions, events, incidents, projection jobs/cursors, telemetry, review evidence,
41
+ and circuit-breaker state. `tasks.json`, context Markdown, execution plans, and
42
+ reports are projections or workflow artifacts.
44
43
 
45
44
  ## 3. Live MCP and declared contracts
46
45
 
47
- `spec/mcp-tools.yaml` declares 30 contracts across seven families. The bundled
48
- server registers 21 tools:
46
+ `spec/mcp-tools.yaml` declares and the bundled server registers 29 tools across
47
+ five families:
49
48
 
50
49
  | Family | Live tools |
51
50
  |---|---|
52
51
  | `task.*` | create, update, list, get, switch_tag, delete, init_project, expand, parse_prd, dependency_topo, append_event, subscribe_events |
53
52
  | `session.*` | spawn, close, get, list, admission_check, heartbeat, subscribe_events |
53
+ | `change.*` | create, update, get, list, context, converge, archive |
54
+ | `system.*` | doctor |
54
55
  | `plan.*` | export, get |
55
56
 
56
- The nine declared `review.*`, `impact.*`, `skill.*`, and `ask.*` contracts are
57
- not advertised by the live server. A generated Codex plugin records their
58
- native replacements in `spec/codex-capability-map.json`; other hosts use their
59
- own native review agents, repository discovery, skill loader, and user
60
- interaction surfaces.
57
+ Review, repository impact discovery, skill loading, and user interaction remain
58
+ host-native capabilities rather than fake MCP contracts. The generated Codex
59
+ capability map documents those replacements.
61
60
 
62
61
  Any new MCP contract starts in `spec/mcp-tools.yaml` with valid and invalid
63
62
  fixtures. Do not add an ad-hoc server handler first.
@@ -66,9 +65,9 @@ fixtures. Do not add an ad-hoc server handler first.
66
65
 
67
66
  | Host | Plugin form | Workflow entry | Hook form | Collaboration companions |
68
67
  |---|---|---|---|---|
69
- | Claude Code | `.claude-plugin/plugin.json`, native commands/skills/agents, `.mcp.json` | `/ultra-*`, `/learn` | native `hooks/hooks.json` | `codex-collab`, `gemini-collab` |
70
- | Codex | personal plugin with `.codex-plugin/plugin.json`, namespaced skills, TOML agents, `.mcp.json` | `$ultra-builder-pro:ultra-*`, `$ultra-builder-pro:learn` | native `hooks/hooks.json` through the Codex wire adapter | `cc-collab`, `gemini-collab` |
71
- | OpenCode | config bundle plus native JavaScript plugin | `/ultra-*`, `/learn` | `event`, system transform, compaction, and tool lifecycle handlers | `cc-collab`, `codex-collab`, `gemini-collab` |
68
+ | Claude Code | `.claude-plugin/plugin.json`, native commands/skills/agents, `.mcp.json` | `/ultra-*`, `/learn` | native `hooks/hooks.json` | `codex-collab`, `ultra-verify` |
69
+ | Codex | personal plugin with `.codex-plugin/plugin.json`, namespaced skills, TOML agents, `.mcp.json` | `$ultra-builder-pro:ultra-*`, `$ultra-builder-pro:learn` | native `hooks/hooks.json` through the Codex wire adapter | `cc-collab`, `ultra-verify` |
70
+ | OpenCode | config bundle plus native JavaScript plugin | `/ultra-*`, `/learn` | `event`, system transform, compaction, and tool lifecycle handlers | `cc-collab`, `codex-collab`, `ultra-verify` |
72
71
 
73
72
  The current host remains primary. Collaboration skills call another runtime
74
73
  only when explicitly requested, use it as a read-only advisor, and return the
@@ -85,17 +84,22 @@ The canonical Python hook allowlist contains seven workflow-only adapters:
85
84
  - `pre_stop_check.py` at stop;
86
85
  - `subagent_tracker.py` for bounded worker lifecycle evidence.
87
86
 
88
- Every hook is a no-op unless `.ultra/workflow-state.json` describes an active,
89
- non-terminal workflow. OpenCode expresses the same boundary in its native
90
- JavaScript plugin. Generic command blocking, post-edit governance, and unrelated
91
- user hooks are not copied into Ultra Builder Pro.
87
+ `health_check.py` and `workflow_context.py` may inspect any initialized project;
88
+ `active_task_context.py` always protects the task projection but limits ordinary
89
+ edit guidance to an active workflow. Compact/stop/subagent hooks remain
90
+ active-workflow scoped. OpenCode natively injects baseline/change context and
91
+ protects the projection; full health inspection is available through
92
+ `system.doctor` rather than a session-start health hook.
93
+ Generic command blocking, post-edit governance, and unrelated user hooks are not
94
+ copied into Ultra Builder Pro.
92
95
 
93
96
  ## 6. Memory boundary
94
97
 
95
98
  Ultra Builder Pro has no memory MCP family, recall skill, prompt capture,
96
99
  transcript capture, observation journal, or session-summary hook. Persistent
97
100
  cross-session memory belongs to a separately installed provider such as
98
- cloud-mem/claude-mem.
101
+ cloud-mem/claude-mem. Code graph content is equally external. A change context
102
+ may contain only provider metadata references, never provider payload content.
99
103
 
100
104
  Old Ultra data is never deleted during install. The explicit migration path is:
101
105
 
@@ -113,6 +117,9 @@ Archive before prune; the confirmation token is intentionally required.
113
117
  .ultra/
114
118
  ├── state.db # authoritative SQLite store
115
119
  ├── workflow-state.json # active workflow/recovery checkpoint
120
+ ├── changes/
121
+ │ ├── active/<id>/ # intent, delta, plan, compiled context, verification
122
+ │ └── archive/ # converged packets after baseline reconciliation
116
123
  ├── tasks/ # projections and task contexts
117
124
  ├── specs/ # research/product/architecture artifacts
118
125
  ├── sessions/ # bounded runtime artifacts