ultra-builder-pro-cli 0.8.1 → 0.9.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 +32 -1
- package/README.md +36 -22
- package/adapters/_shared/codex-assets.cjs +28 -0
- package/adapters/_shared/handbook.cjs +8 -1
- package/adapters/_shared/path-rewrite.cjs +3 -0
- package/adapters/_shared/runtime-assets.cjs +2 -1
- package/adapters/_shared/tests/handbook.test.cjs +6 -1
- package/adapters/_shared/tests/path-rewrite.test.cjs +3 -1
- package/adapters/_shared/tests/runtime-assets.test.cjs +4 -1
- package/adapters/kimi.js +642 -0
- package/adapters/tests/kimi-hook.test.cjs +122 -0
- package/adapters/tests/kimi.test.cjs +255 -0
- package/bin/handbook.js +2 -2
- package/bin/install.js +9 -4
- package/bin/orchestrator.js +1 -1
- package/docs/AGENT-CONTEXT.md +5 -3
- package/docs/ARCHITECTURE.md +4 -4
- package/docs/PLAN.zh-CN.md +4 -4
- package/docs/ROADMAP.md +4 -4
- package/docs/RUNTIME-COMPAT-MATRIX.md +106 -62
- package/docs/USER-HANDBOOK-CONTRACT.md +4 -1
- package/hooks/adapters/kimi.py +162 -0
- package/mcp-server/lib/state-db.cjs +85 -2
- package/mcp-server/lib/state-db.test.cjs +56 -0
- package/mcp-server/tests/init-project.test.cjs +2 -2
- package/mcp-server/tests/state-db.test.cjs +3 -3
- package/package.json +4 -2
- package/skills/ultra-review/SKILL.md +3 -3
- package/spec/mcp-tools.yaml +3 -3
- package/spec/schemas/skill-manifest.schema.json +2 -2
- package/spec/schemas/state-db.sql +4 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.9.0] — 2026-07-17
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Added Kimi Code 0.26+ as a fourth native plugin host with namespaced commands,
|
|
15
|
+
twenty allowlisted skills including its session bootstrap, lifecycle hooks,
|
|
16
|
+
bundled review-worker prompt templates, native plugin registration, and
|
|
17
|
+
read-only install diagnostics.
|
|
18
|
+
- Added packed-package and live MCP conformance coverage for the Kimi-managed
|
|
19
|
+
plugin layout while preserving unrelated registry entries and `config.toml`.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- Advanced `.ultra/state.db` to schema `9.1` so Kimi is a valid runtime for
|
|
24
|
+
events and sessions. Existing databases rebuild only the constrained tables
|
|
25
|
+
transactionally while preserving rows, foreign keys, telemetry, incidents,
|
|
26
|
+
and migration history.
|
|
27
|
+
- Extended CLI, handbook, orchestrator runtime selection, package metadata, and
|
|
28
|
+
runtime compatibility documentation to include Kimi without reintroducing
|
|
29
|
+
Ultra-owned memory, graph, browser, deployment, or framework capabilities.
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
|
|
33
|
+
- Made the Kimi MCP launcher recover the active project from the inherited
|
|
34
|
+
working-directory contract even though Kimi starts plugin MCP processes from
|
|
35
|
+
the managed plugin root. It fails closed instead of creating `.ultra` inside
|
|
36
|
+
the installed plugin.
|
|
37
|
+
- Avoided Kimi's embedded Node native-module ABI mismatch by launching the
|
|
38
|
+
bundled MCP with the installer-compatible Node executable from `PATH`.
|
|
39
|
+
|
|
10
40
|
## [0.8.1] — 2026-07-17
|
|
11
41
|
|
|
12
42
|
### Fixed
|
|
@@ -332,7 +362,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
332
362
|
skill manifest, CLI protocol + mapping table; 5 spec validators.
|
|
333
363
|
- **Phase 0 — skeleton**: multi-runtime installer scaffolding.
|
|
334
364
|
|
|
335
|
-
[Unreleased]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.
|
|
365
|
+
[Unreleased]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.9.0...HEAD
|
|
366
|
+
[0.9.0]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.8.1...v0.9.0
|
|
336
367
|
[0.8.1]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.8.0...v0.8.1
|
|
337
368
|
[0.8.0]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.7.0...v0.8.0
|
|
338
369
|
[0.7.0]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.6.0...v0.7.0
|
package/README.md
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
Multi-runtime plugin suite + autonomous coding factory for the Ultra Builder Pro
|
|
4
4
|
agent engineering system. It ships native plugins for **Claude Code · OpenCode ·
|
|
5
|
-
Codex** and orchestrates PRD →
|
|
5
|
+
Codex · Kimi Code** and orchestrates PRD →
|
|
6
6
|
dependency graph → parallel session execution → auto-merge with a single
|
|
7
7
|
authoritative `.ultra/state.db`.
|
|
8
8
|
|
|
9
9
|
<div align="center">
|
|
10
10
|
|
|
11
|
-
[](./CHANGELOG.md)
|
|
12
12
|
[](#verification)
|
|
13
13
|
[](./LICENSE)
|
|
14
14
|
[](./package.json)
|
|
@@ -21,8 +21,9 @@ authoritative `.ultra/state.db`.
|
|
|
21
21
|
|
|
22
22
|
## What it does
|
|
23
23
|
|
|
24
|
-
- **Builds host-native plugins from one allowlist.** Claude Code, OpenCode,
|
|
25
|
-
Codex receive their own command/skill, agent, hook, and MCP
|
|
24
|
+
- **Builds host-native plugins from one allowlist.** Claude Code, OpenCode,
|
|
25
|
+
Codex, and Kimi Code receive their own command/skill, agent, hook, and MCP
|
|
26
|
+
representation.
|
|
26
27
|
Install and uninstall are symmetric on every supported host; `ubp --doctor`
|
|
27
28
|
verifies the installed asset hashes and host entry points without mutation.
|
|
28
29
|
- **Shares state across runtimes.** `.ultra/state.db` (SQLite + WAL) is the
|
|
@@ -51,12 +52,14 @@ authoritative `.ultra/state.db`.
|
|
|
51
52
|
npx ultra-builder-pro-cli --claude --local
|
|
52
53
|
npx ultra-builder-pro-cli --opencode --local
|
|
53
54
|
npx ultra-builder-pro-cli --codex --local
|
|
55
|
+
npx ultra-builder-pro-cli --kimi --local
|
|
54
56
|
|
|
55
57
|
# Or blanket-install to every supported runtime you have
|
|
56
58
|
npx ultra-builder-pro-cli --all --local
|
|
57
59
|
|
|
58
60
|
# Global (into the runtime's ~/.config-style dir)
|
|
59
61
|
npx ultra-builder-pro-cli --claude --global
|
|
62
|
+
npx ultra-builder-pro-cli --kimi --global
|
|
60
63
|
|
|
61
64
|
# Uninstall (symmetric)
|
|
62
65
|
npx ultra-builder-pro-cli --all --local --uninstall
|
|
@@ -70,7 +73,10 @@ After install, start a new host session/task and point it at the project.
|
|
|
70
73
|
Claude Code and OpenCode expose native command forms. Codex exposes the same workflows as namespaced plugin
|
|
71
74
|
skills such as `$ultra-builder-pro:ultra-init`, `$ultra-builder-pro:ultra-plan`,
|
|
72
75
|
and `$ultra-builder-pro:ultra-dev`; `command-map.json` records the eleven legacy
|
|
73
|
-
command mappings (`ultra-review` remains a directly invocable skill).
|
|
76
|
+
command mappings (`ultra-review` remains a directly invocable skill). Kimi Code
|
|
77
|
+
uses native namespaced commands such as `/ultra-builder-pro:ultra-init` and
|
|
78
|
+
`/ultra-builder-pro:ultra-plan`; run `/reload` or start a new Kimi session after
|
|
79
|
+
install or update.
|
|
74
80
|
See [`docs/RUNTIME-COMPAT-MATRIX.md`](./docs/RUNTIME-COMPAT-MATRIX.md)
|
|
75
81
|
for per-runtime capabilities.
|
|
76
82
|
|
|
@@ -91,20 +97,21 @@ Host's native surfaces; the generated Codex capability map documents those
|
|
|
91
97
|
replacements without advertising non-existent MCP tools.
|
|
92
98
|
|
|
93
99
|
The package boundary is deliberate: twelve public Ultra workflow skills, four
|
|
94
|
-
internal review-rule skills,
|
|
95
|
-
|
|
100
|
+
internal review-rule skills, host-specific collaboration companions, and the
|
|
101
|
+
minimal host bootstrap required by Kimi. Browser, deployment, skill-discovery,
|
|
102
|
+
and framework guidance belong to their original plugins.
|
|
96
103
|
|
|
97
104
|
## Runtime capability matrix
|
|
98
105
|
|
|
99
|
-
| Feature | Claude Code | OpenCode | Codex CLI |
|
|
100
|
-
|
|
101
|
-
| Custom commands | ✅ | ✅ | ✅ |
|
|
102
|
-
| Skill loader | ✅ | ✅ | ✅ (personal plugin) |
|
|
103
|
-
| MCP server (stdio) | ✅ | ✅ | ✅ (plugin `.mcp.json`) |
|
|
104
|
-
| Workflow hooks | ✅ (native plugin) | ✅ (native JS plugin) | ✅ (native plugin) |
|
|
105
|
-
| Sub-agents | ✅ | ✅ | ✅ (9 native TOML agents) |
|
|
106
|
-
| Session worktree isolation | ✅ (driven by `orchestrator/session-runner.cjs`) | ✅ | ✅ |
|
|
107
|
-
| Parallel dispatch + auto-merge | ✅ (`ubp-orchestrator run`) | ✅ | ✅ |
|
|
106
|
+
| Feature | Claude Code | OpenCode | Codex CLI | Kimi Code 0.26+ |
|
|
107
|
+
|------------------------------|:-----------:|:--------:|:---------:|:---------------:|
|
|
108
|
+
| Custom commands | ✅ | ✅ | ✅ | ✅ (namespaced) |
|
|
109
|
+
| Skill loader | ✅ | ✅ | ✅ (personal plugin) | ✅ (native plugin) |
|
|
110
|
+
| MCP server (stdio) | ✅ | ✅ | ✅ (plugin `.mcp.json`) | ✅ (`mcpServers`) |
|
|
111
|
+
| Workflow hooks | ✅ (native plugin) | ✅ (native JS plugin) | ✅ (native plugin) | ✅ with documented compact limitation |
|
|
112
|
+
| Sub-agents | ✅ | ✅ | ✅ (9 native TOML agents) | ✅ via `Agent` / `AgentSwarm` prompt templates |
|
|
113
|
+
| Session worktree isolation | ✅ (driven by `orchestrator/session-runner.cjs`) | ✅ | ✅ | ✅ |
|
|
114
|
+
| Parallel dispatch + auto-merge | ✅ (`ubp-orchestrator run`) | ✅ | ✅ | ✅ |
|
|
108
115
|
|
|
109
116
|
Full details in [`docs/RUNTIME-COMPAT-MATRIX.md`](./docs/RUNTIME-COMPAT-MATRIX.md)
|
|
110
117
|
(10 sections, with per-runtime deviations called out).
|
|
@@ -131,14 +138,15 @@ ultra-tools system doctor
|
|
|
131
138
|
Or let the skills drive it. In Codex, invoke
|
|
132
139
|
`$ultra-builder-pro:ultra-plan` → `$ultra-builder-pro:ultra-dev` →
|
|
133
140
|
`$ultra-builder-pro:ultra-status`; after the baseline is delivered, daily work
|
|
134
|
-
starts with `$ultra-builder-pro:ultra-change`.
|
|
135
|
-
|
|
141
|
+
starts with `$ultra-builder-pro:ultra-change`. Kimi uses the corresponding
|
|
142
|
+
`/ultra-builder-pro:ultra-*` namespace. Other runtimes retain their native
|
|
143
|
+
command form.
|
|
136
144
|
|
|
137
145
|
## CLI surface
|
|
138
146
|
|
|
139
147
|
| Binary | Purpose |
|
|
140
148
|
|--------|---------|
|
|
141
|
-
| `ultra-builder-pro-cli` / `ubp` | Installer — `--claude / --opencode / --codex / --all`, `--local / --global`, `--uninstall`; read-only install checks via `--doctor [--json]` |
|
|
149
|
+
| `ultra-builder-pro-cli` / `ubp` | Installer — `--claude / --opencode / --codex / --kimi / --all`, `--local / --global`, `--uninstall`; read-only install checks via `--doctor [--json]` |
|
|
142
150
|
| `ubp-orchestrator` | Session dispatch daemon — `run`, `start`, `stop`, `status` |
|
|
143
151
|
| `ultra-tools` | State-layer CLI — `task`, `session`, `status`, `db`, `migrate`; explicit `legacy-memory` archive/prune migration |
|
|
144
152
|
| `ubp-handbook` | Preview/apply the managed Ultra contract in `CLAUDE.md` / `AGENTS.md`, with backup |
|
|
@@ -168,10 +176,16 @@ Individual suites: `test:state`, `test:orch`, `test:spec`, `test:rest`.
|
|
|
168
176
|
and `node -e "require('./orchestrator/worktree-manager.cjs').releaseAll(process.cwd())"`
|
|
169
177
|
cleans them up.
|
|
170
178
|
- **Installed commands don't show up**: check the runtime's actual config
|
|
171
|
-
dir (`ultra-builder-pro-cli --<runtime> --local`
|
|
172
|
-
|
|
179
|
+
dir (`ultra-builder-pro-cli --<runtime> --local` writes to the host-specific
|
|
180
|
+
project dir such as `./.claude`, `./.opencode`, or `./.kimi-code`;
|
|
181
|
+
`--global` writes to the user-level dir). The
|
|
173
182
|
install log prints the exact target path. Restart Claude Code/OpenCode or
|
|
174
|
-
start a new Codex task after changing an installed plugin.
|
|
183
|
+
start a new Codex task after changing an installed plugin. In Kimi Code,
|
|
184
|
+
run `/reload` or start a new session.
|
|
185
|
+
- **Kimi MCP reports a native-module ABI error**: Kimi 0.26/0.27 embeds a different
|
|
186
|
+
Node ABI from the package installer. The generated plugin intentionally runs
|
|
187
|
+
the MCP with `env node`; keep a Node.js `>=22` executable on `PATH` when
|
|
188
|
+
starting Kimi.
|
|
175
189
|
- **Installed hook/MCP path is missing or stale**: run
|
|
176
190
|
`npx ultra-builder-pro-cli --<runtime> --local --doctor` first. It compares
|
|
177
191
|
the recorded install provenance with current asset hashes and validates the
|
|
@@ -802,11 +802,39 @@ function buildMcpRuntime(repoRoot, pluginRoot, { runtime = 'codex' } = {}) {
|
|
|
802
802
|
removeTree(cliBuildRoot);
|
|
803
803
|
}
|
|
804
804
|
|
|
805
|
+
const runtimeBootstrap = runtime === 'kimi' ? `
|
|
806
|
+
const fs = require('node:fs');
|
|
807
|
+
const pluginRoot = path.resolve(__dirname, '..');
|
|
808
|
+
|
|
809
|
+
function usableProjectRoot(value) {
|
|
810
|
+
if (typeof value !== 'string' || !value.trim()) return null;
|
|
811
|
+
const candidate = path.resolve(value);
|
|
812
|
+
if (candidate === pluginRoot || candidate.startsWith(pluginRoot + path.sep)) return null;
|
|
813
|
+
try {
|
|
814
|
+
return fs.statSync(candidate).isDirectory() ? candidate : null;
|
|
815
|
+
} catch (_) {
|
|
816
|
+
return null;
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
if (!process.env.UBP_ROOT_DIR) {
|
|
821
|
+
const rootDir = usableProjectRoot(process.cwd()) || usableProjectRoot(process.env.PWD);
|
|
822
|
+
if (!rootDir) {
|
|
823
|
+
throw new Error('Kimi Ultra MCP could not resolve the active project root; start Kimi from the project directory');
|
|
824
|
+
}
|
|
825
|
+
process.env.UBP_ROOT_DIR = rootDir;
|
|
826
|
+
}
|
|
827
|
+
if (!process.env.UBP_DB_PATH) {
|
|
828
|
+
process.env.UBP_DB_PATH = path.join(process.env.UBP_ROOT_DIR, '.ultra', 'state.db');
|
|
829
|
+
}
|
|
830
|
+
` : '';
|
|
831
|
+
|
|
805
832
|
const launcher = `'use strict';
|
|
806
833
|
|
|
807
834
|
const path = require('node:path');
|
|
808
835
|
|
|
809
836
|
process.env.UBP_RUNTIME_ROOT = path.resolve(__dirname, '..');
|
|
837
|
+
${runtimeBootstrap}
|
|
810
838
|
|
|
811
839
|
const { main } = require('./index.cjs');
|
|
812
840
|
|
|
@@ -32,6 +32,13 @@ const HOSTS = Object.freeze({
|
|
|
32
32
|
collaboration: '`/cc-collab` and `/codex-collab` are explicitly requested read-only advisors',
|
|
33
33
|
coordination: 'OpenCode session coordination does not replace Ultra task state',
|
|
34
34
|
}),
|
|
35
|
+
kimi: Object.freeze({
|
|
36
|
+
name: 'Kimi Code',
|
|
37
|
+
handbook: ['.kimi-code', 'AGENTS.md'],
|
|
38
|
+
invocation: '`/ultra-builder-pro:ultra-init`, `/ultra-builder-pro:ultra-research`, `/ultra-builder-pro:ultra-plan`, `/ultra-builder-pro:ultra-change`, `/ultra-builder-pro:ultra-dev`, `/ultra-builder-pro:ultra-test`, `/ultra-builder-pro:ultra-review`, and `/ultra-builder-pro:ultra-deliver`; diagnostics use `/ultra-builder-pro:ultra-status`, `/ultra-builder-pro:ultra-think`, and `/ultra-builder-pro:ultra-doctor`',
|
|
39
|
+
collaboration: '`/skill:cc-collab` and `/skill:codex-collab` are explicitly requested read-only advisors',
|
|
40
|
+
coordination: 'Kimi `TodoList` and `Agent` / `AgentSwarm` are host coordination; they do not replace Ultra task state',
|
|
41
|
+
}),
|
|
35
42
|
});
|
|
36
43
|
|
|
37
44
|
function host(runtime) {
|
|
@@ -57,7 +64,7 @@ function renderHandbook(runtime) {
|
|
|
57
64
|
'- Hook boundary: Ultra hooks observe workflow/change lifecycle only. Health/context may run when `.ultra/state.db` exists; projection protection is always authoritative, while edit/compact/stop/subagent enforcement remains active-workflow scoped. Generic command blocking and post-edit policy stay in user or repository governance.',
|
|
58
65
|
'- Installation boundary: `ubp --doctor` is the read-only authority for installed asset provenance, content hashes, and host entry-point wiring; `system.doctor` remains scoped to project state and workflow recovery.',
|
|
59
66
|
'- Agent boundary: the bundled review and debugging agents are bounded workers. They use the current checkout and parent-supplied context, do not own private persistent state, and never replace the primary agent.',
|
|
60
|
-
'- Package boundary: only the twelve Ultra workflows, four internal review-rule skills,
|
|
67
|
+
'- Package boundary: only the twelve Ultra workflows, four internal review-rule skills, host-specific collaboration companions, and the minimal host bootstrap belong to this plugin. General browser, deployment, discovery, and framework skills must be installed from their owners.',
|
|
61
68
|
END_MARKER,
|
|
62
69
|
].join('\n');
|
|
63
70
|
}
|
|
@@ -14,6 +14,7 @@ const RUNTIME_SKILL_ROOT = {
|
|
|
14
14
|
claude: '.claude/skills',
|
|
15
15
|
opencode: '.config/opencode/skills',
|
|
16
16
|
codex: '.agents/skills',
|
|
17
|
+
kimi: '.kimi-code/skills',
|
|
17
18
|
};
|
|
18
19
|
|
|
19
20
|
function parseSkillRef(ref) {
|
|
@@ -51,6 +52,7 @@ function runtimeRoot(runtime) {
|
|
|
51
52
|
case 'claude': return '.claude';
|
|
52
53
|
case 'opencode': return '.config/opencode';
|
|
53
54
|
case 'codex': return '.agents';
|
|
55
|
+
case 'kimi': return '.kimi-code';
|
|
54
56
|
default: throw new Error(`unknown runtime: ${runtime}`);
|
|
55
57
|
}
|
|
56
58
|
}
|
|
@@ -60,6 +62,7 @@ function localRoot(runtime) {
|
|
|
60
62
|
case 'claude': return '.claude';
|
|
61
63
|
case 'opencode': return '.opencode';
|
|
62
64
|
case 'codex': return '.agents';
|
|
65
|
+
case 'kimi': return '.kimi-code';
|
|
63
66
|
default: throw new Error(`unknown runtime: ${runtime}`);
|
|
64
67
|
}
|
|
65
68
|
}
|
|
@@ -29,12 +29,13 @@ const INTERNAL_AGENT_SKILLS = Object.freeze([
|
|
|
29
29
|
'testing-rules',
|
|
30
30
|
]);
|
|
31
31
|
|
|
32
|
-
const SUPPORTED_RUNTIMES = Object.freeze(['claude', 'opencode', 'codex']);
|
|
32
|
+
const SUPPORTED_RUNTIMES = Object.freeze(['claude', 'opencode', 'codex', 'kimi']);
|
|
33
33
|
|
|
34
34
|
const COLLAB_SKILLS_BY_RUNTIME = Object.freeze({
|
|
35
35
|
claude: Object.freeze(['codex-collab', 'ultra-verify']),
|
|
36
36
|
codex: Object.freeze(['cc-collab', 'ultra-verify']),
|
|
37
37
|
opencode: Object.freeze(['cc-collab', 'codex-collab', 'ultra-verify']),
|
|
38
|
+
kimi: Object.freeze(['cc-collab', 'codex-collab', 'ultra-verify']),
|
|
38
39
|
});
|
|
39
40
|
|
|
40
41
|
const RETIRED_SKILLS = Object.freeze([
|
|
@@ -19,11 +19,15 @@ test('renders one common contract with host-native invocation syntax', () => {
|
|
|
19
19
|
const claude = renderHandbook('claude');
|
|
20
20
|
const codex = renderHandbook('codex');
|
|
21
21
|
const opencode = renderHandbook('opencode');
|
|
22
|
+
const kimi = renderHandbook('kimi');
|
|
22
23
|
|
|
23
24
|
assert.match(claude, /\/ultra-plan/);
|
|
24
25
|
assert.match(codex, /\$ultra-builder-pro:ultra-plan/);
|
|
25
26
|
assert.match(opencode, /\/ultra-plan/);
|
|
26
|
-
|
|
27
|
+
assert.match(kimi, /\/ultra-builder-pro:ultra-plan/);
|
|
28
|
+
assert.match(kimi, /Kimi Code/);
|
|
29
|
+
assert.match(kimi, /AgentSwarm/);
|
|
30
|
+
for (const rendered of [claude, codex, opencode, kimi]) {
|
|
27
31
|
assert.match(rendered, /\.ultra\/state\.db/);
|
|
28
32
|
assert.match(rendered, /Separately installed providers/);
|
|
29
33
|
assert.match(rendered, /ultra-change/);
|
|
@@ -86,4 +90,5 @@ test('default handbook paths are host-specific', () => {
|
|
|
86
90
|
assert.equal(resolveHandbookFile('claude', { homeDir }), path.join(homeDir, '.claude', 'CLAUDE.md'));
|
|
87
91
|
assert.equal(resolveHandbookFile('codex', { homeDir }), path.join(homeDir, '.codex', 'AGENTS.md'));
|
|
88
92
|
assert.equal(resolveHandbookFile('opencode', { homeDir }), path.join(homeDir, '.config', 'opencode', 'AGENTS.md'));
|
|
93
|
+
assert.equal(resolveHandbookFile('kimi', { homeDir }), path.join(homeDir, '.kimi-code', 'AGENTS.md'));
|
|
89
94
|
});
|
|
@@ -26,10 +26,12 @@ test('resolveSkillRef routes to runtime-specific root under homeDir', () => {
|
|
|
26
26
|
const claude = resolveSkillRef('@skills/ultra-init/SKILL.md', { runtime: 'claude', homeDir: home });
|
|
27
27
|
const opencode = resolveSkillRef('@skills/ultra-init/SKILL.md', { runtime: 'opencode', homeDir: home });
|
|
28
28
|
const codex = resolveSkillRef('@skills/ultra-init/SKILL.md', { runtime: 'codex', homeDir: home });
|
|
29
|
+
const kimi = resolveSkillRef('@skills/ultra-init/SKILL.md', { runtime: 'kimi', homeDir: home });
|
|
29
30
|
|
|
30
31
|
assert.equal(claude, path.join(home, '.claude/skills/ultra-init/SKILL.md'));
|
|
31
32
|
assert.equal(opencode, path.join(home, '.config/opencode/skills/ultra-init/SKILL.md'));
|
|
32
33
|
assert.equal(codex, path.join(home, '.agents/skills/ultra-init/SKILL.md'));
|
|
34
|
+
assert.equal(kimi, path.join(home, '.kimi-code/skills/ultra-init/SKILL.md'));
|
|
33
35
|
|
|
34
36
|
assert.throws(
|
|
35
37
|
() => resolveSkillRef('@skills/ultra-init/SKILL.md', { runtime: 'unknown', homeDir: home }),
|
|
@@ -45,7 +47,7 @@ test('rewriteWorkflowRefInText + resolveAssetTarget give predictable paths', ()
|
|
|
45
47
|
assert.equal(out, `see ${path.join(home, '.claude/skills/ultra-init/SKILL.md')} for details`);
|
|
46
48
|
|
|
47
49
|
// Cover every runtime × every scope so runtimeRoot/localRoot branches hit
|
|
48
|
-
for (const rt of ['claude', 'opencode', 'codex']) {
|
|
50
|
+
for (const rt of ['claude', 'opencode', 'codex', 'kimi']) {
|
|
49
51
|
const g = resolveAssetTarget('x', { runtime: rt, scope: 'global', homeDir: home, cwd });
|
|
50
52
|
const l = resolveAssetTarget('x', { runtime: rt, scope: 'local', homeDir: home, cwd });
|
|
51
53
|
assert.ok(g.startsWith(home));
|
|
@@ -62,7 +62,10 @@ test('runtime asset manifest exposes only Ultra-owned core and internal skills',
|
|
|
62
62
|
assert.deepEqual(COLLAB_SKILLS_BY_RUNTIME.opencode, [
|
|
63
63
|
'cc-collab', 'codex-collab', 'ultra-verify',
|
|
64
64
|
]);
|
|
65
|
-
assert.deepEqual(
|
|
65
|
+
assert.deepEqual(COLLAB_SKILLS_BY_RUNTIME.kimi, [
|
|
66
|
+
'cc-collab', 'codex-collab', 'ultra-verify',
|
|
67
|
+
]);
|
|
68
|
+
assert.deepEqual(SUPPORTED_RUNTIMES, ['claude', 'opencode', 'codex', 'kimi']);
|
|
66
69
|
|
|
67
70
|
for (const runtime of SUPPORTED_RUNTIMES) {
|
|
68
71
|
const names = skillsForRuntime(runtime);
|