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.
- package/.ultra-template/changes/active/.gitkeep +1 -0
- package/.ultra-template/changes/archive/.gitkeep +1 -0
- package/CHANGELOG.md +90 -14
- package/README.md +38 -32
- package/adapters/_shared/codex-assets.cjs +32 -151
- package/adapters/_shared/frontmatter.cjs +2 -2
- package/adapters/_shared/handbook.cjs +10 -10
- package/adapters/_shared/path-rewrite.cjs +0 -3
- package/adapters/_shared/runtime-assets.cjs +13 -4
- package/adapters/_shared/tests/handbook.test.cjs +4 -1
- package/adapters/_shared/tests/path-rewrite.test.cjs +1 -3
- package/adapters/_shared/tests/resolve-target.test.cjs +1 -11
- package/adapters/_shared/tests/runtime-assets.test.cjs +7 -6
- package/adapters/opencode.js +82 -26
- package/adapters/tests/claude.test.cjs +1 -4
- package/adapters/tests/codex.test.cjs +9 -8
- package/adapters/tests/opencode.test.cjs +17 -11
- package/bin/install.js +6 -28
- package/bin/orchestrator.js +12 -30
- package/commands/ultra-change.md +47 -0
- package/commands/ultra-deliver.md +14 -7
- package/commands/ultra-dev.md +6 -3
- package/commands/ultra-doctor.md +36 -0
- package/commands/ultra-init.md +4 -3
- package/commands/ultra-status.md +7 -5
- package/commands/ultra-test.md +2 -1
- package/docs/AGENT-CONTEXT.md +35 -28
- package/docs/ARCHITECTURE.md +49 -21
- package/docs/PLAN.zh-CN.md +67 -68
- package/docs/ROADMAP.md +17 -17
- package/docs/RUNTIME-COMPAT-MATRIX.md +63 -62
- package/hooks/README.md +8 -7
- package/hooks/active_task_context.py +22 -15
- package/hooks/health_check.py +136 -38
- package/hooks/workflow_context.py +120 -30
- package/mcp-server/lib/change-workflow.cjs +556 -0
- package/mcp-server/lib/change-workflow.test.cjs +259 -0
- package/mcp-server/lib/doctor.cjs +112 -0
- package/mcp-server/lib/doctor.test.cjs +86 -0
- package/mcp-server/lib/init-project.cjs +32 -6
- package/mcp-server/lib/pricing.cjs +0 -6
- package/mcp-server/lib/runtime-state.cjs +222 -0
- package/mcp-server/lib/runtime-state.test.cjs +92 -0
- package/mcp-server/lib/state-db.cjs +31 -8
- package/mcp-server/lib/state-ops.cjs +24 -3
- package/mcp-server/lib/telemetry.cjs +4 -0
- package/mcp-server/server.cjs +102 -10
- package/mcp-server/tests/db-ops.test.cjs +5 -1
- package/mcp-server/tests/init-project.test.cjs +45 -0
- package/mcp-server/tests/server-contract.test.cjs +140 -1
- package/mcp-server/tests/state-db.test.cjs +44 -7
- package/mcp-server/tests/state-ops.test.cjs +42 -0
- package/mcp-server/tests/telemetry.test.cjs +14 -0
- package/orchestrator/daemon.cjs +39 -0
- package/orchestrator/dispatch-rules.cjs +15 -4
- package/orchestrator/tests/daemon.test.cjs +63 -12
- package/orchestrator/tests/dispatch-rules.test.cjs +12 -10
- package/package.json +5 -7
- package/settings.json +1 -2
- package/skills/ultra-change/SKILL.md +140 -0
- package/skills/ultra-deliver/SKILL.md +81 -15
- package/skills/ultra-dev/SKILL.md +32 -12
- package/skills/ultra-doctor/SKILL.md +90 -0
- package/skills/ultra-init/SKILL.md +8 -6
- package/skills/ultra-review/SKILL.md +16 -0
- package/skills/ultra-status/SKILL.md +30 -7
- package/skills/ultra-test/SKILL.md +14 -2
- package/skills/ultra-verify/SKILL.md +22 -41
- package/skills/ultra-verify/evals/evals.json +22 -24
- package/skills/ultra-verify/references/confidence-system.md +15 -32
- package/skills/ultra-verify/references/cross-verify-modes.md +14 -59
- package/skills/ultra-verify/scripts/verify_wait.py +44 -81
- package/spec/cli-protocol.md +12 -1
- package/spec/mcp-tools.yaml +340 -4
- package/spec/schemas/mcp-tools.schema.json +1 -1
- package/spec/schemas/skill-manifest.schema.json +2 -2
- package/spec/schemas/state-db.sql +119 -2
- package/ultra-tools/cli.cjs +3 -0
- package/ultra-tools/commands/system.cjs +57 -0
- package/ultra-tools/system-command.test.cjs +53 -0
- package/adapters/_shared/md-to-toml.cjs +0 -54
- package/adapters/_shared/rtk-detect.cjs +0 -86
- package/adapters/_shared/tests/md-to-toml.test.cjs +0 -48
- package/adapters/_shared/tests/rtk-detect.test.cjs +0 -116
- package/adapters/gemini.js +0 -204
- package/adapters/tests/gemini.test.cjs +0 -112
- package/docs/LEGACY-HERMES.md +0 -1175
- package/orchestrator/code-graph-watcher.cjs +0 -121
- package/orchestrator/tests/code-graph-watcher.test.cjs +0 -183
- package/skills/gemini-collab/SKILL.md +0 -51
- package/skills/gemini-collab/evals/evals.json +0 -42
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { test } = require('node:test');
|
|
4
|
-
const assert = require('node:assert/strict');
|
|
5
|
-
const fs = require('node:fs');
|
|
6
|
-
const os = require('node:os');
|
|
7
|
-
const path = require('node:path');
|
|
8
|
-
|
|
9
|
-
const gemini = require('../gemini.js');
|
|
10
|
-
const { RETIRED_SKILLS, skillsForRuntime } = require('../_shared/runtime-assets.cjs');
|
|
11
|
-
|
|
12
|
-
const REPO_ROOT = path.resolve(__dirname, '..', '..');
|
|
13
|
-
|
|
14
|
-
function mkTarget() {
|
|
15
|
-
return fs.mkdtempSync(path.join(os.tmpdir(), 'ubp-gemini-'));
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
test('install packages into extensions/ultra-builder-pro with manifest + commands.toml + skills', () => {
|
|
19
|
-
const target = mkTarget();
|
|
20
|
-
try {
|
|
21
|
-
const r = gemini.install({ configDir: target, repoRoot: REPO_ROOT });
|
|
22
|
-
const extRoot = r.target;
|
|
23
|
-
assert.equal(extRoot, path.join(target, 'extensions', 'ultra-builder-pro'));
|
|
24
|
-
assert.ok(fs.existsSync(path.join(extRoot, 'gemini-extension.json')));
|
|
25
|
-
assert.ok(fs.existsSync(path.join(extRoot, 'GEMINI.md')));
|
|
26
|
-
assert.ok(r.copied.commands.includes('ultra-init.toml'));
|
|
27
|
-
assert.ok(r.copied.skills.some((p) => p.includes('ultra-init/SKILL.md')));
|
|
28
|
-
|
|
29
|
-
const installedSkills = fs.readdirSync(path.join(extRoot, 'skills')).sort();
|
|
30
|
-
assert.deepEqual(installedSkills, skillsForRuntime('gemini').sort());
|
|
31
|
-
for (const retired of RETIRED_SKILLS) assert.ok(!installedSkills.includes(retired));
|
|
32
|
-
|
|
33
|
-
const tomlContent = fs.readFileSync(path.join(extRoot, 'commands', 'ultra-init.toml'), 'utf8');
|
|
34
|
-
assert.match(tomlContent, /description = "/);
|
|
35
|
-
assert.match(tomlContent, /prompt = """/);
|
|
36
|
-
} finally {
|
|
37
|
-
fs.rmSync(target, { recursive: true, force: true });
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
test('reinstall removes stale managed skill assets while preserving runtime state', () => {
|
|
42
|
-
const target = mkTarget();
|
|
43
|
-
try {
|
|
44
|
-
gemini.install({ configDir: target, repoRoot: REPO_ROOT });
|
|
45
|
-
const extRoot = gemini.resolveExtensionRoot({ configDir: target });
|
|
46
|
-
const stale = path.join(extRoot, 'skills', 'recall');
|
|
47
|
-
fs.mkdirSync(stale, { recursive: true });
|
|
48
|
-
fs.writeFileSync(path.join(stale, 'SKILL.md'), 'retired');
|
|
49
|
-
fs.writeFileSync(path.join(extRoot, 'state.db'), 'preserve');
|
|
50
|
-
|
|
51
|
-
gemini.install({ configDir: target, repoRoot: REPO_ROOT });
|
|
52
|
-
assert.equal(fs.existsSync(stale), false);
|
|
53
|
-
assert.equal(fs.readFileSync(path.join(extRoot, 'state.db'), 'utf8'), 'preserve');
|
|
54
|
-
} finally {
|
|
55
|
-
fs.rmSync(target, { recursive: true, force: true });
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
test('manifest declares mcpServers with _ubp tag (not in env — P2 #9)', () => {
|
|
60
|
-
const target = mkTarget();
|
|
61
|
-
try {
|
|
62
|
-
gemini.install({ configDir: target, repoRoot: REPO_ROOT });
|
|
63
|
-
const extRoot = gemini.resolveExtensionRoot({ configDir: target });
|
|
64
|
-
const manifest = JSON.parse(fs.readFileSync(path.join(extRoot, 'gemini-extension.json'), 'utf8'));
|
|
65
|
-
assert.equal(manifest.name, gemini.EXTENSION_NAME);
|
|
66
|
-
assert.equal(manifest._ubp.source, gemini.SOURCE_TAG);
|
|
67
|
-
assert.ok(manifest.mcpServers[gemini.MCP_SERVER_NAME]);
|
|
68
|
-
// D45: identification lives outside env so it never leaks into spawned MCP server.
|
|
69
|
-
assert.equal(manifest.mcpServers[gemini.MCP_SERVER_NAME]._ubp.source, gemini.SOURCE_TAG);
|
|
70
|
-
assert.equal(manifest.mcpServers[gemini.MCP_SERVER_NAME].env, undefined, 'project cwd must own MCP state');
|
|
71
|
-
assert.equal(manifest.contextFileName, 'GEMINI.md');
|
|
72
|
-
} finally {
|
|
73
|
-
fs.rmSync(target, { recursive: true, force: true });
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
test('manifest uses a durable bundled MCP runtime and project-local state defaults', () => {
|
|
78
|
-
const target = mkTarget();
|
|
79
|
-
try {
|
|
80
|
-
gemini.install({ configDir: target, repoRoot: REPO_ROOT });
|
|
81
|
-
const extRoot = gemini.resolveExtensionRoot({ configDir: target });
|
|
82
|
-
const manifest = JSON.parse(fs.readFileSync(path.join(extRoot, 'gemini-extension.json'), 'utf8'));
|
|
83
|
-
const server = manifest.mcpServers[gemini.MCP_SERVER_NAME];
|
|
84
|
-
const launcher = server.args[0];
|
|
85
|
-
assert.ok(launcher.startsWith(path.join(extRoot, 'runtime') + path.sep));
|
|
86
|
-
assert.ok(fs.existsSync(launcher), 'bundled launcher must survive the installer source directory');
|
|
87
|
-
assert.equal(server.env, undefined, 'Gemini must resolve .ultra/state.db from the active project cwd');
|
|
88
|
-
} finally {
|
|
89
|
-
fs.rmSync(target, { recursive: true, force: true });
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
test('uninstall removes extension dir; refuses on foreign manifest', () => {
|
|
94
|
-
const target = mkTarget();
|
|
95
|
-
const extRoot = gemini.resolveExtensionRoot({ configDir: target });
|
|
96
|
-
try {
|
|
97
|
-
gemini.install({ configDir: target, repoRoot: REPO_ROOT });
|
|
98
|
-
assert.ok(fs.existsSync(extRoot));
|
|
99
|
-
gemini.uninstall({ configDir: target });
|
|
100
|
-
assert.ok(!fs.existsSync(extRoot));
|
|
101
|
-
|
|
102
|
-
// Re-install then tamper with the manifest's _ubp identification block.
|
|
103
|
-
gemini.install({ configDir: target, repoRoot: REPO_ROOT });
|
|
104
|
-
const manifestFile = path.join(extRoot, 'gemini-extension.json');
|
|
105
|
-
const m = JSON.parse(fs.readFileSync(manifestFile, 'utf8'));
|
|
106
|
-
m._ubp = { source: 'someone-else' };
|
|
107
|
-
fs.writeFileSync(manifestFile, JSON.stringify(m, null, 2));
|
|
108
|
-
assert.throws(() => gemini.uninstall({ configDir: target }), /refusing to uninstall/);
|
|
109
|
-
} finally {
|
|
110
|
-
fs.rmSync(target, { recursive: true, force: true });
|
|
111
|
-
}
|
|
112
|
-
});
|