Files
msd-core/tests/installed-surface-resolver.test.cjs
Jakub Zych 6cfa0c55d2 refactor: drop 12 runtimes, keep Claude, Codex, OpenCode, Cursor, ZCode, Antigravity
Removes kilo, kimi, kimi-code, copilot, windsurf, augment, trae, qwen, hermes,
cline, codebuddy and pi end to end: capability descriptors, installer branches
and converters (bin/install.js 14.9k -> 11.2k lines), TypeScript converters,
hook surfaces and runtime homes, review lanes qwen/kimi-code, the two pi
migrations, Kimi payload normalization in the hook guards, dead hostBehaviors
vocabulary, launcher home probes, fixtures, runtime-specific tests and the
prose that presented them as supported.

Installer output for the six kept runtimes is byte-identical to before the
prune. The Kimi tool-vocabulary tests in workflow-guard, read-guard and
read-injection-scanner are left in place pending a decision.
2026-10-06 20:02:40 +02:00

750 lines
35 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'use strict';
/**
* Failing-first suite for `resolveInstalledSurfaces` (#2872 Phase 3).
*
* Implements sections 3 ("resolveInstalledSurfaces") and 4 ("stem derivation
* bijection") of `.msd/phase/feat-2872-manifest-scope-runtime/50-test-matrix.md`
* (rows S1-S21, B1-B16). Sections 1, 2 and 5 are owned by sibling suites —
* `tests/install-manifest-scope-runtime.test.cjs`,
* `tests/installer-migrations-manifest-schema.test.cjs`,
* `tests/agent-install-check.test.cjs`.
*
* The module under test exposes only ONE runtime value —
* `resolveInstalledSurfaces` itself (the private stem-derivation helpers are
* not exported) — so every row, including the bijection rows in section 4,
* is driven end to end through that single entry point and asserted against
* the `InstalledScopeRecord.stems` field it returns.
*
* ── Why `resolveScope` is never overridden by `opts.registry` ──────────────
* Per the design doc's "Correction" note (`40-design.md`, bottom): an
* injected `opts.registry` reaches only the layout lookup
* (`resolveRuntimeArtifactLayoutFromRegistry`) and `resolveTriggerSurface` —
* never `resolveScope`, which always consults the REAL
* `capability-registry.cjs`. So every test below uses a REAL registered
* runtime id (`claude`, `cursor`, `cline`, `windsurf`) for scope resolution,
* and reaches for `opts.registry` only when a row needs a layout shape the
* real registry does not currently ship (namespaced-by-dir commands, B2/B8).
* C7/C8 (the all-runtimes sweep) are asserted against the real registry only
* — a fully synthetic registry of invented ids would make `resolveScope`
* throw for every one of them and the sweep would vacuously return `[]`.
*/
const { test, describe } = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const { createTempDir, cleanup } = require('./helpers.cjs');
const fc = require('./helpers/fast-check-setup.cjs');
const { resolveInstalledSurfaces } = require('../msd-core/bin/lib/installed-surface-resolver.cjs');
const { resolveScope } = require('../msd-core/bin/lib/install-scope.cjs');
const capabilityRegistry = require('../msd-core/bin/lib/capability-registry.cjs');
const { isNamespacedByDir, composeCommandFilename } = require('../msd-core/bin/lib/runtime-artifact-layout.cjs');
// ─── Fixture helpers ─────────────────────────────────────────────────────
/** The `readInstallManifest` result shape for "nothing here". */
const ABSENT_MANIFEST = Object.freeze({ manifestVersion: null, runtime: null, scope: null, files: {} });
/** Build a normalized manifest-read result (the shape `opts.readManifest`
* must already return — no re-normalization happens inside the resolver). */
function manifest({ manifestVersion = null, runtime = null, scope = null, files = {} } = {}) {
return { manifestVersion, runtime, scope, files };
}
/**
* Injectable `readManifest` backed by a plain Map keyed on the EXACT
* `configHome` string `resolveScope` will produce for a given runtime/scope
* under the same `home`/`cwd`/`env`/`existsSync` passed to
* `resolveInstalledSurfaces`. Never a hardcoded path literal — keys are
* always computed via the real `resolveScope` (see `scopeHomes` below), so a
* platform-specific separator can never leak into a fixture.
*/
function mkReadManifest(byConfigHome) {
return (configDir) => byConfigHome.get(configDir) ?? ABSENT_MANIFEST;
}
/** The real global/local `configHome` for `runtime` under `home`/`cwd` —
* computed via the actual `resolveScope`, never re-derived by hand, so a
* fixture can never silently drift from what the module under test will
* itself resolve to. */
function scopeHomes(runtime, home, cwd) {
const base = { runtime, env: {}, home, existsSync: () => false, cwd };
return {
global: resolveScope({ ...base, id: 'global' }).configHome,
local: resolveScope({ ...base, id: 'local' }).configHome,
};
}
function baseOpts(home, cwd, overrides = {}) {
return { home, cwd, env: {}, existsSync: () => false, ...overrides };
}
function scopeOf(result, scopeId) {
return result[0].scopes.find((s) => s.scope === scopeId);
}
describe('resolveInstalledSurfaces — scope presence (S1-S3)', () => {
test('reports both scopes uninstalled when nothing is present', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(new Map()) }));
assert.strictEqual(result.length, 1);
assert.strictEqual(result[0].scopes.length, 2);
for (const record of result[0].scopes) {
assert.strictEqual(record.installed, false);
assert.strictEqual(record.manifestVersion, null);
assert.deepStrictEqual(record.stems, []);
}
assert.deepStrictEqual(result[0].triggers, []);
});
test('a global-only install shadows nothing', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, runtime: 'claude', scope: 'global', files: { 'skills/msd-plan-phase/SKILL.md': 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
const global = scopeOf(result, 'global');
const local = scopeOf(result, 'local');
assert.strictEqual(global.installed, true);
assert.deepStrictEqual(global.stems, ['plan-phase']);
assert.strictEqual(local.installed, false);
assert.ok(result[0].triggers.length > 0, 'expected at least one trigger');
for (const t of result[0].triggers) assert.strictEqual(t.shadowedBy, null);
});
test('a local-only install shadows nothing', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.local, manifest({ manifestVersion: 2, runtime: 'claude', scope: 'local', files: { 'commands/msd-plan-phase.md': 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
const global = scopeOf(result, 'global');
const local = scopeOf(result, 'local');
assert.strictEqual(local.installed, true);
assert.deepStrictEqual(local.stems, ['plan-phase']);
assert.strictEqual(global.installed, false);
assert.ok(result[0].triggers.length > 0, 'expected at least one trigger');
for (const t of result[0].triggers) assert.strictEqual(t.shadowedBy, null);
});
});
describe('resolveInstalledSurfaces — shadowing (S4-S7, acceptance criterion S4)', () => {
test('a claude install at both scopes reports the local command surface as shadowed', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, runtime: 'claude', scope: 'global', files: { 'skills/msd-plan-phase/SKILL.md': 'a' } })],
[homes.local, manifest({ manifestVersion: 2, runtime: 'claude', scope: 'local', files: { 'commands/msd-plan-phase.md': 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
const triggers = result[0].triggers;
const localCommands = triggers.filter((t) => t.kind === 'commands' && t.scope === 'local');
const globalSkills = triggers.filter((t) => t.kind === 'skills' && t.scope === 'global');
assert.ok(localCommands.length > 0, 'expected at least one local commands trigger');
assert.ok(globalSkills.length > 0, 'expected at least one global skills trigger');
for (const t of localCommands) {
assert.deepStrictEqual(t.shadowedBy, { kind: 'skills', scope: 'global' });
}
for (const t of globalSkills) {
assert.strictEqual(t.shadowedBy, null);
}
});
test('a skills-at-both-scopes runtime reports a same-kind shadow', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('cursor', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, runtime: 'cursor', scope: 'global', files: { 'skills/msd-plan-phase/SKILL.md': 'a' } })],
[homes.local, manifest({ manifestVersion: 2, runtime: 'cursor', scope: 'local', files: { 'skills/msd-plan-phase/SKILL.md': 'a' } })],
]);
const result = resolveInstalledSurfaces('cursor', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
const group = result[0].triggers.filter((t) => t.trigger === 'msd-plan-phase' && t.kind === 'skills');
const winner = group.find((t) => t.scope === 'global');
const loser = group.find((t) => t.scope === 'local');
assert.ok(winner);
assert.ok(loser);
assert.strictEqual(winner.shadowedBy, null);
assert.deepStrictEqual(loser.shadowedBy, { kind: 'skills', scope: 'global' });
});
});
describe('resolveInstalledSurfaces — the all-runtimes sweep (S8-S11)', () => {
test('sweeps every installable runtime in a stable order, excluding vscode (S8/S9)', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const result = resolveInstalledSurfaces(undefined, baseOpts(home, cwd, { readManifest: mkReadManifest(new Map()) }));
const registeredSorted = Object.keys(capabilityRegistry.runtimes).sort();
assert.ok(registeredSorted.includes('vscode'), 'fixture assumption: vscode is registered');
const expected = registeredSorted.filter((id) => id !== 'vscode');
const actual = result.map((r) => r.runtime);
assert.ok(expected.length > 0);
assert.deepStrictEqual(actual, expected, 'the sweep must be sorted and exclude non-installable runtimes');
});
test('throws for an explicitly requested non-installable runtime (S10)', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
assert.throws(
() => resolveInstalledSurfaces('vscode', baseOpts(home, cwd, { readManifest: mkReadManifest(new Map()) })),
(err) => err instanceof TypeError,
);
});
test('throws for an unknown runtime (S11)', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
assert.throws(
() => resolveInstalledSurfaces('not-a-real-runtime-xyz', baseOpts(home, cwd, { readManifest: mkReadManifest(new Map()) })),
(err) => err instanceof TypeError,
);
});
});
describe('resolveInstalledSurfaces — v1/v2 manifest reporting (S12-S14, acceptance criterion S12)', () => {
test('a v1 manifest is fully functional without reinstall', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 1, runtime: null, scope: null, files: { 'skills/msd-plan-phase/SKILL.md': 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
const global = scopeOf(result, 'global');
assert.strictEqual(global.installed, true);
assert.strictEqual(global.manifestVersion, 1);
assert.strictEqual(global.declaredRuntime, null);
assert.strictEqual(global.declaredScope, null);
assert.strictEqual(global.declaredScopeMatchesProbe, null);
assert.strictEqual(global.declaredRuntimeMatchesProbe, null);
assert.deepStrictEqual(global.stems, ['plan-phase']);
assert.ok(result[0].triggers.length > 0, 'triggers must still be resolved for a v1 install');
});
test('reports a declared-scope mismatch instead of correcting it', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
// Declares 'local' while probed at 'global' — e.g. a manifest copied
// between config dirs.
[homes.global, manifest({ manifestVersion: 2, runtime: 'claude', scope: 'local', files: {} })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
const global = scopeOf(result, 'global');
assert.strictEqual(global.scope, 'global', 'the record stays keyed by the PROBED scope');
assert.strictEqual(global.declaredScope, 'local');
assert.strictEqual(global.declaredScopeMatchesProbe, false);
});
test('reports a declared-runtime mismatch', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, runtime: 'cursor', scope: 'global', files: {} })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
const global = scopeOf(result, 'global');
assert.strictEqual(global.declaredRuntime, 'cursor');
assert.strictEqual(global.declaredRuntimeMatchesProbe, false);
});
});
describe('resolveInstalledSurfaces — negative space (S15, S16, S20, S21)', () => {
test('one physical install is never reported as shadowing itself (S15)', () => {
// claude: global name '.claude', local localConfigDir '.claude' — setting
// cwd === home makes both scopes resolve to the SAME configHome (the
// "project at $HOME" case the design calls out).
const shared = '/fixture/shared-home';
const homes = scopeHomes('claude', shared, shared);
assert.strictEqual(homes.global, homes.local, 'fixture assumption: both scopes collapse to one configHome');
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, runtime: 'claude', scope: 'global', files: { 'skills/msd-plan-phase/SKILL.md': 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(shared, shared, { readManifest: mkReadManifest(byConfigHome) }));
assert.strictEqual(scopeOf(result, 'global').installed, true);
assert.strictEqual(scopeOf(result, 'local').installed, true);
assert.ok(result[0].triggers.length > 0);
assert.ok(result[0].triggers.every((t) => t.shadowedBy === null), 'a single physical install must never shadow itself');
});
test('an empty manifest is installed with no triggers (S16)', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, runtime: 'claude', scope: 'global', files: {} })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
const global = scopeOf(result, 'global');
assert.strictEqual(global.installed, true);
assert.deepStrictEqual(global.stems, []);
assert.deepStrictEqual(result[0].triggers, []);
});
test('non-trigger-bearing manifest keys yield no stems (S20)', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({
manifestVersion: 2, runtime: 'claude', scope: 'global',
files: { 'hooks/foo.json': 'a', 'msd-core/VERSION': 'b', 'settings.json': 'c' },
})],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
assert.deepStrictEqual(scopeOf(result, 'global').stems, []);
});
test('a msd-prefixed key outside a declared subpath is not a trigger (S21)', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, runtime: 'claude', scope: 'global', files: { 'msd-something.md': 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
assert.deepStrictEqual(scopeOf(result, 'global').stems, []);
});
});
describe('resolveInstalledSurfaces — filesystem failure and the STEP 1 fix (S17)', () => {
test('an unreadable config home degrades instead of throwing', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, {
readManifest: () => { throw new Error('EACCES: permission denied'); },
}));
assert.strictEqual(result.length, 1);
for (const record of result[0].scopes) {
assert.strictEqual(record.installed, false);
assert.strictEqual(record.manifestVersion, null);
assert.deepStrictEqual(record.stems, []);
}
assert.deepStrictEqual(result[0].triggers, []);
});
test('a layout failure yields no stems but never reports the scope uninstalled', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, runtime: 'claude', scope: 'global', files: { 'skills/msd-plan-phase/SKILL.md': 'a' } })],
]);
// A synthetic registry that reproduces the exact TypeError
// `resolveRuntimeArtifactLayoutFromRegistry` throws for a skills entry
// with `converter: null` (`dispatchKindEntry`'s `case 'skills'` guard).
// `resolveTriggerSurface` does not call `dispatchKindEntry` at all, so it
// is unaffected by this — which is exactly what isolates "stems failed"
// from "the trigger call failed" in this fixture.
const realClaude = JSON.parse(JSON.stringify(capabilityRegistry.runtimes.claude));
realClaude.runtime.artifactLayout.global[0].converter = null;
const registry = { runtimes: { claude: realClaude } };
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, {
readManifest: mkReadManifest(byConfigHome),
registry,
}));
const global = scopeOf(result, 'global');
assert.strictEqual(global.installed, true, 'a layout failure must not report the scope uninstalled');
assert.strictEqual(global.manifestVersion, 2);
assert.deepStrictEqual(global.stems, [], 'stems degrade to empty on a layout-lookup failure');
});
});
describe('resolveInstalledSurfaces — purity (S18, S19)', () => {
test('a mutated result cannot corrupt a later call (S18)', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, runtime: 'claude', scope: 'global', files: { 'skills/msd-plan-phase/SKILL.md': 'a' } })],
[homes.local, manifest({ manifestVersion: 2, runtime: 'claude', scope: 'local', files: { 'commands/msd-plan-phase.md': 'a' } })],
]);
const opts = baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) });
const first = resolveInstalledSurfaces('claude', opts);
const pristine = JSON.parse(JSON.stringify(first));
first[0].scopes[0].installed = false;
first[0].scopes[0].stems.push('HACKED');
first[0].triggers.push({ trigger: 'INJECTED' });
first.push({ runtime: 'INJECTED' });
const second = resolveInstalledSurfaces('claude', opts);
assert.deepStrictEqual(second, pristine, 'a second call must be unaffected by mutation of the first result');
});
test('resolveInstalledSurfaces mutates nothing on disk (S19, acceptance criterion)', (t) => {
const root = createTempDir('msd-installed-surface-resolver-');
t.after(() => cleanup(root));
const home = path.join(root, 'home');
const cwd = path.join(root, 'project');
const globalDir = path.join(home, '.claude');
const localDir = path.join(cwd, '.claude');
fs.mkdirSync(globalDir, { recursive: true });
fs.mkdirSync(localDir, { recursive: true });
const nowIso = new Date().toISOString();
const globalManifest = {
version: '1.10.0',
timestamp: nowIso,
mode: 'full',
files: { 'skills/msd-plan-phase/SKILL.md': 'sha-global' },
manifestVersion: 2,
runtime: 'claude',
scope: 'global',
};
const localManifest = {
version: '1.10.0',
timestamp: nowIso,
mode: 'full',
files: { 'commands/msd-plan-phase.md': 'sha-local' },
manifestVersion: 2,
runtime: 'claude',
scope: 'local',
};
fs.writeFileSync(path.join(globalDir, 'msd-file-manifest.json'), JSON.stringify(globalManifest, null, 2));
fs.writeFileSync(path.join(localDir, 'msd-file-manifest.json'), JSON.stringify(localManifest, null, 2));
// A stray, unrelated file — proves the resolver doesn't touch anything it
// doesn't need either.
fs.writeFileSync(path.join(globalDir, 'settings.json'), '{}');
function snapshot(dir) {
const out = [];
const walk = (d) => {
for (const entry of fs.readdirSync(d, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
const full = path.join(d, entry.name);
if (entry.isDirectory()) {
out.push([full, { dir: true }]);
walk(full);
} else if (entry.isFile()) {
const st = fs.statSync(full);
out.push([full, { dir: false, size: st.size, mtimeMs: st.mtimeMs }]);
}
}
};
walk(dir);
return out;
}
const before = snapshot(root);
const result = resolveInstalledSurfaces('claude', { home, cwd, env: {}, existsSync: fs.existsSync });
const after = snapshot(root);
assert.strictEqual(scopeOf(result, 'global').installed, true);
assert.strictEqual(scopeOf(result, 'local').installed, true);
assert.deepStrictEqual(after, before, 'the resolver must perform no writes and create no new files/dirs');
assert.deepStrictEqual(after.map((e) => e[0]), before.map((e) => e[0]), 'no new paths must appear');
});
});
// ─── Section 4 — stem derivation bijection + hostile-stem rejection (B1-B16) ─
//
// The private derivation helpers (`deriveStemsForKindEntry`,
// `deriveStemsFromManifest`) are not exported — every row here is driven
// through `resolveInstalledSurfaces` and asserted against the returned
// `InstalledScopeRecord.stems` field, exactly as the module's own public
// contract exposes it.
describe('resolveInstalledSurfaces — stem derivation (B1-B15)', () => {
test('derives a stem from a skills manifest key (B1)', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, files: { 'skills/msd-plan-phase/SKILL.md': 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
assert.deepStrictEqual(scopeOf(result, 'global').stems, ['plan-phase']);
});
test('derives a stem from a namespaced-by-dir command key (B2)', () => {
// No shipped runtime declares a namespaced-by-dir commands layout today
// (destSubpath's basename === prefix minus its trailing '-') — same gap
// the sibling resolveTriggerSurface suite documents for its own row 12.
// `opts.registry` overrides ONLY the layout lookup (never `resolveScope`,
// per the design's Correction note), so `claude` still resolves via the
// REAL registry while its layout is read from this synthetic one.
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const registry = {
runtimes: {
claude: {
runtime: {
artifactLayout: {
global: [],
local: [
{ kind: 'commands', destSubpath: 'commands/msd', prefix: 'msd-', nesting: 'flat', recursive: false, converter: null },
],
},
},
},
},
};
const byConfigHome = new Map([
[homes.local, manifest({ manifestVersion: 2, files: { 'commands/msd/plan-phase.md': 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome), registry }));
assert.deepStrictEqual(scopeOf(result, 'local').stems, ['plan-phase']);
});
test('derives a stem from a prefixed command key (B3)', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.local, manifest({ manifestVersion: 2, files: { 'commands/msd-plan-phase.md': 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
assert.deepStrictEqual(scopeOf(result, 'local').stems, ['plan-phase']);
});
test('multiple files under one skill dir yield one stem (B4)', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({
manifestVersion: 2,
files: {
'skills/msd-plan-phase/SKILL.md': 'a',
'skills/msd-plan-phase/reference.md': 'b',
},
})],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
assert.deepStrictEqual(scopeOf(result, 'global').stems, ['plan-phase']);
});
test('normalizes backslash keys unconditionally (B5)', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, files: { 'skills\\msd-plan-phase\\SKILL.md': 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
assert.deepStrictEqual(scopeOf(result, 'global').stems, ['plan-phase']);
});
test('a non-markdown command key yields no stem (B6)', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.local, manifest({ manifestVersion: 2, files: { 'commands/msd-plan-phase': 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
assert.deepStrictEqual(scopeOf(result, 'local').stems, []);
});
test('an empty stem is not emitted (B7)', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.local, manifest({ manifestVersion: 2, files: { 'commands/msd-.md': 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
assert.deepStrictEqual(scopeOf(result, 'local').stems, []);
});
test('a traversal segment in a skills key is rejected (B9)', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, files: { 'skills/msd-../SKILL.md': 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
assert.deepStrictEqual(scopeOf(result, 'global').stems, []);
});
test("the reviewer's exact hostile payload yields no stem (B10)", () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, files: { 'skills/msd-../../../x/SKILL.md': 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
assert.deepStrictEqual(scopeOf(result, 'global').stems, []);
});
test('a stem containing a control character / newline is rejected (B11)', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, files: { 'skills/msd-x\ny/SKILL.md': 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
assert.deepStrictEqual(scopeOf(result, 'global').stems, []);
});
test('a stem containing an ANSI escape sequence is rejected (B12)', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, files: { 'skills/msd-xy/SKILL.md': 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
assert.deepStrictEqual(scopeOf(result, 'global').stems, []);
});
test('a stem containing an RTL-override codepoint is rejected (B13)', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, files: { 'skills/msd-x‮y/SKILL.md': 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
assert.deepStrictEqual(scopeOf(result, 'global').stems, []);
});
test('an uppercase stem is rejected (B14)', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, files: { 'skills/msd-PlanPhase/SKILL.md': 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
assert.deepStrictEqual(scopeOf(result, 'global').stems, []);
});
test('a stem starting with a hyphen is rejected (B15)', () => {
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, files: { 'skills/msd--x/SKILL.md': 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
assert.deepStrictEqual(scopeOf(result, 'global').stems, []);
});
});
describe('resolveInstalledSurfaces — stem derivation is the exact inverse of Phase 2 filename composition (B8, property)', () => {
// Real stem alphabet: lowercase alnum segments joined by single hyphens
// (e.g. 'plan-phase', 'x', 'a1-b2-c3'), bounded so generated manifest keys
// stay realistic in length.
const stemArb = fc.stringMatching(/^[a-z0-9]{1,8}(-[a-z0-9]{1,8}){0,2}$/);
const PREFIX = 'msd-';
const home = '/fixture/home';
const cwd = '/fixture/project';
const homes = scopeHomes('claude', home, cwd);
// The namespaced-by-dir shape needs a synthetic layout override (no shipped
// runtime declares one today — see B2 above); built once, outside the
// property body, since it never varies across runs.
const namespacedRegistry = {
runtimes: {
claude: {
runtime: {
artifactLayout: {
global: [],
local: [
{ kind: 'commands', destSubpath: 'commands/msd', prefix: PREFIX, nesting: 'flat', recursive: false, converter: null },
],
},
},
},
},
};
test('property: prefixed commands round-trip', () => {
fc.assert(
fc.property(stemArb, (stem) => {
// isNamespacedByDir/composeCommandFilename are the SAME two exports
// the resolver's own derivation consumes — binding both halves of
// the bijection genuinely, not by re-deriving either rule here.
const namespacedByDir = isNamespacedByDir('commands', 'commands', PREFIX);
assert.strictEqual(namespacedByDir, false, 'fixture assumption: claude local commands is the prefixed shape');
const filename = composeCommandFilename(namespacedByDir, PREFIX, stem);
const byConfigHome = new Map([
[homes.local, manifest({ manifestVersion: 2, files: { [`commands/${filename}`]: 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
assert.deepStrictEqual(scopeOf(result, 'local').stems, [stem]);
}),
{ numRuns: 50 },
);
// On failure, fast-check prints the pinned seed and the exact failing
// stem (its shrunk counterexample) as part of the thrown AssertionError
// — sufficient to replay the run deterministically without re-running
// the whole suite.
});
test('property: namespaced-by-dir commands round-trip', () => {
fc.assert(
fc.property(stemArb, (stem) => {
const namespacedByDir = isNamespacedByDir('commands', 'commands/msd', PREFIX);
assert.strictEqual(namespacedByDir, true, 'fixture assumption: the synthetic layout is the namespaced-by-dir shape');
const filename = composeCommandFilename(namespacedByDir, PREFIX, stem);
const byConfigHome = new Map([
[homes.local, manifest({ manifestVersion: 2, files: { [`commands/msd/${filename}`]: 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, {
readManifest: mkReadManifest(byConfigHome),
registry: namespacedRegistry,
}));
assert.deepStrictEqual(scopeOf(result, 'local').stems, [stem]);
}),
{ numRuns: 50 },
);
});
test('property: skills round-trip', () => {
fc.assert(
fc.property(stemArb, (stem) => {
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, files: { [`skills/${PREFIX}${stem}/SKILL.md`]: 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
assert.deepStrictEqual(scopeOf(result, 'global').stems, [stem]);
}),
{ numRuns: 50 },
);
});
test('property: any dirSegment suffix that is not a bare kebab-case token yields no stem', () => {
// Complement of `SAFE_STEM` (`^[a-z0-9][a-z0-9-]*$`) — any non-empty
// string that does not match it must never survive into `stems`, no
// matter what a manifest key throws at the derivation (security
// boundary; see FINDING 1). Bounded and seeded like the round-trip
// properties above.
const hostileArb = fc.string({ minLength: 1, maxLength: 12 })
// Excludes '/' and '\\' — either would split the manifest key into
// extra path segments and stop `hostile` from landing whole inside
// `dirSegment`, which is what this property needs to exercise.
.filter((s) => s.length > 0 && !s.includes('/') && !s.includes('\\') && !/^[a-z0-9][a-z0-9-]*$/.test(s));
fc.assert(
fc.property(hostileArb, (hostile) => {
const byConfigHome = new Map([
[homes.global, manifest({ manifestVersion: 2, files: { [`skills/${PREFIX}${hostile}/SKILL.md`]: 'a' } })],
]);
const result = resolveInstalledSurfaces('claude', baseOpts(home, cwd, { readManifest: mkReadManifest(byConfigHome) }));
assert.deepStrictEqual(scopeOf(result, 'global').stems, []);
}),
{ numRuns: 100, seed: 42 },
);
});
});