The flattened install layout broke the third-party capability ecosystem in two
ways. Both are fixed at the host-version / installer boundary.
Gap 1 — host version read as 0.0.0. The running GSD version was resolved via
require('../../../package.json') (loader/source) and require('../../package.json')
(the gsd-tools CLI), which in the installed layout is the versionless CommonJS
marker → the fail-closed fallback reported 0.0.0, so `capability install` rejected
any manifest with a real engines.gsd range as "incompatible with GSD 0.0.0". For
runtimes that get no marker, and for local installs, that walked-up package.json
could even be the USER's own project, reporting a wrong version. Fix:
readHostVersion() (capability-loader.cts, capability-source.cts) and capHostVersion()
(gsd-tools.cjs) now prefer the authoritative gsd-core/VERSION the installer already
writes for EVERY runtime (mirrors resolveVersionFrom(), #1383), falling back to the
runtime-root package.json for the dev/source tree, then fail-closing. This fixes
every runtime and the actual `capability install` CLI path without touching the
marker package.json, so uninstall is unchanged (no data-loss surface).
Gap 2 — scripts/gen-capability-registry.cjs (+ its sibling
gen-loop-host-contract.cjs) were never copied by the installer, so the loader's
never-crash invariant discarded every overlay and fell back to the frozen
first-party registry (installed capabilities silently inert). Now copied,
uninstalled, and manifest-tracked exactly like fix-slash-commands.cjs (#1223).
Regenerates the 16 golden-install-parity fixtures to capture the two newly shipped
generator scripts and the gsd-tools.cjs change.
Regression tests (RED→GREEN): readHostVersion VERSION-first / fallback / fail-closed
resolution; an end-to-end `capability install` against a REAL installed layout
proving the engines gate sees the real host version, not 0.0.0; and a real-install
check that both generators are shipped and manifest-tracked.
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
208
tests/fix-1920-installer-ships-capability-generators.test.cjs
Normal file
208
tests/fix-1920-installer-ships-capability-generators.test.cjs
Normal file
@@ -0,0 +1,208 @@
|
||||
'use strict';
|
||||
/**
|
||||
* Regression tests for #1920: the installer must produce a capability-ecosystem-
|
||||
* complete flattened layout, and the capability loader must resolve the real host
|
||||
* version in that layout.
|
||||
*
|
||||
* Two gaps broke third-party capabilities on installed (flattened) layouts:
|
||||
*
|
||||
* Gap 1 — host version read as 0.0.0. `readHostVersion()` resolved the running GSD
|
||||
* version via require('../../../package.json'), which in the installed layout is the
|
||||
* marker package.json ({"type":"commonjs"}, no version) → the fail-closed fallback
|
||||
* reported 0.0.0, so `capability install` rejected any manifest with a real
|
||||
* engines.gsd range as "incompatible with GSD 0.0.0". Worse, for runtimes that get
|
||||
* no marker and for local installs, that walked-up package.json could be the USER's
|
||||
* own project, reporting a wrong version. Fix: readHostVersion() prefers the
|
||||
* authoritative gsd-core/VERSION the installer writes for EVERY runtime.
|
||||
*
|
||||
* Gap 2 — the registry generator was never shipped. The loader composes overlays via
|
||||
* require('../../../scripts/gen-capability-registry.cjs'); the installer never copied
|
||||
* it (nor its sibling gen-loop-host-contract.cjs), so the never-crash invariant
|
||||
* discarded EVERY overlay and fell back to the frozen first-party registry —
|
||||
* installed third-party capabilities were silently inert. Same class of gap as #1223
|
||||
* (scripts/fix-slash-commands.cjs).
|
||||
*
|
||||
* These tests are RED before the fix (loader/install.js) and GREEN after.
|
||||
*/
|
||||
|
||||
process.env.GSD_TEST_MODE = '1';
|
||||
|
||||
const { describe, test } = require('node:test');
|
||||
const assert = require('node:assert/strict');
|
||||
const fs = require('node:fs');
|
||||
const os = require('node:os');
|
||||
const path = require('node:path');
|
||||
const { spawnSync } = require('node:child_process');
|
||||
const { cleanup } = require('./helpers.cjs');
|
||||
|
||||
const ROOT = path.join(__dirname, '..');
|
||||
const INSTALL = path.join(ROOT, 'bin', 'install.js');
|
||||
const MANIFEST_NAME = 'gsd-file-manifest.json';
|
||||
|
||||
// The generator scripts the capability loader requires by relative path.
|
||||
const GENERATORS = ['gen-capability-registry.cjs', 'gen-loop-host-contract.cjs'];
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Gap 1 — readHostVersion() prefers gsd-core/VERSION (the installer-written,
|
||||
// all-runtime authoritative source) over an ambient/absent package.json.
|
||||
// ---------------------------------------------------------------------------
|
||||
describe('Gap 1: readHostVersion resolves the real host version in an installed layout (#1920)', () => {
|
||||
const { readHostVersion } = require('../gsd-core/bin/lib/capability-loader.cjs');
|
||||
|
||||
/** Build a fake installed tree and return its gsd-core/bin/lib dir (the module libDir). */
|
||||
function fakeTree({ version, pkg }) {
|
||||
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-1920-ver-'));
|
||||
const libDir = path.join(root, 'gsd-core', 'bin', 'lib');
|
||||
fs.mkdirSync(libDir, { recursive: true });
|
||||
if (version !== undefined) fs.writeFileSync(path.join(root, 'gsd-core', 'VERSION'), version);
|
||||
if (pkg !== undefined) fs.writeFileSync(path.join(root, 'package.json'), JSON.stringify(pkg));
|
||||
return { root, libDir };
|
||||
}
|
||||
|
||||
test('prefers gsd-core/VERSION over a wrong ambient package.json version', () => {
|
||||
// The walked-up package.json belongs to the user's project (wrong version) — must be ignored.
|
||||
const { root, libDir } = fakeTree({ version: '9.9.9\n', pkg: { name: 'user-app', version: '1.2.3', type: 'commonjs' } });
|
||||
try {
|
||||
assert.strictEqual(readHostVersion(libDir), '9.9.9');
|
||||
} finally {
|
||||
cleanup(root);
|
||||
}
|
||||
});
|
||||
|
||||
test('falls back to the runtime-root package.json when no VERSION file (dev/source tree)', () => {
|
||||
const { root, libDir } = fakeTree({ pkg: { version: '2.3.4' } });
|
||||
try {
|
||||
assert.strictEqual(readHostVersion(libDir), '2.3.4');
|
||||
} finally {
|
||||
cleanup(root);
|
||||
}
|
||||
});
|
||||
|
||||
test('fail-closes to 0.0.0 when neither VERSION nor a package.json version resolves', () => {
|
||||
const { root, libDir } = fakeTree({});
|
||||
try {
|
||||
assert.strictEqual(readHostVersion(libDir), '0.0.0');
|
||||
} finally {
|
||||
cleanup(root);
|
||||
}
|
||||
});
|
||||
|
||||
test('a real global install writes gsd-core/VERSION carrying the host version', () => {
|
||||
const dir = realInstall();
|
||||
try {
|
||||
const vfile = path.join(dir, 'gsd-core', 'VERSION');
|
||||
assert.ok(fs.existsSync(vfile), 'installer must write gsd-core/VERSION');
|
||||
assert.strictEqual(
|
||||
fs.readFileSync(vfile, 'utf8').trim(),
|
||||
require('../package.json').version,
|
||||
'gsd-core/VERSION must carry the real host version readHostVersion() reads',
|
||||
);
|
||||
} finally {
|
||||
cleanup(dir);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Gap 2 — the installer ships (and uninstalls / manifest-tracks) the capability
|
||||
// registry generator scripts.
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/** Run a real global install into a fresh temp config dir; return that dir. */
|
||||
function realInstall() {
|
||||
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-1920-'));
|
||||
// The module-level GSD_TEST_MODE=1 gates the installer's main() off entirely —
|
||||
// strip it from the child env for the spawned REAL install.
|
||||
const childEnv = { ...process.env };
|
||||
delete childEnv.GSD_TEST_MODE;
|
||||
const res = spawnSync(
|
||||
process.execPath,
|
||||
[INSTALL, '--claude', '--global', '--config-dir', dir],
|
||||
{ encoding: 'utf8', timeout: 120000, env: childEnv },
|
||||
);
|
||||
assert.strictEqual(res.status, 0, `install --claude failed: ${res.stderr || res.stdout}`);
|
||||
return dir;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Gap 1 (end-to-end CLI) — the actual repro: `gsd-tools capability install` on an
|
||||
// INSTALLED layout must resolve the real host version for the engines.gsd gate, not
|
||||
// 0.0.0. The dev tree always has a versioned package.json two levels up, so this only
|
||||
// reproduces against a real install (where ../../package.json is the versionless marker
|
||||
// and gsd-core/VERSION carries the truth). The CLI computes hostVersion itself, so this
|
||||
// covers capHostVersion() in gsd-tools.cjs — a path the loader unit test does not touch.
|
||||
// ---------------------------------------------------------------------------
|
||||
describe('Gap 1 (end-to-end CLI): installed capability install uses the real host version (#1920)', () => {
|
||||
const HOST_MAJOR = require('../package.json').version.split('.')[0];
|
||||
|
||||
function writeProbeCapability(engines) {
|
||||
const src = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-1920-cap-'));
|
||||
const cap = {
|
||||
id: 'p1920-probe', role: 'feature', version: '1.0.0', title: 'probe',
|
||||
description: 'test capability', tier: 'standard', requires: [],
|
||||
runtimeCompat: { supported: ['*'], unsupported: [] },
|
||||
skills: [], agents: [], hooks: [], config: {}, steps: [],
|
||||
contributions: [], gates: [], engines,
|
||||
};
|
||||
fs.writeFileSync(path.join(src, 'capability.json'), JSON.stringify(cap, null, 2));
|
||||
return src;
|
||||
}
|
||||
|
||||
test('a capability requiring engines.gsd ">=<host major>.0.0" is not rejected as GSD 0.0.0', () => {
|
||||
const dir = realInstall();
|
||||
const home = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-1920-home-'));
|
||||
const cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-1920-cwd-'));
|
||||
fs.mkdirSync(path.join(cwd, '.planning'), { recursive: true });
|
||||
fs.writeFileSync(path.join(cwd, '.planning', 'config.json'), '{}');
|
||||
const src = writeProbeCapability({ gsd: `>=${HOST_MAJOR}.0.0` });
|
||||
try {
|
||||
const installedTools = path.join(dir, 'gsd-core', 'bin', 'gsd-tools.cjs');
|
||||
const env = { ...process.env, GSD_HOME: home, GSD_WORKSTREAM: '', GSD_PROJECT: '', GSD_SESSION_KEY: '', CLAUDE_SESSION_ID: '' };
|
||||
delete env.GSD_TEST_MODE;
|
||||
const res = spawnSync(
|
||||
process.execPath,
|
||||
[installedTools, 'capability', 'install', src, '--scope', 'global', '--yes', '--json'],
|
||||
{ cwd, env, encoding: 'utf8', timeout: 60000 },
|
||||
);
|
||||
const combined = `${res.stdout || ''}\n${res.stderr || ''}`;
|
||||
assert.doesNotMatch(
|
||||
combined,
|
||||
/incompatible with GSD 0\.0\.0/,
|
||||
`installed CLI saw host version 0.0.0 — the engines gate read the versionless marker: ${combined}`,
|
||||
);
|
||||
assert.strictEqual(res.status, 0, `capability install failed on the installed layout: ${combined}`);
|
||||
} finally {
|
||||
cleanup(dir); cleanup(home); cleanup(cwd); cleanup(src);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('Gap 2: installer ships the capability registry generator scripts (#1920)', () => {
|
||||
test('the generator scripts are copied into scripts/', () => {
|
||||
const dir = realInstall();
|
||||
try {
|
||||
for (const gen of GENERATORS) {
|
||||
const dest = path.join(dir, 'scripts', gen);
|
||||
assert.ok(fs.existsSync(dest), `installer must ship scripts/${gen}`);
|
||||
assert.ok(fs.statSync(dest).size > 0, `scripts/${gen} must not be empty`);
|
||||
}
|
||||
} finally {
|
||||
cleanup(dir);
|
||||
}
|
||||
});
|
||||
|
||||
test('the shipped generator scripts are tracked in the file manifest', () => {
|
||||
const dir = realInstall();
|
||||
try {
|
||||
const manifest = JSON.parse(fs.readFileSync(path.join(dir, MANIFEST_NAME), 'utf8'));
|
||||
for (const gen of GENERATORS) {
|
||||
assert.ok(
|
||||
manifest.files[`scripts/${gen}`],
|
||||
`manifest must track scripts/${gen} for drift/uninstall accounting`,
|
||||
);
|
||||
}
|
||||
} finally {
|
||||
cleanup(dir);
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -37,7 +37,7 @@
|
||||
"agents/gsd-verifier.md": "d2bd23b62f95a64f",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "775a6f3d86f8e5e3",
|
||||
"gsd-core/bin/gsd-tools.cjs": "815b92a0e7b7693e",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268",
|
||||
@@ -331,6 +331,8 @@
|
||||
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
|
||||
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
|
||||
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
|
||||
"scripts/gen-capability-registry.cjs": "c52201ff4d1c2cd7",
|
||||
"scripts/gen-loop-host-contract.cjs": "c7f15237234811a0",
|
||||
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
|
||||
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
|
||||
"skills/gsd-add-tests/SKILL.md": "95cd3eb1698fc79b",
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
"commands/gsd-workstreams.md": "52ab9c585d3a00f3",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "43e6c5810defe512",
|
||||
"gsd-core/bin/gsd-tools.cjs": "4456f5432471af00",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268",
|
||||
@@ -400,6 +400,8 @@
|
||||
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
|
||||
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
|
||||
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
|
||||
"scripts/gen-capability-registry.cjs": "c52201ff4d1c2cd7",
|
||||
"scripts/gen-loop-host-contract.cjs": "c7f15237234811a0",
|
||||
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
|
||||
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
|
||||
"skills/gsd-ns-context/SKILL.md": "90ff2716402f8f61",
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
"agents/gsd-verifier.md": "d62ffb1f520520c0",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "43e6c5810defe512",
|
||||
"gsd-core/bin/gsd-tools.cjs": "4456f5432471af00",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268",
|
||||
@@ -330,6 +330,8 @@
|
||||
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
|
||||
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
|
||||
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
|
||||
"scripts/gen-capability-registry.cjs": "c52201ff4d1c2cd7",
|
||||
"scripts/gen-loop-host-contract.cjs": "c7f15237234811a0",
|
||||
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
|
||||
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
|
||||
"skills/gsd-add-tests/SKILL.md": "6661195a66f25ae8",
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
"agents/gsd-verifier.md": "5645dfb20b787f01",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "43e6c5810defe512",
|
||||
"gsd-core/bin/gsd-tools.cjs": "4456f5432471af00",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268",
|
||||
@@ -312,6 +312,8 @@
|
||||
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
|
||||
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
|
||||
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
|
||||
"scripts/gen-capability-registry.cjs": "c52201ff4d1c2cd7",
|
||||
"scripts/gen-loop-host-contract.cjs": "c7f15237234811a0",
|
||||
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
|
||||
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
|
||||
"skills/gsd-ns-context/SKILL.md": "e278a50f3ecb8f56",
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
"commands/gsd-workstreams.md": "884b6c8d648422c7",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "43e6c5810defe512",
|
||||
"gsd-core/bin/gsd-tools.cjs": "4456f5432471af00",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268",
|
||||
@@ -400,6 +400,8 @@
|
||||
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
|
||||
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
|
||||
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
|
||||
"scripts/gen-capability-registry.cjs": "c52201ff4d1c2cd7",
|
||||
"scripts/gen-loop-host-contract.cjs": "c7f15237234811a0",
|
||||
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
|
||||
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
|
||||
"skills/gsd-add-tests/SKILL.md": "60dd7f9779d5f493",
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
"config.toml": "a34316b9ac61a620",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "43e6c5810defe512",
|
||||
"gsd-core/bin/gsd-tools.cjs": "4456f5432471af00",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268",
|
||||
@@ -346,6 +346,8 @@
|
||||
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
|
||||
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
|
||||
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
|
||||
"scripts/gen-capability-registry.cjs": "c52201ff4d1c2cd7",
|
||||
"scripts/gen-loop-host-contract.cjs": "c7f15237234811a0",
|
||||
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
|
||||
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
|
||||
"skills/gsd-add-tests/SKILL.md": "f3c1594a059de3ee",
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
"copilot-instructions.md": "1fb04111759f1645",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "775a6f3d86f8e5e3",
|
||||
"gsd-core/bin/gsd-tools.cjs": "815b92a0e7b7693e",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268",
|
||||
@@ -311,6 +311,8 @@
|
||||
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
|
||||
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
|
||||
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
|
||||
"scripts/gen-capability-registry.cjs": "c52201ff4d1c2cd7",
|
||||
"scripts/gen-loop-host-contract.cjs": "c7f15237234811a0",
|
||||
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
|
||||
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
|
||||
"skills/gsd-add-tests/SKILL.md": "dfe3f8a07f34c438",
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
"commands/gsd-workstreams.md": "112660ceb663c750",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "775a6f3d86f8e5e3",
|
||||
"gsd-core/bin/gsd-tools.cjs": "815b92a0e7b7693e",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268",
|
||||
@@ -380,6 +380,8 @@
|
||||
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
|
||||
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
|
||||
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
|
||||
"scripts/gen-capability-registry.cjs": "c52201ff4d1c2cd7",
|
||||
"scripts/gen-loop-host-contract.cjs": "c7f15237234811a0",
|
||||
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
|
||||
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
|
||||
"skills/gsd-add-tests/SKILL.md": "2cfc1922a2c0f308",
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
"commands/gsd/workstreams.toml": "95f0c349b808a84c",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "43e6c5810defe512",
|
||||
"gsd-core/bin/gsd-tools.cjs": "4456f5432471af00",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268",
|
||||
@@ -400,6 +400,8 @@
|
||||
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
|
||||
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
|
||||
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
|
||||
"scripts/gen-capability-registry.cjs": "c52201ff4d1c2cd7",
|
||||
"scripts/gen-loop-host-contract.cjs": "c7f15237234811a0",
|
||||
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
|
||||
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7"
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
"agents/gsd-verifier.md": "c5916e463df6306e",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "43e6c5810defe512",
|
||||
"gsd-core/bin/gsd-tools.cjs": "4456f5432471af00",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268",
|
||||
@@ -331,6 +331,8 @@
|
||||
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
|
||||
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
|
||||
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
|
||||
"scripts/gen-capability-registry.cjs": "c52201ff4d1c2cd7",
|
||||
"scripts/gen-loop-host-contract.cjs": "c7f15237234811a0",
|
||||
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
|
||||
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
|
||||
"skills/gsd/DESCRIPTION.md": "d93e29a1a09cfd11",
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
"command/gsd-workstreams.md": "5e57eed1881c3891",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "43e6c5810defe512",
|
||||
"gsd-core/bin/gsd-tools.cjs": "4456f5432471af00",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268",
|
||||
@@ -401,6 +401,8 @@
|
||||
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
|
||||
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
|
||||
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
|
||||
"scripts/gen-capability-registry.cjs": "c52201ff4d1c2cd7",
|
||||
"scripts/gen-loop-host-contract.cjs": "c7f15237234811a0",
|
||||
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
|
||||
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
|
||||
"skills/gsd-add-tests/SKILL.md": "addc3a220961a9c7",
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
"agents/subagents/gsd-verifier.yaml": "2d2bd6b37626f382",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "43e6c5810defe512",
|
||||
"gsd-core/bin/gsd-tools.cjs": "4456f5432471af00",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268",
|
||||
@@ -345,6 +345,8 @@
|
||||
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
|
||||
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
|
||||
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
|
||||
"scripts/gen-capability-registry.cjs": "c52201ff4d1c2cd7",
|
||||
"scripts/gen-loop-host-contract.cjs": "c7f15237234811a0",
|
||||
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
|
||||
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
|
||||
"skills/gsd-add-tests/SKILL.md": "217fc2587d3e7ec2",
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
"command/gsd-workstreams.md": "5e57eed1881c3891",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "43e6c5810defe512",
|
||||
"gsd-core/bin/gsd-tools.cjs": "4456f5432471af00",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268",
|
||||
@@ -402,6 +402,8 @@
|
||||
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
|
||||
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
|
||||
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
|
||||
"scripts/gen-capability-registry.cjs": "c52201ff4d1c2cd7",
|
||||
"scripts/gen-loop-host-contract.cjs": "c7f15237234811a0",
|
||||
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
|
||||
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
|
||||
"skills/gsd-add-tests/SKILL.md": "f60794b90b48cbac",
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
"agents/gsd-verifier.md": "7286d42f73e54be1",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "43e6c5810defe512",
|
||||
"gsd-core/bin/gsd-tools.cjs": "4456f5432471af00",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268",
|
||||
@@ -331,6 +331,8 @@
|
||||
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
|
||||
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
|
||||
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
|
||||
"scripts/gen-capability-registry.cjs": "c52201ff4d1c2cd7",
|
||||
"scripts/gen-loop-host-contract.cjs": "c7f15237234811a0",
|
||||
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
|
||||
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
|
||||
"skills/gsd-ns-context/SKILL.md": "654c71262d91650c",
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
"agents/gsd-verifier.md": "2fef6afe676b0e34",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "775a6f3d86f8e5e3",
|
||||
"gsd-core/bin/gsd-tools.cjs": "815b92a0e7b7693e",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268",
|
||||
@@ -309,6 +309,8 @@
|
||||
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
|
||||
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
|
||||
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
|
||||
"scripts/gen-capability-registry.cjs": "c52201ff4d1c2cd7",
|
||||
"scripts/gen-loop-host-contract.cjs": "c7f15237234811a0",
|
||||
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
|
||||
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
|
||||
"skills/gsd-ns-context/SKILL.md": "e278a50f3ecb8f56",
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
"agents/gsd-verifier.md": "b16b34a580941124",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "775a6f3d86f8e5e3",
|
||||
"gsd-core/bin/gsd-tools.cjs": "815b92a0e7b7693e",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "7d398e94c44e5268",
|
||||
@@ -309,6 +309,8 @@
|
||||
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
|
||||
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
|
||||
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
|
||||
"scripts/gen-capability-registry.cjs": "c52201ff4d1c2cd7",
|
||||
"scripts/gen-loop-host-contract.cjs": "c7f15237234811a0",
|
||||
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
|
||||
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user