ultra-builder-pro-cli 5.0.1 → 6.0.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 (159) hide show
  1. package/CHANGELOG.md +103 -3
  2. package/README.md +67 -478
  3. package/README.zh-CN.md +49 -422
  4. package/adapters/_shared/frontmatter.cjs +1 -18
  5. package/adapters/_shared/plugin-core.cjs +17 -83
  6. package/adapters/_shared/runtime-assets.cjs +6 -120
  7. package/adapters/claude.js +8 -24
  8. package/adapters/codex.js +13 -32
  9. package/bin/install.js +35 -57
  10. package/docs/PLUGIN-ISOLATION-CONTRACT.md +13 -101
  11. package/docs/examples/drive/claude-reviewer.sh +53 -0
  12. package/docs/examples/drive/claude-writer.sh +43 -0
  13. package/engine/FORMATS.md +1051 -0
  14. package/engine/checks.cjs +139 -0
  15. package/engine/cli.cjs +148 -0
  16. package/engine/completion.cjs +48 -0
  17. package/engine/context.cjs +94 -0
  18. package/engine/drive.cjs +220 -0
  19. package/engine/expect-worker.cjs +5 -0
  20. package/engine/expect.cjs +33 -0
  21. package/engine/formats.cjs +189 -0
  22. package/engine/git-state.cjs +112 -0
  23. package/engine/ledger.cjs +205 -0
  24. package/engine/loading.cjs +28 -0
  25. package/engine/merge.cjs +273 -0
  26. package/engine/milestone.cjs +89 -0
  27. package/engine/plan.cjs +232 -0
  28. package/engine/project.cjs +5 -0
  29. package/engine/signals.cjs +3 -0
  30. package/engine/states.cjs +175 -0
  31. package/hooks/session-start.cjs +54 -0
  32. package/package.json +17 -52
  33. package/skills/ultra/SKILL.md +395 -0
  34. package/.ultra-template/changes/abandoned/.gitkeep +0 -0
  35. package/.ultra-template/changes/active/.gitkeep +0 -1
  36. package/.ultra-template/changes/archive/.gitkeep +0 -1
  37. package/.ultra-template/contexts/TEMPLATE.md +0 -135
  38. package/.ultra-template/decisions/.gitkeep +0 -1
  39. package/.ultra-template/evidence/.gitkeep +0 -1
  40. package/.ultra-template/north-star.md +0 -52
  41. package/.ultra-template/project-brief.md +0 -28
  42. package/.ultra-template/research/.gitkeep +0 -1
  43. package/.ultra-template/specs/architecture.md +0 -81
  44. package/.ultra-template/specs/discovery.md +0 -74
  45. package/.ultra-template/specs/product.md +0 -80
  46. package/.ultra-template/specs/research-distillate.md +0 -57
  47. package/.ultra-template/tasks.json +0 -4
  48. package/.ultra-template/test-report.json +0 -44
  49. package/adapters/_shared/host-profile.cjs +0 -5
  50. package/adapters/grok.js +0 -242
  51. package/adapters/kimi.js +0 -232
  52. package/adapters/opencode.js +0 -408
  53. package/adapters/zcode.js +0 -375
  54. package/bin/delegate-worker.cjs +0 -5
  55. package/bin/delegate.cjs +0 -5
  56. package/docs/ARCHITECTURE.md +0 -274
  57. package/docs/ARTIFACT-AUTHORITY.md +0 -305
  58. package/docs/DECISIONS.md +0 -229
  59. package/docs/PHILOSOPHY.md +0 -261
  60. package/docs/RUNTIME-COMPAT-MATRIX.md +0 -316
  61. package/docs/SKILL-AUTHORING.md +0 -113
  62. package/docs/WORKFLOW-LIFECYCLE.md +0 -350
  63. package/docs/evals/adversarial-review-2026-08-14.md +0 -84
  64. package/docs/evals/ultra-5-0-journey-results.md +0 -62
  65. package/docs/evals/ultra-5-0-live-acp-conformance.md +0 -93
  66. package/docs/evals/ultra-5-0-route-journeys.md +0 -145
  67. package/docs/evals/zcode-automation-2026-08-14.md +0 -103
  68. package/hooks/README.md +0 -52
  69. package/hooks/_common.py +0 -1779
  70. package/hooks/adapters/codex.py +0 -295
  71. package/hooks/adapters/grok.py +0 -134
  72. package/hooks/adapters/kimi.py +0 -156
  73. package/hooks/adapters/zcode.py +0 -227
  74. package/hooks/block_dangerous_commands.py +0 -201
  75. package/hooks/compact_context.py +0 -224
  76. package/hooks/mid_workflow_recall.py +0 -47
  77. package/hooks/post_edit_guard.py +0 -215
  78. package/hooks/session_context.py +0 -741
  79. package/skills/ultra-change/SKILL.md +0 -165
  80. package/skills/ultra-change/references/change-contract.md +0 -199
  81. package/skills/ultra-change/references/execution-grant.md +0 -109
  82. package/skills/ultra-change/references/primary-transfer.md +0 -273
  83. package/skills/ultra-change/scripts/validate_primary_transfer.cjs +0 -1928
  84. package/skills/ultra-delegate/SKILL.md +0 -195
  85. package/skills/ultra-delegate/patches/zcode-acp-0.1.0-zcode-0.16.5.patch +0 -184
  86. package/skills/ultra-delegate/references/delegation-contract.md +0 -138
  87. package/skills/ultra-delegate/scripts/acp-conformance.cjs +0 -287
  88. package/skills/ultra-delegate/scripts/acp-driver.cjs +0 -762
  89. package/skills/ultra-delegate/scripts/agent-execution-driver.cjs +0 -320
  90. package/skills/ultra-delegate/scripts/cli-driver.cjs +0 -61
  91. package/skills/ultra-delegate/scripts/delegate-profiles/kimi-read-only.md +0 -15
  92. package/skills/ultra-delegate/scripts/delegate-profiles/kimi-write.md +0 -17
  93. package/skills/ultra-delegate/scripts/delegate-worker.cjs +0 -328
  94. package/skills/ultra-delegate/scripts/delegate.cjs +0 -690
  95. package/skills/ultra-delegate/scripts/delegate_wait.py +0 -86
  96. package/skills/ultra-delegate/scripts/host-profile.cjs +0 -267
  97. package/skills/ultra-deliver/SKILL.md +0 -194
  98. package/skills/ultra-deliver/references/baseline-reconciliation.md +0 -41
  99. package/skills/ultra-dev/SKILL.md +0 -265
  100. package/skills/ultra-dev/references/debugging.md +0 -22
  101. package/skills/ultra-domain-modeling/SKILL.md +0 -79
  102. package/skills/ultra-grilling/SKILL.md +0 -121
  103. package/skills/ultra-grilling/references/reframing.md +0 -76
  104. package/skills/ultra-init/SKILL.md +0 -143
  105. package/skills/ultra-init/references/brownfield-adoption.md +0 -32
  106. package/skills/ultra-init/scripts/init_project.cjs +0 -1031
  107. package/skills/ultra-plan/SKILL.md +0 -160
  108. package/skills/ultra-plan/references/task-evidence-v2.md +0 -300
  109. package/skills/ultra-plan/scripts/validate_task_evidence.cjs +0 -859
  110. package/skills/ultra-research/SKILL.md +0 -167
  111. package/skills/ultra-research/references/00-problem-validation.md +0 -36
  112. package/skills/ultra-research/references/01-opportunity-discovery.md +0 -33
  113. package/skills/ultra-research/references/02-market-assessment.md +0 -31
  114. package/skills/ultra-research/references/03-alternatives.md +0 -31
  115. package/skills/ultra-research/references/04-product-strategy.md +0 -41
  116. package/skills/ultra-research/references/05-assumptions-validation.md +0 -31
  117. package/skills/ultra-research/references/10-user-personas.md +0 -30
  118. package/skills/ultra-research/references/11-user-scenarios.md +0 -28
  119. package/skills/ultra-research/references/20-user-stories.md +0 -31
  120. package/skills/ultra-research/references/21-features-scope.md +0 -38
  121. package/skills/ultra-research/references/22-success-metrics.md +0 -33
  122. package/skills/ultra-research/references/30-architecture-context.md +0 -30
  123. package/skills/ultra-research/references/31-solution-strategy.md +0 -28
  124. package/skills/ultra-research/references/32-building-blocks.md +0 -28
  125. package/skills/ultra-research/references/40-deployment.md +0 -29
  126. package/skills/ultra-research/references/41-quality-risks.md +0 -28
  127. package/skills/ultra-research/references/99-synthesis.md +0 -59
  128. package/skills/ultra-research/references/north-star-v2.md +0 -168
  129. package/skills/ultra-research/references/wayfinding.md +0 -50
  130. package/skills/ultra-research/scripts/validate_north_star.cjs +0 -1174
  131. package/skills/ultra-review/SKILL.md +0 -275
  132. package/skills/ultra-review/references/adversarial-evaluation.md +0 -31
  133. package/skills/ultra-review/references/code.md +0 -17
  134. package/skills/ultra-review/references/comments.md +0 -12
  135. package/skills/ultra-review/references/design.md +0 -12
  136. package/skills/ultra-review/references/errors.md +0 -13
  137. package/skills/ultra-review/references/review-modes.md +0 -29
  138. package/skills/ultra-review/references/spec.md +0 -18
  139. package/skills/ultra-review/references/tests.md +0 -12
  140. package/skills/ultra-review/references/unified-schema.md +0 -284
  141. package/skills/ultra-review/references/worker-packet.md +0 -183
  142. package/skills/ultra-review/scripts/review_wait.py +0 -2943
  143. package/skills/ultra-status/SKILL.md +0 -209
  144. package/skills/ultra-status/references/route-contract.md +0 -100
  145. package/skills/ultra-tdd/SKILL.md +0 -91
  146. package/skills/ultra-tdd/references/templates/README.md +0 -20
  147. package/skills/ultra-tdd/references/templates/feature-flag-default-audit.sh +0 -79
  148. package/skills/ultra-tdd/references/templates/persistence-real.ts +0 -78
  149. package/skills/ultra-tdd/references/templates/testcontainer-postgres.py +0 -78
  150. package/skills/ultra-tdd/references/templates/testcontainer-postgres.ts +0 -73
  151. package/skills/ultra-tdd/references/templates/vertical-slice.ts +0 -66
  152. package/skills/ultra-tdd/references/test-execution.md +0 -23
  153. package/skills/ultra-test/SKILL.md +0 -244
  154. package/skills/ultra-test/references/export-syntax.md +0 -18
  155. package/skills/ultra-test/scripts/validate_review_transport.cjs +0 -549
  156. package/skills/ultra-test/scripts/worktree_digest.cjs +0 -576
  157. package/skills/ultra-think/SKILL.md +0 -56
  158. package/skills/ultra-think/references/autonomy-boundary.md +0 -48
  159. package/skills/ultra-think/references/interaction-boundary.md +0 -42
@@ -0,0 +1,175 @@
1
+ 'use strict';
2
+
3
+ const { unique, problem } = require('./formats.cjs');
4
+ const { latest, lockPid } = require('./ledger.cjs');
5
+ const { planProblems, pendingPlans } = require('./plan.cjs');
6
+
7
+ function checkState(project, check, record, ids = check.covers) {
8
+ if (!record) return { state: 'unknown', reasons: ['not-run'] };
9
+ if (record.dirty) return { state: 'unknown', reasons: ['dirty-run'] };
10
+ const reasons = [];
11
+ if (check.fp !== record.check_fp) reasons.push('check-changed');
12
+ if (project.code !== record.code) reasons.push('code-changed');
13
+ if (project.shared !== record.shared) reasons.push('shared-changed');
14
+ for (const id of unique(ids)) {
15
+ if (!project.reqs.has(id) || project.reqs.get(id) !== record.reqs[id]) {
16
+ reasons.push(`req-changed:${id}`);
17
+ }
18
+ }
19
+ if (reasons.length) return { state: 'stale', reasons };
20
+ return { state: { pass: 'green', fail: 'red', unknown: 'unknown' }[record.outcome],
21
+ reasons: record.outcome === 'pass' ? [] : [record.reason] };
22
+ }
23
+
24
+ function checkStates(project) {
25
+ const evidence = new Map();
26
+ for (const r of project.evidence) {
27
+ const previous = evidence.get(r.check);
28
+ if (!previous || r.at >= previous.at) evidence.set(r.check, r);
29
+ }
30
+ const checks = project.checks.map((c) => ({ id: c.id,
31
+ ...checkState(project, c, evidence.get(c.id)), last_run: evidence.get(c.id)?.run ?? null }));
32
+ return { evidence, checks };
33
+ }
34
+
35
+ function requirementStates(project, evidence) {
36
+ return [...project.reqs.keys()].map((id) => {
37
+ const pairs = project.checks.filter((c) => c.covers.includes(id))
38
+ .map((c) => ({ id: c.id, ...checkState(project, c, evidence.get(c.id), [id]) }));
39
+ const state = !pairs.length ? 'uncovered'
40
+ : ['red', 'unknown', 'stale', 'green'].find((s) => pairs.some((p) => p.state === s));
41
+ return { id, milestone: project.milestones.find((m) => m.requirements.includes(id))?.id ?? null,
42
+ state, reasons: unique(pairs.flatMap((p) => p.reasons)), checks: pairs };
43
+ });
44
+ }
45
+
46
+ function dependencies(project, node) {
47
+ const earlier = node.kind === 'cleanup' ? project.nodes.slice(0, project.nodes.indexOf(node))
48
+ .filter((n) => n.milestone === node.milestone).map((n) => n.id) : [];
49
+ return unique([...node.depends, ...earlier]);
50
+ }
51
+
52
+ function nodeStates(project) {
53
+ const ns = new Map(project.nodes.map((n) => [n.id, n]));
54
+ const states = new Map();
55
+ // Memoized recursion follows dependencies. The gate rejects cycles, so a valid
56
+ // graph terminates. Cache a blocked state before descending so status also
57
+ // terminates on a cycle before the gate has passed.
58
+ const nodeState = (id) => {
59
+ if (states.has(id)) return states.get(id);
60
+ const n = ns.get(id);
61
+ if (!n) return { state: 'blocked', reasons: [] };
62
+ const record = latest(project.completions, 'node', id);
63
+ const reasons = record ? unique(n.covers).filter((r) => !project.reqs.has(r)
64
+ || project.reqs.get(r) !== record.reqs[r]).map((r) => `req-changed:${r}`) : [];
65
+ if (record && project.shared !== record.shared) reasons.unshift('shared-changed');
66
+ let state = 'blocked';
67
+ if (record) state = reasons.length ? 'stale' : 'done';
68
+ const result = { id, milestone: n.milestone, state, reasons };
69
+ states.set(id, result);
70
+ if (!record && dependencies(project, n).every((dep) => nodeState(dep).state === 'done')) {
71
+ result.state = 'ready';
72
+ }
73
+ return result;
74
+ };
75
+ return project.nodes.map((n) => nodeState(n.id));
76
+ }
77
+
78
+ function milestoneProgress(project, requirements, nodes, invariants) {
79
+ const closed = new Set(project.closures.map((c) => c.milestone));
80
+ const current = project.milestones.find((m) => !closed.has(m.id)) || project.milestones.at(-1);
81
+ const currentReqs = requirements.filter((r) => current?.requirements.includes(r.id));
82
+ const counts = { total: currentReqs.length,
83
+ green: 0, red: 0, stale: 0, unknown: 0, uncovered: 0 };
84
+ currentReqs.forEach((r) => counts[r.state]++);
85
+ const relevant = project.milestones.filter((m) => closed.has(m.id) || m.id === current?.id);
86
+ const reqIds = new Set(relevant.flatMap((m) => m.requirements));
87
+ const relevantNodes = nodes.filter((n) => relevant.some((m) => m.id === n.milestone));
88
+ const actionable = relevantNodes.find((n) => n.state === 'ready' || (n.state === 'stale'
89
+ && dependencies(project, project.nodes.find((p) => p.id === n.id))
90
+ .every((dep) => nodes.some((d) => d.id === dep && d.state === 'done'))));
91
+ const ownNodes = nodes.filter((n) => n.milestone === current?.id);
92
+ let next = '无(受阻)';
93
+ if (actionable) next = actionable.id;
94
+ else if (requirements.some((r) => reqIds.has(r.id) && r.state !== 'green')
95
+ || invariants.some((i) => i.state !== 'green')) next = '检查';
96
+ else if (current && project.milestones.every((m) => closed.has(m.id))) next = '全部完成';
97
+ else if (current && ownNodes.every((n) => n.state === 'done')) next = '里程碑门';
98
+ const closedIds = new Set(project.milestones.filter((m) => closed.has(m.id)
99
+ && m.id !== current?.id).flatMap((m) => m.requirements));
100
+ const closed_not_green = requirements.filter((r) => closedIds.has(r.id)
101
+ && r.state !== 'green').length;
102
+ const lastClosure = project.closures.reduce((at, record) => record.at > at ? record.at : at, '');
103
+ const plan_changes = project.plans.filter((p) => ['change', 'removed'].includes(p.type)
104
+ && p.at > lastClosure).length;
105
+ return { milestone: current?.id ?? null, counts, next, closed_not_green, plan_changes };
106
+ }
107
+
108
+ function progressLine(progress, gate, dirty, invariants, drive) {
109
+ const { milestone, counts, next, plan_changes, closed_not_green } = progress;
110
+ let line = `${milestone ?? '无'} · ${counts.green}/${counts.total} 绿`;
111
+ for (const [key, label] of [['red', '红'], ['stale', '过期'], ['unknown', '未知'],
112
+ ['uncovered', '未覆盖']]) {
113
+ if (counts[key]) line += ` · ${counts[key]} ${label}`;
114
+ }
115
+ line += ` · 下一项 ${next} · 本里程碑计划变更 ${plan_changes} 次`;
116
+ const notGreen = invariants.filter((i) => i.state !== 'green').length;
117
+ if (notGreen) line += ` · 不变量 ${notGreen} 未绿`;
118
+ if (closed_not_green) line += ` · 已关闭里程碑 ${closed_not_green} 项未绿`;
119
+ if (dirty) line += ' · 工作区未提交';
120
+ if (gate !== 'pass') {
121
+ line += gate === 'fail' ? ' · 计划门未通过' : ' · 计划门待重跑';
122
+ }
123
+ return line + (drive ? ' · drive 运行中' : '');
124
+ }
125
+
126
+ function status(project) {
127
+ const drive = lockPid(project.root, 'drive');
128
+ const { evidence, checks } = checkStates(project);
129
+ const invariants = project.checks.filter((c) => Object.hasOwn(c, 'fix')).map((c) => {
130
+ const { id, state, reasons } = checks.find((s) => s.id === c.id);
131
+ return { id, state, reasons, fix: c.fix };
132
+ });
133
+ const requirements = requirementStates(project, evidence);
134
+ const nodes = nodeStates(project);
135
+ const progress = milestoneProgress(project, requirements, nodes, invariants);
136
+ const problems = planProblems(project);
137
+ let gate = 'pass';
138
+ if (problems.length) gate = 'fail';
139
+ else if (pendingPlans(project).length) gate = 'stale';
140
+ return { ...progress, line: progressLine(progress, gate, project.dirty, invariants, drive),
141
+ drive, gate, problems, warnings: project.warnings, dirty: project.dirty,
142
+ requirements, checks, nodes, invariants };
143
+ }
144
+
145
+ function invariantProblems(state) {
146
+ return state.invariants.filter((i) => i.state !== 'green')
147
+ .map((i) => problem('invariant-not-green', `${i.id} is not green`,
148
+ i.state === 'red' ? i.fix : `Run \`ubp check ${i.id}\`.`));
149
+ }
150
+
151
+ function retro(project) {
152
+ const since = project.closures.reduce((at, r) => !at || r.at > at ? r.at : at, null);
153
+ const classes = new Map();
154
+ const green = new Set();
155
+ const records = project.evidence.filter((r) => {
156
+ if (r.dirty) return false;
157
+ if (r.outcome === 'pass') { green.add(r.check); return false; }
158
+ return (!since || r.at > since) && (green.has(r.check)
159
+ || ['timeout', 'expect-timeout', 'not-runnable', 'spawn-error'].includes(r.reason));
160
+ }).sort((a, b) => a.at < b.at ? -1 : a.at > b.at ? 1 : 0);
161
+ for (const r of records) {
162
+ const key = (r.error_line || r.reason).replace(/[0-9]+/gu, '#').replace(/\s+/gu, ' ').trim();
163
+ if (!classes.has(key)) classes.set(key, { class: key, count: 0, checks: [], runs: [] });
164
+ const entry = classes.get(key);
165
+ entry.count++;
166
+ entry.checks.push(r.check);
167
+ entry.runs.push(r.run);
168
+ }
169
+ const entries = [...classes.values()];
170
+ for (const entry of entries) entry.checks = unique(entry.checks).sort();
171
+ entries.sort((a, b) => b.count - a.count || (a.class < b.class ? -1 : a.class > b.class ? 1 : 0));
172
+ return { since, classes: entries };
173
+ }
174
+
175
+ module.exports = { status, invariantProblems, retro, dependencies };
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const fs = require('node:fs');
5
+ const path = require('node:path');
6
+ const { spawnSync } = require('node:child_process');
7
+
8
+ function readInput() {
9
+ if (process.stdin.isTTY) return Promise.resolve('');
10
+ return new Promise((resolve) => {
11
+ let text = '';
12
+ const collect = (chunk) => { text += chunk; };
13
+ const finish = () => {
14
+ clearTimeout(timer);
15
+ process.stdin.off('data', collect);
16
+ process.stdin.destroy();
17
+ resolve(text);
18
+ };
19
+ const timer = setTimeout(finish, 1000);
20
+ process.stdin.setEncoding('utf8');
21
+ process.stdin.on('data', collect);
22
+ process.stdin.once('end', finish);
23
+ process.stdin.once('error', finish);
24
+ });
25
+ }
26
+
27
+ function projectRoot(cwd) {
28
+ let dir = path.resolve(cwd);
29
+ while (!fs.existsSync(path.join(dir, '.ultra', 'spec.md'))) {
30
+ const parent = path.dirname(dir);
31
+ if (parent === dir) return null;
32
+ dir = parent;
33
+ }
34
+ return dir;
35
+ }
36
+
37
+ async function main() {
38
+ let cwd = process.cwd();
39
+ try {
40
+ const value = JSON.parse(await readInput());
41
+ if (typeof value?.cwd === 'string' && value.cwd) cwd = value.cwd;
42
+ } catch { /* Missing or malformed input uses the process working directory. */ }
43
+ const root = projectRoot(cwd);
44
+ // A drive's writer or reviewer follows its brief, not the controller's method.
45
+ if (!root || process.env.UBP_DRIVE) return;
46
+ const result = spawnSync(process.execPath, [
47
+ path.join(__dirname, '..', 'engine', 'cli.cjs'), 'status', '--root', root,
48
+ ], { encoding: 'utf8', timeout: 8000 });
49
+ if (result.stdout) process.stdout.write(result.stdout);
50
+ process.stdout.write('Use the ultra Skill to drive this project.\n');
51
+ }
52
+
53
+ // An advisory observation must never prevent a session from starting.
54
+ main().catch(() => {}).finally(() => { process.exitCode = 0; });
package/package.json CHANGED
@@ -1,65 +1,33 @@
1
1
  {
2
2
  "name": "ultra-builder-pro-cli",
3
- "version": "5.0.1",
4
- "description": "File-first Ultra Builder Pro workflows for Claude Code, OpenCode, Codex CLI, Kimi Code, Grok Build, and ZCode.",
3
+ "version": "6.0.0",
4
+ "description": "Project method and deterministic progress engine for Claude Code and Codex.",
5
5
  "bin": {
6
6
  "ultra-builder-pro-cli": "bin/install.js",
7
7
  "ubp": "bin/install.js"
8
8
  },
9
9
  "files": [
10
10
  "bin",
11
- "adapters",
12
- "skills/ultra-init",
13
- "skills/ultra-research",
14
- "skills/ultra-plan",
15
- "skills/ultra-dev",
16
- "skills/ultra-test",
17
- "skills/ultra-review",
18
- "skills/ultra-deliver",
19
- "skills/ultra-status",
20
- "skills/ultra-think",
21
- "skills/ultra-change",
22
- "skills/ultra-delegate",
23
- "skills/ultra-grilling",
24
- "skills/ultra-domain-modeling",
25
- "skills/ultra-tdd",
26
- "hooks/_common.py",
27
- "hooks/*.py",
28
- "hooks/adapters/*.py",
29
- "hooks/README.md",
30
- "LICENSE",
31
- "CHANGELOG.md",
11
+ "engine",
12
+ "adapters/claude.js",
13
+ "adapters/codex.js",
14
+ "adapters/_shared/*.cjs",
15
+ "skills/ultra",
16
+ "hooks/session-start.cjs",
17
+ "README.md",
32
18
  "README.zh-CN.md",
33
- ".ultra-template",
34
- "docs/PHILOSOPHY.md",
35
- "docs/ARCHITECTURE.md",
36
- "docs/ARTIFACT-AUTHORITY.md",
37
- "docs/WORKFLOW-LIFECYCLE.md",
38
- "docs/SKILL-AUTHORING.md",
39
- "docs/DECISIONS.md",
19
+ "CHANGELOG.md",
20
+ "LICENSE",
40
21
  "docs/PLUGIN-ISOLATION-CONTRACT.md",
41
- "docs/RUNTIME-COMPAT-MATRIX.md",
42
- "docs/evals/*.md",
43
- "!**/*.pyc",
44
- "!**/*.pyo",
45
- "!**/*.test.cjs",
46
- "!**/tests/**",
47
- "!**/__pycache__/**"
22
+ "docs/examples/drive"
48
23
  ],
49
24
  "keywords": [
50
25
  "claude-code",
51
- "opencode",
52
26
  "codex",
53
- "kimi-code",
54
- "grok-build",
55
- "zcode",
56
27
  "agent",
57
28
  "cli",
58
- "multi-runtime",
59
29
  "ultra-builder-pro",
60
- "file-first",
61
- "meta-prompting",
62
- "context-engineering"
30
+ "file-first"
63
31
  ],
64
32
  "author": "Ultra Builder Pro contributors",
65
33
  "license": "MIT",
@@ -77,17 +45,14 @@
77
45
  "scripts": {
78
46
  "test": "npm run test:all",
79
47
  "test:node": "node --test adapters/_shared/tests/*.test.cjs tests/*.test.cjs",
80
- "test:all": "npm run test:node && npm run test:hooks",
81
- "test:hooks": "pytest hooks/tests -q",
48
+ "test:all": "npm run test:node",
82
49
  "verify:release": "npm run test:all && npm audit --omit=dev --audit-level=high",
83
50
  "prepublishOnly": "npm run verify:release",
84
51
  "install:claude": "node bin/install.js --claude --local",
85
- "install:kimi": "node bin/install.js --kimi --global",
86
- "install:grok": "node bin/install.js --grok --global",
87
- "install:zcode": "node bin/install.js --zcode --global",
88
- "install:all": "node bin/install.js --all --global"
52
+ "install:all": "node bin/install.js --all --global",
53
+ "install:codex": "node bin/install.js --codex --global"
89
54
  },
90
55
  "dependencies": {
91
- "js-yaml": "^4.3.1"
56
+ "js-yaml": "^4.3.2"
92
57
  }
93
58
  }