* refactor(#1734): extract install engine from bin/install.js (ADR-1239 Phase B deep move) Relocate the runtime-artifact install cluster out of the 12,490-line bin/install.js into a dedicated src/install-engine.cts -> install-engine.cjs: installRuntimeArtifacts, uninstallRuntimeArtifacts, installOpencodeFamilySkills, and their cluster helpers (_copyStaged, snapshot/restore, legacy migration, GSD-entry pruning, preserve/restoreUserArtifacts, OpenCode-family converters, USER_OWNED_ARTIFACTS). - bin/install.js imports the engine and re-exports the moved symbols for back-compat; getCommitAttribution STAYS in install.js (impure config I/O + argv explicitConfigDir global) and is injected via a resolveAttribution param. - 17 test files migrated to import the moved symbols from the engine. - Bookkeeping: eslint built-artifact ignore, .gitignore, INVENTORY manifest+row, CONTEXT.md Install Engine Module glossary seam. Behaviour-preserving: install output is byte-identical for all 16 runtimes (golden-parity harness #1730) — the only delta is the new install-engine.cjs file shipping in the installed gsd-core/bin/lib/ tree. Closes #1734 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore(#1734): backfill changeset PR number (#1735) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: review-bot <review-bot@gsd>
This commit is contained in:
5
.changeset/patient-otters-wave.md
Normal file
5
.changeset/patient-otters-wave.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
type: Changed
|
||||
pr: 1735
|
||||
---
|
||||
**Internal: extracted the runtime-artifact install engine from `bin/install.js`** — `installRuntimeArtifacts`/`uninstallRuntimeArtifacts`/`installOpencodeFamilySkills` and their helpers now live in a dedicated `gsd-core/bin/lib/install-engine.cjs` module (ADR-1239 Phase B), so adapters can import the install pipeline instead of reaching into the 12k-line installer. Install output is byte-identical for all 16 runtimes (golden-parity asserted); no user-facing behaviour change.
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -68,6 +68,7 @@ build/
|
||||
# Published via prepublishOnly; built before test via pretest. Grows as modules migrate.
|
||||
/tsconfig.build.tsbuildinfo
|
||||
/gsd-core/bin/lib/host-integration.cjs
|
||||
/gsd-core/bin/lib/install-engine.cjs
|
||||
/gsd-core/bin/lib/capability-loader.cjs
|
||||
/gsd-core/bin/lib/capability-source.cjs
|
||||
/gsd-core/bin/lib/capability-ledger.cjs
|
||||
|
||||
@@ -121,6 +121,9 @@ Module owning runtime identity normalization at runtime-selection seams. Canonic
|
||||
### Host-Integration Interface
|
||||
Pure, additive, no-I/O Module owning the versioned, negotiated contract over the six host-integration interface points (command, dispatch, model, hooks, state, artifact) — ADR-1239 Phase A. Extends the ADR-1016 runtime descriptor with eight closed-vocabulary axes carried under `capability.json` `runtime.hostIntegration`: `embeddingMode` (`imperative|declarative`), `commandSurface` (`slash-file|slash-programmatic|slash-toml|palette|prose-only`), `dispatch` (`{namedDispatch,nested,maxDepth,background,backgroundDispatch,subagentToolkit}`), `modelMode` (`active|passive`), `hookBus` (`host|engine|none`), `stateIO` (`filesystem|sandboxed-storage|session-log-append`), `transport` (`mcp|native-extension`), `runtime` (`node|bun|sandboxed-web|python|go|rust|electron|other`). Interface: `negotiateHostCapabilities(host, engine?) → { protocolVersion, effective, points, warnings }` enforcing the trust-boundary invariant `effective ⊆ host-declared ∩ engine-known` (never augment with an undeclared or unknown/future-`protocolVersion` value — fail-closed via the most-restrictive-known `SAFE_DEFAULTS`); `degradationFor(point, axes) → { level, fallback }` (a pure Full/Degraded/Absent ladder table, never throws); `profileOf(axes) → 'programmatic-cli'|'declarative-cli'|'ide'|null`; plus `PROTOCOL_VERSION` (integer, starts at 1 — distinct from the package `version`/`engines.gsd` semver), `HOST_INTEGRATION_AXES` (the frozen closed vocabulary, single source of truth), `PROFILE_BASELINES`, and `shouldFlattenDispatch(dispatch) → boolean` (ADR-1239 Phase B / #1708 — graduates the #853 rule: returns `true` = run the orchestrator inline UNLESS the host is documented to background a nesting-capable orchestrator (`background === true && backgroundDispatch === true`); fail-closed to inline; exposed to the plan/execute workflows via the `gsd_run query dispatch-should-flatten --raw` CLI, which replaced the former scattered `RUNTIME === 'codex'` prose check). The runtime-descriptor validator (`gsd-core/bin/lib/capability-validator.cjs` `validateRuntimeBody`) mirrors the closed vocabulary inline (exported as `_HOST_INTEGRATION_VOCAB`) and is kept in lock-step by the parity guard `tests/host-integration-validator-parity.test.cjs`. Orthogonal axes (resolved explicitly per ADR-1239 Phase A): `commandStyle` (GSD emission style, retained) vs `commandSurface` (host surface type); `hookEvents` dialect vs `hookBus` ownership (a host with `hooksSurface:none` may still be `hookBus:host` — e.g. opencode); `runtimeCompat` (feature→host) vs these negotiated runtime→engine axes. Phase A defined the interface; Phase B (#1679) wires it incrementally — `destSubpath` write-confinement (#1704) and the typed documentation-sourced #853 dispatch-flatten (#1708, the first consumer of a negotiated `dispatch` axis); adapters/MCP/host-bindings remain Phases C–E. Source of truth: `gsd-core/bin/lib/host-integration.cjs` (generated from `src/host-integration.cts`). See ADR-1239 and ADR-1016.
|
||||
|
||||
### Install Engine Module
|
||||
Module owning the layout-driven runtime-artifact install pipeline — `installRuntimeArtifacts`, `uninstallRuntimeArtifacts`, `installOpencodeFamilySkills`, and their cluster helpers (`_copyStaged`, `_snapshotDir`/`_restoreDir`, legacy-migration + GSD-entry pruning, user-artifact preserve/restore). Extracted from the 12k-line `bin/install.js` (ADR-1239 Phase B, #1679) so adapters import the engine instead of reaching into the installer. Commit-attribution resolution stays in `bin/install.js` and is injected via a `resolveAttribution` parameter (the engine takes no config I/O). Source: `src/install-engine.cts` -> `gsd-core/bin/lib/install-engine.cjs`.
|
||||
|
||||
### Installer Migration Authoring Guard Module
|
||||
Module owning validation for Installer Migration Module records and planned actions. It enforces migration metadata, explicit install scopes, ownership evidence for destructive/config actions, and runtime contract citations for runtime config rewrites before a migration can enter planning or apply.
|
||||
|
||||
|
||||
877
bin/install.js
877
bin/install.js
@@ -376,6 +376,31 @@ const {
|
||||
updateCacheFileName,
|
||||
} = require(path.join(__dirname, '..', 'gsd-core', 'bin', 'lib', 'package-identity.cjs'));
|
||||
|
||||
// ADR-1239 Phase B: runtime-artifact install cluster extracted to install-engine.cjs.
|
||||
// getCommitAttribution STAYS here (impure install-time config I/O); it is injected
|
||||
// into the engine functions via the resolveAttribution parameter at each call site.
|
||||
const installEngine = require(path.join(_gsdLibDir, 'install-engine.cjs'));
|
||||
const {
|
||||
installRuntimeArtifacts,
|
||||
uninstallRuntimeArtifacts,
|
||||
installOpencodeFamilySkills,
|
||||
_copyStaged,
|
||||
hasExistingSymlinkBetween,
|
||||
preserveUserArtifacts,
|
||||
restoreUserArtifacts,
|
||||
migrateLegacyDevPreferencesToSkill,
|
||||
applyOpencodeFamilyPathPrefix,
|
||||
convertClaudeCommandToOpencodeSkill,
|
||||
convertClaudeCommandToKiloSkill,
|
||||
USER_OWNED_ARTIFACTS,
|
||||
_runLegacyInstallMigrations,
|
||||
_runLegacyUninstallCleanup,
|
||||
_removeGsdEntries,
|
||||
_snapshotDir,
|
||||
_restoreDir,
|
||||
_removeHermesBareStemDirs,
|
||||
} = installEngine;
|
||||
|
||||
// Parse args
|
||||
const args = process.argv.slice(2);
|
||||
const hasGlobal = args.includes('--global') || args.includes('-g');
|
||||
@@ -6267,69 +6292,9 @@ function convertClaudeToKiloFrontmatter(content, { isAgent = false } = {}) {
|
||||
return `---\n${newFrontmatter}\n---${body}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shared SKILL.md writer for the OpenCode-family runtimes (OpenCode + Kilo),
|
||||
* which share a config schema (Kilo derives from OpenCode). OpenCode discovers
|
||||
* skills as `skills/<name>/SKILL.md` and Kilo follows the same layout
|
||||
* (https://opencode.ai/docs/skills, https://kilo.ai/docs/customize/skills).
|
||||
*
|
||||
* The skill body reuses the runtime's command-frontmatter converter for tool,
|
||||
* path, and `/gsd:`→`/gsd-` body rewrites, then rebuilds a minimal skill
|
||||
* frontmatter: only `name` (lowercase-hyphen, must match the containing
|
||||
* directory) and `description` (1–1024 chars) are emitted, per the OpenCode
|
||||
* skill spec. The command's `tools:`/`permission:` block is intentionally
|
||||
* dropped — OpenCode skills are loaded on-demand via the native skill tool and
|
||||
* inherit the calling agent's permissions.
|
||||
*
|
||||
* @param {string} content - Claude command markdown (with YAML frontmatter)
|
||||
* @param {string} skillName - Skill directory name (e.g. gsd-help)
|
||||
* @param {(content: string) => string} frontmatterConverter - runtime command converter
|
||||
* @returns {string} SKILL.md content
|
||||
*/
|
||||
function convertClaudeCommandToOpencodeFamilySkill(content, skillName, frontmatterConverter) {
|
||||
const converted = frontmatterConverter(content);
|
||||
const { frontmatter, body } = extractFrontmatterAndBody(converted);
|
||||
let description = `Run GSD workflow ${skillName}.`;
|
||||
if (frontmatter) {
|
||||
const maybeDescription = extractFrontmatterField(frontmatter, 'description');
|
||||
if (maybeDescription) {
|
||||
description = maybeDescription;
|
||||
}
|
||||
}
|
||||
description = toSingleLine(description);
|
||||
// OpenCode skill descriptions must be 1–1024 characters.
|
||||
if (description.length > 1024) {
|
||||
description = `${description.slice(0, 1021)}...`;
|
||||
}
|
||||
// `name` must be lowercase alphanumeric with single-hyphen separators and
|
||||
// match the containing directory name (the staged dir is `${skillName}/`).
|
||||
const name = yamlIdentifier(skillName);
|
||||
return `---\nname: ${name}\ndescription: ${yamlQuote(description)}\n---\n\n${body.trimStart()}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a Claude command (.md) to an OpenCode skill (SKILL.md).
|
||||
* Thin wrapper over the shared OpenCode-family writer.
|
||||
*/
|
||||
function convertClaudeCommandToOpencodeSkill(content, skillName) {
|
||||
return convertClaudeCommandToOpencodeFamilySkill(
|
||||
content,
|
||||
skillName,
|
||||
(c) => convertClaudeToOpencodeFrontmatter(c),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a Claude command (.md) to a Kilo skill (SKILL.md).
|
||||
* Thin wrapper over the shared OpenCode-family writer (Kilo shares the schema).
|
||||
*/
|
||||
function convertClaudeCommandToKiloSkill(content, skillName) {
|
||||
return convertClaudeCommandToOpencodeFamilySkill(
|
||||
content,
|
||||
skillName,
|
||||
(c) => convertClaudeToKiloFrontmatter(c),
|
||||
);
|
||||
}
|
||||
// convertClaudeCommandToOpencodeFamilySkill, convertClaudeCommandToOpencodeSkill,
|
||||
// convertClaudeCommandToKiloSkill: moved to src/install-engine.cts (ADR-1239 Phase B).
|
||||
// Imported from installEngine above.
|
||||
|
||||
/**
|
||||
* Convert Claude Code markdown command to Gemini TOML format
|
||||
@@ -6412,30 +6377,8 @@ function convertClaudeToGeminiToml(content, { commandName = null } = {}) {
|
||||
* @param {string} pathPrefix - Path prefix for file references
|
||||
* @param {string} runtime - Target runtime ('claude', 'opencode', or 'kilo')
|
||||
*/
|
||||
/**
|
||||
* Apply OpenCode-family (`opencode`/`kilo`) `@file` path-prefix rewrites to a
|
||||
* RAW Claude command/skill body, BEFORE the frontmatter converter runs.
|
||||
*
|
||||
* This is the single source of truth shared by copyFlattenedCommands (commands)
|
||||
* and installOpencodeFamilySkills (skills) so the two surfaces produce identical
|
||||
* path references. Applying pathPrefix pre-conversion (rather than rewriting an
|
||||
* already-converted body) is what avoids the converter's hardcoded default
|
||||
* config dir leaking into --local / --config-dir installs, and the
|
||||
* prefix-overlap double-rewrite hazard for custom dirs like `kilo-alt`. (#784)
|
||||
*
|
||||
* @param {string} content - raw Claude command markdown
|
||||
* @param {string} runtime - 'opencode' or 'kilo'
|
||||
* @param {string} pathPrefix - trailing-slash install-target prefix
|
||||
* @returns {string}
|
||||
*/
|
||||
function applyOpencodeFamilyPathPrefix(content, runtime, pathPrefix) {
|
||||
content = content.replace(/~\/\.claude\//g, pathPrefix);
|
||||
content = content.replace(/\$HOME\/\.claude\//g, pathPrefix);
|
||||
content = content.replace(/\.\/\.claude\//g, `./${getDirName(runtime)}/`);
|
||||
content = content.replace(/~\/\.opencode\//g, pathPrefix);
|
||||
content = content.replace(/~\/\.kilo\//g, pathPrefix);
|
||||
return content;
|
||||
}
|
||||
// applyOpencodeFamilyPathPrefix: moved to src/install-engine.cts (ADR-1239 Phase B).
|
||||
// Imported from installEngine above.
|
||||
|
||||
function copyFlattenedCommands(srcDir, destDir, prefix, pathPrefix, runtime) {
|
||||
if (!fs.existsSync(srcDir)) {
|
||||
@@ -6574,734 +6517,22 @@ function writeHermesCategoryDescription(categoryDir) {
|
||||
* @param {boolean} isGlobal - Whether this is a global install
|
||||
*/
|
||||
|
||||
/**
|
||||
* Single source of truth for user-owned artifacts inside gsd-core/.
|
||||
*
|
||||
* These files are created/refreshed by user-facing workflows (e.g.
|
||||
* /gsd-profile-user) and must be preserved across reinstalls. Critically, they
|
||||
* MUST be excluded from gsd-file-manifest.json — otherwise saveLocalPatches()
|
||||
* will compare a refreshed file against a stale manifest hash and emit a
|
||||
* spurious "locally modified GSD file" warning (bug #2771).
|
||||
*
|
||||
* Invariant: a file is either distribution (manifest-tracked, diff'd against
|
||||
* manifest) or user artifact (preserved across installs, never diff'd). Never
|
||||
* both. Both preserveUserArtifacts call sites and writeManifest must agree on
|
||||
* this list, which is why it lives here as a single constant.
|
||||
*
|
||||
* Paths are relative to the gsd-core/ directory.
|
||||
*/
|
||||
const USER_OWNED_ARTIFACTS = ['USER-PROFILE.md'];
|
||||
|
||||
/**
|
||||
* Save user-generated files from destDir to an in-memory map before a wipe.
|
||||
*
|
||||
* @param {string} destDir - Directory that is about to be wiped
|
||||
* @param {string[]} fileNames - Relative file names (e.g. ['USER-PROFILE.md']) to preserve
|
||||
* @returns {Map<string, string>} Map of fileName → file content (only entries that existed)
|
||||
*/
|
||||
function preserveUserArtifacts(destDir, fileNames) {
|
||||
const saved = new Map();
|
||||
for (const name of fileNames) {
|
||||
const fullPath = path.join(destDir, name);
|
||||
if (fs.existsSync(fullPath)) {
|
||||
try {
|
||||
saved.set(name, fs.readFileSync(fullPath, 'utf8'));
|
||||
} catch { /* skip unreadable files */ }
|
||||
}
|
||||
}
|
||||
return saved;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore user-generated files saved by preserveUserArtifacts after a wipe.
|
||||
*
|
||||
* @param {string} destDir - Directory that was wiped and recreated
|
||||
* @param {Map<string, string>} saved - Map returned by preserveUserArtifacts
|
||||
*/
|
||||
function restoreUserArtifacts(destDir, saved) {
|
||||
for (const [name, content] of saved) {
|
||||
const fullPath = path.join(destDir, name);
|
||||
try {
|
||||
fs.mkdirSync(path.dirname(fullPath), { recursive: true });
|
||||
fs.writeFileSync(fullPath, content, 'utf8');
|
||||
} catch { /* skip unwritable paths */ }
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Migrate a legacy dev-preferences.md (saved from commands/gsd/) into the
|
||||
* runtime-aware SKILL.md location used by the writer after #2973.
|
||||
*
|
||||
* For runtimes with a nested skills layout (e.g. Hermes: skills/gsd/<stem>/),
|
||||
* the target is <configDir>/skills/gsd/dev-preferences/SKILL.md.
|
||||
* For runtimes with a flat skills layout (prefix='gsd-'), the target is
|
||||
* <configDir>/skills/gsd-dev-preferences/SKILL.md.
|
||||
*
|
||||
* Skips silently if no legacy file was preserved, or if a SKILL.md already
|
||||
* exists at the new location (don't clobber user-customized skill content
|
||||
* — they may have edited the new file directly). Returns true on actual
|
||||
* migration so callers can log a one-line confirmation.
|
||||
*
|
||||
* @param {string} targetDir - Resolved runtime config directory (e.g. ~/.claude)
|
||||
* @param {Map<string, string>} saved - Map returned by preserveUserArtifacts
|
||||
* @param {string} [runtime] - canonical runtime ID (e.g. 'hermes', 'qwen', 'claude')
|
||||
* @param {'global'|'local'} [scope] - install scope
|
||||
* @returns {boolean} - true if a file was migrated, false otherwise
|
||||
*/
|
||||
function migrateLegacyDevPreferencesToSkill(targetDir, saved, runtime, scope = 'global') {
|
||||
if (!saved || !saved.has('dev-preferences.md')) return false;
|
||||
let skillDir;
|
||||
if (runtime) {
|
||||
const layout = resolveRuntimeArtifactLayout(runtime, targetDir, scope);
|
||||
const skillsKindEntry = layout.kinds.find((k) => k.kind === 'skills');
|
||||
if (!skillsKindEntry) return false; // runtime has no skills layout at this scope (e.g. cline local)
|
||||
const stemName = skillsKindEntry.prefix === '' ? 'dev-preferences' : 'gsd-dev-preferences';
|
||||
skillDir = path.join(assertDestWithinConfigHome(targetDir, skillsKindEntry.destSubpath), stemName);
|
||||
} else {
|
||||
// Legacy fallback for callers that have not yet been updated to pass runtime
|
||||
skillDir = path.join(assertDestWithinConfigHome(targetDir, 'skills'), 'gsd-dev-preferences');
|
||||
}
|
||||
const skillFile = path.join(skillDir, 'SKILL.md');
|
||||
if (fs.existsSync(skillFile)) return false;
|
||||
// Symlink-escape guard: reject if any path component between targetDir and
|
||||
// skillDir is a symlink that would redirect writes outside the config root.
|
||||
if (hasExistingSymlinkBetween(path.resolve(targetDir), skillDir)) {
|
||||
throw new Error(
|
||||
`migrateLegacyDevPreferencesToSkill: skillDir "${skillDir}" contains a symlink escaping the install root "${targetDir}" — refusing to write`,
|
||||
);
|
||||
}
|
||||
try {
|
||||
fs.mkdirSync(skillDir, { recursive: true });
|
||||
fs.writeFileSync(skillFile, saved.get('dev-preferences.md'), 'utf8');
|
||||
return true;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// USER_OWNED_ARTIFACTS, preserveUserArtifacts, restoreUserArtifacts,
|
||||
// migrateLegacyDevPreferencesToSkill, _copyStaged, _removeGsdEntries,
|
||||
// _runLegacyInstallMigrations, _runLegacyUninstallCleanup, _snapshotDir,
|
||||
// _restoreDir, _removeHermesBareStemDirs, installRuntimeArtifacts,
|
||||
// installOpencodeFamilySkills, uninstallRuntimeArtifacts:
|
||||
// ALL moved to src/install-engine.cts (ADR-1239 Phase B).
|
||||
// Imported from installEngine above.
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Phase 2 — Layout-driven install/uninstall orchestrators
|
||||
// Phase 2 — Layout-driven install/uninstall orchestrators (moved to engine)
|
||||
// _applyRuntimeRewrites / _stampNonClaudeRuntimeDefaults remain here for
|
||||
// call sites in copyWithPathReplacement (not moved).
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Apply per-runtime content rewrites in place across every SKILL.md inside a
|
||||
* staged directory. Reproduces the rewrite scaffolding that the old
|
||||
* copyCommandsAs<Runtime>Skills functions applied between read-content and
|
||||
* converter-call. Applied AFTER stage (which already called the converter);
|
||||
* rewrites target stable path patterns the converter doesn't touch.
|
||||
*
|
||||
* For Qwen/Hermes, branding rewrites (.claude/ → .qwen/ / .hermes/) run
|
||||
* AFTER the slash-form path replacements but they only catch bare `.claude/`
|
||||
* patterns (skill-body relative refs) that the slash forms didn't consume.
|
||||
* This mirrors the exact ordering in the legacy copyCommandsAsClaudeSkills body.
|
||||
*
|
||||
* @param {string} stagedDir
|
||||
* @param {string} runtime
|
||||
* @param {string} pathPrefix e.g. "~/.codex/" — trailing-slash string
|
||||
* @param {boolean} [isGlobal=false] true when the install is a global (home-dir) install
|
||||
*/
|
||||
// applyRuntimeContentRewritesInPlace: walk loop is now owned by
|
||||
// runtimeArtifactConversion.applyRuntimeContentRewritesInPlace (ADR-1508 / #1511 Phase 2).
|
||||
// The const binding above (~line 629) delegates here. Call sites in installRuntimeArtifacts
|
||||
// pass attribution as the 5th arg (getCommitAttribution(runtime)) per the new contract.
|
||||
|
||||
/**
|
||||
* Apply per-runtime content rewrites to flat .md files in a staged commands dir.
|
||||
* Used for runtimes that have a commandsKind in their layout and need content rewrites
|
||||
* (e.g. augment — replaces ~/.claude/ paths and applies branding conversions).
|
||||
*
|
||||
* IMPORTANT: `stageSkillsForProfile()` returns the original source directory unchanged
|
||||
* on a full/default profile (skills === '*'). This function MUST NOT mutate that source
|
||||
* directory. It always copies to a temp dir first, rewrites there, and returns the new
|
||||
* path so the caller installs from the temp copy, not the source.
|
||||
*
|
||||
* @param {string} stagedDir directory of staged flat .md command files (may be source dir)
|
||||
* @param {string} runtime
|
||||
* @param {string} pathPrefix
|
||||
* @param {boolean} [isGlobal=false] true when the install is a global (home-dir) install
|
||||
* @returns {string} path to a temp dir with rewritten files (caller is responsible for cleanup)
|
||||
*/
|
||||
// applyRuntimeContentRewritesForCommandsInPlace: copy+rewrite loop is now owned by
|
||||
// runtimeArtifactConversion.applyRuntimeContentRewritesForCommandsInPlace (ADR-1508 / #1511 Phase 2).
|
||||
// The const binding above (~line 630) delegates here. Call sites in installRuntimeArtifacts
|
||||
// pass attribution as the 5th arg (getCommitAttribution(runtime)) per the new contract.
|
||||
|
||||
/**
|
||||
* Apply the per-runtime rewrite table to a single content string.
|
||||
* Extracted so it can be unit-tested independently of the filesystem walk.
|
||||
*
|
||||
* @param {string} content
|
||||
* @param {string} runtime
|
||||
* @param {string} pathPrefix trailing-slash string
|
||||
* @param {boolean} [isGlobal=false] true when the install is a global (home-dir) install
|
||||
* @returns {string}
|
||||
*/
|
||||
// _applyRuntimeRewrites: single implementation lives in runtimeArtifactConversion
|
||||
// (ADR-1508 / #1511 Phase 2). Bound here so install.js call sites and exports are
|
||||
// reference-identical to the conversion module (consistent with the walkers above).
|
||||
// All call sites are below this line → no TDZ hazard.
|
||||
const _applyRuntimeRewrites = runtimeArtifactConversion._applyRuntimeRewrites;
|
||||
const _stampNonClaudeRuntimeDefaults = runtimeArtifactConversion._stampNonClaudeRuntimeDefaults;
|
||||
|
||||
/**
|
||||
* Copy a staged directory's contents into destDir.
|
||||
* Additive — does not prune (surface.cjs handles pruning).
|
||||
*
|
||||
* For skills kind: each child of stagedDir is a `${prefix}${stem}/` dir; copy
|
||||
* the whole dir into destDir.
|
||||
* For commands/agents kind: iterate .md files and write them into destDir.
|
||||
* - commands: write as `${prefix}${stem}.md` unless destSubpath already
|
||||
* encodes the GSD namespace as its last segment (e.g. `commands/gsd`), in
|
||||
* which case write as `${stem}.md` (directory IS the namespace).
|
||||
* - agents: write as-is (files already carry their own `gsd-` prefix).
|
||||
* For kimi-agents kind: recursively copy generated YAML/prompt files.
|
||||
*/
|
||||
function _copyStaged(stagedDir, destDir, kind, configDir) {
|
||||
// Defense-in-depth: verify destDir is within the install root even if the
|
||||
// upstream assertDestWithinConfigHome check was somehow bypassed. This guards
|
||||
// the actual write site against any future call-site drift.
|
||||
// Fail-closed: every _copyStaged write must declare its install root so the gate
|
||||
// can confine it. All callers pass configDir; an omitted root is a bug, not a copy.
|
||||
if (configDir === undefined) {
|
||||
throw new Error(
|
||||
'_copyStaged: configDir (install root) is required to confine writes — refusing to write',
|
||||
);
|
||||
}
|
||||
// Strict-subpath + NUL containment via the canonical gate (shared with the
|
||||
// layout-driven install plan); throws if destDir escapes the install root.
|
||||
// destDir here is an absolute path; path.resolve(configDir, absoluteDest) returns it unchanged, so the gate's strict-subpath check still correctly confines it to configDir.
|
||||
const resolvedDest = assertDestWithinConfigHome(configDir, destDir);
|
||||
// Symlink-escape guard: reject if any path component between configDir and
|
||||
// destDir is a symlink that would redirect writes outside configDir.
|
||||
if (hasExistingSymlinkBetween(path.resolve(configDir), resolvedDest)) {
|
||||
throw new Error(
|
||||
`_copyStaged: destDir "${destDir}" contains a symlink escaping the install root "${configDir}" — refusing to write`,
|
||||
);
|
||||
}
|
||||
// Use the validated absolute path for the actual writes below.
|
||||
destDir = resolvedDest;
|
||||
if (!fs.existsSync(stagedDir)) return;
|
||||
fs.mkdirSync(destDir, { recursive: true });
|
||||
|
||||
if (kind.kind === 'skills') {
|
||||
// Each child of stagedDir is a prefixed skill directory: gsd-help/, etc.
|
||||
for (const entry of fs.readdirSync(stagedDir, { withFileTypes: true })) {
|
||||
if (!entry.isDirectory()) continue;
|
||||
const src = path.join(stagedDir, entry.name);
|
||||
const dest = path.join(destDir, entry.name);
|
||||
fs.cpSync(src, dest, { recursive: true });
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (kind.kind === 'kimi-agents') {
|
||||
fs.cpSync(stagedDir, destDir, { recursive: true });
|
||||
return;
|
||||
}
|
||||
|
||||
// commands or agents
|
||||
const entries = fs.readdirSync(stagedDir, { withFileTypes: true });
|
||||
// For commands: apply prefix unless the destSubpath's last segment already
|
||||
// represents the GSD namespace (e.g. 'commands/gsd' → last segment 'gsd').
|
||||
const destLast = path.basename(kind.destSubpath);
|
||||
const prefixStem = kind.prefix ? kind.prefix.replace(/-$/, '') : '';
|
||||
const namespacedByDir = kind.kind === 'commands' && destLast === prefixStem;
|
||||
|
||||
for (const entry of entries) {
|
||||
if (!entry.isFile()) continue;
|
||||
if (!entry.name.endsWith('.md')) continue;
|
||||
const stem = entry.name.slice(0, -3); // strip .md
|
||||
|
||||
let destName;
|
||||
if (kind.kind === 'agents') {
|
||||
// Agent files already carry the gsd- prefix in the source dir
|
||||
destName = entry.name;
|
||||
} else if (namespacedByDir) {
|
||||
// Directory is the namespace; don't double-prefix the filename
|
||||
destName = entry.name;
|
||||
} else {
|
||||
// Flat commands directory (e.g. command/ for opencode/kilo)
|
||||
destName = `${kind.prefix}${stem}.md`;
|
||||
}
|
||||
|
||||
fs.copyFileSync(path.join(stagedDir, entry.name), path.join(destDir, destName));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove GSD-prefixed entries from destDir matching kind.prefix.
|
||||
* For the prefix='' case: the destSubpath IS the namespace — remove the entire
|
||||
* destDir. (No current runtime uses prefix='' after #947 reversed Hermes; kept
|
||||
* as a defensive guard for future runtimes.)
|
||||
*/
|
||||
function _removeGsdEntries(destDir, kind) {
|
||||
if (!fs.existsSync(destDir)) return;
|
||||
if (kind.kind === 'kimi-agents') {
|
||||
for (const fileName of ['gsd.yaml', 'gsd.md']) {
|
||||
fs.rmSync(path.join(destDir, fileName), { force: true });
|
||||
}
|
||||
const subagentsDir = path.join(destDir, 'subagents');
|
||||
if (fs.existsSync(subagentsDir)) {
|
||||
for (const entry of fs.readdirSync(subagentsDir, { withFileTypes: true })) {
|
||||
if (!entry.isFile()) continue;
|
||||
if (!entry.name.startsWith('gsd-')) continue;
|
||||
if (!entry.name.endsWith('.yaml') && !entry.name.endsWith('.md')) continue;
|
||||
fs.rmSync(path.join(subagentsDir, entry.name), { force: true });
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (kind.prefix === '') {
|
||||
// Whole-namespace removal (Hermes nested case — destSubpath is skills/gsd)
|
||||
// The directory itself is the GSD namespace, so remove it entirely.
|
||||
fs.rmSync(destDir, { recursive: true, force: true });
|
||||
return;
|
||||
}
|
||||
for (const entry of fs.readdirSync(destDir, { withFileTypes: true })) {
|
||||
if (!entry.name.startsWith(kind.prefix)) continue;
|
||||
fs.rmSync(path.join(destDir, entry.name), { recursive: true, force: true });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Run legacy install migrations that must execute BEFORE the layout-driven
|
||||
* copy so stale artifacts are cleaned up before new ones are written.
|
||||
*
|
||||
* - Claude/Qwen/Hermes: migrate legacy commands/gsd/dev-preferences.md →
|
||||
* skills/gsd-dev-preferences/SKILL.md if the old file is present.
|
||||
* Also removes the legacy commands/gsd/ directory.
|
||||
* - Hermes: remove flat skills/gsd-STAR directories (pre-2841 layout) before
|
||||
* writing the new nested skills/gsd/ layout.
|
||||
*
|
||||
* @param {string} runtime
|
||||
* @param {string} configDir resolved runtime config directory
|
||||
* @param {'global'|'local'} [scope]
|
||||
*/
|
||||
function _runLegacyInstallMigrations(runtime, configDir, scope = 'global') {
|
||||
const legacyCommandsGsd = path.join(configDir, 'commands', 'gsd');
|
||||
|
||||
// Claude / Qwen / Hermes: clean up legacy commands/gsd/ and preserve dev-preferences
|
||||
// for migration. The actual migration call is deferred to after all layout cleanup so
|
||||
// that for Hermes the flat skills/gsd-*/ removal (below) does not delete the freshly
|
||||
// created skills/gsd-dev-preferences/ skill dir.
|
||||
let savedLegacyArtifacts = null;
|
||||
if (runtime === 'claude' || runtime === 'qwen' || runtime === 'hermes') {
|
||||
if (fs.existsSync(legacyCommandsGsd)) {
|
||||
savedLegacyArtifacts = preserveUserArtifacts(legacyCommandsGsd, ['dev-preferences.md']);
|
||||
fs.rmSync(legacyCommandsGsd, { recursive: true });
|
||||
}
|
||||
}
|
||||
|
||||
// Hermes: remove pre-#2841 flat skills/gsd-*/ entries that lived alongside
|
||||
// the new skills/gsd/ nested layout.
|
||||
if (runtime === 'hermes') {
|
||||
const flatSkillsDir = path.join(configDir, 'skills');
|
||||
if (fs.existsSync(flatSkillsDir)) {
|
||||
for (const entry of fs.readdirSync(flatSkillsDir, { withFileTypes: true })) {
|
||||
if (entry.isDirectory() && entry.name.startsWith('gsd-')) {
|
||||
fs.rmSync(path.join(flatSkillsDir, entry.name), { recursive: true });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Hermes: bare-stem skills/gsd/<stem>/ cleanup is deferred to AFTER the
|
||||
// layout-driven install loop in installRuntimeArtifacts, where the exact set
|
||||
// of staged gsd-<stem>/ dirs is known. Removing here (before staging) would
|
||||
// require readGsdCommandNames() which misses skills like 'dev-preferences'
|
||||
// that are not in the commands directory. See _removeHermesBareStemDirs().
|
||||
}
|
||||
|
||||
// Migrate dev-preferences.md content → runtime-aware SKILL.md location (#2973).
|
||||
// Done after all layout cleanup so Hermes flat-dir removal does not delete the
|
||||
// newly created skill dir. No-op if skill file already exists.
|
||||
if (savedLegacyArtifacts) {
|
||||
migrateLegacyDevPreferencesToSkill(configDir, savedLegacyArtifacts, runtime, scope);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Run legacy uninstall cleanup that must execute BEFORE the layout-driven
|
||||
* removal so old-format entries are also cleaned up.
|
||||
*
|
||||
* - Claude global/Qwen: remove legacy commands/gsd/ directory if present.
|
||||
* For Claude LOCAL, commands/gsd/ is the current primary location (not
|
||||
* legacy), so we skip removal here and let _removeGsdEntries handle it
|
||||
* with gsd- prefix filtering (preserving user files like dev-preferences.md).
|
||||
* - Hermes: remove pre-2841 flat skills/gsd-STAR entries.
|
||||
*
|
||||
* @param {string} runtime
|
||||
* @param {string} configDir resolved runtime config directory
|
||||
* @param {'global'|'local'} [scope]
|
||||
*/
|
||||
function _runLegacyUninstallCleanup(runtime, configDir, scope = 'global') {
|
||||
// commands/gsd/ is a legacy location for Qwen, Hermes, and all Claude installs.
|
||||
// Prior to #1367 fix, Claude-local used commands/gsd/<cmd>.md (colon-namespaced).
|
||||
// After #1367, Claude-local uses flat commands/gsd-<cmd>.md. The inline uninstall
|
||||
// block (1c) handles removal of flat files; this function handles the legacy
|
||||
// commands/gsd/ directory for all Claude scopes (global was already included,
|
||||
// local is now added since that layout is also legacy post-#1367).
|
||||
// #2973 / Codex review (bd1f06c9): preserve user-owned dev-preferences.md
|
||||
// before destructive wipe. Migration to skills/gsd-dev-preferences/SKILL.md
|
||||
// is deferred and returned so the caller can apply it AFTER layout-driven
|
||||
// removal — this prevents the layout's gsd-* prefix removal from wiping the
|
||||
// freshly created skill dir (same pattern as _runLegacyInstallMigrations).
|
||||
let savedLegacyArtifacts = null;
|
||||
// commands/gsd/ is a legacy location for Qwen, Hermes, and Claude global.
|
||||
// Claude local is intentionally excluded: the inline uninstall block (1c) handles
|
||||
// commands/gsd/ for claude local, preserving dev-preferences.md by restoring it
|
||||
// to the same location (#1423). Using migrateLegacyDevPreferencesToSkill here
|
||||
// (which would redirect to skills/) conflicts with the test contract for local installs.
|
||||
const isLegacyCommandsGsd = runtime === 'qwen' || runtime === 'hermes' || (runtime === 'claude' && scope === 'global');
|
||||
if (isLegacyCommandsGsd) {
|
||||
const legacyCommandsGsd = path.join(configDir, 'commands', 'gsd');
|
||||
if (fs.existsSync(legacyCommandsGsd)) {
|
||||
savedLegacyArtifacts = preserveUserArtifacts(legacyCommandsGsd, ['dev-preferences.md']);
|
||||
fs.rmSync(legacyCommandsGsd, { recursive: true });
|
||||
}
|
||||
}
|
||||
|
||||
// Hermes: pre-#2841 flat skills/gsd-*/ entries
|
||||
if (runtime === 'hermes') {
|
||||
const flatSkillsDir = path.join(configDir, 'skills');
|
||||
if (fs.existsSync(flatSkillsDir)) {
|
||||
for (const entry of fs.readdirSync(flatSkillsDir, { withFileTypes: true })) {
|
||||
if (entry.isDirectory() && entry.name.startsWith('gsd-')) {
|
||||
fs.rmSync(path.join(flatSkillsDir, entry.name), { recursive: true });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Hermes: pre-#947 bare-stem skills/gsd/<stem>/ entries (dirs that do NOT
|
||||
// start with 'gsd-') — the #3664 layout used prefix='' so GSD-owned skills
|
||||
// had bare names (e.g. skills/gsd/help/). These are stale on uninstall.
|
||||
const nestedGsdDirForUninstall = path.join(configDir, 'skills', 'gsd');
|
||||
if (fs.existsSync(nestedGsdDirForUninstall)) {
|
||||
for (const entry of fs.readdirSync(nestedGsdDirForUninstall, { withFileTypes: true })) {
|
||||
if (entry.isDirectory() && !entry.name.startsWith('gsd-')) {
|
||||
fs.rmSync(path.join(nestedGsdDirForUninstall, entry.name), { recursive: true });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Return saved artifacts so the caller can migrate after layout-driven removal.
|
||||
return savedLegacyArtifacts;
|
||||
}
|
||||
|
||||
/**
|
||||
* Layout-driven install orchestrator.
|
||||
* Runs legacy migrations first, then uses resolveRuntimeArtifactLayout to
|
||||
* determine what artifact kinds to write and where.
|
||||
*
|
||||
* @param {string} runtime canonical runtime ID
|
||||
* @param {string} configDir resolved runtime config directory
|
||||
* @param {'global'|'local'} scope
|
||||
* @param {Object} resolvedProfile from resolveProfile() / resolveEffectiveProfile()
|
||||
*/
|
||||
/**
|
||||
* Deep-snapshot a directory tree into a Map<relPath, Buffer>.
|
||||
* Returns an empty Map if the directory doesn't exist.
|
||||
* @param {string} dir
|
||||
* @returns {Map<string, Buffer>}
|
||||
*/
|
||||
function _snapshotDir(dir) {
|
||||
const files = new Map();
|
||||
if (!fs.existsSync(dir)) return files;
|
||||
const walk = (relPath, absPath) => {
|
||||
for (const e of fs.readdirSync(absPath, { withFileTypes: true })) {
|
||||
const childRel = relPath ? path.join(relPath, e.name) : e.name;
|
||||
const childAbs = path.join(absPath, e.name);
|
||||
if (e.isDirectory()) walk(childRel, childAbs);
|
||||
else if (e.isFile()) files.set(childRel, fs.readFileSync(childAbs));
|
||||
}
|
||||
};
|
||||
walk('', dir);
|
||||
return files;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore a directory tree from a Map<relPath, Buffer> produced by _snapshotDir.
|
||||
* @param {string} dir
|
||||
* @param {Map<string, Buffer>} snapshot
|
||||
*/
|
||||
function _restoreDir(dir, snapshot) {
|
||||
for (const [relPath, buf] of snapshot) {
|
||||
const absPath = path.join(dir, relPath);
|
||||
fs.mkdirSync(path.dirname(absPath), { recursive: true });
|
||||
fs.writeFileSync(absPath, buf);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* After the layout-driven install loop writes new gsd-<stem>/ dirs to
|
||||
* skills/gsd/, remove any pre-existing bare-stem dirs (skills/gsd/<stem>/)
|
||||
* that correspond to the newly installed gsd-<stem> entries.
|
||||
*
|
||||
* The removal set is derived from the ACTUAL installed skill dirs (every
|
||||
* entry starting with 'gsd-' that is a directory), so it covers ALL shipped
|
||||
* GSD skills — including 'dev-preferences' and future additions — without
|
||||
* relying on readGsdCommandNames() which only enumerates the commands source
|
||||
* tree and can miss skills that ship outside that directory.
|
||||
*
|
||||
* Safety: a bare dir is ONLY removed when a corresponding gsd-<stem>/ dir was
|
||||
* installed this run. A user-owned dir 'skills/gsd/my-workflow/' that has no
|
||||
* matching 'skills/gsd/gsd-my-workflow/' is never touched.
|
||||
*
|
||||
* @param {string} nestedGsdDir absolute path to skills/gsd/ category dir
|
||||
*/
|
||||
function _removeHermesBareStemDirs(nestedGsdDir) {
|
||||
if (!fs.existsSync(nestedGsdDir)) return;
|
||||
const entries = fs.readdirSync(nestedGsdDir, { withFileTypes: true });
|
||||
|
||||
// Collect the set of stems that were installed as gsd-<stem>/ this run.
|
||||
const installedStems = new Set();
|
||||
for (const entry of entries) {
|
||||
if (entry.isDirectory() && entry.name.startsWith('gsd-')) {
|
||||
installedStems.add(entry.name.slice('gsd-'.length)); // e.g. 'quick', 'dev-preferences'
|
||||
}
|
||||
}
|
||||
|
||||
// Remove any bare <stem>/ dir for which gsd-<stem>/ was just installed.
|
||||
for (const entry of entries) {
|
||||
if (entry.isDirectory() && !entry.name.startsWith('gsd-') && installedStems.has(entry.name)) {
|
||||
fs.rmSync(path.join(nestedGsdDir, entry.name), { recursive: true });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function installRuntimeArtifacts(runtime, configDir, scope, resolvedProfile) {
|
||||
// Legacy cleanup before layout-driven writes
|
||||
_runLegacyInstallMigrations(runtime, configDir, scope);
|
||||
|
||||
const layout = resolveRuntimeArtifactLayout(runtime, configDir, scope);
|
||||
const planResult = createRuntimeArtifactInstallPlan({
|
||||
layout,
|
||||
resolvedProfile,
|
||||
homedir: () => os.homedir(),
|
||||
platform: process.platform,
|
||||
resolveAttribution: getCommitAttribution,
|
||||
});
|
||||
|
||||
const cleanupDirs = planResult.ok ? planResult.plan.cleanupDirs : planResult.cleanupDirs;
|
||||
try {
|
||||
if (!planResult.ok) {
|
||||
throw new Error(planResult.message);
|
||||
}
|
||||
|
||||
const kindsByName = new Map(layout.kinds.map((kind) => [kind.kind, kind]));
|
||||
for (const item of planResult.plan.items) {
|
||||
const kind = kindsByName.get(item.kind);
|
||||
if (!kind) throw new Error(`Install plan returned unknown artifact kind: ${item.kind}`);
|
||||
const dest = item.destDir;
|
||||
// Symlink-escape guard: reject before mkdir if dest (or any component
|
||||
// between configDir and dest) is a symlink pointing outside configDir.
|
||||
// mkdirSync follows symlinks, so this must run BEFORE the mkdir call.
|
||||
if (hasExistingSymlinkBetween(path.resolve(configDir), dest)) {
|
||||
throw new Error(
|
||||
`installRuntimeArtifacts: destDir "${dest}" contains a symlink escaping the install root "${configDir}" — refusing to create`,
|
||||
);
|
||||
}
|
||||
fs.mkdirSync(dest, { recursive: true });
|
||||
if (kind.kind === 'skills' && fs.existsSync(dest)) {
|
||||
// Pre-prune: snapshot user-owned content before _removeGsdEntries wipes it,
|
||||
// then restore after. This preserves user dirs across a wipe-and-replace
|
||||
// install (#2973 / #3664).
|
||||
//
|
||||
// All runtimes (incl. Hermes after #947) use prefix='gsd-'.
|
||||
// _removeGsdEntries removes only gsd-* entries; non-gsd-* user dirs are
|
||||
// untouched. Preserve the explicit user-owned GSD-prefixed skill
|
||||
// gsd-dev-preferences, which GSD does not reinstall from source but must
|
||||
// survive the prune (#2973).
|
||||
const toPreserve = new Map(); // dirName -> Map<relPath, Buffer>
|
||||
|
||||
{
|
||||
// Preserve explicitly user-owned GSD-prefixed skill dirs.
|
||||
// gsd-dev-preferences is the sole user-customisable skill in this category.
|
||||
const USER_OWNED_SKILL_DIRS = ['gsd-dev-preferences'];
|
||||
for (const dirName of USER_OWNED_SKILL_DIRS) {
|
||||
const skillDir = path.join(dest, dirName);
|
||||
if (!fs.existsSync(skillDir)) continue;
|
||||
const snap = _snapshotDir(skillDir);
|
||||
if (snap.size > 0) toPreserve.set(dirName, snap);
|
||||
}
|
||||
}
|
||||
|
||||
_removeGsdEntries(dest, kind);
|
||||
_copyStaged(item.sourceDir, dest, kind, configDir);
|
||||
|
||||
// Restore user-owned dirs after the prune+copy
|
||||
for (const [dirName, snap] of toPreserve) {
|
||||
_restoreDir(path.join(dest, dirName), snap);
|
||||
}
|
||||
} else {
|
||||
// For non-skills kinds (commands, agents): no user content to preserve;
|
||||
// just prune stale gsd-* entries and copy new ones.
|
||||
_removeGsdEntries(dest, kind);
|
||||
_copyStaged(item.sourceDir, dest, kind, configDir);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
for (const dir of cleanupDirs) {
|
||||
try { fs.rmSync(dir, { recursive: true, force: true }); } catch { /* best-effort */ }
|
||||
}
|
||||
}
|
||||
|
||||
// Hermes: after the install loop has written all gsd-<stem>/ dirs to
|
||||
// skills/gsd/, remove any stale bare-stem dirs (skills/gsd/<stem>/) that
|
||||
// correspond to the newly installed gsd-<stem> entries. This is the robust
|
||||
// replacement for the readGsdCommandNames()-based pre-install cleanup that
|
||||
// missed skills like 'dev-preferences' (#947 adversarial review).
|
||||
//
|
||||
// We run this AFTER the install loop so the installed set is authoritative:
|
||||
// every gsd-<stem>/ present now was written this run (or was there before
|
||||
// with the same prefix). User-owned bare dirs with no gsd-<stem> counterpart
|
||||
// are untouched.
|
||||
if (runtime === 'hermes') {
|
||||
const nestedGsdDirForCleanup = path.join(configDir, 'skills', 'gsd');
|
||||
_removeHermesBareStemDirs(nestedGsdDirForCleanup);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Install the skills layout kind for an OpenCode-family runtime (OpenCode/Kilo).
|
||||
*
|
||||
* These runtimes do NOT go through installRuntimeArtifacts (their commands use a
|
||||
* bespoke flattened-command writer), so this writes ONLY the skills kind
|
||||
* alongside their existing command/ + agents/ surfaces. Uninstall is already
|
||||
* layout-driven (uninstallRuntimeArtifacts iterates layout.kinds), so the
|
||||
* skills/ dir is cleaned up automatically once the layout declares it.
|
||||
*
|
||||
* `rawCommandsDir` MUST be the SAME staged command directory the flattened
|
||||
* command writer consumes (the caller passes its `_stageSkills()` output) so the
|
||||
* command/ and skills/ surfaces always cover the identical, profile-resolved set
|
||||
* — including the `--minimal`/`--core-only` alias path, which stages differently
|
||||
* from a plain `--profile=core`.
|
||||
*
|
||||
* Mirrors copyFlattenedCommands exactly per file — pathPrefix rewrite →
|
||||
* attribution → command→skill conversion — guaranteeing command/ and skills/
|
||||
* bodies match byte-for-byte for global, --local, and --config-dir installs.
|
||||
* We deliberately do NOT use skillsKindEntry.stage(): that converts before any
|
||||
* pathPrefix is known, so its bodies would carry the converter's hardcoded
|
||||
* default config dir. (#784)
|
||||
*
|
||||
* @param {string} runtime - 'opencode' or 'kilo'
|
||||
* @param {string} targetDir - resolved runtime config directory
|
||||
* @param {string} rawCommandsDir - staged RAW Claude command dir (caller's _stageSkills output)
|
||||
* @param {string} pathPrefix - computed config-path prefix for body rewrites
|
||||
* @returns {number} number of gsd-* skill directories written
|
||||
*/
|
||||
function installOpencodeFamilySkills(runtime, targetDir, rawCommandsDir, pathPrefix) {
|
||||
const layout = resolveRuntimeArtifactLayout(runtime, targetDir);
|
||||
const skillsKindEntry = layout.kinds.find((k) => k.kind === 'skills');
|
||||
if (!skillsKindEntry) return 0;
|
||||
const rawDir = rawCommandsDir;
|
||||
if (!rawDir || !fs.existsSync(rawDir)) return 0;
|
||||
|
||||
const converter = runtime === 'kilo'
|
||||
? convertClaudeCommandToKiloSkill
|
||||
: convertClaudeCommandToOpencodeSkill;
|
||||
|
||||
const dest = assertDestWithinConfigHome(targetDir, skillsKindEntry.destSubpath);
|
||||
// Symlink-escape guard: reject if any path component between targetDir and
|
||||
// dest is a symlink that would redirect writes outside the config root.
|
||||
if (hasExistingSymlinkBetween(path.resolve(targetDir), dest)) {
|
||||
throw new Error(
|
||||
`installOpencodeFamilySkills: destDir "${dest}" contains a symlink escaping the install root "${targetDir}" — refusing to write`,
|
||||
);
|
||||
}
|
||||
fs.mkdirSync(dest, { recursive: true });
|
||||
|
||||
// Preserve user-owned GSD-prefixed skill dirs across the gsd-* prune.
|
||||
// gsd-dev-preferences is generated by the user (via generate-dev-preferences)
|
||||
// and lives at <configDir>/skills/gsd-dev-preferences — _removeGsdEntries
|
||||
// would otherwise wipe it. Mirrors the preservation in installRuntimeArtifacts
|
||||
// (#2973).
|
||||
const USER_OWNED_SKILL_DIRS = ['gsd-dev-preferences'];
|
||||
const toPreserve = new Map(); // dirName -> Map<relPath, Buffer>
|
||||
for (const dirName of USER_OWNED_SKILL_DIRS) {
|
||||
const skillDir = path.join(dest, dirName);
|
||||
if (!fs.existsSync(skillDir)) continue;
|
||||
const snap = _snapshotDir(skillDir);
|
||||
if (snap.size > 0) toPreserve.set(dirName, snap);
|
||||
}
|
||||
|
||||
_removeGsdEntries(dest, skillsKindEntry);
|
||||
|
||||
let count = 0;
|
||||
for (const entry of fs.readdirSync(rawDir, { withFileTypes: true })) {
|
||||
if (!entry.isFile() || !entry.name.endsWith('.md')) continue;
|
||||
const stem = entry.name.slice(0, -3);
|
||||
const skillName = `${skillsKindEntry.prefix}${stem}`;
|
||||
let content = fs.readFileSync(path.join(rawDir, entry.name), 'utf8');
|
||||
content = applyOpencodeFamilyPathPrefix(content, runtime, pathPrefix);
|
||||
content = processAttribution(content, getCommitAttribution(runtime));
|
||||
content = converter(content, skillName);
|
||||
const skillDir = path.join(dest, skillName);
|
||||
fs.mkdirSync(skillDir, { recursive: true });
|
||||
fs.writeFileSync(path.join(skillDir, 'SKILL.md'), content);
|
||||
count++;
|
||||
}
|
||||
|
||||
// Restore user-owned dirs after the prune+copy.
|
||||
for (const [dirName, snap] of toPreserve) {
|
||||
_restoreDir(path.join(dest, dirName), snap);
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Layout-driven uninstall orchestrator.
|
||||
* Runs legacy cleanup first, then uses resolveRuntimeArtifactLayout to
|
||||
* determine which GSD-owned entries to remove.
|
||||
*
|
||||
* @param {string} runtime canonical runtime ID
|
||||
* @param {string} configDir resolved runtime config directory
|
||||
* @param {'global'|'local'} scope
|
||||
*/
|
||||
function uninstallRuntimeArtifacts(runtime, configDir, scope) {
|
||||
// Legacy cleanup before layout-driven removal (scope-aware to avoid
|
||||
// removing Claude local commands/gsd/ which is the primary install dir).
|
||||
// Returns saved user artifacts so we can migrate AFTER layout removal
|
||||
// (the layout's gsd-* prefix pass would wipe a skill dir created here).
|
||||
const savedLegacyArtifacts = _runLegacyUninstallCleanup(runtime, configDir, scope);
|
||||
|
||||
const layout = resolveRuntimeArtifactLayout(runtime, configDir, scope);
|
||||
const plan = createRuntimeArtifactUninstallPlan(layout);
|
||||
const kindsByName = new Map(layout.kinds.map((kind) => [kind.kind, kind]));
|
||||
for (const item of plan.items) {
|
||||
const kind = kindsByName.get(item.kind);
|
||||
if (!kind) {
|
||||
throw new Error(`Runtime artifact uninstall plan referenced unknown kind: ${item.kind}`);
|
||||
}
|
||||
_removeGsdEntries(item.destDir, kind);
|
||||
}
|
||||
|
||||
// Hermes: after removing gsd-* skill dirs from skills/gsd/, also remove
|
||||
// the GSD-managed DESCRIPTION.md and then the category dir itself if it
|
||||
// contains no user content (#947). _removeGsdEntries removed gsd-* dirs
|
||||
// but left the category container and DESCRIPTION.md intact.
|
||||
if (runtime === 'hermes') {
|
||||
const nestedGsdDir = path.join(configDir, 'skills', 'gsd');
|
||||
if (fs.existsSync(nestedGsdDir)) {
|
||||
// Remove GSD-owned DESCRIPTION.md (written by writeHermesCategoryDescription)
|
||||
fs.rmSync(path.join(nestedGsdDir, 'DESCRIPTION.md'), { force: true });
|
||||
// Remove the category dir if empty (no user content remaining)
|
||||
const remaining = fs.readdirSync(nestedGsdDir, { withFileTypes: true });
|
||||
if (remaining.length === 0) {
|
||||
fs.rmSync(nestedGsdDir, { recursive: true, force: true });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// #2973 / Codex review (bd1f06c9): migrate dev-preferences.md to the
|
||||
// runtime-aware SKILL.md location after all layout-driven removal is
|
||||
// complete. Do NOT restore to commands/gsd/ — the user is uninstalling.
|
||||
if (savedLegacyArtifacts) {
|
||||
migrateLegacyDevPreferencesToSkill(configDir, savedLegacyArtifacts, runtime, scope);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively copy directory, replacing paths in .md files
|
||||
* Deletes existing destDir first to remove orphaned files from previous versions
|
||||
@@ -8681,28 +7912,8 @@ function resolveInstallRelativePath(baseDir, relPath) {
|
||||
return { relPath: normalized, fullPath };
|
||||
}
|
||||
|
||||
function hasExistingSymlinkBetween(root, fullPath) {
|
||||
const resolvedRoot = path.resolve(root);
|
||||
const resolvedFullPath = path.resolve(fullPath);
|
||||
if (resolvedFullPath !== resolvedRoot && !resolvedFullPath.startsWith(resolvedRoot + path.sep)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
let cursor = resolvedRoot;
|
||||
if (fs.existsSync(cursor) && fs.lstatSync(cursor).isSymbolicLink()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const relative = path.relative(resolvedRoot, resolvedFullPath);
|
||||
for (const segment of relative.split(path.sep)) {
|
||||
if (!segment) continue;
|
||||
cursor = path.join(cursor, segment);
|
||||
if (!fs.existsSync(cursor)) return false;
|
||||
if (fs.lstatSync(cursor).isSymbolicLink()) return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
// hasExistingSymlinkBetween: moved to src/install-engine.cts (ADR-1239 Phase B).
|
||||
// Imported from installEngine above.
|
||||
|
||||
/**
|
||||
* Write file manifest after installation for future modification detection
|
||||
@@ -9676,7 +8887,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
||||
if (_isSkillsRuntime) {
|
||||
// Layout-driven install for skills-based runtimes (full and minimal modes)
|
||||
const scope = isGlobal ? 'global' : 'local';
|
||||
installRuntimeArtifacts(runtime, targetDir, scope, _resolvedProfile);
|
||||
installRuntimeArtifacts(runtime, targetDir, scope, _resolvedProfile, getCommitAttribution);
|
||||
|
||||
// #1326 — Codex only: remove stale agents/openai.yaml sidecars from managed
|
||||
// gsd-* skill dirs. Prior installs wrote these files so Codex would show a
|
||||
@@ -9836,7 +9047,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
||||
// Kilo support native, on-demand skills in addition to flat commands — see
|
||||
// resolveRuntimeArtifactLayout's opencode/kilo entries. Derive skills from
|
||||
// the SAME staged command set (gsdSrc) so both surfaces match exactly. (#784)
|
||||
const _skillCount = installOpencodeFamilySkills(runtime, targetDir, gsdSrc, pathPrefix);
|
||||
const _skillCount = installOpencodeFamilySkills(runtime, targetDir, gsdSrc, pathPrefix, getCommitAttribution);
|
||||
if (_skillCount > 0) {
|
||||
console.log(` ${green}✓${reset} Installed ${_skillCount} skills to skills/`);
|
||||
} else {
|
||||
|
||||
@@ -332,6 +332,7 @@
|
||||
"host-integration.cjs",
|
||||
"init-command-router.cjs",
|
||||
"init.cjs",
|
||||
"install-engine.cjs",
|
||||
"install-profiles.cjs",
|
||||
"installer-migration-authoring.cjs",
|
||||
"installer-migration-report.cjs",
|
||||
|
||||
@@ -442,6 +442,7 @@ Full listing: `gsd-core/bin/lib/*.cjs`.
|
||||
| `host-integration.cjs` | Host-Integration Interface (ADR-1239 Phase A) — negotiated capability contract over the six host-integration points; `negotiateHostCapabilities` fail-closes on undeclared/unknown/`undocumented` values, typed degradation ladder, host-capability profiles; the 8 `runtime.hostIntegration` axes are validated in `capability-validator.cjs` and sourced per-CLI in `docs/reference/host-integration-capability-matrix.md` |
|
||||
| `init-command-router.cjs` | Thin CJS subcommand router adapter for `gsd-tools init` |
|
||||
| `init.cjs` | Compound context loading for each workflow type |
|
||||
| `install-engine.cjs` | Runtime-artifact install engine — `installRuntimeArtifacts`/`uninstallRuntimeArtifacts`/`installOpencodeFamilySkills` + their helpers, extracted from `bin/install.js` (ADR-1239 Phase B, #1679); install.js imports them back and injects `getCommitAttribution` |
|
||||
| `install-profiles.cjs` | Install profile allowlist + skill staging for `--minimal` install (#2762); single source of truth for which `gsd-*` skills/agents land in runtime config dirs |
|
||||
| `installer-migration-authoring.cjs` | Installer migration authoring guardrails for record metadata, explicit scopes, ownership evidence, and runtime contract citations |
|
||||
| `installer-migration-report.cjs` | Installer migration report projection and blocked-action guard for install/update integration |
|
||||
|
||||
@@ -54,6 +54,7 @@ export default tseslint.config(
|
||||
// ADR-457: tsc-generated runtime artifact — lint the src/*.cts source, not the emitted .cjs.
|
||||
'gsd-core/bin/lib/semver-compare.cjs',
|
||||
'gsd-core/bin/lib/host-integration.cjs',
|
||||
'gsd-core/bin/lib/install-engine.cjs',
|
||||
'gsd-core/bin/lib/capability-loader.cjs',
|
||||
'gsd-core/bin/lib/capability-source.cjs',
|
||||
'gsd-core/bin/lib/capability-ledger.cjs',
|
||||
|
||||
822
src/install-engine.cts
Normal file
822
src/install-engine.cts
Normal file
@@ -0,0 +1,822 @@
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any,
|
||||
@typescript-eslint/no-unsafe-assignment,
|
||||
@typescript-eslint/no-unsafe-member-access,
|
||||
@typescript-eslint/no-unsafe-return,
|
||||
@typescript-eslint/no-unsafe-call,
|
||||
@typescript-eslint/no-unsafe-argument,
|
||||
@typescript-eslint/no-require-imports */
|
||||
// Mechanical extraction from bin/install.js; keep behavior parity before typing.
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Install Engine Module — ADR-1239 Phase B.
|
||||
*
|
||||
* Runtime-artifact install/uninstall cluster extracted from bin/install.js.
|
||||
* bin/install.js imports this module for the layout-driven install/uninstall
|
||||
* orchestrators and their private helpers. getCommitAttribution STAYS in
|
||||
* bin/install.js (impure install-time config I/O); it is injected via the
|
||||
* `resolveAttribution` parameter at each call site.
|
||||
*/
|
||||
|
||||
import fs from 'node:fs';
|
||||
import os from 'node:os';
|
||||
import path from 'node:path';
|
||||
|
||||
import runtimeArtifactConversion = require('./runtime-artifact-conversion.cjs');
|
||||
import runtimeArtifactLayout = require('./runtime-artifact-layout.cjs');
|
||||
import runtimeArtifactInstallPlan = require('./runtime-artifact-install-plan.cjs');
|
||||
import runtimeNamePolicy = require('./runtime-name-policy.cjs');
|
||||
|
||||
const { processAttribution } = runtimeArtifactConversion;
|
||||
// resolveRuntimeArtifactLayout: accessed via module ref (not destructured) so
|
||||
// test stubs that monkeypatch the module's exports are seen at call time.
|
||||
const { getDirName } = runtimeNamePolicy;
|
||||
// assertDestWithinConfigHome: must be accessed via module ref at call time for
|
||||
// test-stub compatibility (monkeypatching the module property works; a local
|
||||
// const binding from destructure would capture the pre-stub value).
|
||||
// These are only called from functions that are not stubbed, but we use the
|
||||
// module ref pattern consistently for correctness.
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Types (loose — minimal annotations for strict mode compliance)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
type ResolveAttribution = (runtime: string) => any;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// USER_OWNED_ARTIFACTS
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Single source of truth for user-owned artifacts inside gsd-core/.
|
||||
*
|
||||
* These files are created/refreshed by user-facing workflows (e.g.
|
||||
* /gsd-profile-user) and must be preserved across reinstalls. Critically, they
|
||||
* MUST be excluded from gsd-file-manifest.json — otherwise saveLocalPatches()
|
||||
* will compare a refreshed file against a stale manifest hash and emit a
|
||||
* spurious "locally modified GSD file" warning (bug #2771).
|
||||
*
|
||||
* Invariant: a file is either distribution (manifest-tracked, diff'd against
|
||||
* manifest) or user artifact (preserved across installs, never diff'd). Never
|
||||
* both. Both preserveUserArtifacts call sites and writeManifest must agree on
|
||||
* this list, which is why it lives here as a single constant.
|
||||
*
|
||||
* Paths are relative to the gsd-core/ directory.
|
||||
*/
|
||||
const USER_OWNED_ARTIFACTS: string[] = ['USER-PROFILE.md'];
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Conversion helpers
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Apply per-runtime path-prefix rewrites for OpenCode-family skill bodies.
|
||||
* Replaces ~/.claude/, $HOME/.claude/, ./.claude/ and OpenCode-variant paths
|
||||
* with the computed pathPrefix for the install.
|
||||
*/
|
||||
function applyOpencodeFamilyPathPrefix(content: string, runtime: string, pathPrefix: string): string {
|
||||
content = content.replace(/~\/\.claude\//g, pathPrefix);
|
||||
content = content.replace(/\$HOME\/\.claude\//g, pathPrefix);
|
||||
content = content.replace(/\.\/\.claude\//g, `./${getDirName(runtime)}/`);
|
||||
content = content.replace(/~\/\.opencode\//g, pathPrefix);
|
||||
content = content.replace(/~\/\.kilo\//g, pathPrefix);
|
||||
return content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a Claude command (.md) to an OpenCode skill (SKILL.md).
|
||||
* The canonical OpenCode-family writer lives in runtime-artifact-conversion.cjs
|
||||
* (single source of truth — avoids a duplicate writer drifting per
|
||||
* DEFECT.GENERATIVE-FIX); this thin wrapper delegates to it.
|
||||
*/
|
||||
function convertClaudeCommandToOpencodeSkill(content: string, skillName: string): string {
|
||||
return (runtimeArtifactConversion as any).convertClaudeCommandToOpencodeSkill(content, skillName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a Claude command (.md) to a Kilo skill (SKILL.md).
|
||||
* Thin wrapper over the shared OpenCode-family writer (Kilo shares the schema).
|
||||
*/
|
||||
function convertClaudeCommandToKiloSkill(content: string, skillName: string): string {
|
||||
return (runtimeArtifactConversion as any).convertClaudeCommandToKiloSkill(content, skillName);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// User-artifact preservation helpers
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Save user-generated files from destDir to an in-memory map before a wipe.
|
||||
*
|
||||
* @param destDir - Directory that is about to be wiped
|
||||
* @param fileNames - Relative file names (e.g. ['USER-PROFILE.md']) to preserve
|
||||
* @returns Map of fileName → file content (only entries that existed)
|
||||
*/
|
||||
function preserveUserArtifacts(destDir: string, fileNames: string[]): Map<string, string> {
|
||||
const saved = new Map<string, string>();
|
||||
for (const name of fileNames) {
|
||||
const fullPath = path.join(destDir, name);
|
||||
if (fs.existsSync(fullPath)) {
|
||||
try {
|
||||
saved.set(name, fs.readFileSync(fullPath, 'utf8'));
|
||||
} catch { /* skip unreadable files */ }
|
||||
}
|
||||
}
|
||||
return saved;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore user-generated files saved by preserveUserArtifacts after a wipe.
|
||||
*
|
||||
* @param destDir - Directory that was wiped and recreated
|
||||
* @param saved - Map returned by preserveUserArtifacts
|
||||
*/
|
||||
function restoreUserArtifacts(destDir: string, saved: Map<string, string>): void {
|
||||
for (const [name, content] of saved) {
|
||||
const fullPath = path.join(destDir, name);
|
||||
try {
|
||||
fs.mkdirSync(path.dirname(fullPath), { recursive: true });
|
||||
fs.writeFileSync(fullPath, content, 'utf8');
|
||||
} catch { /* skip unwritable paths */ }
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Symlink-escape guard
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Returns true if any path component between `root` and `fullPath` is a
|
||||
* symbolic link (which could redirect writes outside the install root).
|
||||
*/
|
||||
function hasExistingSymlinkBetween(root: string, fullPath: string): boolean {
|
||||
const resolvedRoot = path.resolve(root);
|
||||
const resolvedFullPath = path.resolve(fullPath);
|
||||
if (resolvedFullPath !== resolvedRoot && !resolvedFullPath.startsWith(resolvedRoot + path.sep)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
let cursor = resolvedRoot;
|
||||
if (fs.existsSync(cursor) && fs.lstatSync(cursor).isSymbolicLink()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const relative = path.relative(resolvedRoot, resolvedFullPath);
|
||||
for (const segment of relative.split(path.sep)) {
|
||||
if (!segment) continue;
|
||||
cursor = path.join(cursor, segment);
|
||||
if (!fs.existsSync(cursor)) return false;
|
||||
if (fs.lstatSync(cursor).isSymbolicLink()) return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// migrateLegacyDevPreferencesToSkill
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Migrate a legacy dev-preferences.md (saved from commands/gsd/) into the
|
||||
* runtime-aware SKILL.md location used by the writer after #2973.
|
||||
*
|
||||
* For runtimes with a nested skills layout (e.g. Hermes: skills/gsd/<stem>/),
|
||||
* the target is <configDir>/skills/gsd/dev-preferences/SKILL.md.
|
||||
* For runtimes with a flat skills layout (prefix='gsd-'), the target is
|
||||
* <configDir>/skills/gsd-dev-preferences/SKILL.md.
|
||||
*
|
||||
* Skips silently if no legacy file was preserved, or if a SKILL.md already
|
||||
* exists at the new location (don't clobber user-customized skill content
|
||||
* — they may have edited the new file directly). Returns true on actual
|
||||
* migration so callers can log a one-line confirmation.
|
||||
*
|
||||
* @param targetDir - Resolved runtime config directory (e.g. ~/.claude)
|
||||
* @param saved - Map returned by preserveUserArtifacts
|
||||
* @param runtime - canonical runtime ID (e.g. 'hermes', 'qwen', 'claude')
|
||||
* @param scope - install scope
|
||||
* @returns true if a file was migrated, false otherwise
|
||||
*/
|
||||
function migrateLegacyDevPreferencesToSkill(targetDir: string, saved: Map<string, string>, runtime?: string, scope: string = 'global'): boolean {
|
||||
if (!saved || !saved.has('dev-preferences.md')) return false;
|
||||
let skillDir: string;
|
||||
if (runtime) {
|
||||
const layout: any = runtimeArtifactLayout.resolveRuntimeArtifactLayout(runtime, targetDir, scope as any);
|
||||
const skillsKindEntry = layout.kinds.find((k: any) => k.kind === 'skills');
|
||||
if (!skillsKindEntry) return false; // runtime has no skills layout at this scope (e.g. cline local)
|
||||
const stemName = skillsKindEntry.prefix === '' ? 'dev-preferences' : 'gsd-dev-preferences';
|
||||
skillDir = path.join(runtimeArtifactInstallPlan.assertDestWithinConfigHome(targetDir, skillsKindEntry.destSubpath), stemName);
|
||||
} else {
|
||||
// Legacy fallback for callers that have not yet been updated to pass runtime
|
||||
skillDir = path.join(runtimeArtifactInstallPlan.assertDestWithinConfigHome(targetDir, 'skills'), 'gsd-dev-preferences');
|
||||
}
|
||||
const skillFile = path.join(skillDir, 'SKILL.md');
|
||||
if (fs.existsSync(skillFile)) return false;
|
||||
// Symlink-escape guard: reject if any path component between targetDir and
|
||||
// skillDir is a symlink that would redirect writes outside the config root.
|
||||
if (hasExistingSymlinkBetween(path.resolve(targetDir), skillDir)) {
|
||||
throw new Error(
|
||||
`migrateLegacyDevPreferencesToSkill: skillDir "${skillDir}" contains a symlink escaping the install root "${targetDir}" — refusing to write`,
|
||||
);
|
||||
}
|
||||
try {
|
||||
fs.mkdirSync(skillDir, { recursive: true });
|
||||
fs.writeFileSync(skillFile, saved.get('dev-preferences.md')!, 'utf8');
|
||||
return true;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// _copyStaged
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Copy a staged directory's contents into destDir.
|
||||
* Additive — does not prune (surface.cjs handles pruning).
|
||||
*
|
||||
* For skills kind: each child of stagedDir is a `${prefix}${stem}/` dir; copy
|
||||
* the whole dir into destDir.
|
||||
* For commands/agents kind: iterate .md files and write them into destDir.
|
||||
* - commands: write as `${prefix}${stem}.md` unless destSubpath already
|
||||
* encodes the GSD namespace as its last segment (e.g. `commands/gsd`), in
|
||||
* which case write as `${stem}.md` (directory IS the namespace).
|
||||
* - agents: write as-is (files already carry their own `gsd-` prefix).
|
||||
* For kimi-agents kind: recursively copy generated YAML/prompt files.
|
||||
*/
|
||||
function _copyStaged(stagedDir: string, destDir: string, kind: any, configDir: string): void {
|
||||
// Defense-in-depth: verify destDir is within the install root even if the
|
||||
// upstream assertDestWithinConfigHome check was somehow bypassed. This guards
|
||||
// the actual write site against any future call-site drift.
|
||||
// Fail-closed: every _copyStaged write must declare its install root so the gate
|
||||
// can confine it. All callers pass configDir; an omitted root is a bug, not a copy.
|
||||
if (configDir === undefined) {
|
||||
throw new Error(
|
||||
'_copyStaged: configDir (install root) is required to confine writes — refusing to write',
|
||||
);
|
||||
}
|
||||
// Strict-subpath + NUL containment via the canonical gate (shared with the
|
||||
// layout-driven install plan); throws if destDir escapes the install root.
|
||||
// destDir here is an absolute path; path.resolve(configDir, absoluteDest) returns it unchanged, so the gate's strict-subpath check still correctly confines it to configDir.
|
||||
const resolvedDest = runtimeArtifactInstallPlan.assertDestWithinConfigHome(configDir, destDir);
|
||||
// Symlink-escape guard: reject if any path component between configDir and
|
||||
// destDir is a symlink that would redirect writes outside configDir.
|
||||
if (hasExistingSymlinkBetween(path.resolve(configDir), resolvedDest)) {
|
||||
throw new Error(
|
||||
`_copyStaged: destDir "${destDir}" contains a symlink escaping the install root "${configDir}" — refusing to write`,
|
||||
);
|
||||
}
|
||||
// Use the validated absolute path for the actual writes below.
|
||||
destDir = resolvedDest;
|
||||
if (!fs.existsSync(stagedDir)) return;
|
||||
fs.mkdirSync(destDir, { recursive: true });
|
||||
|
||||
if (kind.kind === 'skills') {
|
||||
// Each child of stagedDir is a prefixed skill directory: gsd-help/, etc.
|
||||
for (const entry of fs.readdirSync(stagedDir, { withFileTypes: true })) {
|
||||
if (!entry.isDirectory()) continue;
|
||||
const src = path.join(stagedDir, entry.name);
|
||||
const dest = path.join(destDir, entry.name);
|
||||
fs.cpSync(src, dest, { recursive: true });
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (kind.kind === 'kimi-agents') {
|
||||
fs.cpSync(stagedDir, destDir, { recursive: true });
|
||||
return;
|
||||
}
|
||||
|
||||
// commands or agents
|
||||
const entries = fs.readdirSync(stagedDir, { withFileTypes: true });
|
||||
// For commands: apply prefix unless the destSubpath's last segment already
|
||||
// represents the GSD namespace (e.g. 'commands/gsd' → last segment 'gsd').
|
||||
const destLast = path.basename(kind.destSubpath);
|
||||
const prefixStem = kind.prefix ? kind.prefix.replace(/-$/, '') : '';
|
||||
const namespacedByDir = kind.kind === 'commands' && destLast === prefixStem;
|
||||
|
||||
for (const entry of entries) {
|
||||
if (!entry.isFile()) continue;
|
||||
if (!entry.name.endsWith('.md')) continue;
|
||||
const stem = entry.name.slice(0, -3); // strip .md
|
||||
|
||||
let destName: string;
|
||||
if (kind.kind === 'agents') {
|
||||
// Agent files already carry the gsd- prefix in the source dir
|
||||
destName = entry.name;
|
||||
} else if (namespacedByDir) {
|
||||
// Directory is the namespace; don't double-prefix the filename
|
||||
destName = entry.name;
|
||||
} else {
|
||||
// Flat commands directory (e.g. command/ for opencode/kilo)
|
||||
destName = `${kind.prefix}${stem}.md`;
|
||||
}
|
||||
|
||||
fs.copyFileSync(path.join(stagedDir, entry.name), path.join(destDir, destName));
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// _removeGsdEntries
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Remove GSD-prefixed entries from destDir matching kind.prefix.
|
||||
* For the prefix='' case: the destSubpath IS the namespace — remove the entire
|
||||
* destDir. (No current runtime uses prefix='' after #947 reversed Hermes; kept
|
||||
* as a defensive guard for future runtimes.)
|
||||
*/
|
||||
function _removeGsdEntries(destDir: string, kind: any): void {
|
||||
if (!fs.existsSync(destDir)) return;
|
||||
if (kind.kind === 'kimi-agents') {
|
||||
for (const fileName of ['gsd.yaml', 'gsd.md']) {
|
||||
fs.rmSync(path.join(destDir, fileName), { force: true });
|
||||
}
|
||||
const subagentsDir = path.join(destDir, 'subagents');
|
||||
if (fs.existsSync(subagentsDir)) {
|
||||
for (const entry of fs.readdirSync(subagentsDir, { withFileTypes: true })) {
|
||||
if (!entry.isFile()) continue;
|
||||
if (!entry.name.startsWith('gsd-')) continue;
|
||||
if (!entry.name.endsWith('.yaml') && !entry.name.endsWith('.md')) continue;
|
||||
fs.rmSync(path.join(subagentsDir, entry.name), { force: true });
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (kind.prefix === '') {
|
||||
// Whole-namespace removal (Hermes nested case — destSubpath is skills/gsd)
|
||||
// The directory itself is the GSD namespace, so remove it entirely.
|
||||
fs.rmSync(destDir, { recursive: true, force: true });
|
||||
return;
|
||||
}
|
||||
for (const entry of fs.readdirSync(destDir, { withFileTypes: true })) {
|
||||
if (!entry.name.startsWith(kind.prefix)) continue;
|
||||
fs.rmSync(path.join(destDir, entry.name), { recursive: true, force: true });
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// _snapshotDir / _restoreDir
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Deep-snapshot a directory tree into a Map<relPath, Buffer>.
|
||||
* Returns an empty Map if the directory doesn't exist.
|
||||
*/
|
||||
function _snapshotDir(dir: string): Map<string, Buffer> {
|
||||
const files = new Map<string, Buffer>();
|
||||
if (!fs.existsSync(dir)) return files;
|
||||
const walk = (relPath: string, absPath: string) => {
|
||||
for (const e of fs.readdirSync(absPath, { withFileTypes: true })) {
|
||||
const childRel = relPath ? path.join(relPath, e.name) : e.name;
|
||||
const childAbs = path.join(absPath, e.name);
|
||||
if (e.isDirectory()) walk(childRel, childAbs);
|
||||
else if (e.isFile()) files.set(childRel, fs.readFileSync(childAbs));
|
||||
}
|
||||
};
|
||||
walk('', dir);
|
||||
return files;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore a directory tree from a Map<relPath, Buffer> produced by _snapshotDir.
|
||||
*/
|
||||
function _restoreDir(dir: string, snapshot: Map<string, Buffer>): void {
|
||||
for (const [relPath, buf] of snapshot) {
|
||||
const absPath = path.join(dir, relPath);
|
||||
fs.mkdirSync(path.dirname(absPath), { recursive: true });
|
||||
fs.writeFileSync(absPath, buf);
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// _removeHermesBareStemDirs
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* After the layout-driven install loop writes new gsd-<stem>/ dirs to
|
||||
* skills/gsd/, remove any pre-existing bare-stem dirs (skills/gsd/<stem>/)
|
||||
* that correspond to the newly installed gsd-<stem> entries.
|
||||
*
|
||||
* @param nestedGsdDir absolute path to skills/gsd/ category dir
|
||||
*/
|
||||
function _removeHermesBareStemDirs(nestedGsdDir: string): void {
|
||||
if (!fs.existsSync(nestedGsdDir)) return;
|
||||
const entries = fs.readdirSync(nestedGsdDir, { withFileTypes: true });
|
||||
|
||||
// Collect the set of stems that were installed as gsd-<stem>/ this run.
|
||||
const installedStems = new Set<string>();
|
||||
for (const entry of entries) {
|
||||
if (entry.isDirectory() && entry.name.startsWith('gsd-')) {
|
||||
installedStems.add(entry.name.slice('gsd-'.length)); // e.g. 'quick', 'dev-preferences'
|
||||
}
|
||||
}
|
||||
|
||||
// Remove any bare <stem>/ dir for which gsd-<stem>/ was just installed.
|
||||
for (const entry of entries) {
|
||||
if (entry.isDirectory() && !entry.name.startsWith('gsd-') && installedStems.has(entry.name)) {
|
||||
fs.rmSync(path.join(nestedGsdDir, entry.name), { recursive: true });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Legacy migration helpers
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Run legacy install migrations that must execute BEFORE the layout-driven
|
||||
* copy so stale artifacts are cleaned up before new ones are written.
|
||||
*
|
||||
* @param runtime
|
||||
* @param configDir resolved runtime config directory
|
||||
* @param scope
|
||||
*/
|
||||
function _runLegacyInstallMigrations(runtime: string, configDir: string, scope: string = 'global'): void {
|
||||
const legacyCommandsGsd = path.join(configDir, 'commands', 'gsd');
|
||||
|
||||
// Claude / Qwen / Hermes: clean up legacy commands/gsd/ and preserve dev-preferences
|
||||
// for migration. The actual migration call is deferred to after all layout cleanup so
|
||||
// that for Hermes the flat skills/gsd-*/ removal (below) does not delete the freshly
|
||||
// created skills/gsd-dev-preferences/ skill dir.
|
||||
let savedLegacyArtifacts: Map<string, string> | null = null;
|
||||
if (runtime === 'claude' || runtime === 'qwen' || runtime === 'hermes') {
|
||||
if (fs.existsSync(legacyCommandsGsd)) {
|
||||
savedLegacyArtifacts = preserveUserArtifacts(legacyCommandsGsd, ['dev-preferences.md']);
|
||||
fs.rmSync(legacyCommandsGsd, { recursive: true });
|
||||
}
|
||||
}
|
||||
|
||||
// Hermes: remove pre-#2841 flat skills/gsd-*/ entries that lived alongside
|
||||
// the new skills/gsd/ nested layout.
|
||||
if (runtime === 'hermes') {
|
||||
const flatSkillsDir = path.join(configDir, 'skills');
|
||||
if (fs.existsSync(flatSkillsDir)) {
|
||||
for (const entry of fs.readdirSync(flatSkillsDir, { withFileTypes: true })) {
|
||||
if (entry.isDirectory() && entry.name.startsWith('gsd-')) {
|
||||
fs.rmSync(path.join(flatSkillsDir, entry.name), { recursive: true });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Hermes: bare-stem skills/gsd/<stem>/ cleanup is deferred to AFTER the
|
||||
// layout-driven install loop in installRuntimeArtifacts, where the exact set
|
||||
// of staged gsd-<stem>/ dirs is known. Removing here (before staging) would
|
||||
// require readGsdCommandNames() which misses skills like 'dev-preferences'
|
||||
// that are not in the commands directory. See _removeHermesBareStemDirs().
|
||||
}
|
||||
|
||||
// Migrate dev-preferences.md content → runtime-aware SKILL.md location (#2973).
|
||||
// Done after all layout cleanup so Hermes flat-dir removal does not delete the
|
||||
// newly created skill dir. No-op if skill file already exists.
|
||||
if (savedLegacyArtifacts) {
|
||||
migrateLegacyDevPreferencesToSkill(configDir, savedLegacyArtifacts, runtime, scope);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Run legacy uninstall cleanup that must execute BEFORE the layout-driven
|
||||
* removal so old-format entries are also cleaned up.
|
||||
*
|
||||
* @param runtime
|
||||
* @param configDir resolved runtime config directory
|
||||
* @param scope
|
||||
* @returns saved legacy artifacts for post-removal migration, or null
|
||||
*/
|
||||
function _runLegacyUninstallCleanup(runtime: string, configDir: string, scope: string = 'global'): Map<string, string> | null {
|
||||
// commands/gsd/ is a legacy location for Qwen, Hermes, and all Claude installs.
|
||||
// Prior to #1367 fix, Claude-local used commands/gsd/<cmd>.md (colon-namespaced).
|
||||
// After #1367, Claude-local uses flat commands/gsd-<cmd>.md. The inline uninstall
|
||||
// block (1c) handles removal of flat files; this function handles the legacy
|
||||
// commands/gsd/ directory for all Claude scopes (global was already included,
|
||||
// local is now added since that layout is also legacy post-#1367).
|
||||
// #2973 / Codex review (bd1f06c9): preserve user-owned dev-preferences.md
|
||||
// before destructive wipe. Migration to skills/gsd-dev-preferences/SKILL.md
|
||||
// is deferred and returned so the caller can apply it AFTER layout-driven
|
||||
// removal — this prevents the layout's gsd-* prefix removal from wiping the
|
||||
// freshly created skill dir (same pattern as _runLegacyInstallMigrations).
|
||||
let savedLegacyArtifacts: Map<string, string> | null = null;
|
||||
// commands/gsd/ is a legacy location for Qwen, Hermes, and Claude global.
|
||||
// Claude local is intentionally excluded: the inline uninstall block (1c) handles
|
||||
// commands/gsd/ for claude local, preserving dev-preferences.md by restoring it
|
||||
// to the same location (#1423). Using migrateLegacyDevPreferencesToSkill here
|
||||
// (which would redirect to skills/) conflicts with the test contract for local installs.
|
||||
const isLegacyCommandsGsd = runtime === 'qwen' || runtime === 'hermes' || (runtime === 'claude' && scope === 'global');
|
||||
if (isLegacyCommandsGsd) {
|
||||
const legacyCommandsGsd = path.join(configDir, 'commands', 'gsd');
|
||||
if (fs.existsSync(legacyCommandsGsd)) {
|
||||
savedLegacyArtifacts = preserveUserArtifacts(legacyCommandsGsd, ['dev-preferences.md']);
|
||||
fs.rmSync(legacyCommandsGsd, { recursive: true });
|
||||
}
|
||||
}
|
||||
|
||||
// Hermes: pre-#2841 flat skills/gsd-*/ entries
|
||||
if (runtime === 'hermes') {
|
||||
const flatSkillsDir = path.join(configDir, 'skills');
|
||||
if (fs.existsSync(flatSkillsDir)) {
|
||||
for (const entry of fs.readdirSync(flatSkillsDir, { withFileTypes: true })) {
|
||||
if (entry.isDirectory() && entry.name.startsWith('gsd-')) {
|
||||
fs.rmSync(path.join(flatSkillsDir, entry.name), { recursive: true });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Hermes: pre-#947 bare-stem skills/gsd/<stem>/ entries (dirs that do NOT
|
||||
// start with 'gsd-') — the #3664 layout used prefix='' so GSD-owned skills
|
||||
// had bare names (e.g. skills/gsd/help/). These are stale on uninstall.
|
||||
const nestedGsdDirForUninstall = path.join(configDir, 'skills', 'gsd');
|
||||
if (fs.existsSync(nestedGsdDirForUninstall)) {
|
||||
for (const entry of fs.readdirSync(nestedGsdDirForUninstall, { withFileTypes: true })) {
|
||||
if (entry.isDirectory() && !entry.name.startsWith('gsd-')) {
|
||||
fs.rmSync(path.join(nestedGsdDirForUninstall, entry.name), { recursive: true });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Return saved artifacts so the caller can migrate after layout-driven removal.
|
||||
return savedLegacyArtifacts;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// installRuntimeArtifacts
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Layout-driven install orchestrator.
|
||||
* Runs legacy migrations first, then uses resolveRuntimeArtifactLayout to
|
||||
* determine what artifact kinds to write and where.
|
||||
*
|
||||
* @param runtime canonical runtime ID
|
||||
* @param configDir resolved runtime config directory
|
||||
* @param scope
|
||||
* @param resolvedProfile from resolveProfile() / resolveEffectiveProfile()
|
||||
* @param resolveAttribution injection: (runtime) => attribution string | undefined
|
||||
*/
|
||||
function installRuntimeArtifacts(
|
||||
runtime: string,
|
||||
configDir: string,
|
||||
scope: string,
|
||||
resolvedProfile: any,
|
||||
resolveAttribution: ResolveAttribution = () => undefined,
|
||||
): void {
|
||||
// Legacy cleanup before layout-driven writes
|
||||
_runLegacyInstallMigrations(runtime, configDir, scope);
|
||||
|
||||
const layout = runtimeArtifactLayout.resolveRuntimeArtifactLayout(runtime, configDir, scope as 'global' | 'local');
|
||||
const planResult = runtimeArtifactInstallPlan.createRuntimeArtifactInstallPlan({
|
||||
// `Layout` is structurally identical across the layout/install-plan .cjs
|
||||
// modules but nominally distinct to tsc (untyped .cjs boundary) — bridge it.
|
||||
layout: layout as any,
|
||||
resolvedProfile,
|
||||
homedir: () => os.homedir(),
|
||||
platform: process.platform,
|
||||
resolveAttribution,
|
||||
});
|
||||
|
||||
const cleanupDirs = planResult.ok ? planResult.plan.cleanupDirs : planResult.cleanupDirs;
|
||||
try {
|
||||
if (!planResult.ok) {
|
||||
throw new Error(planResult.message);
|
||||
}
|
||||
|
||||
const kindsByName = new Map<string, any>(layout.kinds.map((kind: any) => [kind.kind as string, kind]));
|
||||
for (const item of planResult.plan.items) {
|
||||
const kind: any = kindsByName.get(item.kind);
|
||||
if (!kind) throw new Error(`Install plan returned unknown artifact kind: ${item.kind}`);
|
||||
const dest = item.destDir;
|
||||
// Symlink-escape guard: reject before mkdir if dest (or any component
|
||||
// between configDir and dest) is a symlink pointing outside configDir.
|
||||
// mkdirSync follows symlinks, so this must run BEFORE the mkdir call.
|
||||
if (hasExistingSymlinkBetween(path.resolve(configDir), dest)) {
|
||||
throw new Error(
|
||||
`installRuntimeArtifacts: destDir "${dest}" contains a symlink escaping the install root "${configDir}" — refusing to create`,
|
||||
);
|
||||
}
|
||||
fs.mkdirSync(dest, { recursive: true });
|
||||
if (kind.kind === 'skills' && fs.existsSync(dest)) {
|
||||
// Pre-prune: snapshot user-owned content before _removeGsdEntries wipes it,
|
||||
// then restore after. This preserves user dirs across a wipe-and-replace
|
||||
// install (#2973 / #3664).
|
||||
//
|
||||
// All runtimes (incl. Hermes after #947) use prefix='gsd-'.
|
||||
// _removeGsdEntries removes only gsd-* entries; non-gsd-* user dirs are
|
||||
// untouched. Preserve the explicit user-owned GSD-prefixed skill
|
||||
// gsd-dev-preferences, which GSD does not reinstall from source but must
|
||||
// survive the prune (#2973).
|
||||
const toPreserve = new Map<string, Map<string, Buffer>>(); // dirName -> Map<relPath, Buffer>
|
||||
|
||||
{
|
||||
// Preserve explicitly user-owned GSD-prefixed skill dirs.
|
||||
// gsd-dev-preferences is the sole user-customisable skill in this category.
|
||||
const USER_OWNED_SKILL_DIRS = ['gsd-dev-preferences'];
|
||||
for (const dirName of USER_OWNED_SKILL_DIRS) {
|
||||
const skillDir = path.join(dest, dirName);
|
||||
if (!fs.existsSync(skillDir)) continue;
|
||||
const snap = _snapshotDir(skillDir);
|
||||
if (snap.size > 0) toPreserve.set(dirName, snap);
|
||||
}
|
||||
}
|
||||
|
||||
_removeGsdEntries(dest, kind);
|
||||
_copyStaged(item.sourceDir, dest, kind, configDir);
|
||||
|
||||
// Restore user-owned dirs after the prune+copy
|
||||
for (const [dirName, snap] of toPreserve) {
|
||||
_restoreDir(path.join(dest, dirName), snap);
|
||||
}
|
||||
} else {
|
||||
// For non-skills kinds (commands, agents): no user content to preserve;
|
||||
// just prune stale gsd-* entries and copy new ones.
|
||||
_removeGsdEntries(dest, kind);
|
||||
_copyStaged(item.sourceDir, dest, kind, configDir);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
for (const dir of cleanupDirs) {
|
||||
try { fs.rmSync(dir, { recursive: true, force: true }); } catch { /* best-effort */ }
|
||||
}
|
||||
}
|
||||
|
||||
// Hermes: after the install loop has written all gsd-<stem>/ dirs to
|
||||
// skills/gsd/, remove any stale bare-stem dirs (skills/gsd/<stem>/) that
|
||||
// correspond to the newly installed gsd-<stem> entries. This is the robust
|
||||
// replacement for the readGsdCommandNames()-based pre-install cleanup that
|
||||
// missed skills like 'dev-preferences' (#947 adversarial review).
|
||||
//
|
||||
// We run this AFTER the install loop so the installed set is authoritative:
|
||||
// every gsd-<stem>/ present now was written this run (or was there before
|
||||
// with the same prefix). User-owned bare dirs with no gsd-<stem> counterpart
|
||||
// are untouched.
|
||||
if (runtime === 'hermes') {
|
||||
const nestedGsdDirForCleanup = path.join(configDir, 'skills', 'gsd');
|
||||
_removeHermesBareStemDirs(nestedGsdDirForCleanup);
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// installOpencodeFamilySkills
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Install the skills layout kind for an OpenCode-family runtime (OpenCode/Kilo).
|
||||
*
|
||||
* These runtimes do NOT go through installRuntimeArtifacts (their commands use a
|
||||
* bespoke flattened-command writer), so this writes ONLY the skills kind
|
||||
* alongside their existing command/ + agents/ surfaces. Uninstall is already
|
||||
* layout-driven (uninstallRuntimeArtifacts iterates layout.kinds), so the
|
||||
* skills/ dir is cleaned up automatically once the layout declares it.
|
||||
*
|
||||
* @param runtime - 'opencode' or 'kilo'
|
||||
* @param targetDir - resolved runtime config directory
|
||||
* @param rawCommandsDir - staged RAW Claude command dir (caller's _stageSkills output)
|
||||
* @param pathPrefix - computed config-path prefix for body rewrites
|
||||
* @param resolveAttribution - injection: (runtime) => attribution string | undefined
|
||||
* @returns number of gsd-* skill directories written
|
||||
*/
|
||||
function installOpencodeFamilySkills(
|
||||
runtime: string,
|
||||
targetDir: string,
|
||||
rawCommandsDir: string,
|
||||
pathPrefix: string,
|
||||
resolveAttribution: ResolveAttribution = () => undefined,
|
||||
): number {
|
||||
const layout: any = runtimeArtifactLayout.resolveRuntimeArtifactLayout(runtime, targetDir);
|
||||
const skillsKindEntry = layout.kinds.find((k: any) => k.kind === 'skills');
|
||||
if (!skillsKindEntry) return 0;
|
||||
const rawDir = rawCommandsDir;
|
||||
if (!rawDir || !fs.existsSync(rawDir)) return 0;
|
||||
|
||||
const converter = runtime === 'kilo'
|
||||
? convertClaudeCommandToKiloSkill
|
||||
: convertClaudeCommandToOpencodeSkill;
|
||||
|
||||
const dest = runtimeArtifactInstallPlan.assertDestWithinConfigHome(targetDir, skillsKindEntry.destSubpath);
|
||||
// Symlink-escape guard: reject if any path component between targetDir and
|
||||
// dest is a symlink that would redirect writes outside the config root.
|
||||
if (hasExistingSymlinkBetween(path.resolve(targetDir), dest)) {
|
||||
throw new Error(
|
||||
`installOpencodeFamilySkills: destDir "${dest}" contains a symlink escaping the install root "${targetDir}" — refusing to write`,
|
||||
);
|
||||
}
|
||||
fs.mkdirSync(dest, { recursive: true });
|
||||
|
||||
// Preserve user-owned GSD-prefixed skill dirs across the gsd-* prune.
|
||||
// gsd-dev-preferences is generated by the user (via generate-dev-preferences)
|
||||
// and lives at <configDir>/skills/gsd-dev-preferences — _removeGsdEntries
|
||||
// would otherwise wipe it. Mirrors the preservation in installRuntimeArtifacts
|
||||
// (#2973).
|
||||
const USER_OWNED_SKILL_DIRS = ['gsd-dev-preferences'];
|
||||
const toPreserve = new Map<string, Map<string, Buffer>>(); // dirName -> Map<relPath, Buffer>
|
||||
for (const dirName of USER_OWNED_SKILL_DIRS) {
|
||||
const skillDir = path.join(dest, dirName);
|
||||
if (!fs.existsSync(skillDir)) continue;
|
||||
const snap = _snapshotDir(skillDir);
|
||||
if (snap.size > 0) toPreserve.set(dirName, snap);
|
||||
}
|
||||
|
||||
_removeGsdEntries(dest, skillsKindEntry);
|
||||
|
||||
let count = 0;
|
||||
for (const entry of fs.readdirSync(rawDir, { withFileTypes: true })) {
|
||||
if (!entry.isFile() || !entry.name.endsWith('.md')) continue;
|
||||
const stem = entry.name.slice(0, -3);
|
||||
const skillName = `${skillsKindEntry.prefix}${stem}`;
|
||||
let content = fs.readFileSync(path.join(rawDir, entry.name), 'utf8');
|
||||
content = applyOpencodeFamilyPathPrefix(content, runtime, pathPrefix);
|
||||
content = processAttribution(content, resolveAttribution(runtime));
|
||||
content = converter(content, skillName);
|
||||
const skillDir = path.join(dest, skillName);
|
||||
fs.mkdirSync(skillDir, { recursive: true });
|
||||
fs.writeFileSync(path.join(skillDir, 'SKILL.md'), content);
|
||||
count++;
|
||||
}
|
||||
|
||||
// Restore user-owned dirs after the prune+copy.
|
||||
for (const [dirName, snap] of toPreserve) {
|
||||
_restoreDir(path.join(dest, dirName), snap);
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// uninstallRuntimeArtifacts
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Layout-driven uninstall orchestrator.
|
||||
* Runs legacy cleanup first, then uses resolveRuntimeArtifactLayout to
|
||||
* determine which GSD-owned entries to remove.
|
||||
*
|
||||
* @param runtime canonical runtime ID
|
||||
* @param configDir resolved runtime config directory
|
||||
* @param scope
|
||||
*/
|
||||
function uninstallRuntimeArtifacts(runtime: string, configDir: string, scope: string): void {
|
||||
// Legacy cleanup before layout-driven removal (scope-aware to avoid
|
||||
// removing Claude local commands/gsd/ which is the primary install dir).
|
||||
// Returns saved user artifacts so we can migrate AFTER layout removal
|
||||
// (the layout's gsd-* prefix pass would wipe a skill dir created here).
|
||||
const savedLegacyArtifacts = _runLegacyUninstallCleanup(runtime, configDir, scope);
|
||||
|
||||
const layout: any = runtimeArtifactLayout.resolveRuntimeArtifactLayout(runtime, configDir, scope as any);
|
||||
const plan: any = runtimeArtifactInstallPlan.createRuntimeArtifactUninstallPlan(layout);
|
||||
const kindsByName = new Map<string, any>(layout.kinds.map((kind: any) => [kind.kind as string, kind]));
|
||||
for (const item of plan.items) {
|
||||
const kind: any = kindsByName.get(item.kind);
|
||||
if (!kind) {
|
||||
throw new Error(`Runtime artifact uninstall plan referenced unknown kind: ${item.kind}`);
|
||||
}
|
||||
_removeGsdEntries(item.destDir, kind);
|
||||
}
|
||||
|
||||
// Hermes: after removing gsd-* skill dirs from skills/gsd/, also remove
|
||||
// the GSD-managed DESCRIPTION.md and then the category dir itself if it
|
||||
// contains no user content (#947). _removeGsdEntries removed gsd-* dirs
|
||||
// but left the category container and DESCRIPTION.md intact.
|
||||
if (runtime === 'hermes') {
|
||||
const nestedGsdDir = path.join(configDir, 'skills', 'gsd');
|
||||
if (fs.existsSync(nestedGsdDir)) {
|
||||
// Remove GSD-owned DESCRIPTION.md (written by writeHermesCategoryDescription)
|
||||
fs.rmSync(path.join(nestedGsdDir, 'DESCRIPTION.md'), { force: true });
|
||||
// Remove the category dir if empty (no user content remaining)
|
||||
const remaining = fs.readdirSync(nestedGsdDir, { withFileTypes: true });
|
||||
if (remaining.length === 0) {
|
||||
fs.rmSync(nestedGsdDir, { recursive: true, force: true });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// #2973 / Codex review (bd1f06c9): migrate dev-preferences.md to the
|
||||
// runtime-aware SKILL.md location after all layout-driven removal is
|
||||
// complete. Do NOT restore to commands/gsd/ — the user is uninstalling.
|
||||
if (savedLegacyArtifacts) {
|
||||
migrateLegacyDevPreferencesToSkill(configDir, savedLegacyArtifacts, runtime, scope);
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Exports
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export = {
|
||||
installRuntimeArtifacts,
|
||||
uninstallRuntimeArtifacts,
|
||||
installOpencodeFamilySkills,
|
||||
_copyStaged,
|
||||
hasExistingSymlinkBetween,
|
||||
preserveUserArtifacts,
|
||||
restoreUserArtifacts,
|
||||
migrateLegacyDevPreferencesToSkill,
|
||||
applyOpencodeFamilyPathPrefix,
|
||||
convertClaudeCommandToOpencodeSkill,
|
||||
convertClaudeCommandToKiloSkill,
|
||||
USER_OWNED_ARTIFACTS,
|
||||
_runLegacyInstallMigrations,
|
||||
_runLegacyUninstallCleanup,
|
||||
_removeGsdEntries,
|
||||
_snapshotDir,
|
||||
_restoreDir,
|
||||
_removeHermesBareStemDirs,
|
||||
};
|
||||
@@ -34,9 +34,11 @@ const path = require('node:path');
|
||||
const { cleanup, createTempDir } = require('./helpers.cjs');
|
||||
|
||||
const ROOT = path.join(__dirname, '..');
|
||||
const { convertClaudeCommandToClaudeSkill, installRuntimeArtifacts, skillFrontmatterName } =
|
||||
const { convertClaudeCommandToClaudeSkill, skillFrontmatterName } =
|
||||
require(path.join(ROOT, 'bin', 'install.js'));
|
||||
|
||||
const { installRuntimeArtifacts } = require(path.join(ROOT, 'gsd-core', 'bin', 'lib', 'install-engine.cjs'));
|
||||
|
||||
const {
|
||||
loadSkillsManifest,
|
||||
resolveProfile,
|
||||
|
||||
@@ -45,7 +45,8 @@ const { cleanup } = require('./helpers.cjs');
|
||||
const ROOT = path.join(__dirname, '..');
|
||||
const PROFILE_OUTPUT = path.join(ROOT, 'gsd-core', 'bin', 'lib', 'profile-output.cjs');
|
||||
const WORKFLOW = path.join(ROOT, 'gsd-core', 'workflows', 'profile-user.md');
|
||||
const INSTALL = path.join(ROOT, 'bin', 'install.js');
|
||||
|
||||
const installEngine = require('../gsd-core/bin/lib/install-engine.cjs');
|
||||
|
||||
describe('Bug #2973: dev-preferences default writer path is skills/gsd-dev-preferences/SKILL.md', () => {
|
||||
test('exercise the writer in a subprocess with HOME pointed at a tmp dir; assert the artifact lands at the skills path', () => {
|
||||
@@ -112,7 +113,7 @@ describe('Bug #2973: profile-user.md confirmation message references the skills
|
||||
|
||||
describe('Bug #2973: installer migrates existing legacy dev-preferences.md to skills/gsd-dev-preferences/SKILL.md', () => {
|
||||
test('migrateLegacyDevPreferencesToSkill is exported and writes to the skills path', () => {
|
||||
const inst = require(INSTALL);
|
||||
const inst = installEngine;
|
||||
// Module exports the migration helper for direct testing.
|
||||
// Note: this is the structural assertion — the helper exists with the
|
||||
// documented signature. End-to-end install testing is covered by
|
||||
@@ -124,7 +125,7 @@ describe('Bug #2973: installer migrates existing legacy dev-preferences.md to sk
|
||||
test('migration writes to skills/gsd-dev-preferences/SKILL.md when no skill exists yet', () => {
|
||||
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-2973-mig-'));
|
||||
try {
|
||||
const inst = require(INSTALL);
|
||||
const inst = installEngine;
|
||||
const saved = new Map([['dev-preferences.md', '# my legacy preferences\n']]);
|
||||
const migrated = inst.migrateLegacyDevPreferencesToSkill(tmpDir, saved);
|
||||
assert.equal(migrated, true, 'expected migration to succeed when no SKILL.md exists');
|
||||
@@ -139,7 +140,7 @@ describe('Bug #2973: installer migrates existing legacy dev-preferences.md to sk
|
||||
test('migration is a no-op when a SKILL.md already exists at the new location (do not clobber user-customized skill content)', () => {
|
||||
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-2973-skip-'));
|
||||
try {
|
||||
const inst = require(INSTALL);
|
||||
const inst = installEngine;
|
||||
const skillDir = path.join(tmpDir, 'skills', 'gsd-dev-preferences');
|
||||
const skillFile = path.join(skillDir, 'SKILL.md');
|
||||
fs.mkdirSync(skillDir, { recursive: true });
|
||||
@@ -172,7 +173,7 @@ describe('Bug #2973 (#3003 CR): installRuntimeArtifacts preserves user-owned gsd
|
||||
// Production install() does NOT call uninstallRuntimeArtifacts() first.
|
||||
// installRuntimeArtifacts → _copyStaged overlays only staged skill dirs;
|
||||
// gsd-dev-preferences (not in source) is left untouched.
|
||||
const inst = require(INSTALL);
|
||||
const inst = installEngine;
|
||||
const { loadSkillsManifest, resolveProfile } = require(path.join(ROOT, 'gsd-core', 'bin', 'lib', 'install-profiles.cjs'));
|
||||
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-2973-wipe-'));
|
||||
try {
|
||||
@@ -212,7 +213,7 @@ describe('Bug #2973 (#3003 CR): installRuntimeArtifacts preserves user-owned gsd
|
||||
// installRuntimeArtifacts() — the full uninstall+reinstall cycle.
|
||||
// uninstallRuntimeArtifacts removes all gsd-* entries; installRuntimeArtifacts
|
||||
// then writes fresh ones from source.
|
||||
const inst = require(INSTALL);
|
||||
const inst = installEngine;
|
||||
const { loadSkillsManifest, resolveProfile } = require(path.join(ROOT, 'gsd-core', 'bin', 'lib', 'install-profiles.cjs'));
|
||||
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-2973-wipe-shipped-'));
|
||||
try {
|
||||
|
||||
@@ -23,11 +23,12 @@ const { createTempDir, cleanup, captureConsole } = require('./helpers.cjs');
|
||||
const {
|
||||
convertClaudeCommandToClineSkill,
|
||||
convertClaudeToCliineMarkdown,
|
||||
installRuntimeArtifacts,
|
||||
install,
|
||||
_applyRuntimeRewrites,
|
||||
} = require('../bin/install.js');
|
||||
|
||||
const { installRuntimeArtifacts } = require('../gsd-core/bin/lib/install-engine.cjs');
|
||||
|
||||
const {
|
||||
resolveRuntimeArtifactLayout,
|
||||
} = require('../gsd-core/bin/lib/runtime-artifact-layout.cjs');
|
||||
|
||||
@@ -37,7 +37,7 @@ const os = require('node:os');
|
||||
const ROOT = path.join(__dirname, '..');
|
||||
const COMMANDS_GSD = path.join(ROOT, 'commands', 'gsd');
|
||||
|
||||
const { installRuntimeArtifacts } = require('../bin/install.js');
|
||||
const { installRuntimeArtifacts } = require('../gsd-core/bin/lib/install-engine.cjs');
|
||||
const { cleanup } = require('./helpers.cjs');
|
||||
const {
|
||||
loadSkillsManifest,
|
||||
|
||||
@@ -26,7 +26,7 @@ const fs = require('node:fs');
|
||||
const path = require('node:path');
|
||||
const os = require('node:os');
|
||||
|
||||
const { installRuntimeArtifacts } = require('../bin/install.js');
|
||||
const { installRuntimeArtifacts } = require('../gsd-core/bin/lib/install-engine.cjs');
|
||||
const { parseFrontmatter, cleanup } = require('./helpers.cjs');
|
||||
const {
|
||||
loadSkillsManifest,
|
||||
|
||||
@@ -25,9 +25,12 @@ const ROOT = path.join(__dirname, '..');
|
||||
const {
|
||||
convertClaudeCommandToClaudeSkill,
|
||||
writeManifest,
|
||||
} = require(path.join(ROOT, 'bin', 'install.js'));
|
||||
|
||||
const {
|
||||
installRuntimeArtifacts,
|
||||
uninstallRuntimeArtifacts,
|
||||
} = require(path.join(ROOT, 'bin', 'install.js'));
|
||||
} = require(path.join(ROOT, 'gsd-core', 'bin', 'lib', 'install-engine.cjs'));
|
||||
|
||||
const {
|
||||
loadSkillsManifest,
|
||||
|
||||
@@ -21,9 +21,10 @@ const {
|
||||
install,
|
||||
uninstall,
|
||||
writeManifest,
|
||||
installRuntimeArtifacts,
|
||||
} = require('../bin/install.js');
|
||||
|
||||
const { installRuntimeArtifacts } = require('../gsd-core/bin/lib/install-engine.cjs');
|
||||
|
||||
const { getGlobalConfigDir } = require('../gsd-core/bin/lib/runtime-homes.cjs');
|
||||
|
||||
// ─── Profile resolution for installRuntimeArtifacts tests ────────────────────
|
||||
|
||||
@@ -44,13 +44,14 @@ const {
|
||||
writeCopilotHookConfig,
|
||||
writeManifest,
|
||||
reportLocalPatches,
|
||||
installRuntimeArtifacts,
|
||||
runtimeMap,
|
||||
allRuntimes,
|
||||
parseRuntimeInput,
|
||||
buildRuntimePromptText,
|
||||
} = require('../bin/install.js');
|
||||
|
||||
const { installRuntimeArtifacts } = require('../gsd-core/bin/lib/install-engine.cjs');
|
||||
|
||||
const { getGlobalConfigDir } = require('../gsd-core/bin/lib/runtime-homes.cjs');
|
||||
|
||||
// ─── Profile resolution for installRuntimeArtifacts tests ────────────────────
|
||||
|
||||
@@ -38,11 +38,14 @@ const path = require('node:path');
|
||||
const { createTempDir, cleanup } = require('./helpers.cjs');
|
||||
|
||||
const {
|
||||
installRuntimeArtifacts,
|
||||
uninstallRuntimeArtifacts,
|
||||
convertClaudeCommandToCodebuddyCommand,
|
||||
convertClaudeCommandToCodebuddySkill,
|
||||
} = require('../bin/install.js');
|
||||
|
||||
const {
|
||||
installRuntimeArtifacts,
|
||||
uninstallRuntimeArtifacts,
|
||||
} = require('../gsd-core/bin/lib/install-engine.cjs');
|
||||
const { resolveRuntimeArtifactLayout } = require('../gsd-core/bin/lib/runtime-artifact-layout.cjs');
|
||||
const { loadSkillsManifest, resolveProfile } = require('../gsd-core/bin/lib/install-profiles.cjs');
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ const path = require('node:path');
|
||||
|
||||
const { createTempDir, cleanup } = require('./helpers.cjs');
|
||||
|
||||
const { installRuntimeArtifacts } = require('../bin/install.js');
|
||||
const { installRuntimeArtifacts, uninstallRuntimeArtifacts } = require('../gsd-core/bin/lib/install-engine.cjs');
|
||||
const { resolveRuntimeArtifactLayout } = require('../gsd-core/bin/lib/runtime-artifact-layout.cjs');
|
||||
const { loadSkillsManifest, resolveProfile } = require('../gsd-core/bin/lib/install-profiles.cjs');
|
||||
|
||||
@@ -177,7 +177,7 @@ describe('enh-790 — uninstallRuntimeArtifacts removes augment commands', () =>
|
||||
const configDir = createTempDir('gsd-enh790-uninstall-');
|
||||
t.after(() => cleanup(configDir));
|
||||
|
||||
const { uninstallRuntimeArtifacts } = require('../bin/install.js');
|
||||
// uninstallRuntimeArtifacts is imported from install-engine.cjs at the top of this file
|
||||
|
||||
// Pre-create: a GSD command + a user-owned command
|
||||
const commandsDir = path.join(configDir, 'commands');
|
||||
|
||||
@@ -30,7 +30,7 @@ const {
|
||||
installOpencodeFamilySkills,
|
||||
installRuntimeArtifacts,
|
||||
_copyStaged,
|
||||
} = require('../bin/install.js');
|
||||
} = require('../gsd-core/bin/lib/install-engine.cjs');
|
||||
|
||||
const { createTempDir, cleanup } = require('./helpers.cjs');
|
||||
|
||||
|
||||
@@ -40,148 +40,6 @@
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "08cbf1f404d64b93",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/lib/active-workstream-store.cjs": "3bfe7dff4b800602",
|
||||
"gsd-core/bin/lib/adr-parser.cjs": "741a7a23743fdb46",
|
||||
"gsd-core/bin/lib/agent-command-router.cjs": "dc06df2790d6b6f7",
|
||||
"gsd-core/bin/lib/agent-install-check.cjs": "66afc7f0f1935b9a",
|
||||
"gsd-core/bin/lib/artifacts.cjs": "cb1581675d6fa21e",
|
||||
"gsd-core/bin/lib/audit-command-router.cjs": "83320c0d5945060b",
|
||||
"gsd-core/bin/lib/audit.cjs": "7844d355fb599509",
|
||||
"gsd-core/bin/lib/capability-activation.cjs": "6319c7b3f8b71d7b",
|
||||
"gsd-core/bin/lib/capability-consent.cjs": "309c957ef1707b21",
|
||||
"gsd-core/bin/lib/capability-ledger.cjs": "1abaf0d194703c92",
|
||||
"gsd-core/bin/lib/capability-lifecycle.cjs": "cf55c9d1000682c7",
|
||||
"gsd-core/bin/lib/capability-loader.cjs": "38fc9566893db3af",
|
||||
"gsd-core/bin/lib/capability-lock.cjs": "81cf58b717a32e2a",
|
||||
"gsd-core/bin/lib/capability-registry.cjs": "57c9a910cf058c74",
|
||||
"gsd-core/bin/lib/capability-source.cjs": "1122731793f04408",
|
||||
"gsd-core/bin/lib/capability-state.cjs": "b4ffc1bf1786e102",
|
||||
"gsd-core/bin/lib/capability-trust.cjs": "28f513d40b58af16",
|
||||
"gsd-core/bin/lib/capability-validator.cjs": "3e4658be7e0a5741",
|
||||
"gsd-core/bin/lib/capability-writer.cjs": "85d872d8b2af1eb4",
|
||||
"gsd-core/bin/lib/check-command-router.cjs": "b9964792a9e4116e",
|
||||
"gsd-core/bin/lib/cjs-command-router-adapter.cjs": "baaddeadfacf4ed2",
|
||||
"gsd-core/bin/lib/cli-exit.cjs": "8913adfc6f878155",
|
||||
"gsd-core/bin/lib/clock.cjs": "e0121af119585126",
|
||||
"gsd-core/bin/lib/clusters.cjs": "1f260412e5890d75",
|
||||
"gsd-core/bin/lib/code-review-flags.cjs": "607b42845cfa9f0d",
|
||||
"gsd-core/bin/lib/command-aliases.cjs": "aaad70c106709bbe",
|
||||
"gsd-core/bin/lib/command-arg-projection.cjs": "5dc425098779393e",
|
||||
"gsd-core/bin/lib/command-roster.cjs": "e9c8cc5cdbb2d234",
|
||||
"gsd-core/bin/lib/command-routing-hub.cjs": "5c3d4e54c3eb0dee",
|
||||
"gsd-core/bin/lib/commands.cjs": "710ae91893333dfa",
|
||||
"gsd-core/bin/lib/config-loader.cjs": "ad82ca6acb6b93f3",
|
||||
"gsd-core/bin/lib/config-schema.cjs": "28eb2a5db1b407a7",
|
||||
"gsd-core/bin/lib/config-types.cjs": "96d613c58f03e1b4",
|
||||
"gsd-core/bin/lib/config.cjs": "36d9956efdb801a9",
|
||||
"gsd-core/bin/lib/configuration.cjs": "05b2194def83ed56",
|
||||
"gsd-core/bin/lib/context-utilization.cjs": "e584bd8192164750",
|
||||
"gsd-core/bin/lib/core-utils.cjs": "31a635dae39110ae",
|
||||
"gsd-core/bin/lib/coverage.cjs": "2dd1a846167d29ca",
|
||||
"gsd-core/bin/lib/decisions.cjs": "38f886a7247e3d5a",
|
||||
"gsd-core/bin/lib/docs.cjs": "2575e4c1172aa022",
|
||||
"gsd-core/bin/lib/drift.cjs": "3336156fb1d90f9e",
|
||||
"gsd-core/bin/lib/edge-probe.cjs": "965a6eb3ff5e65f4",
|
||||
"gsd-core/bin/lib/eval-command-router.cjs": "c27b6b78bbdeaaf4",
|
||||
"gsd-core/bin/lib/eval.cjs": "1fe6f60777fc3e68",
|
||||
"gsd-core/bin/lib/fallow-runner.cjs": "b01ed16271f408b1",
|
||||
"gsd-core/bin/lib/federated-config.cjs": "070bec8afc3e523a",
|
||||
"gsd-core/bin/lib/frontmatter.cjs": "5fdc9423eba17a9f",
|
||||
"gsd-core/bin/lib/gap-checker.cjs": "08f1f264b2031a50",
|
||||
"gsd-core/bin/lib/git-base-branch.cjs": "53a4e91cd94f6221",
|
||||
"gsd-core/bin/lib/graphify-command-router.cjs": "6672e02eca402d2b",
|
||||
"gsd-core/bin/lib/graphify.cjs": "9471802c2efc13c1",
|
||||
"gsd-core/bin/lib/gsd2-import.cjs": "4dc7dbb282e00185",
|
||||
"gsd-core/bin/lib/host-integration.cjs": "5050b73b4c50fc79",
|
||||
"gsd-core/bin/lib/init-command-router.cjs": "5f6b583acaba1037",
|
||||
"gsd-core/bin/lib/init.cjs": "2016d2d14a2be22f",
|
||||
"gsd-core/bin/lib/install-profiles.cjs": "8c5d1318f4940307",
|
||||
"gsd-core/bin/lib/installer-migration-authoring.cjs": "050285a34b4b0b22",
|
||||
"gsd-core/bin/lib/installer-migration-report.cjs": "da74c64aec42cf6d",
|
||||
"gsd-core/bin/lib/installer-migrations.cjs": "2c1b6d9ab7cab62a",
|
||||
"gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs": "27ae3ff0770c4c7b",
|
||||
"gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs": "e279bc0b87f040ca",
|
||||
"gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs": "8292c3e6af11c481",
|
||||
"gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs": "2cfb01e1e4d23461",
|
||||
"gsd-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs": "c1409ecc6b92b7e9",
|
||||
"gsd-core/bin/lib/intel-command-router.cjs": "3611eabadbaedbab",
|
||||
"gsd-core/bin/lib/intel.cjs": "86bf72a9910944e0",
|
||||
"gsd-core/bin/lib/io.cjs": "7d83809959fb3a8a",
|
||||
"gsd-core/bin/lib/learnings.cjs": "0f45ad609455ca62",
|
||||
"gsd-core/bin/lib/legacy-cleanup.cjs": "9aaf0480449906e6",
|
||||
"gsd-core/bin/lib/loop-host-contract.cjs": "da7f76ddb082620d",
|
||||
"gsd-core/bin/lib/loop-resolver.cjs": "25ce1eb00e95fa80",
|
||||
"gsd-core/bin/lib/markdown-sectionizer.cjs": "29d794e5de981792",
|
||||
"gsd-core/bin/lib/milestone.cjs": "ba975c7595f4a929",
|
||||
"gsd-core/bin/lib/model-catalog.cjs": "c4dcf3ddd17d25cd",
|
||||
"gsd-core/bin/lib/model-profiles.cjs": "83249502f09ccd78",
|
||||
"gsd-core/bin/lib/model-resolver.cjs": "1b60bb3d3be6b275",
|
||||
"gsd-core/bin/lib/observability/event.cjs": "c3595929b827ab0e",
|
||||
"gsd-core/bin/lib/observability/logger.cjs": "c57185d96dec038f",
|
||||
"gsd-core/bin/lib/observability/redaction.cjs": "1565fe81a6c50837",
|
||||
"gsd-core/bin/lib/package-identity.cjs": "34051a3e4874fae4",
|
||||
"gsd-core/bin/lib/package-legitimacy.cjs": "d9677032f76cbdb2",
|
||||
"gsd-core/bin/lib/phase-command-router.cjs": "74ac64360d41ae5b",
|
||||
"gsd-core/bin/lib/phase-id.cjs": "60e2e0e4760f6b82",
|
||||
"gsd-core/bin/lib/phase-lifecycle.cjs": "0b1d7e6b4d14ad66",
|
||||
"gsd-core/bin/lib/phase-locator.cjs": "cf8de89cfcf097cd",
|
||||
"gsd-core/bin/lib/phase.cjs": "dbb0cb0aa8a04c2b",
|
||||
"gsd-core/bin/lib/phases-command-router.cjs": "f57d97992f0281c6",
|
||||
"gsd-core/bin/lib/plan-drift-guard.cjs": "b3d0bc58767b2567",
|
||||
"gsd-core/bin/lib/plan-scan.cjs": "07cadb766a55c6d0",
|
||||
"gsd-core/bin/lib/planning-workspace.cjs": "f2317830591bf4f8",
|
||||
"gsd-core/bin/lib/probe-core.cjs": "73ba5d375910ff28",
|
||||
"gsd-core/bin/lib/profile-output.cjs": "857a883c048c7b0e",
|
||||
"gsd-core/bin/lib/profile-pipeline-command-router.cjs": "827e4e524304ad25",
|
||||
"gsd-core/bin/lib/profile-pipeline.cjs": "8a83396121f489b8",
|
||||
"gsd-core/bin/lib/prohibition-enforcement.cjs": "c183ec49139a62e5",
|
||||
"gsd-core/bin/lib/project-root.cjs": "163993df1925a44b",
|
||||
"gsd-core/bin/lib/prompt-budget.cjs": "7356b0e890cda70b",
|
||||
"gsd-core/bin/lib/research-provider.cjs": "23b53a582199eff6",
|
||||
"gsd-core/bin/lib/research-store.cjs": "5031d4e184367f7f",
|
||||
"gsd-core/bin/lib/resolution.cjs": "fd11df257a4eb398",
|
||||
"gsd-core/bin/lib/review-reviewer-selection.cjs": "adb03f906b609563",
|
||||
"gsd-core/bin/lib/roadmap-command-router.cjs": "13dfdf17596f8998",
|
||||
"gsd-core/bin/lib/roadmap-parser.cjs": "077b798638c88f6c",
|
||||
"gsd-core/bin/lib/roadmap-upgrade.cjs": "31b1d30bb04a773f",
|
||||
"gsd-core/bin/lib/roadmap.cjs": "c49ec2fa9ec9e423",
|
||||
"gsd-core/bin/lib/runtime-artifact-conversion.cjs": "1652d802051ad61f",
|
||||
"gsd-core/bin/lib/runtime-artifact-install-plan.cjs": "f1a94835b9881ca7",
|
||||
"gsd-core/bin/lib/runtime-artifact-layout.cjs": "d137c54440169191",
|
||||
"gsd-core/bin/lib/runtime-config-adapter-registry.cjs": "89e41665a8a90477",
|
||||
"gsd-core/bin/lib/runtime-homes.cjs": "5cd06615a098f423",
|
||||
"gsd-core/bin/lib/runtime-hooks-surface.cjs": "afe526540ec0183c",
|
||||
"gsd-core/bin/lib/runtime-name-policy.cjs": "9e02fade3612b27c",
|
||||
"gsd-core/bin/lib/runtime-slash.cjs": "41d01fb919d90bba",
|
||||
"gsd-core/bin/lib/schema-detect.cjs": "451be154264efe2f",
|
||||
"gsd-core/bin/lib/secrets.cjs": "02b42408bba154f2",
|
||||
"gsd-core/bin/lib/security.cjs": "c7f10a4c817b8b86",
|
||||
"gsd-core/bin/lib/semver-compare.cjs": "4f661153bc421cfc",
|
||||
"gsd-core/bin/lib/shell-command-projection.cjs": "f4480cca0ac06af6",
|
||||
"gsd-core/bin/lib/stale-bake-guard.cjs": "8f4449be425ffd08",
|
||||
"gsd-core/bin/lib/state-command-router.cjs": "f388d1204557b02b",
|
||||
"gsd-core/bin/lib/state-document.cjs": "33936a718bae305a",
|
||||
"gsd-core/bin/lib/state.cjs": "4d06f311264fcbe0",
|
||||
"gsd-core/bin/lib/surface.cjs": "45387f0a64fe3944",
|
||||
"gsd-core/bin/lib/task-command-router.cjs": "f1eb768e2a233057",
|
||||
"gsd-core/bin/lib/teams-status.cjs": "1c779e9b1928cdc5",
|
||||
"gsd-core/bin/lib/template.cjs": "3c02fe523b07da1a",
|
||||
"gsd-core/bin/lib/uat-predicate.cjs": "f0cf70e68244b834",
|
||||
"gsd-core/bin/lib/uat.cjs": "e1e3f2448e46f795",
|
||||
"gsd-core/bin/lib/ui-safety-gate.cjs": "f98279fb1ad1cee9",
|
||||
"gsd-core/bin/lib/update-context.cjs": "c45cfd1f73c37685",
|
||||
"gsd-core/bin/lib/validate-command-router.cjs": "e570f512c81f36aa",
|
||||
"gsd-core/bin/lib/validate.cjs": "71d10133337363d5",
|
||||
"gsd-core/bin/lib/verification-command-router.cjs": "7bb27562559625a2",
|
||||
"gsd-core/bin/lib/verification.cjs": "62578334903576c3",
|
||||
"gsd-core/bin/lib/verify-command-router.cjs": "847b2e8b74d4141d",
|
||||
"gsd-core/bin/lib/verify.cjs": "495c7a5a09593127",
|
||||
"gsd-core/bin/lib/workstream-inventory-builder.cjs": "17dd14ec7c59a024",
|
||||
"gsd-core/bin/lib/workstream-inventory.cjs": "e0383128698517de",
|
||||
"gsd-core/bin/lib/workstream-name-policy.cjs": "151ef8edad98cf2c",
|
||||
"gsd-core/bin/lib/workstream.cjs": "b7b6832f8b5a7b7f",
|
||||
"gsd-core/bin/lib/worktree-base-ref.cjs": "fa3fbbbf45412098",
|
||||
"gsd-core/bin/lib/worktree-safety.cjs": "d1e943bdf02c115a",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "67e4addbfd248a7c",
|
||||
"gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6",
|
||||
|
||||
142
tests/fixtures/golden-install-parity/augment.json
vendored
142
tests/fixtures/golden-install-parity/augment.json
vendored
@@ -109,148 +109,6 @@
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "1f2ff4e80aa45439",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/lib/active-workstream-store.cjs": "3bfe7dff4b800602",
|
||||
"gsd-core/bin/lib/adr-parser.cjs": "741a7a23743fdb46",
|
||||
"gsd-core/bin/lib/agent-command-router.cjs": "dc06df2790d6b6f7",
|
||||
"gsd-core/bin/lib/agent-install-check.cjs": "66afc7f0f1935b9a",
|
||||
"gsd-core/bin/lib/artifacts.cjs": "253076a1b2476446",
|
||||
"gsd-core/bin/lib/audit-command-router.cjs": "83320c0d5945060b",
|
||||
"gsd-core/bin/lib/audit.cjs": "9c0b659cde833828",
|
||||
"gsd-core/bin/lib/capability-activation.cjs": "6319c7b3f8b71d7b",
|
||||
"gsd-core/bin/lib/capability-consent.cjs": "309c957ef1707b21",
|
||||
"gsd-core/bin/lib/capability-ledger.cjs": "1abaf0d194703c92",
|
||||
"gsd-core/bin/lib/capability-lifecycle.cjs": "b6887bd3413e8a72",
|
||||
"gsd-core/bin/lib/capability-loader.cjs": "38fc9566893db3af",
|
||||
"gsd-core/bin/lib/capability-lock.cjs": "81cf58b717a32e2a",
|
||||
"gsd-core/bin/lib/capability-registry.cjs": "40888aec313fd6c7",
|
||||
"gsd-core/bin/lib/capability-source.cjs": "1122731793f04408",
|
||||
"gsd-core/bin/lib/capability-state.cjs": "bd174dc7488dfc10",
|
||||
"gsd-core/bin/lib/capability-trust.cjs": "28f513d40b58af16",
|
||||
"gsd-core/bin/lib/capability-validator.cjs": "3e4658be7e0a5741",
|
||||
"gsd-core/bin/lib/capability-writer.cjs": "760f53876da20268",
|
||||
"gsd-core/bin/lib/check-command-router.cjs": "7363dc0df9e5f8c5",
|
||||
"gsd-core/bin/lib/cjs-command-router-adapter.cjs": "baaddeadfacf4ed2",
|
||||
"gsd-core/bin/lib/cli-exit.cjs": "8913adfc6f878155",
|
||||
"gsd-core/bin/lib/clock.cjs": "e0121af119585126",
|
||||
"gsd-core/bin/lib/clusters.cjs": "64526279798dada8",
|
||||
"gsd-core/bin/lib/code-review-flags.cjs": "a347151887fc8486",
|
||||
"gsd-core/bin/lib/command-aliases.cjs": "aaad70c106709bbe",
|
||||
"gsd-core/bin/lib/command-arg-projection.cjs": "5dc425098779393e",
|
||||
"gsd-core/bin/lib/command-roster.cjs": "e9c8cc5cdbb2d234",
|
||||
"gsd-core/bin/lib/command-routing-hub.cjs": "5c3d4e54c3eb0dee",
|
||||
"gsd-core/bin/lib/commands.cjs": "710ae91893333dfa",
|
||||
"gsd-core/bin/lib/config-loader.cjs": "ad06d596d8e0c71d",
|
||||
"gsd-core/bin/lib/config-schema.cjs": "28eb2a5db1b407a7",
|
||||
"gsd-core/bin/lib/config-types.cjs": "96d613c58f03e1b4",
|
||||
"gsd-core/bin/lib/config.cjs": "fb2cfce9ab259ffe",
|
||||
"gsd-core/bin/lib/configuration.cjs": "05b2194def83ed56",
|
||||
"gsd-core/bin/lib/context-utilization.cjs": "e584bd8192164750",
|
||||
"gsd-core/bin/lib/core-utils.cjs": "31a635dae39110ae",
|
||||
"gsd-core/bin/lib/coverage.cjs": "2dd1a846167d29ca",
|
||||
"gsd-core/bin/lib/decisions.cjs": "4714718596d2fe73",
|
||||
"gsd-core/bin/lib/docs.cjs": "2575e4c1172aa022",
|
||||
"gsd-core/bin/lib/drift.cjs": "3336156fb1d90f9e",
|
||||
"gsd-core/bin/lib/edge-probe.cjs": "965a6eb3ff5e65f4",
|
||||
"gsd-core/bin/lib/eval-command-router.cjs": "c27b6b78bbdeaaf4",
|
||||
"gsd-core/bin/lib/eval.cjs": "1fe6f60777fc3e68",
|
||||
"gsd-core/bin/lib/fallow-runner.cjs": "b01ed16271f408b1",
|
||||
"gsd-core/bin/lib/federated-config.cjs": "070bec8afc3e523a",
|
||||
"gsd-core/bin/lib/frontmatter.cjs": "5fdc9423eba17a9f",
|
||||
"gsd-core/bin/lib/gap-checker.cjs": "08f1f264b2031a50",
|
||||
"gsd-core/bin/lib/git-base-branch.cjs": "53a4e91cd94f6221",
|
||||
"gsd-core/bin/lib/graphify-command-router.cjs": "6672e02eca402d2b",
|
||||
"gsd-core/bin/lib/graphify.cjs": "9471802c2efc13c1",
|
||||
"gsd-core/bin/lib/gsd2-import.cjs": "4dc7dbb282e00185",
|
||||
"gsd-core/bin/lib/host-integration.cjs": "5050b73b4c50fc79",
|
||||
"gsd-core/bin/lib/init-command-router.cjs": "5f6b583acaba1037",
|
||||
"gsd-core/bin/lib/init.cjs": "bcbe3af4720cb769",
|
||||
"gsd-core/bin/lib/install-profiles.cjs": "8c5d1318f4940307",
|
||||
"gsd-core/bin/lib/installer-migration-authoring.cjs": "050285a34b4b0b22",
|
||||
"gsd-core/bin/lib/installer-migration-report.cjs": "675fd40fd9c3aae4",
|
||||
"gsd-core/bin/lib/installer-migrations.cjs": "2c1b6d9ab7cab62a",
|
||||
"gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs": "27ae3ff0770c4c7b",
|
||||
"gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs": "e279bc0b87f040ca",
|
||||
"gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs": "8292c3e6af11c481",
|
||||
"gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs": "2cfb01e1e4d23461",
|
||||
"gsd-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs": "c1409ecc6b92b7e9",
|
||||
"gsd-core/bin/lib/intel-command-router.cjs": "3611eabadbaedbab",
|
||||
"gsd-core/bin/lib/intel.cjs": "86bf72a9910944e0",
|
||||
"gsd-core/bin/lib/io.cjs": "7d83809959fb3a8a",
|
||||
"gsd-core/bin/lib/learnings.cjs": "0f45ad609455ca62",
|
||||
"gsd-core/bin/lib/legacy-cleanup.cjs": "9aaf0480449906e6",
|
||||
"gsd-core/bin/lib/loop-host-contract.cjs": "da7f76ddb082620d",
|
||||
"gsd-core/bin/lib/loop-resolver.cjs": "25ce1eb00e95fa80",
|
||||
"gsd-core/bin/lib/markdown-sectionizer.cjs": "29d794e5de981792",
|
||||
"gsd-core/bin/lib/milestone.cjs": "ba975c7595f4a929",
|
||||
"gsd-core/bin/lib/model-catalog.cjs": "c4dcf3ddd17d25cd",
|
||||
"gsd-core/bin/lib/model-profiles.cjs": "83249502f09ccd78",
|
||||
"gsd-core/bin/lib/model-resolver.cjs": "cac3ec39756ab17e",
|
||||
"gsd-core/bin/lib/observability/event.cjs": "c3595929b827ab0e",
|
||||
"gsd-core/bin/lib/observability/logger.cjs": "c57185d96dec038f",
|
||||
"gsd-core/bin/lib/observability/redaction.cjs": "1565fe81a6c50837",
|
||||
"gsd-core/bin/lib/package-identity.cjs": "34051a3e4874fae4",
|
||||
"gsd-core/bin/lib/package-legitimacy.cjs": "d9677032f76cbdb2",
|
||||
"gsd-core/bin/lib/phase-command-router.cjs": "74ac64360d41ae5b",
|
||||
"gsd-core/bin/lib/phase-id.cjs": "60e2e0e4760f6b82",
|
||||
"gsd-core/bin/lib/phase-lifecycle.cjs": "0b1d7e6b4d14ad66",
|
||||
"gsd-core/bin/lib/phase-locator.cjs": "cf8de89cfcf097cd",
|
||||
"gsd-core/bin/lib/phase.cjs": "dbb0cb0aa8a04c2b",
|
||||
"gsd-core/bin/lib/phases-command-router.cjs": "f57d97992f0281c6",
|
||||
"gsd-core/bin/lib/plan-drift-guard.cjs": "b3d0bc58767b2567",
|
||||
"gsd-core/bin/lib/plan-scan.cjs": "07cadb766a55c6d0",
|
||||
"gsd-core/bin/lib/planning-workspace.cjs": "f2317830591bf4f8",
|
||||
"gsd-core/bin/lib/probe-core.cjs": "73ba5d375910ff28",
|
||||
"gsd-core/bin/lib/profile-output.cjs": "378808e03fd67c61",
|
||||
"gsd-core/bin/lib/profile-pipeline-command-router.cjs": "827e4e524304ad25",
|
||||
"gsd-core/bin/lib/profile-pipeline.cjs": "787e4248ca4c878d",
|
||||
"gsd-core/bin/lib/prohibition-enforcement.cjs": "c183ec49139a62e5",
|
||||
"gsd-core/bin/lib/project-root.cjs": "163993df1925a44b",
|
||||
"gsd-core/bin/lib/prompt-budget.cjs": "7356b0e890cda70b",
|
||||
"gsd-core/bin/lib/research-provider.cjs": "23b53a582199eff6",
|
||||
"gsd-core/bin/lib/research-store.cjs": "5031d4e184367f7f",
|
||||
"gsd-core/bin/lib/resolution.cjs": "fd11df257a4eb398",
|
||||
"gsd-core/bin/lib/review-reviewer-selection.cjs": "2f632c155aefbdd3",
|
||||
"gsd-core/bin/lib/roadmap-command-router.cjs": "13dfdf17596f8998",
|
||||
"gsd-core/bin/lib/roadmap-parser.cjs": "077b798638c88f6c",
|
||||
"gsd-core/bin/lib/roadmap-upgrade.cjs": "31b1d30bb04a773f",
|
||||
"gsd-core/bin/lib/roadmap.cjs": "c49ec2fa9ec9e423",
|
||||
"gsd-core/bin/lib/runtime-artifact-conversion.cjs": "16d63bcf307a2a35",
|
||||
"gsd-core/bin/lib/runtime-artifact-install-plan.cjs": "2389590d607dd559",
|
||||
"gsd-core/bin/lib/runtime-artifact-layout.cjs": "61e04a9e389ff4e2",
|
||||
"gsd-core/bin/lib/runtime-config-adapter-registry.cjs": "89e41665a8a90477",
|
||||
"gsd-core/bin/lib/runtime-homes.cjs": "12b47d66d04170c8",
|
||||
"gsd-core/bin/lib/runtime-hooks-surface.cjs": "7c559132cabe057d",
|
||||
"gsd-core/bin/lib/runtime-name-policy.cjs": "9ad3466f6811210e",
|
||||
"gsd-core/bin/lib/runtime-slash.cjs": "252e7cbc25eb2197",
|
||||
"gsd-core/bin/lib/schema-detect.cjs": "451be154264efe2f",
|
||||
"gsd-core/bin/lib/secrets.cjs": "02b42408bba154f2",
|
||||
"gsd-core/bin/lib/security.cjs": "c7f10a4c817b8b86",
|
||||
"gsd-core/bin/lib/semver-compare.cjs": "4f661153bc421cfc",
|
||||
"gsd-core/bin/lib/shell-command-projection.cjs": "f0a1c2d8d0ba9a1e",
|
||||
"gsd-core/bin/lib/stale-bake-guard.cjs": "d81694c9ff2836d3",
|
||||
"gsd-core/bin/lib/state-command-router.cjs": "f388d1204557b02b",
|
||||
"gsd-core/bin/lib/state-document.cjs": "33936a718bae305a",
|
||||
"gsd-core/bin/lib/state.cjs": "4d06f311264fcbe0",
|
||||
"gsd-core/bin/lib/surface.cjs": "59e7f250d204a513",
|
||||
"gsd-core/bin/lib/task-command-router.cjs": "f1eb768e2a233057",
|
||||
"gsd-core/bin/lib/teams-status.cjs": "1c779e9b1928cdc5",
|
||||
"gsd-core/bin/lib/template.cjs": "3c02fe523b07da1a",
|
||||
"gsd-core/bin/lib/uat-predicate.cjs": "f0cf70e68244b834",
|
||||
"gsd-core/bin/lib/uat.cjs": "e1e3f2448e46f795",
|
||||
"gsd-core/bin/lib/ui-safety-gate.cjs": "f98279fb1ad1cee9",
|
||||
"gsd-core/bin/lib/update-context.cjs": "c45cfd1f73c37685",
|
||||
"gsd-core/bin/lib/validate-command-router.cjs": "e570f512c81f36aa",
|
||||
"gsd-core/bin/lib/validate.cjs": "71d10133337363d5",
|
||||
"gsd-core/bin/lib/verification-command-router.cjs": "7bb27562559625a2",
|
||||
"gsd-core/bin/lib/verification.cjs": "349fe736d467eec9",
|
||||
"gsd-core/bin/lib/verify-command-router.cjs": "847b2e8b74d4141d",
|
||||
"gsd-core/bin/lib/verify.cjs": "495c7a5a09593127",
|
||||
"gsd-core/bin/lib/workstream-inventory-builder.cjs": "17dd14ec7c59a024",
|
||||
"gsd-core/bin/lib/workstream-inventory.cjs": "e0383128698517de",
|
||||
"gsd-core/bin/lib/workstream-name-policy.cjs": "151ef8edad98cf2c",
|
||||
"gsd-core/bin/lib/workstream.cjs": "b7b6832f8b5a7b7f",
|
||||
"gsd-core/bin/lib/worktree-base-ref.cjs": "0a20f520af59b940",
|
||||
"gsd-core/bin/lib/worktree-safety.cjs": "d1e943bdf02c115a",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "67e4addbfd248a7c",
|
||||
"gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6",
|
||||
|
||||
142
tests/fixtures/golden-install-parity/claude.json
vendored
142
tests/fixtures/golden-install-parity/claude.json
vendored
@@ -39,148 +39,6 @@
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "1f2ff4e80aa45439",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/lib/active-workstream-store.cjs": "3bfe7dff4b800602",
|
||||
"gsd-core/bin/lib/adr-parser.cjs": "741a7a23743fdb46",
|
||||
"gsd-core/bin/lib/agent-command-router.cjs": "dc06df2790d6b6f7",
|
||||
"gsd-core/bin/lib/agent-install-check.cjs": "66afc7f0f1935b9a",
|
||||
"gsd-core/bin/lib/artifacts.cjs": "253076a1b2476446",
|
||||
"gsd-core/bin/lib/audit-command-router.cjs": "83320c0d5945060b",
|
||||
"gsd-core/bin/lib/audit.cjs": "9c0b659cde833828",
|
||||
"gsd-core/bin/lib/capability-activation.cjs": "6319c7b3f8b71d7b",
|
||||
"gsd-core/bin/lib/capability-consent.cjs": "309c957ef1707b21",
|
||||
"gsd-core/bin/lib/capability-ledger.cjs": "1abaf0d194703c92",
|
||||
"gsd-core/bin/lib/capability-lifecycle.cjs": "b6887bd3413e8a72",
|
||||
"gsd-core/bin/lib/capability-loader.cjs": "38fc9566893db3af",
|
||||
"gsd-core/bin/lib/capability-lock.cjs": "81cf58b717a32e2a",
|
||||
"gsd-core/bin/lib/capability-registry.cjs": "40888aec313fd6c7",
|
||||
"gsd-core/bin/lib/capability-source.cjs": "1122731793f04408",
|
||||
"gsd-core/bin/lib/capability-state.cjs": "bd174dc7488dfc10",
|
||||
"gsd-core/bin/lib/capability-trust.cjs": "28f513d40b58af16",
|
||||
"gsd-core/bin/lib/capability-validator.cjs": "3e4658be7e0a5741",
|
||||
"gsd-core/bin/lib/capability-writer.cjs": "760f53876da20268",
|
||||
"gsd-core/bin/lib/check-command-router.cjs": "7363dc0df9e5f8c5",
|
||||
"gsd-core/bin/lib/cjs-command-router-adapter.cjs": "baaddeadfacf4ed2",
|
||||
"gsd-core/bin/lib/cli-exit.cjs": "8913adfc6f878155",
|
||||
"gsd-core/bin/lib/clock.cjs": "e0121af119585126",
|
||||
"gsd-core/bin/lib/clusters.cjs": "64526279798dada8",
|
||||
"gsd-core/bin/lib/code-review-flags.cjs": "a347151887fc8486",
|
||||
"gsd-core/bin/lib/command-aliases.cjs": "aaad70c106709bbe",
|
||||
"gsd-core/bin/lib/command-arg-projection.cjs": "5dc425098779393e",
|
||||
"gsd-core/bin/lib/command-roster.cjs": "e9c8cc5cdbb2d234",
|
||||
"gsd-core/bin/lib/command-routing-hub.cjs": "5c3d4e54c3eb0dee",
|
||||
"gsd-core/bin/lib/commands.cjs": "710ae91893333dfa",
|
||||
"gsd-core/bin/lib/config-loader.cjs": "ad06d596d8e0c71d",
|
||||
"gsd-core/bin/lib/config-schema.cjs": "28eb2a5db1b407a7",
|
||||
"gsd-core/bin/lib/config-types.cjs": "96d613c58f03e1b4",
|
||||
"gsd-core/bin/lib/config.cjs": "fb2cfce9ab259ffe",
|
||||
"gsd-core/bin/lib/configuration.cjs": "05b2194def83ed56",
|
||||
"gsd-core/bin/lib/context-utilization.cjs": "e584bd8192164750",
|
||||
"gsd-core/bin/lib/core-utils.cjs": "31a635dae39110ae",
|
||||
"gsd-core/bin/lib/coverage.cjs": "2dd1a846167d29ca",
|
||||
"gsd-core/bin/lib/decisions.cjs": "4714718596d2fe73",
|
||||
"gsd-core/bin/lib/docs.cjs": "2575e4c1172aa022",
|
||||
"gsd-core/bin/lib/drift.cjs": "3336156fb1d90f9e",
|
||||
"gsd-core/bin/lib/edge-probe.cjs": "965a6eb3ff5e65f4",
|
||||
"gsd-core/bin/lib/eval-command-router.cjs": "c27b6b78bbdeaaf4",
|
||||
"gsd-core/bin/lib/eval.cjs": "1fe6f60777fc3e68",
|
||||
"gsd-core/bin/lib/fallow-runner.cjs": "b01ed16271f408b1",
|
||||
"gsd-core/bin/lib/federated-config.cjs": "070bec8afc3e523a",
|
||||
"gsd-core/bin/lib/frontmatter.cjs": "5fdc9423eba17a9f",
|
||||
"gsd-core/bin/lib/gap-checker.cjs": "08f1f264b2031a50",
|
||||
"gsd-core/bin/lib/git-base-branch.cjs": "53a4e91cd94f6221",
|
||||
"gsd-core/bin/lib/graphify-command-router.cjs": "6672e02eca402d2b",
|
||||
"gsd-core/bin/lib/graphify.cjs": "9471802c2efc13c1",
|
||||
"gsd-core/bin/lib/gsd2-import.cjs": "4dc7dbb282e00185",
|
||||
"gsd-core/bin/lib/host-integration.cjs": "5050b73b4c50fc79",
|
||||
"gsd-core/bin/lib/init-command-router.cjs": "5f6b583acaba1037",
|
||||
"gsd-core/bin/lib/init.cjs": "bcbe3af4720cb769",
|
||||
"gsd-core/bin/lib/install-profiles.cjs": "8c5d1318f4940307",
|
||||
"gsd-core/bin/lib/installer-migration-authoring.cjs": "050285a34b4b0b22",
|
||||
"gsd-core/bin/lib/installer-migration-report.cjs": "675fd40fd9c3aae4",
|
||||
"gsd-core/bin/lib/installer-migrations.cjs": "2c1b6d9ab7cab62a",
|
||||
"gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs": "27ae3ff0770c4c7b",
|
||||
"gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs": "e279bc0b87f040ca",
|
||||
"gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs": "8292c3e6af11c481",
|
||||
"gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs": "2cfb01e1e4d23461",
|
||||
"gsd-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs": "c1409ecc6b92b7e9",
|
||||
"gsd-core/bin/lib/intel-command-router.cjs": "3611eabadbaedbab",
|
||||
"gsd-core/bin/lib/intel.cjs": "86bf72a9910944e0",
|
||||
"gsd-core/bin/lib/io.cjs": "7d83809959fb3a8a",
|
||||
"gsd-core/bin/lib/learnings.cjs": "0f45ad609455ca62",
|
||||
"gsd-core/bin/lib/legacy-cleanup.cjs": "9aaf0480449906e6",
|
||||
"gsd-core/bin/lib/loop-host-contract.cjs": "da7f76ddb082620d",
|
||||
"gsd-core/bin/lib/loop-resolver.cjs": "25ce1eb00e95fa80",
|
||||
"gsd-core/bin/lib/markdown-sectionizer.cjs": "29d794e5de981792",
|
||||
"gsd-core/bin/lib/milestone.cjs": "ba975c7595f4a929",
|
||||
"gsd-core/bin/lib/model-catalog.cjs": "c4dcf3ddd17d25cd",
|
||||
"gsd-core/bin/lib/model-profiles.cjs": "83249502f09ccd78",
|
||||
"gsd-core/bin/lib/model-resolver.cjs": "cac3ec39756ab17e",
|
||||
"gsd-core/bin/lib/observability/event.cjs": "c3595929b827ab0e",
|
||||
"gsd-core/bin/lib/observability/logger.cjs": "c57185d96dec038f",
|
||||
"gsd-core/bin/lib/observability/redaction.cjs": "1565fe81a6c50837",
|
||||
"gsd-core/bin/lib/package-identity.cjs": "34051a3e4874fae4",
|
||||
"gsd-core/bin/lib/package-legitimacy.cjs": "d9677032f76cbdb2",
|
||||
"gsd-core/bin/lib/phase-command-router.cjs": "74ac64360d41ae5b",
|
||||
"gsd-core/bin/lib/phase-id.cjs": "60e2e0e4760f6b82",
|
||||
"gsd-core/bin/lib/phase-lifecycle.cjs": "0b1d7e6b4d14ad66",
|
||||
"gsd-core/bin/lib/phase-locator.cjs": "cf8de89cfcf097cd",
|
||||
"gsd-core/bin/lib/phase.cjs": "dbb0cb0aa8a04c2b",
|
||||
"gsd-core/bin/lib/phases-command-router.cjs": "f57d97992f0281c6",
|
||||
"gsd-core/bin/lib/plan-drift-guard.cjs": "b3d0bc58767b2567",
|
||||
"gsd-core/bin/lib/plan-scan.cjs": "07cadb766a55c6d0",
|
||||
"gsd-core/bin/lib/planning-workspace.cjs": "f2317830591bf4f8",
|
||||
"gsd-core/bin/lib/probe-core.cjs": "73ba5d375910ff28",
|
||||
"gsd-core/bin/lib/profile-output.cjs": "378808e03fd67c61",
|
||||
"gsd-core/bin/lib/profile-pipeline-command-router.cjs": "827e4e524304ad25",
|
||||
"gsd-core/bin/lib/profile-pipeline.cjs": "787e4248ca4c878d",
|
||||
"gsd-core/bin/lib/prohibition-enforcement.cjs": "c183ec49139a62e5",
|
||||
"gsd-core/bin/lib/project-root.cjs": "163993df1925a44b",
|
||||
"gsd-core/bin/lib/prompt-budget.cjs": "7356b0e890cda70b",
|
||||
"gsd-core/bin/lib/research-provider.cjs": "23b53a582199eff6",
|
||||
"gsd-core/bin/lib/research-store.cjs": "5031d4e184367f7f",
|
||||
"gsd-core/bin/lib/resolution.cjs": "fd11df257a4eb398",
|
||||
"gsd-core/bin/lib/review-reviewer-selection.cjs": "2f632c155aefbdd3",
|
||||
"gsd-core/bin/lib/roadmap-command-router.cjs": "13dfdf17596f8998",
|
||||
"gsd-core/bin/lib/roadmap-parser.cjs": "077b798638c88f6c",
|
||||
"gsd-core/bin/lib/roadmap-upgrade.cjs": "31b1d30bb04a773f",
|
||||
"gsd-core/bin/lib/roadmap.cjs": "c49ec2fa9ec9e423",
|
||||
"gsd-core/bin/lib/runtime-artifact-conversion.cjs": "16d63bcf307a2a35",
|
||||
"gsd-core/bin/lib/runtime-artifact-install-plan.cjs": "2389590d607dd559",
|
||||
"gsd-core/bin/lib/runtime-artifact-layout.cjs": "61e04a9e389ff4e2",
|
||||
"gsd-core/bin/lib/runtime-config-adapter-registry.cjs": "89e41665a8a90477",
|
||||
"gsd-core/bin/lib/runtime-homes.cjs": "12b47d66d04170c8",
|
||||
"gsd-core/bin/lib/runtime-hooks-surface.cjs": "7c559132cabe057d",
|
||||
"gsd-core/bin/lib/runtime-name-policy.cjs": "9ad3466f6811210e",
|
||||
"gsd-core/bin/lib/runtime-slash.cjs": "252e7cbc25eb2197",
|
||||
"gsd-core/bin/lib/schema-detect.cjs": "451be154264efe2f",
|
||||
"gsd-core/bin/lib/secrets.cjs": "02b42408bba154f2",
|
||||
"gsd-core/bin/lib/security.cjs": "c7f10a4c817b8b86",
|
||||
"gsd-core/bin/lib/semver-compare.cjs": "4f661153bc421cfc",
|
||||
"gsd-core/bin/lib/shell-command-projection.cjs": "f0a1c2d8d0ba9a1e",
|
||||
"gsd-core/bin/lib/stale-bake-guard.cjs": "d81694c9ff2836d3",
|
||||
"gsd-core/bin/lib/state-command-router.cjs": "f388d1204557b02b",
|
||||
"gsd-core/bin/lib/state-document.cjs": "33936a718bae305a",
|
||||
"gsd-core/bin/lib/state.cjs": "4d06f311264fcbe0",
|
||||
"gsd-core/bin/lib/surface.cjs": "59e7f250d204a513",
|
||||
"gsd-core/bin/lib/task-command-router.cjs": "f1eb768e2a233057",
|
||||
"gsd-core/bin/lib/teams-status.cjs": "1c779e9b1928cdc5",
|
||||
"gsd-core/bin/lib/template.cjs": "3c02fe523b07da1a",
|
||||
"gsd-core/bin/lib/uat-predicate.cjs": "f0cf70e68244b834",
|
||||
"gsd-core/bin/lib/uat.cjs": "e1e3f2448e46f795",
|
||||
"gsd-core/bin/lib/ui-safety-gate.cjs": "f98279fb1ad1cee9",
|
||||
"gsd-core/bin/lib/update-context.cjs": "c45cfd1f73c37685",
|
||||
"gsd-core/bin/lib/validate-command-router.cjs": "e570f512c81f36aa",
|
||||
"gsd-core/bin/lib/validate.cjs": "71d10133337363d5",
|
||||
"gsd-core/bin/lib/verification-command-router.cjs": "7bb27562559625a2",
|
||||
"gsd-core/bin/lib/verification.cjs": "349fe736d467eec9",
|
||||
"gsd-core/bin/lib/verify-command-router.cjs": "847b2e8b74d4141d",
|
||||
"gsd-core/bin/lib/verify.cjs": "495c7a5a09593127",
|
||||
"gsd-core/bin/lib/workstream-inventory-builder.cjs": "17dd14ec7c59a024",
|
||||
"gsd-core/bin/lib/workstream-inventory.cjs": "e0383128698517de",
|
||||
"gsd-core/bin/lib/workstream-name-policy.cjs": "151ef8edad98cf2c",
|
||||
"gsd-core/bin/lib/workstream.cjs": "b7b6832f8b5a7b7f",
|
||||
"gsd-core/bin/lib/worktree-base-ref.cjs": "0a20f520af59b940",
|
||||
"gsd-core/bin/lib/worktree-safety.cjs": "d1e943bdf02c115a",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "67e4addbfd248a7c",
|
||||
"gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6",
|
||||
|
||||
142
tests/fixtures/golden-install-parity/cline.json
vendored
142
tests/fixtures/golden-install-parity/cline.json
vendored
@@ -43,148 +43,6 @@
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "1f2ff4e80aa45439",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/lib/active-workstream-store.cjs": "3bfe7dff4b800602",
|
||||
"gsd-core/bin/lib/adr-parser.cjs": "741a7a23743fdb46",
|
||||
"gsd-core/bin/lib/agent-command-router.cjs": "dc06df2790d6b6f7",
|
||||
"gsd-core/bin/lib/agent-install-check.cjs": "66afc7f0f1935b9a",
|
||||
"gsd-core/bin/lib/artifacts.cjs": "6cd83ba9839d71c3",
|
||||
"gsd-core/bin/lib/audit-command-router.cjs": "83320c0d5945060b",
|
||||
"gsd-core/bin/lib/audit.cjs": "9c0b659cde833828",
|
||||
"gsd-core/bin/lib/capability-activation.cjs": "6319c7b3f8b71d7b",
|
||||
"gsd-core/bin/lib/capability-consent.cjs": "309c957ef1707b21",
|
||||
"gsd-core/bin/lib/capability-ledger.cjs": "1abaf0d194703c92",
|
||||
"gsd-core/bin/lib/capability-lifecycle.cjs": "b6887bd3413e8a72",
|
||||
"gsd-core/bin/lib/capability-loader.cjs": "38fc9566893db3af",
|
||||
"gsd-core/bin/lib/capability-lock.cjs": "81cf58b717a32e2a",
|
||||
"gsd-core/bin/lib/capability-registry.cjs": "d335644b9baeffd9",
|
||||
"gsd-core/bin/lib/capability-source.cjs": "1122731793f04408",
|
||||
"gsd-core/bin/lib/capability-state.cjs": "bd174dc7488dfc10",
|
||||
"gsd-core/bin/lib/capability-trust.cjs": "28f513d40b58af16",
|
||||
"gsd-core/bin/lib/capability-validator.cjs": "3e4658be7e0a5741",
|
||||
"gsd-core/bin/lib/capability-writer.cjs": "760f53876da20268",
|
||||
"gsd-core/bin/lib/check-command-router.cjs": "7363dc0df9e5f8c5",
|
||||
"gsd-core/bin/lib/cjs-command-router-adapter.cjs": "baaddeadfacf4ed2",
|
||||
"gsd-core/bin/lib/cli-exit.cjs": "8913adfc6f878155",
|
||||
"gsd-core/bin/lib/clock.cjs": "e0121af119585126",
|
||||
"gsd-core/bin/lib/clusters.cjs": "64526279798dada8",
|
||||
"gsd-core/bin/lib/code-review-flags.cjs": "a347151887fc8486",
|
||||
"gsd-core/bin/lib/command-aliases.cjs": "aaad70c106709bbe",
|
||||
"gsd-core/bin/lib/command-arg-projection.cjs": "5dc425098779393e",
|
||||
"gsd-core/bin/lib/command-roster.cjs": "e9c8cc5cdbb2d234",
|
||||
"gsd-core/bin/lib/command-routing-hub.cjs": "5c3d4e54c3eb0dee",
|
||||
"gsd-core/bin/lib/commands.cjs": "710ae91893333dfa",
|
||||
"gsd-core/bin/lib/config-loader.cjs": "ad06d596d8e0c71d",
|
||||
"gsd-core/bin/lib/config-schema.cjs": "28eb2a5db1b407a7",
|
||||
"gsd-core/bin/lib/config-types.cjs": "96d613c58f03e1b4",
|
||||
"gsd-core/bin/lib/config.cjs": "8bbdd645ad6f293c",
|
||||
"gsd-core/bin/lib/configuration.cjs": "05b2194def83ed56",
|
||||
"gsd-core/bin/lib/context-utilization.cjs": "e584bd8192164750",
|
||||
"gsd-core/bin/lib/core-utils.cjs": "31a635dae39110ae",
|
||||
"gsd-core/bin/lib/coverage.cjs": "2dd1a846167d29ca",
|
||||
"gsd-core/bin/lib/decisions.cjs": "4714718596d2fe73",
|
||||
"gsd-core/bin/lib/docs.cjs": "2575e4c1172aa022",
|
||||
"gsd-core/bin/lib/drift.cjs": "3336156fb1d90f9e",
|
||||
"gsd-core/bin/lib/edge-probe.cjs": "965a6eb3ff5e65f4",
|
||||
"gsd-core/bin/lib/eval-command-router.cjs": "c27b6b78bbdeaaf4",
|
||||
"gsd-core/bin/lib/eval.cjs": "1fe6f60777fc3e68",
|
||||
"gsd-core/bin/lib/fallow-runner.cjs": "b01ed16271f408b1",
|
||||
"gsd-core/bin/lib/federated-config.cjs": "070bec8afc3e523a",
|
||||
"gsd-core/bin/lib/frontmatter.cjs": "5fdc9423eba17a9f",
|
||||
"gsd-core/bin/lib/gap-checker.cjs": "08f1f264b2031a50",
|
||||
"gsd-core/bin/lib/git-base-branch.cjs": "53a4e91cd94f6221",
|
||||
"gsd-core/bin/lib/graphify-command-router.cjs": "6672e02eca402d2b",
|
||||
"gsd-core/bin/lib/graphify.cjs": "9471802c2efc13c1",
|
||||
"gsd-core/bin/lib/gsd2-import.cjs": "4dc7dbb282e00185",
|
||||
"gsd-core/bin/lib/host-integration.cjs": "5050b73b4c50fc79",
|
||||
"gsd-core/bin/lib/init-command-router.cjs": "5f6b583acaba1037",
|
||||
"gsd-core/bin/lib/init.cjs": "bcbe3af4720cb769",
|
||||
"gsd-core/bin/lib/install-profiles.cjs": "8c5d1318f4940307",
|
||||
"gsd-core/bin/lib/installer-migration-authoring.cjs": "050285a34b4b0b22",
|
||||
"gsd-core/bin/lib/installer-migration-report.cjs": "65b06cc7d1a35182",
|
||||
"gsd-core/bin/lib/installer-migrations.cjs": "2c1b6d9ab7cab62a",
|
||||
"gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs": "27ae3ff0770c4c7b",
|
||||
"gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs": "e279bc0b87f040ca",
|
||||
"gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs": "8292c3e6af11c481",
|
||||
"gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs": "2cfb01e1e4d23461",
|
||||
"gsd-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs": "c1409ecc6b92b7e9",
|
||||
"gsd-core/bin/lib/intel-command-router.cjs": "3611eabadbaedbab",
|
||||
"gsd-core/bin/lib/intel.cjs": "86bf72a9910944e0",
|
||||
"gsd-core/bin/lib/io.cjs": "7e096df1cb79b17c",
|
||||
"gsd-core/bin/lib/learnings.cjs": "0f45ad609455ca62",
|
||||
"gsd-core/bin/lib/legacy-cleanup.cjs": "9aaf0480449906e6",
|
||||
"gsd-core/bin/lib/loop-host-contract.cjs": "da7f76ddb082620d",
|
||||
"gsd-core/bin/lib/loop-resolver.cjs": "25ce1eb00e95fa80",
|
||||
"gsd-core/bin/lib/markdown-sectionizer.cjs": "29d794e5de981792",
|
||||
"gsd-core/bin/lib/milestone.cjs": "ba975c7595f4a929",
|
||||
"gsd-core/bin/lib/model-catalog.cjs": "c4dcf3ddd17d25cd",
|
||||
"gsd-core/bin/lib/model-profiles.cjs": "83249502f09ccd78",
|
||||
"gsd-core/bin/lib/model-resolver.cjs": "29fc4b9ae037ee9c",
|
||||
"gsd-core/bin/lib/observability/event.cjs": "c3595929b827ab0e",
|
||||
"gsd-core/bin/lib/observability/logger.cjs": "c57185d96dec038f",
|
||||
"gsd-core/bin/lib/observability/redaction.cjs": "1565fe81a6c50837",
|
||||
"gsd-core/bin/lib/package-identity.cjs": "34051a3e4874fae4",
|
||||
"gsd-core/bin/lib/package-legitimacy.cjs": "d9677032f76cbdb2",
|
||||
"gsd-core/bin/lib/phase-command-router.cjs": "74ac64360d41ae5b",
|
||||
"gsd-core/bin/lib/phase-id.cjs": "60e2e0e4760f6b82",
|
||||
"gsd-core/bin/lib/phase-lifecycle.cjs": "0b1d7e6b4d14ad66",
|
||||
"gsd-core/bin/lib/phase-locator.cjs": "cf8de89cfcf097cd",
|
||||
"gsd-core/bin/lib/phase.cjs": "dbb0cb0aa8a04c2b",
|
||||
"gsd-core/bin/lib/phases-command-router.cjs": "f57d97992f0281c6",
|
||||
"gsd-core/bin/lib/plan-drift-guard.cjs": "b3d0bc58767b2567",
|
||||
"gsd-core/bin/lib/plan-scan.cjs": "07cadb766a55c6d0",
|
||||
"gsd-core/bin/lib/planning-workspace.cjs": "f2317830591bf4f8",
|
||||
"gsd-core/bin/lib/probe-core.cjs": "73ba5d375910ff28",
|
||||
"gsd-core/bin/lib/profile-output.cjs": "82fc24e8aa3a9adf",
|
||||
"gsd-core/bin/lib/profile-pipeline-command-router.cjs": "827e4e524304ad25",
|
||||
"gsd-core/bin/lib/profile-pipeline.cjs": "5a379afdbdf51922",
|
||||
"gsd-core/bin/lib/prohibition-enforcement.cjs": "c183ec49139a62e5",
|
||||
"gsd-core/bin/lib/project-root.cjs": "163993df1925a44b",
|
||||
"gsd-core/bin/lib/prompt-budget.cjs": "7356b0e890cda70b",
|
||||
"gsd-core/bin/lib/research-provider.cjs": "23b53a582199eff6",
|
||||
"gsd-core/bin/lib/research-store.cjs": "5031d4e184367f7f",
|
||||
"gsd-core/bin/lib/resolution.cjs": "fd11df257a4eb398",
|
||||
"gsd-core/bin/lib/review-reviewer-selection.cjs": "2f632c155aefbdd3",
|
||||
"gsd-core/bin/lib/roadmap-command-router.cjs": "13dfdf17596f8998",
|
||||
"gsd-core/bin/lib/roadmap-parser.cjs": "077b798638c88f6c",
|
||||
"gsd-core/bin/lib/roadmap-upgrade.cjs": "31b1d30bb04a773f",
|
||||
"gsd-core/bin/lib/roadmap.cjs": "c49ec2fa9ec9e423",
|
||||
"gsd-core/bin/lib/runtime-artifact-conversion.cjs": "622c89fa8c3b1645",
|
||||
"gsd-core/bin/lib/runtime-artifact-install-plan.cjs": "2389590d607dd559",
|
||||
"gsd-core/bin/lib/runtime-artifact-layout.cjs": "61e04a9e389ff4e2",
|
||||
"gsd-core/bin/lib/runtime-config-adapter-registry.cjs": "89e41665a8a90477",
|
||||
"gsd-core/bin/lib/runtime-homes.cjs": "12b47d66d04170c8",
|
||||
"gsd-core/bin/lib/runtime-hooks-surface.cjs": "50ab2384c0477f96",
|
||||
"gsd-core/bin/lib/runtime-name-policy.cjs": "120c49056815d1d1",
|
||||
"gsd-core/bin/lib/runtime-slash.cjs": "00afd79cc643e4c5",
|
||||
"gsd-core/bin/lib/schema-detect.cjs": "451be154264efe2f",
|
||||
"gsd-core/bin/lib/secrets.cjs": "02b42408bba154f2",
|
||||
"gsd-core/bin/lib/security.cjs": "c7f10a4c817b8b86",
|
||||
"gsd-core/bin/lib/semver-compare.cjs": "4f661153bc421cfc",
|
||||
"gsd-core/bin/lib/shell-command-projection.cjs": "390d31fef60ad491",
|
||||
"gsd-core/bin/lib/stale-bake-guard.cjs": "d81694c9ff2836d3",
|
||||
"gsd-core/bin/lib/state-command-router.cjs": "f388d1204557b02b",
|
||||
"gsd-core/bin/lib/state-document.cjs": "33936a718bae305a",
|
||||
"gsd-core/bin/lib/state.cjs": "4d06f311264fcbe0",
|
||||
"gsd-core/bin/lib/surface.cjs": "59e7f250d204a513",
|
||||
"gsd-core/bin/lib/task-command-router.cjs": "f1eb768e2a233057",
|
||||
"gsd-core/bin/lib/teams-status.cjs": "1c779e9b1928cdc5",
|
||||
"gsd-core/bin/lib/template.cjs": "3c02fe523b07da1a",
|
||||
"gsd-core/bin/lib/uat-predicate.cjs": "f0cf70e68244b834",
|
||||
"gsd-core/bin/lib/uat.cjs": "e1e3f2448e46f795",
|
||||
"gsd-core/bin/lib/ui-safety-gate.cjs": "f98279fb1ad1cee9",
|
||||
"gsd-core/bin/lib/update-context.cjs": "c45cfd1f73c37685",
|
||||
"gsd-core/bin/lib/validate-command-router.cjs": "e570f512c81f36aa",
|
||||
"gsd-core/bin/lib/validate.cjs": "71d10133337363d5",
|
||||
"gsd-core/bin/lib/verification-command-router.cjs": "7bb27562559625a2",
|
||||
"gsd-core/bin/lib/verification.cjs": "349fe736d467eec9",
|
||||
"gsd-core/bin/lib/verify-command-router.cjs": "847b2e8b74d4141d",
|
||||
"gsd-core/bin/lib/verify.cjs": "495c7a5a09593127",
|
||||
"gsd-core/bin/lib/workstream-inventory-builder.cjs": "17dd14ec7c59a024",
|
||||
"gsd-core/bin/lib/workstream-inventory.cjs": "e0383128698517de",
|
||||
"gsd-core/bin/lib/workstream-name-policy.cjs": "151ef8edad98cf2c",
|
||||
"gsd-core/bin/lib/workstream.cjs": "b7b6832f8b5a7b7f",
|
||||
"gsd-core/bin/lib/worktree-base-ref.cjs": "145f9cda6cb03f92",
|
||||
"gsd-core/bin/lib/worktree-safety.cjs": "d1e943bdf02c115a",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "67e4addbfd248a7c",
|
||||
"gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6",
|
||||
|
||||
142
tests/fixtures/golden-install-parity/codebuddy.json
vendored
142
tests/fixtures/golden-install-parity/codebuddy.json
vendored
@@ -109,148 +109,6 @@
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "1f2ff4e80aa45439",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/lib/active-workstream-store.cjs": "3bfe7dff4b800602",
|
||||
"gsd-core/bin/lib/adr-parser.cjs": "741a7a23743fdb46",
|
||||
"gsd-core/bin/lib/agent-command-router.cjs": "dc06df2790d6b6f7",
|
||||
"gsd-core/bin/lib/agent-install-check.cjs": "66afc7f0f1935b9a",
|
||||
"gsd-core/bin/lib/artifacts.cjs": "253076a1b2476446",
|
||||
"gsd-core/bin/lib/audit-command-router.cjs": "83320c0d5945060b",
|
||||
"gsd-core/bin/lib/audit.cjs": "9c0b659cde833828",
|
||||
"gsd-core/bin/lib/capability-activation.cjs": "6319c7b3f8b71d7b",
|
||||
"gsd-core/bin/lib/capability-consent.cjs": "309c957ef1707b21",
|
||||
"gsd-core/bin/lib/capability-ledger.cjs": "1abaf0d194703c92",
|
||||
"gsd-core/bin/lib/capability-lifecycle.cjs": "b6887bd3413e8a72",
|
||||
"gsd-core/bin/lib/capability-loader.cjs": "38fc9566893db3af",
|
||||
"gsd-core/bin/lib/capability-lock.cjs": "81cf58b717a32e2a",
|
||||
"gsd-core/bin/lib/capability-registry.cjs": "40888aec313fd6c7",
|
||||
"gsd-core/bin/lib/capability-source.cjs": "1122731793f04408",
|
||||
"gsd-core/bin/lib/capability-state.cjs": "bd174dc7488dfc10",
|
||||
"gsd-core/bin/lib/capability-trust.cjs": "28f513d40b58af16",
|
||||
"gsd-core/bin/lib/capability-validator.cjs": "3e4658be7e0a5741",
|
||||
"gsd-core/bin/lib/capability-writer.cjs": "760f53876da20268",
|
||||
"gsd-core/bin/lib/check-command-router.cjs": "7363dc0df9e5f8c5",
|
||||
"gsd-core/bin/lib/cjs-command-router-adapter.cjs": "baaddeadfacf4ed2",
|
||||
"gsd-core/bin/lib/cli-exit.cjs": "8913adfc6f878155",
|
||||
"gsd-core/bin/lib/clock.cjs": "e0121af119585126",
|
||||
"gsd-core/bin/lib/clusters.cjs": "64526279798dada8",
|
||||
"gsd-core/bin/lib/code-review-flags.cjs": "a347151887fc8486",
|
||||
"gsd-core/bin/lib/command-aliases.cjs": "aaad70c106709bbe",
|
||||
"gsd-core/bin/lib/command-arg-projection.cjs": "5dc425098779393e",
|
||||
"gsd-core/bin/lib/command-roster.cjs": "e9c8cc5cdbb2d234",
|
||||
"gsd-core/bin/lib/command-routing-hub.cjs": "5c3d4e54c3eb0dee",
|
||||
"gsd-core/bin/lib/commands.cjs": "710ae91893333dfa",
|
||||
"gsd-core/bin/lib/config-loader.cjs": "ad06d596d8e0c71d",
|
||||
"gsd-core/bin/lib/config-schema.cjs": "28eb2a5db1b407a7",
|
||||
"gsd-core/bin/lib/config-types.cjs": "96d613c58f03e1b4",
|
||||
"gsd-core/bin/lib/config.cjs": "fb2cfce9ab259ffe",
|
||||
"gsd-core/bin/lib/configuration.cjs": "05b2194def83ed56",
|
||||
"gsd-core/bin/lib/context-utilization.cjs": "e584bd8192164750",
|
||||
"gsd-core/bin/lib/core-utils.cjs": "31a635dae39110ae",
|
||||
"gsd-core/bin/lib/coverage.cjs": "2dd1a846167d29ca",
|
||||
"gsd-core/bin/lib/decisions.cjs": "4714718596d2fe73",
|
||||
"gsd-core/bin/lib/docs.cjs": "2575e4c1172aa022",
|
||||
"gsd-core/bin/lib/drift.cjs": "3336156fb1d90f9e",
|
||||
"gsd-core/bin/lib/edge-probe.cjs": "965a6eb3ff5e65f4",
|
||||
"gsd-core/bin/lib/eval-command-router.cjs": "c27b6b78bbdeaaf4",
|
||||
"gsd-core/bin/lib/eval.cjs": "1fe6f60777fc3e68",
|
||||
"gsd-core/bin/lib/fallow-runner.cjs": "b01ed16271f408b1",
|
||||
"gsd-core/bin/lib/federated-config.cjs": "070bec8afc3e523a",
|
||||
"gsd-core/bin/lib/frontmatter.cjs": "5fdc9423eba17a9f",
|
||||
"gsd-core/bin/lib/gap-checker.cjs": "08f1f264b2031a50",
|
||||
"gsd-core/bin/lib/git-base-branch.cjs": "53a4e91cd94f6221",
|
||||
"gsd-core/bin/lib/graphify-command-router.cjs": "6672e02eca402d2b",
|
||||
"gsd-core/bin/lib/graphify.cjs": "9471802c2efc13c1",
|
||||
"gsd-core/bin/lib/gsd2-import.cjs": "4dc7dbb282e00185",
|
||||
"gsd-core/bin/lib/host-integration.cjs": "5050b73b4c50fc79",
|
||||
"gsd-core/bin/lib/init-command-router.cjs": "5f6b583acaba1037",
|
||||
"gsd-core/bin/lib/init.cjs": "bcbe3af4720cb769",
|
||||
"gsd-core/bin/lib/install-profiles.cjs": "8c5d1318f4940307",
|
||||
"gsd-core/bin/lib/installer-migration-authoring.cjs": "050285a34b4b0b22",
|
||||
"gsd-core/bin/lib/installer-migration-report.cjs": "675fd40fd9c3aae4",
|
||||
"gsd-core/bin/lib/installer-migrations.cjs": "2c1b6d9ab7cab62a",
|
||||
"gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs": "27ae3ff0770c4c7b",
|
||||
"gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs": "e279bc0b87f040ca",
|
||||
"gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs": "8292c3e6af11c481",
|
||||
"gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs": "2cfb01e1e4d23461",
|
||||
"gsd-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs": "c1409ecc6b92b7e9",
|
||||
"gsd-core/bin/lib/intel-command-router.cjs": "3611eabadbaedbab",
|
||||
"gsd-core/bin/lib/intel.cjs": "86bf72a9910944e0",
|
||||
"gsd-core/bin/lib/io.cjs": "7d83809959fb3a8a",
|
||||
"gsd-core/bin/lib/learnings.cjs": "0f45ad609455ca62",
|
||||
"gsd-core/bin/lib/legacy-cleanup.cjs": "9aaf0480449906e6",
|
||||
"gsd-core/bin/lib/loop-host-contract.cjs": "da7f76ddb082620d",
|
||||
"gsd-core/bin/lib/loop-resolver.cjs": "25ce1eb00e95fa80",
|
||||
"gsd-core/bin/lib/markdown-sectionizer.cjs": "29d794e5de981792",
|
||||
"gsd-core/bin/lib/milestone.cjs": "ba975c7595f4a929",
|
||||
"gsd-core/bin/lib/model-catalog.cjs": "c4dcf3ddd17d25cd",
|
||||
"gsd-core/bin/lib/model-profiles.cjs": "83249502f09ccd78",
|
||||
"gsd-core/bin/lib/model-resolver.cjs": "cac3ec39756ab17e",
|
||||
"gsd-core/bin/lib/observability/event.cjs": "c3595929b827ab0e",
|
||||
"gsd-core/bin/lib/observability/logger.cjs": "c57185d96dec038f",
|
||||
"gsd-core/bin/lib/observability/redaction.cjs": "1565fe81a6c50837",
|
||||
"gsd-core/bin/lib/package-identity.cjs": "34051a3e4874fae4",
|
||||
"gsd-core/bin/lib/package-legitimacy.cjs": "d9677032f76cbdb2",
|
||||
"gsd-core/bin/lib/phase-command-router.cjs": "74ac64360d41ae5b",
|
||||
"gsd-core/bin/lib/phase-id.cjs": "60e2e0e4760f6b82",
|
||||
"gsd-core/bin/lib/phase-lifecycle.cjs": "0b1d7e6b4d14ad66",
|
||||
"gsd-core/bin/lib/phase-locator.cjs": "cf8de89cfcf097cd",
|
||||
"gsd-core/bin/lib/phase.cjs": "dbb0cb0aa8a04c2b",
|
||||
"gsd-core/bin/lib/phases-command-router.cjs": "f57d97992f0281c6",
|
||||
"gsd-core/bin/lib/plan-drift-guard.cjs": "b3d0bc58767b2567",
|
||||
"gsd-core/bin/lib/plan-scan.cjs": "07cadb766a55c6d0",
|
||||
"gsd-core/bin/lib/planning-workspace.cjs": "f2317830591bf4f8",
|
||||
"gsd-core/bin/lib/probe-core.cjs": "73ba5d375910ff28",
|
||||
"gsd-core/bin/lib/profile-output.cjs": "378808e03fd67c61",
|
||||
"gsd-core/bin/lib/profile-pipeline-command-router.cjs": "827e4e524304ad25",
|
||||
"gsd-core/bin/lib/profile-pipeline.cjs": "787e4248ca4c878d",
|
||||
"gsd-core/bin/lib/prohibition-enforcement.cjs": "c183ec49139a62e5",
|
||||
"gsd-core/bin/lib/project-root.cjs": "163993df1925a44b",
|
||||
"gsd-core/bin/lib/prompt-budget.cjs": "7356b0e890cda70b",
|
||||
"gsd-core/bin/lib/research-provider.cjs": "23b53a582199eff6",
|
||||
"gsd-core/bin/lib/research-store.cjs": "5031d4e184367f7f",
|
||||
"gsd-core/bin/lib/resolution.cjs": "fd11df257a4eb398",
|
||||
"gsd-core/bin/lib/review-reviewer-selection.cjs": "2f632c155aefbdd3",
|
||||
"gsd-core/bin/lib/roadmap-command-router.cjs": "13dfdf17596f8998",
|
||||
"gsd-core/bin/lib/roadmap-parser.cjs": "077b798638c88f6c",
|
||||
"gsd-core/bin/lib/roadmap-upgrade.cjs": "31b1d30bb04a773f",
|
||||
"gsd-core/bin/lib/roadmap.cjs": "c49ec2fa9ec9e423",
|
||||
"gsd-core/bin/lib/runtime-artifact-conversion.cjs": "16d63bcf307a2a35",
|
||||
"gsd-core/bin/lib/runtime-artifact-install-plan.cjs": "2389590d607dd559",
|
||||
"gsd-core/bin/lib/runtime-artifact-layout.cjs": "61e04a9e389ff4e2",
|
||||
"gsd-core/bin/lib/runtime-config-adapter-registry.cjs": "89e41665a8a90477",
|
||||
"gsd-core/bin/lib/runtime-homes.cjs": "12b47d66d04170c8",
|
||||
"gsd-core/bin/lib/runtime-hooks-surface.cjs": "7c559132cabe057d",
|
||||
"gsd-core/bin/lib/runtime-name-policy.cjs": "9ad3466f6811210e",
|
||||
"gsd-core/bin/lib/runtime-slash.cjs": "252e7cbc25eb2197",
|
||||
"gsd-core/bin/lib/schema-detect.cjs": "451be154264efe2f",
|
||||
"gsd-core/bin/lib/secrets.cjs": "02b42408bba154f2",
|
||||
"gsd-core/bin/lib/security.cjs": "c7f10a4c817b8b86",
|
||||
"gsd-core/bin/lib/semver-compare.cjs": "4f661153bc421cfc",
|
||||
"gsd-core/bin/lib/shell-command-projection.cjs": "f0a1c2d8d0ba9a1e",
|
||||
"gsd-core/bin/lib/stale-bake-guard.cjs": "d81694c9ff2836d3",
|
||||
"gsd-core/bin/lib/state-command-router.cjs": "f388d1204557b02b",
|
||||
"gsd-core/bin/lib/state-document.cjs": "33936a718bae305a",
|
||||
"gsd-core/bin/lib/state.cjs": "4d06f311264fcbe0",
|
||||
"gsd-core/bin/lib/surface.cjs": "59e7f250d204a513",
|
||||
"gsd-core/bin/lib/task-command-router.cjs": "f1eb768e2a233057",
|
||||
"gsd-core/bin/lib/teams-status.cjs": "1c779e9b1928cdc5",
|
||||
"gsd-core/bin/lib/template.cjs": "3c02fe523b07da1a",
|
||||
"gsd-core/bin/lib/uat-predicate.cjs": "f0cf70e68244b834",
|
||||
"gsd-core/bin/lib/uat.cjs": "e1e3f2448e46f795",
|
||||
"gsd-core/bin/lib/ui-safety-gate.cjs": "f98279fb1ad1cee9",
|
||||
"gsd-core/bin/lib/update-context.cjs": "c45cfd1f73c37685",
|
||||
"gsd-core/bin/lib/validate-command-router.cjs": "e570f512c81f36aa",
|
||||
"gsd-core/bin/lib/validate.cjs": "71d10133337363d5",
|
||||
"gsd-core/bin/lib/verification-command-router.cjs": "7bb27562559625a2",
|
||||
"gsd-core/bin/lib/verification.cjs": "349fe736d467eec9",
|
||||
"gsd-core/bin/lib/verify-command-router.cjs": "847b2e8b74d4141d",
|
||||
"gsd-core/bin/lib/verify.cjs": "495c7a5a09593127",
|
||||
"gsd-core/bin/lib/workstream-inventory-builder.cjs": "17dd14ec7c59a024",
|
||||
"gsd-core/bin/lib/workstream-inventory.cjs": "e0383128698517de",
|
||||
"gsd-core/bin/lib/workstream-name-policy.cjs": "151ef8edad98cf2c",
|
||||
"gsd-core/bin/lib/workstream.cjs": "b7b6832f8b5a7b7f",
|
||||
"gsd-core/bin/lib/worktree-base-ref.cjs": "0a20f520af59b940",
|
||||
"gsd-core/bin/lib/worktree-safety.cjs": "d1e943bdf02c115a",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "67e4addbfd248a7c",
|
||||
"gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6",
|
||||
|
||||
142
tests/fixtures/golden-install-parity/codex.json
vendored
142
tests/fixtures/golden-install-parity/codex.json
vendored
@@ -75,148 +75,6 @@
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "1f2ff4e80aa45439",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/lib/active-workstream-store.cjs": "3bfe7dff4b800602",
|
||||
"gsd-core/bin/lib/adr-parser.cjs": "741a7a23743fdb46",
|
||||
"gsd-core/bin/lib/agent-command-router.cjs": "dc06df2790d6b6f7",
|
||||
"gsd-core/bin/lib/agent-install-check.cjs": "66afc7f0f1935b9a",
|
||||
"gsd-core/bin/lib/artifacts.cjs": "253076a1b2476446",
|
||||
"gsd-core/bin/lib/audit-command-router.cjs": "83320c0d5945060b",
|
||||
"gsd-core/bin/lib/audit.cjs": "9c0b659cde833828",
|
||||
"gsd-core/bin/lib/capability-activation.cjs": "6319c7b3f8b71d7b",
|
||||
"gsd-core/bin/lib/capability-consent.cjs": "309c957ef1707b21",
|
||||
"gsd-core/bin/lib/capability-ledger.cjs": "1abaf0d194703c92",
|
||||
"gsd-core/bin/lib/capability-lifecycle.cjs": "b6887bd3413e8a72",
|
||||
"gsd-core/bin/lib/capability-loader.cjs": "38fc9566893db3af",
|
||||
"gsd-core/bin/lib/capability-lock.cjs": "81cf58b717a32e2a",
|
||||
"gsd-core/bin/lib/capability-registry.cjs": "40888aec313fd6c7",
|
||||
"gsd-core/bin/lib/capability-source.cjs": "1122731793f04408",
|
||||
"gsd-core/bin/lib/capability-state.cjs": "bd174dc7488dfc10",
|
||||
"gsd-core/bin/lib/capability-trust.cjs": "28f513d40b58af16",
|
||||
"gsd-core/bin/lib/capability-validator.cjs": "3e4658be7e0a5741",
|
||||
"gsd-core/bin/lib/capability-writer.cjs": "760f53876da20268",
|
||||
"gsd-core/bin/lib/check-command-router.cjs": "7363dc0df9e5f8c5",
|
||||
"gsd-core/bin/lib/cjs-command-router-adapter.cjs": "baaddeadfacf4ed2",
|
||||
"gsd-core/bin/lib/cli-exit.cjs": "8913adfc6f878155",
|
||||
"gsd-core/bin/lib/clock.cjs": "e0121af119585126",
|
||||
"gsd-core/bin/lib/clusters.cjs": "64526279798dada8",
|
||||
"gsd-core/bin/lib/code-review-flags.cjs": "a347151887fc8486",
|
||||
"gsd-core/bin/lib/command-aliases.cjs": "aaad70c106709bbe",
|
||||
"gsd-core/bin/lib/command-arg-projection.cjs": "5dc425098779393e",
|
||||
"gsd-core/bin/lib/command-roster.cjs": "e9c8cc5cdbb2d234",
|
||||
"gsd-core/bin/lib/command-routing-hub.cjs": "5c3d4e54c3eb0dee",
|
||||
"gsd-core/bin/lib/commands.cjs": "710ae91893333dfa",
|
||||
"gsd-core/bin/lib/config-loader.cjs": "ad06d596d8e0c71d",
|
||||
"gsd-core/bin/lib/config-schema.cjs": "28eb2a5db1b407a7",
|
||||
"gsd-core/bin/lib/config-types.cjs": "96d613c58f03e1b4",
|
||||
"gsd-core/bin/lib/config.cjs": "fb2cfce9ab259ffe",
|
||||
"gsd-core/bin/lib/configuration.cjs": "05b2194def83ed56",
|
||||
"gsd-core/bin/lib/context-utilization.cjs": "e584bd8192164750",
|
||||
"gsd-core/bin/lib/core-utils.cjs": "31a635dae39110ae",
|
||||
"gsd-core/bin/lib/coverage.cjs": "2dd1a846167d29ca",
|
||||
"gsd-core/bin/lib/decisions.cjs": "4714718596d2fe73",
|
||||
"gsd-core/bin/lib/docs.cjs": "2575e4c1172aa022",
|
||||
"gsd-core/bin/lib/drift.cjs": "3336156fb1d90f9e",
|
||||
"gsd-core/bin/lib/edge-probe.cjs": "965a6eb3ff5e65f4",
|
||||
"gsd-core/bin/lib/eval-command-router.cjs": "c27b6b78bbdeaaf4",
|
||||
"gsd-core/bin/lib/eval.cjs": "1fe6f60777fc3e68",
|
||||
"gsd-core/bin/lib/fallow-runner.cjs": "b01ed16271f408b1",
|
||||
"gsd-core/bin/lib/federated-config.cjs": "070bec8afc3e523a",
|
||||
"gsd-core/bin/lib/frontmatter.cjs": "5fdc9423eba17a9f",
|
||||
"gsd-core/bin/lib/gap-checker.cjs": "08f1f264b2031a50",
|
||||
"gsd-core/bin/lib/git-base-branch.cjs": "53a4e91cd94f6221",
|
||||
"gsd-core/bin/lib/graphify-command-router.cjs": "6672e02eca402d2b",
|
||||
"gsd-core/bin/lib/graphify.cjs": "9471802c2efc13c1",
|
||||
"gsd-core/bin/lib/gsd2-import.cjs": "4dc7dbb282e00185",
|
||||
"gsd-core/bin/lib/host-integration.cjs": "5050b73b4c50fc79",
|
||||
"gsd-core/bin/lib/init-command-router.cjs": "5f6b583acaba1037",
|
||||
"gsd-core/bin/lib/init.cjs": "bcbe3af4720cb769",
|
||||
"gsd-core/bin/lib/install-profiles.cjs": "8c5d1318f4940307",
|
||||
"gsd-core/bin/lib/installer-migration-authoring.cjs": "050285a34b4b0b22",
|
||||
"gsd-core/bin/lib/installer-migration-report.cjs": "675fd40fd9c3aae4",
|
||||
"gsd-core/bin/lib/installer-migrations.cjs": "2c1b6d9ab7cab62a",
|
||||
"gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs": "27ae3ff0770c4c7b",
|
||||
"gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs": "e279bc0b87f040ca",
|
||||
"gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs": "8292c3e6af11c481",
|
||||
"gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs": "2cfb01e1e4d23461",
|
||||
"gsd-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs": "c1409ecc6b92b7e9",
|
||||
"gsd-core/bin/lib/intel-command-router.cjs": "3611eabadbaedbab",
|
||||
"gsd-core/bin/lib/intel.cjs": "86bf72a9910944e0",
|
||||
"gsd-core/bin/lib/io.cjs": "7d83809959fb3a8a",
|
||||
"gsd-core/bin/lib/learnings.cjs": "0f45ad609455ca62",
|
||||
"gsd-core/bin/lib/legacy-cleanup.cjs": "9aaf0480449906e6",
|
||||
"gsd-core/bin/lib/loop-host-contract.cjs": "da7f76ddb082620d",
|
||||
"gsd-core/bin/lib/loop-resolver.cjs": "25ce1eb00e95fa80",
|
||||
"gsd-core/bin/lib/markdown-sectionizer.cjs": "29d794e5de981792",
|
||||
"gsd-core/bin/lib/milestone.cjs": "ba975c7595f4a929",
|
||||
"gsd-core/bin/lib/model-catalog.cjs": "c4dcf3ddd17d25cd",
|
||||
"gsd-core/bin/lib/model-profiles.cjs": "83249502f09ccd78",
|
||||
"gsd-core/bin/lib/model-resolver.cjs": "cac3ec39756ab17e",
|
||||
"gsd-core/bin/lib/observability/event.cjs": "c3595929b827ab0e",
|
||||
"gsd-core/bin/lib/observability/logger.cjs": "c57185d96dec038f",
|
||||
"gsd-core/bin/lib/observability/redaction.cjs": "1565fe81a6c50837",
|
||||
"gsd-core/bin/lib/package-identity.cjs": "34051a3e4874fae4",
|
||||
"gsd-core/bin/lib/package-legitimacy.cjs": "d9677032f76cbdb2",
|
||||
"gsd-core/bin/lib/phase-command-router.cjs": "74ac64360d41ae5b",
|
||||
"gsd-core/bin/lib/phase-id.cjs": "60e2e0e4760f6b82",
|
||||
"gsd-core/bin/lib/phase-lifecycle.cjs": "0b1d7e6b4d14ad66",
|
||||
"gsd-core/bin/lib/phase-locator.cjs": "cf8de89cfcf097cd",
|
||||
"gsd-core/bin/lib/phase.cjs": "dbb0cb0aa8a04c2b",
|
||||
"gsd-core/bin/lib/phases-command-router.cjs": "f57d97992f0281c6",
|
||||
"gsd-core/bin/lib/plan-drift-guard.cjs": "b3d0bc58767b2567",
|
||||
"gsd-core/bin/lib/plan-scan.cjs": "07cadb766a55c6d0",
|
||||
"gsd-core/bin/lib/planning-workspace.cjs": "f2317830591bf4f8",
|
||||
"gsd-core/bin/lib/probe-core.cjs": "73ba5d375910ff28",
|
||||
"gsd-core/bin/lib/profile-output.cjs": "378808e03fd67c61",
|
||||
"gsd-core/bin/lib/profile-pipeline-command-router.cjs": "827e4e524304ad25",
|
||||
"gsd-core/bin/lib/profile-pipeline.cjs": "787e4248ca4c878d",
|
||||
"gsd-core/bin/lib/prohibition-enforcement.cjs": "c183ec49139a62e5",
|
||||
"gsd-core/bin/lib/project-root.cjs": "163993df1925a44b",
|
||||
"gsd-core/bin/lib/prompt-budget.cjs": "7356b0e890cda70b",
|
||||
"gsd-core/bin/lib/research-provider.cjs": "23b53a582199eff6",
|
||||
"gsd-core/bin/lib/research-store.cjs": "5031d4e184367f7f",
|
||||
"gsd-core/bin/lib/resolution.cjs": "fd11df257a4eb398",
|
||||
"gsd-core/bin/lib/review-reviewer-selection.cjs": "2f632c155aefbdd3",
|
||||
"gsd-core/bin/lib/roadmap-command-router.cjs": "13dfdf17596f8998",
|
||||
"gsd-core/bin/lib/roadmap-parser.cjs": "077b798638c88f6c",
|
||||
"gsd-core/bin/lib/roadmap-upgrade.cjs": "31b1d30bb04a773f",
|
||||
"gsd-core/bin/lib/roadmap.cjs": "c49ec2fa9ec9e423",
|
||||
"gsd-core/bin/lib/runtime-artifact-conversion.cjs": "16d63bcf307a2a35",
|
||||
"gsd-core/bin/lib/runtime-artifact-install-plan.cjs": "2389590d607dd559",
|
||||
"gsd-core/bin/lib/runtime-artifact-layout.cjs": "61e04a9e389ff4e2",
|
||||
"gsd-core/bin/lib/runtime-config-adapter-registry.cjs": "89e41665a8a90477",
|
||||
"gsd-core/bin/lib/runtime-homes.cjs": "12b47d66d04170c8",
|
||||
"gsd-core/bin/lib/runtime-hooks-surface.cjs": "7c559132cabe057d",
|
||||
"gsd-core/bin/lib/runtime-name-policy.cjs": "9ad3466f6811210e",
|
||||
"gsd-core/bin/lib/runtime-slash.cjs": "252e7cbc25eb2197",
|
||||
"gsd-core/bin/lib/schema-detect.cjs": "451be154264efe2f",
|
||||
"gsd-core/bin/lib/secrets.cjs": "02b42408bba154f2",
|
||||
"gsd-core/bin/lib/security.cjs": "c7f10a4c817b8b86",
|
||||
"gsd-core/bin/lib/semver-compare.cjs": "4f661153bc421cfc",
|
||||
"gsd-core/bin/lib/shell-command-projection.cjs": "f0a1c2d8d0ba9a1e",
|
||||
"gsd-core/bin/lib/stale-bake-guard.cjs": "d81694c9ff2836d3",
|
||||
"gsd-core/bin/lib/state-command-router.cjs": "f388d1204557b02b",
|
||||
"gsd-core/bin/lib/state-document.cjs": "33936a718bae305a",
|
||||
"gsd-core/bin/lib/state.cjs": "4d06f311264fcbe0",
|
||||
"gsd-core/bin/lib/surface.cjs": "59e7f250d204a513",
|
||||
"gsd-core/bin/lib/task-command-router.cjs": "f1eb768e2a233057",
|
||||
"gsd-core/bin/lib/teams-status.cjs": "1c779e9b1928cdc5",
|
||||
"gsd-core/bin/lib/template.cjs": "3c02fe523b07da1a",
|
||||
"gsd-core/bin/lib/uat-predicate.cjs": "f0cf70e68244b834",
|
||||
"gsd-core/bin/lib/uat.cjs": "e1e3f2448e46f795",
|
||||
"gsd-core/bin/lib/ui-safety-gate.cjs": "f98279fb1ad1cee9",
|
||||
"gsd-core/bin/lib/update-context.cjs": "c45cfd1f73c37685",
|
||||
"gsd-core/bin/lib/validate-command-router.cjs": "e570f512c81f36aa",
|
||||
"gsd-core/bin/lib/validate.cjs": "71d10133337363d5",
|
||||
"gsd-core/bin/lib/verification-command-router.cjs": "7bb27562559625a2",
|
||||
"gsd-core/bin/lib/verification.cjs": "349fe736d467eec9",
|
||||
"gsd-core/bin/lib/verify-command-router.cjs": "847b2e8b74d4141d",
|
||||
"gsd-core/bin/lib/verify.cjs": "495c7a5a09593127",
|
||||
"gsd-core/bin/lib/workstream-inventory-builder.cjs": "17dd14ec7c59a024",
|
||||
"gsd-core/bin/lib/workstream-inventory.cjs": "e0383128698517de",
|
||||
"gsd-core/bin/lib/workstream-name-policy.cjs": "151ef8edad98cf2c",
|
||||
"gsd-core/bin/lib/workstream.cjs": "b7b6832f8b5a7b7f",
|
||||
"gsd-core/bin/lib/worktree-base-ref.cjs": "0a20f520af59b940",
|
||||
"gsd-core/bin/lib/worktree-safety.cjs": "d1e943bdf02c115a",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "67e4addbfd248a7c",
|
||||
"gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6",
|
||||
|
||||
142
tests/fixtures/golden-install-parity/copilot.json
vendored
142
tests/fixtures/golden-install-parity/copilot.json
vendored
@@ -41,148 +41,6 @@
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "08cbf1f404d64b93",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/lib/active-workstream-store.cjs": "3bfe7dff4b800602",
|
||||
"gsd-core/bin/lib/adr-parser.cjs": "741a7a23743fdb46",
|
||||
"gsd-core/bin/lib/agent-command-router.cjs": "dc06df2790d6b6f7",
|
||||
"gsd-core/bin/lib/agent-install-check.cjs": "66afc7f0f1935b9a",
|
||||
"gsd-core/bin/lib/artifacts.cjs": "3f0c70d91f93d2ba",
|
||||
"gsd-core/bin/lib/audit-command-router.cjs": "83320c0d5945060b",
|
||||
"gsd-core/bin/lib/audit.cjs": "7844d355fb599509",
|
||||
"gsd-core/bin/lib/capability-activation.cjs": "6319c7b3f8b71d7b",
|
||||
"gsd-core/bin/lib/capability-consent.cjs": "309c957ef1707b21",
|
||||
"gsd-core/bin/lib/capability-ledger.cjs": "1abaf0d194703c92",
|
||||
"gsd-core/bin/lib/capability-lifecycle.cjs": "b4c97621bce80bbb",
|
||||
"gsd-core/bin/lib/capability-loader.cjs": "38fc9566893db3af",
|
||||
"gsd-core/bin/lib/capability-lock.cjs": "81cf58b717a32e2a",
|
||||
"gsd-core/bin/lib/capability-registry.cjs": "1f34caf974586cc8",
|
||||
"gsd-core/bin/lib/capability-source.cjs": "1122731793f04408",
|
||||
"gsd-core/bin/lib/capability-state.cjs": "94de62f37352437b",
|
||||
"gsd-core/bin/lib/capability-trust.cjs": "28f513d40b58af16",
|
||||
"gsd-core/bin/lib/capability-validator.cjs": "3e4658be7e0a5741",
|
||||
"gsd-core/bin/lib/capability-writer.cjs": "85d872d8b2af1eb4",
|
||||
"gsd-core/bin/lib/check-command-router.cjs": "b9964792a9e4116e",
|
||||
"gsd-core/bin/lib/cjs-command-router-adapter.cjs": "baaddeadfacf4ed2",
|
||||
"gsd-core/bin/lib/cli-exit.cjs": "8913adfc6f878155",
|
||||
"gsd-core/bin/lib/clock.cjs": "e0121af119585126",
|
||||
"gsd-core/bin/lib/clusters.cjs": "1f260412e5890d75",
|
||||
"gsd-core/bin/lib/code-review-flags.cjs": "607b42845cfa9f0d",
|
||||
"gsd-core/bin/lib/command-aliases.cjs": "aaad70c106709bbe",
|
||||
"gsd-core/bin/lib/command-arg-projection.cjs": "5dc425098779393e",
|
||||
"gsd-core/bin/lib/command-roster.cjs": "e9c8cc5cdbb2d234",
|
||||
"gsd-core/bin/lib/command-routing-hub.cjs": "5c3d4e54c3eb0dee",
|
||||
"gsd-core/bin/lib/commands.cjs": "710ae91893333dfa",
|
||||
"gsd-core/bin/lib/config-loader.cjs": "ad82ca6acb6b93f3",
|
||||
"gsd-core/bin/lib/config-schema.cjs": "28eb2a5db1b407a7",
|
||||
"gsd-core/bin/lib/config-types.cjs": "96d613c58f03e1b4",
|
||||
"gsd-core/bin/lib/config.cjs": "6f78ebc9c099bec2",
|
||||
"gsd-core/bin/lib/configuration.cjs": "05b2194def83ed56",
|
||||
"gsd-core/bin/lib/context-utilization.cjs": "e584bd8192164750",
|
||||
"gsd-core/bin/lib/core-utils.cjs": "31a635dae39110ae",
|
||||
"gsd-core/bin/lib/coverage.cjs": "2dd1a846167d29ca",
|
||||
"gsd-core/bin/lib/decisions.cjs": "38f886a7247e3d5a",
|
||||
"gsd-core/bin/lib/docs.cjs": "2575e4c1172aa022",
|
||||
"gsd-core/bin/lib/drift.cjs": "3336156fb1d90f9e",
|
||||
"gsd-core/bin/lib/edge-probe.cjs": "965a6eb3ff5e65f4",
|
||||
"gsd-core/bin/lib/eval-command-router.cjs": "c27b6b78bbdeaaf4",
|
||||
"gsd-core/bin/lib/eval.cjs": "1fe6f60777fc3e68",
|
||||
"gsd-core/bin/lib/fallow-runner.cjs": "b01ed16271f408b1",
|
||||
"gsd-core/bin/lib/federated-config.cjs": "070bec8afc3e523a",
|
||||
"gsd-core/bin/lib/frontmatter.cjs": "5fdc9423eba17a9f",
|
||||
"gsd-core/bin/lib/gap-checker.cjs": "08f1f264b2031a50",
|
||||
"gsd-core/bin/lib/git-base-branch.cjs": "53a4e91cd94f6221",
|
||||
"gsd-core/bin/lib/graphify-command-router.cjs": "6672e02eca402d2b",
|
||||
"gsd-core/bin/lib/graphify.cjs": "9471802c2efc13c1",
|
||||
"gsd-core/bin/lib/gsd2-import.cjs": "4dc7dbb282e00185",
|
||||
"gsd-core/bin/lib/host-integration.cjs": "5050b73b4c50fc79",
|
||||
"gsd-core/bin/lib/init-command-router.cjs": "5f6b583acaba1037",
|
||||
"gsd-core/bin/lib/init.cjs": "0ada8bfab0200aac",
|
||||
"gsd-core/bin/lib/install-profiles.cjs": "8c5d1318f4940307",
|
||||
"gsd-core/bin/lib/installer-migration-authoring.cjs": "050285a34b4b0b22",
|
||||
"gsd-core/bin/lib/installer-migration-report.cjs": "da74c64aec42cf6d",
|
||||
"gsd-core/bin/lib/installer-migrations.cjs": "2c1b6d9ab7cab62a",
|
||||
"gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs": "27ae3ff0770c4c7b",
|
||||
"gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs": "e279bc0b87f040ca",
|
||||
"gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs": "8292c3e6af11c481",
|
||||
"gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs": "2cfb01e1e4d23461",
|
||||
"gsd-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs": "c1409ecc6b92b7e9",
|
||||
"gsd-core/bin/lib/intel-command-router.cjs": "3611eabadbaedbab",
|
||||
"gsd-core/bin/lib/intel.cjs": "86bf72a9910944e0",
|
||||
"gsd-core/bin/lib/io.cjs": "7d83809959fb3a8a",
|
||||
"gsd-core/bin/lib/learnings.cjs": "0f45ad609455ca62",
|
||||
"gsd-core/bin/lib/legacy-cleanup.cjs": "9aaf0480449906e6",
|
||||
"gsd-core/bin/lib/loop-host-contract.cjs": "da7f76ddb082620d",
|
||||
"gsd-core/bin/lib/loop-resolver.cjs": "25ce1eb00e95fa80",
|
||||
"gsd-core/bin/lib/markdown-sectionizer.cjs": "29d794e5de981792",
|
||||
"gsd-core/bin/lib/milestone.cjs": "ba975c7595f4a929",
|
||||
"gsd-core/bin/lib/model-catalog.cjs": "c4dcf3ddd17d25cd",
|
||||
"gsd-core/bin/lib/model-profiles.cjs": "83249502f09ccd78",
|
||||
"gsd-core/bin/lib/model-resolver.cjs": "1b60bb3d3be6b275",
|
||||
"gsd-core/bin/lib/observability/event.cjs": "c3595929b827ab0e",
|
||||
"gsd-core/bin/lib/observability/logger.cjs": "c57185d96dec038f",
|
||||
"gsd-core/bin/lib/observability/redaction.cjs": "1565fe81a6c50837",
|
||||
"gsd-core/bin/lib/package-identity.cjs": "34051a3e4874fae4",
|
||||
"gsd-core/bin/lib/package-legitimacy.cjs": "d9677032f76cbdb2",
|
||||
"gsd-core/bin/lib/phase-command-router.cjs": "74ac64360d41ae5b",
|
||||
"gsd-core/bin/lib/phase-id.cjs": "60e2e0e4760f6b82",
|
||||
"gsd-core/bin/lib/phase-lifecycle.cjs": "0b1d7e6b4d14ad66",
|
||||
"gsd-core/bin/lib/phase-locator.cjs": "cf8de89cfcf097cd",
|
||||
"gsd-core/bin/lib/phase.cjs": "dbb0cb0aa8a04c2b",
|
||||
"gsd-core/bin/lib/phases-command-router.cjs": "f57d97992f0281c6",
|
||||
"gsd-core/bin/lib/plan-drift-guard.cjs": "b3d0bc58767b2567",
|
||||
"gsd-core/bin/lib/plan-scan.cjs": "07cadb766a55c6d0",
|
||||
"gsd-core/bin/lib/planning-workspace.cjs": "f2317830591bf4f8",
|
||||
"gsd-core/bin/lib/probe-core.cjs": "73ba5d375910ff28",
|
||||
"gsd-core/bin/lib/profile-output.cjs": "5f07a895ba5d0369",
|
||||
"gsd-core/bin/lib/profile-pipeline-command-router.cjs": "827e4e524304ad25",
|
||||
"gsd-core/bin/lib/profile-pipeline.cjs": "0f795fcf701f4bbd",
|
||||
"gsd-core/bin/lib/prohibition-enforcement.cjs": "c183ec49139a62e5",
|
||||
"gsd-core/bin/lib/project-root.cjs": "163993df1925a44b",
|
||||
"gsd-core/bin/lib/prompt-budget.cjs": "7356b0e890cda70b",
|
||||
"gsd-core/bin/lib/research-provider.cjs": "23b53a582199eff6",
|
||||
"gsd-core/bin/lib/research-store.cjs": "5031d4e184367f7f",
|
||||
"gsd-core/bin/lib/resolution.cjs": "fd11df257a4eb398",
|
||||
"gsd-core/bin/lib/review-reviewer-selection.cjs": "adb03f906b609563",
|
||||
"gsd-core/bin/lib/roadmap-command-router.cjs": "13dfdf17596f8998",
|
||||
"gsd-core/bin/lib/roadmap-parser.cjs": "077b798638c88f6c",
|
||||
"gsd-core/bin/lib/roadmap-upgrade.cjs": "31b1d30bb04a773f",
|
||||
"gsd-core/bin/lib/roadmap.cjs": "c49ec2fa9ec9e423",
|
||||
"gsd-core/bin/lib/runtime-artifact-conversion.cjs": "f482839cfc054342",
|
||||
"gsd-core/bin/lib/runtime-artifact-install-plan.cjs": "354331368198a1a7",
|
||||
"gsd-core/bin/lib/runtime-artifact-layout.cjs": "d137c54440169191",
|
||||
"gsd-core/bin/lib/runtime-config-adapter-registry.cjs": "89e41665a8a90477",
|
||||
"gsd-core/bin/lib/runtime-homes.cjs": "5cd06615a098f423",
|
||||
"gsd-core/bin/lib/runtime-hooks-surface.cjs": "afe526540ec0183c",
|
||||
"gsd-core/bin/lib/runtime-name-policy.cjs": "82c49854517c6044",
|
||||
"gsd-core/bin/lib/runtime-slash.cjs": "41d01fb919d90bba",
|
||||
"gsd-core/bin/lib/schema-detect.cjs": "451be154264efe2f",
|
||||
"gsd-core/bin/lib/secrets.cjs": "02b42408bba154f2",
|
||||
"gsd-core/bin/lib/security.cjs": "c7f10a4c817b8b86",
|
||||
"gsd-core/bin/lib/semver-compare.cjs": "4f661153bc421cfc",
|
||||
"gsd-core/bin/lib/shell-command-projection.cjs": "f4480cca0ac06af6",
|
||||
"gsd-core/bin/lib/stale-bake-guard.cjs": "8f4449be425ffd08",
|
||||
"gsd-core/bin/lib/state-command-router.cjs": "f388d1204557b02b",
|
||||
"gsd-core/bin/lib/state-document.cjs": "33936a718bae305a",
|
||||
"gsd-core/bin/lib/state.cjs": "4d06f311264fcbe0",
|
||||
"gsd-core/bin/lib/surface.cjs": "40c92d36f3653d76",
|
||||
"gsd-core/bin/lib/task-command-router.cjs": "f1eb768e2a233057",
|
||||
"gsd-core/bin/lib/teams-status.cjs": "1c779e9b1928cdc5",
|
||||
"gsd-core/bin/lib/template.cjs": "3c02fe523b07da1a",
|
||||
"gsd-core/bin/lib/uat-predicate.cjs": "f0cf70e68244b834",
|
||||
"gsd-core/bin/lib/uat.cjs": "e1e3f2448e46f795",
|
||||
"gsd-core/bin/lib/ui-safety-gate.cjs": "f98279fb1ad1cee9",
|
||||
"gsd-core/bin/lib/update-context.cjs": "c45cfd1f73c37685",
|
||||
"gsd-core/bin/lib/validate-command-router.cjs": "e570f512c81f36aa",
|
||||
"gsd-core/bin/lib/validate.cjs": "71d10133337363d5",
|
||||
"gsd-core/bin/lib/verification-command-router.cjs": "7bb27562559625a2",
|
||||
"gsd-core/bin/lib/verification.cjs": "62578334903576c3",
|
||||
"gsd-core/bin/lib/verify-command-router.cjs": "847b2e8b74d4141d",
|
||||
"gsd-core/bin/lib/verify.cjs": "495c7a5a09593127",
|
||||
"gsd-core/bin/lib/workstream-inventory-builder.cjs": "17dd14ec7c59a024",
|
||||
"gsd-core/bin/lib/workstream-inventory.cjs": "e0383128698517de",
|
||||
"gsd-core/bin/lib/workstream-name-policy.cjs": "151ef8edad98cf2c",
|
||||
"gsd-core/bin/lib/workstream.cjs": "b7b6832f8b5a7b7f",
|
||||
"gsd-core/bin/lib/worktree-base-ref.cjs": "54b7158e3dd6018d",
|
||||
"gsd-core/bin/lib/worktree-safety.cjs": "d1e943bdf02c115a",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "67e4addbfd248a7c",
|
||||
"gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6",
|
||||
|
||||
142
tests/fixtures/golden-install-parity/cursor.json
vendored
142
tests/fixtures/golden-install-parity/cursor.json
vendored
@@ -109,148 +109,6 @@
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "08cbf1f404d64b93",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/lib/active-workstream-store.cjs": "3bfe7dff4b800602",
|
||||
"gsd-core/bin/lib/adr-parser.cjs": "741a7a23743fdb46",
|
||||
"gsd-core/bin/lib/agent-command-router.cjs": "dc06df2790d6b6f7",
|
||||
"gsd-core/bin/lib/agent-install-check.cjs": "66afc7f0f1935b9a",
|
||||
"gsd-core/bin/lib/artifacts.cjs": "134aa22ba76affef",
|
||||
"gsd-core/bin/lib/audit-command-router.cjs": "83320c0d5945060b",
|
||||
"gsd-core/bin/lib/audit.cjs": "7844d355fb599509",
|
||||
"gsd-core/bin/lib/capability-activation.cjs": "6319c7b3f8b71d7b",
|
||||
"gsd-core/bin/lib/capability-consent.cjs": "309c957ef1707b21",
|
||||
"gsd-core/bin/lib/capability-ledger.cjs": "1abaf0d194703c92",
|
||||
"gsd-core/bin/lib/capability-lifecycle.cjs": "b6887bd3413e8a72",
|
||||
"gsd-core/bin/lib/capability-loader.cjs": "38fc9566893db3af",
|
||||
"gsd-core/bin/lib/capability-lock.cjs": "81cf58b717a32e2a",
|
||||
"gsd-core/bin/lib/capability-registry.cjs": "ccc1e864e4c713a5",
|
||||
"gsd-core/bin/lib/capability-source.cjs": "1122731793f04408",
|
||||
"gsd-core/bin/lib/capability-state.cjs": "bd174dc7488dfc10",
|
||||
"gsd-core/bin/lib/capability-trust.cjs": "28f513d40b58af16",
|
||||
"gsd-core/bin/lib/capability-validator.cjs": "3e4658be7e0a5741",
|
||||
"gsd-core/bin/lib/capability-writer.cjs": "85d872d8b2af1eb4",
|
||||
"gsd-core/bin/lib/check-command-router.cjs": "5b720dfda54303a1",
|
||||
"gsd-core/bin/lib/cjs-command-router-adapter.cjs": "baaddeadfacf4ed2",
|
||||
"gsd-core/bin/lib/cli-exit.cjs": "8913adfc6f878155",
|
||||
"gsd-core/bin/lib/clock.cjs": "e0121af119585126",
|
||||
"gsd-core/bin/lib/clusters.cjs": "1f260412e5890d75",
|
||||
"gsd-core/bin/lib/code-review-flags.cjs": "607b42845cfa9f0d",
|
||||
"gsd-core/bin/lib/command-aliases.cjs": "aaad70c106709bbe",
|
||||
"gsd-core/bin/lib/command-arg-projection.cjs": "5dc425098779393e",
|
||||
"gsd-core/bin/lib/command-roster.cjs": "e9c8cc5cdbb2d234",
|
||||
"gsd-core/bin/lib/command-routing-hub.cjs": "5c3d4e54c3eb0dee",
|
||||
"gsd-core/bin/lib/commands.cjs": "710ae91893333dfa",
|
||||
"gsd-core/bin/lib/config-loader.cjs": "ad82ca6acb6b93f3",
|
||||
"gsd-core/bin/lib/config-schema.cjs": "28eb2a5db1b407a7",
|
||||
"gsd-core/bin/lib/config-types.cjs": "96d613c58f03e1b4",
|
||||
"gsd-core/bin/lib/config.cjs": "7fdd4473927e0bd3",
|
||||
"gsd-core/bin/lib/configuration.cjs": "05b2194def83ed56",
|
||||
"gsd-core/bin/lib/context-utilization.cjs": "e584bd8192164750",
|
||||
"gsd-core/bin/lib/core-utils.cjs": "31a635dae39110ae",
|
||||
"gsd-core/bin/lib/coverage.cjs": "2dd1a846167d29ca",
|
||||
"gsd-core/bin/lib/decisions.cjs": "4714718596d2fe73",
|
||||
"gsd-core/bin/lib/docs.cjs": "2575e4c1172aa022",
|
||||
"gsd-core/bin/lib/drift.cjs": "3336156fb1d90f9e",
|
||||
"gsd-core/bin/lib/edge-probe.cjs": "965a6eb3ff5e65f4",
|
||||
"gsd-core/bin/lib/eval-command-router.cjs": "c27b6b78bbdeaaf4",
|
||||
"gsd-core/bin/lib/eval.cjs": "1fe6f60777fc3e68",
|
||||
"gsd-core/bin/lib/fallow-runner.cjs": "b01ed16271f408b1",
|
||||
"gsd-core/bin/lib/federated-config.cjs": "070bec8afc3e523a",
|
||||
"gsd-core/bin/lib/frontmatter.cjs": "5fdc9423eba17a9f",
|
||||
"gsd-core/bin/lib/gap-checker.cjs": "08f1f264b2031a50",
|
||||
"gsd-core/bin/lib/git-base-branch.cjs": "53a4e91cd94f6221",
|
||||
"gsd-core/bin/lib/graphify-command-router.cjs": "6672e02eca402d2b",
|
||||
"gsd-core/bin/lib/graphify.cjs": "9471802c2efc13c1",
|
||||
"gsd-core/bin/lib/gsd2-import.cjs": "4dc7dbb282e00185",
|
||||
"gsd-core/bin/lib/host-integration.cjs": "5050b73b4c50fc79",
|
||||
"gsd-core/bin/lib/init-command-router.cjs": "5f6b583acaba1037",
|
||||
"gsd-core/bin/lib/init.cjs": "bcbe3af4720cb769",
|
||||
"gsd-core/bin/lib/install-profiles.cjs": "8c5d1318f4940307",
|
||||
"gsd-core/bin/lib/installer-migration-authoring.cjs": "050285a34b4b0b22",
|
||||
"gsd-core/bin/lib/installer-migration-report.cjs": "52d2b9798ddeb2ad",
|
||||
"gsd-core/bin/lib/installer-migrations.cjs": "2c1b6d9ab7cab62a",
|
||||
"gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs": "27ae3ff0770c4c7b",
|
||||
"gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs": "e279bc0b87f040ca",
|
||||
"gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs": "8292c3e6af11c481",
|
||||
"gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs": "2cfb01e1e4d23461",
|
||||
"gsd-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs": "c1409ecc6b92b7e9",
|
||||
"gsd-core/bin/lib/intel-command-router.cjs": "3611eabadbaedbab",
|
||||
"gsd-core/bin/lib/intel.cjs": "86bf72a9910944e0",
|
||||
"gsd-core/bin/lib/io.cjs": "f4fe4afc61a5387b",
|
||||
"gsd-core/bin/lib/learnings.cjs": "0f45ad609455ca62",
|
||||
"gsd-core/bin/lib/legacy-cleanup.cjs": "9aaf0480449906e6",
|
||||
"gsd-core/bin/lib/loop-host-contract.cjs": "da7f76ddb082620d",
|
||||
"gsd-core/bin/lib/loop-resolver.cjs": "25ce1eb00e95fa80",
|
||||
"gsd-core/bin/lib/markdown-sectionizer.cjs": "29d794e5de981792",
|
||||
"gsd-core/bin/lib/milestone.cjs": "ba975c7595f4a929",
|
||||
"gsd-core/bin/lib/model-catalog.cjs": "c4dcf3ddd17d25cd",
|
||||
"gsd-core/bin/lib/model-profiles.cjs": "83249502f09ccd78",
|
||||
"gsd-core/bin/lib/model-resolver.cjs": "5d6d5a81b688681c",
|
||||
"gsd-core/bin/lib/observability/event.cjs": "c3595929b827ab0e",
|
||||
"gsd-core/bin/lib/observability/logger.cjs": "c57185d96dec038f",
|
||||
"gsd-core/bin/lib/observability/redaction.cjs": "1565fe81a6c50837",
|
||||
"gsd-core/bin/lib/package-identity.cjs": "34051a3e4874fae4",
|
||||
"gsd-core/bin/lib/package-legitimacy.cjs": "d9677032f76cbdb2",
|
||||
"gsd-core/bin/lib/phase-command-router.cjs": "74ac64360d41ae5b",
|
||||
"gsd-core/bin/lib/phase-id.cjs": "60e2e0e4760f6b82",
|
||||
"gsd-core/bin/lib/phase-lifecycle.cjs": "0b1d7e6b4d14ad66",
|
||||
"gsd-core/bin/lib/phase-locator.cjs": "cf8de89cfcf097cd",
|
||||
"gsd-core/bin/lib/phase.cjs": "dbb0cb0aa8a04c2b",
|
||||
"gsd-core/bin/lib/phases-command-router.cjs": "f57d97992f0281c6",
|
||||
"gsd-core/bin/lib/plan-drift-guard.cjs": "b3d0bc58767b2567",
|
||||
"gsd-core/bin/lib/plan-scan.cjs": "07cadb766a55c6d0",
|
||||
"gsd-core/bin/lib/planning-workspace.cjs": "f2317830591bf4f8",
|
||||
"gsd-core/bin/lib/probe-core.cjs": "73ba5d375910ff28",
|
||||
"gsd-core/bin/lib/profile-output.cjs": "1057d03308b8de8a",
|
||||
"gsd-core/bin/lib/profile-pipeline-command-router.cjs": "827e4e524304ad25",
|
||||
"gsd-core/bin/lib/profile-pipeline.cjs": "8d5c241aca06f4d0",
|
||||
"gsd-core/bin/lib/prohibition-enforcement.cjs": "c183ec49139a62e5",
|
||||
"gsd-core/bin/lib/project-root.cjs": "163993df1925a44b",
|
||||
"gsd-core/bin/lib/prompt-budget.cjs": "7356b0e890cda70b",
|
||||
"gsd-core/bin/lib/research-provider.cjs": "23b53a582199eff6",
|
||||
"gsd-core/bin/lib/research-store.cjs": "5031d4e184367f7f",
|
||||
"gsd-core/bin/lib/resolution.cjs": "fd11df257a4eb398",
|
||||
"gsd-core/bin/lib/review-reviewer-selection.cjs": "adb03f906b609563",
|
||||
"gsd-core/bin/lib/roadmap-command-router.cjs": "13dfdf17596f8998",
|
||||
"gsd-core/bin/lib/roadmap-parser.cjs": "077b798638c88f6c",
|
||||
"gsd-core/bin/lib/roadmap-upgrade.cjs": "31b1d30bb04a773f",
|
||||
"gsd-core/bin/lib/roadmap.cjs": "c49ec2fa9ec9e423",
|
||||
"gsd-core/bin/lib/runtime-artifact-conversion.cjs": "03d2c7d347d5cd90",
|
||||
"gsd-core/bin/lib/runtime-artifact-install-plan.cjs": "2389590d607dd559",
|
||||
"gsd-core/bin/lib/runtime-artifact-layout.cjs": "4485d1d3a5f04712",
|
||||
"gsd-core/bin/lib/runtime-config-adapter-registry.cjs": "89e41665a8a90477",
|
||||
"gsd-core/bin/lib/runtime-homes.cjs": "12b47d66d04170c8",
|
||||
"gsd-core/bin/lib/runtime-hooks-surface.cjs": "dcc038edb82073ad",
|
||||
"gsd-core/bin/lib/runtime-name-policy.cjs": "984372c23d48c853",
|
||||
"gsd-core/bin/lib/runtime-slash.cjs": "31b199670a9fe1d8",
|
||||
"gsd-core/bin/lib/schema-detect.cjs": "451be154264efe2f",
|
||||
"gsd-core/bin/lib/secrets.cjs": "02b42408bba154f2",
|
||||
"gsd-core/bin/lib/security.cjs": "c7f10a4c817b8b86",
|
||||
"gsd-core/bin/lib/semver-compare.cjs": "4f661153bc421cfc",
|
||||
"gsd-core/bin/lib/shell-command-projection.cjs": "b7af1dbf7a207b00",
|
||||
"gsd-core/bin/lib/stale-bake-guard.cjs": "8f4449be425ffd08",
|
||||
"gsd-core/bin/lib/state-command-router.cjs": "f388d1204557b02b",
|
||||
"gsd-core/bin/lib/state-document.cjs": "33936a718bae305a",
|
||||
"gsd-core/bin/lib/state.cjs": "4d06f311264fcbe0",
|
||||
"gsd-core/bin/lib/surface.cjs": "59e7f250d204a513",
|
||||
"gsd-core/bin/lib/task-command-router.cjs": "f1eb768e2a233057",
|
||||
"gsd-core/bin/lib/teams-status.cjs": "1c779e9b1928cdc5",
|
||||
"gsd-core/bin/lib/template.cjs": "3c02fe523b07da1a",
|
||||
"gsd-core/bin/lib/uat-predicate.cjs": "f0cf70e68244b834",
|
||||
"gsd-core/bin/lib/uat.cjs": "e1e3f2448e46f795",
|
||||
"gsd-core/bin/lib/ui-safety-gate.cjs": "f98279fb1ad1cee9",
|
||||
"gsd-core/bin/lib/update-context.cjs": "c45cfd1f73c37685",
|
||||
"gsd-core/bin/lib/validate-command-router.cjs": "e570f512c81f36aa",
|
||||
"gsd-core/bin/lib/validate.cjs": "71d10133337363d5",
|
||||
"gsd-core/bin/lib/verification-command-router.cjs": "7bb27562559625a2",
|
||||
"gsd-core/bin/lib/verification.cjs": "62578334903576c3",
|
||||
"gsd-core/bin/lib/verify-command-router.cjs": "847b2e8b74d4141d",
|
||||
"gsd-core/bin/lib/verify.cjs": "495c7a5a09593127",
|
||||
"gsd-core/bin/lib/workstream-inventory-builder.cjs": "17dd14ec7c59a024",
|
||||
"gsd-core/bin/lib/workstream-inventory.cjs": "e0383128698517de",
|
||||
"gsd-core/bin/lib/workstream-name-policy.cjs": "151ef8edad98cf2c",
|
||||
"gsd-core/bin/lib/workstream.cjs": "b7b6832f8b5a7b7f",
|
||||
"gsd-core/bin/lib/worktree-base-ref.cjs": "3f35d626e18dfdd6",
|
||||
"gsd-core/bin/lib/worktree-safety.cjs": "d1e943bdf02c115a",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "67e4addbfd248a7c",
|
||||
"gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6",
|
||||
|
||||
142
tests/fixtures/golden-install-parity/gemini.json
vendored
142
tests/fixtures/golden-install-parity/gemini.json
vendored
@@ -109,148 +109,6 @@
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "1f2ff4e80aa45439",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/lib/active-workstream-store.cjs": "3bfe7dff4b800602",
|
||||
"gsd-core/bin/lib/adr-parser.cjs": "741a7a23743fdb46",
|
||||
"gsd-core/bin/lib/agent-command-router.cjs": "dc06df2790d6b6f7",
|
||||
"gsd-core/bin/lib/agent-install-check.cjs": "66afc7f0f1935b9a",
|
||||
"gsd-core/bin/lib/artifacts.cjs": "253076a1b2476446",
|
||||
"gsd-core/bin/lib/audit-command-router.cjs": "83320c0d5945060b",
|
||||
"gsd-core/bin/lib/audit.cjs": "9c0b659cde833828",
|
||||
"gsd-core/bin/lib/capability-activation.cjs": "6319c7b3f8b71d7b",
|
||||
"gsd-core/bin/lib/capability-consent.cjs": "309c957ef1707b21",
|
||||
"gsd-core/bin/lib/capability-ledger.cjs": "1abaf0d194703c92",
|
||||
"gsd-core/bin/lib/capability-lifecycle.cjs": "b6887bd3413e8a72",
|
||||
"gsd-core/bin/lib/capability-loader.cjs": "38fc9566893db3af",
|
||||
"gsd-core/bin/lib/capability-lock.cjs": "81cf58b717a32e2a",
|
||||
"gsd-core/bin/lib/capability-registry.cjs": "40888aec313fd6c7",
|
||||
"gsd-core/bin/lib/capability-source.cjs": "1122731793f04408",
|
||||
"gsd-core/bin/lib/capability-state.cjs": "bd174dc7488dfc10",
|
||||
"gsd-core/bin/lib/capability-trust.cjs": "28f513d40b58af16",
|
||||
"gsd-core/bin/lib/capability-validator.cjs": "3e4658be7e0a5741",
|
||||
"gsd-core/bin/lib/capability-writer.cjs": "760f53876da20268",
|
||||
"gsd-core/bin/lib/check-command-router.cjs": "7363dc0df9e5f8c5",
|
||||
"gsd-core/bin/lib/cjs-command-router-adapter.cjs": "baaddeadfacf4ed2",
|
||||
"gsd-core/bin/lib/cli-exit.cjs": "8913adfc6f878155",
|
||||
"gsd-core/bin/lib/clock.cjs": "e0121af119585126",
|
||||
"gsd-core/bin/lib/clusters.cjs": "64526279798dada8",
|
||||
"gsd-core/bin/lib/code-review-flags.cjs": "a347151887fc8486",
|
||||
"gsd-core/bin/lib/command-aliases.cjs": "aaad70c106709bbe",
|
||||
"gsd-core/bin/lib/command-arg-projection.cjs": "5dc425098779393e",
|
||||
"gsd-core/bin/lib/command-roster.cjs": "e9c8cc5cdbb2d234",
|
||||
"gsd-core/bin/lib/command-routing-hub.cjs": "5c3d4e54c3eb0dee",
|
||||
"gsd-core/bin/lib/commands.cjs": "710ae91893333dfa",
|
||||
"gsd-core/bin/lib/config-loader.cjs": "ad06d596d8e0c71d",
|
||||
"gsd-core/bin/lib/config-schema.cjs": "28eb2a5db1b407a7",
|
||||
"gsd-core/bin/lib/config-types.cjs": "96d613c58f03e1b4",
|
||||
"gsd-core/bin/lib/config.cjs": "fb2cfce9ab259ffe",
|
||||
"gsd-core/bin/lib/configuration.cjs": "05b2194def83ed56",
|
||||
"gsd-core/bin/lib/context-utilization.cjs": "e584bd8192164750",
|
||||
"gsd-core/bin/lib/core-utils.cjs": "31a635dae39110ae",
|
||||
"gsd-core/bin/lib/coverage.cjs": "2dd1a846167d29ca",
|
||||
"gsd-core/bin/lib/decisions.cjs": "4714718596d2fe73",
|
||||
"gsd-core/bin/lib/docs.cjs": "2575e4c1172aa022",
|
||||
"gsd-core/bin/lib/drift.cjs": "3336156fb1d90f9e",
|
||||
"gsd-core/bin/lib/edge-probe.cjs": "965a6eb3ff5e65f4",
|
||||
"gsd-core/bin/lib/eval-command-router.cjs": "c27b6b78bbdeaaf4",
|
||||
"gsd-core/bin/lib/eval.cjs": "1fe6f60777fc3e68",
|
||||
"gsd-core/bin/lib/fallow-runner.cjs": "b01ed16271f408b1",
|
||||
"gsd-core/bin/lib/federated-config.cjs": "070bec8afc3e523a",
|
||||
"gsd-core/bin/lib/frontmatter.cjs": "5fdc9423eba17a9f",
|
||||
"gsd-core/bin/lib/gap-checker.cjs": "08f1f264b2031a50",
|
||||
"gsd-core/bin/lib/git-base-branch.cjs": "53a4e91cd94f6221",
|
||||
"gsd-core/bin/lib/graphify-command-router.cjs": "6672e02eca402d2b",
|
||||
"gsd-core/bin/lib/graphify.cjs": "9471802c2efc13c1",
|
||||
"gsd-core/bin/lib/gsd2-import.cjs": "4dc7dbb282e00185",
|
||||
"gsd-core/bin/lib/host-integration.cjs": "5050b73b4c50fc79",
|
||||
"gsd-core/bin/lib/init-command-router.cjs": "5f6b583acaba1037",
|
||||
"gsd-core/bin/lib/init.cjs": "bcbe3af4720cb769",
|
||||
"gsd-core/bin/lib/install-profiles.cjs": "8c5d1318f4940307",
|
||||
"gsd-core/bin/lib/installer-migration-authoring.cjs": "050285a34b4b0b22",
|
||||
"gsd-core/bin/lib/installer-migration-report.cjs": "675fd40fd9c3aae4",
|
||||
"gsd-core/bin/lib/installer-migrations.cjs": "2c1b6d9ab7cab62a",
|
||||
"gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs": "27ae3ff0770c4c7b",
|
||||
"gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs": "e279bc0b87f040ca",
|
||||
"gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs": "8292c3e6af11c481",
|
||||
"gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs": "2cfb01e1e4d23461",
|
||||
"gsd-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs": "c1409ecc6b92b7e9",
|
||||
"gsd-core/bin/lib/intel-command-router.cjs": "3611eabadbaedbab",
|
||||
"gsd-core/bin/lib/intel.cjs": "86bf72a9910944e0",
|
||||
"gsd-core/bin/lib/io.cjs": "7d83809959fb3a8a",
|
||||
"gsd-core/bin/lib/learnings.cjs": "0f45ad609455ca62",
|
||||
"gsd-core/bin/lib/legacy-cleanup.cjs": "9aaf0480449906e6",
|
||||
"gsd-core/bin/lib/loop-host-contract.cjs": "da7f76ddb082620d",
|
||||
"gsd-core/bin/lib/loop-resolver.cjs": "25ce1eb00e95fa80",
|
||||
"gsd-core/bin/lib/markdown-sectionizer.cjs": "29d794e5de981792",
|
||||
"gsd-core/bin/lib/milestone.cjs": "ba975c7595f4a929",
|
||||
"gsd-core/bin/lib/model-catalog.cjs": "c4dcf3ddd17d25cd",
|
||||
"gsd-core/bin/lib/model-profiles.cjs": "83249502f09ccd78",
|
||||
"gsd-core/bin/lib/model-resolver.cjs": "cac3ec39756ab17e",
|
||||
"gsd-core/bin/lib/observability/event.cjs": "c3595929b827ab0e",
|
||||
"gsd-core/bin/lib/observability/logger.cjs": "c57185d96dec038f",
|
||||
"gsd-core/bin/lib/observability/redaction.cjs": "1565fe81a6c50837",
|
||||
"gsd-core/bin/lib/package-identity.cjs": "34051a3e4874fae4",
|
||||
"gsd-core/bin/lib/package-legitimacy.cjs": "d9677032f76cbdb2",
|
||||
"gsd-core/bin/lib/phase-command-router.cjs": "74ac64360d41ae5b",
|
||||
"gsd-core/bin/lib/phase-id.cjs": "60e2e0e4760f6b82",
|
||||
"gsd-core/bin/lib/phase-lifecycle.cjs": "0b1d7e6b4d14ad66",
|
||||
"gsd-core/bin/lib/phase-locator.cjs": "cf8de89cfcf097cd",
|
||||
"gsd-core/bin/lib/phase.cjs": "dbb0cb0aa8a04c2b",
|
||||
"gsd-core/bin/lib/phases-command-router.cjs": "f57d97992f0281c6",
|
||||
"gsd-core/bin/lib/plan-drift-guard.cjs": "b3d0bc58767b2567",
|
||||
"gsd-core/bin/lib/plan-scan.cjs": "07cadb766a55c6d0",
|
||||
"gsd-core/bin/lib/planning-workspace.cjs": "f2317830591bf4f8",
|
||||
"gsd-core/bin/lib/probe-core.cjs": "73ba5d375910ff28",
|
||||
"gsd-core/bin/lib/profile-output.cjs": "378808e03fd67c61",
|
||||
"gsd-core/bin/lib/profile-pipeline-command-router.cjs": "827e4e524304ad25",
|
||||
"gsd-core/bin/lib/profile-pipeline.cjs": "787e4248ca4c878d",
|
||||
"gsd-core/bin/lib/prohibition-enforcement.cjs": "c183ec49139a62e5",
|
||||
"gsd-core/bin/lib/project-root.cjs": "163993df1925a44b",
|
||||
"gsd-core/bin/lib/prompt-budget.cjs": "7356b0e890cda70b",
|
||||
"gsd-core/bin/lib/research-provider.cjs": "23b53a582199eff6",
|
||||
"gsd-core/bin/lib/research-store.cjs": "5031d4e184367f7f",
|
||||
"gsd-core/bin/lib/resolution.cjs": "fd11df257a4eb398",
|
||||
"gsd-core/bin/lib/review-reviewer-selection.cjs": "2f632c155aefbdd3",
|
||||
"gsd-core/bin/lib/roadmap-command-router.cjs": "13dfdf17596f8998",
|
||||
"gsd-core/bin/lib/roadmap-parser.cjs": "077b798638c88f6c",
|
||||
"gsd-core/bin/lib/roadmap-upgrade.cjs": "31b1d30bb04a773f",
|
||||
"gsd-core/bin/lib/roadmap.cjs": "c49ec2fa9ec9e423",
|
||||
"gsd-core/bin/lib/runtime-artifact-conversion.cjs": "16d63bcf307a2a35",
|
||||
"gsd-core/bin/lib/runtime-artifact-install-plan.cjs": "2389590d607dd559",
|
||||
"gsd-core/bin/lib/runtime-artifact-layout.cjs": "61e04a9e389ff4e2",
|
||||
"gsd-core/bin/lib/runtime-config-adapter-registry.cjs": "89e41665a8a90477",
|
||||
"gsd-core/bin/lib/runtime-homes.cjs": "12b47d66d04170c8",
|
||||
"gsd-core/bin/lib/runtime-hooks-surface.cjs": "7c559132cabe057d",
|
||||
"gsd-core/bin/lib/runtime-name-policy.cjs": "9ad3466f6811210e",
|
||||
"gsd-core/bin/lib/runtime-slash.cjs": "252e7cbc25eb2197",
|
||||
"gsd-core/bin/lib/schema-detect.cjs": "451be154264efe2f",
|
||||
"gsd-core/bin/lib/secrets.cjs": "02b42408bba154f2",
|
||||
"gsd-core/bin/lib/security.cjs": "c7f10a4c817b8b86",
|
||||
"gsd-core/bin/lib/semver-compare.cjs": "4f661153bc421cfc",
|
||||
"gsd-core/bin/lib/shell-command-projection.cjs": "f0a1c2d8d0ba9a1e",
|
||||
"gsd-core/bin/lib/stale-bake-guard.cjs": "d81694c9ff2836d3",
|
||||
"gsd-core/bin/lib/state-command-router.cjs": "f388d1204557b02b",
|
||||
"gsd-core/bin/lib/state-document.cjs": "33936a718bae305a",
|
||||
"gsd-core/bin/lib/state.cjs": "4d06f311264fcbe0",
|
||||
"gsd-core/bin/lib/surface.cjs": "59e7f250d204a513",
|
||||
"gsd-core/bin/lib/task-command-router.cjs": "f1eb768e2a233057",
|
||||
"gsd-core/bin/lib/teams-status.cjs": "1c779e9b1928cdc5",
|
||||
"gsd-core/bin/lib/template.cjs": "3c02fe523b07da1a",
|
||||
"gsd-core/bin/lib/uat-predicate.cjs": "f0cf70e68244b834",
|
||||
"gsd-core/bin/lib/uat.cjs": "e1e3f2448e46f795",
|
||||
"gsd-core/bin/lib/ui-safety-gate.cjs": "f98279fb1ad1cee9",
|
||||
"gsd-core/bin/lib/update-context.cjs": "c45cfd1f73c37685",
|
||||
"gsd-core/bin/lib/validate-command-router.cjs": "e570f512c81f36aa",
|
||||
"gsd-core/bin/lib/validate.cjs": "71d10133337363d5",
|
||||
"gsd-core/bin/lib/verification-command-router.cjs": "7bb27562559625a2",
|
||||
"gsd-core/bin/lib/verification.cjs": "349fe736d467eec9",
|
||||
"gsd-core/bin/lib/verify-command-router.cjs": "847b2e8b74d4141d",
|
||||
"gsd-core/bin/lib/verify.cjs": "495c7a5a09593127",
|
||||
"gsd-core/bin/lib/workstream-inventory-builder.cjs": "17dd14ec7c59a024",
|
||||
"gsd-core/bin/lib/workstream-inventory.cjs": "e0383128698517de",
|
||||
"gsd-core/bin/lib/workstream-name-policy.cjs": "151ef8edad98cf2c",
|
||||
"gsd-core/bin/lib/workstream.cjs": "b7b6832f8b5a7b7f",
|
||||
"gsd-core/bin/lib/worktree-base-ref.cjs": "0a20f520af59b940",
|
||||
"gsd-core/bin/lib/worktree-safety.cjs": "d1e943bdf02c115a",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "67e4addbfd248a7c",
|
||||
"gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6",
|
||||
|
||||
142
tests/fixtures/golden-install-parity/hermes.json
vendored
142
tests/fixtures/golden-install-parity/hermes.json
vendored
@@ -40,148 +40,6 @@
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "1f2ff4e80aa45439",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/lib/active-workstream-store.cjs": "3bfe7dff4b800602",
|
||||
"gsd-core/bin/lib/adr-parser.cjs": "741a7a23743fdb46",
|
||||
"gsd-core/bin/lib/agent-command-router.cjs": "dc06df2790d6b6f7",
|
||||
"gsd-core/bin/lib/agent-install-check.cjs": "66afc7f0f1935b9a",
|
||||
"gsd-core/bin/lib/artifacts.cjs": "14aa63dff1ecc4ec",
|
||||
"gsd-core/bin/lib/audit-command-router.cjs": "83320c0d5945060b",
|
||||
"gsd-core/bin/lib/audit.cjs": "9c0b659cde833828",
|
||||
"gsd-core/bin/lib/capability-activation.cjs": "6319c7b3f8b71d7b",
|
||||
"gsd-core/bin/lib/capability-consent.cjs": "309c957ef1707b21",
|
||||
"gsd-core/bin/lib/capability-ledger.cjs": "1abaf0d194703c92",
|
||||
"gsd-core/bin/lib/capability-lifecycle.cjs": "03e18c1401de22e2",
|
||||
"gsd-core/bin/lib/capability-loader.cjs": "38fc9566893db3af",
|
||||
"gsd-core/bin/lib/capability-lock.cjs": "81cf58b717a32e2a",
|
||||
"gsd-core/bin/lib/capability-registry.cjs": "9cd22c15c35d66e6",
|
||||
"gsd-core/bin/lib/capability-source.cjs": "1122731793f04408",
|
||||
"gsd-core/bin/lib/capability-state.cjs": "bd174dc7488dfc10",
|
||||
"gsd-core/bin/lib/capability-trust.cjs": "28f513d40b58af16",
|
||||
"gsd-core/bin/lib/capability-validator.cjs": "3e4658be7e0a5741",
|
||||
"gsd-core/bin/lib/capability-writer.cjs": "760f53876da20268",
|
||||
"gsd-core/bin/lib/check-command-router.cjs": "7363dc0df9e5f8c5",
|
||||
"gsd-core/bin/lib/cjs-command-router-adapter.cjs": "baaddeadfacf4ed2",
|
||||
"gsd-core/bin/lib/cli-exit.cjs": "8913adfc6f878155",
|
||||
"gsd-core/bin/lib/clock.cjs": "e0121af119585126",
|
||||
"gsd-core/bin/lib/clusters.cjs": "64526279798dada8",
|
||||
"gsd-core/bin/lib/code-review-flags.cjs": "a347151887fc8486",
|
||||
"gsd-core/bin/lib/command-aliases.cjs": "aaad70c106709bbe",
|
||||
"gsd-core/bin/lib/command-arg-projection.cjs": "5dc425098779393e",
|
||||
"gsd-core/bin/lib/command-roster.cjs": "e9c8cc5cdbb2d234",
|
||||
"gsd-core/bin/lib/command-routing-hub.cjs": "5c3d4e54c3eb0dee",
|
||||
"gsd-core/bin/lib/commands.cjs": "710ae91893333dfa",
|
||||
"gsd-core/bin/lib/config-loader.cjs": "ad06d596d8e0c71d",
|
||||
"gsd-core/bin/lib/config-schema.cjs": "28eb2a5db1b407a7",
|
||||
"gsd-core/bin/lib/config-types.cjs": "96d613c58f03e1b4",
|
||||
"gsd-core/bin/lib/config.cjs": "3671149a8b99d792",
|
||||
"gsd-core/bin/lib/configuration.cjs": "05b2194def83ed56",
|
||||
"gsd-core/bin/lib/context-utilization.cjs": "e584bd8192164750",
|
||||
"gsd-core/bin/lib/core-utils.cjs": "31a635dae39110ae",
|
||||
"gsd-core/bin/lib/coverage.cjs": "2dd1a846167d29ca",
|
||||
"gsd-core/bin/lib/decisions.cjs": "4714718596d2fe73",
|
||||
"gsd-core/bin/lib/docs.cjs": "2575e4c1172aa022",
|
||||
"gsd-core/bin/lib/drift.cjs": "3336156fb1d90f9e",
|
||||
"gsd-core/bin/lib/edge-probe.cjs": "965a6eb3ff5e65f4",
|
||||
"gsd-core/bin/lib/eval-command-router.cjs": "c27b6b78bbdeaaf4",
|
||||
"gsd-core/bin/lib/eval.cjs": "1fe6f60777fc3e68",
|
||||
"gsd-core/bin/lib/fallow-runner.cjs": "b01ed16271f408b1",
|
||||
"gsd-core/bin/lib/federated-config.cjs": "070bec8afc3e523a",
|
||||
"gsd-core/bin/lib/frontmatter.cjs": "5fdc9423eba17a9f",
|
||||
"gsd-core/bin/lib/gap-checker.cjs": "08f1f264b2031a50",
|
||||
"gsd-core/bin/lib/git-base-branch.cjs": "53a4e91cd94f6221",
|
||||
"gsd-core/bin/lib/graphify-command-router.cjs": "6672e02eca402d2b",
|
||||
"gsd-core/bin/lib/graphify.cjs": "9471802c2efc13c1",
|
||||
"gsd-core/bin/lib/gsd2-import.cjs": "4dc7dbb282e00185",
|
||||
"gsd-core/bin/lib/host-integration.cjs": "5050b73b4c50fc79",
|
||||
"gsd-core/bin/lib/init-command-router.cjs": "5f6b583acaba1037",
|
||||
"gsd-core/bin/lib/init.cjs": "5bc040041204f682",
|
||||
"gsd-core/bin/lib/install-profiles.cjs": "8c5d1318f4940307",
|
||||
"gsd-core/bin/lib/installer-migration-authoring.cjs": "050285a34b4b0b22",
|
||||
"gsd-core/bin/lib/installer-migration-report.cjs": "d23e9f2e44b15bbb",
|
||||
"gsd-core/bin/lib/installer-migrations.cjs": "2c1b6d9ab7cab62a",
|
||||
"gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs": "27ae3ff0770c4c7b",
|
||||
"gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs": "e279bc0b87f040ca",
|
||||
"gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs": "8292c3e6af11c481",
|
||||
"gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs": "2cfb01e1e4d23461",
|
||||
"gsd-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs": "c1409ecc6b92b7e9",
|
||||
"gsd-core/bin/lib/intel-command-router.cjs": "3611eabadbaedbab",
|
||||
"gsd-core/bin/lib/intel.cjs": "86bf72a9910944e0",
|
||||
"gsd-core/bin/lib/io.cjs": "b7b30b5679ffa1ec",
|
||||
"gsd-core/bin/lib/learnings.cjs": "0f45ad609455ca62",
|
||||
"gsd-core/bin/lib/legacy-cleanup.cjs": "9aaf0480449906e6",
|
||||
"gsd-core/bin/lib/loop-host-contract.cjs": "da7f76ddb082620d",
|
||||
"gsd-core/bin/lib/loop-resolver.cjs": "25ce1eb00e95fa80",
|
||||
"gsd-core/bin/lib/markdown-sectionizer.cjs": "29d794e5de981792",
|
||||
"gsd-core/bin/lib/milestone.cjs": "ba975c7595f4a929",
|
||||
"gsd-core/bin/lib/model-catalog.cjs": "c4dcf3ddd17d25cd",
|
||||
"gsd-core/bin/lib/model-profiles.cjs": "83249502f09ccd78",
|
||||
"gsd-core/bin/lib/model-resolver.cjs": "d94345abcdfce9a7",
|
||||
"gsd-core/bin/lib/observability/event.cjs": "c3595929b827ab0e",
|
||||
"gsd-core/bin/lib/observability/logger.cjs": "c57185d96dec038f",
|
||||
"gsd-core/bin/lib/observability/redaction.cjs": "1565fe81a6c50837",
|
||||
"gsd-core/bin/lib/package-identity.cjs": "34051a3e4874fae4",
|
||||
"gsd-core/bin/lib/package-legitimacy.cjs": "d9677032f76cbdb2",
|
||||
"gsd-core/bin/lib/phase-command-router.cjs": "74ac64360d41ae5b",
|
||||
"gsd-core/bin/lib/phase-id.cjs": "60e2e0e4760f6b82",
|
||||
"gsd-core/bin/lib/phase-lifecycle.cjs": "0b1d7e6b4d14ad66",
|
||||
"gsd-core/bin/lib/phase-locator.cjs": "cf8de89cfcf097cd",
|
||||
"gsd-core/bin/lib/phase.cjs": "dbb0cb0aa8a04c2b",
|
||||
"gsd-core/bin/lib/phases-command-router.cjs": "f57d97992f0281c6",
|
||||
"gsd-core/bin/lib/plan-drift-guard.cjs": "b3d0bc58767b2567",
|
||||
"gsd-core/bin/lib/plan-scan.cjs": "07cadb766a55c6d0",
|
||||
"gsd-core/bin/lib/planning-workspace.cjs": "f2317830591bf4f8",
|
||||
"gsd-core/bin/lib/probe-core.cjs": "73ba5d375910ff28",
|
||||
"gsd-core/bin/lib/profile-output.cjs": "c4702bec5101c66b",
|
||||
"gsd-core/bin/lib/profile-pipeline-command-router.cjs": "827e4e524304ad25",
|
||||
"gsd-core/bin/lib/profile-pipeline.cjs": "4cccd2b2dcf89dca",
|
||||
"gsd-core/bin/lib/prohibition-enforcement.cjs": "c183ec49139a62e5",
|
||||
"gsd-core/bin/lib/project-root.cjs": "163993df1925a44b",
|
||||
"gsd-core/bin/lib/prompt-budget.cjs": "7356b0e890cda70b",
|
||||
"gsd-core/bin/lib/research-provider.cjs": "23b53a582199eff6",
|
||||
"gsd-core/bin/lib/research-store.cjs": "5031d4e184367f7f",
|
||||
"gsd-core/bin/lib/resolution.cjs": "fd11df257a4eb398",
|
||||
"gsd-core/bin/lib/review-reviewer-selection.cjs": "2f632c155aefbdd3",
|
||||
"gsd-core/bin/lib/roadmap-command-router.cjs": "13dfdf17596f8998",
|
||||
"gsd-core/bin/lib/roadmap-parser.cjs": "077b798638c88f6c",
|
||||
"gsd-core/bin/lib/roadmap-upgrade.cjs": "31b1d30bb04a773f",
|
||||
"gsd-core/bin/lib/roadmap.cjs": "c49ec2fa9ec9e423",
|
||||
"gsd-core/bin/lib/runtime-artifact-conversion.cjs": "9169deff30a00725",
|
||||
"gsd-core/bin/lib/runtime-artifact-install-plan.cjs": "2389590d607dd559",
|
||||
"gsd-core/bin/lib/runtime-artifact-layout.cjs": "61e04a9e389ff4e2",
|
||||
"gsd-core/bin/lib/runtime-config-adapter-registry.cjs": "89e41665a8a90477",
|
||||
"gsd-core/bin/lib/runtime-homes.cjs": "12b47d66d04170c8",
|
||||
"gsd-core/bin/lib/runtime-hooks-surface.cjs": "ad81ad662378c02e",
|
||||
"gsd-core/bin/lib/runtime-name-policy.cjs": "ac09e7a0d954e014",
|
||||
"gsd-core/bin/lib/runtime-slash.cjs": "341825ef7151fdc5",
|
||||
"gsd-core/bin/lib/schema-detect.cjs": "451be154264efe2f",
|
||||
"gsd-core/bin/lib/secrets.cjs": "02b42408bba154f2",
|
||||
"gsd-core/bin/lib/security.cjs": "c7f10a4c817b8b86",
|
||||
"gsd-core/bin/lib/semver-compare.cjs": "4f661153bc421cfc",
|
||||
"gsd-core/bin/lib/shell-command-projection.cjs": "97a95ea45ac83d5f",
|
||||
"gsd-core/bin/lib/stale-bake-guard.cjs": "d81694c9ff2836d3",
|
||||
"gsd-core/bin/lib/state-command-router.cjs": "f388d1204557b02b",
|
||||
"gsd-core/bin/lib/state-document.cjs": "33936a718bae305a",
|
||||
"gsd-core/bin/lib/state.cjs": "4d06f311264fcbe0",
|
||||
"gsd-core/bin/lib/surface.cjs": "1e4d69184c3996e8",
|
||||
"gsd-core/bin/lib/task-command-router.cjs": "f1eb768e2a233057",
|
||||
"gsd-core/bin/lib/teams-status.cjs": "1c779e9b1928cdc5",
|
||||
"gsd-core/bin/lib/template.cjs": "3c02fe523b07da1a",
|
||||
"gsd-core/bin/lib/uat-predicate.cjs": "f0cf70e68244b834",
|
||||
"gsd-core/bin/lib/uat.cjs": "e1e3f2448e46f795",
|
||||
"gsd-core/bin/lib/ui-safety-gate.cjs": "f98279fb1ad1cee9",
|
||||
"gsd-core/bin/lib/update-context.cjs": "c45cfd1f73c37685",
|
||||
"gsd-core/bin/lib/validate-command-router.cjs": "e570f512c81f36aa",
|
||||
"gsd-core/bin/lib/validate.cjs": "71d10133337363d5",
|
||||
"gsd-core/bin/lib/verification-command-router.cjs": "7bb27562559625a2",
|
||||
"gsd-core/bin/lib/verification.cjs": "349fe736d467eec9",
|
||||
"gsd-core/bin/lib/verify-command-router.cjs": "847b2e8b74d4141d",
|
||||
"gsd-core/bin/lib/verify.cjs": "495c7a5a09593127",
|
||||
"gsd-core/bin/lib/workstream-inventory-builder.cjs": "17dd14ec7c59a024",
|
||||
"gsd-core/bin/lib/workstream-inventory.cjs": "e0383128698517de",
|
||||
"gsd-core/bin/lib/workstream-name-policy.cjs": "151ef8edad98cf2c",
|
||||
"gsd-core/bin/lib/workstream.cjs": "b7b6832f8b5a7b7f",
|
||||
"gsd-core/bin/lib/worktree-base-ref.cjs": "074b8ba5a68b58db",
|
||||
"gsd-core/bin/lib/worktree-safety.cjs": "d1e943bdf02c115a",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "67e4addbfd248a7c",
|
||||
"gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6",
|
||||
|
||||
142
tests/fixtures/golden-install-parity/kilo.json
vendored
142
tests/fixtures/golden-install-parity/kilo.json
vendored
@@ -109,148 +109,6 @@
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "1f2ff4e80aa45439",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/lib/active-workstream-store.cjs": "3bfe7dff4b800602",
|
||||
"gsd-core/bin/lib/adr-parser.cjs": "741a7a23743fdb46",
|
||||
"gsd-core/bin/lib/agent-command-router.cjs": "dc06df2790d6b6f7",
|
||||
"gsd-core/bin/lib/agent-install-check.cjs": "66afc7f0f1935b9a",
|
||||
"gsd-core/bin/lib/artifacts.cjs": "253076a1b2476446",
|
||||
"gsd-core/bin/lib/audit-command-router.cjs": "83320c0d5945060b",
|
||||
"gsd-core/bin/lib/audit.cjs": "9c0b659cde833828",
|
||||
"gsd-core/bin/lib/capability-activation.cjs": "6319c7b3f8b71d7b",
|
||||
"gsd-core/bin/lib/capability-consent.cjs": "309c957ef1707b21",
|
||||
"gsd-core/bin/lib/capability-ledger.cjs": "1abaf0d194703c92",
|
||||
"gsd-core/bin/lib/capability-lifecycle.cjs": "b6887bd3413e8a72",
|
||||
"gsd-core/bin/lib/capability-loader.cjs": "38fc9566893db3af",
|
||||
"gsd-core/bin/lib/capability-lock.cjs": "81cf58b717a32e2a",
|
||||
"gsd-core/bin/lib/capability-registry.cjs": "40888aec313fd6c7",
|
||||
"gsd-core/bin/lib/capability-source.cjs": "1122731793f04408",
|
||||
"gsd-core/bin/lib/capability-state.cjs": "bd174dc7488dfc10",
|
||||
"gsd-core/bin/lib/capability-trust.cjs": "28f513d40b58af16",
|
||||
"gsd-core/bin/lib/capability-validator.cjs": "3e4658be7e0a5741",
|
||||
"gsd-core/bin/lib/capability-writer.cjs": "760f53876da20268",
|
||||
"gsd-core/bin/lib/check-command-router.cjs": "7363dc0df9e5f8c5",
|
||||
"gsd-core/bin/lib/cjs-command-router-adapter.cjs": "baaddeadfacf4ed2",
|
||||
"gsd-core/bin/lib/cli-exit.cjs": "8913adfc6f878155",
|
||||
"gsd-core/bin/lib/clock.cjs": "e0121af119585126",
|
||||
"gsd-core/bin/lib/clusters.cjs": "64526279798dada8",
|
||||
"gsd-core/bin/lib/code-review-flags.cjs": "a347151887fc8486",
|
||||
"gsd-core/bin/lib/command-aliases.cjs": "aaad70c106709bbe",
|
||||
"gsd-core/bin/lib/command-arg-projection.cjs": "5dc425098779393e",
|
||||
"gsd-core/bin/lib/command-roster.cjs": "e9c8cc5cdbb2d234",
|
||||
"gsd-core/bin/lib/command-routing-hub.cjs": "5c3d4e54c3eb0dee",
|
||||
"gsd-core/bin/lib/commands.cjs": "710ae91893333dfa",
|
||||
"gsd-core/bin/lib/config-loader.cjs": "ad06d596d8e0c71d",
|
||||
"gsd-core/bin/lib/config-schema.cjs": "28eb2a5db1b407a7",
|
||||
"gsd-core/bin/lib/config-types.cjs": "96d613c58f03e1b4",
|
||||
"gsd-core/bin/lib/config.cjs": "fb2cfce9ab259ffe",
|
||||
"gsd-core/bin/lib/configuration.cjs": "05b2194def83ed56",
|
||||
"gsd-core/bin/lib/context-utilization.cjs": "e584bd8192164750",
|
||||
"gsd-core/bin/lib/core-utils.cjs": "31a635dae39110ae",
|
||||
"gsd-core/bin/lib/coverage.cjs": "2dd1a846167d29ca",
|
||||
"gsd-core/bin/lib/decisions.cjs": "4714718596d2fe73",
|
||||
"gsd-core/bin/lib/docs.cjs": "2575e4c1172aa022",
|
||||
"gsd-core/bin/lib/drift.cjs": "3336156fb1d90f9e",
|
||||
"gsd-core/bin/lib/edge-probe.cjs": "965a6eb3ff5e65f4",
|
||||
"gsd-core/bin/lib/eval-command-router.cjs": "c27b6b78bbdeaaf4",
|
||||
"gsd-core/bin/lib/eval.cjs": "1fe6f60777fc3e68",
|
||||
"gsd-core/bin/lib/fallow-runner.cjs": "b01ed16271f408b1",
|
||||
"gsd-core/bin/lib/federated-config.cjs": "070bec8afc3e523a",
|
||||
"gsd-core/bin/lib/frontmatter.cjs": "5fdc9423eba17a9f",
|
||||
"gsd-core/bin/lib/gap-checker.cjs": "08f1f264b2031a50",
|
||||
"gsd-core/bin/lib/git-base-branch.cjs": "53a4e91cd94f6221",
|
||||
"gsd-core/bin/lib/graphify-command-router.cjs": "6672e02eca402d2b",
|
||||
"gsd-core/bin/lib/graphify.cjs": "9471802c2efc13c1",
|
||||
"gsd-core/bin/lib/gsd2-import.cjs": "4dc7dbb282e00185",
|
||||
"gsd-core/bin/lib/host-integration.cjs": "5050b73b4c50fc79",
|
||||
"gsd-core/bin/lib/init-command-router.cjs": "5f6b583acaba1037",
|
||||
"gsd-core/bin/lib/init.cjs": "bcbe3af4720cb769",
|
||||
"gsd-core/bin/lib/install-profiles.cjs": "8c5d1318f4940307",
|
||||
"gsd-core/bin/lib/installer-migration-authoring.cjs": "050285a34b4b0b22",
|
||||
"gsd-core/bin/lib/installer-migration-report.cjs": "675fd40fd9c3aae4",
|
||||
"gsd-core/bin/lib/installer-migrations.cjs": "2c1b6d9ab7cab62a",
|
||||
"gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs": "27ae3ff0770c4c7b",
|
||||
"gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs": "e279bc0b87f040ca",
|
||||
"gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs": "8292c3e6af11c481",
|
||||
"gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs": "2cfb01e1e4d23461",
|
||||
"gsd-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs": "c1409ecc6b92b7e9",
|
||||
"gsd-core/bin/lib/intel-command-router.cjs": "3611eabadbaedbab",
|
||||
"gsd-core/bin/lib/intel.cjs": "86bf72a9910944e0",
|
||||
"gsd-core/bin/lib/io.cjs": "7d83809959fb3a8a",
|
||||
"gsd-core/bin/lib/learnings.cjs": "0f45ad609455ca62",
|
||||
"gsd-core/bin/lib/legacy-cleanup.cjs": "9aaf0480449906e6",
|
||||
"gsd-core/bin/lib/loop-host-contract.cjs": "da7f76ddb082620d",
|
||||
"gsd-core/bin/lib/loop-resolver.cjs": "25ce1eb00e95fa80",
|
||||
"gsd-core/bin/lib/markdown-sectionizer.cjs": "29d794e5de981792",
|
||||
"gsd-core/bin/lib/milestone.cjs": "ba975c7595f4a929",
|
||||
"gsd-core/bin/lib/model-catalog.cjs": "c4dcf3ddd17d25cd",
|
||||
"gsd-core/bin/lib/model-profiles.cjs": "83249502f09ccd78",
|
||||
"gsd-core/bin/lib/model-resolver.cjs": "cac3ec39756ab17e",
|
||||
"gsd-core/bin/lib/observability/event.cjs": "c3595929b827ab0e",
|
||||
"gsd-core/bin/lib/observability/logger.cjs": "c57185d96dec038f",
|
||||
"gsd-core/bin/lib/observability/redaction.cjs": "1565fe81a6c50837",
|
||||
"gsd-core/bin/lib/package-identity.cjs": "34051a3e4874fae4",
|
||||
"gsd-core/bin/lib/package-legitimacy.cjs": "d9677032f76cbdb2",
|
||||
"gsd-core/bin/lib/phase-command-router.cjs": "74ac64360d41ae5b",
|
||||
"gsd-core/bin/lib/phase-id.cjs": "60e2e0e4760f6b82",
|
||||
"gsd-core/bin/lib/phase-lifecycle.cjs": "0b1d7e6b4d14ad66",
|
||||
"gsd-core/bin/lib/phase-locator.cjs": "cf8de89cfcf097cd",
|
||||
"gsd-core/bin/lib/phase.cjs": "dbb0cb0aa8a04c2b",
|
||||
"gsd-core/bin/lib/phases-command-router.cjs": "f57d97992f0281c6",
|
||||
"gsd-core/bin/lib/plan-drift-guard.cjs": "b3d0bc58767b2567",
|
||||
"gsd-core/bin/lib/plan-scan.cjs": "07cadb766a55c6d0",
|
||||
"gsd-core/bin/lib/planning-workspace.cjs": "f2317830591bf4f8",
|
||||
"gsd-core/bin/lib/probe-core.cjs": "73ba5d375910ff28",
|
||||
"gsd-core/bin/lib/profile-output.cjs": "378808e03fd67c61",
|
||||
"gsd-core/bin/lib/profile-pipeline-command-router.cjs": "827e4e524304ad25",
|
||||
"gsd-core/bin/lib/profile-pipeline.cjs": "787e4248ca4c878d",
|
||||
"gsd-core/bin/lib/prohibition-enforcement.cjs": "c183ec49139a62e5",
|
||||
"gsd-core/bin/lib/project-root.cjs": "163993df1925a44b",
|
||||
"gsd-core/bin/lib/prompt-budget.cjs": "7356b0e890cda70b",
|
||||
"gsd-core/bin/lib/research-provider.cjs": "23b53a582199eff6",
|
||||
"gsd-core/bin/lib/research-store.cjs": "5031d4e184367f7f",
|
||||
"gsd-core/bin/lib/resolution.cjs": "fd11df257a4eb398",
|
||||
"gsd-core/bin/lib/review-reviewer-selection.cjs": "2f632c155aefbdd3",
|
||||
"gsd-core/bin/lib/roadmap-command-router.cjs": "13dfdf17596f8998",
|
||||
"gsd-core/bin/lib/roadmap-parser.cjs": "077b798638c88f6c",
|
||||
"gsd-core/bin/lib/roadmap-upgrade.cjs": "31b1d30bb04a773f",
|
||||
"gsd-core/bin/lib/roadmap.cjs": "c49ec2fa9ec9e423",
|
||||
"gsd-core/bin/lib/runtime-artifact-conversion.cjs": "16d63bcf307a2a35",
|
||||
"gsd-core/bin/lib/runtime-artifact-install-plan.cjs": "2389590d607dd559",
|
||||
"gsd-core/bin/lib/runtime-artifact-layout.cjs": "61e04a9e389ff4e2",
|
||||
"gsd-core/bin/lib/runtime-config-adapter-registry.cjs": "89e41665a8a90477",
|
||||
"gsd-core/bin/lib/runtime-homes.cjs": "12b47d66d04170c8",
|
||||
"gsd-core/bin/lib/runtime-hooks-surface.cjs": "7c559132cabe057d",
|
||||
"gsd-core/bin/lib/runtime-name-policy.cjs": "9ad3466f6811210e",
|
||||
"gsd-core/bin/lib/runtime-slash.cjs": "252e7cbc25eb2197",
|
||||
"gsd-core/bin/lib/schema-detect.cjs": "451be154264efe2f",
|
||||
"gsd-core/bin/lib/secrets.cjs": "02b42408bba154f2",
|
||||
"gsd-core/bin/lib/security.cjs": "c7f10a4c817b8b86",
|
||||
"gsd-core/bin/lib/semver-compare.cjs": "4f661153bc421cfc",
|
||||
"gsd-core/bin/lib/shell-command-projection.cjs": "f0a1c2d8d0ba9a1e",
|
||||
"gsd-core/bin/lib/stale-bake-guard.cjs": "d81694c9ff2836d3",
|
||||
"gsd-core/bin/lib/state-command-router.cjs": "f388d1204557b02b",
|
||||
"gsd-core/bin/lib/state-document.cjs": "33936a718bae305a",
|
||||
"gsd-core/bin/lib/state.cjs": "4d06f311264fcbe0",
|
||||
"gsd-core/bin/lib/surface.cjs": "59e7f250d204a513",
|
||||
"gsd-core/bin/lib/task-command-router.cjs": "f1eb768e2a233057",
|
||||
"gsd-core/bin/lib/teams-status.cjs": "1c779e9b1928cdc5",
|
||||
"gsd-core/bin/lib/template.cjs": "3c02fe523b07da1a",
|
||||
"gsd-core/bin/lib/uat-predicate.cjs": "f0cf70e68244b834",
|
||||
"gsd-core/bin/lib/uat.cjs": "e1e3f2448e46f795",
|
||||
"gsd-core/bin/lib/ui-safety-gate.cjs": "f98279fb1ad1cee9",
|
||||
"gsd-core/bin/lib/update-context.cjs": "c45cfd1f73c37685",
|
||||
"gsd-core/bin/lib/validate-command-router.cjs": "e570f512c81f36aa",
|
||||
"gsd-core/bin/lib/validate.cjs": "71d10133337363d5",
|
||||
"gsd-core/bin/lib/verification-command-router.cjs": "7bb27562559625a2",
|
||||
"gsd-core/bin/lib/verification.cjs": "349fe736d467eec9",
|
||||
"gsd-core/bin/lib/verify-command-router.cjs": "847b2e8b74d4141d",
|
||||
"gsd-core/bin/lib/verify.cjs": "495c7a5a09593127",
|
||||
"gsd-core/bin/lib/workstream-inventory-builder.cjs": "17dd14ec7c59a024",
|
||||
"gsd-core/bin/lib/workstream-inventory.cjs": "e0383128698517de",
|
||||
"gsd-core/bin/lib/workstream-name-policy.cjs": "151ef8edad98cf2c",
|
||||
"gsd-core/bin/lib/workstream.cjs": "b7b6832f8b5a7b7f",
|
||||
"gsd-core/bin/lib/worktree-base-ref.cjs": "0a20f520af59b940",
|
||||
"gsd-core/bin/lib/worktree-safety.cjs": "d1e943bdf02c115a",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "67e4addbfd248a7c",
|
||||
"gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6",
|
||||
|
||||
142
tests/fixtures/golden-install-parity/kimi.json
vendored
142
tests/fixtures/golden-install-parity/kimi.json
vendored
@@ -76,148 +76,6 @@
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "1f2ff4e80aa45439",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/lib/active-workstream-store.cjs": "3bfe7dff4b800602",
|
||||
"gsd-core/bin/lib/adr-parser.cjs": "741a7a23743fdb46",
|
||||
"gsd-core/bin/lib/agent-command-router.cjs": "dc06df2790d6b6f7",
|
||||
"gsd-core/bin/lib/agent-install-check.cjs": "66afc7f0f1935b9a",
|
||||
"gsd-core/bin/lib/artifacts.cjs": "253076a1b2476446",
|
||||
"gsd-core/bin/lib/audit-command-router.cjs": "83320c0d5945060b",
|
||||
"gsd-core/bin/lib/audit.cjs": "9c0b659cde833828",
|
||||
"gsd-core/bin/lib/capability-activation.cjs": "6319c7b3f8b71d7b",
|
||||
"gsd-core/bin/lib/capability-consent.cjs": "309c957ef1707b21",
|
||||
"gsd-core/bin/lib/capability-ledger.cjs": "1abaf0d194703c92",
|
||||
"gsd-core/bin/lib/capability-lifecycle.cjs": "b6887bd3413e8a72",
|
||||
"gsd-core/bin/lib/capability-loader.cjs": "38fc9566893db3af",
|
||||
"gsd-core/bin/lib/capability-lock.cjs": "81cf58b717a32e2a",
|
||||
"gsd-core/bin/lib/capability-registry.cjs": "40888aec313fd6c7",
|
||||
"gsd-core/bin/lib/capability-source.cjs": "1122731793f04408",
|
||||
"gsd-core/bin/lib/capability-state.cjs": "bd174dc7488dfc10",
|
||||
"gsd-core/bin/lib/capability-trust.cjs": "28f513d40b58af16",
|
||||
"gsd-core/bin/lib/capability-validator.cjs": "3e4658be7e0a5741",
|
||||
"gsd-core/bin/lib/capability-writer.cjs": "760f53876da20268",
|
||||
"gsd-core/bin/lib/check-command-router.cjs": "7363dc0df9e5f8c5",
|
||||
"gsd-core/bin/lib/cjs-command-router-adapter.cjs": "baaddeadfacf4ed2",
|
||||
"gsd-core/bin/lib/cli-exit.cjs": "8913adfc6f878155",
|
||||
"gsd-core/bin/lib/clock.cjs": "e0121af119585126",
|
||||
"gsd-core/bin/lib/clusters.cjs": "64526279798dada8",
|
||||
"gsd-core/bin/lib/code-review-flags.cjs": "a347151887fc8486",
|
||||
"gsd-core/bin/lib/command-aliases.cjs": "aaad70c106709bbe",
|
||||
"gsd-core/bin/lib/command-arg-projection.cjs": "5dc425098779393e",
|
||||
"gsd-core/bin/lib/command-roster.cjs": "e9c8cc5cdbb2d234",
|
||||
"gsd-core/bin/lib/command-routing-hub.cjs": "5c3d4e54c3eb0dee",
|
||||
"gsd-core/bin/lib/commands.cjs": "710ae91893333dfa",
|
||||
"gsd-core/bin/lib/config-loader.cjs": "ad06d596d8e0c71d",
|
||||
"gsd-core/bin/lib/config-schema.cjs": "28eb2a5db1b407a7",
|
||||
"gsd-core/bin/lib/config-types.cjs": "96d613c58f03e1b4",
|
||||
"gsd-core/bin/lib/config.cjs": "fb2cfce9ab259ffe",
|
||||
"gsd-core/bin/lib/configuration.cjs": "05b2194def83ed56",
|
||||
"gsd-core/bin/lib/context-utilization.cjs": "e584bd8192164750",
|
||||
"gsd-core/bin/lib/core-utils.cjs": "31a635dae39110ae",
|
||||
"gsd-core/bin/lib/coverage.cjs": "2dd1a846167d29ca",
|
||||
"gsd-core/bin/lib/decisions.cjs": "4714718596d2fe73",
|
||||
"gsd-core/bin/lib/docs.cjs": "2575e4c1172aa022",
|
||||
"gsd-core/bin/lib/drift.cjs": "3336156fb1d90f9e",
|
||||
"gsd-core/bin/lib/edge-probe.cjs": "965a6eb3ff5e65f4",
|
||||
"gsd-core/bin/lib/eval-command-router.cjs": "c27b6b78bbdeaaf4",
|
||||
"gsd-core/bin/lib/eval.cjs": "1fe6f60777fc3e68",
|
||||
"gsd-core/bin/lib/fallow-runner.cjs": "b01ed16271f408b1",
|
||||
"gsd-core/bin/lib/federated-config.cjs": "070bec8afc3e523a",
|
||||
"gsd-core/bin/lib/frontmatter.cjs": "5fdc9423eba17a9f",
|
||||
"gsd-core/bin/lib/gap-checker.cjs": "08f1f264b2031a50",
|
||||
"gsd-core/bin/lib/git-base-branch.cjs": "53a4e91cd94f6221",
|
||||
"gsd-core/bin/lib/graphify-command-router.cjs": "6672e02eca402d2b",
|
||||
"gsd-core/bin/lib/graphify.cjs": "9471802c2efc13c1",
|
||||
"gsd-core/bin/lib/gsd2-import.cjs": "4dc7dbb282e00185",
|
||||
"gsd-core/bin/lib/host-integration.cjs": "5050b73b4c50fc79",
|
||||
"gsd-core/bin/lib/init-command-router.cjs": "5f6b583acaba1037",
|
||||
"gsd-core/bin/lib/init.cjs": "bcbe3af4720cb769",
|
||||
"gsd-core/bin/lib/install-profiles.cjs": "8c5d1318f4940307",
|
||||
"gsd-core/bin/lib/installer-migration-authoring.cjs": "050285a34b4b0b22",
|
||||
"gsd-core/bin/lib/installer-migration-report.cjs": "675fd40fd9c3aae4",
|
||||
"gsd-core/bin/lib/installer-migrations.cjs": "2c1b6d9ab7cab62a",
|
||||
"gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs": "27ae3ff0770c4c7b",
|
||||
"gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs": "e279bc0b87f040ca",
|
||||
"gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs": "8292c3e6af11c481",
|
||||
"gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs": "2cfb01e1e4d23461",
|
||||
"gsd-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs": "c1409ecc6b92b7e9",
|
||||
"gsd-core/bin/lib/intel-command-router.cjs": "3611eabadbaedbab",
|
||||
"gsd-core/bin/lib/intel.cjs": "86bf72a9910944e0",
|
||||
"gsd-core/bin/lib/io.cjs": "7d83809959fb3a8a",
|
||||
"gsd-core/bin/lib/learnings.cjs": "0f45ad609455ca62",
|
||||
"gsd-core/bin/lib/legacy-cleanup.cjs": "9aaf0480449906e6",
|
||||
"gsd-core/bin/lib/loop-host-contract.cjs": "da7f76ddb082620d",
|
||||
"gsd-core/bin/lib/loop-resolver.cjs": "25ce1eb00e95fa80",
|
||||
"gsd-core/bin/lib/markdown-sectionizer.cjs": "29d794e5de981792",
|
||||
"gsd-core/bin/lib/milestone.cjs": "ba975c7595f4a929",
|
||||
"gsd-core/bin/lib/model-catalog.cjs": "c4dcf3ddd17d25cd",
|
||||
"gsd-core/bin/lib/model-profiles.cjs": "83249502f09ccd78",
|
||||
"gsd-core/bin/lib/model-resolver.cjs": "cac3ec39756ab17e",
|
||||
"gsd-core/bin/lib/observability/event.cjs": "c3595929b827ab0e",
|
||||
"gsd-core/bin/lib/observability/logger.cjs": "c57185d96dec038f",
|
||||
"gsd-core/bin/lib/observability/redaction.cjs": "1565fe81a6c50837",
|
||||
"gsd-core/bin/lib/package-identity.cjs": "34051a3e4874fae4",
|
||||
"gsd-core/bin/lib/package-legitimacy.cjs": "d9677032f76cbdb2",
|
||||
"gsd-core/bin/lib/phase-command-router.cjs": "74ac64360d41ae5b",
|
||||
"gsd-core/bin/lib/phase-id.cjs": "60e2e0e4760f6b82",
|
||||
"gsd-core/bin/lib/phase-lifecycle.cjs": "0b1d7e6b4d14ad66",
|
||||
"gsd-core/bin/lib/phase-locator.cjs": "cf8de89cfcf097cd",
|
||||
"gsd-core/bin/lib/phase.cjs": "dbb0cb0aa8a04c2b",
|
||||
"gsd-core/bin/lib/phases-command-router.cjs": "f57d97992f0281c6",
|
||||
"gsd-core/bin/lib/plan-drift-guard.cjs": "b3d0bc58767b2567",
|
||||
"gsd-core/bin/lib/plan-scan.cjs": "07cadb766a55c6d0",
|
||||
"gsd-core/bin/lib/planning-workspace.cjs": "f2317830591bf4f8",
|
||||
"gsd-core/bin/lib/probe-core.cjs": "73ba5d375910ff28",
|
||||
"gsd-core/bin/lib/profile-output.cjs": "378808e03fd67c61",
|
||||
"gsd-core/bin/lib/profile-pipeline-command-router.cjs": "827e4e524304ad25",
|
||||
"gsd-core/bin/lib/profile-pipeline.cjs": "787e4248ca4c878d",
|
||||
"gsd-core/bin/lib/prohibition-enforcement.cjs": "c183ec49139a62e5",
|
||||
"gsd-core/bin/lib/project-root.cjs": "163993df1925a44b",
|
||||
"gsd-core/bin/lib/prompt-budget.cjs": "7356b0e890cda70b",
|
||||
"gsd-core/bin/lib/research-provider.cjs": "23b53a582199eff6",
|
||||
"gsd-core/bin/lib/research-store.cjs": "5031d4e184367f7f",
|
||||
"gsd-core/bin/lib/resolution.cjs": "fd11df257a4eb398",
|
||||
"gsd-core/bin/lib/review-reviewer-selection.cjs": "2f632c155aefbdd3",
|
||||
"gsd-core/bin/lib/roadmap-command-router.cjs": "13dfdf17596f8998",
|
||||
"gsd-core/bin/lib/roadmap-parser.cjs": "077b798638c88f6c",
|
||||
"gsd-core/bin/lib/roadmap-upgrade.cjs": "31b1d30bb04a773f",
|
||||
"gsd-core/bin/lib/roadmap.cjs": "c49ec2fa9ec9e423",
|
||||
"gsd-core/bin/lib/runtime-artifact-conversion.cjs": "16d63bcf307a2a35",
|
||||
"gsd-core/bin/lib/runtime-artifact-install-plan.cjs": "2389590d607dd559",
|
||||
"gsd-core/bin/lib/runtime-artifact-layout.cjs": "61e04a9e389ff4e2",
|
||||
"gsd-core/bin/lib/runtime-config-adapter-registry.cjs": "89e41665a8a90477",
|
||||
"gsd-core/bin/lib/runtime-homes.cjs": "12b47d66d04170c8",
|
||||
"gsd-core/bin/lib/runtime-hooks-surface.cjs": "7c559132cabe057d",
|
||||
"gsd-core/bin/lib/runtime-name-policy.cjs": "9ad3466f6811210e",
|
||||
"gsd-core/bin/lib/runtime-slash.cjs": "252e7cbc25eb2197",
|
||||
"gsd-core/bin/lib/schema-detect.cjs": "451be154264efe2f",
|
||||
"gsd-core/bin/lib/secrets.cjs": "02b42408bba154f2",
|
||||
"gsd-core/bin/lib/security.cjs": "c7f10a4c817b8b86",
|
||||
"gsd-core/bin/lib/semver-compare.cjs": "4f661153bc421cfc",
|
||||
"gsd-core/bin/lib/shell-command-projection.cjs": "f0a1c2d8d0ba9a1e",
|
||||
"gsd-core/bin/lib/stale-bake-guard.cjs": "d81694c9ff2836d3",
|
||||
"gsd-core/bin/lib/state-command-router.cjs": "f388d1204557b02b",
|
||||
"gsd-core/bin/lib/state-document.cjs": "33936a718bae305a",
|
||||
"gsd-core/bin/lib/state.cjs": "4d06f311264fcbe0",
|
||||
"gsd-core/bin/lib/surface.cjs": "59e7f250d204a513",
|
||||
"gsd-core/bin/lib/task-command-router.cjs": "f1eb768e2a233057",
|
||||
"gsd-core/bin/lib/teams-status.cjs": "1c779e9b1928cdc5",
|
||||
"gsd-core/bin/lib/template.cjs": "3c02fe523b07da1a",
|
||||
"gsd-core/bin/lib/uat-predicate.cjs": "f0cf70e68244b834",
|
||||
"gsd-core/bin/lib/uat.cjs": "e1e3f2448e46f795",
|
||||
"gsd-core/bin/lib/ui-safety-gate.cjs": "f98279fb1ad1cee9",
|
||||
"gsd-core/bin/lib/update-context.cjs": "c45cfd1f73c37685",
|
||||
"gsd-core/bin/lib/validate-command-router.cjs": "e570f512c81f36aa",
|
||||
"gsd-core/bin/lib/validate.cjs": "71d10133337363d5",
|
||||
"gsd-core/bin/lib/verification-command-router.cjs": "7bb27562559625a2",
|
||||
"gsd-core/bin/lib/verification.cjs": "349fe736d467eec9",
|
||||
"gsd-core/bin/lib/verify-command-router.cjs": "847b2e8b74d4141d",
|
||||
"gsd-core/bin/lib/verify.cjs": "495c7a5a09593127",
|
||||
"gsd-core/bin/lib/workstream-inventory-builder.cjs": "17dd14ec7c59a024",
|
||||
"gsd-core/bin/lib/workstream-inventory.cjs": "e0383128698517de",
|
||||
"gsd-core/bin/lib/workstream-name-policy.cjs": "151ef8edad98cf2c",
|
||||
"gsd-core/bin/lib/workstream.cjs": "b7b6832f8b5a7b7f",
|
||||
"gsd-core/bin/lib/worktree-base-ref.cjs": "0a20f520af59b940",
|
||||
"gsd-core/bin/lib/worktree-safety.cjs": "d1e943bdf02c115a",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "67e4addbfd248a7c",
|
||||
"gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6",
|
||||
|
||||
142
tests/fixtures/golden-install-parity/opencode.json
vendored
142
tests/fixtures/golden-install-parity/opencode.json
vendored
@@ -109,148 +109,6 @@
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "1f2ff4e80aa45439",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/lib/active-workstream-store.cjs": "3bfe7dff4b800602",
|
||||
"gsd-core/bin/lib/adr-parser.cjs": "741a7a23743fdb46",
|
||||
"gsd-core/bin/lib/agent-command-router.cjs": "dc06df2790d6b6f7",
|
||||
"gsd-core/bin/lib/agent-install-check.cjs": "66afc7f0f1935b9a",
|
||||
"gsd-core/bin/lib/artifacts.cjs": "253076a1b2476446",
|
||||
"gsd-core/bin/lib/audit-command-router.cjs": "83320c0d5945060b",
|
||||
"gsd-core/bin/lib/audit.cjs": "9c0b659cde833828",
|
||||
"gsd-core/bin/lib/capability-activation.cjs": "6319c7b3f8b71d7b",
|
||||
"gsd-core/bin/lib/capability-consent.cjs": "309c957ef1707b21",
|
||||
"gsd-core/bin/lib/capability-ledger.cjs": "1abaf0d194703c92",
|
||||
"gsd-core/bin/lib/capability-lifecycle.cjs": "b6887bd3413e8a72",
|
||||
"gsd-core/bin/lib/capability-loader.cjs": "38fc9566893db3af",
|
||||
"gsd-core/bin/lib/capability-lock.cjs": "81cf58b717a32e2a",
|
||||
"gsd-core/bin/lib/capability-registry.cjs": "40888aec313fd6c7",
|
||||
"gsd-core/bin/lib/capability-source.cjs": "1122731793f04408",
|
||||
"gsd-core/bin/lib/capability-state.cjs": "bd174dc7488dfc10",
|
||||
"gsd-core/bin/lib/capability-trust.cjs": "28f513d40b58af16",
|
||||
"gsd-core/bin/lib/capability-validator.cjs": "3e4658be7e0a5741",
|
||||
"gsd-core/bin/lib/capability-writer.cjs": "760f53876da20268",
|
||||
"gsd-core/bin/lib/check-command-router.cjs": "7363dc0df9e5f8c5",
|
||||
"gsd-core/bin/lib/cjs-command-router-adapter.cjs": "baaddeadfacf4ed2",
|
||||
"gsd-core/bin/lib/cli-exit.cjs": "8913adfc6f878155",
|
||||
"gsd-core/bin/lib/clock.cjs": "e0121af119585126",
|
||||
"gsd-core/bin/lib/clusters.cjs": "64526279798dada8",
|
||||
"gsd-core/bin/lib/code-review-flags.cjs": "a347151887fc8486",
|
||||
"gsd-core/bin/lib/command-aliases.cjs": "aaad70c106709bbe",
|
||||
"gsd-core/bin/lib/command-arg-projection.cjs": "5dc425098779393e",
|
||||
"gsd-core/bin/lib/command-roster.cjs": "e9c8cc5cdbb2d234",
|
||||
"gsd-core/bin/lib/command-routing-hub.cjs": "5c3d4e54c3eb0dee",
|
||||
"gsd-core/bin/lib/commands.cjs": "710ae91893333dfa",
|
||||
"gsd-core/bin/lib/config-loader.cjs": "ad06d596d8e0c71d",
|
||||
"gsd-core/bin/lib/config-schema.cjs": "28eb2a5db1b407a7",
|
||||
"gsd-core/bin/lib/config-types.cjs": "96d613c58f03e1b4",
|
||||
"gsd-core/bin/lib/config.cjs": "fb2cfce9ab259ffe",
|
||||
"gsd-core/bin/lib/configuration.cjs": "05b2194def83ed56",
|
||||
"gsd-core/bin/lib/context-utilization.cjs": "e584bd8192164750",
|
||||
"gsd-core/bin/lib/core-utils.cjs": "31a635dae39110ae",
|
||||
"gsd-core/bin/lib/coverage.cjs": "2dd1a846167d29ca",
|
||||
"gsd-core/bin/lib/decisions.cjs": "4714718596d2fe73",
|
||||
"gsd-core/bin/lib/docs.cjs": "2575e4c1172aa022",
|
||||
"gsd-core/bin/lib/drift.cjs": "3336156fb1d90f9e",
|
||||
"gsd-core/bin/lib/edge-probe.cjs": "965a6eb3ff5e65f4",
|
||||
"gsd-core/bin/lib/eval-command-router.cjs": "c27b6b78bbdeaaf4",
|
||||
"gsd-core/bin/lib/eval.cjs": "1fe6f60777fc3e68",
|
||||
"gsd-core/bin/lib/fallow-runner.cjs": "b01ed16271f408b1",
|
||||
"gsd-core/bin/lib/federated-config.cjs": "070bec8afc3e523a",
|
||||
"gsd-core/bin/lib/frontmatter.cjs": "5fdc9423eba17a9f",
|
||||
"gsd-core/bin/lib/gap-checker.cjs": "08f1f264b2031a50",
|
||||
"gsd-core/bin/lib/git-base-branch.cjs": "53a4e91cd94f6221",
|
||||
"gsd-core/bin/lib/graphify-command-router.cjs": "6672e02eca402d2b",
|
||||
"gsd-core/bin/lib/graphify.cjs": "9471802c2efc13c1",
|
||||
"gsd-core/bin/lib/gsd2-import.cjs": "4dc7dbb282e00185",
|
||||
"gsd-core/bin/lib/host-integration.cjs": "5050b73b4c50fc79",
|
||||
"gsd-core/bin/lib/init-command-router.cjs": "5f6b583acaba1037",
|
||||
"gsd-core/bin/lib/init.cjs": "bcbe3af4720cb769",
|
||||
"gsd-core/bin/lib/install-profiles.cjs": "8c5d1318f4940307",
|
||||
"gsd-core/bin/lib/installer-migration-authoring.cjs": "050285a34b4b0b22",
|
||||
"gsd-core/bin/lib/installer-migration-report.cjs": "675fd40fd9c3aae4",
|
||||
"gsd-core/bin/lib/installer-migrations.cjs": "2c1b6d9ab7cab62a",
|
||||
"gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs": "27ae3ff0770c4c7b",
|
||||
"gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs": "e279bc0b87f040ca",
|
||||
"gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs": "8292c3e6af11c481",
|
||||
"gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs": "2cfb01e1e4d23461",
|
||||
"gsd-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs": "c1409ecc6b92b7e9",
|
||||
"gsd-core/bin/lib/intel-command-router.cjs": "3611eabadbaedbab",
|
||||
"gsd-core/bin/lib/intel.cjs": "86bf72a9910944e0",
|
||||
"gsd-core/bin/lib/io.cjs": "7d83809959fb3a8a",
|
||||
"gsd-core/bin/lib/learnings.cjs": "0f45ad609455ca62",
|
||||
"gsd-core/bin/lib/legacy-cleanup.cjs": "9aaf0480449906e6",
|
||||
"gsd-core/bin/lib/loop-host-contract.cjs": "da7f76ddb082620d",
|
||||
"gsd-core/bin/lib/loop-resolver.cjs": "25ce1eb00e95fa80",
|
||||
"gsd-core/bin/lib/markdown-sectionizer.cjs": "29d794e5de981792",
|
||||
"gsd-core/bin/lib/milestone.cjs": "ba975c7595f4a929",
|
||||
"gsd-core/bin/lib/model-catalog.cjs": "c4dcf3ddd17d25cd",
|
||||
"gsd-core/bin/lib/model-profiles.cjs": "83249502f09ccd78",
|
||||
"gsd-core/bin/lib/model-resolver.cjs": "cac3ec39756ab17e",
|
||||
"gsd-core/bin/lib/observability/event.cjs": "c3595929b827ab0e",
|
||||
"gsd-core/bin/lib/observability/logger.cjs": "c57185d96dec038f",
|
||||
"gsd-core/bin/lib/observability/redaction.cjs": "1565fe81a6c50837",
|
||||
"gsd-core/bin/lib/package-identity.cjs": "34051a3e4874fae4",
|
||||
"gsd-core/bin/lib/package-legitimacy.cjs": "d9677032f76cbdb2",
|
||||
"gsd-core/bin/lib/phase-command-router.cjs": "74ac64360d41ae5b",
|
||||
"gsd-core/bin/lib/phase-id.cjs": "60e2e0e4760f6b82",
|
||||
"gsd-core/bin/lib/phase-lifecycle.cjs": "0b1d7e6b4d14ad66",
|
||||
"gsd-core/bin/lib/phase-locator.cjs": "cf8de89cfcf097cd",
|
||||
"gsd-core/bin/lib/phase.cjs": "dbb0cb0aa8a04c2b",
|
||||
"gsd-core/bin/lib/phases-command-router.cjs": "f57d97992f0281c6",
|
||||
"gsd-core/bin/lib/plan-drift-guard.cjs": "b3d0bc58767b2567",
|
||||
"gsd-core/bin/lib/plan-scan.cjs": "07cadb766a55c6d0",
|
||||
"gsd-core/bin/lib/planning-workspace.cjs": "f2317830591bf4f8",
|
||||
"gsd-core/bin/lib/probe-core.cjs": "73ba5d375910ff28",
|
||||
"gsd-core/bin/lib/profile-output.cjs": "378808e03fd67c61",
|
||||
"gsd-core/bin/lib/profile-pipeline-command-router.cjs": "827e4e524304ad25",
|
||||
"gsd-core/bin/lib/profile-pipeline.cjs": "787e4248ca4c878d",
|
||||
"gsd-core/bin/lib/prohibition-enforcement.cjs": "c183ec49139a62e5",
|
||||
"gsd-core/bin/lib/project-root.cjs": "163993df1925a44b",
|
||||
"gsd-core/bin/lib/prompt-budget.cjs": "7356b0e890cda70b",
|
||||
"gsd-core/bin/lib/research-provider.cjs": "23b53a582199eff6",
|
||||
"gsd-core/bin/lib/research-store.cjs": "5031d4e184367f7f",
|
||||
"gsd-core/bin/lib/resolution.cjs": "fd11df257a4eb398",
|
||||
"gsd-core/bin/lib/review-reviewer-selection.cjs": "2f632c155aefbdd3",
|
||||
"gsd-core/bin/lib/roadmap-command-router.cjs": "13dfdf17596f8998",
|
||||
"gsd-core/bin/lib/roadmap-parser.cjs": "077b798638c88f6c",
|
||||
"gsd-core/bin/lib/roadmap-upgrade.cjs": "31b1d30bb04a773f",
|
||||
"gsd-core/bin/lib/roadmap.cjs": "c49ec2fa9ec9e423",
|
||||
"gsd-core/bin/lib/runtime-artifact-conversion.cjs": "16d63bcf307a2a35",
|
||||
"gsd-core/bin/lib/runtime-artifact-install-plan.cjs": "2389590d607dd559",
|
||||
"gsd-core/bin/lib/runtime-artifact-layout.cjs": "61e04a9e389ff4e2",
|
||||
"gsd-core/bin/lib/runtime-config-adapter-registry.cjs": "89e41665a8a90477",
|
||||
"gsd-core/bin/lib/runtime-homes.cjs": "12b47d66d04170c8",
|
||||
"gsd-core/bin/lib/runtime-hooks-surface.cjs": "7c559132cabe057d",
|
||||
"gsd-core/bin/lib/runtime-name-policy.cjs": "9ad3466f6811210e",
|
||||
"gsd-core/bin/lib/runtime-slash.cjs": "252e7cbc25eb2197",
|
||||
"gsd-core/bin/lib/schema-detect.cjs": "451be154264efe2f",
|
||||
"gsd-core/bin/lib/secrets.cjs": "02b42408bba154f2",
|
||||
"gsd-core/bin/lib/security.cjs": "c7f10a4c817b8b86",
|
||||
"gsd-core/bin/lib/semver-compare.cjs": "4f661153bc421cfc",
|
||||
"gsd-core/bin/lib/shell-command-projection.cjs": "f0a1c2d8d0ba9a1e",
|
||||
"gsd-core/bin/lib/stale-bake-guard.cjs": "d81694c9ff2836d3",
|
||||
"gsd-core/bin/lib/state-command-router.cjs": "f388d1204557b02b",
|
||||
"gsd-core/bin/lib/state-document.cjs": "33936a718bae305a",
|
||||
"gsd-core/bin/lib/state.cjs": "4d06f311264fcbe0",
|
||||
"gsd-core/bin/lib/surface.cjs": "59e7f250d204a513",
|
||||
"gsd-core/bin/lib/task-command-router.cjs": "f1eb768e2a233057",
|
||||
"gsd-core/bin/lib/teams-status.cjs": "1c779e9b1928cdc5",
|
||||
"gsd-core/bin/lib/template.cjs": "3c02fe523b07da1a",
|
||||
"gsd-core/bin/lib/uat-predicate.cjs": "f0cf70e68244b834",
|
||||
"gsd-core/bin/lib/uat.cjs": "e1e3f2448e46f795",
|
||||
"gsd-core/bin/lib/ui-safety-gate.cjs": "f98279fb1ad1cee9",
|
||||
"gsd-core/bin/lib/update-context.cjs": "c45cfd1f73c37685",
|
||||
"gsd-core/bin/lib/validate-command-router.cjs": "e570f512c81f36aa",
|
||||
"gsd-core/bin/lib/validate.cjs": "71d10133337363d5",
|
||||
"gsd-core/bin/lib/verification-command-router.cjs": "7bb27562559625a2",
|
||||
"gsd-core/bin/lib/verification.cjs": "349fe736d467eec9",
|
||||
"gsd-core/bin/lib/verify-command-router.cjs": "847b2e8b74d4141d",
|
||||
"gsd-core/bin/lib/verify.cjs": "495c7a5a09593127",
|
||||
"gsd-core/bin/lib/workstream-inventory-builder.cjs": "17dd14ec7c59a024",
|
||||
"gsd-core/bin/lib/workstream-inventory.cjs": "e0383128698517de",
|
||||
"gsd-core/bin/lib/workstream-name-policy.cjs": "151ef8edad98cf2c",
|
||||
"gsd-core/bin/lib/workstream.cjs": "b7b6832f8b5a7b7f",
|
||||
"gsd-core/bin/lib/worktree-base-ref.cjs": "0a20f520af59b940",
|
||||
"gsd-core/bin/lib/worktree-safety.cjs": "d1e943bdf02c115a",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "67e4addbfd248a7c",
|
||||
"gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6",
|
||||
|
||||
142
tests/fixtures/golden-install-parity/qwen.json
vendored
142
tests/fixtures/golden-install-parity/qwen.json
vendored
@@ -40,148 +40,6 @@
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "1f2ff4e80aa45439",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/lib/active-workstream-store.cjs": "3bfe7dff4b800602",
|
||||
"gsd-core/bin/lib/adr-parser.cjs": "741a7a23743fdb46",
|
||||
"gsd-core/bin/lib/agent-command-router.cjs": "dc06df2790d6b6f7",
|
||||
"gsd-core/bin/lib/agent-install-check.cjs": "66afc7f0f1935b9a",
|
||||
"gsd-core/bin/lib/artifacts.cjs": "6326c990536fdce7",
|
||||
"gsd-core/bin/lib/audit-command-router.cjs": "83320c0d5945060b",
|
||||
"gsd-core/bin/lib/audit.cjs": "9c0b659cde833828",
|
||||
"gsd-core/bin/lib/capability-activation.cjs": "6319c7b3f8b71d7b",
|
||||
"gsd-core/bin/lib/capability-consent.cjs": "309c957ef1707b21",
|
||||
"gsd-core/bin/lib/capability-ledger.cjs": "1abaf0d194703c92",
|
||||
"gsd-core/bin/lib/capability-lifecycle.cjs": "69dce221271c17e1",
|
||||
"gsd-core/bin/lib/capability-loader.cjs": "38fc9566893db3af",
|
||||
"gsd-core/bin/lib/capability-lock.cjs": "81cf58b717a32e2a",
|
||||
"gsd-core/bin/lib/capability-registry.cjs": "ef3734757b7538e6",
|
||||
"gsd-core/bin/lib/capability-source.cjs": "1122731793f04408",
|
||||
"gsd-core/bin/lib/capability-state.cjs": "bd174dc7488dfc10",
|
||||
"gsd-core/bin/lib/capability-trust.cjs": "28f513d40b58af16",
|
||||
"gsd-core/bin/lib/capability-validator.cjs": "3e4658be7e0a5741",
|
||||
"gsd-core/bin/lib/capability-writer.cjs": "760f53876da20268",
|
||||
"gsd-core/bin/lib/check-command-router.cjs": "7363dc0df9e5f8c5",
|
||||
"gsd-core/bin/lib/cjs-command-router-adapter.cjs": "baaddeadfacf4ed2",
|
||||
"gsd-core/bin/lib/cli-exit.cjs": "8913adfc6f878155",
|
||||
"gsd-core/bin/lib/clock.cjs": "e0121af119585126",
|
||||
"gsd-core/bin/lib/clusters.cjs": "64526279798dada8",
|
||||
"gsd-core/bin/lib/code-review-flags.cjs": "a347151887fc8486",
|
||||
"gsd-core/bin/lib/command-aliases.cjs": "aaad70c106709bbe",
|
||||
"gsd-core/bin/lib/command-arg-projection.cjs": "5dc425098779393e",
|
||||
"gsd-core/bin/lib/command-roster.cjs": "e9c8cc5cdbb2d234",
|
||||
"gsd-core/bin/lib/command-routing-hub.cjs": "5c3d4e54c3eb0dee",
|
||||
"gsd-core/bin/lib/commands.cjs": "710ae91893333dfa",
|
||||
"gsd-core/bin/lib/config-loader.cjs": "ad06d596d8e0c71d",
|
||||
"gsd-core/bin/lib/config-schema.cjs": "28eb2a5db1b407a7",
|
||||
"gsd-core/bin/lib/config-types.cjs": "96d613c58f03e1b4",
|
||||
"gsd-core/bin/lib/config.cjs": "e5aec77377434fa0",
|
||||
"gsd-core/bin/lib/configuration.cjs": "05b2194def83ed56",
|
||||
"gsd-core/bin/lib/context-utilization.cjs": "e584bd8192164750",
|
||||
"gsd-core/bin/lib/core-utils.cjs": "31a635dae39110ae",
|
||||
"gsd-core/bin/lib/coverage.cjs": "2dd1a846167d29ca",
|
||||
"gsd-core/bin/lib/decisions.cjs": "4714718596d2fe73",
|
||||
"gsd-core/bin/lib/docs.cjs": "2575e4c1172aa022",
|
||||
"gsd-core/bin/lib/drift.cjs": "3336156fb1d90f9e",
|
||||
"gsd-core/bin/lib/edge-probe.cjs": "965a6eb3ff5e65f4",
|
||||
"gsd-core/bin/lib/eval-command-router.cjs": "c27b6b78bbdeaaf4",
|
||||
"gsd-core/bin/lib/eval.cjs": "1fe6f60777fc3e68",
|
||||
"gsd-core/bin/lib/fallow-runner.cjs": "b01ed16271f408b1",
|
||||
"gsd-core/bin/lib/federated-config.cjs": "070bec8afc3e523a",
|
||||
"gsd-core/bin/lib/frontmatter.cjs": "5fdc9423eba17a9f",
|
||||
"gsd-core/bin/lib/gap-checker.cjs": "08f1f264b2031a50",
|
||||
"gsd-core/bin/lib/git-base-branch.cjs": "53a4e91cd94f6221",
|
||||
"gsd-core/bin/lib/graphify-command-router.cjs": "6672e02eca402d2b",
|
||||
"gsd-core/bin/lib/graphify.cjs": "9471802c2efc13c1",
|
||||
"gsd-core/bin/lib/gsd2-import.cjs": "4dc7dbb282e00185",
|
||||
"gsd-core/bin/lib/host-integration.cjs": "5050b73b4c50fc79",
|
||||
"gsd-core/bin/lib/init-command-router.cjs": "5f6b583acaba1037",
|
||||
"gsd-core/bin/lib/init.cjs": "36c8239745700bb0",
|
||||
"gsd-core/bin/lib/install-profiles.cjs": "8c5d1318f4940307",
|
||||
"gsd-core/bin/lib/installer-migration-authoring.cjs": "050285a34b4b0b22",
|
||||
"gsd-core/bin/lib/installer-migration-report.cjs": "b69cb969588f08ab",
|
||||
"gsd-core/bin/lib/installer-migrations.cjs": "2c1b6d9ab7cab62a",
|
||||
"gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs": "27ae3ff0770c4c7b",
|
||||
"gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs": "e279bc0b87f040ca",
|
||||
"gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs": "8292c3e6af11c481",
|
||||
"gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs": "2cfb01e1e4d23461",
|
||||
"gsd-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs": "c1409ecc6b92b7e9",
|
||||
"gsd-core/bin/lib/intel-command-router.cjs": "3611eabadbaedbab",
|
||||
"gsd-core/bin/lib/intel.cjs": "86bf72a9910944e0",
|
||||
"gsd-core/bin/lib/io.cjs": "8f5e49a141eb0a2d",
|
||||
"gsd-core/bin/lib/learnings.cjs": "0f45ad609455ca62",
|
||||
"gsd-core/bin/lib/legacy-cleanup.cjs": "9aaf0480449906e6",
|
||||
"gsd-core/bin/lib/loop-host-contract.cjs": "da7f76ddb082620d",
|
||||
"gsd-core/bin/lib/loop-resolver.cjs": "25ce1eb00e95fa80",
|
||||
"gsd-core/bin/lib/markdown-sectionizer.cjs": "29d794e5de981792",
|
||||
"gsd-core/bin/lib/milestone.cjs": "ba975c7595f4a929",
|
||||
"gsd-core/bin/lib/model-catalog.cjs": "c4dcf3ddd17d25cd",
|
||||
"gsd-core/bin/lib/model-profiles.cjs": "83249502f09ccd78",
|
||||
"gsd-core/bin/lib/model-resolver.cjs": "497a09dbbdfa7086",
|
||||
"gsd-core/bin/lib/observability/event.cjs": "c3595929b827ab0e",
|
||||
"gsd-core/bin/lib/observability/logger.cjs": "c57185d96dec038f",
|
||||
"gsd-core/bin/lib/observability/redaction.cjs": "1565fe81a6c50837",
|
||||
"gsd-core/bin/lib/package-identity.cjs": "34051a3e4874fae4",
|
||||
"gsd-core/bin/lib/package-legitimacy.cjs": "d9677032f76cbdb2",
|
||||
"gsd-core/bin/lib/phase-command-router.cjs": "74ac64360d41ae5b",
|
||||
"gsd-core/bin/lib/phase-id.cjs": "60e2e0e4760f6b82",
|
||||
"gsd-core/bin/lib/phase-lifecycle.cjs": "0b1d7e6b4d14ad66",
|
||||
"gsd-core/bin/lib/phase-locator.cjs": "cf8de89cfcf097cd",
|
||||
"gsd-core/bin/lib/phase.cjs": "dbb0cb0aa8a04c2b",
|
||||
"gsd-core/bin/lib/phases-command-router.cjs": "f57d97992f0281c6",
|
||||
"gsd-core/bin/lib/plan-drift-guard.cjs": "b3d0bc58767b2567",
|
||||
"gsd-core/bin/lib/plan-scan.cjs": "07cadb766a55c6d0",
|
||||
"gsd-core/bin/lib/planning-workspace.cjs": "f2317830591bf4f8",
|
||||
"gsd-core/bin/lib/probe-core.cjs": "73ba5d375910ff28",
|
||||
"gsd-core/bin/lib/profile-output.cjs": "43f723001e082bf0",
|
||||
"gsd-core/bin/lib/profile-pipeline-command-router.cjs": "827e4e524304ad25",
|
||||
"gsd-core/bin/lib/profile-pipeline.cjs": "6169ed5ea3266775",
|
||||
"gsd-core/bin/lib/prohibition-enforcement.cjs": "c183ec49139a62e5",
|
||||
"gsd-core/bin/lib/project-root.cjs": "163993df1925a44b",
|
||||
"gsd-core/bin/lib/prompt-budget.cjs": "7356b0e890cda70b",
|
||||
"gsd-core/bin/lib/research-provider.cjs": "23b53a582199eff6",
|
||||
"gsd-core/bin/lib/research-store.cjs": "5031d4e184367f7f",
|
||||
"gsd-core/bin/lib/resolution.cjs": "fd11df257a4eb398",
|
||||
"gsd-core/bin/lib/review-reviewer-selection.cjs": "2f632c155aefbdd3",
|
||||
"gsd-core/bin/lib/roadmap-command-router.cjs": "13dfdf17596f8998",
|
||||
"gsd-core/bin/lib/roadmap-parser.cjs": "077b798638c88f6c",
|
||||
"gsd-core/bin/lib/roadmap-upgrade.cjs": "31b1d30bb04a773f",
|
||||
"gsd-core/bin/lib/roadmap.cjs": "c49ec2fa9ec9e423",
|
||||
"gsd-core/bin/lib/runtime-artifact-conversion.cjs": "93095c07e90be6db",
|
||||
"gsd-core/bin/lib/runtime-artifact-install-plan.cjs": "2389590d607dd559",
|
||||
"gsd-core/bin/lib/runtime-artifact-layout.cjs": "61e04a9e389ff4e2",
|
||||
"gsd-core/bin/lib/runtime-config-adapter-registry.cjs": "89e41665a8a90477",
|
||||
"gsd-core/bin/lib/runtime-homes.cjs": "12b47d66d04170c8",
|
||||
"gsd-core/bin/lib/runtime-hooks-surface.cjs": "ea7523a74adec314",
|
||||
"gsd-core/bin/lib/runtime-name-policy.cjs": "5ab4d91e32b4ba77",
|
||||
"gsd-core/bin/lib/runtime-slash.cjs": "216749a847c80645",
|
||||
"gsd-core/bin/lib/schema-detect.cjs": "451be154264efe2f",
|
||||
"gsd-core/bin/lib/secrets.cjs": "02b42408bba154f2",
|
||||
"gsd-core/bin/lib/security.cjs": "c7f10a4c817b8b86",
|
||||
"gsd-core/bin/lib/semver-compare.cjs": "4f661153bc421cfc",
|
||||
"gsd-core/bin/lib/shell-command-projection.cjs": "317abf83e41ad2a9",
|
||||
"gsd-core/bin/lib/stale-bake-guard.cjs": "d81694c9ff2836d3",
|
||||
"gsd-core/bin/lib/state-command-router.cjs": "f388d1204557b02b",
|
||||
"gsd-core/bin/lib/state-document.cjs": "33936a718bae305a",
|
||||
"gsd-core/bin/lib/state.cjs": "4d06f311264fcbe0",
|
||||
"gsd-core/bin/lib/surface.cjs": "159223860db9dccc",
|
||||
"gsd-core/bin/lib/task-command-router.cjs": "f1eb768e2a233057",
|
||||
"gsd-core/bin/lib/teams-status.cjs": "1c779e9b1928cdc5",
|
||||
"gsd-core/bin/lib/template.cjs": "3c02fe523b07da1a",
|
||||
"gsd-core/bin/lib/uat-predicate.cjs": "f0cf70e68244b834",
|
||||
"gsd-core/bin/lib/uat.cjs": "e1e3f2448e46f795",
|
||||
"gsd-core/bin/lib/ui-safety-gate.cjs": "f98279fb1ad1cee9",
|
||||
"gsd-core/bin/lib/update-context.cjs": "c45cfd1f73c37685",
|
||||
"gsd-core/bin/lib/validate-command-router.cjs": "e570f512c81f36aa",
|
||||
"gsd-core/bin/lib/validate.cjs": "71d10133337363d5",
|
||||
"gsd-core/bin/lib/verification-command-router.cjs": "7bb27562559625a2",
|
||||
"gsd-core/bin/lib/verification.cjs": "349fe736d467eec9",
|
||||
"gsd-core/bin/lib/verify-command-router.cjs": "847b2e8b74d4141d",
|
||||
"gsd-core/bin/lib/verify.cjs": "495c7a5a09593127",
|
||||
"gsd-core/bin/lib/workstream-inventory-builder.cjs": "17dd14ec7c59a024",
|
||||
"gsd-core/bin/lib/workstream-inventory.cjs": "e0383128698517de",
|
||||
"gsd-core/bin/lib/workstream-name-policy.cjs": "151ef8edad98cf2c",
|
||||
"gsd-core/bin/lib/workstream.cjs": "b7b6832f8b5a7b7f",
|
||||
"gsd-core/bin/lib/worktree-base-ref.cjs": "b4dde1027fa14d73",
|
||||
"gsd-core/bin/lib/worktree-safety.cjs": "d1e943bdf02c115a",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "67e4addbfd248a7c",
|
||||
"gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6",
|
||||
|
||||
142
tests/fixtures/golden-install-parity/trae.json
vendored
142
tests/fixtures/golden-install-parity/trae.json
vendored
@@ -40,148 +40,6 @@
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "08cbf1f404d64b93",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/lib/active-workstream-store.cjs": "3bfe7dff4b800602",
|
||||
"gsd-core/bin/lib/adr-parser.cjs": "741a7a23743fdb46",
|
||||
"gsd-core/bin/lib/agent-command-router.cjs": "dc06df2790d6b6f7",
|
||||
"gsd-core/bin/lib/agent-install-check.cjs": "66afc7f0f1935b9a",
|
||||
"gsd-core/bin/lib/artifacts.cjs": "63d7c5547c1a137c",
|
||||
"gsd-core/bin/lib/audit-command-router.cjs": "83320c0d5945060b",
|
||||
"gsd-core/bin/lib/audit.cjs": "7844d355fb599509",
|
||||
"gsd-core/bin/lib/capability-activation.cjs": "6319c7b3f8b71d7b",
|
||||
"gsd-core/bin/lib/capability-consent.cjs": "309c957ef1707b21",
|
||||
"gsd-core/bin/lib/capability-ledger.cjs": "1abaf0d194703c92",
|
||||
"gsd-core/bin/lib/capability-lifecycle.cjs": "b6887bd3413e8a72",
|
||||
"gsd-core/bin/lib/capability-loader.cjs": "38fc9566893db3af",
|
||||
"gsd-core/bin/lib/capability-lock.cjs": "81cf58b717a32e2a",
|
||||
"gsd-core/bin/lib/capability-registry.cjs": "f02dd1895ef91515",
|
||||
"gsd-core/bin/lib/capability-source.cjs": "1122731793f04408",
|
||||
"gsd-core/bin/lib/capability-state.cjs": "bd174dc7488dfc10",
|
||||
"gsd-core/bin/lib/capability-trust.cjs": "28f513d40b58af16",
|
||||
"gsd-core/bin/lib/capability-validator.cjs": "3e4658be7e0a5741",
|
||||
"gsd-core/bin/lib/capability-writer.cjs": "85d872d8b2af1eb4",
|
||||
"gsd-core/bin/lib/check-command-router.cjs": "5b720dfda54303a1",
|
||||
"gsd-core/bin/lib/cjs-command-router-adapter.cjs": "baaddeadfacf4ed2",
|
||||
"gsd-core/bin/lib/cli-exit.cjs": "8913adfc6f878155",
|
||||
"gsd-core/bin/lib/clock.cjs": "e0121af119585126",
|
||||
"gsd-core/bin/lib/clusters.cjs": "1f260412e5890d75",
|
||||
"gsd-core/bin/lib/code-review-flags.cjs": "607b42845cfa9f0d",
|
||||
"gsd-core/bin/lib/command-aliases.cjs": "aaad70c106709bbe",
|
||||
"gsd-core/bin/lib/command-arg-projection.cjs": "5dc425098779393e",
|
||||
"gsd-core/bin/lib/command-roster.cjs": "e9c8cc5cdbb2d234",
|
||||
"gsd-core/bin/lib/command-routing-hub.cjs": "5c3d4e54c3eb0dee",
|
||||
"gsd-core/bin/lib/commands.cjs": "710ae91893333dfa",
|
||||
"gsd-core/bin/lib/config-loader.cjs": "ad06d596d8e0c71d",
|
||||
"gsd-core/bin/lib/config-schema.cjs": "28eb2a5db1b407a7",
|
||||
"gsd-core/bin/lib/config-types.cjs": "96d613c58f03e1b4",
|
||||
"gsd-core/bin/lib/config.cjs": "000ef44723d09a6f",
|
||||
"gsd-core/bin/lib/configuration.cjs": "05b2194def83ed56",
|
||||
"gsd-core/bin/lib/context-utilization.cjs": "e584bd8192164750",
|
||||
"gsd-core/bin/lib/core-utils.cjs": "31a635dae39110ae",
|
||||
"gsd-core/bin/lib/coverage.cjs": "2dd1a846167d29ca",
|
||||
"gsd-core/bin/lib/decisions.cjs": "4714718596d2fe73",
|
||||
"gsd-core/bin/lib/docs.cjs": "2575e4c1172aa022",
|
||||
"gsd-core/bin/lib/drift.cjs": "3336156fb1d90f9e",
|
||||
"gsd-core/bin/lib/edge-probe.cjs": "965a6eb3ff5e65f4",
|
||||
"gsd-core/bin/lib/eval-command-router.cjs": "c27b6b78bbdeaaf4",
|
||||
"gsd-core/bin/lib/eval.cjs": "1fe6f60777fc3e68",
|
||||
"gsd-core/bin/lib/fallow-runner.cjs": "b01ed16271f408b1",
|
||||
"gsd-core/bin/lib/federated-config.cjs": "070bec8afc3e523a",
|
||||
"gsd-core/bin/lib/frontmatter.cjs": "5fdc9423eba17a9f",
|
||||
"gsd-core/bin/lib/gap-checker.cjs": "08f1f264b2031a50",
|
||||
"gsd-core/bin/lib/git-base-branch.cjs": "53a4e91cd94f6221",
|
||||
"gsd-core/bin/lib/graphify-command-router.cjs": "6672e02eca402d2b",
|
||||
"gsd-core/bin/lib/graphify.cjs": "9471802c2efc13c1",
|
||||
"gsd-core/bin/lib/gsd2-import.cjs": "4dc7dbb282e00185",
|
||||
"gsd-core/bin/lib/host-integration.cjs": "5050b73b4c50fc79",
|
||||
"gsd-core/bin/lib/init-command-router.cjs": "5f6b583acaba1037",
|
||||
"gsd-core/bin/lib/init.cjs": "bcbe3af4720cb769",
|
||||
"gsd-core/bin/lib/install-profiles.cjs": "8c5d1318f4940307",
|
||||
"gsd-core/bin/lib/installer-migration-authoring.cjs": "050285a34b4b0b22",
|
||||
"gsd-core/bin/lib/installer-migration-report.cjs": "e9689e14ececf74c",
|
||||
"gsd-core/bin/lib/installer-migrations.cjs": "2c1b6d9ab7cab62a",
|
||||
"gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs": "27ae3ff0770c4c7b",
|
||||
"gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs": "e279bc0b87f040ca",
|
||||
"gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs": "8292c3e6af11c481",
|
||||
"gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs": "2cfb01e1e4d23461",
|
||||
"gsd-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs": "c1409ecc6b92b7e9",
|
||||
"gsd-core/bin/lib/intel-command-router.cjs": "3611eabadbaedbab",
|
||||
"gsd-core/bin/lib/intel.cjs": "86bf72a9910944e0",
|
||||
"gsd-core/bin/lib/io.cjs": "205d832e3bafa178",
|
||||
"gsd-core/bin/lib/learnings.cjs": "0f45ad609455ca62",
|
||||
"gsd-core/bin/lib/legacy-cleanup.cjs": "9aaf0480449906e6",
|
||||
"gsd-core/bin/lib/loop-host-contract.cjs": "da7f76ddb082620d",
|
||||
"gsd-core/bin/lib/loop-resolver.cjs": "25ce1eb00e95fa80",
|
||||
"gsd-core/bin/lib/markdown-sectionizer.cjs": "29d794e5de981792",
|
||||
"gsd-core/bin/lib/milestone.cjs": "ba975c7595f4a929",
|
||||
"gsd-core/bin/lib/model-catalog.cjs": "c4dcf3ddd17d25cd",
|
||||
"gsd-core/bin/lib/model-profiles.cjs": "83249502f09ccd78",
|
||||
"gsd-core/bin/lib/model-resolver.cjs": "9ba080ec1f60be31",
|
||||
"gsd-core/bin/lib/observability/event.cjs": "c3595929b827ab0e",
|
||||
"gsd-core/bin/lib/observability/logger.cjs": "c57185d96dec038f",
|
||||
"gsd-core/bin/lib/observability/redaction.cjs": "1565fe81a6c50837",
|
||||
"gsd-core/bin/lib/package-identity.cjs": "34051a3e4874fae4",
|
||||
"gsd-core/bin/lib/package-legitimacy.cjs": "d9677032f76cbdb2",
|
||||
"gsd-core/bin/lib/phase-command-router.cjs": "74ac64360d41ae5b",
|
||||
"gsd-core/bin/lib/phase-id.cjs": "60e2e0e4760f6b82",
|
||||
"gsd-core/bin/lib/phase-lifecycle.cjs": "0b1d7e6b4d14ad66",
|
||||
"gsd-core/bin/lib/phase-locator.cjs": "cf8de89cfcf097cd",
|
||||
"gsd-core/bin/lib/phase.cjs": "dbb0cb0aa8a04c2b",
|
||||
"gsd-core/bin/lib/phases-command-router.cjs": "f57d97992f0281c6",
|
||||
"gsd-core/bin/lib/plan-drift-guard.cjs": "b3d0bc58767b2567",
|
||||
"gsd-core/bin/lib/plan-scan.cjs": "07cadb766a55c6d0",
|
||||
"gsd-core/bin/lib/planning-workspace.cjs": "f2317830591bf4f8",
|
||||
"gsd-core/bin/lib/probe-core.cjs": "73ba5d375910ff28",
|
||||
"gsd-core/bin/lib/profile-output.cjs": "dab2fa55ff1e1128",
|
||||
"gsd-core/bin/lib/profile-pipeline-command-router.cjs": "827e4e524304ad25",
|
||||
"gsd-core/bin/lib/profile-pipeline.cjs": "d5a7802d6b4a0077",
|
||||
"gsd-core/bin/lib/prohibition-enforcement.cjs": "c183ec49139a62e5",
|
||||
"gsd-core/bin/lib/project-root.cjs": "163993df1925a44b",
|
||||
"gsd-core/bin/lib/prompt-budget.cjs": "7356b0e890cda70b",
|
||||
"gsd-core/bin/lib/research-provider.cjs": "23b53a582199eff6",
|
||||
"gsd-core/bin/lib/research-store.cjs": "5031d4e184367f7f",
|
||||
"gsd-core/bin/lib/resolution.cjs": "fd11df257a4eb398",
|
||||
"gsd-core/bin/lib/review-reviewer-selection.cjs": "adb03f906b609563",
|
||||
"gsd-core/bin/lib/roadmap-command-router.cjs": "13dfdf17596f8998",
|
||||
"gsd-core/bin/lib/roadmap-parser.cjs": "077b798638c88f6c",
|
||||
"gsd-core/bin/lib/roadmap-upgrade.cjs": "31b1d30bb04a773f",
|
||||
"gsd-core/bin/lib/roadmap.cjs": "c49ec2fa9ec9e423",
|
||||
"gsd-core/bin/lib/runtime-artifact-conversion.cjs": "9fd646cc2080dc1d",
|
||||
"gsd-core/bin/lib/runtime-artifact-install-plan.cjs": "2389590d607dd559",
|
||||
"gsd-core/bin/lib/runtime-artifact-layout.cjs": "4485d1d3a5f04712",
|
||||
"gsd-core/bin/lib/runtime-config-adapter-registry.cjs": "89e41665a8a90477",
|
||||
"gsd-core/bin/lib/runtime-homes.cjs": "12b47d66d04170c8",
|
||||
"gsd-core/bin/lib/runtime-hooks-surface.cjs": "5d41e2c234250b21",
|
||||
"gsd-core/bin/lib/runtime-name-policy.cjs": "40809cfaa863a5e7",
|
||||
"gsd-core/bin/lib/runtime-slash.cjs": "031b1ae1daeb7ce4",
|
||||
"gsd-core/bin/lib/schema-detect.cjs": "451be154264efe2f",
|
||||
"gsd-core/bin/lib/secrets.cjs": "02b42408bba154f2",
|
||||
"gsd-core/bin/lib/security.cjs": "c7f10a4c817b8b86",
|
||||
"gsd-core/bin/lib/semver-compare.cjs": "4f661153bc421cfc",
|
||||
"gsd-core/bin/lib/shell-command-projection.cjs": "8009e36ec9d60cb1",
|
||||
"gsd-core/bin/lib/stale-bake-guard.cjs": "d81694c9ff2836d3",
|
||||
"gsd-core/bin/lib/state-command-router.cjs": "f388d1204557b02b",
|
||||
"gsd-core/bin/lib/state-document.cjs": "33936a718bae305a",
|
||||
"gsd-core/bin/lib/state.cjs": "4d06f311264fcbe0",
|
||||
"gsd-core/bin/lib/surface.cjs": "59e7f250d204a513",
|
||||
"gsd-core/bin/lib/task-command-router.cjs": "f1eb768e2a233057",
|
||||
"gsd-core/bin/lib/teams-status.cjs": "1c779e9b1928cdc5",
|
||||
"gsd-core/bin/lib/template.cjs": "3c02fe523b07da1a",
|
||||
"gsd-core/bin/lib/uat-predicate.cjs": "f0cf70e68244b834",
|
||||
"gsd-core/bin/lib/uat.cjs": "e1e3f2448e46f795",
|
||||
"gsd-core/bin/lib/ui-safety-gate.cjs": "f98279fb1ad1cee9",
|
||||
"gsd-core/bin/lib/update-context.cjs": "c45cfd1f73c37685",
|
||||
"gsd-core/bin/lib/validate-command-router.cjs": "e570f512c81f36aa",
|
||||
"gsd-core/bin/lib/validate.cjs": "71d10133337363d5",
|
||||
"gsd-core/bin/lib/verification-command-router.cjs": "7bb27562559625a2",
|
||||
"gsd-core/bin/lib/verification.cjs": "62578334903576c3",
|
||||
"gsd-core/bin/lib/verify-command-router.cjs": "847b2e8b74d4141d",
|
||||
"gsd-core/bin/lib/verify.cjs": "495c7a5a09593127",
|
||||
"gsd-core/bin/lib/workstream-inventory-builder.cjs": "17dd14ec7c59a024",
|
||||
"gsd-core/bin/lib/workstream-inventory.cjs": "e0383128698517de",
|
||||
"gsd-core/bin/lib/workstream-name-policy.cjs": "151ef8edad98cf2c",
|
||||
"gsd-core/bin/lib/workstream.cjs": "b7b6832f8b5a7b7f",
|
||||
"gsd-core/bin/lib/worktree-base-ref.cjs": "dd372f0854450a54",
|
||||
"gsd-core/bin/lib/worktree-safety.cjs": "d1e943bdf02c115a",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "67e4addbfd248a7c",
|
||||
"gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6",
|
||||
|
||||
142
tests/fixtures/golden-install-parity/windsurf.json
vendored
142
tests/fixtures/golden-install-parity/windsurf.json
vendored
@@ -40,148 +40,6 @@
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "08cbf1f404d64b93",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/lib/active-workstream-store.cjs": "3bfe7dff4b800602",
|
||||
"gsd-core/bin/lib/adr-parser.cjs": "741a7a23743fdb46",
|
||||
"gsd-core/bin/lib/agent-command-router.cjs": "dc06df2790d6b6f7",
|
||||
"gsd-core/bin/lib/agent-install-check.cjs": "66afc7f0f1935b9a",
|
||||
"gsd-core/bin/lib/artifacts.cjs": "658c03e17d705fb8",
|
||||
"gsd-core/bin/lib/audit-command-router.cjs": "83320c0d5945060b",
|
||||
"gsd-core/bin/lib/audit.cjs": "7844d355fb599509",
|
||||
"gsd-core/bin/lib/capability-activation.cjs": "6319c7b3f8b71d7b",
|
||||
"gsd-core/bin/lib/capability-consent.cjs": "309c957ef1707b21",
|
||||
"gsd-core/bin/lib/capability-ledger.cjs": "1abaf0d194703c92",
|
||||
"gsd-core/bin/lib/capability-lifecycle.cjs": "b6887bd3413e8a72",
|
||||
"gsd-core/bin/lib/capability-loader.cjs": "38fc9566893db3af",
|
||||
"gsd-core/bin/lib/capability-lock.cjs": "81cf58b717a32e2a",
|
||||
"gsd-core/bin/lib/capability-registry.cjs": "f1ff963de972ba52",
|
||||
"gsd-core/bin/lib/capability-source.cjs": "1122731793f04408",
|
||||
"gsd-core/bin/lib/capability-state.cjs": "bd174dc7488dfc10",
|
||||
"gsd-core/bin/lib/capability-trust.cjs": "28f513d40b58af16",
|
||||
"gsd-core/bin/lib/capability-validator.cjs": "3e4658be7e0a5741",
|
||||
"gsd-core/bin/lib/capability-writer.cjs": "85d872d8b2af1eb4",
|
||||
"gsd-core/bin/lib/check-command-router.cjs": "5b720dfda54303a1",
|
||||
"gsd-core/bin/lib/cjs-command-router-adapter.cjs": "baaddeadfacf4ed2",
|
||||
"gsd-core/bin/lib/cli-exit.cjs": "8913adfc6f878155",
|
||||
"gsd-core/bin/lib/clock.cjs": "e0121af119585126",
|
||||
"gsd-core/bin/lib/clusters.cjs": "1f260412e5890d75",
|
||||
"gsd-core/bin/lib/code-review-flags.cjs": "607b42845cfa9f0d",
|
||||
"gsd-core/bin/lib/command-aliases.cjs": "aaad70c106709bbe",
|
||||
"gsd-core/bin/lib/command-arg-projection.cjs": "5dc425098779393e",
|
||||
"gsd-core/bin/lib/command-roster.cjs": "e9c8cc5cdbb2d234",
|
||||
"gsd-core/bin/lib/command-routing-hub.cjs": "5c3d4e54c3eb0dee",
|
||||
"gsd-core/bin/lib/commands.cjs": "710ae91893333dfa",
|
||||
"gsd-core/bin/lib/config-loader.cjs": "ad82ca6acb6b93f3",
|
||||
"gsd-core/bin/lib/config-schema.cjs": "28eb2a5db1b407a7",
|
||||
"gsd-core/bin/lib/config-types.cjs": "96d613c58f03e1b4",
|
||||
"gsd-core/bin/lib/config.cjs": "1c5cccea6e0f5907",
|
||||
"gsd-core/bin/lib/configuration.cjs": "05b2194def83ed56",
|
||||
"gsd-core/bin/lib/context-utilization.cjs": "e584bd8192164750",
|
||||
"gsd-core/bin/lib/core-utils.cjs": "31a635dae39110ae",
|
||||
"gsd-core/bin/lib/coverage.cjs": "2dd1a846167d29ca",
|
||||
"gsd-core/bin/lib/decisions.cjs": "4714718596d2fe73",
|
||||
"gsd-core/bin/lib/docs.cjs": "2575e4c1172aa022",
|
||||
"gsd-core/bin/lib/drift.cjs": "3336156fb1d90f9e",
|
||||
"gsd-core/bin/lib/edge-probe.cjs": "965a6eb3ff5e65f4",
|
||||
"gsd-core/bin/lib/eval-command-router.cjs": "c27b6b78bbdeaaf4",
|
||||
"gsd-core/bin/lib/eval.cjs": "1fe6f60777fc3e68",
|
||||
"gsd-core/bin/lib/fallow-runner.cjs": "b01ed16271f408b1",
|
||||
"gsd-core/bin/lib/federated-config.cjs": "070bec8afc3e523a",
|
||||
"gsd-core/bin/lib/frontmatter.cjs": "5fdc9423eba17a9f",
|
||||
"gsd-core/bin/lib/gap-checker.cjs": "08f1f264b2031a50",
|
||||
"gsd-core/bin/lib/git-base-branch.cjs": "53a4e91cd94f6221",
|
||||
"gsd-core/bin/lib/graphify-command-router.cjs": "6672e02eca402d2b",
|
||||
"gsd-core/bin/lib/graphify.cjs": "9471802c2efc13c1",
|
||||
"gsd-core/bin/lib/gsd2-import.cjs": "4dc7dbb282e00185",
|
||||
"gsd-core/bin/lib/host-integration.cjs": "5050b73b4c50fc79",
|
||||
"gsd-core/bin/lib/init-command-router.cjs": "5f6b583acaba1037",
|
||||
"gsd-core/bin/lib/init.cjs": "bcbe3af4720cb769",
|
||||
"gsd-core/bin/lib/install-profiles.cjs": "8c5d1318f4940307",
|
||||
"gsd-core/bin/lib/installer-migration-authoring.cjs": "050285a34b4b0b22",
|
||||
"gsd-core/bin/lib/installer-migration-report.cjs": "6c5861bed23b6bc3",
|
||||
"gsd-core/bin/lib/installer-migrations.cjs": "2c1b6d9ab7cab62a",
|
||||
"gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs": "27ae3ff0770c4c7b",
|
||||
"gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs": "e279bc0b87f040ca",
|
||||
"gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs": "8292c3e6af11c481",
|
||||
"gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs": "2cfb01e1e4d23461",
|
||||
"gsd-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs": "c1409ecc6b92b7e9",
|
||||
"gsd-core/bin/lib/intel-command-router.cjs": "3611eabadbaedbab",
|
||||
"gsd-core/bin/lib/intel.cjs": "86bf72a9910944e0",
|
||||
"gsd-core/bin/lib/io.cjs": "5256d70bd8c5211f",
|
||||
"gsd-core/bin/lib/learnings.cjs": "0f45ad609455ca62",
|
||||
"gsd-core/bin/lib/legacy-cleanup.cjs": "9aaf0480449906e6",
|
||||
"gsd-core/bin/lib/loop-host-contract.cjs": "da7f76ddb082620d",
|
||||
"gsd-core/bin/lib/loop-resolver.cjs": "25ce1eb00e95fa80",
|
||||
"gsd-core/bin/lib/markdown-sectionizer.cjs": "29d794e5de981792",
|
||||
"gsd-core/bin/lib/milestone.cjs": "ba975c7595f4a929",
|
||||
"gsd-core/bin/lib/model-catalog.cjs": "c4dcf3ddd17d25cd",
|
||||
"gsd-core/bin/lib/model-profiles.cjs": "83249502f09ccd78",
|
||||
"gsd-core/bin/lib/model-resolver.cjs": "7389256543ad0347",
|
||||
"gsd-core/bin/lib/observability/event.cjs": "c3595929b827ab0e",
|
||||
"gsd-core/bin/lib/observability/logger.cjs": "c57185d96dec038f",
|
||||
"gsd-core/bin/lib/observability/redaction.cjs": "1565fe81a6c50837",
|
||||
"gsd-core/bin/lib/package-identity.cjs": "34051a3e4874fae4",
|
||||
"gsd-core/bin/lib/package-legitimacy.cjs": "d9677032f76cbdb2",
|
||||
"gsd-core/bin/lib/phase-command-router.cjs": "74ac64360d41ae5b",
|
||||
"gsd-core/bin/lib/phase-id.cjs": "60e2e0e4760f6b82",
|
||||
"gsd-core/bin/lib/phase-lifecycle.cjs": "0b1d7e6b4d14ad66",
|
||||
"gsd-core/bin/lib/phase-locator.cjs": "cf8de89cfcf097cd",
|
||||
"gsd-core/bin/lib/phase.cjs": "dbb0cb0aa8a04c2b",
|
||||
"gsd-core/bin/lib/phases-command-router.cjs": "f57d97992f0281c6",
|
||||
"gsd-core/bin/lib/plan-drift-guard.cjs": "b3d0bc58767b2567",
|
||||
"gsd-core/bin/lib/plan-scan.cjs": "07cadb766a55c6d0",
|
||||
"gsd-core/bin/lib/planning-workspace.cjs": "f2317830591bf4f8",
|
||||
"gsd-core/bin/lib/probe-core.cjs": "73ba5d375910ff28",
|
||||
"gsd-core/bin/lib/profile-output.cjs": "9e948aaea14155de",
|
||||
"gsd-core/bin/lib/profile-pipeline-command-router.cjs": "827e4e524304ad25",
|
||||
"gsd-core/bin/lib/profile-pipeline.cjs": "103c4be934da1508",
|
||||
"gsd-core/bin/lib/prohibition-enforcement.cjs": "c183ec49139a62e5",
|
||||
"gsd-core/bin/lib/project-root.cjs": "163993df1925a44b",
|
||||
"gsd-core/bin/lib/prompt-budget.cjs": "7356b0e890cda70b",
|
||||
"gsd-core/bin/lib/research-provider.cjs": "23b53a582199eff6",
|
||||
"gsd-core/bin/lib/research-store.cjs": "5031d4e184367f7f",
|
||||
"gsd-core/bin/lib/resolution.cjs": "fd11df257a4eb398",
|
||||
"gsd-core/bin/lib/review-reviewer-selection.cjs": "adb03f906b609563",
|
||||
"gsd-core/bin/lib/roadmap-command-router.cjs": "13dfdf17596f8998",
|
||||
"gsd-core/bin/lib/roadmap-parser.cjs": "077b798638c88f6c",
|
||||
"gsd-core/bin/lib/roadmap-upgrade.cjs": "31b1d30bb04a773f",
|
||||
"gsd-core/bin/lib/roadmap.cjs": "c49ec2fa9ec9e423",
|
||||
"gsd-core/bin/lib/runtime-artifact-conversion.cjs": "5e116f2cc37cb46b",
|
||||
"gsd-core/bin/lib/runtime-artifact-install-plan.cjs": "2389590d607dd559",
|
||||
"gsd-core/bin/lib/runtime-artifact-layout.cjs": "4485d1d3a5f04712",
|
||||
"gsd-core/bin/lib/runtime-config-adapter-registry.cjs": "89e41665a8a90477",
|
||||
"gsd-core/bin/lib/runtime-homes.cjs": "12b47d66d04170c8",
|
||||
"gsd-core/bin/lib/runtime-hooks-surface.cjs": "f5e9a3611233a5bb",
|
||||
"gsd-core/bin/lib/runtime-name-policy.cjs": "7a418633e560b041",
|
||||
"gsd-core/bin/lib/runtime-slash.cjs": "de6187c0d4455205",
|
||||
"gsd-core/bin/lib/schema-detect.cjs": "451be154264efe2f",
|
||||
"gsd-core/bin/lib/secrets.cjs": "02b42408bba154f2",
|
||||
"gsd-core/bin/lib/security.cjs": "c7f10a4c817b8b86",
|
||||
"gsd-core/bin/lib/semver-compare.cjs": "4f661153bc421cfc",
|
||||
"gsd-core/bin/lib/shell-command-projection.cjs": "7f8ae03f90ddb87f",
|
||||
"gsd-core/bin/lib/stale-bake-guard.cjs": "8f4449be425ffd08",
|
||||
"gsd-core/bin/lib/state-command-router.cjs": "f388d1204557b02b",
|
||||
"gsd-core/bin/lib/state-document.cjs": "33936a718bae305a",
|
||||
"gsd-core/bin/lib/state.cjs": "4d06f311264fcbe0",
|
||||
"gsd-core/bin/lib/surface.cjs": "59e7f250d204a513",
|
||||
"gsd-core/bin/lib/task-command-router.cjs": "f1eb768e2a233057",
|
||||
"gsd-core/bin/lib/teams-status.cjs": "1c779e9b1928cdc5",
|
||||
"gsd-core/bin/lib/template.cjs": "3c02fe523b07da1a",
|
||||
"gsd-core/bin/lib/uat-predicate.cjs": "f0cf70e68244b834",
|
||||
"gsd-core/bin/lib/uat.cjs": "e1e3f2448e46f795",
|
||||
"gsd-core/bin/lib/ui-safety-gate.cjs": "f98279fb1ad1cee9",
|
||||
"gsd-core/bin/lib/update-context.cjs": "c45cfd1f73c37685",
|
||||
"gsd-core/bin/lib/validate-command-router.cjs": "e570f512c81f36aa",
|
||||
"gsd-core/bin/lib/validate.cjs": "71d10133337363d5",
|
||||
"gsd-core/bin/lib/verification-command-router.cjs": "7bb27562559625a2",
|
||||
"gsd-core/bin/lib/verification.cjs": "62578334903576c3",
|
||||
"gsd-core/bin/lib/verify-command-router.cjs": "847b2e8b74d4141d",
|
||||
"gsd-core/bin/lib/verify.cjs": "495c7a5a09593127",
|
||||
"gsd-core/bin/lib/workstream-inventory-builder.cjs": "17dd14ec7c59a024",
|
||||
"gsd-core/bin/lib/workstream-inventory.cjs": "e0383128698517de",
|
||||
"gsd-core/bin/lib/workstream-name-policy.cjs": "151ef8edad98cf2c",
|
||||
"gsd-core/bin/lib/workstream.cjs": "b7b6832f8b5a7b7f",
|
||||
"gsd-core/bin/lib/worktree-base-ref.cjs": "bf7b0625202abc1a",
|
||||
"gsd-core/bin/lib/worktree-safety.cjs": "d1e943bdf02c115a",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "67e4addbfd248a7c",
|
||||
"gsd-core/bin/shared/model-catalog.json": "dbe26e683236d8c6",
|
||||
|
||||
@@ -63,6 +63,18 @@ const VOLATILE_FILES = new Set(['gsd-file-manifest.json', 'gsd-install-state.jso
|
||||
// Codex/Cursor hook surface — both embed the platform-varying node-runner command.
|
||||
const HOOK_CONFIG_FILES = new Set(['settings.json', 'hooks.json']);
|
||||
|
||||
// Path prefixes excluded from the parity manifest. `gsd-core/bin/lib/` holds the
|
||||
// tsc-built runtime artifacts (compiled from src/*.cts) that the install COPIES
|
||||
// verbatim — they are NOT produced by installRuntimeArtifacts (the move's parity
|
||||
// scope), and their exact bytes depend on the BUILD environment (a clean tsc
|
||||
// build vs a stale incremental one yields different output for unchanged sources).
|
||||
// Including them made the golden non-portable: CI's clean build legitimately
|
||||
// differs from a local incremental build for modules the PR never touched
|
||||
// (e.g. milestone.cjs, roadmap.cjs). The .cts sources are type-checked + drift-
|
||||
// guarded + coverage-gated elsewhere; this harness asserts the CONVERTED artifact
|
||||
// output (skills/commands/agents) that the engine actually emits.
|
||||
const EXCLUDED_PREFIXES = ['gsd-core/bin/lib/'];
|
||||
|
||||
/**
|
||||
* Build a deterministic hash-map of all non-volatile files under configDir.
|
||||
*
|
||||
@@ -86,6 +98,7 @@ function buildParityManifest(configDir, root) {
|
||||
|
||||
if (VOLATILE_FILES.has(rel)) continue;
|
||||
if (HOOK_CONFIG_FILES.has(path.basename(rel))) continue;
|
||||
if (EXCLUDED_PREFIXES.some((p) => rel.startsWith(p))) continue;
|
||||
|
||||
const content = fs.readFileSync(full);
|
||||
// Normalize every occurrence of the temp root so hashes are stable across runs.
|
||||
|
||||
@@ -21,8 +21,9 @@ const fs = require('fs');
|
||||
|
||||
const {
|
||||
convertClaudeCommandToClaudeSkill,
|
||||
installRuntimeArtifacts,
|
||||
} = require('../bin/install.js');
|
||||
|
||||
const { installRuntimeArtifacts } = require('../gsd-core/bin/lib/install-engine.cjs');
|
||||
const { parseFrontmatter, cleanup } = require('./helpers.cjs');
|
||||
const pkg = require('../package.json');
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ const os = require('node:os');
|
||||
|
||||
const {
|
||||
installRuntimeArtifacts,
|
||||
} = require('../bin/install.js');
|
||||
} = require('../gsd-core/bin/lib/install-engine.cjs');
|
||||
|
||||
const { cleanup } = require('./helpers.cjs');
|
||||
|
||||
|
||||
@@ -37,7 +37,12 @@ try {
|
||||
else process.env.GSD_TEST_MODE = savedTestMode;
|
||||
}
|
||||
|
||||
const { install, installRuntimeArtifacts, uninstallRuntimeArtifacts, mergeClaudePermissions, GSD_CLAUDE_ALLOW_PERMISSIONS, GSD_CLAUDE_DENY_PERMISSIONS, rewriteLegacyManagedNodeHookCommands, resolveNodeRunner } = installExports || {};
|
||||
const { install, mergeClaudePermissions, GSD_CLAUDE_ALLOW_PERMISSIONS, GSD_CLAUDE_DENY_PERMISSIONS, rewriteLegacyManagedNodeHookCommands, resolveNodeRunner } = installExports || {};
|
||||
|
||||
const {
|
||||
installRuntimeArtifacts,
|
||||
uninstallRuntimeArtifacts,
|
||||
} = require('../gsd-core/bin/lib/install-engine.cjs');
|
||||
|
||||
const INSTALL_SCRIPT = path.join(__dirname, '..', 'bin', 'install.js');
|
||||
const HOOKS_SRC = path.join(__dirname, '..', 'hooks');
|
||||
|
||||
@@ -29,6 +29,9 @@ const { createTempDir, cleanup } = require('./helpers.cjs');
|
||||
const {
|
||||
installRuntimeArtifacts,
|
||||
installOpencodeFamilySkills,
|
||||
} = require('../gsd-core/bin/lib/install-engine.cjs');
|
||||
|
||||
const {
|
||||
parseRuntimeInput,
|
||||
allRuntimes,
|
||||
} = require('../bin/install.js');
|
||||
|
||||
@@ -26,7 +26,7 @@ const os = require('node:os');
|
||||
const ROOT = path.join(__dirname, '..');
|
||||
const COMMANDS_GSD = path.join(ROOT, 'commands', 'gsd');
|
||||
|
||||
const { installRuntimeArtifacts } = require('../bin/install.js');
|
||||
const { installRuntimeArtifacts } = require('../gsd-core/bin/lib/install-engine.cjs');
|
||||
const { applySurface } = require('../gsd-core/bin/lib/surface.cjs');
|
||||
const { loadSkillsManifest, resolveProfile } = require('../gsd-core/bin/lib/install-profiles.cjs');
|
||||
const { resolveRuntimeArtifactLayout } = require('../gsd-core/bin/lib/runtime-artifact-layout.cjs');
|
||||
|
||||
@@ -21,9 +21,10 @@ const fs = require('fs');
|
||||
|
||||
const {
|
||||
convertClaudeCommandToClaudeSkill,
|
||||
installRuntimeArtifacts,
|
||||
} = require('../bin/install.js');
|
||||
|
||||
const { installRuntimeArtifacts } = require('../gsd-core/bin/lib/install-engine.cjs');
|
||||
|
||||
const {
|
||||
loadSkillsManifest,
|
||||
resolveProfile,
|
||||
|
||||
Reference in New Issue
Block a user