Merge remote-tracking branch 'origin/next' into fix/1477-surface-source-marker

This commit is contained in:
Joe Slitzker
2026-06-26 17:05:43 -05:00
236 changed files with 24126 additions and 1945 deletions

View File

@@ -50,7 +50,7 @@ describe('HDOC: anti-heredoc instruction', () => {
for (const agent of ALL_AGENTS) {
const content = fs.readFileSync(path.join(AGENTS_DIR, agent + '.md'), 'utf-8');
// Match actual heredoc commands (not references in anti-heredoc instruction)
const lines = content.split('\n');
const lines = content.split(/\r?\n/);
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
// Skip lines that are part of the anti-heredoc instruction or markdown code fences

View File

@@ -32,7 +32,7 @@ const libDir = path.resolve(__dirname, '..', 'gsd-core', 'bin', 'lib');
*/
function findBareWrites(filePath) {
const content = fs.readFileSync(filePath, 'utf-8');
const lines = content.split('\n');
const lines = content.split(/\r?\n/);
const hits = [];
for (let i = 0; i < lines.length; i++) {
if (/\bfs\.writeFileSync\s*\(/.test(lines[i])) {

View File

@@ -28,7 +28,7 @@ describe('commands/gsd/autonomous.md allowed-tools', () => {
// Parse the allowed-tools list items (lines starting with " - ")
const toolLines = frontmatter
.split('\n')
.split(/\r?\n/)
.filter((line) => /^\s+-\s+/.test(line))
.map((line) => line.replace(/^\s+-\s+/, '').trim());

View File

@@ -23,6 +23,7 @@ const ROOT = path.join(__dirname, '..');
// the real ~/.config/opencode/ even if the guard is missing.
const FAKE_HOME = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-130-test-'));
process.env.HOME = FAKE_HOME;
process.env.USERPROFILE = FAKE_HOME;
// The opencode config dir that configureOpencodePermissions would use for a
// global install when configDir=null: <HOME>/.config/opencode/

View File

@@ -81,7 +81,7 @@ describe('buildStateFrontmatter cache invalidation (#1967)', () => {
// Read back and parse frontmatter to verify it reflects 2 phases, not 1
const result = fs.readFileSync(statePath, 'utf-8');
const fmMatch = result.match(/^---\n([\s\S]*?)\n---/);
const fmMatch = result.match(/^---\r?\n([\s\S]*?)\r?\n---/);
assert.ok(fmMatch, 'STATE.md should have frontmatter after writeStateMd');
const fm = fmMatch[1];

View File

@@ -50,39 +50,39 @@ describe('bug #2410: execute-phase emits checkpoint heartbeats', () => {
test('workflow emits a wave-start heartbeat (A: wave-boundary checkpoint)', () => {
assert.ok(
/\[checkpoint\][^\n]*wave \{N\}\/\{M\} starting/.test(workflow),
/\[checkpoint\][^\r\n]*wave \{N\}\/\{M\} starting/.test(workflow),
'workflow should emit a wave-start [checkpoint] marker before spawning agents'
);
});
test('workflow emits a wave-complete heartbeat (A: wave-boundary checkpoint)', () => {
assert.ok(
/\[checkpoint\][^\n]*wave \{N\}\/\{M\} complete/.test(workflow),
/\[checkpoint\][^\r\n]*wave \{N\}\/\{M\} complete/.test(workflow),
'workflow should emit a wave-complete [checkpoint] marker after spot-checks'
);
});
test('workflow emits a plan-start heartbeat (B: plan-boundary checkpoint)', () => {
assert.ok(
/\[checkpoint\][^\n]*plan \{plan_id\} starting/.test(workflow),
/\[checkpoint\][^\r\n]*plan \{plan_id\} starting/.test(workflow),
'workflow should emit a plan-start [checkpoint] marker before each Task() dispatch'
);
});
test('workflow emits a plan-complete heartbeat (B: plan-boundary checkpoint)', () => {
assert.ok(
/\[checkpoint\][^\n]*plan \{plan_id\} complete/.test(workflow),
/\[checkpoint\][^\r\n]*plan \{plan_id\} complete/.test(workflow),
'workflow should emit a plan-complete [checkpoint] marker after executor returns'
);
});
test('workflow handles plan failure and checkpoint-gate heartbeats too', () => {
assert.ok(
/\[checkpoint\][^\n]*plan \{plan_id\} failed/.test(workflow),
/\[checkpoint\][^\r\n]*plan \{plan_id\} failed/.test(workflow),
'workflow should emit a plan-failed [checkpoint] marker on executor error'
);
assert.ok(
/\[checkpoint\][^\n]*plan \{plan_id\} checkpoint/.test(workflow),
/\[checkpoint\][^\r\n]*plan \{plan_id\} checkpoint/.test(workflow),
'workflow should emit a heartbeat when a plan returns a human-gate checkpoint'
);
});
@@ -129,7 +129,7 @@ describe('bug #2410: execute-phase emits checkpoint heartbeats', () => {
assert.ok(spawnIdx !== -1 && waitIdx !== -1, 'spawn and wait steps must exist');
const step3 = workflow.slice(spawnIdx, waitIdx);
assert.ok(
/\[checkpoint\][^\n]*plan \{plan_id\} starting/.test(step3),
/\[checkpoint\][^\r\n]*plan \{plan_id\} starting/.test(step3),
'plan-start heartbeat should be emitted inside step 3 (spawn executor agents)'
);
});
@@ -140,7 +140,7 @@ describe('bug #2410: execute-phase emits checkpoint heartbeats', () => {
assert.ok(waitIdx !== -1 && hookIdx !== -1, 'wait + hook steps must exist');
const step4 = workflow.slice(waitIdx, hookIdx);
assert.ok(
/\[checkpoint\][^\n]*plan \{plan_id\} complete/.test(step4),
/\[checkpoint\][^\r\n]*plan \{plan_id\} complete/.test(step4),
'plan-complete heartbeat should be emitted in step 4 (wait for agents)'
);
@@ -149,7 +149,7 @@ describe('bug #2410: execute-phase emits checkpoint heartbeats', () => {
assert.ok(reportIdx !== -1 && failureIdx !== -1, 'report + failure steps must exist');
const step6 = workflow.slice(reportIdx, failureIdx);
assert.ok(
/\[checkpoint\][^\n]*wave \{N\}\/\{M\} complete/.test(step6),
/\[checkpoint\][^\r\n]*wave \{N\}\/\{M\} complete/.test(step6),
'wave-complete heartbeat should be emitted in step 6 (report completion)'
);
});

View File

@@ -95,8 +95,8 @@ describe('plan-phase decision-coverage gate (#2492)', () => {
const snippet = md.slice(gateIdx, gateIdx + 800);
// Accept either an inline `|| exit 1` or a `|| { ...; exit 1; }` group.
const hasJqGuard =
/jq[^\n]*\.data\.passed\s*==\s*true/.test(snippet) ||
/jq[^\n]*\(\.passed\s*\/\/\s*\.data\.passed\)\s*==\s*true/.test(snippet);
/jq[^\r\n]*\.data\.passed\s*==\s*true/.test(snippet) ||
/jq[^\r\n]*\(\.passed\s*\/\/\s*\.data\.passed\)\s*==\s*true/.test(snippet);
const hasExitOne = /\|\|\s*(?:exit\s+1|\{[\s\S]{0,200}?exit\s+1)/.test(snippet);
assert.ok(
hasJqGuard && hasExitOne,

View File

@@ -69,7 +69,7 @@ describe('bug #2516: executor_model "inherit" must not be passed literally to Ta
content.includes('omit `model=`') ||
content.includes('omit model=')
);
const lines = content.split('\n');
const lines = content.split(/\r?\n/);
const hasLiteralInheritInTask = lines.some(line => {
if (!/model\s*=\s*["']inherit["']/.test(line)) return false;
// Exclude instructional/explanatory lines that document what NOT to do

View File

@@ -119,7 +119,7 @@ describe('slash-command namespace invariant (#3443)', () => {
const violations = [];
for (const file of allUserFacingFiles) {
const src = fs.readFileSync(file, 'utf-8');
const lines = src.split('\n');
const lines = src.split(/\r?\n/);
for (let i = 0; i < lines.length; i++) {
if (retiredPattern.test(lines[i])) {
violations.push(`${path.relative(ROOT, file)}:${i + 1}: ${lines[i].trim().slice(0, 80)}`);

View File

@@ -123,9 +123,9 @@ describe('skill frontmatter name parity (#2643 / #2808)', () => {
const input = '---\nname: old\ndescription: test\n---\n\nBody.';
const result = convertClaudeCommandToClaudeSkill(input, 'gsd-execute-phase');
// Parse the frontmatter block structurally: extract the name: field value.
const frontmatterMatch = result.match(/^---\n([\s\S]*?)\n---/);
const frontmatterMatch = result.match(/^---\r?\n([\s\S]*?)\r?\n---/);
assert.ok(frontmatterMatch, 'output must have a frontmatter block delimited by ---');
const frontmatterLines = frontmatterMatch[1].split('\n');
const frontmatterLines = frontmatterMatch[1].split(/\r?\n/);
const nameEntry = frontmatterLines.find((l) => l.startsWith('name:'));
assert.ok(nameEntry, 'frontmatter must contain a name: field');
const nameValue = nameEntry.replace(/^name:\s*/, '').trim();
@@ -185,7 +185,7 @@ describe('skill frontmatter name parity (#2643 / #2808)', () => {
const skillDirName = 'gsd-' + base;
const src = fs.readFileSync(path.join(COMMANDS_DIR, cmd), 'utf-8');
const out = convertClaudeCommandToClaudeSkill(src, skillDirName);
const m = out.match(/^---\nname:\s*(.+)$/m);
const m = out.match(/^---\r?\nname:\s*(.+)$/m);
if (m) emitted.add(m[1].trim());
}

View File

@@ -44,17 +44,22 @@ describe('bug-2794: readGsdRuntimeProfileResolver resolves opencode tier overrid
let projectDir;
let homeDir;
let origHome;
let origUP;
beforeEach(() => {
projectDir = makeTmp('proj');
homeDir = makeTmp('home');
origHome = process.env.HOME;
origUP = process.env.USERPROFILE;
process.env.HOME = homeDir;
process.env.USERPROFILE = homeDir;
});
afterEach(() => {
if (origHome === undefined) delete process.env.HOME;
else process.env.HOME = origHome;
if (origUP === undefined) delete process.env.USERPROFILE;
else process.env.USERPROFILE = origUP;
cleanup(projectDir);
cleanup(homeDir);
});
@@ -105,20 +110,25 @@ describe('bug-2794: OpenCode agent install embeds model_profile_overrides model'
let projectDir;
let homeDir;
let origHome;
let origUP;
let origCwd;
beforeEach(() => {
projectDir = makeTmp('proj');
homeDir = makeTmp('home');
origHome = process.env.HOME;
origUP = process.env.USERPROFILE;
origCwd = process.cwd();
process.env.HOME = homeDir;
process.env.USERPROFILE = homeDir;
process.chdir(projectDir);
});
afterEach(() => {
if (origHome === undefined) delete process.env.HOME;
else process.env.HOME = origHome;
if (origUP === undefined) delete process.env.USERPROFILE;
else process.env.USERPROFILE = origUP;
process.chdir(origCwd);
cleanup(projectDir);
cleanup(homeDir);

View File

@@ -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,
@@ -81,9 +83,9 @@ describe('bug-2808: SKILL.md name: uses hyphen form', () => {
const skillContent = convertClaudeCommandToClaudeSkill(src, skillDirName);
// Parse frontmatter structurally: extract name: line from the --- block.
const fmMatch = skillContent.match(/^---\n([\s\S]*?)\n---/);
const fmMatch = skillContent.match(/^---\r?\n([\s\S]*?)\r?\n---/);
assert.ok(fmMatch, `${cmd}: generated skill content must have a frontmatter block`);
const fmLines = fmMatch[1].split('\n');
const fmLines = fmMatch[1].split(/\r?\n/);
const nameEntry = fmLines.find((l) => l.startsWith('name:'));
assert.ok(nameEntry, `${cmd}: generated SKILL.md is missing required name: field`);
@@ -108,7 +110,7 @@ describe('bug-2808: SKILL.md name: uses hyphen form', () => {
// gsd:sdk and gsd:tools are intentionally excluded: they are not slash commands
// (no commands/gsd/sdk.md or tools.md exist), so the transformer correctly leaves
// them alone. They are benign and should not trigger this assertion.
const bodyContent = skillContent.replace(/^---\n[\s\S]*?\n---\n?/, '');
const bodyContent = skillContent.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/, '');
const colonRefs = (bodyContent.match(/\bgsd:[a-z][a-z0-9-]*\b/g) || [])
.filter(r => !/gsd:(sdk|tools)/.test(r));
assert.strictEqual(
@@ -144,7 +146,7 @@ describe('bug-2808: SKILL.md name: uses hyphen form', () => {
// Scan each line for Skill() calls using the colon form.
// Parsing line-by-line is more precise than a multi-line regex
// and avoids false positives from incidental matches in prose.
for (const line of stripped.split('\n')) {
for (const line of stripped.split(/\r?\n/)) {
// Tolerate whitespace around the parenthesis, the `skill` keyword,
// and the `=` so variants like `Skill( skill = "gsd:foo" )` are still
// flagged. Without the `\s*` allowances, drift slips through this guard.
@@ -213,9 +215,9 @@ describe('bug-2808: SKILL.md name: uses hyphen form', () => {
const skillContent = fs.readFileSync(skillMdPath, 'utf-8');
// Scope the name: lookup to the YAML frontmatter block so a stray
// `name:` line in the body cannot satisfy the assertion.
const fmMatch = skillContent.match(/^---\n([\s\S]*?)\n---/);
const fmMatch = skillContent.match(/^---\r?\n([\s\S]*?)\r?\n---/);
assert.ok(fmMatch, `${relPath}: generated SKILL.md must include frontmatter`);
const nameLine = fmMatch[1].split('\n').find((l) => /^name:\s*/.test(l));
const nameLine = fmMatch[1].split(/\r?\n/).find((l) => /^name:\s*/.test(l));
assert.ok(nameLine, `${relPath}: generated SKILL.md is missing name: frontmatter`);
const name = nameLine.replace(/^name:\s*/, '').trim();
assert.ok(name.startsWith('gsd-'), `${relPath}: autocomplete name must start with gsd-, got ${name}`);

View File

@@ -166,7 +166,7 @@ describe('bug #2836: workflows/help.md one-liner reconciliation', () => {
// Locate the documented "Result: Creates ..." quick-task one-liner and
// assert it references the per-task SUMMARY filename pattern, not bare
// SUMMARY.md. We parse by line to avoid false positives elsewhere.
const resultLines = content.split('\n').filter(l =>
const resultLines = content.split(/\r?\n/).filter(l =>
l.includes('Result: Creates') && l.includes('.planning/quick/')
);
assert.ok(resultLines.length > 0, 'expected a quick-task Result line in help.md');

View File

@@ -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 {

View File

@@ -93,18 +93,18 @@ describe('bug #3126: runtime-homes getGlobalConfigDir — defaults', () => {
describe('bug #3126: runtime-homes env-var overrides', () => {
test('claude respects CLAUDE_CONFIG_DIR (was missing in old code)', () => {
withEnv('CLAUDE_CONFIG_DIR', '/custom/claude', () => {
assert.strictEqual(getGlobalConfigDir('claude'), '/custom/claude');
assert.strictEqual(String(getGlobalConfigDir('claude')).replace(/\\/g, '/'), '/custom/claude');
});
});
test('cursor respects CURSOR_CONFIG_DIR', () => {
withEnv('CURSOR_CONFIG_DIR', '/custom/cursor', () => {
assert.strictEqual(getGlobalConfigDir('cursor'), '/custom/cursor');
assert.strictEqual(String(getGlobalConfigDir('cursor')).replace(/\\/g, '/'), '/custom/cursor');
});
});
test('opencode respects OPENCODE_CONFIG_DIR', () => {
withEnv('OPENCODE_CONFIG_DIR', '/custom/opencode', () => {
withEnv('XDG_CONFIG_HOME', undefined, () => {
assert.strictEqual(getGlobalConfigDir('opencode'), '/custom/opencode');
assert.strictEqual(String(getGlobalConfigDir('opencode')).replace(/\\/g, '/'), '/custom/opencode');
});
});
});
@@ -208,7 +208,7 @@ describe('bug #3126: runtime-homes getGlobalSkillDir', () => {
describe('getGlobalConfigDir — explicitDir override and opencode/kilo file-path precedence', () => {
// ── explicitDir override ──────────────────────────────────────────────────
test('explicitDir absolute path is returned as-is (claude)', () => {
assert.strictEqual(getGlobalConfigDir('claude', '/tmp/x'), '/tmp/x');
assert.strictEqual(String(getGlobalConfigDir('claude', '/tmp/x')).replace(/\\/g, '/'), '/tmp/x');
});
test('explicitDir with tilde is expanded (opencode)', () => {
@@ -220,7 +220,7 @@ describe('getGlobalConfigDir — explicitDir override and opencode/kilo file-pat
test('explicitDir wins even when OPENCODE_CONFIG_DIR is also set', () => {
withEnv('OPENCODE_CONFIG_DIR', '/should/not/win', () => {
assert.strictEqual(getGlobalConfigDir('opencode', '/explicit/wins'), '/explicit/wins');
assert.strictEqual(String(getGlobalConfigDir('opencode', '/explicit/wins')).replace(/\\/g, '/'), '/explicit/wins');
});
});
@@ -229,7 +229,7 @@ describe('getGlobalConfigDir — explicitDir override and opencode/kilo file-pat
withEnv('OPENCODE_CONFIG_DIR', undefined, () => {
withEnv('XDG_CONFIG_HOME', undefined, () => {
withEnv('OPENCODE_CONFIG', '/home/u/cfg/opencode.json', () => {
assert.strictEqual(getGlobalConfigDir('opencode'), '/home/u/cfg');
assert.strictEqual(String(getGlobalConfigDir('opencode')).replace(/\\/g, '/'), '/home/u/cfg');
});
});
});
@@ -238,7 +238,7 @@ describe('getGlobalConfigDir — explicitDir override and opencode/kilo file-pat
test('opencode: OPENCODE_CONFIG_DIR takes precedence over OPENCODE_CONFIG', () => {
withEnv('OPENCODE_CONFIG_DIR', '/dir/wins', () => {
withEnv('OPENCODE_CONFIG', '/file/loses.json', () => {
assert.strictEqual(getGlobalConfigDir('opencode'), '/dir/wins');
assert.strictEqual(String(getGlobalConfigDir('opencode')).replace(/\\/g, '/'), '/dir/wins');
});
});
});
@@ -247,7 +247,7 @@ describe('getGlobalConfigDir — explicitDir override and opencode/kilo file-pat
withEnv('OPENCODE_CONFIG_DIR', undefined, () => {
withEnv('OPENCODE_CONFIG', '/cfg/opencode.json', () => {
withEnv('XDG_CONFIG_HOME', '/xdg/should/lose', () => {
assert.strictEqual(getGlobalConfigDir('opencode'), '/cfg');
assert.strictEqual(String(getGlobalConfigDir('opencode')).replace(/\\/g, '/'), '/cfg');
});
});
});
@@ -271,7 +271,7 @@ describe('getGlobalConfigDir — explicitDir override and opencode/kilo file-pat
withEnv('KILO_CONFIG_DIR', undefined, () => {
withEnv('XDG_CONFIG_HOME', undefined, () => {
withEnv('KILO_CONFIG', '/home/u/cfg/kilo.json', () => {
assert.strictEqual(getGlobalConfigDir('kilo'), '/home/u/cfg');
assert.strictEqual(String(getGlobalConfigDir('kilo')).replace(/\\/g, '/'), '/home/u/cfg');
});
});
});
@@ -280,7 +280,7 @@ describe('getGlobalConfigDir — explicitDir override and opencode/kilo file-pat
test('kilo: KILO_CONFIG_DIR takes precedence over KILO_CONFIG', () => {
withEnv('KILO_CONFIG_DIR', '/dir/wins', () => {
withEnv('KILO_CONFIG', '/file/loses.json', () => {
assert.strictEqual(getGlobalConfigDir('kilo'), '/dir/wins');
assert.strictEqual(String(getGlobalConfigDir('kilo')).replace(/\\/g, '/'), '/dir/wins');
});
});
});
@@ -289,7 +289,7 @@ describe('getGlobalConfigDir — explicitDir override and opencode/kilo file-pat
withEnv('KILO_CONFIG_DIR', undefined, () => {
withEnv('KILO_CONFIG', '/cfg/kilo.json', () => {
withEnv('XDG_CONFIG_HOME', '/xdg/should/lose', () => {
assert.strictEqual(getGlobalConfigDir('kilo'), '/cfg');
assert.strictEqual(String(getGlobalConfigDir('kilo')).replace(/\\/g, '/'), '/cfg');
});
});
});

View File

@@ -32,7 +32,7 @@ const src = fs.readFileSync(UPDATE_WF, 'utf8');
test('bug #3130: update.md contains no bare npx invocations (cache-stale form)', () => {
// Any occurrence of `npx -y @opengsd/gsd-core@<something>` without `--package=`
// is the stale form that triggers the two failure modes.
const stale = (src.match(/npx -y @opengsd\/gsd-core@\S+[^\n]*/g) || []);
const stale = (src.match(/npx -y @opengsd\/gsd-core@\S+[^\r\n]*/g) || []);
assert.deepEqual(
stale,
[],

View File

@@ -33,9 +33,9 @@ function readMdFiles(dir, prefix) {
}
function extractFrontmatterTools(content) {
const fm = content.match(/^---\n([\s\S]*?)\n---/);
const fm = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
if (!fm) return [];
const toolsMatch = fm[1].match(/^allowed-tools:\s*\n((?:[ \t]+-[^\n]*\n?)*)/m) ||
const toolsMatch = fm[1].match(/^allowed-tools:\s*\r?\n((?:[ \t]+-[^\n]*\n?)*)/m) ||
fm[1].match(/^tools:\s*(.+)$/m);
if (!toolsMatch) return [];
const toolsBlock = toolsMatch[1];
@@ -79,7 +79,7 @@ describe('#3168 — workflows: prose must use Agent( not Task( for dispatcher ca
for (const wf of workflows) {
test(`${wf.name}: must not contain dispatcher Task( calls`, () => {
const lines = wf.content.split('\n');
const lines = wf.content.split(/\r?\n/);
const violations = [];
for (let i = 0; i < lines.length; i++) {
const line = lines[i];

View File

@@ -137,7 +137,7 @@ describe('bug #3290 — Group B: layout-detection verdict has no downstream cons
const src = fs.readFileSync(file, 'utf-8');
if (src.includes('Layout detection returned')) {
// Collect matching lines for the error message
const lines = src.split('\n')
const lines = src.split(/\r?\n/)
.map((l, i) => ({ line: l, n: i + 1 }))
.filter(({ line }) => line.includes('Layout detection returned'));
matches.push({ rel, lines });

View File

@@ -187,3 +187,92 @@ describe('bug #3439: shell projection module owns managed-hook policy and legacy
);
});
});
describe('#1693 regression: Windows legacy-node rewrite must not double-quote a "$CLAUDE_PROJECT_DIR"-anchored local hook path', () => {
const winRunner = '"C:/Program Files/nodejs/node.exe"';
// WHY: a local-install hook path already carries a `"$CLAUDE_PROJECT_DIR"`
// anchored prefix (only the variable quoted, rest bare). On Windows the legacy
// rewrite previously JSON.stringify'd the whole token, yielding
// `"\"$CLAUDE_PROJECT_DIR\"/..."`. node then received an argument starting with
// a literal `"`, treated it as relative, and died with MODULE_NOT_FOUND —
// breaking every node managed hook at once (self-locking deadlock).
test('projectLegacySettingsHookCommand emits the anchored path verbatim, not re-quoted', () => {
const anchored = '"$CLAUDE_PROJECT_DIR"/.claude/hooks/gsd-context-monitor.js';
const command = projectLegacySettingsHookCommand({
absoluteRunner: winRunner,
scriptPath: anchored,
scriptToken: anchored,
platform: 'win32',
runtime: 'claude',
});
assert.equal(
command,
'"C:/Program Files/nodejs/node.exe" "$CLAUDE_PROJECT_DIR"/.claude/hooks/gsd-context-monitor.js',
);
assert.ok(!command.includes('\\"'), 'must not contain escaped double-quotes');
});
// WHY: the fix must be surgical — a BARE absolute Windows path (no anchored
// prefix) can contain spaces ("Program Files") and still REQUIRES quoting.
test('projectLegacySettingsHookCommand still quotes a bare absolute Windows path', () => {
const abs = 'C:/Program Files App/.claude/hooks/gsd-context-monitor.js';
const command = projectLegacySettingsHookCommand({
absoluteRunner: winRunner,
scriptPath: abs,
scriptToken: JSON.stringify(abs),
platform: 'win32',
runtime: 'claude',
});
assert.equal(
command,
'"C:/Program Files/nodejs/node.exe" "C:/Program Files App/.claude/hooks/gsd-context-monitor.js"',
);
});
// WHY: the anchored short-circuit is scoped to win32. On POSIX the rewrite
// already preserved the caller's original `scriptToken` and never had the
// double-quote bug, so that behavior must be left byte-identical. scriptPath
// is anchored but scriptToken is a DISTINCT single-quoted value: if the
// win32 gate were removed, the anchored short-circuit would emit scriptPath
// and this assertion would fail — that is what pins the gate.
test('projectLegacySettingsHookCommand preserves the original scriptToken for anchored paths on POSIX', () => {
const command = projectLegacySettingsHookCommand({
absoluteRunner: '"/usr/local/bin/node"',
scriptPath: '"$CLAUDE_PROJECT_DIR"/.claude/hooks/gsd-statusline.js',
scriptToken: "'/x/hooks/gsd-statusline.js'",
platform: 'linux',
runtime: 'claude',
});
assert.equal(command, `"/usr/local/bin/node" '/x/hooks/gsd-statusline.js'`);
});
// WHY: end-to-end through the installer rewrite — the actual #2979 path that
// ran during the user's 1.5.0 -> 1.6.0 local update. Managed node hooks get
// the absolute runner + clean anchored path; a non-node-prefixed managed .sh
// hook (already correct) is left untouched.
test('rewriteLegacyManagedNodeHookCommands produces clean anchored node commands on Windows', () => {
const settings = {
hooks: {
PostToolUse: [
{
hooks: [
{ command: 'node "$CLAUDE_PROJECT_DIR"/.claude/hooks/gsd-context-monitor.js' },
],
},
],
},
};
const changed = rewriteLegacyManagedNodeHookCommands(settings, winRunner, {
platform: 'win32',
runtime: 'claude',
});
assert.equal(changed, true);
const rewritten = settings.hooks.PostToolUse[0].hooks[0].command;
assert.equal(
rewritten,
'"C:/Program Files/nodejs/node.exe" "$CLAUDE_PROJECT_DIR"/.claude/hooks/gsd-context-monitor.js',
);
assert.ok(!rewritten.includes('\\"'), 'rewritten command must not contain escaped double-quotes');
});
});

View File

@@ -168,7 +168,7 @@ test('bug-3491: new-project.md gates `git init` on in_nested_subdir, not just ha
// either gate the init on `in_nested_subdir`/worktree-root semantics or
// drop the unconditional `git init` block entirely.
const unconditionalInitPattern =
/\*\*If `has_git` is false:\*\* Initialize git:\s*\n+```bash\s*\ngit init\s*\n```/;
/\*\*If `has_git` is false:\*\* Initialize git:\s*\r?\n+```bash\s*\r?\ngit init\s*\r?\n```/;
assert.ok(
!unconditionalInitPattern.test(content),
'new-project.md must not run `git init` unconditionally on has_git=false (#3491). ' +

View File

@@ -44,7 +44,7 @@ function listAgentFiles() {
function scanForRetired(filePath) {
const text = fs.readFileSync(filePath, 'utf-8');
const lines = text.split('\n');
const lines = text.split(/\r?\n/);
const hits = [];
for (let i = 0; i < lines.length; i++) {
for (const cmd of RETIRED_COMMANDS) {

View File

@@ -150,7 +150,7 @@ describe('bug #3678 — executor must respect commit_docs:false', () => {
);
const stagedAll = git(['diff', '--cached', '--name-only'], tmpDir);
const stagedPlanning = stagedAll
.split('\n')
.split(/\r?\n/)
.map(s => s.trim())
.filter(s => s.startsWith('.planning/'));
assert.deepStrictEqual(
@@ -178,7 +178,7 @@ describe('bug #3678 — executor must respect commit_docs:false', () => {
test('checklist carve-out preserved for intentional skip', () => {
const body = fs.readFileSync(EXECUTOR_AGENT, 'utf-8');
const checklistLine = body
.split('\n')
.split(/\r?\n/)
.find(line => /Final metadata commit made/.test(line));
assert.ok(
checklistLine,
@@ -205,7 +205,7 @@ describe('bug #3678 — executor must respect commit_docs:false', () => {
if (entry.isDirectory()) { walk(full); continue; }
if (!entry.isFile() || !entry.name.endsWith('.md')) continue;
const body = fs.readFileSync(full, 'utf-8');
const lines = body.split('\n');
const lines = body.split(/\r?\n/);
const danger = lines.filter((line) => {
if (!/git\s+add\s+(-f|--force)\b/.test(line)) return false;
// Allow prohibition / warning sentences and code-fence prose that

View File

@@ -19,7 +19,7 @@ function readKnownTargets() {
}
function stripFrontmatter(src) {
return src.replace(/^---\r?\n[\s\S]*?\n---\r?\n/, '');
return src.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n/, '');
}
// Word-boundary lookbehind matching fix-slash-commands.cjs buildColonPattern / buildPattern

View File

@@ -55,7 +55,7 @@ function workerCodeOnly() {
const src = fs.readFileSync(WORKER_PATH, 'utf8');
return src
.replace(/\/\*[\s\S]*?\*\//g, '')
.replace(/(^|[^:])\/\/[^\n]*/g, '$1');
.replace(/(^|[^:])\/\/[^\r\n]*/g, '$1');
}
describe('bug #378 / #498: update worker queries the scoped name via the seam', () => {

View File

@@ -88,13 +88,13 @@ describe('/gsd:update detects local Antigravity (.agent / .agents) installs (#50
test('execution_context classifier maps /.agents/ and /.agent/ paths to antigravity (update.md)', () => {
const hasAgentsClassifierRule =
/\/\.agents\/[^\n]*->[^\n]*antigravity/.test(UPDATE_MD);
/\/\.agents\/[^\r\n]*->[^\r\n]*antigravity/.test(UPDATE_MD);
assert.ok(
hasAgentsClassifierRule,
'update.md classifier must map a `/.agents/` path to the `antigravity` runtime',
);
const hasAgentClassifierRule =
/\/\.agent\/[^\n]*->[^\n]*antigravity/.test(UPDATE_MD);
/\/\.agent\/[^\r\n]*->[^\r\n]*antigravity/.test(UPDATE_MD);
assert.ok(
hasAgentClassifierRule,
'update.md classifier must still map a `/.agent/` path to the `antigravity` runtime (backward-compat)',
@@ -108,7 +108,7 @@ describe('/gsd:update detects local Antigravity (.agent / .agents) installs (#50
// include both .agents (canonical, #791) and .agent (legacy, #503) or
// stale indicators could linger.
const runtimeDirLoops = UPDATE_MD
.split('\n')
.split(/\r?\n/)
.filter((l) => /for dir in .*\.claude.*\.codex/.test(l));
assert.ok(
runtimeDirLoops.length >= 1,

View File

@@ -73,7 +73,7 @@ describe('bug #619 — codebase-drift-gate resolves gsd-tools via the runtime sh
test('exactly one canonical launcher preamble, in the drift-check block, before any launcher call (#619)', () => {
const content = readGate();
const snippet = fs.readFileSync(SNIPPET_FILE, 'utf8').replace(/\n$/, '');
const snippet = fs.readFileSync(SNIPPET_FILE, 'utf8').replace(/\r?\n$/, '');
// Count canonical preamble occurrences across the whole file (parity: exactly one).
let count = 0;

View File

@@ -237,7 +237,7 @@ describe('bug #1329 — ci-prepare-test-scope fallback never emits a deleted fil
assert.strictEqual(prep.status, 0, `prepare step failed: ${prep.stderr}`);
const selected = fs.readFileSync(path.join(tmpDir, '.ci-selected-tests.txt'), 'utf8');
for (const line of selected.split('\n').filter(Boolean)) {
for (const line of selected.split(/\r?\n/).filter(Boolean)) {
const isSentinel = SUITE_SENTINELS.includes(line);
assert.ok(
isSentinel || fs.existsSync(path.join(tmpDir, line)),

View File

@@ -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');

View File

@@ -5,87 +5,225 @@
* dispatched Plan/Execute via Agent(run_in_background=true). On Claude Code a
* backgrounded agent has no Agent/Task tool, so it cannot spawn the nested
* subagents (worktree executors, plan-checker, verifier). The workflows must
* now resolve the runtime and run inline everywhere except Codex, which is the
* only supported runtime where a backgrounded agent can still nest subagents.
* now resolve dispatch capability from the registry (#1708) and run inline
* everywhere except runtimes where dispatch.background && dispatch.backgroundDispatch
* are both true (currently: codex, cursor).
*
* Phase B (#1708): the prose `RUNTIME === 'codex'` rule is graduated to a typed
* `gsd_run query dispatch-should-flatten` query backed by shouldFlattenDispatch()
* from host-integration.cjs and the documentation-sourced capability registry.
*/
const { describe, test } = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const { createTempProject, cleanup: cleanupDir, runGsdTools } = require('./helpers.cjs');
const WORKFLOWS_DIR = path.join(__dirname, '..', 'gsd-core', 'workflows');
// allow-test-rule: source-text-is-the-product (see #1708)
const MANAGER = fs.readFileSync(path.join(WORKFLOWS_DIR, 'manager.md'), 'utf8');
// allow-test-rule: source-text-is-the-product (see #1708)
const AUTONOMOUS = fs.readFileSync(path.join(WORKFLOWS_DIR, 'autonomous.md'), 'utf8');
describe('bug-853 — manager/autonomous gate background dispatch by runtime', () => {
test('manager.md resolves the runtime before dispatching plan/execute', () => {
// Two dispatch sites (plan + execute), each must resolve the runtime.
const matches = MANAGER.match(/config-get runtime/g) || [];
assert.ok(matches.length >= 2, 'manager.md must resolve runtime for both plan and execute dispatch');
test('manager.md resolves dispatch-should-flatten before dispatching plan/execute', () => {
// Two dispatch sites (plan + execute), each must use dispatch-should-flatten.
// allow-test-rule: source-text-is-the-product (see #1708)
const matches = MANAGER.match(/dispatch-should-flatten/g) || [];
assert.ok(matches.length >= 2, 'manager.md must use dispatch-should-flatten for both plan and execute dispatch');
});
test('manager.md documents why most runtimes cannot background-dispatch', () => {
// Accept both old singular form (backgrounded agent has no) and new plural form (backgrounded agents have no)
// allow-test-rule: source-text-is-the-product (see #1708)
assert.match(MANAGER, /backgrounded agents? ha(?:s|ve) no `Agent`\/`Task` tool/);
});
test('manager.md gates background dispatch on codex and runs plan/execute inline otherwise', () => {
// Codex takes the background path
assert.match(MANAGER, /If `RUNTIME` is `codex`[\s\S]{0,400}?run_in_background=true/);
// Inline is the default/else branch for plan — anchored on the explicit non-Codex label
test('manager.md gates background dispatch on FLATTEN=false and runs plan/execute inline otherwise', () => {
// Background path uses FLATTEN is false
// allow-test-rule: source-text-is-the-product (see #1708)
assert.match(MANAGER, /If `FLATTEN` is `false`[\s\S]{0,400}?run_in_background=true/);
// Inline is the default/else branch for plan — anchored on FLATTEN=true language (not runtime name)
assert.match(
MANAGER,
/Otherwise \(Claude Code or any other non-Codex runtime\)[\s\S]{0,400}?Skill\(skill="gsd-plan-phase"/,
/Otherwise[\s\S]{0,100}?`FLATTEN`[\s\S]{0,400}?Skill\(skill="gsd-plan-phase"/,
);
// Inline is the default/else branch for execute — anchored on the explicit non-Codex label
// Inline is the default/else branch for execute — anchored on FLATTEN=true language (not runtime name)
assert.match(
MANAGER,
/Otherwise \(Claude Code or any other non-Codex runtime\)[\s\S]{0,400}?Skill\(skill="gsd-execute-phase"/,
/Otherwise[\s\S]{0,100}?`FLATTEN`[\s\S]{0,400}?Skill\(skill="gsd-execute-phase"/,
);
});
test('manager.md compound actions only background plan/execute on Codex', () => {
test('manager.md compound action preamble uses FLATTEN language (not hardcoded runtime names)', () => {
// allow-test-rule: source-text-is-the-product (see #1708)
const compoundActionSection = MANAGER.match(
/### Compound Action \(background \+ inline\)[\s\S]*?Inline verification:/,
);
assert.ok(compoundActionSection, 'manager.md must document compound action runtime dispatch');
// Must gate on FLATTEN being false (not runtime name)
assert.match(
compoundActionSection[0],
/On Codex:[\s\S]{0,260}?Spawn all background agents first[\s\S]{0,220}?plan\/execute/,
/If `FLATTEN` is `false`[\s\S]{0,400}?Spawn all background agents first[\s\S]{0,300}?plan\/execute/,
);
// Otherwise / inline branch must reference FLATTEN being true
assert.match(
compoundActionSection[0],
/On Claude Code or any other non-Codex runtime:[\s\S]{0,260}?inline/,
/Otherwise[\s\S]{0,260}?`FLATTEN`[\s\S]{0,260}?`true`[\s\S]{0,260}?inline/,
);
// Must NOT still hardcode "On Codex:" in this section
assert.doesNotMatch(
compoundActionSection[0],
/On other runtimes:[\s\S]{0,260}?Spawn all background agents first/,
/\*\*On Codex:\*\*/,
);
// Must NOT still hardcode "On Claude Code or any other non-Codex runtime:"
assert.doesNotMatch(
compoundActionSection[0],
/On Claude Code or any other non-Codex runtime:/,
);
});
test('autonomous.md gates interactive background dispatch by runtime', () => {
const autoRuntimeMatches = AUTONOMOUS.match(/config-get runtime/g) || [];
assert.ok(autoRuntimeMatches.length >= 2, 'autonomous.md must resolve runtime in both 3b (plan) and 3c (execute) interactive branches');
test('autonomous.md gates interactive background dispatch using dispatch-should-flatten', () => {
// Two dispatch sites (3b plan + 3c execute), each must use dispatch-should-flatten.
// allow-test-rule: source-text-is-the-product (see #1708)
const autoFlattenMatches = AUTONOMOUS.match(/dispatch-should-flatten/g) || [];
assert.ok(autoFlattenMatches.length >= 2, 'autonomous.md must use dispatch-should-flatten in both 3b (plan) and 3c (execute) interactive branches');
// Accept both old singular form (backgrounded agent has no) and new plural form (backgrounded agents have no)
assert.match(AUTONOMOUS, /backgrounded agents? ha(?:s|ve) no `Agent`\/`Task` tool/);
});
test('autonomous.md gates interactive background dispatch on codex; runs plan/execute inline otherwise', () => {
// Codex block: run_in_background=true appears within the codex branch and gsd-plan-phase is nearby
assert.match(AUTONOMOUS, /If `RUNTIME` is `codex`[\s\S]{0,1200}?run_in_background=true[\s\S]{0,600}?gsd-plan-phase/);
// Codex block: run_in_background=true appears within the codex branch and gsd-execute-phase is nearby
assert.match(AUTONOMOUS, /If `RUNTIME` is `codex`[\s\S]{0,3000}?run_in_background=true[\s\S]{0,200}?gsd-execute-phase/);
// Inline is the otherwise/else branch for plan — anchored on the explicit non-Codex label
test('autonomous.md gates interactive background dispatch on FLATTEN=false; runs plan/execute inline otherwise', () => {
// Background block: run_in_background=true appears within the FLATTEN=false branch and gsd-plan-phase is nearby
// allow-test-rule: source-text-is-the-product (see #1708)
assert.match(AUTONOMOUS, /If `FLATTEN` is `false`[\s\S]{0,1200}?run_in_background=true[\s\S]{0,600}?gsd-plan-phase/);
// Background block: run_in_background=true appears within the FLATTEN=false branch and gsd-execute-phase is nearby
assert.match(AUTONOMOUS, /If `FLATTEN` is `false`[\s\S]{0,3000}?run_in_background=true[\s\S]{0,200}?gsd-execute-phase/);
// Inline is the otherwise/else branch for plan — anchored on FLATTEN=true language (not runtime name)
assert.match(
AUTONOMOUS,
/Otherwise \(Claude Code or any other non-Codex runtime\)[\s\S]{0,400}?Skill\(skill="gsd-plan-phase"/,
/Otherwise[\s\S]{0,100}?`FLATTEN`[\s\S]{0,400}?Skill\(skill="gsd-plan-phase"/,
);
// Inline is the otherwise/else branch for execute — anchored on the explicit non-Codex label
// Inline is the otherwise/else branch for execute — anchored on FLATTEN=true language (not runtime name)
assert.match(
AUTONOMOUS,
/Otherwise \(Claude Code or any other non-Codex runtime\)[\s\S]{0,400}?Skill\(skill="gsd-execute-phase"/,
/Otherwise[\s\S]{0,100}?`FLATTEN`[\s\S]{0,400}?Skill\(skill="gsd-execute-phase"/,
);
});
});
describe('dispatch-should-flatten query — behavioral', () => {
// #853 / #1708: The typed query replaces prose-level RUNTIME===codex checks.
// shouldFlattenDispatch returns false only when both dispatch.background AND
// dispatch.backgroundDispatch are true in the capability registry.
//
// Registry values (from host-integration-capability-matrix.md):
// codex: background=true, backgroundDispatch=true → shouldFlatten=false (may background)
// claude: background=true, backgroundDispatch=false → shouldFlatten=true (must inline)
// cursor: background=true, backgroundDispatch=true → shouldFlatten=false (may background)
// unknown: no entry → fail-closed → shouldFlatten=true (must inline)
test('runtime=codex → shouldFlatten=false (background dispatch safe)', () => {
const tmpDir = createTempProject();
try {
const result = runGsdTools(['query', 'dispatch-should-flatten', '--raw'], tmpDir, {
GSD_RUNTIME: 'codex',
});
assert.ok(result.success, `Expected success, got error: ${result.error}`);
assert.strictEqual(result.output, 'false', `codex should return false (may background), got: ${result.output}`);
} finally {
cleanupDir(tmpDir);
}
});
test('runtime=claude → shouldFlatten=true (must inline)', () => {
const tmpDir = createTempProject();
try {
const result = runGsdTools(['query', 'dispatch-should-flatten', '--raw'], tmpDir, {
GSD_RUNTIME: 'claude',
});
assert.ok(result.success, `Expected success, got error: ${result.error}`);
assert.strictEqual(result.output, 'true', `claude should return true (must inline), got: ${result.output}`);
} finally {
cleanupDir(tmpDir);
}
});
test('runtime=cursor → shouldFlatten=false (background dispatch safe)', () => {
const tmpDir = createTempProject();
try {
const result = runGsdTools(['query', 'dispatch-should-flatten', '--raw'], tmpDir, {
GSD_RUNTIME: 'cursor',
});
assert.ok(result.success, `Expected success, got error: ${result.error}`);
assert.strictEqual(result.output, 'false', `cursor should return false (may background), got: ${result.output}`);
} finally {
cleanupDir(tmpDir);
}
});
test('unknown runtime → shouldFlatten=true (fail-closed → must inline)', () => {
// An unknown runtime has no registry entry → dispatch is null → fail-closed to true.
const tmpDir = createTempProject();
try {
const result = runGsdTools(['query', 'dispatch-should-flatten', '--raw'], tmpDir, {
GSD_RUNTIME: 'unknown-runtime-xyz',
});
// The query must succeed (exit 0) even for unknown runtimes — fail-closed not crash-closed.
assert.ok(result.success, `Expected success (fail-closed), got error: ${result.error}`);
assert.strictEqual(result.output, 'true', `unknown runtime should return true (fail-closed), got: ${result.output}`);
} finally {
cleanupDir(tmpDir);
}
});
test('--json flag returns structured { runtime, shouldFlatten, dispatch }', () => {
const tmpDir = createTempProject();
try {
const result = runGsdTools(['query', 'dispatch-should-flatten', '--json'], tmpDir, {
GSD_RUNTIME: 'codex',
});
assert.ok(result.success, `Expected success, got error: ${result.error}`);
let parsed;
try {
parsed = JSON.parse(result.output);
} catch {
assert.fail(`Expected valid JSON output, got: ${result.output}`);
}
assert.strictEqual(parsed.runtime, 'codex');
assert.strictEqual(parsed.shouldFlatten, false);
assert.ok(parsed.dispatch !== null && typeof parsed.dispatch === 'object', 'dispatch should be an object');
assert.strictEqual(parsed.dispatch.backgroundDispatch, true);
} finally {
cleanupDir(tmpDir);
}
});
test('config.runtime takes precedence when GSD_RUNTIME not set', () => {
// GSD_RUNTIME > config.runtime > 'claude'
// Write config.json with runtime=codex; no GSD_RUNTIME override.
const tmpDir = createTempProject();
try {
fs.writeFileSync(
path.join(tmpDir, '.planning', 'config.json'),
JSON.stringify({ runtime: 'codex' }),
'utf-8',
);
// Override GSD_RUNTIME to '' (empty string) so any ambient value is cleared.
// resolveRuntimeNameFromCandidates treats empty string as absent (normalizes
// to '' which is falsy → skipped → falls through to config.runtime=codex).
// This is the only way to suppress an ambient GSD_RUNTIME since runGsdTools
// merges { ...process.env, ...TEST_ENV_BASE, ...env } — passing '' as the
// override overwrites the ambient value at the correct merge position.
const result = runGsdTools(['query', 'dispatch-should-flatten', '--raw'], tmpDir, {
GSD_RUNTIME: '',
});
// config.runtime=codex with GSD_RUNTIME cleared → codex backgrounds → shouldFlatten=false
assert.ok(result.success, `Expected success, got error: ${result.error}`);
assert.strictEqual(result.output, 'false', `config.runtime=codex (GSD_RUNTIME cleared) should return false (may background), got: ${result.output}`);
} finally {
cleanupDir(tmpDir);
}
});
});

View File

@@ -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,

View File

@@ -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,

View File

@@ -19,10 +19,13 @@ const { runGsdTools, createTempProject, cleanup } = require('./helpers.cjs');
* Build a fixture where the guard will fire:
* - STATE.md has `milestone: <version>` so the guard's version-match check is
* satisfied.
* - ROADMAP.md lists a `### Phase 999.1: Backlog Work` heading for that
* milestone, but there is NO on-disk phase directory for it.
* - ROADMAP.md lists a `### Phase 2: Real Work` heading for that milestone, but
* there is NO on-disk phase directory for it.
*
* This guarantees "unstarted phase" detection without touching any real phases.
* NOTE: the unstarted phase must be a REAL phase number — Phase 0 and Phase 999
* are backlog/pre-milestone sentinels that are intentionally excluded from this
* guard (#1580), so they would not fire it.
*/
function makeGuardFixture(tmpDir, version) {
// STATE.md with frontmatter milestone field matching the version
@@ -32,10 +35,10 @@ function makeGuardFixture(tmpDir, version) {
);
// ROADMAP.md — the heading must include the version so getMilestonePhaseFilter
// does not return missingExplicitVersion. Phase 999.1 has no on-disk dir.
// does not return missingExplicitVersion. Phase 2 has no on-disk dir.
fs.writeFileSync(
path.join(tmpDir, '.planning', 'ROADMAP.md'),
`# Roadmap ${version}\n\n### Phase 999.1: Backlog Work\n**Goal:** Not started\n`,
`# Roadmap ${version}\n\n### Phase 2: Real Work\n**Goal:** Not started\n`,
);
}
@@ -80,7 +83,7 @@ describe('bug-978: milestone complete --force overrides unstarted-phase guard',
const output = JSON.parse(result.output);
assert.strictEqual(output.version, 'v1.0');
// Milestone entry should have been created even though phase 999.1 has no dir
// Milestone entry should have been created even though phase 2 has no dir
assert.ok(
fs.existsSync(path.join(tmpDir, '.planning', 'MILESTONES.md')),
'MILESTONES.md should have been created',

View File

@@ -13,6 +13,10 @@ const { cleanup } = require('./helpers.cjs');
const { installerEnv } = require('./helpers/install-shared.cjs');
const ROOT = path.join(__dirname, '..');
// Cross-platform temp paths for test fixtures (avoids hardcoded /tmp)
const KIMI_CFG = path.join(os.tmpdir(), 'gsd-kimi-config-test').replace(/\\/g, '/');
const XDG_HOME = path.join(os.tmpdir(), 'gsd-xdg-home-test');
const INSTALL_SCRIPT = path.join(ROOT, 'bin', 'install.js');
const {
@@ -101,20 +105,21 @@ describe('Kimi runtime homes', () => {
});
test('KIMI_CONFIG_DIR can select the brand-specific ~/.kimi-code root', () => {
withEnv({ KIMI_CONFIG_DIR: '/tmp/custom-kimi-code', XDG_CONFIG_HOME: undefined }, () => {
assert.strictEqual(getGlobalConfigDir('kimi'), '/tmp/custom-kimi-code');
const customKimiDir = path.join(os.tmpdir(), 'custom-kimi-code');
withEnv({ KIMI_CONFIG_DIR: customKimiDir, XDG_CONFIG_HOME: undefined }, () => {
assert.strictEqual(String(getGlobalConfigDir('kimi')).replace(/\\/g, '/'), customKimiDir.replace(/\\/g, '/'));
assert.strictEqual(
getGlobalSkillsBase('kimi'),
path.join('/tmp/custom-kimi-code', 'skills'),
path.join(customKimiDir, 'skills'),
);
assert.strictEqual(getGlobalDir('kimi'), '/tmp/custom-kimi-code');
assert.strictEqual(String(getGlobalDir('kimi')).replace(/\\/g, '/'), customKimiDir.replace(/\\/g, '/'));
});
});
test('XDG_CONFIG_HOME does not change Kimi default root', () => {
const tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-kimi-home-xdg-'));
try {
withEnv({ KIMI_CONFIG_DIR: undefined, XDG_CONFIG_HOME: '/tmp/xdg-home', HOME: tmpHome, USERPROFILE: tmpHome }, () => {
withEnv({ KIMI_CONFIG_DIR: undefined, XDG_CONFIG_HOME: XDG_HOME, HOME: tmpHome, USERPROFILE: tmpHome }, () => {
assert.strictEqual(
getGlobalConfigDir('kimi'),
path.join(tmpHome, '.config', 'agents'),
@@ -166,9 +171,9 @@ describe('Kimi runtime homes', () => {
describe('Kimi runtime artifact layout', () => {
test('global layout stages Kimi skills and agents while local layout remains guarded', () => {
const globalLayout = resolveRuntimeArtifactLayout('kimi', '/tmp/kimi-config', 'global');
const globalLayout = resolveRuntimeArtifactLayout('kimi', KIMI_CFG, 'global');
assert.strictEqual(globalLayout.runtime, 'kimi');
assert.strictEqual(globalLayout.configDir, '/tmp/kimi-config');
assert.strictEqual(String(globalLayout.configDir).replace(/\\/g, '/'), KIMI_CFG);
assert.strictEqual(globalLayout.kinds.length, 2);
assert.strictEqual(globalLayout.kinds[0].kind, 'skills');
assert.strictEqual(globalLayout.kinds[0].destSubpath, 'skills');
@@ -179,7 +184,7 @@ describe('Kimi runtime artifact layout', () => {
assert.strictEqual(globalLayout.kinds[1].prefix, 'gsd');
assert.strictEqual(typeof globalLayout.kinds[1].stage, 'function');
const localLayout = resolveRuntimeArtifactLayout('kimi', '/tmp/kimi-config', 'local');
const localLayout = resolveRuntimeArtifactLayout('kimi', KIMI_CFG, 'local');
assert.strictEqual(localLayout.runtime, 'kimi');
assert.deepStrictEqual(localLayout.kinds, []);
});

View File

@@ -76,6 +76,7 @@ function runtimeCap(overrides) {
engines: { gsd: '>=1.6.0' },
runtime: {
configHome: { kind: 'dot-home', name: '.demo', env: [] },
localConfigDir: '.demo',
configFormat: 'settings-json',
artifactLayout: { global: [], local: [] },
commandStyle: 'slash-hyphen',
@@ -86,6 +87,16 @@ function runtimeCap(overrides) {
writesSharedSettings: false,
permissionWriter: null,
extendedHookEvents: [],
hostIntegration: {
embeddingMode: 'imperative',
commandSurface: 'slash-file',
dispatch: { namedDispatch: true, nested: true, maxDepth: -1, background: true, subagentToolkit: 'full', backgroundDispatch: false },
modelMode: 'passive',
hookBus: 'host',
stateIO: 'filesystem',
transport: 'mcp',
runtime: 'node',
},
},
...overrides,
};

View File

@@ -31,8 +31,8 @@ describe('capability-matrix drift guard (ADR-1244 Phase 6)', () => {
});
test('buildMatrix(registry) equals the committed file byte-for-byte (modulo line endings)', () => {
const generated = buildMatrix(registry).replace(/\r\n/g, '\n').replace(/\n+$/, '\n');
const committed = fs.readFileSync(MATRIX, 'utf8').replace(/\r\n/g, '\n').replace(/\n+$/, '\n');
const generated = buildMatrix(registry).replace(/\r\r?\n/g, '\n').replace(/\r?\n+$/, '\n');
const committed = fs.readFileSync(MATRIX, 'utf8').replace(/\r\r?\n/g, '\n').replace(/\r?\n+$/, '\n');
assert.equal(committed, generated);
});
@@ -53,7 +53,7 @@ describe('capability-matrix drift guard (ADR-1244 Phase 6)', () => {
// rendered row reflects it.
const shipPreGates = (registry.byLoopPoint['ship:pre'] && registry.byLoopPoint['ship:pre'].gates) || [];
assert.ok(shipPreGates.some((g) => g.capId === 'security'), 'precondition: security registers a ship:pre gate in the registry');
const securityRow = md.split('\n').find((l) => l.includes('`security`') && l.includes('|'));
const securityRow = md.split(/\r?\n/).find((l) => l.includes('`security`') && l.includes('|'));
assert.ok(securityRow && securityRow.includes('`ship:pre`'), 'security row must list its real ship:pre extension point');
});
});

View File

@@ -1764,6 +1764,7 @@ describe('C3: role:runtime body validation', () => {
tier: 'standard', requires: [],
runtime: {
configHome: { kind: 'dot-home', name: '.cursor', env: ['CURSOR_CONFIG_DIR'] },
localConfigDir: '.cursor',
configFormat: 'settings-json',
artifactLayout: { global: [], local: [] },
commandStyle: 'slash-hyphen',
@@ -1775,6 +1776,16 @@ describe('C3: role:runtime body validation', () => {
writesSharedSettings: false,
permissionWriter: null,
extendedHookEvents: [],
hostIntegration: {
embeddingMode: 'declarative',
commandSurface: 'slash-file',
dispatch: { namedDispatch: true, nested: true, maxDepth: 2, background: false, subagentToolkit: 'full', backgroundDispatch: false },
modelMode: 'passive',
hookBus: 'host',
stateIO: 'filesystem',
transport: 'mcp',
runtime: 'node',
},
},
};
@@ -3207,6 +3218,7 @@ function makeRuntimeCap(overrides) {
requires: [],
runtime: {
configHome: { kind: 'dot-home', name: '.test-rt', env: ['TEST_RT_DIR'] },
localConfigDir: '.test-rt',
configFormat: 'settings-json',
artifactLayout: { global: [], local: [] },
commandStyle: 'slash-hyphen',
@@ -3218,6 +3230,16 @@ function makeRuntimeCap(overrides) {
writesSharedSettings: true,
permissionWriter: null,
extendedHookEvents: [],
hostIntegration: {
embeddingMode: 'imperative',
commandSurface: 'slash-file',
dispatch: { namedDispatch: true, nested: true, maxDepth: -1, background: true, subagentToolkit: 'full', backgroundDispatch: false },
modelMode: 'passive',
hookBus: 'host',
stateIO: 'filesystem',
transport: 'mcp',
runtime: 'node',
},
...((overrides && overrides.runtime) ? overrides.runtime : {}),
},
...overrides,
@@ -4272,6 +4294,7 @@ describe('ADR-857 phase 5f: cross-field consistency gate rejection tests (DEFECT
requires: [],
runtime: {
configHome: { kind: 'dot-home', name: '.test-runtime', env: [] },
localConfigDir: '.test-runtime',
configFormat: 'settings-json',
artifactLayout: { global: [], local: [] },
commandStyle: 'slash-hyphen',
@@ -4283,6 +4306,16 @@ describe('ADR-857 phase 5f: cross-field consistency gate rejection tests (DEFECT
writesSharedSettings: true,
permissionWriter: null,
extendedHookEvents: [],
hostIntegration: {
embeddingMode: 'imperative',
commandSurface: 'slash-file',
dispatch: { namedDispatch: true, nested: true, maxDepth: -1, background: true, subagentToolkit: 'full', backgroundDispatch: false },
modelMode: 'passive',
hookBus: 'host',
stateIO: 'filesystem',
transport: 'mcp',
runtime: 'node',
},
},
};
if (overrides && typeof overrides === 'object') {
@@ -5135,6 +5168,16 @@ describe('activationKey validation', () => {
writesSharedSettings: false,
permissionWriter: null,
extendedHookEvents: [],
hostIntegration: {
embeddingMode: 'declarative',
commandSurface: 'slash-file',
dispatch: { namedDispatch: true, nested: true, maxDepth: 2, background: false, subagentToolkit: 'full', backgroundDispatch: false },
modelMode: 'passive',
hookBus: 'host',
stateIO: 'filesystem',
transport: 'mcp',
runtime: 'node',
},
},
};
const errors = validateCapability(cap, 'cursor');

View File

@@ -87,7 +87,7 @@ describe('detectConfigDir runtime behavior (#1860)', () => {
const hookSource = fs.readFileSync(CHECK_UPDATE_PATH, 'utf8');
// Extract detectConfigDir function body (from 'function detectConfigDir' to the closing brace)
const fnMatch = hookSource.match(/(function detectConfigDir\(baseDir\)\s*\{[\s\S]*?\n\})/);
const fnMatch = hookSource.match(/(function detectConfigDir\(baseDir\)\s*\{[\s\S]*?\r?\n\})/);
assert.ok(fnMatch, 'should be able to extract detectConfigDir function from hook source');
const fnSource = fnMatch[1];
@@ -124,7 +124,7 @@ describe('detectConfigDir runtime behavior (#1860)', () => {
fs.writeFileSync(path.join(openCodeVersionDir, 'VERSION'), '1.0.0\n');
const hookSource = fs.readFileSync(CHECK_UPDATE_PATH, 'utf8');
const fnMatch = hookSource.match(/(function detectConfigDir\(baseDir\)\s*\{[\s\S]*?\n\})/);
const fnMatch = hookSource.match(/(function detectConfigDir\(baseDir\)\s*\{[\s\S]*?\r?\n\})/);
assert.ok(fnMatch, 'should be able to extract detectConfigDir function from hook source');
const fnSource = fnMatch[1];

View File

@@ -431,7 +431,7 @@ describe('test.yml changes job contract (#837)', () => {
test('changes job checkout step sets fetch-depth: 0 (required for three-dot diff merge-base)', () => {
const workflowPath = path.join(WORKFLOWS_DIR, 'test.yml');
const text = fs.readFileSync(workflowPath, 'utf8');
const lines = text.split('\n');
const lines = text.split(/\r?\n/);
// Locate the `changes:` job (two-space-indented top-level job key).
const jobStart = lines.findIndex(l => /^ {2}changes:\s*$/.test(l));
@@ -547,6 +547,34 @@ describe('test-full shard matrix parity (#1212)', () => {
});
});
describe('golden-install-parity selection (#1691 drift guard)', () => {
// Regression: a src/*.cts-only edit recompiles bin/lib/*.cjs (changing installed
// hashes), but the scoped CI lane was not re-running golden-install-parity —
// causing golden fixtures to silently drift (#1691 milestone/roadmap cts change).
// Both the 'TS runtime sources' and 'installer and package layout' rules must now
// select tests/golden-install-parity.test.cjs.
test('src/*.cts change selects golden-install-parity (TS runtime sources rule)', () => {
const result = scopeFor(['src/milestone.cts']);
assert.strictEqual(result.code_changed, true,
`expected code_changed=true for src/ change, got: ${JSON.stringify(result)}`);
assert.ok(
result.targeted_tests.includes('tests/golden-install-parity.test.cjs'),
`expected golden-install-parity in targeted_tests for src/*.cts change, got: ${JSON.stringify(result.targeted_tests)}`,
);
});
test('bin/install.js change selects golden-install-parity (installer and package layout rule)', () => {
const result = scopeFor(['bin/install.js']);
assert.strictEqual(result.code_changed, true,
`expected code_changed=true for bin/ change, got: ${JSON.stringify(result)}`);
assert.ok(
result.targeted_tests.includes('tests/golden-install-parity.test.cjs'),
`expected golden-install-parity in targeted_tests for bin/install.js change, got: ${JSON.stringify(result.targeted_tests)}`,
);
});
});
describe('code_changed=false implies clean output invariant', () => {
// Fix 1: when code_changed is false, full_matrix, targeted_tests, windows_tests
// must ALL be empty/false — even if a docs path coincidentally

View File

@@ -230,7 +230,9 @@ describe('generate-claude-md skills section', () => {
);
const originalHome = process.env.HOME;
const originalUserProfile = process.env.USERPROFILE;
process.env.HOME = homeDir;
process.env.USERPROFILE = homeDir;
try {
const result = runGsdTools('generate-claude-md', tmpDir);
@@ -241,7 +243,10 @@ describe('generate-claude-md skills section', () => {
assert.ok(content.includes('Project Codex skill'));
assert.ok(!content.includes('import-only'));
} finally {
process.env.HOME = originalHome;
if (originalHome === undefined) delete process.env.HOME;
else process.env.HOME = originalHome;
if (originalUserProfile === undefined) delete process.env.USERPROFILE;
else process.env.USERPROFILE = originalUserProfile;
cleanup(homeDir);
}
});

View File

@@ -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,

View File

@@ -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 ────────────────────

View File

@@ -116,7 +116,7 @@ function assertNoDraftRootKeys(content) {
function assertUsesOnlyEol(content, eol) {
if (eol === '\r\n') {
assert.ok(content.includes('\r\n'), 'contains CRLF line endings');
assert.ok(!content.replace(/\r\n/g, '').includes('\n'), 'does not contain bare LF line endings');
assert.ok(!content.replace(/\r\r?\n/g, '').includes('\n'), 'does not contain bare LF line endings');
return;
}
assert.ok(!content.includes('\r\n'), 'does not contain CRLF line endings');
@@ -124,7 +124,7 @@ function assertUsesOnlyEol(content, eol) {
function assertNoCodexBareGsdToolsInvocation(content, label) {
const patterns = [
/(^|\n)[ \t]*gsd-tools\s/,
/(^|\r?\n)[ \t]*gsd-tools\s/,
/\$\(\s*gsd-tools\s/,
/`\s*gsd-tools\s/,
/(?:&&|\|\||[;|])\s*gsd-tools\s/,
@@ -1379,7 +1379,7 @@ describe('mergeCodexConfig', () => {
assert.ok(content.includes('[agents.custom-agent]'), 'preserves non-GSD agent section');
assert.strictEqual(gsdStructCount, 1, 'keeps exactly one [agents.gsd-executor] struct entry');
assert.strictEqual(markerCount, 1, 'adds exactly one marker block');
assert.ok(!/\n{3,}# GSD Agent Configuration/.test(content), 'does not leave extra blank lines before marker block');
assert.ok(!/\r?\n{3,}# GSD Agent Configuration/.test(content), 'does not leave extra blank lines before marker block');
});
test('idempotent: re-merge produces same result', () => {
@@ -1693,11 +1693,11 @@ describe('codex features section safety', () => {
// causes "invalid type: string, expected a boolean in features"
const configContent = `[features]\ncodex_hooks = true\n\nmodel = "gpt-5.4"\nmodel_reasoning_effort = "medium"\n\n[agents.gsd-executor]\ndescription = "test"\n`;
const featuresMatch = configContent.match(/\[features\]\n([\s\S]*?)(?=\n\[|$)/);
const featuresMatch = configContent.match(/\[features\]\r?\n([\s\S]*?)(?=\n\[|$)/);
assert.ok(featuresMatch, 'features section found');
const featuresBody = featuresMatch[1];
const nonBooleanKeys = featuresBody.split('\n')
const nonBooleanKeys = featuresBody.split(/\r?\n/)
.filter(line => line.match(/^\s*\w+\s*=/) && !line.match(/=\s*(true|false)\s*(#.*)?$/))
.map(line => line.trim());
@@ -1709,9 +1709,9 @@ describe('codex features section safety', () => {
test('boolean keys under [features] are NOT flagged', () => {
const configContent = `[features]\ncodex_hooks = true\nmulti_agent = false\n`;
const featuresMatch = configContent.match(/\[features\]\n([\s\S]*?)(?=\n\[|$)/);
const featuresMatch = configContent.match(/\[features\]\r?\n([\s\S]*?)(?=\n\[|$)/);
const featuresBody = featuresMatch[1];
const nonBooleanKeys = featuresBody.split('\n')
const nonBooleanKeys = featuresBody.split(/\r?\n/)
.filter(line => line.match(/^\s*\w+\s*=/) && !line.match(/=\s*(true|false)\s*(#.*)?$/))
.map(line => line.trim());
@@ -1793,7 +1793,7 @@ describe('Codex install hook configuration (e2e)', () => {
const content = readCodexConfig(codexHome);
const agentsDir = path.join(codexHome, 'agents').replace(/\\/g, '/');
// All config_file values should use absolute paths
const configFileLines = content.split('\n').filter(l => l.startsWith('config_file = '));
const configFileLines = content.split(/\r?\n/).filter(l => l.startsWith('config_file = '));
assert.ok(configFileLines.length > 0, 'has config_file entries');
for (const line of configFileLines) {
assert.ok(line.includes(agentsDir), `absolute path in: ${line}`);
@@ -1831,10 +1831,10 @@ describe('Codex install hook configuration (e2e)', () => {
assert.ok(reasoningIndex < featuresIndex, 'model_reasoning_effort= relocated before [features]');
// [features] should only contain boolean keys
const featuresMatch = content.match(/\[features\]\n([\s\S]*?)(?=\n\[|$)/);
const featuresMatch = content.match(/\[features\]\r?\n([\s\S]*?)(?=\n\[|$)/);
assert.ok(featuresMatch, 'features section found');
const featuresBody = featuresMatch[1];
const nonBooleanKeys = featuresBody.split('\n')
const nonBooleanKeys = featuresBody.split(/\r?\n/)
.filter(line => line.match(/^\s*\w+\s*=/) && !line.match(/=\s*(true|false)\s*(#.*)?$/));
assert.strictEqual(nonBooleanKeys.length, 0, 'no non-boolean keys under [features]');
@@ -1895,10 +1895,10 @@ describe('Codex install hook configuration (e2e)', () => {
assert.ok(reasoningIndex < featuresIndex, 'model_reasoning_effort= stays before [features]');
// [features] should only contain boolean keys
const featuresMatch = content.match(/\[features\]\n([\s\S]*?)(?=\n\[|$)/);
const featuresMatch = content.match(/\[features\]\r?\n([\s\S]*?)(?=\n\[|$)/);
assert.ok(featuresMatch, 'features section found');
const featuresBody = featuresMatch[1];
const nonBooleanKeys = featuresBody.split('\n')
const nonBooleanKeys = featuresBody.split(/\r?\n/)
.filter(line => line.match(/^\s*\w+\s*=/) && !line.match(/=\s*(true|false)\s*(#.*)?$/));
assert.strictEqual(nonBooleanKeys.length, 0, 'no non-boolean keys under [features]');
@@ -2572,7 +2572,7 @@ describe('Codex uninstall symmetry for hook-enabled configs', () => {
runCodexInstall(codexHome);
const cleaned = stripGsdFromCodexConfig(readCodexConfig(codexHome));
assert.strictEqual(cleaned, initialContent, `preserves short-circuited root features assignment: ${initialContent.split('\n')[0]}`);
assert.strictEqual(cleaned, initialContent, `preserves short-circuited root features assignment: ${initialContent.split(/\r?\n/)[0]}`);
cleanup(codexHome);
fs.mkdirSync(codexHome, { recursive: true });
@@ -2588,7 +2588,7 @@ describe('Codex uninstall symmetry for hook-enabled configs', () => {
'[model]',
'name = "o3"',
'',
].join('\r\n').replace(/^# first line wins\r\n/, '# first line wins\n');
].join('\r\n').replace(/^# first line wins\r\r?\n/, '# first line wins\n');
writeCodexConfig(codexHome, initialContent);
runCodexInstall(codexHome);

View File

@@ -22,7 +22,7 @@ describe('commit_docs bypass guard (#1783)', () => {
test('execute-phase.md: every git add .planning/ has a commit_docs guard', () => {
const content = fs.readFileSync(EXECUTE_PHASE_PATH, 'utf-8');
const lines = content.split('\n');
const lines = content.split(/\r?\n/);
for (let i = 0; i < lines.length; i++) {
if (/git add\b.*\.planning\//.test(lines[i])) {
@@ -39,7 +39,7 @@ describe('commit_docs bypass guard (#1783)', () => {
test('quick.md: every git add .planning/ has a commit_docs guard', () => {
const content = fs.readFileSync(QUICK_PATH, 'utf-8');
const lines = content.split('\n');
const lines = content.split(/\r?\n/);
for (let i = 0; i < lines.length; i++) {
if (/git add\b.*\.planning\//.test(lines[i])) {
@@ -55,7 +55,7 @@ describe('commit_docs bypass guard (#1783)', () => {
test('quick.md: git add ${file_list} has a commit_docs guard for .planning/ filtering', () => {
const content = fs.readFileSync(QUICK_PATH, 'utf-8');
const lines = content.split('\n');
const lines = content.split(/\r?\n/);
// Find the line(s) that do `git add ${file_list}` — this variable
// includes .planning/STATE.md so it needs a commit_docs guard too
@@ -82,7 +82,7 @@ describe('commit_docs bypass guard (#1783)', () => {
const content = fs.readFileSync(wf.path, 'utf-8');
// Find all occurrences of git add that reference .planning/
const regex = /git add\b[^\n]*\.planning\//g;
const regex = /git add\b[^\r\n]*\.planning\//g;
let match;
while ((match = regex.exec(content)) !== null) {
// Get the 500-char window before this match

View File

@@ -64,7 +64,7 @@ describe('config-field-docs', () => {
// Extract CONFIG_DEFAULTS keys from config-loader.cjs source (moved from core.cjs by ADR-857 phase 2e)
const coreSource = fs.readFileSync(CORE_PATH, 'utf-8');
const defaultsMatch = coreSource.match(
/const CONFIG_DEFAULTS\s*=\s*\{([\s\S]*?)\n\};/
/const CONFIG_DEFAULTS\s*=\s*\{([\s\S]*?)\r?\n\};/
);
assert.ok(defaultsMatch, 'Could not find CONFIG_DEFAULTS in config-loader.cjs');
@@ -302,7 +302,7 @@ describe('CONFIGURATION.md parity (#1216)', () => {
test('settings-advanced.md parse-default list must NOT show subagent_timeout default 600 (#1216)', () => {
// Line 53 regression: the parse-default list item must use 300000, not 600
assert.ok(
!(/`workflow\.subagent_timeout`[^\n]*default:[^\n]*`?600`?/.test(settingsAdvancedContent)),
!(/`workflow\.subagent_timeout`[^\r\n]*default:[^\n]*`?600`?/.test(settingsAdvancedContent)),
'settings-advanced.md must NOT list subagent_timeout default as 600 (stale seconds default)'
);
});

View File

@@ -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 ────────────────────

View File

@@ -47,7 +47,7 @@ function makeManifest() {
function readJsonl(filePath) {
const raw = fs.readFileSync(filePath, 'utf8').trim();
if (!raw) return [];
return raw.split('\n').map(line => JSON.parse(line));
return raw.split(/\r?\n/).map(line => JSON.parse(line));
}
// ─── Shared state for the test group ─────────────────────────────────────────

View File

@@ -24,7 +24,7 @@ const specTemplatePath = path.join(__dirname, '..', 'gsd-core', 'templates', 'sp
// The \n? before the closing fence allows blocks whose closing fence has no preceding newline
// (fixes the silent-skip bug where a trailing-fence-with-no-newline was not matched).
function taggedJsonBlocks(md) {
const re = /```json edge-probe:([^\n]+)\n([\s\S]*?)\n?```/g;
const re = /```json edge-probe:([^\r\n]+)\r?\n([\s\S]*?)\r?\n?```/g;
const out = {};
let m;
while ((m = re.exec(md))) out[m[1].trim()] = m[2];

View File

@@ -19,7 +19,7 @@ describe('enh-773: automated codex exec invocations include --ephemeral and --da
// probe (`codex exec --help | grep …`) is not an automation invocation, so it
// is excluded from the per-invocation flag assertions below.
const codexExecLines = workflow
.split('\n')
.split(/\r?\n/)
.filter((line) => line.includes('codex exec') && !line.includes('codex exec --help'));
test('review.md contains at least one codex exec invocation', () => {
@@ -43,7 +43,7 @@ describe('enh-773: automated codex exec invocations include --ephemeral and --da
// be probed (`codex exec --help | grep`) and applied via $CODEX_BYPASS_FLAG so
// older installs do not fail with "unexpected argument" (a silent empty review).
assert.ok(
/codex exec --help[^\n]*grep[^\n]*--dangerously-bypass-hook-trust/.test(workflow),
/codex exec --help[^\r\n]*grep[^\r\n]*--dangerously-bypass-hook-trust/.test(workflow),
'review.md must capability-probe --dangerously-bypass-hook-trust via `codex exec --help | grep`'
);
assert.ok(

View File

@@ -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');
@@ -53,11 +56,11 @@ const RESOLVED_CORE = resolveProfile({ modes: ['core'], manifest: MANIFEST });
// ─── Layout contract ─────────────────────────────────────────────────────────
describe('enh-789 — codebuddy layout has commands + skills kinds', () => {
test('resolveRuntimeArtifactLayout codebuddy returns 2 kinds', () => {
test('resolveRuntimeArtifactLayout codebuddy returns 3 kinds (ADR-1235 §1 agents cutover)', () => {
const layout = resolveRuntimeArtifactLayout('codebuddy', '/tmp/fake-codebuddy-dir');
assert.strictEqual(layout.kinds.length, 2, 'codebuddy must have exactly 2 artifact kinds');
assert.strictEqual(layout.kinds.length, 3, 'codebuddy must have exactly 3 artifact kinds (commands + skills + agents)');
const kindNames = layout.kinds.map(k => k.kind).sort();
assert.deepStrictEqual(kindNames, ['commands', 'skills']);
assert.deepStrictEqual(kindNames, ['agents', 'commands', 'skills']);
});
test('codebuddy commands kind targets commands/ with gsd- prefix', () => {

View File

@@ -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');
@@ -31,12 +31,12 @@ const RESOLVED_CORE = resolveProfile({ modes: ['core'], manifest: MANIFEST });
// ─── Layout contract ─────────────────────────────────────────────────────────
describe('enh-790 — augment layout has commands + skills kinds', () => {
test('resolveRuntimeArtifactLayout augment returns 2 kinds', () => {
describe('enh-790 — augment layout has commands + skills + agents kinds', () => {
test('resolveRuntimeArtifactLayout augment returns 3 kinds', () => {
const layout = resolveRuntimeArtifactLayout('augment', '/tmp/fake-augment-dir');
assert.strictEqual(layout.kinds.length, 2, 'augment must have exactly 2 artifact kinds');
assert.strictEqual(layout.kinds.length, 3, 'augment must have exactly 3 artifact kinds');
const kindNames = layout.kinds.map(k => k.kind).sort();
assert.deepStrictEqual(kindNames, ['commands', 'skills']);
assert.deepStrictEqual(kindNames, ['agents', 'commands', 'skills']);
});
test('augment commands kind targets commands/ with gsd- prefix', () => {
@@ -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');

View File

@@ -31,7 +31,7 @@ describe('execute-phase command: --wave flag', () => {
test('argument-hint includes --wave, --gaps-only, and --interactive', () => {
const content = fs.readFileSync(COMMAND_PATH, 'utf-8');
const hintLine = content.split('\n').find(l => l.includes('argument-hint'));
const hintLine = content.split(/\r?\n/).find(l => l.includes('argument-hint'));
assert.ok(hintLine, 'should have argument-hint line');
assert.ok(hintLine.includes('--wave N'), 'argument-hint should include --wave N');
assert.ok(hintLine.includes('--gaps-only'), 'argument-hint should keep --gaps-only');

View File

@@ -0,0 +1,85 @@
'use strict';
/**
* feat-1754-cli-skew-detection.test.cjs
*
* Tests for the CLI version-skew detection module (src/cli-skew-check.cts).
*
* The check warns (returns a string) when the running gsd-tools.cjs is NOT the
* project-local install while a project-local install EXISTS — the shadowing
* scenario from #1748 (a stale global canary from @gsd-build/sdk shadowing
* project-local 1.6.0).
*
* DEFECT class: environment / version skew (enhancement #1754)
*
* The function is PURE (no I/O — the caller provides paths + existence flags),
* making it trivially testable without filesystem setup.
*/
const { test, describe } = require('node:test');
const assert = require('node:assert/strict');
const path = require('node:path');
const { checkCliSkew } = require('../gsd-core/bin/lib/cli-skew-check.cjs');
describe('#1754: checkCliSkew — pure path-comparison skew detection', () => {
test('SKEW: resolved CLI outside project root + project-local exists → returns warning', () => {
const warning = checkCliSkew({
resolvedPath: '/opt/homebrew/bin/gsd-tools',
projectRoot: '/home/user/my-project',
projectLocalExists: true,
});
assert.ok(warning, 'Expected a warning string when resolved CLI is outside project root and project-local exists');
assert.ok(warning.includes('shadow') || warning.includes('outside') || warning.includes('may'),
`Warning should mention the shadowing/outside nature, got: "${warning}"`);
});
test('NO-SKEW: resolved CLI is the project-local install → returns null', () => {
const warning = checkCliSkew({
resolvedPath: '/home/user/my-project/.claude/gsd-core/bin/gsd-tools.cjs',
projectRoot: '/home/user/my-project',
projectLocalExists: true,
});
assert.strictEqual(warning, null, 'No warning expected when resolved CLI IS the project-local install');
});
test('NO-SKEW: resolved CLI outside project root but NO project-local install → returns null', () => {
const warning = checkCliSkew({
resolvedPath: '/usr/local/bin/gsd-tools',
projectRoot: '/home/user/my-project',
projectLocalExists: false,
});
assert.strictEqual(warning, null, 'No warning expected when no project-local install exists (legitimate global-only)');
});
test('NO-SKEW: projectRoot is null (no project context) → returns null', () => {
const warning = checkCliSkew({
resolvedPath: '/usr/local/bin/gsd-tools',
projectRoot: null,
projectLocalExists: false,
});
assert.strictEqual(warning, null, 'No warning expected when there is no project root');
});
test('LEGACY-SDK: resolved path contains @gsd-build → warning includes removal instructions', () => {
const warning = checkCliSkew({
resolvedPath: '/opt/homebrew/lib/node_modules/@gsd-build/sdk/bin/gsd-tools',
projectRoot: '/home/user/my-project',
projectLocalExists: true,
});
assert.ok(warning, 'Expected a warning for @gsd-build/sdk paths');
assert.ok(warning.includes('@gsd-build/sdk') || warning.includes('npm uninstall'),
`Warning should include @gsd-build/sdk removal instructions, got: "${warning}"`);
});
test('PATH-NORMALIZATION: resolved under project root via realpath → no false positive', () => {
// Even if the resolved path differs in symlink resolution, if it's under the
// project root, it's not a skew. The caller normalizes paths before calling.
const warning = checkCliSkew({
resolvedPath: path.resolve('/home/user/my-project/.claude/gsd-core/bin/gsd-tools.cjs'),
projectRoot: path.resolve('/home/user/my-project'),
projectLocalExists: true,
});
assert.strictEqual(warning, null, 'No warning when resolved path is under project root (even with realpath normalization)');
});
});

View File

@@ -40,7 +40,7 @@ const USER_GUIDE_MD = path.join(ROOT, 'docs', 'USER-GUIDE.md');
*/
function extractSection(filePath, headerSubstring) {
const content = fs.readFileSync(filePath, 'utf8');
const lines = content.split('\n');
const lines = content.split(/\r?\n/);
let inSection = false;
let startDepth = 0;
const collected = [];
@@ -275,7 +275,7 @@ describe('#3025 markdownlint pre-flight: MD040 + MD056', () => {
const section = extractSection(CONTEXT_BUDGET_MD, 'mcp');
// Guard: same null-section concern as MD040 above (CR follow-up).
assert.ok(section, 'MCP section not found in context-budget.md — cannot check MD056');
const lines = section.split('\n');
const lines = section.split(/\r?\n/);
// Walk through and detect tables: header row followed by a separator
// (--- pattern) followed by data rows. Count `|` per line.
const issues = [];

View File

@@ -90,10 +90,12 @@ function runGlobalInstall(runtime, tmpHome) {
const prev = process.env[envVar];
const prevCwd = process.cwd();
const prevHome = process.env.HOME;
const prevUserProfile = process.env.USERPROFILE;
const prevSkipStale = process.env.GSD_SKIP_STALE_SDK_CHECK;
process.env[envVar] = tmpHome;
process.env.HOME = isolatedHome;
process.env.USERPROFILE = isolatedHome;
process.env.GSD_SKIP_STALE_SDK_CHECK = '1';
process.chdir(REPO_ROOT);
@@ -105,6 +107,8 @@ function runGlobalInstall(runtime, tmpHome) {
else process.env[envVar] = prev;
if (prevHome === undefined) delete process.env.HOME;
else process.env.HOME = prevHome;
if (prevUserProfile === undefined) delete process.env.USERPROFILE;
else process.env.USERPROFILE = prevUserProfile;
if (prevSkipStale === undefined) delete process.env.GSD_SKIP_STALE_SDK_CHECK;
else process.env.GSD_SKIP_STALE_SDK_CHECK = prevSkipStale;
// Clean up the isolated HOME dir

View File

@@ -16,6 +16,14 @@
* Scenarios:
* A. deriveProgressFromRoadmap with a progress table containing a 999.x row.
* B. state json total_phases via extractCurrentMilestone / roadmapPhaseCount.
*
* Follow-up #1580: the same `^999` (and Phase 0) sentinel exclusion was missing
* in two more code paths — `milestone complete`'s unstarted-phase guard
* (src/milestone.cts) and `roadmap analyze`'s next_phase routing + phase_count
* (src/roadmap.cts). Scenarios C and D below cover those.
*
* C. milestone complete is NOT blocked by a Phase 999 backlog heading.
* D. roadmap analyze never routes next_phase to 999 / never counts it.
*/
const { describe, test, beforeEach, afterEach } = require('node:test');
@@ -172,3 +180,116 @@ describe('bug #1445 — state json excludes 999.x phase headings from total_phas
);
});
});
// ─── Scenario C: milestone complete not blocked by a 999 backlog heading ─────
describe('fix #1580 — milestone complete ignores the 999 backlog sentinel', () => {
let tmpDir;
beforeEach(() => {
tmpDir = createTempProject('fix-1580-mc-');
const planning = path.join(tmpDir, '.planning');
// One real, on-disk phase + a directory-less Phase 999 backlog heading.
fs.writeFileSync(
path.join(planning, 'ROADMAP.md'),
[
'# Roadmap v1.0',
'## v1.0 Milestone',
'## Phases',
'- [x] **Phase 1: Foundation**',
'## Phase Details',
'### Phase 1: Foundation',
'**Goal:** build it',
'### Phase 999: Backlog / Someday',
'**Goal:** deferred, never executed',
].join('\n'),
'utf-8',
);
fs.writeFileSync(
path.join(planning, 'STATE.md'),
`---\nmilestone: v1.0\n---\n# State\n\n**Status:** In progress\n**Last Activity:** 2025-01-01\n**Last Activity Description:** Working\n`,
'utf-8',
);
const dir = path.join(planning, 'phases', '01-foundation');
fs.mkdirSync(dir, { recursive: true });
fs.writeFileSync(path.join(dir, 'PLAN.md'), '# Plan\n', 'utf-8');
});
afterEach(() => {
cleanup(tmpDir);
});
test('completes WITHOUT --force despite a Phase 999 backlog heading', () => {
const result = runGsdTools(
['milestone', 'complete', 'v1.0', '--name', 'Regression'],
tmpDir,
);
assert.ok(
result.success,
`milestone complete must not be blocked by the 999 sentinel; got error: ${result.error}`,
);
assert.ok(
!/Cannot mark milestone complete/.test(result.error || ''),
`the unstarted-phase guard must not fire on Phase 999. Got: ${result.error}`,
);
});
});
// ─── Scenario D: roadmap analyze never routes/ counts the 999 sentinel ────────
describe('fix #1580 — roadmap analyze excludes the 999 backlog sentinel', () => {
let tmpDir;
beforeEach(() => {
tmpDir = createTempProject('fix-1580-ra-');
const planning = path.join(tmpDir, '.planning');
fs.writeFileSync(
path.join(planning, 'ROADMAP.md'),
[
'# Roadmap v1.0',
'## v1.0 Milestone',
'## Phases',
'- [x] **Phase 1: Foundation**',
'## Phase Details',
'### Phase 1: Foundation',
'**Goal:** build it',
'### Phase 999: Backlog / Someday',
'**Goal:** deferred, never executed',
].join('\n'),
'utf-8',
);
fs.writeFileSync(
path.join(planning, 'STATE.md'),
`---\nmilestone: v1.0\n---\n# State\n`,
'utf-8',
);
const dir = path.join(planning, 'phases', '01-foundation');
fs.mkdirSync(dir, { recursive: true });
fs.writeFileSync(path.join(dir, 'PLAN.md'), '# Plan\n', 'utf-8');
fs.writeFileSync(path.join(dir, 'SUMMARY.md'), '# Summary\n', 'utf-8');
});
afterEach(() => {
cleanup(tmpDir);
});
test('next_phase is never 999 and phase_count excludes the sentinel', () => {
const result = runGsdTools(['roadmap', 'analyze', '--raw'], tmpDir);
assert.ok(result.success, `roadmap analyze failed: ${result.error}`);
const analysis = JSON.parse(result.output);
assert.notEqual(
String(analysis.next_phase),
'999',
`next_phase must never route to the 999 backlog sentinel. Got ${analysis.next_phase}`,
);
assert.equal(
analysis.phase_count,
1,
`phase_count must exclude the 999 sentinel (expected 1). Got ${analysis.phase_count}`,
);
assert.ok(
!(analysis.phases || []).some(p => String(p.number) === '999'),
'the phases array must not include the 999 backlog sentinel',
);
});
});

View File

@@ -32,7 +32,7 @@ const MANIFEST_REQUIRED_KEYS = new Set([
*/
function extractManifests(mdContent) {
const manifests = [];
const fenceRe = /```json\s*\n([\s\S]*?)```/g;
const fenceRe = /```json\s*\r?\n([\s\S]*?)```/g;
let match;
while ((match = fenceRe.exec(mdContent)) !== null) {
let parsed;

View File

@@ -169,12 +169,14 @@ test('execute-phase.md, quick.md, and diagnose-issues.md guards are generalized
});
// ---------------------------------------------------------------------------
// Orchestration gating: manager.md + autonomous.md now gate on codex for
// background dispatch, not on "not claude". (#1521 Stage 2)
// Orchestration gating: manager.md + autonomous.md gate background dispatch on
// the typed FLATTEN query. #1708 (ADR-1239 Phase B) graduated #1521's
// codex-specific check to a documentation-sourced shouldFlattenDispatch — the
// prose now branches on `FLATTEN` (false = background), not a runtime name.
// ---------------------------------------------------------------------------
test('manager.md and autonomous.md gate run_in_background on codex specifically (#1521)', () => {
// allow-test-rule: orchestration dispatch gating in manager/autonomous .md is the runtime contract surface (#1521)
test('manager.md and autonomous.md gate run_in_background on FLATTEN=false, not a runtime name (#1521, graduated by #1708)', () => {
// allow-test-rule: orchestration dispatch gating in manager/autonomous .md is the runtime contract surface (#1521/#1708)
const manager = fs.readFileSync(
path.join(__dirname, '..', 'gsd-core', 'workflows', 'manager.md'),
'utf8',
@@ -184,24 +186,29 @@ test('manager.md and autonomous.md gate run_in_background on codex specifically
'utf8',
);
// Both files must gate run_in_background on codex (not on a generic "not claude" condition)
// Both files must gate run_in_background on the typed FLATTEN decision (not a runtime name)
assert.ok(
/`RUNTIME` is `codex`[\s\S]{0,500}?run_in_background=true/.test(manager),
'manager.md: expected run_in_background dispatch gated on RUNTIME=codex specifically',
/If `FLATTEN` is `false`[\s\S]{0,500}?run_in_background=true/.test(manager),
'manager.md: expected run_in_background dispatch gated on FLATTEN=false (typed dispatch-should-flatten query)',
);
assert.ok(
/`RUNTIME` is `codex`[\s\S]{0,700}?run_in_background=true/.test(autonomous),
'autonomous.md: expected run_in_background dispatch gated on RUNTIME=codex specifically',
/If `FLATTEN` is `false`[\s\S]{0,1200}?run_in_background=true/.test(autonomous),
'autonomous.md: expected run_in_background dispatch gated on FLATTEN=false (typed dispatch-should-flatten query)',
);
// Inline is the default/else branch (not just claude)
// Inline is the else branch, keyed on FLATTEN — never a runtime name
assert.ok(
/Otherwise[\s\S]{0,200}?Claude Code or any other non-Codex runtime/.test(manager),
'manager.md: expected "Otherwise (Claude Code or any other non-Codex runtime)" inline branch',
/Otherwise[\s\S]{0,250}?inline/i.test(manager),
'manager.md: expected "Otherwise ... inline" branch keyed on FLATTEN',
);
assert.ok(
/Otherwise[\s\S]{0,200}?Claude Code or any other non-Codex runtime/.test(autonomous),
'autonomous.md: expected "Otherwise (Claude Code or any other non-Codex runtime)" inline branch',
/Otherwise[\s\S]{0,250}?inline/i.test(autonomous),
'autonomous.md: expected "Otherwise ... inline" branch keyed on FLATTEN',
);
// And the old runtime-name gating must be gone (no `RUNTIME` is `codex` dispatch gate)
assert.ok(
!/`RUNTIME` is `codex`[\s\S]{0,500}?run_in_background=true/.test(manager),
'manager.md: must no longer gate run_in_background on the runtime name',
);
});

View File

@@ -0,0 +1,789 @@
'use strict';
/**
* Tests for ADR-1239 Phase B: destSubpath write-confinement security gate.
*
* Verifies that assertDestWithinConfigHome rejects escaping destSubpath values
* and that createRuntimeArtifactInstallPlan and createRuntimeArtifactUninstallPlan
* both reject them at plan-build time.
*
* Also covers:
* F3 - assertDestWithinConfigHome rejects destSubpath === configHome itself
* F4 - migrateLegacyDevPreferencesToSkill routes through the confinement gate
* F2 - write sites (installOpencodeFamilySkills) reject symlink-escaping destDir
*/
const { test, describe, beforeEach, afterEach } = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const os = require('node:os');
const path = require('node:path');
const {
assertDestWithinConfigHome,
createRuntimeArtifactInstallPlan,
createRuntimeArtifactUninstallPlan,
} = require('../gsd-core/bin/lib/runtime-artifact-install-plan.cjs');
const {
migrateLegacyDevPreferencesToSkill,
installOpencodeFamilySkills,
installRuntimeArtifacts,
_copyStaged,
} = require('../gsd-core/bin/lib/install-engine.cjs');
const { createTempDir, cleanup } = require('./helpers.cjs');
// ---------------------------------------------------------------------------
// Unit tests for assertDestWithinConfigHome
// ---------------------------------------------------------------------------
describe('assertDestWithinConfigHome', () => {
let configDir;
beforeEach(() => {
configDir = createTempDir('gsd-confine-test-');
});
afterEach(() => {
cleanup(configDir);
});
// --- Rejection cases ---
test('rejects destSubpath "../../etc" that escapes configDir', () => {
assert.throws(
() => assertDestWithinConfigHome(configDir, '../../etc'),
(err) => {
assert.ok(err instanceof Error, 'must be an Error');
assert.ok(
err.message.includes('escapes configHome'),
`expected "escapes configHome" in: ${err.message}`,
);
return true;
},
);
});
test('rejects destSubpath "../foo" that escapes configDir', () => {
assert.throws(
() => assertDestWithinConfigHome(configDir, '../foo'),
/escapes configHome/,
);
});
test('rejects destSubpath "a/../../b" that escapes configDir', () => {
assert.throws(
() => assertDestWithinConfigHome(configDir, 'a/../../b'),
/escapes configHome/,
);
});
test('rejects destSubpath containing a NUL byte', () => {
assert.throws(
() => assertDestWithinConfigHome(configDir, 'skills\0evil'),
(err) => {
assert.ok(err instanceof Error, 'must be an Error');
assert.ok(
err.message.includes('NUL'),
`expected "NUL" in: ${err.message}`,
);
return true;
},
);
});
// --- F3: reject destSubpath that resolves to configHome itself ---
test('F3: rejects destSubpath "." that resolves to configHome itself', () => {
assert.throws(
() => assertDestWithinConfigHome(configDir, '.'),
(err) => {
assert.ok(err instanceof Error, 'must be an Error');
assert.ok(
err.message.includes('not configHome itself') || err.message.includes('escapes configHome'),
`expected confinement error in: ${err.message}`,
);
return true;
},
);
});
test('F3: rejects destSubpath "a/.." that resolves to configHome itself', () => {
assert.throws(
() => assertDestWithinConfigHome(configDir, 'a/..'),
(err) => {
assert.ok(err instanceof Error, 'must be an Error');
assert.ok(
err.message.includes('not configHome itself') || err.message.includes('escapes configHome'),
`expected confinement error in: ${err.message}`,
);
return true;
},
);
});
test('F3: rejects destSubpath "skills/../.." that resolves to configHome parent', () => {
assert.throws(
() => assertDestWithinConfigHome(configDir, 'skills/../..'),
(err) => {
assert.ok(err instanceof Error, 'must be an Error');
assert.ok(
err.message.includes('not configHome itself') || err.message.includes('escapes configHome'),
`expected confinement error in: ${err.message}`,
);
return true;
},
);
});
// --- Accepted cases ---
test('accepts "skills" and returns path under configDir', () => {
const result = assertDestWithinConfigHome(configDir, 'skills');
assert.ok(
result.startsWith(path.resolve(configDir)),
`expected result to start with configDir (${path.resolve(configDir)}), got: ${result}`,
);
assert.strictEqual(result, path.join(path.resolve(configDir), 'skills'));
});
test('accepts "commands/gsd" and returns path under configDir', () => {
const result = assertDestWithinConfigHome(configDir, 'commands/gsd');
assert.ok(result.startsWith(path.resolve(configDir)));
assert.strictEqual(result, path.join(path.resolve(configDir), 'commands', 'gsd'));
});
test('accepts "./skills" and returns resolved path under configDir', () => {
const result = assertDestWithinConfigHome(configDir, './skills');
assert.ok(result.startsWith(path.resolve(configDir)));
assert.strictEqual(result, path.join(path.resolve(configDir), 'skills'));
});
test('does not match a sibling directory with a shared prefix', () => {
// configDir = /tmp/gsd-foo; a sibling like /tmp/gsd-foobar must NOT be accepted.
// The path.sep guard in the implementation prevents a startsWith match
// from crossing directory boundaries. We verify the happy-path: a valid
// nested subpath resolves to a path strictly under configDir (includes sep).
const result = assertDestWithinConfigHome(configDir, 'subdir/nested');
assert.ok(result.startsWith(path.resolve(configDir) + path.sep));
});
});
// ---------------------------------------------------------------------------
// Integration tests for createRuntimeArtifactInstallPlan
// ---------------------------------------------------------------------------
describe('createRuntimeArtifactInstallPlan destSubpath confinement', () => {
let configDir;
beforeEach(() => {
configDir = createTempDir('gsd-plan-confine-');
});
afterEach(() => {
cleanup(configDir);
});
function noopStage() {
return '/tmp/staged-noop';
}
function makeLayout(destSubpath) {
return {
runtime: 'claude',
configDir,
scope: 'global',
kinds: [
{
kind: 'skills',
destSubpath,
prefix: 'gsd-',
stage: noopStage,
},
],
};
}
test('rejects an escaping destSubpath ("../../escape") at plan-build time', () => {
const layout = makeLayout('../../escape');
assert.throws(
() => createRuntimeArtifactInstallPlan({
layout,
resolvedProfile: { name: 'core' },
deps: {
rewriteStagedSkillBodies: () => undefined,
rewriteStagedCommandBodies: () => undefined,
},
}),
(err) => {
assert.ok(err instanceof Error);
assert.ok(
err.message.includes('escapes'),
`expected "escapes" in: ${err.message}`,
);
return true;
},
);
});
test('normal destSubpath produces plan with destDir under configDir', () => {
const stagedDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-staged-'));
try {
const layout = {
runtime: 'claude',
configDir,
scope: 'global',
kinds: [
{
kind: 'skills',
destSubpath: 'skills',
prefix: 'gsd-',
stage: () => stagedDir,
},
],
};
const result = createRuntimeArtifactInstallPlan({
layout,
resolvedProfile: { name: 'core' },
deps: {
rewriteStagedSkillBodies: () => undefined,
rewriteStagedCommandBodies: () => undefined,
},
});
assert.strictEqual(result.ok, true, 'plan must succeed for normal destSubpath');
assert.strictEqual(result.plan.items.length, 1);
const destDir = result.plan.items[0].destDir;
assert.ok(
destDir.startsWith(path.resolve(configDir)),
`destDir (${destDir}) must be under configDir (${configDir})`,
);
} finally {
cleanup(stagedDir);
}
});
});
// ---------------------------------------------------------------------------
// Integration tests for createRuntimeArtifactUninstallPlan
// ---------------------------------------------------------------------------
describe('createRuntimeArtifactUninstallPlan destSubpath confinement', () => {
let configDir;
beforeEach(() => {
configDir = createTempDir('gsd-uninstall-confine-');
});
afterEach(() => {
cleanup(configDir);
});
function makeUninstallLayout(destSubpath) {
return {
runtime: 'claude',
configDir,
kinds: [
{
kind: 'skills',
destSubpath,
prefix: 'gsd-',
stage: () => '/tmp/staged-noop',
},
],
};
}
test('rejects an escaping destSubpath ("../../escape") at uninstall-plan-build time', () => {
const layout = makeUninstallLayout('../../escape');
assert.throws(
() => createRuntimeArtifactUninstallPlan(layout),
(err) => {
assert.ok(err instanceof Error);
assert.ok(
err.message.includes('escapes'),
`expected "escapes" in: ${err.message}`,
);
return true;
},
);
});
test('rejects destSubpath "../outside" at uninstall-plan-build time', () => {
const layout = makeUninstallLayout('../outside');
assert.throws(
() => createRuntimeArtifactUninstallPlan(layout),
/escapes/,
);
});
test('normal destSubpath produces uninstall plan with destDir under configDir', () => {
const layout = makeUninstallLayout('skills');
const plan = createRuntimeArtifactUninstallPlan(layout);
assert.strictEqual(plan.items.length, 1);
const destDir = plan.items[0].destDir;
assert.ok(
destDir.startsWith(path.resolve(configDir)),
`destDir (${destDir}) must be under configDir (${configDir})`,
);
assert.strictEqual(destDir, path.join(path.resolve(configDir), 'skills'));
});
test('normal nested destSubpath ("commands/gsd") produces uninstall plan with destDir under configDir', () => {
const layout = makeUninstallLayout('commands/gsd');
const plan = createRuntimeArtifactUninstallPlan(layout);
assert.strictEqual(plan.items.length, 1);
const destDir = plan.items[0].destDir;
assert.ok(
destDir.startsWith(path.resolve(configDir)),
`destDir (${destDir}) must be under configDir (${configDir})`,
);
assert.strictEqual(destDir, path.join(path.resolve(configDir), 'commands', 'gsd'));
});
});
// ---------------------------------------------------------------------------
// F4: migrateLegacyDevPreferencesToSkill must route through the confinement gate
// ---------------------------------------------------------------------------
describe('F4: migrateLegacyDevPreferencesToSkill confinement', () => {
let configDir;
let outsideDir;
beforeEach(() => {
configDir = createTempDir('gsd-f4-confine-');
outsideDir = createTempDir('gsd-f4-outside-');
});
afterEach(() => {
cleanup(configDir);
cleanup(outsideDir);
});
test('F4: migrateLegacyDevPreferencesToSkill throws when destSubpath resolves to configHome itself (via mocked layout with "." destSubpath)', () => {
// We cannot easily inject a bad destSubpath through the real layout resolver
// (it resolves to a real valid path). Instead we validate that the function
// uses assertDestWithinConfigHome by passing a runtime whose layout's
// skillsKindEntry.destSubpath, when joined with configDir, would escape — but
// since real layouts are always safe, we test the guard on a deliberately
// crafted saved map calling the real function and observing the path written
// is always within configDir for a real runtime.
//
// Real-layout sanity: verify 'opencode' produces a write inside configDir.
const savedLegacy = new Map([['dev-preferences.md', '# dev prefs\n']]);
// Real opencode layout — should succeed without throwing
assert.doesNotThrow(() => {
migrateLegacyDevPreferencesToSkill(configDir, savedLegacy, 'opencode', 'global');
}, 'migrateLegacyDevPreferencesToSkill with real opencode layout must not throw');
// Verify the written file is inside configDir
const written = [];
function findMd(dir) {
if (!fs.existsSync(dir)) return;
for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
if (e.isDirectory()) findMd(path.join(dir, e.name));
else if (e.name.endsWith('.md')) written.push(path.join(dir, e.name));
}
}
findMd(configDir);
assert.ok(written.length > 0, 'at least one .md must have been written');
for (const f of written) {
assert.ok(
f.startsWith(path.resolve(configDir) + path.sep),
`written file ${f} must be inside configDir ${configDir}`,
);
}
});
test('F4: migrateLegacyDevPreferencesToSkill uses assertDestWithinConfigHome — path.join on configDir+destSubpath cannot escape via symlink in destSubpath string', () => {
// Validate that the guard (assertDestWithinConfigHome) would have caught a
// manipulated destSubpath value. We simulate by calling assertDestWithinConfigHome
// directly with a "."-equivalent subpath (F3 guard) to prove F4 now relies on it.
assert.throws(
() => assertDestWithinConfigHome(configDir, '.'),
(err) => {
assert.ok(err instanceof Error);
return true;
},
'assertDestWithinConfigHome must reject "." (used by F4 guard)',
);
});
});
// ---------------------------------------------------------------------------
// F2: write sites reject a symlink-escaping destDir
// ---------------------------------------------------------------------------
describe('F2: installOpencodeFamilySkills rejects symlink-escaping destDir', () => {
let configDir;
let outsideDir;
let symlinkTarget;
beforeEach(() => {
configDir = createTempDir('gsd-f2-config-');
outsideDir = createTempDir('gsd-f2-outside-');
// Create a symlink inside configDir pointing outside
symlinkTarget = path.join(configDir, 'skills');
fs.symlinkSync(outsideDir, symlinkTarget);
});
afterEach(() => {
// Remove symlink before cleanup to avoid errors
try { fs.unlinkSync(symlinkTarget); } catch { /* already gone */ }
cleanup(configDir);
cleanup(outsideDir);
});
test('F2: installOpencodeFamilySkills throws when skills/ is a symlink pointing outside configDir', () => {
// Create a minimal rawCommandsDir with one .md file
const rawDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-f2-raw-'));
try {
fs.writeFileSync(path.join(rawDir, 'help.md'), '# help\n', 'utf8');
assert.throws(
() => installOpencodeFamilySkills('opencode', configDir, rawDir, '~/.opencode/'),
(err) => {
assert.ok(err instanceof Error, 'must be an Error');
assert.ok(
err.message.toLowerCase().includes('symlink') ||
err.message.toLowerCase().includes('escap') ||
err.message.toLowerCase().includes('outside') ||
err.message.toLowerCase().includes('confinement'),
`expected symlink/escape error in: ${err.message}`,
);
return true;
},
);
// Verify nothing was written to outsideDir
const outsideFiles = fs.readdirSync(outsideDir);
assert.strictEqual(outsideFiles.length, 0, 'must not have written anything outside configDir');
} finally {
cleanup(rawDir);
}
});
});
// ---------------------------------------------------------------------------
// M1: _copyStaged defense-in-depth must also reject dest === configRoot
// ---------------------------------------------------------------------------
describe('M1: _copyStaged rejects dest equal to configRoot', () => {
let configDir;
let stagedDir;
beforeEach(() => {
configDir = createTempDir('gsd-m1-config-');
stagedDir = createTempDir('gsd-m1-staged-');
// Write a dummy file into stagedDir so _copyStaged has something to copy
fs.writeFileSync(path.join(stagedDir, 'help.md'), '# help\n', 'utf8');
});
afterEach(() => {
cleanup(configDir);
cleanup(stagedDir);
});
test('M1: _copyStaged throws when destDir equals configRoot (was silently accepted before fix)', () => {
// dest === configRoot: the canonical gate (assertDestWithinConfigHome) rejects
// resolved === root with "escapes configHome" / "not configHome itself".
assert.throws(
() => _copyStaged(stagedDir, configDir, { kind: 'commands', destSubpath: '.', prefix: 'gsd-' }, configDir),
(err) => {
assert.ok(err instanceof Error, 'must be an Error');
assert.ok(
err.message.includes('escapes configHome') ||
err.message.includes('not configHome itself') ||
err.message.includes('outside') ||
err.message.includes('inside'),
`expected confinement error in: ${err.message}`,
);
return true;
},
);
});
test('M1: _copyStaged throws when destDir is outside configRoot', () => {
const outsideDir = createTempDir('gsd-m1-outside-');
try {
assert.throws(
() => _copyStaged(stagedDir, outsideDir, { kind: 'commands', destSubpath: 'commands', prefix: 'gsd-' }, configDir),
(err) => {
assert.ok(err instanceof Error, 'must be an Error');
assert.ok(
// After EDIT 1, _copyStaged delegates to assertDestWithinConfigHome which
// emits "escapes configHome"; the old "_copyStaged" prefix is no longer present.
err.message.includes('escapes configHome') ||
err.message.includes('strict subpath') ||
err.message.includes('refusing'),
`expected confinement error in: ${err.message}`,
);
return true;
},
);
} finally {
cleanup(outsideDir);
}
});
test('M1: _copyStaged accepts destDir strictly under configRoot', () => {
const destDir = path.join(configDir, 'commands', 'gsd');
fs.mkdirSync(destDir, { recursive: true });
// Should not throw — just copies (stagedDir has help.md, kind=commands)
assert.doesNotThrow(
() => _copyStaged(stagedDir, destDir, { kind: 'commands', destSubpath: 'commands/gsd', prefix: 'gsd-' }, configDir),
);
});
});
// ---------------------------------------------------------------------------
// L2: symlink guard BEFORE mkdirSync in installRuntimeArtifacts
// ---------------------------------------------------------------------------
describe('L2: installRuntimeArtifacts rejects symlink-escaping dest before mkdirSync', () => {
let configDir;
let outsideDir;
beforeEach(() => {
configDir = createTempDir('gsd-l2-config-');
outsideDir = createTempDir('gsd-l2-outside-');
// Create configDir/skills as a symlink pointing outside
fs.symlinkSync(outsideDir, path.join(configDir, 'skills'));
});
afterEach(() => {
// Remove symlink before cleanup to avoid crossing dir boundaries
try { fs.unlinkSync(path.join(configDir, 'skills')); } catch { /* already gone */ }
cleanup(configDir);
cleanup(outsideDir);
});
test('L2: installRuntimeArtifacts throws before creating dirs when skills/ is a symlink pointing outside', () => {
// Use the full profile shape (skills: '*') so staging short-circuits early
// and the symlink guard is the first thing that fires.
assert.throws(
() => installRuntimeArtifacts('opencode', configDir, 'global', { name: 'full', skills: '*', agents: new Set() }),
(err) => {
assert.ok(err instanceof Error, 'must be an Error');
assert.ok(
err.message.toLowerCase().includes('symlink') ||
err.message.toLowerCase().includes('escap') ||
err.message.toLowerCase().includes('outside') ||
err.message.toLowerCase().includes('confinement') ||
err.message.toLowerCase().includes('install root'),
`expected symlink/escape error in: ${err.message}`,
);
return true;
},
);
// The symlink itself still exists but no new entries were created in outsideDir
const outsideEntries = fs.readdirSync(outsideDir);
assert.strictEqual(outsideEntries.length, 0, 'must not have created any dirs/files outside configDir');
});
});
// ---------------------------------------------------------------------------
// L1: symlink guard in migrateLegacyDevPreferencesToSkill
// ---------------------------------------------------------------------------
describe('L1: migrateLegacyDevPreferencesToSkill rejects symlink-escaping skillDir', () => {
let configDir;
let outsideDir;
beforeEach(() => {
configDir = createTempDir('gsd-l1-config-');
outsideDir = createTempDir('gsd-l1-outside-');
// Create configDir/skills as a symlink pointing outside
fs.symlinkSync(outsideDir, path.join(configDir, 'skills'));
});
afterEach(() => {
try { fs.unlinkSync(path.join(configDir, 'skills')); } catch { /* already gone */ }
cleanup(configDir);
cleanup(outsideDir);
});
test('L1: migrateLegacyDevPreferencesToSkill throws when skills/ is a symlink pointing outside', () => {
const saved = new Map([['dev-preferences.md', '# dev prefs\n']]);
assert.throws(
() => migrateLegacyDevPreferencesToSkill(configDir, saved, 'opencode', 'global'),
(err) => {
assert.ok(err instanceof Error, 'must be an Error');
assert.ok(
err.message.toLowerCase().includes('symlink') ||
err.message.toLowerCase().includes('escap') ||
err.message.toLowerCase().includes('outside') ||
err.message.toLowerCase().includes('install root'),
`expected symlink/escape error in: ${err.message}`,
);
return true;
},
);
// Nothing must have been written outside
const outsideFiles = fs.readdirSync(outsideDir);
assert.strictEqual(outsideFiles.length, 0, 'must not have written anything outside configDir');
});
});
// ---------------------------------------------------------------------------
// L3: relative configDir support
// ---------------------------------------------------------------------------
describe('L3: assertDestWithinConfigHome handles relative configDir', () => {
test('L3: throws when relative configDir + escaping destSubpath resolves outside', () => {
// path.resolve handles relative roots; '../../etc' from '.' would escape
assert.throws(
() => assertDestWithinConfigHome('.', '../../etc'),
(err) => {
assert.ok(err instanceof Error, 'must be an Error');
assert.ok(
err.message.includes('escapes configHome') || err.message.includes('outside'),
`expected escape error in: ${err.message}`,
);
return true;
},
);
});
test('L3: throws when "." destSubpath resolves to the relative configDir itself', () => {
// '.' resolves to the same directory as the configDir — must be rejected (F3)
assert.throws(
() => assertDestWithinConfigHome('.', '.'),
/escapes configHome|not configHome itself/,
);
});
test('L3: accepts "skills" under relative "./somedir" and returns absolute path', () => {
const tmpBase = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-l3-'));
const relDir = path.relative(process.cwd(), tmpBase);
try {
const result = assertDestWithinConfigHome(relDir, 'skills');
const expectedBase = path.resolve(relDir);
assert.ok(
result.startsWith(expectedBase + path.sep),
`result (${result}) must be under resolved relDir (${expectedBase})`,
);
assert.strictEqual(result, path.join(expectedBase, 'skills'));
} finally {
fs.rmdirSync(tmpBase);
}
});
});
// ---------------------------------------------------------------------------
// N1: sibling-prefix NEGATIVE assertion
// ---------------------------------------------------------------------------
describe('N1: sibling directory with shared prefix is rejected', () => {
test('N1: rejects sibling path sharing a prefix with configDir', () => {
// /tmp/gsd-foobar is NOT inside /tmp/gsd-foo — must throw despite the
// startsWith prefix overlap at the string level (the sep-check prevents it).
assert.throws(
() => assertDestWithinConfigHome('/tmp/gsd-foo', '../gsd-foobar'),
(err) => {
assert.ok(err instanceof Error, 'must be an Error');
assert.ok(
err.message.includes('escapes configHome') || err.message.includes('outside'),
`expected confinement error in: ${err.message}`,
);
return true;
},
);
});
test('N1: accepts a true child subpath inside configDir', () => {
// 'bar' appended INSIDE /tmp/gsd-foo => the child path — accepted.
// Compute expected via path.resolve (the same primitive the helper uses) so
// the assertion is platform-portable: on Windows path.resolve prepends the
// cwd drive (C:\...) and uses backslashes, which a hardcoded posix literal /
// path.join (no drive) would not match (#1679 Windows-CI portability).
const root = path.resolve('/tmp/gsd-foo');
const result = assertDestWithinConfigHome('/tmp/gsd-foo', 'bar');
assert.strictEqual(result, path.resolve('/tmp/gsd-foo', 'bar'));
assert.ok(result.startsWith(root + path.sep));
});
test('N1: the accepted child does not imply the sibling is accepted', () => {
// Double-check: 'bar' inside is fine, but '../gsd-foobar' (the sibling) is not.
// 'bar' resolves to /tmp/gsd-foo/bar ✓
assert.doesNotThrow(() => assertDestWithinConfigHome('/tmp/gsd-foo', 'bar'));
// '../gsd-foobar' resolves to /tmp/gsd-foobar — NOT inside /tmp/gsd-foo
assert.throws(
() => assertDestWithinConfigHome('/tmp/gsd-foo', '../gsd-foobar'),
/escapes configHome/,
);
});
});
// ---------------------------------------------------------------------------
// N3: Windows-separator coverage (structural guard using path.win32)
// ---------------------------------------------------------------------------
describe('N3: Windows-separator confinement logic (path.win32 semantics)', () => {
/**
* Replicate the assertDestWithinConfigHome predicate using path.win32
* so we can test the sep-guard logic on any platform.
*
* This mirrors the implementation in runtime-artifact-install-plan.cjs
* but forces win32 path semantics.
*/
function assertDestWithinConfigHomeWin32(configDir, destSubpath) {
if (destSubpath.includes('\0')) {
throw new Error(`destSubpath "${destSubpath}" contains a NUL byte and is not valid`);
}
const root = path.win32.resolve(configDir);
const resolved = path.win32.resolve(configDir, destSubpath);
if (resolved === root || !resolved.startsWith(root + path.win32.sep)) {
throw new Error(
`destSubpath "${destSubpath}" must be a strict subpath of configHome "${configDir}" — not configHome itself or outside it (escapes configHome)`,
);
}
return resolved;
}
const winRoot = 'C:\\Users\\me\\.claude';
test('N3: rejects ..\\..\\Windows (Windows backslash traversal)', () => {
assert.throws(
() => assertDestWithinConfigHomeWin32(winRoot, '..\\..\\Windows'),
/escapes configHome/,
);
});
test('N3: rejects mixed ../..\\x traversal', () => {
assert.throws(
() => assertDestWithinConfigHomeWin32(winRoot, '../..\\x'),
/escapes configHome/,
);
});
test('N3: rejects "." that resolves to configHome itself', () => {
assert.throws(
() => assertDestWithinConfigHomeWin32(winRoot, '.'),
/escapes configHome/,
);
});
test('N3: accepts "skills" under Windows root', () => {
const result = assertDestWithinConfigHomeWin32(winRoot, 'skills');
assert.strictEqual(result, path.win32.join(winRoot, 'skills'));
assert.ok(result.startsWith(winRoot + path.win32.sep));
});
test('N3: accepts "commands\\gsd" (Windows nested path) under Windows root', () => {
const result = assertDestWithinConfigHomeWin32(winRoot, 'commands\\gsd');
assert.strictEqual(result, path.win32.join(winRoot, 'commands', 'gsd'));
assert.ok(result.startsWith(winRoot + path.win32.sep));
});
test('N3: rejects sibling C:\\Users\\me\\.claude-extra under win32 semantics', () => {
assert.throws(
() => assertDestWithinConfigHomeWin32(winRoot, '..\\.claude-extra'),
/escapes configHome/,
);
});
});

View File

@@ -0,0 +1,403 @@
{
".gsd-profile": "0e716a5fef4e6dc1",
".gsd/defaults.json": "560664b045e645cb",
"agents/gsd-advisor-researcher.md": "a281144575a6dc09",
"agents/gsd-ai-researcher.md": "bb91690281b7ea44",
"agents/gsd-assumptions-analyzer.md": "e2e0ad497cedd460",
"agents/gsd-code-fixer.md": "5b688699cecbb3a8",
"agents/gsd-code-reviewer.md": "0d4c658a2fec15a7",
"agents/gsd-codebase-mapper.md": "e26b6aeb89836631",
"agents/gsd-debug-session-manager.md": "88a3726efbc28eed",
"agents/gsd-debugger.md": "ba550c0c2f51679e",
"agents/gsd-doc-classifier.md": "6dde566846b268b0",
"agents/gsd-doc-synthesizer.md": "6286afdbd9a74fe0",
"agents/gsd-doc-verifier.md": "888c6ac870cb91a6",
"agents/gsd-doc-writer.md": "f1581580739a7a36",
"agents/gsd-domain-researcher.md": "1db46cac3f4d9889",
"agents/gsd-eval-auditor.md": "3b89138f0f573739",
"agents/gsd-eval-planner.md": "3d10fd11147f6857",
"agents/gsd-executor.md": "2ddfb93dd7b80f20",
"agents/gsd-framework-selector.md": "daa62c79619c76bf",
"agents/gsd-integration-checker.md": "e3f0c93ce7e93f36",
"agents/gsd-intel-updater.md": "c2a053ffbe79cc74",
"agents/gsd-mempalace-curator.md": "a7269018acb973ce",
"agents/gsd-nyquist-auditor.md": "bac98abeecf6530f",
"agents/gsd-pattern-mapper.md": "e62ee90d39084802",
"agents/gsd-phase-researcher.md": "bbe33441c3979e75",
"agents/gsd-plan-checker.md": "20c36e148de1ba7a",
"agents/gsd-planner.md": "2c2b8eb93d8e03c1",
"agents/gsd-project-researcher.md": "b53b3e44fafe4cb0",
"agents/gsd-research-synthesizer.md": "f9cc330e679d5def",
"agents/gsd-roadmapper.md": "8c3748caf7cd57d7",
"agents/gsd-security-auditor.md": "c4913863961b0dcf",
"agents/gsd-ui-auditor.md": "f09aef81bfcfd412",
"agents/gsd-ui-checker.md": "dbbe694a26265473",
"agents/gsd-ui-researcher.md": "8c7e91c85e7099f5",
"agents/gsd-user-profiler.md": "25d65f6458454764",
"agents/gsd-verifier.md": "2a64590bb09e21e6",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/gsd-tools.cjs": "46deb2174be356dd",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"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",
"gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4",
"gsd-core/bin/verify-reapply-patches.cjs": "8bc541aabc2e143c",
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
"gsd-core/contexts/review.md": "dc578fdd74bbea11",
"gsd-core/references/agent-contracts.md": "ff65e633c656c0d2",
"gsd-core/references/ai-evals.md": "b5afa786b938671e",
"gsd-core/references/ai-frameworks.md": "425dd69c629230e7",
"gsd-core/references/artifact-types.md": "e176817364a7cbf4",
"gsd-core/references/autonomous-smart-discuss.md": "efd80aca449032ad",
"gsd-core/references/checkpoints.md": "2de680837faa9752",
"gsd-core/references/common-bug-patterns.md": "780145be56352626",
"gsd-core/references/context-budget.md": "177520ead2ae3a23",
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
"gsd-core/references/debugger-philosophy.md": "1cb61d4565081c88",
"gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474",
"gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e",
"gsd-core/references/domain-probes.md": "762b965e84035b72",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/requirements.json": "fbc1b355d8625eeb",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json": "66dd60957fee45f0",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json": "47fca61f076835fa",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/requirements.json": "80f04f5c04fb24cf",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json": "d38147adb0e5b342",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json": "bc552c01939bf4f8",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json": "688ec62c13e08afe",
"gsd-core/references/edge-probe.md": "89c8d04ce0d31d0d",
"gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc",
"gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e",
"gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e",
"gsd-core/references/execute-phase-wave-guard.md": "826cf9315e592a1d",
"gsd-core/references/executor-examples.md": "ba59243ed45c8ab1",
"gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4",
"gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8",
"gsd-core/references/gate-prompts.md": "43e867720e736464",
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "9e6076a137f9e156",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
"gsd-core/references/model-profile-resolution.md": "de81380316d8a37f",
"gsd-core/references/model-profiles.md": "9e160d4e754b6b9e",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "2459c40bfc8a0ea8",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
"gsd-core/references/planner-guidance.md": "a6a2435b0e5b2871",
"gsd-core/references/planner-human-verify-mode.md": "676e43b03af6b25b",
"gsd-core/references/planner-interface-context.md": "b28fa3da6ae739a8",
"gsd-core/references/planner-load-graph-context.md": "90cb2ecd1f3eb4d8",
"gsd-core/references/planner-mvp-mode.md": "343b859a60bcd15e",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "8ce19741d18507f7",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
"gsd-core/references/prohibition-probe.md": "e1cf3b27e936e07d",
"gsd-core/references/project-skills-discovery.md": "d8701bc00a470923",
"gsd-core/references/questioning.md": "8f26dfe5794b1e6e",
"gsd-core/references/research-documentation-lookup.md": "c070007d1d72ab71",
"gsd-core/references/research-philosophy.md": "a602b41bfa081fdf",
"gsd-core/references/research-verification-protocol.md": "9c38c9d9a687e679",
"gsd-core/references/revision-loop.md": "e55ff32dd98c63df",
"gsd-core/references/scout-codebase.md": "ba266ecc18fbf172",
"gsd-core/references/security-asvs-levels.md": "4774fac3b94b6ca8",
"gsd-core/references/skeleton-template.md": "528691d1f0efa878",
"gsd-core/references/sketch-interactivity.md": "7d982fe877e1e1cc",
"gsd-core/references/sketch-theme-system.md": "33e2e96e450456f8",
"gsd-core/references/sketch-tooling.md": "df6c4f24c1c27611",
"gsd-core/references/sketch-variant-patterns.md": "66c197aa4fb52810",
"gsd-core/references/spidr-splitting.md": "074ac154c0e4f906",
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
"gsd-core/references/ui-brand.md": "48717bcfcd63bd27",
"gsd-core/references/universal-anti-patterns.md": "6a1245050b21df01",
"gsd-core/references/untrusted-input-boundary.md": "d33b80d4d348599a",
"gsd-core/references/user-profiling.md": "8e023a908d968af1",
"gsd-core/references/user-story-template.md": "0cc50e06a144ff8a",
"gsd-core/references/verification-overrides.md": "a3e2d5166d16a37b",
"gsd-core/references/verification-patterns.md": "de7ebb43dea1d20f",
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
"gsd-core/references/workstream-flag.md": "225910640adbb76d",
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
"gsd-core/templates/DEBUG.md": "a2eea97e7f1336bf",
"gsd-core/templates/README.md": "28160dd8b0631652",
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
"gsd-core/templates/UI-SPEC.md": "20ca56a4e3e21f01",
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
"gsd-core/templates/claude-md.md": "8797c0c7da927c8e",
"gsd-core/templates/codebase/architecture.md": "282db635ba093b1a",
"gsd-core/templates/codebase/concerns.md": "e66c584daa636fc5",
"gsd-core/templates/codebase/conventions.md": "c5f0324730852701",
"gsd-core/templates/codebase/integrations.md": "39bd23c71eedd564",
"gsd-core/templates/codebase/stack.md": "116e7e67dd87ddec",
"gsd-core/templates/codebase/structure.md": "6c505bdf5af338c8",
"gsd-core/templates/codebase/testing.md": "76abff7f2050c9ea",
"gsd-core/templates/config.json": "1473dff11272d3c4",
"gsd-core/templates/context.md": "593d4e6d20fdde7c",
"gsd-core/templates/continue-here.md": "8b1dce4832c7922b",
"gsd-core/templates/copilot-instructions.md": "aea34bc52ff548ea",
"gsd-core/templates/debug-subagent-prompt.md": "8c18a89e25929d8e",
"gsd-core/templates/dev-preferences.md": "95048a71063d980b",
"gsd-core/templates/discovery.md": "e4ab738326eb70e0",
"gsd-core/templates/discussion-log.md": "da4e8e266efdc6c2",
"gsd-core/templates/milestone-archive.md": "591b6decdc0c0e51",
"gsd-core/templates/milestone.md": "74d2f750ae9f4a9c",
"gsd-core/templates/phase-prompt.md": "31f627d456ab14b0",
"gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f",
"gsd-core/templates/project.md": "e4a3b331be081e62",
"gsd-core/templates/requirements.md": "a44de4c2f146e473",
"gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0",
"gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f",
"gsd-core/templates/research-project/PITFALLS.md": "3ef75fa768422eec",
"gsd-core/templates/research-project/STACK.md": "82c85799ac4dd344",
"gsd-core/templates/research-project/SUMMARY.md": "dceb2f346388839d",
"gsd-core/templates/research.md": "b454f96fdf8b1d3d",
"gsd-core/templates/retrospective.md": "03981e30dd760103",
"gsd-core/templates/roadmap.md": "e4e35a9eb5dd4d4f",
"gsd-core/templates/spec.md": "8734f0df4df3a34b",
"gsd-core/templates/state.md": "a45a134631efe3f9",
"gsd-core/templates/summary-complex.md": "a5e40574fd8894dc",
"gsd-core/templates/summary-minimal.md": "7d09b5e709e2e67c",
"gsd-core/templates/summary-standard.md": "e8d9cf4a8377cdff",
"gsd-core/templates/summary.md": "23c40f6503b3ea98",
"gsd-core/templates/user-profile.md": "52abe2af968e8533",
"gsd-core/templates/user-setup.md": "1da2382725db080f",
"gsd-core/templates/verification-report.md": "78ab9264ce63ed7e",
"gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb",
"gsd-core/workflows/add-backlog.md": "a2d025013d8ef7fd",
"gsd-core/workflows/add-phase.md": "b619b3402c1e95db",
"gsd-core/workflows/add-tests.md": "206ccd9c8f25fac9",
"gsd-core/workflows/add-todo.md": "a995f9f4b11fcf23",
"gsd-core/workflows/ai-integration-phase.md": "f2fefee40ec7413c",
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
"gsd-core/workflows/audit-fix.md": "9787a0ef00be649c",
"gsd-core/workflows/audit-milestone.md": "5e73ad8112a9b9b4",
"gsd-core/workflows/audit-uat.md": "777262a63dcaacdc",
"gsd-core/workflows/autonomous.md": "f145bbc649fd8aa6",
"gsd-core/workflows/check-todos.md": "f6a93906922dd939",
"gsd-core/workflows/cleanup.md": "53aa20672fe253bd",
"gsd-core/workflows/code-review-fix.md": "715d98a6ff5931e2",
"gsd-core/workflows/code-review.md": "d3d22e8705ab8323",
"gsd-core/workflows/complete-milestone.md": "74ca982730c7d735",
"gsd-core/workflows/debug.md": "5ec71cc100973523",
"gsd-core/workflows/diagnose-issues.md": "4d80e23ab8adf2d7",
"gsd-core/workflows/discovery-phase.md": "3de990caffdde4f8",
"gsd-core/workflows/discuss-phase-assumptions.md": "5758ef496180a20c",
"gsd-core/workflows/discuss-phase-power.md": "5c0d1ca6abda0383",
"gsd-core/workflows/discuss-phase.md": "19659f106fa0f53e",
"gsd-core/workflows/discuss-phase/modes/advisor.md": "47ec4454046099c6",
"gsd-core/workflows/discuss-phase/modes/all.md": "e5fe9c9c1e2bec1a",
"gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105",
"gsd-core/workflows/discuss-phase/modes/auto.md": "5256d93dca08278e",
"gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448",
"gsd-core/workflows/discuss-phase/modes/chain.md": "3a90a0c95016f7c5",
"gsd-core/workflows/discuss-phase/modes/default.md": "4c5ba5975dcc1e9c",
"gsd-core/workflows/discuss-phase/modes/power.md": "96822b22c42d75e8",
"gsd-core/workflows/discuss-phase/modes/text.md": "c384c22ffff4dc02",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "2b56ec2868cbddb4",
"gsd-core/workflows/do.md": "ecf6a2ae3c27c2af",
"gsd-core/workflows/docs-update.md": "1c3a0d23ecc9605c",
"gsd-core/workflows/edit-phase.md": "f685fb7063616826",
"gsd-core/workflows/eval-review.md": "2da6215ce79b2f7c",
"gsd-core/workflows/execute-phase.md": "aae2c741af3e6526",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "1da22ba32f524c6e",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "bb9113e7bf953797",
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
"gsd-core/workflows/execute-plan.md": "7a8c667c3587a985",
"gsd-core/workflows/explore.md": "d9593c9f00250e53",
"gsd-core/workflows/extract-learnings.md": "caa2ff0160b6ed9c",
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
"gsd-core/workflows/forensics.md": "c32971f6b9d61ed8",
"gsd-core/workflows/graduation.md": "b401418dfea2b0f5",
"gsd-core/workflows/health.md": "3ab04acb14942ddd",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495",
"gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa",
"gsd-core/workflows/help/modes/full.md": "200a42681ef05a29",
"gsd-core/workflows/help/modes/topic.md": "a404990fcf2d7df7",
"gsd-core/workflows/import.md": "3cbe85643922fd3b",
"gsd-core/workflows/inbox.md": "a448220c548f27bc",
"gsd-core/workflows/ingest-docs.md": "783e0380797478cc",
"gsd-core/workflows/insert-phase.md": "d48c4aa1e864c852",
"gsd-core/workflows/list-phase-assumptions.md": "e7b5e35c9452e3b3",
"gsd-core/workflows/list-seeds.md": "084c87cd310119b2",
"gsd-core/workflows/list-workspaces.md": "69aa6dcd8f63bb8a",
"gsd-core/workflows/manager.md": "187e2df237bcf418",
"gsd-core/workflows/map-codebase.md": "ea0ad99dd10c3d1c",
"gsd-core/workflows/milestone-summary.md": "6af78ebf0ba7546b",
"gsd-core/workflows/mvp-phase.md": "cd39027462579233",
"gsd-core/workflows/new-milestone.md": "5abba9fb6c9c3252",
"gsd-core/workflows/new-project.md": "b8dc0226e885ea9c",
"gsd-core/workflows/new-workspace.md": "70dec4f25df02d64",
"gsd-core/workflows/next.md": "c45606fc89965aed",
"gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b",
"gsd-core/workflows/note.md": "3ce09c0aa0a20599",
"gsd-core/workflows/pause-work.md": "3196d681d4dd8c71",
"gsd-core/workflows/plan-milestone-gaps.md": "94b193dfc9ca3681",
"gsd-core/workflows/plan-phase.md": "d99fb8159a2db1a9",
"gsd-core/workflows/plan-review-convergence.md": "b1623082557cdca5",
"gsd-core/workflows/plant-seed.md": "1fb45cd49f66f572",
"gsd-core/workflows/pr-branch.md": "c8fd9fa250cb39fd",
"gsd-core/workflows/profile-user.md": "7b894598e26133b2",
"gsd-core/workflows/progress.md": "6087275a7ef3d84f",
"gsd-core/workflows/quick.md": "99feafd49e32e387",
"gsd-core/workflows/reapply-patches.md": "825e37a55a992892",
"gsd-core/workflows/remove-phase.md": "6b9947fba1a97f46",
"gsd-core/workflows/remove-workspace.md": "95f05defffe6754e",
"gsd-core/workflows/resume-project.md": "cadf390bae95fc76",
"gsd-core/workflows/review.md": "439d0088fbc29350",
"gsd-core/workflows/scan.md": "f2754f3e3ea528ff",
"gsd-core/workflows/secure-phase.md": "78705b7f09612464",
"gsd-core/workflows/session-report.md": "2e5b1205324ddefa",
"gsd-core/workflows/settings-advanced.md": "e48b1dd7b6905572",
"gsd-core/workflows/settings-integrations.md": "83360968c4436bd1",
"gsd-core/workflows/settings.md": "a107a377ddeffed7",
"gsd-core/workflows/ship.md": "438fbd3ec509c1f1",
"gsd-core/workflows/sketch-wrap-up.md": "ab9fbb7371ef36bf",
"gsd-core/workflows/sketch.md": "114ca2455c2eb6fc",
"gsd-core/workflows/spec-phase.md": "5d6f0c480c0b251d",
"gsd-core/workflows/spike-wrap-up.md": "e2f251b7c8bfa2b2",
"gsd-core/workflows/spike.md": "0f9a81bcf4573195",
"gsd-core/workflows/stats.md": "a20eb078d2ab11be",
"gsd-core/workflows/sync-skills.md": "8326a7ff0411b077",
"gsd-core/workflows/thread.md": "03a527a71b8fab12",
"gsd-core/workflows/transition.md": "a7a5fe4040084308",
"gsd-core/workflows/ui-phase.md": "652785fbba26e80c",
"gsd-core/workflows/ui-review.md": "816b2bde136157f9",
"gsd-core/workflows/ultraplan-phase.md": "2404a01cb2e0c450",
"gsd-core/workflows/undo.md": "6ab639d1fc7e0721",
"gsd-core/workflows/update.md": "dc93f366e2156e37",
"gsd-core/workflows/validate-phase.md": "5bac28c71d21c740",
"gsd-core/workflows/verify-phase.md": "1c6a2e1128966675",
"gsd-core/workflows/verify-work.md": "dd7f78f947b86976",
"hooks/gsd-check-update-worker.js": "668c24ea284ff623",
"hooks/gsd-check-update.js": "7e42f76b2bcdd764",
"hooks/gsd-config-reload.js": "17bf778d432b3d2a",
"hooks/gsd-context-monitor.js": "ead852d2b4ddb92a",
"hooks/gsd-cursor-post-tool.js": "d61ee04f6ee7858c",
"hooks/gsd-cursor-session-start.js": "148b8ec4e2c97f00",
"hooks/gsd-ensure-canonical-path.js": "83e02e841e123037",
"hooks/gsd-graphify-update.sh": "396ebda3c6705dc9",
"hooks/gsd-phase-boundary.sh": "6aa3ba9af3d465d9",
"hooks/gsd-prompt-guard.js": "4b08c2dce0233e2d",
"hooks/gsd-read-guard.js": "b602f88f046a7551",
"hooks/gsd-read-injection-scanner.js": "d17d30e2b1a42582",
"hooks/gsd-session-state.sh": "b1496e6a5204a6df",
"hooks/gsd-statusline.js": "c3ceac8122b2c3ed",
"hooks/gsd-update-banner.js": "74817c820b7a4ec1",
"hooks/gsd-validate-commit.sh": "14d3d966c74dc310",
"hooks/gsd-workflow-guard.js": "e22b9fb57f0e64f6",
"hooks/gsd-worktree-path-guard.js": "25969c741edaf032",
"hooks/lib/git-cmd.js": "268ba15992ca0b23",
"hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
"hooks/managed-hooks-registry.cjs": "45b2431992d3d7d2",
"package.json": "dbf8353f77358bc1",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",
"scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
"scripts/changeset/lint.cjs": "0066faed159154f0",
"scripts/changeset/new.cjs": "4991e21fd17f5541",
"scripts/changeset/parse.cjs": "f9a949cbcab56445",
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
"skills/gsd-add-tests/SKILL.md": "95cd3eb1698fc79b",
"skills/gsd-ai-integration-phase/SKILL.md": "0dc87ce16bc31884",
"skills/gsd-audit-fix/SKILL.md": "e5e30c307bca6c89",
"skills/gsd-audit-milestone/SKILL.md": "f701c229ac380077",
"skills/gsd-audit-uat/SKILL.md": "8b304b54e1c587d1",
"skills/gsd-autonomous/SKILL.md": "5610d6fceff3774e",
"skills/gsd-capture/SKILL.md": "c554bbadc3885b8f",
"skills/gsd-cleanup/SKILL.md": "c3ed4f3abf6945b6",
"skills/gsd-code-review/SKILL.md": "9aa941f7cfa5f185",
"skills/gsd-complete-milestone/SKILL.md": "169568f9004be781",
"skills/gsd-config/SKILL.md": "4b099e45ec600133",
"skills/gsd-debug/SKILL.md": "168a98458c3b41db",
"skills/gsd-discuss-phase/SKILL.md": "3fb922bfac348f8d",
"skills/gsd-docs-update/SKILL.md": "b50b433dfe6208ef",
"skills/gsd-eval-review/SKILL.md": "32bb1f952e4b905e",
"skills/gsd-execute-phase/SKILL.md": "eddbad8efb90ab66",
"skills/gsd-explore/SKILL.md": "8e3a822f314389af",
"skills/gsd-extract-learnings/SKILL.md": "1d913b8cecc42506",
"skills/gsd-fast/SKILL.md": "d62c1699462f6e74",
"skills/gsd-forensics/SKILL.md": "352bd1d8b4c26c3b",
"skills/gsd-graphify/SKILL.md": "5b812b9ed52f8d9a",
"skills/gsd-health/SKILL.md": "9acfbd91df231ada",
"skills/gsd-help/SKILL.md": "75a119a393b6c65b",
"skills/gsd-import/SKILL.md": "72f38b97d8397dba",
"skills/gsd-inbox/SKILL.md": "4ec0198966ac4f7d",
"skills/gsd-ingest-docs/SKILL.md": "f4e43968af317ed8",
"skills/gsd-manager/SKILL.md": "6e51785860784d8c",
"skills/gsd-map-codebase/SKILL.md": "e10431a9386c6aec",
"skills/gsd-mempalace-capture/SKILL.md": "5647f915e5c85482",
"skills/gsd-mempalace-recall/SKILL.md": "d41523e659d1920f",
"skills/gsd-milestone-summary/SKILL.md": "2955ab3e3a444ca3",
"skills/gsd-mvp-phase/SKILL.md": "1cf7622d655840ac",
"skills/gsd-new-milestone/SKILL.md": "f97a28dd1e2b9317",
"skills/gsd-new-project/SKILL.md": "31b46764278d1c1a",
"skills/gsd-ns-context/SKILL.md": "e791bc60e4cf124e",
"skills/gsd-ns-ideate/SKILL.md": "b85f270e8415f595",
"skills/gsd-ns-manage/SKILL.md": "d55c53b5b0513033",
"skills/gsd-ns-project/SKILL.md": "64844073a6115c45",
"skills/gsd-ns-review/SKILL.md": "2e30158e112d173c",
"skills/gsd-ns-workflow/SKILL.md": "79373d30cd17ed49",
"skills/gsd-pause-work/SKILL.md": "9d3cc6bd70b03df1",
"skills/gsd-phase/SKILL.md": "00676bbea61410bf",
"skills/gsd-plan-phase/SKILL.md": "168046ccf9702532",
"skills/gsd-plan-review-convergence/SKILL.md": "af6ed50b242c64b7",
"skills/gsd-pr-branch/SKILL.md": "5e050db73988f9a8",
"skills/gsd-profile-user/SKILL.md": "10f2ff4be2e7d55f",
"skills/gsd-progress/SKILL.md": "df0d06cf9d5963d0",
"skills/gsd-quick/SKILL.md": "c18b11b12ba134fa",
"skills/gsd-resume-work/SKILL.md": "fa2ee37470c6ae07",
"skills/gsd-review-backlog/SKILL.md": "d8a150558cc9326a",
"skills/gsd-review/SKILL.md": "f9b5e25043b667ac",
"skills/gsd-secure-phase/SKILL.md": "47a4ecd2aa680fda",
"skills/gsd-settings/SKILL.md": "fda7af8331acd352",
"skills/gsd-ship/SKILL.md": "4529b04a357cdacd",
"skills/gsd-sketch/SKILL.md": "eea837cc70ef1238",
"skills/gsd-spec-phase/SKILL.md": "6b35d59f65e2e607",
"skills/gsd-spike/SKILL.md": "63b5093cbc7978ca",
"skills/gsd-stats/SKILL.md": "1cef40c0a0e7b19b",
"skills/gsd-surface/SKILL.md": "963aa5a09d8e3695",
"skills/gsd-thread/SKILL.md": "4d91aab9f5ed4ca7",
"skills/gsd-ui-phase/SKILL.md": "b2412418ebf0dfb8",
"skills/gsd-ui-review/SKILL.md": "e49734488684fd9a",
"skills/gsd-ultraplan-phase/SKILL.md": "c71b716028d9ca24",
"skills/gsd-undo/SKILL.md": "c03cd1ab3c78cec4",
"skills/gsd-update/SKILL.md": "536ee29e2c205cdd",
"skills/gsd-validate-phase/SKILL.md": "4c9058e7240bc28b",
"skills/gsd-verify-work/SKILL.md": "82bd049e7ea36a5a",
"skills/gsd-workspace/SKILL.md": "f0d1512b46227344",
"skills/gsd-workstreams/SKILL.md": "737841783c7fdd4f"
}

View File

@@ -0,0 +1,473 @@
{
".gsd-profile": "0e716a5fef4e6dc1",
".gsd/defaults.json": "560664b045e645cb",
"agents/gsd-advisor-researcher.md": "7dfdadd98ec1cccc",
"agents/gsd-ai-researcher.md": "b5e0e3ec6ffffed0",
"agents/gsd-assumptions-analyzer.md": "dc5e9973ff0740d7",
"agents/gsd-code-fixer.md": "88482f4ae6550082",
"agents/gsd-code-reviewer.md": "c96795dcb3072466",
"agents/gsd-codebase-mapper.md": "57432984d78ad147",
"agents/gsd-debug-session-manager.md": "69fe2698d5a997c6",
"agents/gsd-debugger.md": "6fb189777b25c9f0",
"agents/gsd-doc-classifier.md": "f61cb0fad0d4f243",
"agents/gsd-doc-synthesizer.md": "043847ebefbb9b7c",
"agents/gsd-doc-verifier.md": "b3433e0db51e1c60",
"agents/gsd-doc-writer.md": "ac68cddd32591ca3",
"agents/gsd-domain-researcher.md": "671c9ea949889c4a",
"agents/gsd-eval-auditor.md": "5b37acd7d551a166",
"agents/gsd-eval-planner.md": "a4a5b4b3f7828ba3",
"agents/gsd-executor.md": "1e64e29a5a6627e4",
"agents/gsd-framework-selector.md": "4b77eebbe9288d80",
"agents/gsd-integration-checker.md": "f6a85843ce7160bd",
"agents/gsd-intel-updater.md": "f8ac501c61557a17",
"agents/gsd-mempalace-curator.md": "63676937f8970bf3",
"agents/gsd-nyquist-auditor.md": "4b04783b66dc87d5",
"agents/gsd-pattern-mapper.md": "43c6021cf7caabfa",
"agents/gsd-phase-researcher.md": "612c14156eb2bc7e",
"agents/gsd-plan-checker.md": "9897ddeef3f85f08",
"agents/gsd-planner.md": "9a6a34c04282c471",
"agents/gsd-project-researcher.md": "d381c3efdbc90143",
"agents/gsd-research-synthesizer.md": "76913d1fefa9017e",
"agents/gsd-roadmapper.md": "33361cec9e3e0da1",
"agents/gsd-security-auditor.md": "91f42f9b3c811499",
"agents/gsd-ui-auditor.md": "fe8e959f969e7d92",
"agents/gsd-ui-checker.md": "4cf947a98db6410e",
"agents/gsd-ui-researcher.md": "3f8646572e9c3ec1",
"agents/gsd-user-profiler.md": "622220df0654b6bf",
"agents/gsd-verifier.md": "b1108277a4e858e3",
"commands/gsd-add-tests.md": "3608d0cf4b515103",
"commands/gsd-ai-integration-phase.md": "70843d4904743f7e",
"commands/gsd-audit-fix.md": "1b805946362c4f19",
"commands/gsd-audit-milestone.md": "046573a643714178",
"commands/gsd-audit-uat.md": "d3de44d1c3e59b57",
"commands/gsd-autonomous.md": "44598590349df325",
"commands/gsd-capture.md": "a4e4537bae4c90d3",
"commands/gsd-cleanup.md": "313e0443e1ae1557",
"commands/gsd-code-review.md": "1a32afb26a3a2926",
"commands/gsd-complete-milestone.md": "7f62fe57c67173fb",
"commands/gsd-config.md": "e00bef4533ce1648",
"commands/gsd-debug.md": "6ca109f930fe4b5a",
"commands/gsd-discuss-phase.md": "d5fc70a10ecf4c03",
"commands/gsd-docs-update.md": "58252664de1cc9d8",
"commands/gsd-eval-review.md": "b24d1b556dccf306",
"commands/gsd-execute-phase.md": "6db2b511bdfc7ee6",
"commands/gsd-explore.md": "cf09cdbd70a5320c",
"commands/gsd-extract-learnings.md": "46bfbbbb66207a43",
"commands/gsd-fast.md": "aceb53156d0dea5b",
"commands/gsd-forensics.md": "1be3c723d76f089a",
"commands/gsd-graphify.md": "ae5de1d629fcfa72",
"commands/gsd-health.md": "1a2707c6bc28c8fe",
"commands/gsd-help.md": "0d8c5a849465d771",
"commands/gsd-import.md": "5931425062f516ec",
"commands/gsd-inbox.md": "c218298db8b36e31",
"commands/gsd-ingest-docs.md": "6718b04c597a5428",
"commands/gsd-manager.md": "8f4ae79774902293",
"commands/gsd-map-codebase.md": "f3a06c4c7503f243",
"commands/gsd-mempalace-capture.md": "016a90f0eb7493ac",
"commands/gsd-mempalace-recall.md": "babb21998c7e6a6f",
"commands/gsd-milestone-summary.md": "ff5e11e6b33d4b5e",
"commands/gsd-mvp-phase.md": "ffc5905aed8f450a",
"commands/gsd-new-milestone.md": "e9ddaec1dd29d023",
"commands/gsd-new-project.md": "56552a324cff669e",
"commands/gsd-ns-context.md": "011c44e7aa46e64a",
"commands/gsd-ns-ideate.md": "edc5e543512dd48a",
"commands/gsd-ns-manage.md": "0409d810e499357f",
"commands/gsd-ns-project.md": "8dfd1b9a2ffe86ac",
"commands/gsd-ns-review.md": "3766ed10827882a0",
"commands/gsd-ns-workflow.md": "87910975ac92d103",
"commands/gsd-pause-work.md": "4fb032f72238fe33",
"commands/gsd-phase.md": "4920d15d779329eb",
"commands/gsd-plan-phase.md": "e74f3cb7a10cbb83",
"commands/gsd-plan-review-convergence.md": "3e4aff8f9ec6f8d8",
"commands/gsd-pr-branch.md": "e168fcd545d72d0d",
"commands/gsd-profile-user.md": "ffd9c2feb4c69f11",
"commands/gsd-progress.md": "0b4d5b73a6c5e958",
"commands/gsd-quick.md": "a6124a2443394092",
"commands/gsd-resume-work.md": "e54b929de88b11ce",
"commands/gsd-review-backlog.md": "6e8a0417fab95cd3",
"commands/gsd-review.md": "4403de207a9c2582",
"commands/gsd-secure-phase.md": "a2320ecca4cb160b",
"commands/gsd-settings.md": "53b90624a70fd530",
"commands/gsd-ship.md": "81136d903d261b33",
"commands/gsd-sketch.md": "0c44d54d15c8f96f",
"commands/gsd-spec-phase.md": "8bb332566911dfd9",
"commands/gsd-spike.md": "a99190d9496c6ac0",
"commands/gsd-stats.md": "58b4d86a5390e243",
"commands/gsd-surface.md": "acab871ec856e353",
"commands/gsd-thread.md": "51be0cdeb925ab28",
"commands/gsd-ui-phase.md": "75d4be44797ccef7",
"commands/gsd-ui-review.md": "9191082973068dbf",
"commands/gsd-ultraplan-phase.md": "a0cfcc5970e77341",
"commands/gsd-undo.md": "c62f376b4a0af5b1",
"commands/gsd-update.md": "bda7815908d9977b",
"commands/gsd-validate-phase.md": "948bdde83cc66341",
"commands/gsd-verify-work.md": "1cb62ea69b117acb",
"commands/gsd-workspace.md": "dd1bc09d2b768e0b",
"commands/gsd-workstreams.md": "52ab9c585d3a00f3",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/gsd-tools.cjs": "b7968e3e3af00249",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"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",
"gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4",
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
"gsd-core/contexts/review.md": "dc578fdd74bbea11",
"gsd-core/references/agent-contracts.md": "ff65e633c656c0d2",
"gsd-core/references/ai-evals.md": "b5afa786b938671e",
"gsd-core/references/ai-frameworks.md": "f827de93dde124eb",
"gsd-core/references/artifact-types.md": "a6d2e1f9453ffbf5",
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
"gsd-core/references/checkpoints.md": "6aa620c6ca38bdf0",
"gsd-core/references/common-bug-patterns.md": "780145be56352626",
"gsd-core/references/context-budget.md": "f1ce57bf418824af",
"gsd-core/references/continuation-format.md": "ce73e57d053ab8a7",
"gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3",
"gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474",
"gsd-core/references/doc-conflict-engine.md": "67d019d23e17f934",
"gsd-core/references/domain-probes.md": "62d23ed1992c48a9",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/requirements.json": "fbc1b355d8625eeb",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json": "66dd60957fee45f0",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json": "47fca61f076835fa",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/requirements.json": "80f04f5c04fb24cf",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json": "d38147adb0e5b342",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json": "bc552c01939bf4f8",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json": "688ec62c13e08afe",
"gsd-core/references/edge-probe.md": "5687eba25a078561",
"gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc",
"gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e",
"gsd-core/references/execute-phase-context-guard.md": "982006c1f3364242",
"gsd-core/references/execute-phase-wave-guard.md": "de9ac22cead4cfd8",
"gsd-core/references/executor-examples.md": "ba59243ed45c8ab1",
"gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4",
"gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8",
"gsd-core/references/gate-prompts.md": "e69f5993ab944d80",
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "77bf9dff38b2c9d4",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
"gsd-core/references/model-profile-resolution.md": "f32bb05102839767",
"gsd-core/references/model-profiles.md": "d3513252c5de5465",
"gsd-core/references/mvp-concepts.md": "72f7e8b1f8ae7118",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "6aeffd9097e25e22",
"gsd-core/references/planner-guidance.md": "96486cac2f7885e6",
"gsd-core/references/planner-human-verify-mode.md": "56d05e841630b3f4",
"gsd-core/references/planner-interface-context.md": "b28fa3da6ae739a8",
"gsd-core/references/planner-load-graph-context.md": "ca7a7af3f35ae61b",
"gsd-core/references/planner-mvp-mode.md": "ec33050db81101a8",
"gsd-core/references/planner-reviews.md": "dda0193a0fbd4947",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "1c3a3aae2ae89e83",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
"gsd-core/references/prohibition-probe.md": "605dc3f5a118ff3b",
"gsd-core/references/project-skills-discovery.md": "c155e03dce8dc3c2",
"gsd-core/references/questioning.md": "a8c988cab05f4651",
"gsd-core/references/research-documentation-lookup.md": "c070007d1d72ab71",
"gsd-core/references/research-philosophy.md": "62930e66cc979c1a",
"gsd-core/references/research-verification-protocol.md": "9c38c9d9a687e679",
"gsd-core/references/revision-loop.md": "e55ff32dd98c63df",
"gsd-core/references/scout-codebase.md": "ba266ecc18fbf172",
"gsd-core/references/security-asvs-levels.md": "4774fac3b94b6ca8",
"gsd-core/references/skeleton-template.md": "528691d1f0efa878",
"gsd-core/references/sketch-interactivity.md": "7d982fe877e1e1cc",
"gsd-core/references/sketch-theme-system.md": "33e2e96e450456f8",
"gsd-core/references/sketch-tooling.md": "df6c4f24c1c27611",
"gsd-core/references/sketch-variant-patterns.md": "66c197aa4fb52810",
"gsd-core/references/spidr-splitting.md": "074ac154c0e4f906",
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "41069529ef776e39",
"gsd-core/references/ui-brand.md": "48717bcfcd63bd27",
"gsd-core/references/universal-anti-patterns.md": "6a1245050b21df01",
"gsd-core/references/untrusted-input-boundary.md": "d33b80d4d348599a",
"gsd-core/references/user-profiling.md": "b50416fe57c1b321",
"gsd-core/references/user-story-template.md": "0cc50e06a144ff8a",
"gsd-core/references/verification-overrides.md": "8213de9bd62283b6",
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
"gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5",
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
"gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b",
"gsd-core/templates/DEBUG.md": "a13470b82b1935e7",
"gsd-core/templates/README.md": "93d3426fc64e2c12",
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
"gsd-core/templates/UAT.md": "9e296471b97ebcec",
"gsd-core/templates/UI-SPEC.md": "20ca56a4e3e21f01",
"gsd-core/templates/VALIDATION.md": "f53e0ca061d3528e",
"gsd-core/templates/claude-md.md": "d1d333e4b963c0d2",
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
"gsd-core/templates/codebase/conventions.md": "c2e07698dad6b364",
"gsd-core/templates/codebase/integrations.md": "39bd23c71eedd564",
"gsd-core/templates/codebase/stack.md": "116e7e67dd87ddec",
"gsd-core/templates/codebase/structure.md": "222997133232a6f5",
"gsd-core/templates/codebase/testing.md": "76abff7f2050c9ea",
"gsd-core/templates/config.json": "1473dff11272d3c4",
"gsd-core/templates/context.md": "69b01e7909ea3f66",
"gsd-core/templates/continue-here.md": "f522a51b6895fba8",
"gsd-core/templates/copilot-instructions.md": "aea34bc52ff548ea",
"gsd-core/templates/debug-subagent-prompt.md": "920656683dedb869",
"gsd-core/templates/dev-preferences.md": "88d0a65ec0993a3a",
"gsd-core/templates/discovery.md": "9a0e0935cc825dbc",
"gsd-core/templates/discussion-log.md": "cac1b48ec0f4dcb8",
"gsd-core/templates/milestone-archive.md": "591b6decdc0c0e51",
"gsd-core/templates/milestone.md": "74d2f750ae9f4a9c",
"gsd-core/templates/phase-prompt.md": "b811bf951092df2f",
"gsd-core/templates/planner-subagent-prompt.md": "ebf29dbb27042370",
"gsd-core/templates/project.md": "ab4af6becca2bb23",
"gsd-core/templates/requirements.md": "a44de4c2f146e473",
"gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0",
"gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f",
"gsd-core/templates/research-project/PITFALLS.md": "3ef75fa768422eec",
"gsd-core/templates/research-project/STACK.md": "82c85799ac4dd344",
"gsd-core/templates/research-project/SUMMARY.md": "dceb2f346388839d",
"gsd-core/templates/research.md": "88ce0920417091d0",
"gsd-core/templates/retrospective.md": "03981e30dd760103",
"gsd-core/templates/roadmap.md": "e4e35a9eb5dd4d4f",
"gsd-core/templates/spec.md": "26d55bce940f0288",
"gsd-core/templates/state.md": "4d123aa6cea167fe",
"gsd-core/templates/summary-complex.md": "a5e40574fd8894dc",
"gsd-core/templates/summary-minimal.md": "7d09b5e709e2e67c",
"gsd-core/templates/summary-standard.md": "e8d9cf4a8377cdff",
"gsd-core/templates/summary.md": "23c40f6503b3ea98",
"gsd-core/templates/user-profile.md": "20749f23e4c413fc",
"gsd-core/templates/user-setup.md": "78b7d718b6e8d67c",
"gsd-core/templates/verification-report.md": "dd5faa6254183731",
"gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb",
"gsd-core/workflows/add-backlog.md": "1153d35058e3e24f",
"gsd-core/workflows/add-phase.md": "b98c2fc51cd123ba",
"gsd-core/workflows/add-tests.md": "2871f7e6409ba89e",
"gsd-core/workflows/add-todo.md": "3b913840c1f490b2",
"gsd-core/workflows/ai-integration-phase.md": "ad2ff20091d1c2c0",
"gsd-core/workflows/analyze-dependencies.md": "52942af10f140717",
"gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b",
"gsd-core/workflows/audit-milestone.md": "fe7185bb70eafdb9",
"gsd-core/workflows/audit-uat.md": "ca6f1f0ef174f793",
"gsd-core/workflows/autonomous.md": "ba6828223ba13c1f",
"gsd-core/workflows/check-todos.md": "1e3026abe782bd36",
"gsd-core/workflows/cleanup.md": "5cf0772521c192a4",
"gsd-core/workflows/code-review-fix.md": "b442c670f8c1fe93",
"gsd-core/workflows/code-review.md": "1bfa3bf542e30c5e",
"gsd-core/workflows/complete-milestone.md": "8a4cfb41a4de5a99",
"gsd-core/workflows/debug.md": "da62e7a62c113b29",
"gsd-core/workflows/diagnose-issues.md": "a5f15332b3833a80",
"gsd-core/workflows/discovery-phase.md": "3ba7cfb89fb1e761",
"gsd-core/workflows/discuss-phase-assumptions.md": "a365fdca7f7281ad",
"gsd-core/workflows/discuss-phase-power.md": "0841f7dc6e9a054a",
"gsd-core/workflows/discuss-phase.md": "b2538b3f8a15f7de",
"gsd-core/workflows/discuss-phase/modes/advisor.md": "c7d4a3ff91655d24",
"gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54",
"gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105",
"gsd-core/workflows/discuss-phase/modes/auto.md": "3333b280afd68321",
"gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448",
"gsd-core/workflows/discuss-phase/modes/chain.md": "ca3cc1ddfd19cd9d",
"gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966",
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
"gsd-core/workflows/discuss-phase/modes/text.md": "da6d45207da4a988",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
"gsd-core/workflows/do.md": "152e9c5c512f79cb",
"gsd-core/workflows/docs-update.md": "806ada831b961116",
"gsd-core/workflows/edit-phase.md": "e5624ac6e3f8bef5",
"gsd-core/workflows/eval-review.md": "dfcfb4f8ce031fae",
"gsd-core/workflows/execute-phase.md": "abe70d6b2776afd4",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "8898e0ea533cc643",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80",
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
"gsd-core/workflows/execute-plan.md": "502a2498f6b27e38",
"gsd-core/workflows/explore.md": "11523b829cc67c29",
"gsd-core/workflows/extract-learnings.md": "a2e4836abdeb1fdb",
"gsd-core/workflows/fast.md": "94136fb570d20a9d",
"gsd-core/workflows/forensics.md": "76bea6e254652c2c",
"gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b",
"gsd-core/workflows/health.md": "e3cb8ff4e01e9e53",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "5fe077fbbdb5d9f7",
"gsd-core/workflows/help/modes/default.md": "cc8ef97de634c995",
"gsd-core/workflows/help/modes/full.md": "39703b79d77bf691",
"gsd-core/workflows/help/modes/topic.md": "d7c60d488810fbd6",
"gsd-core/workflows/import.md": "97861d522319d56e",
"gsd-core/workflows/inbox.md": "437f981ef9ae7b26",
"gsd-core/workflows/ingest-docs.md": "77d9103d8d5432f3",
"gsd-core/workflows/insert-phase.md": "621f9e75725542b1",
"gsd-core/workflows/list-phase-assumptions.md": "53dd4b69536c1bc3",
"gsd-core/workflows/list-seeds.md": "0a466d04df300854",
"gsd-core/workflows/list-workspaces.md": "6e5c402000090d7b",
"gsd-core/workflows/manager.md": "a31f7e255dd7d01d",
"gsd-core/workflows/map-codebase.md": "582bddef590de9c6",
"gsd-core/workflows/milestone-summary.md": "f956783f7d063963",
"gsd-core/workflows/mvp-phase.md": "bfa668107be972ed",
"gsd-core/workflows/new-milestone.md": "6d07ca2fc7aec3a4",
"gsd-core/workflows/new-project.md": "e6855b300fcac71e",
"gsd-core/workflows/new-workspace.md": "fdd63a9adf030cb1",
"gsd-core/workflows/next.md": "48bd4b5d54f0d1f8",
"gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b",
"gsd-core/workflows/note.md": "5a99eb396c744619",
"gsd-core/workflows/pause-work.md": "7bcbdf27ba957c8b",
"gsd-core/workflows/plan-milestone-gaps.md": "02fee851c82e3b25",
"gsd-core/workflows/plan-phase.md": "fe6b786141eab878",
"gsd-core/workflows/plan-review-convergence.md": "10007f8382864bcd",
"gsd-core/workflows/plant-seed.md": "7b795d7a1b4c9f06",
"gsd-core/workflows/pr-branch.md": "f2a35833fe784a53",
"gsd-core/workflows/profile-user.md": "02bc967c299a0136",
"gsd-core/workflows/progress.md": "057699b34b6198f7",
"gsd-core/workflows/quick.md": "a7fdf2de3ae30c95",
"gsd-core/workflows/reapply-patches.md": "7915e40411490bbe",
"gsd-core/workflows/remove-phase.md": "d030f80ca0df4fa9",
"gsd-core/workflows/remove-workspace.md": "b8817a3a5907f5bc",
"gsd-core/workflows/resume-project.md": "b18b51fd15cbce95",
"gsd-core/workflows/review.md": "18ab093986814bb3",
"gsd-core/workflows/scan.md": "54ff1ff60041d065",
"gsd-core/workflows/secure-phase.md": "1d1c66ad9ea01bd2",
"gsd-core/workflows/session-report.md": "2e5b1205324ddefa",
"gsd-core/workflows/settings-advanced.md": "e7e50f99e4de3872",
"gsd-core/workflows/settings-integrations.md": "351c5a6d0d5e27ed",
"gsd-core/workflows/settings.md": "48d337eb7e3f141b",
"gsd-core/workflows/ship.md": "d26fb5d3e965642a",
"gsd-core/workflows/sketch-wrap-up.md": "c03f64e834b69540",
"gsd-core/workflows/sketch.md": "04e0758c1a58881e",
"gsd-core/workflows/spec-phase.md": "2aa0353147153776",
"gsd-core/workflows/spike-wrap-up.md": "c86e04a0feb220a5",
"gsd-core/workflows/spike.md": "53127654e77256bf",
"gsd-core/workflows/stats.md": "01c24349370a0e6d",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "c26ca43fdf928d46",
"gsd-core/workflows/transition.md": "eee3435817fab185",
"gsd-core/workflows/ui-phase.md": "e81783508b8b6819",
"gsd-core/workflows/ui-review.md": "1ad3654435000881",
"gsd-core/workflows/ultraplan-phase.md": "66c17ad2e555e262",
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
"gsd-core/workflows/update.md": "231e7c305b40c417",
"gsd-core/workflows/validate-phase.md": "50f37b705b6e44fb",
"gsd-core/workflows/verify-phase.md": "968d569ea4ef377f",
"gsd-core/workflows/verify-work.md": "6f9c666386cb6d7e",
"hooks/gsd-check-update-worker.js": "e42be7414a05e99d",
"hooks/gsd-check-update.js": "b3333951b2091807",
"hooks/gsd-config-reload.js": "17bf778d432b3d2a",
"hooks/gsd-context-monitor.js": "11e88809e2cdc331",
"hooks/gsd-cursor-post-tool.js": "d61ee04f6ee7858c",
"hooks/gsd-cursor-session-start.js": "148b8ec4e2c97f00",
"hooks/gsd-ensure-canonical-path.js": "3499b6e6b453dc59",
"hooks/gsd-graphify-update.sh": "396ebda3c6705dc9",
"hooks/gsd-phase-boundary.sh": "6aa3ba9af3d465d9",
"hooks/gsd-prompt-guard.js": "4b08c2dce0233e2d",
"hooks/gsd-read-guard.js": "b602f88f046a7551",
"hooks/gsd-read-injection-scanner.js": "ca99873d0bf8b4ba",
"hooks/gsd-session-state.sh": "b1496e6a5204a6df",
"hooks/gsd-statusline.js": "9b7005c36891671d",
"hooks/gsd-update-banner.js": "74817c820b7a4ec1",
"hooks/gsd-validate-commit.sh": "14d3d966c74dc310",
"hooks/gsd-workflow-guard.js": "e22b9fb57f0e64f6",
"hooks/gsd-worktree-path-guard.js": "7921523b20372a1e",
"hooks/lib/git-cmd.js": "268ba15992ca0b23",
"hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
"hooks/managed-hooks-registry.cjs": "f46a329fcfefa465",
"package.json": "dbf8353f77358bc1",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",
"scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
"scripts/changeset/lint.cjs": "0066faed159154f0",
"scripts/changeset/new.cjs": "4991e21fd17f5541",
"scripts/changeset/parse.cjs": "f9a949cbcab56445",
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
"skills/gsd-ns-context/SKILL.md": "90ff2716402f8f61",
"skills/gsd-ns-context/skills/docs-update/SKILL.md": "e7ab14a984f7462c",
"skills/gsd-ns-context/skills/extract-learnings/SKILL.md": "48846bf26ccaf0e7",
"skills/gsd-ns-context/skills/graphify/SKILL.md": "3d6341614add6ccd",
"skills/gsd-ns-context/skills/map-codebase/SKILL.md": "51d6b970dca3c28e",
"skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "c585b152e9d9d6d3",
"skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "1a3267902234c607",
"skills/gsd-ns-ideate/SKILL.md": "d70360a5f7e8ac90",
"skills/gsd-ns-ideate/skills/capture/SKILL.md": "74651f6959cfbbd3",
"skills/gsd-ns-ideate/skills/explore/SKILL.md": "bb8413dc283a5bb1",
"skills/gsd-ns-ideate/skills/sketch/SKILL.md": "3c1218159bbf4eb0",
"skills/gsd-ns-ideate/skills/spec-phase/SKILL.md": "2f88d0fc0c1abefe",
"skills/gsd-ns-ideate/skills/spike/SKILL.md": "799932a60c21fddc",
"skills/gsd-ns-manage/SKILL.md": "123d32471bc44cee",
"skills/gsd-ns-manage/skills/cleanup/SKILL.md": "cc78257dc49e91ab",
"skills/gsd-ns-manage/skills/config/SKILL.md": "c99f48d175be9c5a",
"skills/gsd-ns-manage/skills/health/SKILL.md": "f3c7f00b39802522",
"skills/gsd-ns-manage/skills/help/SKILL.md": "fefeb84914e1ab94",
"skills/gsd-ns-manage/skills/inbox/SKILL.md": "9a9224c09c095438",
"skills/gsd-ns-manage/skills/manager/SKILL.md": "e810eb24d1b0cb42",
"skills/gsd-ns-manage/skills/pause-work/SKILL.md": "c3e1186348abbaca",
"skills/gsd-ns-manage/skills/pr-branch/SKILL.md": "b5be687b86830368",
"skills/gsd-ns-manage/skills/resume-work/SKILL.md": "753c45ba8c91e640",
"skills/gsd-ns-manage/skills/settings/SKILL.md": "8751c29421208a00",
"skills/gsd-ns-manage/skills/ship/SKILL.md": "7498424e965545e1",
"skills/gsd-ns-manage/skills/stats/SKILL.md": "0bce39e8f3b64f5e",
"skills/gsd-ns-manage/skills/surface/SKILL.md": "0644bd7dbeeb0a73",
"skills/gsd-ns-manage/skills/thread/SKILL.md": "fbe591e8162f8b1c",
"skills/gsd-ns-manage/skills/undo/SKILL.md": "5ffc86a2c67aa9df",
"skills/gsd-ns-manage/skills/update/SKILL.md": "c8165b8085ba106a",
"skills/gsd-ns-manage/skills/workspace/SKILL.md": "98cc03aa8c735e9d",
"skills/gsd-ns-manage/skills/workstreams/SKILL.md": "94d00b5116523f36",
"skills/gsd-ns-project/SKILL.md": "4d7e3c3870536dc9",
"skills/gsd-ns-project/skills/audit-milestone/SKILL.md": "6d4c77390c549fc7",
"skills/gsd-ns-project/skills/complete-milestone/SKILL.md": "0af489daf6fd3f16",
"skills/gsd-ns-project/skills/import/SKILL.md": "a3cfa7abc5ddd26d",
"skills/gsd-ns-project/skills/ingest-docs/SKILL.md": "53e838f8f509d0ac",
"skills/gsd-ns-project/skills/milestone-summary/SKILL.md": "18dc0c134cb62657",
"skills/gsd-ns-project/skills/new-milestone/SKILL.md": "a94ff34b09e17a98",
"skills/gsd-ns-project/skills/new-project/SKILL.md": "81f681f54ca61f90",
"skills/gsd-ns-project/skills/profile-user/SKILL.md": "68b015a40d386bff",
"skills/gsd-ns-project/skills/review-backlog/SKILL.md": "0f25310aa0cd48f6",
"skills/gsd-ns-review/SKILL.md": "d7567fd9a75a5c21",
"skills/gsd-ns-review/skills/audit-fix/SKILL.md": "c085b5f9585e7fc8",
"skills/gsd-ns-review/skills/audit-uat/SKILL.md": "abbb16c85efd493d",
"skills/gsd-ns-review/skills/code-review/SKILL.md": "36dbfd5aa2d3c3c7",
"skills/gsd-ns-review/skills/debug/SKILL.md": "4b9bde6d213185f0",
"skills/gsd-ns-review/skills/eval-review/SKILL.md": "61d28536af6794c9",
"skills/gsd-ns-review/skills/forensics/SKILL.md": "e68fc285c39dad5e",
"skills/gsd-ns-review/skills/review/SKILL.md": "022745ee2379823c",
"skills/gsd-ns-review/skills/secure-phase/SKILL.md": "ff7949b3261c09fa",
"skills/gsd-ns-review/skills/ui-phase/SKILL.md": "d0e75ee06eaa0165",
"skills/gsd-ns-review/skills/ui-review/SKILL.md": "bdab072171d79877",
"skills/gsd-ns-review/skills/validate-phase/SKILL.md": "8972b413eb712cae",
"skills/gsd-ns-workflow/SKILL.md": "e0711a5522acc3ca",
"skills/gsd-ns-workflow/skills/add-tests/SKILL.md": "851084b695ab8328",
"skills/gsd-ns-workflow/skills/ai-integration-phase/SKILL.md": "34fa7aff585eb78f",
"skills/gsd-ns-workflow/skills/autonomous/SKILL.md": "1565a532889d3ea3",
"skills/gsd-ns-workflow/skills/discuss-phase/SKILL.md": "94ac4065ceeee80b",
"skills/gsd-ns-workflow/skills/execute-phase/SKILL.md": "67c9a6189f045de0",
"skills/gsd-ns-workflow/skills/fast/SKILL.md": "34b741cc323f5f15",
"skills/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "f259f089a8d07a54",
"skills/gsd-ns-workflow/skills/phase/SKILL.md": "fe5b26417ee466be",
"skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "8cf23ecd6ac98069",
"skills/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "93f68cc6a36de7f2",
"skills/gsd-ns-workflow/skills/progress/SKILL.md": "68bda87136db9fb3",
"skills/gsd-ns-workflow/skills/quick/SKILL.md": "014dec52d85dcb0e",
"skills/gsd-ns-workflow/skills/spec-phase/SKILL.md": "2f88d0fc0c1abefe",
"skills/gsd-ns-workflow/skills/ultraplan-phase/SKILL.md": "8673b6e4fc14d0ec",
"skills/gsd-ns-workflow/skills/verify-work/SKILL.md": "b92b0e8428a8e80c"
}

View File

@@ -0,0 +1,402 @@
{
".gsd-profile": "0e716a5fef4e6dc1",
"agents/gsd-advisor-researcher.md": "bfee29d91fae7482",
"agents/gsd-ai-researcher.md": "84b8bcfb941a695d",
"agents/gsd-assumptions-analyzer.md": "6790335368de9256",
"agents/gsd-code-fixer.md": "0b1249729381feaa",
"agents/gsd-code-reviewer.md": "dc0f53798e7be5bf",
"agents/gsd-codebase-mapper.md": "061507e9ffa4eb98",
"agents/gsd-debug-session-manager.md": "808092282a01943f",
"agents/gsd-debugger.md": "e3911b3005058023",
"agents/gsd-doc-classifier.md": "4740eb4c4f6ac294",
"agents/gsd-doc-synthesizer.md": "135bbdfb9053cbd8",
"agents/gsd-doc-verifier.md": "4232dcf9076e3566",
"agents/gsd-doc-writer.md": "4bc840f73065eec8",
"agents/gsd-domain-researcher.md": "f8be56555689a970",
"agents/gsd-eval-auditor.md": "a8f01cf6028bb351",
"agents/gsd-eval-planner.md": "112f6730f23854e3",
"agents/gsd-executor.md": "b46c52658b58525f",
"agents/gsd-framework-selector.md": "c350ee693cb1aa4e",
"agents/gsd-integration-checker.md": "a58d2e3e8dd86496",
"agents/gsd-intel-updater.md": "9fadfebd08f15244",
"agents/gsd-mempalace-curator.md": "61c387c3fd9bae78",
"agents/gsd-nyquist-auditor.md": "635fe8a78cff4cd4",
"agents/gsd-pattern-mapper.md": "b45b5e106775bec1",
"agents/gsd-phase-researcher.md": "c4e3719ee6b48cbd",
"agents/gsd-plan-checker.md": "6de9fa5a3e560fdf",
"agents/gsd-planner.md": "8c7db54ca9fe4ddb",
"agents/gsd-project-researcher.md": "09d8937aac2ee4be",
"agents/gsd-research-synthesizer.md": "4e93a673dd201b11",
"agents/gsd-roadmapper.md": "ae1a13e63babc134",
"agents/gsd-security-auditor.md": "9490f73c1434f91b",
"agents/gsd-ui-auditor.md": "00b1f627ae48d783",
"agents/gsd-ui-checker.md": "dd06843892f6b0c8",
"agents/gsd-ui-researcher.md": "85d7d6cc36388435",
"agents/gsd-user-profiler.md": "003276f85792cfda",
"agents/gsd-verifier.md": "0a0c618959bb00d2",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/gsd-tools.cjs": "b7968e3e3af00249",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"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",
"gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4",
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
"gsd-core/contexts/review.md": "dc578fdd74bbea11",
"gsd-core/references/agent-contracts.md": "ff65e633c656c0d2",
"gsd-core/references/ai-evals.md": "b5afa786b938671e",
"gsd-core/references/ai-frameworks.md": "f827de93dde124eb",
"gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e",
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
"gsd-core/references/checkpoints.md": "6aa620c6ca38bdf0",
"gsd-core/references/common-bug-patterns.md": "780145be56352626",
"gsd-core/references/context-budget.md": "533eae480bfc4bb8",
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
"gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3",
"gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474",
"gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e",
"gsd-core/references/domain-probes.md": "762b965e84035b72",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/requirements.json": "fbc1b355d8625eeb",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json": "66dd60957fee45f0",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json": "47fca61f076835fa",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/requirements.json": "80f04f5c04fb24cf",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json": "d38147adb0e5b342",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json": "bc552c01939bf4f8",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json": "688ec62c13e08afe",
"gsd-core/references/edge-probe.md": "5687eba25a078561",
"gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc",
"gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e",
"gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e",
"gsd-core/references/execute-phase-wave-guard.md": "de9ac22cead4cfd8",
"gsd-core/references/executor-examples.md": "ba59243ed45c8ab1",
"gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4",
"gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8",
"gsd-core/references/gate-prompts.md": "099c8d52e3562336",
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "5c70ef3203b7c9ce",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
"gsd-core/references/model-profile-resolution.md": "f32bb05102839767",
"gsd-core/references/model-profiles.md": "d482387de75a44bc",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
"gsd-core/references/planner-guidance.md": "140b1266eeb096cb",
"gsd-core/references/planner-human-verify-mode.md": "56d05e841630b3f4",
"gsd-core/references/planner-interface-context.md": "b28fa3da6ae739a8",
"gsd-core/references/planner-load-graph-context.md": "ca7a7af3f35ae61b",
"gsd-core/references/planner-mvp-mode.md": "ec33050db81101a8",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "4435dfdc3381233f",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
"gsd-core/references/prohibition-probe.md": "52872d5393ea9daf",
"gsd-core/references/project-skills-discovery.md": "c155e03dce8dc3c2",
"gsd-core/references/questioning.md": "a8c988cab05f4651",
"gsd-core/references/research-documentation-lookup.md": "c070007d1d72ab71",
"gsd-core/references/research-philosophy.md": "62930e66cc979c1a",
"gsd-core/references/research-verification-protocol.md": "9c38c9d9a687e679",
"gsd-core/references/revision-loop.md": "e55ff32dd98c63df",
"gsd-core/references/scout-codebase.md": "ba266ecc18fbf172",
"gsd-core/references/security-asvs-levels.md": "4774fac3b94b6ca8",
"gsd-core/references/skeleton-template.md": "528691d1f0efa878",
"gsd-core/references/sketch-interactivity.md": "7d982fe877e1e1cc",
"gsd-core/references/sketch-theme-system.md": "33e2e96e450456f8",
"gsd-core/references/sketch-tooling.md": "df6c4f24c1c27611",
"gsd-core/references/sketch-variant-patterns.md": "66c197aa4fb52810",
"gsd-core/references/spidr-splitting.md": "074ac154c0e4f906",
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
"gsd-core/references/ui-brand.md": "48717bcfcd63bd27",
"gsd-core/references/universal-anti-patterns.md": "6a1245050b21df01",
"gsd-core/references/untrusted-input-boundary.md": "d33b80d4d348599a",
"gsd-core/references/user-profiling.md": "b50416fe57c1b321",
"gsd-core/references/user-story-template.md": "0cc50e06a144ff8a",
"gsd-core/references/verification-overrides.md": "a3e2d5166d16a37b",
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
"gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5",
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
"gsd-core/templates/DEBUG.md": "57bd61bfd1d98e7e",
"gsd-core/templates/README.md": "90d2617778373147",
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
"gsd-core/templates/UI-SPEC.md": "20ca56a4e3e21f01",
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
"gsd-core/templates/claude-md.md": "d8f0fe8dba3bb28a",
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
"gsd-core/templates/codebase/conventions.md": "c2e07698dad6b364",
"gsd-core/templates/codebase/integrations.md": "39bd23c71eedd564",
"gsd-core/templates/codebase/stack.md": "116e7e67dd87ddec",
"gsd-core/templates/codebase/structure.md": "222997133232a6f5",
"gsd-core/templates/codebase/testing.md": "76abff7f2050c9ea",
"gsd-core/templates/config.json": "1473dff11272d3c4",
"gsd-core/templates/context.md": "69b01e7909ea3f66",
"gsd-core/templates/continue-here.md": "f522a51b6895fba8",
"gsd-core/templates/copilot-instructions.md": "aea34bc52ff548ea",
"gsd-core/templates/debug-subagent-prompt.md": "8c18a89e25929d8e",
"gsd-core/templates/dev-preferences.md": "95048a71063d980b",
"gsd-core/templates/discovery.md": "e4ab738326eb70e0",
"gsd-core/templates/discussion-log.md": "cac1b48ec0f4dcb8",
"gsd-core/templates/milestone-archive.md": "591b6decdc0c0e51",
"gsd-core/templates/milestone.md": "74d2f750ae9f4a9c",
"gsd-core/templates/phase-prompt.md": "213ccd947451ff2b",
"gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f",
"gsd-core/templates/project.md": "1f687c7a88381080",
"gsd-core/templates/requirements.md": "a44de4c2f146e473",
"gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0",
"gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f",
"gsd-core/templates/research-project/PITFALLS.md": "3ef75fa768422eec",
"gsd-core/templates/research-project/STACK.md": "82c85799ac4dd344",
"gsd-core/templates/research-project/SUMMARY.md": "dceb2f346388839d",
"gsd-core/templates/research.md": "fa6dfb2ff2e8d273",
"gsd-core/templates/retrospective.md": "03981e30dd760103",
"gsd-core/templates/roadmap.md": "e4e35a9eb5dd4d4f",
"gsd-core/templates/spec.md": "7dc900c355098d8b",
"gsd-core/templates/state.md": "73e424b8c70b765c",
"gsd-core/templates/summary-complex.md": "a5e40574fd8894dc",
"gsd-core/templates/summary-minimal.md": "7d09b5e709e2e67c",
"gsd-core/templates/summary-standard.md": "e8d9cf4a8377cdff",
"gsd-core/templates/summary.md": "23c40f6503b3ea98",
"gsd-core/templates/user-profile.md": "20749f23e4c413fc",
"gsd-core/templates/user-setup.md": "78b7d718b6e8d67c",
"gsd-core/templates/verification-report.md": "dd5faa6254183731",
"gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb",
"gsd-core/workflows/add-backlog.md": "5095b6e69b4e380a",
"gsd-core/workflows/add-phase.md": "27164a671e14a789",
"gsd-core/workflows/add-tests.md": "930998905facefc3",
"gsd-core/workflows/add-todo.md": "73934334ebbf5530",
"gsd-core/workflows/ai-integration-phase.md": "17017ec424e87b8d",
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
"gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b",
"gsd-core/workflows/audit-milestone.md": "5e9a35af57344e04",
"gsd-core/workflows/audit-uat.md": "69dbdec25cae2f12",
"gsd-core/workflows/autonomous.md": "c72e08a2afc08828",
"gsd-core/workflows/check-todos.md": "fa637b6cc9be647c",
"gsd-core/workflows/cleanup.md": "5cf0772521c192a4",
"gsd-core/workflows/code-review-fix.md": "a416c764425cbb61",
"gsd-core/workflows/code-review.md": "3999e5bc9ce9171e",
"gsd-core/workflows/complete-milestone.md": "6778d5f383d6f2f3",
"gsd-core/workflows/debug.md": "d5856f61f3a1ff84",
"gsd-core/workflows/diagnose-issues.md": "363684618298aecd",
"gsd-core/workflows/discovery-phase.md": "6161c60d752d0058",
"gsd-core/workflows/discuss-phase-assumptions.md": "af66efe23bd54b1d",
"gsd-core/workflows/discuss-phase-power.md": "290c0d83d783f9f6",
"gsd-core/workflows/discuss-phase.md": "6cbb63a540616e9d",
"gsd-core/workflows/discuss-phase/modes/advisor.md": "c7d4a3ff91655d24",
"gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54",
"gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105",
"gsd-core/workflows/discuss-phase/modes/auto.md": "3333b280afd68321",
"gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448",
"gsd-core/workflows/discuss-phase/modes/chain.md": "b16547a6b0423579",
"gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966",
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
"gsd-core/workflows/discuss-phase/modes/text.md": "b62c9085d4dc2963",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
"gsd-core/workflows/do.md": "032ea8e1d5a13d3b",
"gsd-core/workflows/docs-update.md": "98c30bec9350542f",
"gsd-core/workflows/edit-phase.md": "a3ab51739c5c021c",
"gsd-core/workflows/eval-review.md": "f47fd1a7a1ca3308",
"gsd-core/workflows/execute-phase.md": "9c16cc175f60b765",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "c133828cf177a772",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80",
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
"gsd-core/workflows/execute-plan.md": "8d77786e0842fefe",
"gsd-core/workflows/explore.md": "aee57d95497ca50a",
"gsd-core/workflows/extract-learnings.md": "ce4b5388074f19a3",
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
"gsd-core/workflows/forensics.md": "d0f079d1bcf924c3",
"gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b",
"gsd-core/workflows/health.md": "9fd7fe8c7c99b0db",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495",
"gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa",
"gsd-core/workflows/help/modes/full.md": "b909d41bada51a6d",
"gsd-core/workflows/help/modes/topic.md": "bd2e4cc8e460f5bd",
"gsd-core/workflows/import.md": "b40557b17ca31024",
"gsd-core/workflows/inbox.md": "91aac6360e1a8672",
"gsd-core/workflows/ingest-docs.md": "a0a58450d457ae35",
"gsd-core/workflows/insert-phase.md": "0ab06e370253622b",
"gsd-core/workflows/list-phase-assumptions.md": "2a6b6a5acfb7742c",
"gsd-core/workflows/list-seeds.md": "da9511b569ada7f9",
"gsd-core/workflows/list-workspaces.md": "9b78bb9f71029169",
"gsd-core/workflows/manager.md": "c0b571445b452f2b",
"gsd-core/workflows/map-codebase.md": "27c356aa00fb022a",
"gsd-core/workflows/milestone-summary.md": "5bf68a980d8b5590",
"gsd-core/workflows/mvp-phase.md": "bfa668107be972ed",
"gsd-core/workflows/new-milestone.md": "74753bc968621017",
"gsd-core/workflows/new-project.md": "4184d47a8797dd4e",
"gsd-core/workflows/new-workspace.md": "668cd5038c76c771",
"gsd-core/workflows/next.md": "ef1b4c60ea3ddbc9",
"gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b",
"gsd-core/workflows/note.md": "42b66686b2c102cb",
"gsd-core/workflows/pause-work.md": "0be71264eafd16dc",
"gsd-core/workflows/plan-milestone-gaps.md": "1976bf2001969719",
"gsd-core/workflows/plan-phase.md": "bce0904c3d3b7d59",
"gsd-core/workflows/plan-review-convergence.md": "414df04b7ddff73c",
"gsd-core/workflows/plant-seed.md": "936a848f1d6c409e",
"gsd-core/workflows/pr-branch.md": "c8827e8a15426bf5",
"gsd-core/workflows/profile-user.md": "4e17ead7b8335ad2",
"gsd-core/workflows/progress.md": "ff1627b59dcce0f9",
"gsd-core/workflows/quick.md": "992dea74dfdb39e7",
"gsd-core/workflows/reapply-patches.md": "2d7dada9edec108b",
"gsd-core/workflows/remove-phase.md": "f76e1c2a4dd31a09",
"gsd-core/workflows/remove-workspace.md": "0e73844f0f41cbc3",
"gsd-core/workflows/resume-project.md": "3dcaa7abe1800d35",
"gsd-core/workflows/review.md": "c32eac3c18b11691",
"gsd-core/workflows/scan.md": "8e1bbf2eed1752ca",
"gsd-core/workflows/secure-phase.md": "b2b9100ff79d6017",
"gsd-core/workflows/session-report.md": "2e5b1205324ddefa",
"gsd-core/workflows/settings-advanced.md": "df9a3b599fc74ba6",
"gsd-core/workflows/settings-integrations.md": "b503bf4784877aa9",
"gsd-core/workflows/settings.md": "3cbb449c1e02fe29",
"gsd-core/workflows/ship.md": "f8eece9ef821fc7c",
"gsd-core/workflows/sketch-wrap-up.md": "fcef0ef795f8bfc5",
"gsd-core/workflows/sketch.md": "dc9645b2ee28559d",
"gsd-core/workflows/spec-phase.md": "bab99d00772a5cd0",
"gsd-core/workflows/spike-wrap-up.md": "89a8d7fbc74ce8f2",
"gsd-core/workflows/spike.md": "aae8bcad15642645",
"gsd-core/workflows/stats.md": "17b4f2059f4b4ef2",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "75df5cc71f72c33d",
"gsd-core/workflows/transition.md": "96ce39403ca69594",
"gsd-core/workflows/ui-phase.md": "790e5982e5b715c3",
"gsd-core/workflows/ui-review.md": "51945fda8e931f99",
"gsd-core/workflows/ultraplan-phase.md": "92dbc48e9a7162aa",
"gsd-core/workflows/undo.md": "791e0bf96d9a057f",
"gsd-core/workflows/update.md": "0b389258dcc09332",
"gsd-core/workflows/validate-phase.md": "2aa540f2c2479501",
"gsd-core/workflows/verify-phase.md": "452968b6becb18a1",
"gsd-core/workflows/verify-work.md": "d2e8f5d5f2b8f050",
"hooks/gsd-check-update-worker.js": "f0c2b5b7169642ba",
"hooks/gsd-check-update.js": "a0e4882e66670e4d",
"hooks/gsd-config-reload.js": "17bf778d432b3d2a",
"hooks/gsd-context-monitor.js": "fbe88dd134dc7156",
"hooks/gsd-cursor-post-tool.js": "dd1b12f795de8d72",
"hooks/gsd-cursor-session-start.js": "a93095ac609a3ea6",
"hooks/gsd-ensure-canonical-path.js": "34f4522a23cc5f41",
"hooks/gsd-graphify-update.sh": "396ebda3c6705dc9",
"hooks/gsd-phase-boundary.sh": "6aa3ba9af3d465d9",
"hooks/gsd-prompt-guard.js": "4b08c2dce0233e2d",
"hooks/gsd-read-guard.js": "b602f88f046a7551",
"hooks/gsd-read-injection-scanner.js": "e149870bbd213882",
"hooks/gsd-session-state.sh": "b1496e6a5204a6df",
"hooks/gsd-statusline.js": "38cb2dd48cc03294",
"hooks/gsd-update-banner.js": "d3228b9e674296b4",
"hooks/gsd-validate-commit.sh": "14d3d966c74dc310",
"hooks/gsd-workflow-guard.js": "6faa8f81812a8b5d",
"hooks/gsd-worktree-path-guard.js": "5c2ebabb9d21b42a",
"hooks/lib/git-cmd.js": "268ba15992ca0b23",
"hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
"hooks/managed-hooks-registry.cjs": "ea876b1ec185173e",
"package.json": "dbf8353f77358bc1",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",
"scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
"scripts/changeset/lint.cjs": "0066faed159154f0",
"scripts/changeset/new.cjs": "4991e21fd17f5541",
"scripts/changeset/parse.cjs": "f9a949cbcab56445",
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
"skills/gsd-add-tests/SKILL.md": "6661195a66f25ae8",
"skills/gsd-ai-integration-phase/SKILL.md": "96c8151779ad510e",
"skills/gsd-audit-fix/SKILL.md": "d47c757ad361e503",
"skills/gsd-audit-milestone/SKILL.md": "edb6a0cc6305d724",
"skills/gsd-audit-uat/SKILL.md": "f3cb11adb6dab54f",
"skills/gsd-autonomous/SKILL.md": "fb57d2c08ea9e8bc",
"skills/gsd-capture/SKILL.md": "05fa421c95fbad2d",
"skills/gsd-cleanup/SKILL.md": "ea0ddedf403f309d",
"skills/gsd-code-review/SKILL.md": "051da89e9f09932a",
"skills/gsd-complete-milestone/SKILL.md": "f6799a5a713be7bb",
"skills/gsd-config/SKILL.md": "f830f8c9887064de",
"skills/gsd-debug/SKILL.md": "42de44884d97d86d",
"skills/gsd-discuss-phase/SKILL.md": "99e764f6fb1f5dd4",
"skills/gsd-docs-update/SKILL.md": "3d41e81ec571de60",
"skills/gsd-eval-review/SKILL.md": "b6b6059061388363",
"skills/gsd-execute-phase/SKILL.md": "cd7d2b134924d57b",
"skills/gsd-explore/SKILL.md": "7ee5c455f37093be",
"skills/gsd-extract-learnings/SKILL.md": "8d38e55e5f8b774b",
"skills/gsd-fast/SKILL.md": "5f3f8b0c3f564d14",
"skills/gsd-forensics/SKILL.md": "4ef11f4cf902186f",
"skills/gsd-graphify/SKILL.md": "20804d74e63f594d",
"skills/gsd-health/SKILL.md": "ab21123ba99ec255",
"skills/gsd-help/SKILL.md": "503130b761263411",
"skills/gsd-import/SKILL.md": "e0c88bc1ceed0dd2",
"skills/gsd-inbox/SKILL.md": "d05a099c0be02c60",
"skills/gsd-ingest-docs/SKILL.md": "eb85e654917a503a",
"skills/gsd-manager/SKILL.md": "1370d93741e47828",
"skills/gsd-map-codebase/SKILL.md": "5009595dbde69739",
"skills/gsd-mempalace-capture/SKILL.md": "e9b66db79fce0a2f",
"skills/gsd-mempalace-recall/SKILL.md": "9bfa9e76c7a10e26",
"skills/gsd-milestone-summary/SKILL.md": "33d51a325d314f3a",
"skills/gsd-mvp-phase/SKILL.md": "f9a1348c6c297579",
"skills/gsd-new-milestone/SKILL.md": "ac99ffb8a966fe9d",
"skills/gsd-new-project/SKILL.md": "e4d930027074d3b6",
"skills/gsd-ns-context/SKILL.md": "3102e7ad9b60f182",
"skills/gsd-ns-ideate/SKILL.md": "c2c129408a046d22",
"skills/gsd-ns-manage/SKILL.md": "8d786e01fa28a7bb",
"skills/gsd-ns-project/SKILL.md": "cc0c4bd9feeab147",
"skills/gsd-ns-review/SKILL.md": "4111ea56e820479f",
"skills/gsd-ns-workflow/SKILL.md": "13c0d84b25545331",
"skills/gsd-pause-work/SKILL.md": "35e8a148e44f5361",
"skills/gsd-phase/SKILL.md": "00be96e7ae36c6f0",
"skills/gsd-plan-phase/SKILL.md": "0c9e87da048acfb7",
"skills/gsd-plan-review-convergence/SKILL.md": "c3dd8bfa877eaed5",
"skills/gsd-pr-branch/SKILL.md": "c5e26f2c6dff1355",
"skills/gsd-profile-user/SKILL.md": "894eb2850ecd2dde",
"skills/gsd-progress/SKILL.md": "9b288501db99c7ea",
"skills/gsd-quick/SKILL.md": "bd5e4cb79bc41611",
"skills/gsd-resume-work/SKILL.md": "e23d2fb963d47d04",
"skills/gsd-review-backlog/SKILL.md": "1708aab6cb919223",
"skills/gsd-review/SKILL.md": "b2fe23d7725c19f4",
"skills/gsd-secure-phase/SKILL.md": "a6adf4729b606d5a",
"skills/gsd-settings/SKILL.md": "6d9fbddb0b00fd46",
"skills/gsd-ship/SKILL.md": "9f7929947aac3c27",
"skills/gsd-sketch/SKILL.md": "e531174c131acc85",
"skills/gsd-spec-phase/SKILL.md": "7e4dfa2070b7d9d1",
"skills/gsd-spike/SKILL.md": "04d5f50d8d4a1c1a",
"skills/gsd-stats/SKILL.md": "5403a46852241fa8",
"skills/gsd-surface/SKILL.md": "970f30acc073a7b9",
"skills/gsd-thread/SKILL.md": "a76c70c368f82dee",
"skills/gsd-ui-phase/SKILL.md": "7c9404102a9b9d74",
"skills/gsd-ui-review/SKILL.md": "ef8f643abff1486b",
"skills/gsd-ultraplan-phase/SKILL.md": "a6c5aeacfa9bcbf1",
"skills/gsd-undo/SKILL.md": "0ad1218f55c94e4b",
"skills/gsd-update/SKILL.md": "25328e1ae7b51c98",
"skills/gsd-validate-phase/SKILL.md": "70375e2381319d2b",
"skills/gsd-verify-work/SKILL.md": "7ab3c2c1d008abd6",
"skills/gsd-workspace/SKILL.md": "047c3f4247bc869e",
"skills/gsd-workstreams/SKILL.md": "f4e54cb9b1ca0442"
}

View File

@@ -0,0 +1,385 @@
{
".agents/AGENTS.md": "4393766ace757e9d",
".clinerules/gsd.md": "d72c089c31c1fef3",
".clinerules/hooks/PreToolUse": "7271c83ab8a80911",
".gsd-profile": "0e716a5fef4e6dc1",
".gsd/defaults.json": "560664b045e645cb",
"agents/gsd-advisor-researcher.md": "7dfdadd98ec1cccc",
"agents/gsd-ai-researcher.md": "06e812e2f5bc8183",
"agents/gsd-assumptions-analyzer.md": "dc5e9973ff0740d7",
"agents/gsd-code-fixer.md": "b62fa87001d3cf5a",
"agents/gsd-code-reviewer.md": "f99a29f8982b8b51",
"agents/gsd-codebase-mapper.md": "3051a6f4183fe312",
"agents/gsd-debug-session-manager.md": "fc39ba45364ee4fd",
"agents/gsd-debugger.md": "fe69ba5bf548ccaa",
"agents/gsd-doc-classifier.md": "f7c361b91cc71a15",
"agents/gsd-doc-synthesizer.md": "f4e6ca19363e4b0f",
"agents/gsd-doc-verifier.md": "b60290c9d9f6d8d2",
"agents/gsd-doc-writer.md": "b0e9c568797e254a",
"agents/gsd-domain-researcher.md": "0fecdaea86466a56",
"agents/gsd-eval-auditor.md": "8d09ffc9c7659c5e",
"agents/gsd-eval-planner.md": "3ddea88a69b4da3f",
"agents/gsd-executor.md": "c6debb092b85f6fe",
"agents/gsd-framework-selector.md": "564669d479433f15",
"agents/gsd-integration-checker.md": "3d9a78f08e4782ff",
"agents/gsd-intel-updater.md": "b084fd8df5f13f2a",
"agents/gsd-mempalace-curator.md": "63676937f8970bf3",
"agents/gsd-nyquist-auditor.md": "80b109317fa4b60e",
"agents/gsd-pattern-mapper.md": "b526065fd2efa19c",
"agents/gsd-phase-researcher.md": "4c08ebba29e6e3f3",
"agents/gsd-plan-checker.md": "914d727ddc4cf8d9",
"agents/gsd-planner.md": "1011d56c5f9d1bf4",
"agents/gsd-project-researcher.md": "0028e4e6e66ad2b2",
"agents/gsd-research-synthesizer.md": "3bfa11826d592a32",
"agents/gsd-roadmapper.md": "2b86616f59bbeca2",
"agents/gsd-security-auditor.md": "297a35752df57ebd",
"agents/gsd-ui-auditor.md": "dc3af368e2f85abb",
"agents/gsd-ui-checker.md": "35a6b14813aa03ff",
"agents/gsd-ui-researcher.md": "878c7d0e82fa861a",
"agents/gsd-user-profiler.md": "622220df0654b6bf",
"agents/gsd-verifier.md": "64cc793b5f0110bc",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/gsd-tools.cjs": "b7968e3e3af00249",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"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",
"gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4",
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
"gsd-core/contexts/review.md": "dc578fdd74bbea11",
"gsd-core/references/agent-contracts.md": "ff65e633c656c0d2",
"gsd-core/references/ai-evals.md": "b5afa786b938671e",
"gsd-core/references/ai-frameworks.md": "f827de93dde124eb",
"gsd-core/references/artifact-types.md": "a6d2e1f9453ffbf5",
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
"gsd-core/references/checkpoints.md": "9a7ba3a17ece1698",
"gsd-core/references/common-bug-patterns.md": "780145be56352626",
"gsd-core/references/context-budget.md": "c154ba00dbbf4477",
"gsd-core/references/continuation-format.md": "ce73e57d053ab8a7",
"gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3",
"gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474",
"gsd-core/references/doc-conflict-engine.md": "67d019d23e17f934",
"gsd-core/references/domain-probes.md": "62d23ed1992c48a9",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/requirements.json": "fbc1b355d8625eeb",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json": "66dd60957fee45f0",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json": "47fca61f076835fa",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/requirements.json": "80f04f5c04fb24cf",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json": "d38147adb0e5b342",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json": "bc552c01939bf4f8",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json": "688ec62c13e08afe",
"gsd-core/references/edge-probe.md": "5687eba25a078561",
"gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc",
"gsd-core/references/execute-phase-between-wave-reset.md": "e9582246dbc617e0",
"gsd-core/references/execute-phase-context-guard.md": "982006c1f3364242",
"gsd-core/references/execute-phase-wave-guard.md": "742bb890af014c87",
"gsd-core/references/executor-examples.md": "ba59243ed45c8ab1",
"gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4",
"gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8",
"gsd-core/references/gate-prompts.md": "e69f5993ab944d80",
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "f5403e1470e46e69",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
"gsd-core/references/model-profile-resolution.md": "f32bb05102839767",
"gsd-core/references/model-profiles.md": "0941c3ab057c38a2",
"gsd-core/references/mvp-concepts.md": "72f7e8b1f8ae7118",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "6aeffd9097e25e22",
"gsd-core/references/planner-guidance.md": "96486cac2f7885e6",
"gsd-core/references/planner-human-verify-mode.md": "0519ef5438b2ed30",
"gsd-core/references/planner-interface-context.md": "b28fa3da6ae739a8",
"gsd-core/references/planner-load-graph-context.md": "e469016f2d51b5bc",
"gsd-core/references/planner-mvp-mode.md": "ec33050db81101a8",
"gsd-core/references/planner-reviews.md": "dda0193a0fbd4947",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "c386ac9e804f862e",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
"gsd-core/references/prohibition-probe.md": "605dc3f5a118ff3b",
"gsd-core/references/project-skills-discovery.md": "76b9d6526741fd0e",
"gsd-core/references/questioning.md": "a8c988cab05f4651",
"gsd-core/references/research-documentation-lookup.md": "c070007d1d72ab71",
"gsd-core/references/research-philosophy.md": "62930e66cc979c1a",
"gsd-core/references/research-verification-protocol.md": "9c38c9d9a687e679",
"gsd-core/references/revision-loop.md": "e55ff32dd98c63df",
"gsd-core/references/scout-codebase.md": "ba266ecc18fbf172",
"gsd-core/references/security-asvs-levels.md": "4774fac3b94b6ca8",
"gsd-core/references/skeleton-template.md": "528691d1f0efa878",
"gsd-core/references/sketch-interactivity.md": "7d982fe877e1e1cc",
"gsd-core/references/sketch-theme-system.md": "33e2e96e450456f8",
"gsd-core/references/sketch-tooling.md": "df6c4f24c1c27611",
"gsd-core/references/sketch-variant-patterns.md": "66c197aa4fb52810",
"gsd-core/references/spidr-splitting.md": "074ac154c0e4f906",
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "41069529ef776e39",
"gsd-core/references/ui-brand.md": "48717bcfcd63bd27",
"gsd-core/references/universal-anti-patterns.md": "6a1245050b21df01",
"gsd-core/references/untrusted-input-boundary.md": "d33b80d4d348599a",
"gsd-core/references/user-profiling.md": "b50416fe57c1b321",
"gsd-core/references/user-story-template.md": "0cc50e06a144ff8a",
"gsd-core/references/verification-overrides.md": "8213de9bd62283b6",
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
"gsd-core/references/workstream-flag.md": "19340c1a3be74ad2",
"gsd-core/references/worktree-branch-check.md": "46882ad61f3f9075",
"gsd-core/references/worktree-path-safety.md": "8e5b4d542d2d9853",
"gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b",
"gsd-core/templates/DEBUG.md": "a13470b82b1935e7",
"gsd-core/templates/README.md": "004c355d4b02b145",
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
"gsd-core/templates/UAT.md": "9e296471b97ebcec",
"gsd-core/templates/UI-SPEC.md": "20ca56a4e3e21f01",
"gsd-core/templates/VALIDATION.md": "f53e0ca061d3528e",
"gsd-core/templates/claude-md.md": "c9fea2d8afa17d80",
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
"gsd-core/templates/codebase/conventions.md": "c2e07698dad6b364",
"gsd-core/templates/codebase/integrations.md": "39bd23c71eedd564",
"gsd-core/templates/codebase/stack.md": "116e7e67dd87ddec",
"gsd-core/templates/codebase/structure.md": "988307dc093216d1",
"gsd-core/templates/codebase/testing.md": "76abff7f2050c9ea",
"gsd-core/templates/config.json": "1473dff11272d3c4",
"gsd-core/templates/context.md": "69b01e7909ea3f66",
"gsd-core/templates/continue-here.md": "f522a51b6895fba8",
"gsd-core/templates/copilot-instructions.md": "aea34bc52ff548ea",
"gsd-core/templates/debug-subagent-prompt.md": "920656683dedb869",
"gsd-core/templates/dev-preferences.md": "88d0a65ec0993a3a",
"gsd-core/templates/discovery.md": "9a0e0935cc825dbc",
"gsd-core/templates/discussion-log.md": "cac1b48ec0f4dcb8",
"gsd-core/templates/milestone-archive.md": "591b6decdc0c0e51",
"gsd-core/templates/milestone.md": "74d2f750ae9f4a9c",
"gsd-core/templates/phase-prompt.md": "b811bf951092df2f",
"gsd-core/templates/planner-subagent-prompt.md": "ebf29dbb27042370",
"gsd-core/templates/project.md": "ab4af6becca2bb23",
"gsd-core/templates/requirements.md": "a44de4c2f146e473",
"gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0",
"gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f",
"gsd-core/templates/research-project/PITFALLS.md": "3ef75fa768422eec",
"gsd-core/templates/research-project/STACK.md": "82c85799ac4dd344",
"gsd-core/templates/research-project/SUMMARY.md": "dceb2f346388839d",
"gsd-core/templates/research.md": "88ce0920417091d0",
"gsd-core/templates/retrospective.md": "03981e30dd760103",
"gsd-core/templates/roadmap.md": "e4e35a9eb5dd4d4f",
"gsd-core/templates/spec.md": "26d55bce940f0288",
"gsd-core/templates/state.md": "4d123aa6cea167fe",
"gsd-core/templates/summary-complex.md": "a5e40574fd8894dc",
"gsd-core/templates/summary-minimal.md": "7d09b5e709e2e67c",
"gsd-core/templates/summary-standard.md": "e8d9cf4a8377cdff",
"gsd-core/templates/summary.md": "23c40f6503b3ea98",
"gsd-core/templates/user-profile.md": "20749f23e4c413fc",
"gsd-core/templates/user-setup.md": "78b7d718b6e8d67c",
"gsd-core/templates/verification-report.md": "dd5faa6254183731",
"gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb",
"gsd-core/workflows/add-backlog.md": "805471417ad921b4",
"gsd-core/workflows/add-phase.md": "38a6397d692b6256",
"gsd-core/workflows/add-tests.md": "3182b4a48b60fc0f",
"gsd-core/workflows/add-todo.md": "2ee36f06763af56b",
"gsd-core/workflows/ai-integration-phase.md": "e1216f51ba0662f2",
"gsd-core/workflows/analyze-dependencies.md": "52942af10f140717",
"gsd-core/workflows/audit-fix.md": "85a83f15012e220d",
"gsd-core/workflows/audit-milestone.md": "7e68a0d33382fbca",
"gsd-core/workflows/audit-uat.md": "2ab2975014fbb210",
"gsd-core/workflows/autonomous.md": "40a72366442139c2",
"gsd-core/workflows/check-todos.md": "ab6239efbf42077b",
"gsd-core/workflows/cleanup.md": "869f953fb25e57a7",
"gsd-core/workflows/code-review-fix.md": "40d723ec1c6b45d1",
"gsd-core/workflows/code-review.md": "4aee640e6e6951ce",
"gsd-core/workflows/complete-milestone.md": "c3a489ca30f8bccb",
"gsd-core/workflows/debug.md": "1d138ad68a5f94dd",
"gsd-core/workflows/diagnose-issues.md": "ed74414bee6a146f",
"gsd-core/workflows/discovery-phase.md": "3ba7cfb89fb1e761",
"gsd-core/workflows/discuss-phase-assumptions.md": "dbb54ab5455a1e49",
"gsd-core/workflows/discuss-phase-power.md": "0841f7dc6e9a054a",
"gsd-core/workflows/discuss-phase.md": "17ef5303bf8c61b2",
"gsd-core/workflows/discuss-phase/modes/advisor.md": "711bdeb87a76fe72",
"gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54",
"gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105",
"gsd-core/workflows/discuss-phase/modes/auto.md": "a677457cfcf26929",
"gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448",
"gsd-core/workflows/discuss-phase/modes/chain.md": "d7f857f6d916084a",
"gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966",
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
"gsd-core/workflows/discuss-phase/modes/text.md": "e38583ffc6743580",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
"gsd-core/workflows/do.md": "491de71927bca5a0",
"gsd-core/workflows/docs-update.md": "4aee7d852ab26710",
"gsd-core/workflows/edit-phase.md": "db501e21c762d2b2",
"gsd-core/workflows/eval-review.md": "e211cca4eea94930",
"gsd-core/workflows/execute-phase.md": "dae9e35eb0ee41fc",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "84b49fd65d290399",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "bcb4ab75df626846",
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
"gsd-core/workflows/execute-plan.md": "81458a19cf02a5bc",
"gsd-core/workflows/explore.md": "28856a6b0198064b",
"gsd-core/workflows/extract-learnings.md": "b649ff8ecff388c1",
"gsd-core/workflows/fast.md": "94136fb570d20a9d",
"gsd-core/workflows/forensics.md": "2478dc912608126f",
"gsd-core/workflows/graduation.md": "ca7fa951a963d84b",
"gsd-core/workflows/health.md": "295e170806820a94",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "5fe077fbbdb5d9f7",
"gsd-core/workflows/help/modes/default.md": "77c34f4a77dec02c",
"gsd-core/workflows/help/modes/full.md": "6924f9cf169175e0",
"gsd-core/workflows/help/modes/topic.md": "d7c60d488810fbd6",
"gsd-core/workflows/import.md": "64c8031374b39376",
"gsd-core/workflows/inbox.md": "437f981ef9ae7b26",
"gsd-core/workflows/ingest-docs.md": "62761071f8391015",
"gsd-core/workflows/insert-phase.md": "37fb13804b4e61f2",
"gsd-core/workflows/list-phase-assumptions.md": "53dd4b69536c1bc3",
"gsd-core/workflows/list-seeds.md": "d3b2783b53d96746",
"gsd-core/workflows/list-workspaces.md": "e2d7ee5e70395c1d",
"gsd-core/workflows/manager.md": "3ae982361d3cbb06",
"gsd-core/workflows/map-codebase.md": "893f13a40162ce23",
"gsd-core/workflows/milestone-summary.md": "dd87dcdecb0b069d",
"gsd-core/workflows/mvp-phase.md": "e6a902c3308345f2",
"gsd-core/workflows/new-milestone.md": "ff7a75c9d7e863eb",
"gsd-core/workflows/new-project.md": "f5799451fb7c1983",
"gsd-core/workflows/new-workspace.md": "277c868dc684ad05",
"gsd-core/workflows/next.md": "e64c75922be6d8e2",
"gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b",
"gsd-core/workflows/note.md": "5a99eb396c744619",
"gsd-core/workflows/pause-work.md": "9c1acf8c30a244fd",
"gsd-core/workflows/plan-milestone-gaps.md": "95ca791b0867fe2d",
"gsd-core/workflows/plan-phase.md": "2716d6636e37ce6a",
"gsd-core/workflows/plan-review-convergence.md": "2cdba6216184aac4",
"gsd-core/workflows/plant-seed.md": "d0d63f83ae7c939b",
"gsd-core/workflows/pr-branch.md": "15ccec6bd303ea46",
"gsd-core/workflows/profile-user.md": "21955dc3f74c66df",
"gsd-core/workflows/progress.md": "ec78c08395cc39f5",
"gsd-core/workflows/quick.md": "4b763c75164e0f1d",
"gsd-core/workflows/reapply-patches.md": "4cfdb59f5d8e727e",
"gsd-core/workflows/remove-phase.md": "61b68a4af414e3c2",
"gsd-core/workflows/remove-workspace.md": "411bfff942216185",
"gsd-core/workflows/resume-project.md": "f8f71b5a98374b85",
"gsd-core/workflows/review.md": "897a4c72a97178f8",
"gsd-core/workflows/scan.md": "db0c48c3963f9a8b",
"gsd-core/workflows/secure-phase.md": "c51b86e369574195",
"gsd-core/workflows/session-report.md": "2e5b1205324ddefa",
"gsd-core/workflows/settings-advanced.md": "29a70ffc83bfc4b4",
"gsd-core/workflows/settings-integrations.md": "7e9fbe941882c4f6",
"gsd-core/workflows/settings.md": "bc0e1b43249e32b0",
"gsd-core/workflows/ship.md": "c3db35c8d1b398c1",
"gsd-core/workflows/sketch-wrap-up.md": "91f40fc816293e3c",
"gsd-core/workflows/sketch.md": "92a8bab2605469fb",
"gsd-core/workflows/spec-phase.md": "e06346c9c626a2d2",
"gsd-core/workflows/spike-wrap-up.md": "693949a4e10e66bd",
"gsd-core/workflows/spike.md": "204e742c846ee0d9",
"gsd-core/workflows/stats.md": "5cfea82b894eee3c",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "5ae4c3141bdedd88",
"gsd-core/workflows/transition.md": "fe82e77df8dceb1b",
"gsd-core/workflows/ui-phase.md": "06f1f80de620a319",
"gsd-core/workflows/ui-review.md": "0af83311f5e41f48",
"gsd-core/workflows/ultraplan-phase.md": "b4e64685b40bce09",
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
"gsd-core/workflows/update.md": "9cad8a8f4baff922",
"gsd-core/workflows/validate-phase.md": "54687a0f2a562fc4",
"gsd-core/workflows/verify-phase.md": "68a74f247fdce962",
"gsd-core/workflows/verify-work.md": "6f482d32e0c8d49a",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",
"scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
"scripts/changeset/lint.cjs": "0066faed159154f0",
"scripts/changeset/new.cjs": "4991e21fd17f5541",
"scripts/changeset/parse.cjs": "f9a949cbcab56445",
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
"skills/gsd-ns-context/SKILL.md": "e278a50f3ecb8f56",
"skills/gsd-ns-context/skills/docs-update/SKILL.md": "d150afd41a25ec08",
"skills/gsd-ns-context/skills/extract-learnings/SKILL.md": "d39269bea995fabc",
"skills/gsd-ns-context/skills/graphify/SKILL.md": "030050fcd08d129d",
"skills/gsd-ns-context/skills/map-codebase/SKILL.md": "19aec854da15f77b",
"skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "5647f915e5c85482",
"skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "d41523e659d1920f",
"skills/gsd-ns-ideate/SKILL.md": "c10342345c01c91f",
"skills/gsd-ns-ideate/skills/capture/SKILL.md": "fb53053848bb6695",
"skills/gsd-ns-ideate/skills/explore/SKILL.md": "d8e26a5ed95a4ecc",
"skills/gsd-ns-ideate/skills/sketch/SKILL.md": "e52cfc46eeb203c2",
"skills/gsd-ns-ideate/skills/spec-phase/SKILL.md": "19726b83ca2c3d2d",
"skills/gsd-ns-ideate/skills/spike/SKILL.md": "d407644a84678e58",
"skills/gsd-ns-manage/SKILL.md": "0f4fb6d2f96ed7e9",
"skills/gsd-ns-manage/skills/cleanup/SKILL.md": "a578d6536b9cabc3",
"skills/gsd-ns-manage/skills/config/SKILL.md": "bcc58a5b17d29e82",
"skills/gsd-ns-manage/skills/health/SKILL.md": "74a68e1c1b310bef",
"skills/gsd-ns-manage/skills/help/SKILL.md": "8d01c91265b6357f",
"skills/gsd-ns-manage/skills/inbox/SKILL.md": "34370c6138415209",
"skills/gsd-ns-manage/skills/manager/SKILL.md": "a37ecdbe32952262",
"skills/gsd-ns-manage/skills/pause-work/SKILL.md": "da59910491639404",
"skills/gsd-ns-manage/skills/pr-branch/SKILL.md": "c25b5a3e31ab6f74",
"skills/gsd-ns-manage/skills/resume-work/SKILL.md": "5f0d4d0e86b99180",
"skills/gsd-ns-manage/skills/settings/SKILL.md": "67eff2d16e17403c",
"skills/gsd-ns-manage/skills/ship/SKILL.md": "4ad9695934e069ee",
"skills/gsd-ns-manage/skills/stats/SKILL.md": "25898070fb2a4b20",
"skills/gsd-ns-manage/skills/surface/SKILL.md": "6d6ed15c90424f3f",
"skills/gsd-ns-manage/skills/thread/SKILL.md": "67b5a0451b58c50c",
"skills/gsd-ns-manage/skills/undo/SKILL.md": "88407c6379617c7b",
"skills/gsd-ns-manage/skills/update/SKILL.md": "2666ab7786b69017",
"skills/gsd-ns-manage/skills/workspace/SKILL.md": "c2616b157ec2350b",
"skills/gsd-ns-manage/skills/workstreams/SKILL.md": "737841783c7fdd4f",
"skills/gsd-ns-project/SKILL.md": "5668e3a5e1d8896d",
"skills/gsd-ns-project/skills/audit-milestone/SKILL.md": "739ed755ad84e58e",
"skills/gsd-ns-project/skills/complete-milestone/SKILL.md": "a69d534b385d6aaf",
"skills/gsd-ns-project/skills/import/SKILL.md": "bc9b615cb141d26f",
"skills/gsd-ns-project/skills/ingest-docs/SKILL.md": "8fce43ae1144b8c3",
"skills/gsd-ns-project/skills/milestone-summary/SKILL.md": "e3636a5e9bbaab1f",
"skills/gsd-ns-project/skills/new-milestone/SKILL.md": "bc8989d97f3161ad",
"skills/gsd-ns-project/skills/new-project/SKILL.md": "ff0d57491df30624",
"skills/gsd-ns-project/skills/profile-user/SKILL.md": "0406eed4dbd9560c",
"skills/gsd-ns-project/skills/review-backlog/SKILL.md": "d8a150558cc9326a",
"skills/gsd-ns-review/SKILL.md": "c5afe33c212947dd",
"skills/gsd-ns-review/skills/audit-fix/SKILL.md": "2c1f601f2fb52585",
"skills/gsd-ns-review/skills/audit-uat/SKILL.md": "2c450432b6fd1c3e",
"skills/gsd-ns-review/skills/code-review/SKILL.md": "2d615701a36de114",
"skills/gsd-ns-review/skills/debug/SKILL.md": "2017ee8a5c39357a",
"skills/gsd-ns-review/skills/eval-review/SKILL.md": "c76022e94ee30cb1",
"skills/gsd-ns-review/skills/forensics/SKILL.md": "bbab359eaa388d34",
"skills/gsd-ns-review/skills/review/SKILL.md": "04c7f2a8515d97a2",
"skills/gsd-ns-review/skills/secure-phase/SKILL.md": "ceded474164b4e2d",
"skills/gsd-ns-review/skills/ui-phase/SKILL.md": "c35f175ccc747d56",
"skills/gsd-ns-review/skills/ui-review/SKILL.md": "48267dc071481a89",
"skills/gsd-ns-review/skills/validate-phase/SKILL.md": "62dc6ae62bb38c16",
"skills/gsd-ns-workflow/SKILL.md": "7dbd699b5130c0d5",
"skills/gsd-ns-workflow/skills/add-tests/SKILL.md": "addc3a220961a9c7",
"skills/gsd-ns-workflow/skills/ai-integration-phase/SKILL.md": "e74b83a991dc9fc7",
"skills/gsd-ns-workflow/skills/autonomous/SKILL.md": "37dc7b78ceb74803",
"skills/gsd-ns-workflow/skills/discuss-phase/SKILL.md": "fedb2e2c77ff82ae",
"skills/gsd-ns-workflow/skills/execute-phase/SKILL.md": "e249a35959e49e99",
"skills/gsd-ns-workflow/skills/fast/SKILL.md": "3eae6536d09c2532",
"skills/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "6c2beccceb46fda1",
"skills/gsd-ns-workflow/skills/phase/SKILL.md": "4e1363db6013a1e5",
"skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "b7a6ff2837b41143",
"skills/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "b7d213288df9aa96",
"skills/gsd-ns-workflow/skills/progress/SKILL.md": "493f467c22d55b6b",
"skills/gsd-ns-workflow/skills/quick/SKILL.md": "605e596c680cbb1c",
"skills/gsd-ns-workflow/skills/spec-phase/SKILL.md": "19726b83ca2c3d2d",
"skills/gsd-ns-workflow/skills/ultraplan-phase/SKILL.md": "8606e89121ffaba3",
"skills/gsd-ns-workflow/skills/verify-work/SKILL.md": "584a3485842de0a4"
}

View File

@@ -0,0 +1,472 @@
{
".gsd-profile": "0e716a5fef4e6dc1",
".gsd/defaults.json": "560664b045e645cb",
"agents/gsd-advisor-researcher.md": "7dfdadd98ec1cccc",
"agents/gsd-ai-researcher.md": "a98e6ce03a3f7565",
"agents/gsd-assumptions-analyzer.md": "dc5e9973ff0740d7",
"agents/gsd-code-fixer.md": "645c70ed0155f7c4",
"agents/gsd-code-reviewer.md": "372137acc4155b5f",
"agents/gsd-codebase-mapper.md": "7e2293c462389be3",
"agents/gsd-debug-session-manager.md": "d7c0e160cbf76c68",
"agents/gsd-debugger.md": "f1936c442c12bf30",
"agents/gsd-doc-classifier.md": "095e804a82f4a47f",
"agents/gsd-doc-synthesizer.md": "2a78fe239d00389c",
"agents/gsd-doc-verifier.md": "e74d930905a782ea",
"agents/gsd-doc-writer.md": "9a9e66be3981411a",
"agents/gsd-domain-researcher.md": "1c1a800108a2b225",
"agents/gsd-eval-auditor.md": "380ed8b15f07a680",
"agents/gsd-eval-planner.md": "4ebdd7fe9cbb0cfe",
"agents/gsd-executor.md": "11e5d8ae52c08196",
"agents/gsd-framework-selector.md": "7726fccc86bfeb50",
"agents/gsd-integration-checker.md": "239c6bbd19c6895b",
"agents/gsd-intel-updater.md": "ec317a56d4abc4d3",
"agents/gsd-mempalace-curator.md": "63676937f8970bf3",
"agents/gsd-nyquist-auditor.md": "50cee88d38c797a3",
"agents/gsd-pattern-mapper.md": "92cfa2e6c2a06bf3",
"agents/gsd-phase-researcher.md": "3d1aa51cbea008e7",
"agents/gsd-plan-checker.md": "f747da9c3126c918",
"agents/gsd-planner.md": "04a0281878973985",
"agents/gsd-project-researcher.md": "78294b9bb8bbbd42",
"agents/gsd-research-synthesizer.md": "d75fb540f0e01f08",
"agents/gsd-roadmapper.md": "956125a1f6774aae",
"agents/gsd-security-auditor.md": "6401d8f6f966ac2d",
"agents/gsd-ui-auditor.md": "a2730bb158f93cd4",
"agents/gsd-ui-checker.md": "68ee3eb209c9f0d6",
"agents/gsd-ui-researcher.md": "507ed07fc9ba7d33",
"agents/gsd-user-profiler.md": "622220df0654b6bf",
"agents/gsd-verifier.md": "b62b7966b4aafd5b",
"commands/gsd-add-tests.md": "aa65032141557fb7",
"commands/gsd-ai-integration-phase.md": "373053d7cd887aa9",
"commands/gsd-audit-fix.md": "c21ef925131fade7",
"commands/gsd-audit-milestone.md": "accbb975f85df506",
"commands/gsd-audit-uat.md": "f34f9d211780c8e7",
"commands/gsd-autonomous.md": "b2ddf4f71008055a",
"commands/gsd-capture.md": "73066649385d6a30",
"commands/gsd-cleanup.md": "15c306114555468e",
"commands/gsd-code-review.md": "fb1fee97d4ce7aa7",
"commands/gsd-complete-milestone.md": "42b9f738a6ef27bb",
"commands/gsd-config.md": "d2ca72138eb3e185",
"commands/gsd-debug.md": "279b3814e35e57e1",
"commands/gsd-discuss-phase.md": "b0e66df97b3d35b4",
"commands/gsd-docs-update.md": "0bd04559e7daaf8f",
"commands/gsd-eval-review.md": "5c0bf98aee70535f",
"commands/gsd-execute-phase.md": "4c2e81399876492a",
"commands/gsd-explore.md": "8a59d0d0ea3daebd",
"commands/gsd-extract-learnings.md": "727feb914d501f1a",
"commands/gsd-fast.md": "79bf42c66008a6db",
"commands/gsd-forensics.md": "f068866c568749a4",
"commands/gsd-graphify.md": "5e0efaed49aa8384",
"commands/gsd-health.md": "60c111036afc00d2",
"commands/gsd-help.md": "1a617e1b8e383b73",
"commands/gsd-import.md": "00e560b7e4b85523",
"commands/gsd-inbox.md": "eecfcfff57f89975",
"commands/gsd-ingest-docs.md": "ab3e58239c23d61d",
"commands/gsd-manager.md": "bfe9e261fa918876",
"commands/gsd-map-codebase.md": "9ed09a9a9ce48ffd",
"commands/gsd-mempalace-capture.md": "6fa6ca7a1ecd562d",
"commands/gsd-mempalace-recall.md": "146d97ab543d8df2",
"commands/gsd-milestone-summary.md": "e3a36fbd695a1833",
"commands/gsd-mvp-phase.md": "671791ba61c4654a",
"commands/gsd-new-milestone.md": "00b5d757991941c7",
"commands/gsd-new-project.md": "490195d5003d3d17",
"commands/gsd-ns-context.md": "cc8954f405ae7916",
"commands/gsd-ns-ideate.md": "fd1dd80d705e6e36",
"commands/gsd-ns-manage.md": "5cc012d0be1caabb",
"commands/gsd-ns-project.md": "52e30c8d84bb1ee5",
"commands/gsd-ns-review.md": "a28dbfd4aba5f74b",
"commands/gsd-ns-workflow.md": "dcd214fc50008d42",
"commands/gsd-pause-work.md": "6caa75a7c2b4dd2d",
"commands/gsd-phase.md": "e3ca4958ea20a935",
"commands/gsd-plan-phase.md": "6de27d54ac191539",
"commands/gsd-plan-review-convergence.md": "4d1b90383514958e",
"commands/gsd-pr-branch.md": "f5be514b9f69eaf5",
"commands/gsd-profile-user.md": "7a9289910719d828",
"commands/gsd-progress.md": "80f75f428fc0949d",
"commands/gsd-quick.md": "8585535a111660d1",
"commands/gsd-resume-work.md": "9c4ee571a15fefae",
"commands/gsd-review-backlog.md": "41ee0337839b8e9d",
"commands/gsd-review.md": "4d1b7eaef1560fb4",
"commands/gsd-secure-phase.md": "6daf0c899069ab74",
"commands/gsd-settings.md": "57edae813aae049c",
"commands/gsd-ship.md": "9190bbab8119a365",
"commands/gsd-sketch.md": "4013cb35a4a800be",
"commands/gsd-spec-phase.md": "145f2ab750344022",
"commands/gsd-spike.md": "54c094f40b601688",
"commands/gsd-stats.md": "60f7077e7949d2ad",
"commands/gsd-surface.md": "29688da5df785b58",
"commands/gsd-thread.md": "07da4f657b3efcc1",
"commands/gsd-ui-phase.md": "3b90f3d1c8fa531d",
"commands/gsd-ui-review.md": "4e5fb1e77def9b64",
"commands/gsd-ultraplan-phase.md": "728a2e57e10e6179",
"commands/gsd-undo.md": "a52c89b888e6c1b7",
"commands/gsd-update.md": "58bc4232c21a74ba",
"commands/gsd-validate-phase.md": "a735abb7db023543",
"commands/gsd-verify-work.md": "6edbbb82a1f2aea7",
"commands/gsd-workspace.md": "d765ff60cde657a6",
"commands/gsd-workstreams.md": "884b6c8d648422c7",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/gsd-tools.cjs": "b7968e3e3af00249",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"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",
"gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4",
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
"gsd-core/contexts/review.md": "dc578fdd74bbea11",
"gsd-core/references/agent-contracts.md": "ff65e633c656c0d2",
"gsd-core/references/ai-evals.md": "b5afa786b938671e",
"gsd-core/references/ai-frameworks.md": "f827de93dde124eb",
"gsd-core/references/artifact-types.md": "a6d2e1f9453ffbf5",
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
"gsd-core/references/checkpoints.md": "6aa620c6ca38bdf0",
"gsd-core/references/common-bug-patterns.md": "780145be56352626",
"gsd-core/references/context-budget.md": "f1ce57bf418824af",
"gsd-core/references/continuation-format.md": "ce73e57d053ab8a7",
"gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3",
"gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474",
"gsd-core/references/doc-conflict-engine.md": "67d019d23e17f934",
"gsd-core/references/domain-probes.md": "62d23ed1992c48a9",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/requirements.json": "fbc1b355d8625eeb",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json": "66dd60957fee45f0",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json": "47fca61f076835fa",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/requirements.json": "80f04f5c04fb24cf",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json": "d38147adb0e5b342",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json": "bc552c01939bf4f8",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json": "688ec62c13e08afe",
"gsd-core/references/edge-probe.md": "5687eba25a078561",
"gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc",
"gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e",
"gsd-core/references/execute-phase-context-guard.md": "982006c1f3364242",
"gsd-core/references/execute-phase-wave-guard.md": "de9ac22cead4cfd8",
"gsd-core/references/executor-examples.md": "ba59243ed45c8ab1",
"gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4",
"gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8",
"gsd-core/references/gate-prompts.md": "e69f5993ab944d80",
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "77bf9dff38b2c9d4",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
"gsd-core/references/model-profile-resolution.md": "f32bb05102839767",
"gsd-core/references/model-profiles.md": "d3513252c5de5465",
"gsd-core/references/mvp-concepts.md": "72f7e8b1f8ae7118",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "6aeffd9097e25e22",
"gsd-core/references/planner-guidance.md": "96486cac2f7885e6",
"gsd-core/references/planner-human-verify-mode.md": "56d05e841630b3f4",
"gsd-core/references/planner-interface-context.md": "b28fa3da6ae739a8",
"gsd-core/references/planner-load-graph-context.md": "ca7a7af3f35ae61b",
"gsd-core/references/planner-mvp-mode.md": "ec33050db81101a8",
"gsd-core/references/planner-reviews.md": "dda0193a0fbd4947",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "1c3a3aae2ae89e83",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
"gsd-core/references/prohibition-probe.md": "605dc3f5a118ff3b",
"gsd-core/references/project-skills-discovery.md": "c155e03dce8dc3c2",
"gsd-core/references/questioning.md": "a8c988cab05f4651",
"gsd-core/references/research-documentation-lookup.md": "c070007d1d72ab71",
"gsd-core/references/research-philosophy.md": "62930e66cc979c1a",
"gsd-core/references/research-verification-protocol.md": "9c38c9d9a687e679",
"gsd-core/references/revision-loop.md": "e55ff32dd98c63df",
"gsd-core/references/scout-codebase.md": "ba266ecc18fbf172",
"gsd-core/references/security-asvs-levels.md": "4774fac3b94b6ca8",
"gsd-core/references/skeleton-template.md": "528691d1f0efa878",
"gsd-core/references/sketch-interactivity.md": "7d982fe877e1e1cc",
"gsd-core/references/sketch-theme-system.md": "33e2e96e450456f8",
"gsd-core/references/sketch-tooling.md": "df6c4f24c1c27611",
"gsd-core/references/sketch-variant-patterns.md": "66c197aa4fb52810",
"gsd-core/references/spidr-splitting.md": "074ac154c0e4f906",
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "41069529ef776e39",
"gsd-core/references/ui-brand.md": "48717bcfcd63bd27",
"gsd-core/references/universal-anti-patterns.md": "6a1245050b21df01",
"gsd-core/references/untrusted-input-boundary.md": "d33b80d4d348599a",
"gsd-core/references/user-profiling.md": "b50416fe57c1b321",
"gsd-core/references/user-story-template.md": "0cc50e06a144ff8a",
"gsd-core/references/verification-overrides.md": "8213de9bd62283b6",
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
"gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5",
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
"gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b",
"gsd-core/templates/DEBUG.md": "a13470b82b1935e7",
"gsd-core/templates/README.md": "93d3426fc64e2c12",
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
"gsd-core/templates/UAT.md": "9e296471b97ebcec",
"gsd-core/templates/UI-SPEC.md": "20ca56a4e3e21f01",
"gsd-core/templates/VALIDATION.md": "f53e0ca061d3528e",
"gsd-core/templates/claude-md.md": "d1d333e4b963c0d2",
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
"gsd-core/templates/codebase/conventions.md": "c2e07698dad6b364",
"gsd-core/templates/codebase/integrations.md": "39bd23c71eedd564",
"gsd-core/templates/codebase/stack.md": "116e7e67dd87ddec",
"gsd-core/templates/codebase/structure.md": "222997133232a6f5",
"gsd-core/templates/codebase/testing.md": "76abff7f2050c9ea",
"gsd-core/templates/config.json": "1473dff11272d3c4",
"gsd-core/templates/context.md": "69b01e7909ea3f66",
"gsd-core/templates/continue-here.md": "f522a51b6895fba8",
"gsd-core/templates/copilot-instructions.md": "aea34bc52ff548ea",
"gsd-core/templates/debug-subagent-prompt.md": "920656683dedb869",
"gsd-core/templates/dev-preferences.md": "88d0a65ec0993a3a",
"gsd-core/templates/discovery.md": "9a0e0935cc825dbc",
"gsd-core/templates/discussion-log.md": "cac1b48ec0f4dcb8",
"gsd-core/templates/milestone-archive.md": "591b6decdc0c0e51",
"gsd-core/templates/milestone.md": "74d2f750ae9f4a9c",
"gsd-core/templates/phase-prompt.md": "b811bf951092df2f",
"gsd-core/templates/planner-subagent-prompt.md": "ebf29dbb27042370",
"gsd-core/templates/project.md": "ab4af6becca2bb23",
"gsd-core/templates/requirements.md": "a44de4c2f146e473",
"gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0",
"gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f",
"gsd-core/templates/research-project/PITFALLS.md": "3ef75fa768422eec",
"gsd-core/templates/research-project/STACK.md": "82c85799ac4dd344",
"gsd-core/templates/research-project/SUMMARY.md": "dceb2f346388839d",
"gsd-core/templates/research.md": "88ce0920417091d0",
"gsd-core/templates/retrospective.md": "03981e30dd760103",
"gsd-core/templates/roadmap.md": "e4e35a9eb5dd4d4f",
"gsd-core/templates/spec.md": "26d55bce940f0288",
"gsd-core/templates/state.md": "4d123aa6cea167fe",
"gsd-core/templates/summary-complex.md": "a5e40574fd8894dc",
"gsd-core/templates/summary-minimal.md": "7d09b5e709e2e67c",
"gsd-core/templates/summary-standard.md": "e8d9cf4a8377cdff",
"gsd-core/templates/summary.md": "23c40f6503b3ea98",
"gsd-core/templates/user-profile.md": "20749f23e4c413fc",
"gsd-core/templates/user-setup.md": "78b7d718b6e8d67c",
"gsd-core/templates/verification-report.md": "dd5faa6254183731",
"gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb",
"gsd-core/workflows/add-backlog.md": "1153d35058e3e24f",
"gsd-core/workflows/add-phase.md": "b98c2fc51cd123ba",
"gsd-core/workflows/add-tests.md": "2871f7e6409ba89e",
"gsd-core/workflows/add-todo.md": "3b913840c1f490b2",
"gsd-core/workflows/ai-integration-phase.md": "ad2ff20091d1c2c0",
"gsd-core/workflows/analyze-dependencies.md": "52942af10f140717",
"gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b",
"gsd-core/workflows/audit-milestone.md": "fe7185bb70eafdb9",
"gsd-core/workflows/audit-uat.md": "ca6f1f0ef174f793",
"gsd-core/workflows/autonomous.md": "ba6828223ba13c1f",
"gsd-core/workflows/check-todos.md": "1e3026abe782bd36",
"gsd-core/workflows/cleanup.md": "5cf0772521c192a4",
"gsd-core/workflows/code-review-fix.md": "b442c670f8c1fe93",
"gsd-core/workflows/code-review.md": "1bfa3bf542e30c5e",
"gsd-core/workflows/complete-milestone.md": "8a4cfb41a4de5a99",
"gsd-core/workflows/debug.md": "da62e7a62c113b29",
"gsd-core/workflows/diagnose-issues.md": "690c523df07f2ea7",
"gsd-core/workflows/discovery-phase.md": "3ba7cfb89fb1e761",
"gsd-core/workflows/discuss-phase-assumptions.md": "a365fdca7f7281ad",
"gsd-core/workflows/discuss-phase-power.md": "0841f7dc6e9a054a",
"gsd-core/workflows/discuss-phase.md": "a0b7539c8b3c25cd",
"gsd-core/workflows/discuss-phase/modes/advisor.md": "c7d4a3ff91655d24",
"gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54",
"gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105",
"gsd-core/workflows/discuss-phase/modes/auto.md": "3333b280afd68321",
"gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448",
"gsd-core/workflows/discuss-phase/modes/chain.md": "ca3cc1ddfd19cd9d",
"gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966",
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
"gsd-core/workflows/discuss-phase/modes/text.md": "da6d45207da4a988",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
"gsd-core/workflows/do.md": "152e9c5c512f79cb",
"gsd-core/workflows/docs-update.md": "806ada831b961116",
"gsd-core/workflows/edit-phase.md": "e5624ac6e3f8bef5",
"gsd-core/workflows/eval-review.md": "dfcfb4f8ce031fae",
"gsd-core/workflows/execute-phase.md": "8e2e773435d5cae9",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "8898e0ea533cc643",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80",
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
"gsd-core/workflows/execute-plan.md": "89fc525aecb29aad",
"gsd-core/workflows/explore.md": "11523b829cc67c29",
"gsd-core/workflows/extract-learnings.md": "a2e4836abdeb1fdb",
"gsd-core/workflows/fast.md": "94136fb570d20a9d",
"gsd-core/workflows/forensics.md": "76bea6e254652c2c",
"gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b",
"gsd-core/workflows/health.md": "e3cb8ff4e01e9e53",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "5fe077fbbdb5d9f7",
"gsd-core/workflows/help/modes/default.md": "cc8ef97de634c995",
"gsd-core/workflows/help/modes/full.md": "1e95876d570df64b",
"gsd-core/workflows/help/modes/topic.md": "d7c60d488810fbd6",
"gsd-core/workflows/import.md": "97861d522319d56e",
"gsd-core/workflows/inbox.md": "437f981ef9ae7b26",
"gsd-core/workflows/ingest-docs.md": "77d9103d8d5432f3",
"gsd-core/workflows/insert-phase.md": "621f9e75725542b1",
"gsd-core/workflows/list-phase-assumptions.md": "53dd4b69536c1bc3",
"gsd-core/workflows/list-seeds.md": "0a466d04df300854",
"gsd-core/workflows/list-workspaces.md": "6e5c402000090d7b",
"gsd-core/workflows/manager.md": "a31f7e255dd7d01d",
"gsd-core/workflows/map-codebase.md": "582bddef590de9c6",
"gsd-core/workflows/milestone-summary.md": "f956783f7d063963",
"gsd-core/workflows/mvp-phase.md": "bfa668107be972ed",
"gsd-core/workflows/new-milestone.md": "6d07ca2fc7aec3a4",
"gsd-core/workflows/new-project.md": "2fa5ddc0fe749b28",
"gsd-core/workflows/new-workspace.md": "fdd63a9adf030cb1",
"gsd-core/workflows/next.md": "48bd4b5d54f0d1f8",
"gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b",
"gsd-core/workflows/note.md": "5a99eb396c744619",
"gsd-core/workflows/pause-work.md": "7bcbdf27ba957c8b",
"gsd-core/workflows/plan-milestone-gaps.md": "02fee851c82e3b25",
"gsd-core/workflows/plan-phase.md": "3b30ccd918b5f703",
"gsd-core/workflows/plan-review-convergence.md": "10007f8382864bcd",
"gsd-core/workflows/plant-seed.md": "7b795d7a1b4c9f06",
"gsd-core/workflows/pr-branch.md": "f2a35833fe784a53",
"gsd-core/workflows/profile-user.md": "fd15f5d92ac1703b",
"gsd-core/workflows/progress.md": "057699b34b6198f7",
"gsd-core/workflows/quick.md": "4d5a30b67a1ec703",
"gsd-core/workflows/reapply-patches.md": "7915e40411490bbe",
"gsd-core/workflows/remove-phase.md": "d030f80ca0df4fa9",
"gsd-core/workflows/remove-workspace.md": "b8817a3a5907f5bc",
"gsd-core/workflows/resume-project.md": "b18b51fd15cbce95",
"gsd-core/workflows/review.md": "18ab093986814bb3",
"gsd-core/workflows/scan.md": "54ff1ff60041d065",
"gsd-core/workflows/secure-phase.md": "1d1c66ad9ea01bd2",
"gsd-core/workflows/session-report.md": "2e5b1205324ddefa",
"gsd-core/workflows/settings-advanced.md": "e7e50f99e4de3872",
"gsd-core/workflows/settings-integrations.md": "351c5a6d0d5e27ed",
"gsd-core/workflows/settings.md": "48d337eb7e3f141b",
"gsd-core/workflows/ship.md": "d26fb5d3e965642a",
"gsd-core/workflows/sketch-wrap-up.md": "7d52aa95ee69d47a",
"gsd-core/workflows/sketch.md": "55cee885b4add548",
"gsd-core/workflows/spec-phase.md": "2aa0353147153776",
"gsd-core/workflows/spike-wrap-up.md": "2fde13092ba1af57",
"gsd-core/workflows/spike.md": "0051a7e2193a7522",
"gsd-core/workflows/stats.md": "01c24349370a0e6d",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "c26ca43fdf928d46",
"gsd-core/workflows/transition.md": "eee3435817fab185",
"gsd-core/workflows/ui-phase.md": "93ea0d0dfcb2a1e8",
"gsd-core/workflows/ui-review.md": "1ad3654435000881",
"gsd-core/workflows/ultraplan-phase.md": "66c17ad2e555e262",
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
"gsd-core/workflows/update.md": "6a593863d1b0a287",
"gsd-core/workflows/validate-phase.md": "50f37b705b6e44fb",
"gsd-core/workflows/verify-phase.md": "968d569ea4ef377f",
"gsd-core/workflows/verify-work.md": "6f9c666386cb6d7e",
"hooks/gsd-check-update-worker.js": "084c3f7109bb4d29",
"hooks/gsd-check-update.js": "23074675b7c31a47",
"hooks/gsd-config-reload.js": "17bf778d432b3d2a",
"hooks/gsd-context-monitor.js": "3b47e76273f1a440",
"hooks/gsd-cursor-post-tool.js": "d61ee04f6ee7858c",
"hooks/gsd-cursor-session-start.js": "148b8ec4e2c97f00",
"hooks/gsd-ensure-canonical-path.js": "6900c226c1c28a44",
"hooks/gsd-graphify-update.sh": "396ebda3c6705dc9",
"hooks/gsd-phase-boundary.sh": "6aa3ba9af3d465d9",
"hooks/gsd-prompt-guard.js": "4b08c2dce0233e2d",
"hooks/gsd-read-guard.js": "b602f88f046a7551",
"hooks/gsd-read-injection-scanner.js": "95fe2c59ef5bba35",
"hooks/gsd-session-state.sh": "b1496e6a5204a6df",
"hooks/gsd-statusline.js": "b3549ec6d96337b3",
"hooks/gsd-update-banner.js": "74817c820b7a4ec1",
"hooks/gsd-validate-commit.sh": "14d3d966c74dc310",
"hooks/gsd-workflow-guard.js": "e22b9fb57f0e64f6",
"hooks/gsd-worktree-path-guard.js": "f3ca67ad040431a7",
"hooks/lib/git-cmd.js": "268ba15992ca0b23",
"hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
"hooks/managed-hooks-registry.cjs": "0368fd4ac7bb3d1d",
"package.json": "dbf8353f77358bc1",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",
"scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
"scripts/changeset/lint.cjs": "0066faed159154f0",
"scripts/changeset/new.cjs": "4991e21fd17f5541",
"scripts/changeset/parse.cjs": "f9a949cbcab56445",
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
"skills/gsd-add-tests/SKILL.md": "60dd7f9779d5f493",
"skills/gsd-ai-integration-phase/SKILL.md": "686ba35b47442cf4",
"skills/gsd-audit-fix/SKILL.md": "309dcbc406750fd6",
"skills/gsd-audit-milestone/SKILL.md": "1f328f0c7448f27c",
"skills/gsd-audit-uat/SKILL.md": "597d4f8cd0fa5240",
"skills/gsd-autonomous/SKILL.md": "faf243b21954b407",
"skills/gsd-capture/SKILL.md": "6de5ad4b9ea3b599",
"skills/gsd-cleanup/SKILL.md": "fa47be0052de815b",
"skills/gsd-code-review/SKILL.md": "86a9df56bbd7ac7b",
"skills/gsd-complete-milestone/SKILL.md": "a0a9e43312160286",
"skills/gsd-config/SKILL.md": "862626bacdeb9e75",
"skills/gsd-debug/SKILL.md": "ecd7e69309a6e6dc",
"skills/gsd-discuss-phase/SKILL.md": "75fec0c03892505a",
"skills/gsd-docs-update/SKILL.md": "bec33cfc810194d9",
"skills/gsd-eval-review/SKILL.md": "65e26f5ec8ff57cc",
"skills/gsd-execute-phase/SKILL.md": "40e479d06dbd8da4",
"skills/gsd-explore/SKILL.md": "fc2d0fd090e7090d",
"skills/gsd-extract-learnings/SKILL.md": "778faa10f3c33788",
"skills/gsd-fast/SKILL.md": "6c81b52c310d43fa",
"skills/gsd-forensics/SKILL.md": "6c69cbd255d3a33a",
"skills/gsd-graphify/SKILL.md": "579180d7ea6e24cf",
"skills/gsd-health/SKILL.md": "e60400c5acb8248c",
"skills/gsd-help/SKILL.md": "98a2eeba302621d2",
"skills/gsd-import/SKILL.md": "f3d3ad26dfdfbd53",
"skills/gsd-inbox/SKILL.md": "0eb81a1b2e1835d3",
"skills/gsd-ingest-docs/SKILL.md": "2df55e0ec95d57d9",
"skills/gsd-manager/SKILL.md": "816db4d4ed618537",
"skills/gsd-map-codebase/SKILL.md": "00622b489483ba69",
"skills/gsd-mempalace-capture/SKILL.md": "12a57bef275e2961",
"skills/gsd-mempalace-recall/SKILL.md": "69275abbee414350",
"skills/gsd-milestone-summary/SKILL.md": "9eb030a1ac307fa1",
"skills/gsd-mvp-phase/SKILL.md": "236fcdd69f47d101",
"skills/gsd-new-milestone/SKILL.md": "be371ad30631385e",
"skills/gsd-new-project/SKILL.md": "793f7177d3bd026b",
"skills/gsd-ns-context/SKILL.md": "305b9b6248e8cc95",
"skills/gsd-ns-ideate/SKILL.md": "c63a1aed61888b35",
"skills/gsd-ns-manage/SKILL.md": "6a5b711b5103c566",
"skills/gsd-ns-project/SKILL.md": "345ea11ccffd21b0",
"skills/gsd-ns-review/SKILL.md": "98f1f3b3caf1a279",
"skills/gsd-ns-workflow/SKILL.md": "eda03f7d99eb2f8e",
"skills/gsd-pause-work/SKILL.md": "e2de20b7539e78d4",
"skills/gsd-phase/SKILL.md": "f87211f779315ced",
"skills/gsd-plan-phase/SKILL.md": "6134e837750034ab",
"skills/gsd-plan-review-convergence/SKILL.md": "e76d306ba8883cdb",
"skills/gsd-pr-branch/SKILL.md": "87bb3306488565fb",
"skills/gsd-profile-user/SKILL.md": "ee8e8547298006b8",
"skills/gsd-progress/SKILL.md": "88c8229b673004e3",
"skills/gsd-quick/SKILL.md": "b895cb9835f3fc0e",
"skills/gsd-resume-work/SKILL.md": "f8bc8b92dffd07b7",
"skills/gsd-review-backlog/SKILL.md": "c0c743e1376c2eff",
"skills/gsd-review/SKILL.md": "7f8c2adde7ec94ba",
"skills/gsd-secure-phase/SKILL.md": "bd36a3157c28df37",
"skills/gsd-settings/SKILL.md": "fbe736decd04a85d",
"skills/gsd-ship/SKILL.md": "8d40fc9f9436d2c3",
"skills/gsd-sketch/SKILL.md": "0686257acc865e0b",
"skills/gsd-spec-phase/SKILL.md": "96a095cd634129d8",
"skills/gsd-spike/SKILL.md": "d4af42b801139876",
"skills/gsd-stats/SKILL.md": "7d1fbadcae5f0b67",
"skills/gsd-surface/SKILL.md": "5008f49701e7deea",
"skills/gsd-thread/SKILL.md": "18ddd2aa60997949",
"skills/gsd-ui-phase/SKILL.md": "132ccf2ddc9e24e0",
"skills/gsd-ui-review/SKILL.md": "7e8cf0bcee9859cd",
"skills/gsd-ultraplan-phase/SKILL.md": "212a60a2df7bbb71",
"skills/gsd-undo/SKILL.md": "ebaca8bea34afd2e",
"skills/gsd-update/SKILL.md": "fd60247c80431aa9",
"skills/gsd-validate-phase/SKILL.md": "5216ef11d14f109b",
"skills/gsd-verify-work/SKILL.md": "d467197419fdbdf5",
"skills/gsd-workspace/SKILL.md": "7fcacf69b4c07655",
"skills/gsd-workstreams/SKILL.md": "b84ca1f541d6dfd1"
}

View File

@@ -0,0 +1,418 @@
{
".gsd-profile": "0e716a5fef4e6dc1",
".gsd/defaults.json": "560664b045e645cb",
"agents/gsd-advisor-researcher.md": "08c87f08c10f9fe8",
"agents/gsd-advisor-researcher.toml": "fff34ae5730d3925",
"agents/gsd-ai-researcher.md": "dd2a0f7b77950345",
"agents/gsd-ai-researcher.toml": "d4c65198a7f33b12",
"agents/gsd-assumptions-analyzer.md": "90b8d8021543a3d2",
"agents/gsd-assumptions-analyzer.toml": "058cfdb3f9bd0ef2",
"agents/gsd-code-fixer.md": "3d41cafa29f1288d",
"agents/gsd-code-fixer.toml": "7e5727b2950d8b66",
"agents/gsd-code-reviewer.md": "ecd9b3a7a4f6de8e",
"agents/gsd-code-reviewer.toml": "bf69f37605310411",
"agents/gsd-codebase-mapper.md": "4c7b89630170e50c",
"agents/gsd-codebase-mapper.toml": "aad6b8ef6039aca7",
"agents/gsd-debug-session-manager.md": "a4433f8cac0ae81c",
"agents/gsd-debug-session-manager.toml": "8b45a8660607e1ae",
"agents/gsd-debugger.md": "3b039fd7673e02d3",
"agents/gsd-debugger.toml": "1a0752ab636ae3b2",
"agents/gsd-doc-classifier.md": "0ee2bcb95b247ef8",
"agents/gsd-doc-classifier.toml": "8b94b5c8b02c133a",
"agents/gsd-doc-synthesizer.md": "2a3fbfce6cf5e671",
"agents/gsd-doc-synthesizer.toml": "823930fa132ce21b",
"agents/gsd-doc-verifier.md": "42d07e55a2e571ce",
"agents/gsd-doc-verifier.toml": "c0b7ac150730b954",
"agents/gsd-doc-writer.md": "04f7c8d02df44244",
"agents/gsd-doc-writer.toml": "07e6ee2d0c308a7c",
"agents/gsd-domain-researcher.md": "bafef7d698ccb928",
"agents/gsd-domain-researcher.toml": "a49ddec9005b4bf5",
"agents/gsd-eval-auditor.md": "e3073afb63f67657",
"agents/gsd-eval-auditor.toml": "e67cf6a252b7bcd3",
"agents/gsd-eval-planner.md": "73f2ad2ff2797a51",
"agents/gsd-eval-planner.toml": "09468ad1a34ac468",
"agents/gsd-executor.md": "1eb8527fd57aad12",
"agents/gsd-executor.toml": "d18b3f8577d3bbbc",
"agents/gsd-framework-selector.md": "ebae32430887d2e0",
"agents/gsd-framework-selector.toml": "637e4e021b7ec380",
"agents/gsd-integration-checker.md": "6670fb75b8c87ff7",
"agents/gsd-integration-checker.toml": "233a924946673207",
"agents/gsd-intel-updater.md": "097c1a4b90b28ba0",
"agents/gsd-intel-updater.toml": "07f8098bd5e0e65e",
"agents/gsd-mempalace-curator.md": "159f24243bf3acfb",
"agents/gsd-mempalace-curator.toml": "30bcaf1ca0b926db",
"agents/gsd-nyquist-auditor.md": "54160990e73c205d",
"agents/gsd-nyquist-auditor.toml": "fd27a7a7c5e79f50",
"agents/gsd-pattern-mapper.md": "efbcfa7c5de4027f",
"agents/gsd-pattern-mapper.toml": "48a17baa3d7d142c",
"agents/gsd-phase-researcher.md": "b86a0a50667adb08",
"agents/gsd-phase-researcher.toml": "c6e22db2fc92789a",
"agents/gsd-plan-checker.md": "41056ff7b3009633",
"agents/gsd-plan-checker.toml": "aa452ed8c4ae585f",
"agents/gsd-planner.md": "975d25062341bb78",
"agents/gsd-planner.toml": "d1436204f6ed4701",
"agents/gsd-project-researcher.md": "06ae50c62d4b826e",
"agents/gsd-project-researcher.toml": "10effe5cac601065",
"agents/gsd-research-synthesizer.md": "befa4887698e4aae",
"agents/gsd-research-synthesizer.toml": "4b3e626d3c16094f",
"agents/gsd-roadmapper.md": "cb10c3a3dc2340ad",
"agents/gsd-roadmapper.toml": "a9765ce5fa9e8121",
"agents/gsd-security-auditor.md": "91a3d5c406e49965",
"agents/gsd-security-auditor.toml": "61b0622381966c0e",
"agents/gsd-ui-auditor.md": "d59452c406406811",
"agents/gsd-ui-auditor.toml": "4979cd66a16e3f2b",
"agents/gsd-ui-checker.md": "5d11e1c7cf9b539e",
"agents/gsd-ui-checker.toml": "ec6b8919fd153ae3",
"agents/gsd-ui-researcher.md": "129a5f325546260f",
"agents/gsd-ui-researcher.toml": "ffe2ca0b232df3df",
"agents/gsd-user-profiler.md": "1bf5033c929181c1",
"agents/gsd-user-profiler.toml": "b9c244bb8fbf8140",
"agents/gsd-verifier.md": "994e2a4f22bc3c8b",
"agents/gsd-verifier.toml": "9743a551e04bc0a3",
"config.toml": "a34316b9ac61a620",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/gsd-tools.cjs": "b7968e3e3af00249",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"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",
"gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4",
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
"gsd-core/contexts/review.md": "dc578fdd74bbea11",
"gsd-core/references/agent-contracts.md": "ff65e633c656c0d2",
"gsd-core/references/ai-evals.md": "b5afa786b938671e",
"gsd-core/references/ai-frameworks.md": "425dd69c629230e7",
"gsd-core/references/artifact-types.md": "3218cafb0c92dc32",
"gsd-core/references/autonomous-smart-discuss.md": "4156025334411073",
"gsd-core/references/checkpoints.md": "9feb961f644afa96",
"gsd-core/references/common-bug-patterns.md": "780145be56352626",
"gsd-core/references/context-budget.md": "0b67ea1d5db4bc08",
"gsd-core/references/continuation-format.md": "e64c0da2b3d0f2f0",
"gsd-core/references/debugger-philosophy.md": "1cb61d4565081c88",
"gsd-core/references/decimal-phase-calculation.md": "ee363ec47be68922",
"gsd-core/references/doc-conflict-engine.md": "257aba80c93854d4",
"gsd-core/references/domain-probes.md": "4901deac8eac0f49",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/requirements.json": "fbc1b355d8625eeb",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json": "66dd60957fee45f0",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json": "47fca61f076835fa",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/requirements.json": "80f04f5c04fb24cf",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json": "d38147adb0e5b342",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json": "bc552c01939bf4f8",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json": "688ec62c13e08afe",
"gsd-core/references/edge-probe.md": "5687eba25a078561",
"gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc",
"gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e",
"gsd-core/references/execute-phase-context-guard.md": "a483199612e216f1",
"gsd-core/references/execute-phase-wave-guard.md": "95e55087876a0d96",
"gsd-core/references/executor-examples.md": "ba59243ed45c8ab1",
"gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4",
"gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8",
"gsd-core/references/gate-prompts.md": "2d3efd04749f56d4",
"gsd-core/references/gates.md": "11fd2bdf27df57a5",
"gsd-core/references/git-integration.md": "94715b69448bb818",
"gsd-core/references/git-planning-commit.md": "5aad099c51135a0f",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
"gsd-core/references/model-profile-resolution.md": "f32bb05102839767",
"gsd-core/references/model-profiles.md": "da9d5fcb1cf6eb4b",
"gsd-core/references/mvp-concepts.md": "23201c8118fb074a",
"gsd-core/references/phase-argument-parsing.md": "531176f66da49c98",
"gsd-core/references/planner-antipatterns.md": "2459c40bfc8a0ea8",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "ccd62140264bed71",
"gsd-core/references/planner-guidance.md": "5f62d3f50b8fc42b",
"gsd-core/references/planner-human-verify-mode.md": "3a625b42d9cb93ee",
"gsd-core/references/planner-interface-context.md": "b28fa3da6ae739a8",
"gsd-core/references/planner-load-graph-context.md": "ca7a7af3f35ae61b",
"gsd-core/references/planner-mvp-mode.md": "ec33050db81101a8",
"gsd-core/references/planner-reviews.md": "7889bfa28e82156b",
"gsd-core/references/planner-revision.md": "2ebf1a714d1ec4bf",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "0767f44905c9a65e",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
"gsd-core/references/prohibition-probe.md": "f0e320677bcd8e19",
"gsd-core/references/project-skills-discovery.md": "d3a8f760d63ea3b9",
"gsd-core/references/questioning.md": "8f26dfe5794b1e6e",
"gsd-core/references/research-documentation-lookup.md": "c070007d1d72ab71",
"gsd-core/references/research-philosophy.md": "a602b41bfa081fdf",
"gsd-core/references/research-verification-protocol.md": "9c38c9d9a687e679",
"gsd-core/references/revision-loop.md": "e55ff32dd98c63df",
"gsd-core/references/scout-codebase.md": "ba266ecc18fbf172",
"gsd-core/references/security-asvs-levels.md": "4774fac3b94b6ca8",
"gsd-core/references/skeleton-template.md": "528691d1f0efa878",
"gsd-core/references/sketch-interactivity.md": "7d982fe877e1e1cc",
"gsd-core/references/sketch-theme-system.md": "33e2e96e450456f8",
"gsd-core/references/sketch-tooling.md": "df6c4f24c1c27611",
"gsd-core/references/sketch-variant-patterns.md": "66c197aa4fb52810",
"gsd-core/references/spidr-splitting.md": "074ac154c0e4f906",
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "347c33b2d5646c93",
"gsd-core/references/ui-brand.md": "37a2dc822a4b77c4",
"gsd-core/references/universal-anti-patterns.md": "865f7ba442795487",
"gsd-core/references/untrusted-input-boundary.md": "d33b80d4d348599a",
"gsd-core/references/user-profiling.md": "8e023a908d968af1",
"gsd-core/references/user-story-template.md": "0cc50e06a144ff8a",
"gsd-core/references/verification-overrides.md": "0c8cac962c2bb105",
"gsd-core/references/verification-patterns.md": "ac45d99076067f17",
"gsd-core/references/verify-mvp-mode.md": "78faa99df1668aab",
"gsd-core/references/workstream-flag.md": "c764d9cbdf6faff4",
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
"gsd-core/templates/AI-SPEC.md": "6411a4789f481c15",
"gsd-core/templates/DEBUG.md": "0f92d4581a15ab8f",
"gsd-core/templates/README.md": "dc13994dabe139a2",
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
"gsd-core/templates/UAT.md": "59a3d4f6c4afbfc9",
"gsd-core/templates/UI-SPEC.md": "20ca56a4e3e21f01",
"gsd-core/templates/VALIDATION.md": "e3ca8ebb8d7e2cd0",
"gsd-core/templates/claude-md.md": "dd1a9011684f9753",
"gsd-core/templates/codebase/architecture.md": "282db635ba093b1a",
"gsd-core/templates/codebase/concerns.md": "e66c584daa636fc5",
"gsd-core/templates/codebase/conventions.md": "c5f0324730852701",
"gsd-core/templates/codebase/integrations.md": "39bd23c71eedd564",
"gsd-core/templates/codebase/stack.md": "116e7e67dd87ddec",
"gsd-core/templates/codebase/structure.md": "5b5dd37145241462",
"gsd-core/templates/codebase/testing.md": "76abff7f2050c9ea",
"gsd-core/templates/config.json": "1473dff11272d3c4",
"gsd-core/templates/context.md": "593d4e6d20fdde7c",
"gsd-core/templates/continue-here.md": "8b1dce4832c7922b",
"gsd-core/templates/copilot-instructions.md": "aea34bc52ff548ea",
"gsd-core/templates/debug-subagent-prompt.md": "a3948171649b686a",
"gsd-core/templates/dev-preferences.md": "975e1534eea2f695",
"gsd-core/templates/discovery.md": "7afefd109c2d5316",
"gsd-core/templates/discussion-log.md": "da4e8e266efdc6c2",
"gsd-core/templates/milestone-archive.md": "591b6decdc0c0e51",
"gsd-core/templates/milestone.md": "74d2f750ae9f4a9c",
"gsd-core/templates/phase-prompt.md": "56c67fdc5d31b556",
"gsd-core/templates/planner-subagent-prompt.md": "a48a5a2ebd5a9f47",
"gsd-core/templates/project.md": "034a6501f348c5a5",
"gsd-core/templates/requirements.md": "a44de4c2f146e473",
"gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0",
"gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f",
"gsd-core/templates/research-project/PITFALLS.md": "3ef75fa768422eec",
"gsd-core/templates/research-project/STACK.md": "82c85799ac4dd344",
"gsd-core/templates/research-project/SUMMARY.md": "dceb2f346388839d",
"gsd-core/templates/research.md": "1485bc6d64c5d8ec",
"gsd-core/templates/retrospective.md": "03981e30dd760103",
"gsd-core/templates/roadmap.md": "e4e35a9eb5dd4d4f",
"gsd-core/templates/spec.md": "34cb8124f37c9b14",
"gsd-core/templates/state.md": "3bac0c4a26c094f9",
"gsd-core/templates/summary-complex.md": "a5e40574fd8894dc",
"gsd-core/templates/summary-minimal.md": "7d09b5e709e2e67c",
"gsd-core/templates/summary-standard.md": "e8d9cf4a8377cdff",
"gsd-core/templates/summary.md": "f612660bfd0a325a",
"gsd-core/templates/user-profile.md": "52abe2af968e8533",
"gsd-core/templates/user-setup.md": "1da2382725db080f",
"gsd-core/templates/verification-report.md": "78ab9264ce63ed7e",
"gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb",
"gsd-core/workflows/add-backlog.md": "f33efb61b6810afd",
"gsd-core/workflows/add-phase.md": "b522eb805a7f00be",
"gsd-core/workflows/add-tests.md": "1157f7142099e956",
"gsd-core/workflows/add-todo.md": "218d02344535d232",
"gsd-core/workflows/ai-integration-phase.md": "7e3b8a29d2a71d80",
"gsd-core/workflows/analyze-dependencies.md": "f799abc00907377f",
"gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b",
"gsd-core/workflows/audit-milestone.md": "28afeeab183e254f",
"gsd-core/workflows/audit-uat.md": "b3b503e9f80dc9f5",
"gsd-core/workflows/autonomous.md": "d8ed420051f4d670",
"gsd-core/workflows/check-todos.md": "d847aa758e18d698",
"gsd-core/workflows/cleanup.md": "b990139192ab7c08",
"gsd-core/workflows/code-review-fix.md": "3311f5fa61f8a90b",
"gsd-core/workflows/code-review.md": "937aeabfff8963b3",
"gsd-core/workflows/complete-milestone.md": "d203f68731d9d325",
"gsd-core/workflows/debug.md": "e8367cffd3dfa758",
"gsd-core/workflows/diagnose-issues.md": "b6766f3830f5b130",
"gsd-core/workflows/discovery-phase.md": "71a4b78ff876a854",
"gsd-core/workflows/discuss-phase-assumptions.md": "9d9b1e0b0fbf6e92",
"gsd-core/workflows/discuss-phase-power.md": "3f8b83dc6be2e9d5",
"gsd-core/workflows/discuss-phase.md": "b84b5cd94c57b9af",
"gsd-core/workflows/discuss-phase/modes/advisor.md": "c7d4a3ff91655d24",
"gsd-core/workflows/discuss-phase/modes/all.md": "42e58e1f499f7824",
"gsd-core/workflows/discuss-phase/modes/analyze.md": "c824ef897199b730",
"gsd-core/workflows/discuss-phase/modes/auto.md": "48ac14a332568c30",
"gsd-core/workflows/discuss-phase/modes/batch.md": "21ee55869eaa7ece",
"gsd-core/workflows/discuss-phase/modes/chain.md": "1ff5f2e1654e93f1",
"gsd-core/workflows/discuss-phase/modes/default.md": "4c5ba5975dcc1e9c",
"gsd-core/workflows/discuss-phase/modes/power.md": "55b61b7dc83a58b2",
"gsd-core/workflows/discuss-phase/modes/text.md": "6e1c6f4d8fdd0be3",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "2b56ec2868cbddb4",
"gsd-core/workflows/do.md": "0792489ee3d22472",
"gsd-core/workflows/docs-update.md": "c5e1ea372f4a9ee8",
"gsd-core/workflows/edit-phase.md": "c83ef0701c19c455",
"gsd-core/workflows/eval-review.md": "68d7d96bd415629b",
"gsd-core/workflows/execute-phase.md": "f7fb1c335b621f62",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "7ae407e4435c9a2a",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80",
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
"gsd-core/workflows/execute-plan.md": "e67237068c3bc91d",
"gsd-core/workflows/explore.md": "a75d42453e639a5d",
"gsd-core/workflows/extract-learnings.md": "89145eb423bbbef2",
"gsd-core/workflows/fast.md": "13252d545947354d",
"gsd-core/workflows/forensics.md": "3db077a229e1ca88",
"gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b",
"gsd-core/workflows/health.md": "e9fe7c29fc41a887",
"gsd-core/workflows/help.md": "08e1349950c5602a",
"gsd-core/workflows/help/modes/brief.md": "becceb85b25dca89",
"gsd-core/workflows/help/modes/default.md": "18c7dc50066f5cd6",
"gsd-core/workflows/help/modes/full.md": "9fec66a5a4eb8389",
"gsd-core/workflows/help/modes/topic.md": "fc6697bdb47df8b3",
"gsd-core/workflows/import.md": "8b8c3a25526c0d41",
"gsd-core/workflows/inbox.md": "61b8b10e7a74b2e9",
"gsd-core/workflows/ingest-docs.md": "3680699c20c3ac7d",
"gsd-core/workflows/insert-phase.md": "9f8286598bffe5de",
"gsd-core/workflows/list-phase-assumptions.md": "4d245f6ea899bcb9",
"gsd-core/workflows/list-seeds.md": "1fb29a83e0769ced",
"gsd-core/workflows/list-workspaces.md": "7fbeaf65ce9890f5",
"gsd-core/workflows/manager.md": "4def33941b0e7d57",
"gsd-core/workflows/map-codebase.md": "320d5bfc9df29013",
"gsd-core/workflows/milestone-summary.md": "121ecb40504caf10",
"gsd-core/workflows/mvp-phase.md": "9a9b8b58d59a893f",
"gsd-core/workflows/new-milestone.md": "923f10697d743555",
"gsd-core/workflows/new-project.md": "f69c90cee1d7952d",
"gsd-core/workflows/new-workspace.md": "cc9660e79d5ba7b4",
"gsd-core/workflows/next.md": "ede3f6183e513000",
"gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b",
"gsd-core/workflows/note.md": "664da466ab989f9d",
"gsd-core/workflows/pause-work.md": "3c2ee96295959527",
"gsd-core/workflows/plan-milestone-gaps.md": "8ee841bcc7adc836",
"gsd-core/workflows/plan-phase.md": "4bef5b532a009f9b",
"gsd-core/workflows/plan-review-convergence.md": "f27818025e279aa4",
"gsd-core/workflows/plant-seed.md": "bfa729ff2ad3441a",
"gsd-core/workflows/pr-branch.md": "3b13915429c0e8d9",
"gsd-core/workflows/profile-user.md": "1faa318720f40d31",
"gsd-core/workflows/progress.md": "3e061576e3f6fae1",
"gsd-core/workflows/quick.md": "276c8d1b4fc4be5d",
"gsd-core/workflows/reapply-patches.md": "fba79b3c55c3b2e7",
"gsd-core/workflows/remove-phase.md": "75c8ca0dbd1ce404",
"gsd-core/workflows/remove-workspace.md": "a9d1dcda7755b6c9",
"gsd-core/workflows/resume-project.md": "94ac2cac4c562557",
"gsd-core/workflows/review.md": "8c7288479748235f",
"gsd-core/workflows/scan.md": "29f3b65f5d9de885",
"gsd-core/workflows/secure-phase.md": "858b5e1152b569ed",
"gsd-core/workflows/session-report.md": "dd8fa011c9394075",
"gsd-core/workflows/settings-advanced.md": "bc781c33070b6d4f",
"gsd-core/workflows/settings-integrations.md": "d0443a29f3f924ec",
"gsd-core/workflows/settings.md": "3395b334321ac6fa",
"gsd-core/workflows/ship.md": "125045072ab5017d",
"gsd-core/workflows/sketch-wrap-up.md": "7709bdd7a70f736c",
"gsd-core/workflows/sketch.md": "bfe5a781d6da3ce8",
"gsd-core/workflows/spec-phase.md": "47cea2b5efffa6b0",
"gsd-core/workflows/spike-wrap-up.md": "53a2c51a8d9e6b08",
"gsd-core/workflows/spike.md": "c2f115f0d3251654",
"gsd-core/workflows/stats.md": "0d7449acf349feec",
"gsd-core/workflows/sync-skills.md": "e2b793963799f8ce",
"gsd-core/workflows/thread.md": "d3f768ce0f4b4a4d",
"gsd-core/workflows/transition.md": "c4bded570fafe712",
"gsd-core/workflows/ui-phase.md": "b373c964b222324c",
"gsd-core/workflows/ui-review.md": "a9b2cbba80482cd8",
"gsd-core/workflows/ultraplan-phase.md": "18bbb3b5fcd30f0c",
"gsd-core/workflows/undo.md": "5ff7d63b0a2f46d5",
"gsd-core/workflows/update.md": "4166fd3e3ca72a7b",
"gsd-core/workflows/validate-phase.md": "4e94708c9ca15d70",
"gsd-core/workflows/verify-phase.md": "b81bd1c061c9e6d3",
"gsd-core/workflows/verify-work.md": "92fb4e876d75ded5",
"hooks/gsd-check-update.js": "79c846cd8dd54caa",
"hooks/gsd-context-monitor.js": "caa8614524452835",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",
"scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
"scripts/changeset/lint.cjs": "0066faed159154f0",
"scripts/changeset/new.cjs": "4991e21fd17f5541",
"scripts/changeset/parse.cjs": "f9a949cbcab56445",
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
"skills/gsd-add-tests/SKILL.md": "f3c1594a059de3ee",
"skills/gsd-ai-integration-phase/SKILL.md": "ba4b5f406db6de96",
"skills/gsd-audit-fix/SKILL.md": "9cea2764b92aa352",
"skills/gsd-audit-milestone/SKILL.md": "0528ef8a5834b5df",
"skills/gsd-audit-uat/SKILL.md": "6c2aa0c2b62c5233",
"skills/gsd-autonomous/SKILL.md": "d56dc692750f4926",
"skills/gsd-capture/SKILL.md": "211d601d122b5dd6",
"skills/gsd-cleanup/SKILL.md": "18cba17463c6ef97",
"skills/gsd-code-review/SKILL.md": "74749a1aff4224d7",
"skills/gsd-complete-milestone/SKILL.md": "77bee8741f8cb381",
"skills/gsd-config/SKILL.md": "5fde92e30619edcb",
"skills/gsd-debug/SKILL.md": "7e56964e14fd0a10",
"skills/gsd-discuss-phase/SKILL.md": "837d46c55cc2424e",
"skills/gsd-docs-update/SKILL.md": "5028dc5dd44bee7d",
"skills/gsd-eval-review/SKILL.md": "a300e78a27ba74d6",
"skills/gsd-execute-phase/SKILL.md": "e77bee13068600d3",
"skills/gsd-explore/SKILL.md": "d660cde0e6f31ebf",
"skills/gsd-extract-learnings/SKILL.md": "e32388999da384e4",
"skills/gsd-fast/SKILL.md": "14c407a76a40e115",
"skills/gsd-forensics/SKILL.md": "6d496a16f5ca74b3",
"skills/gsd-graphify/SKILL.md": "1bbd96129fbacc5c",
"skills/gsd-health/SKILL.md": "656c9c63852e3787",
"skills/gsd-help/SKILL.md": "28eb8d0b487239f8",
"skills/gsd-import/SKILL.md": "4d15ee09e531342f",
"skills/gsd-inbox/SKILL.md": "1315033595643485",
"skills/gsd-ingest-docs/SKILL.md": "5bd2838bf0b6dc1b",
"skills/gsd-manager/SKILL.md": "cb1cf56f5d3f66d6",
"skills/gsd-map-codebase/SKILL.md": "25d0b3adfc8b75dc",
"skills/gsd-mempalace-capture/SKILL.md": "65164de8f661d217",
"skills/gsd-mempalace-recall/SKILL.md": "4fd21539559aed6c",
"skills/gsd-milestone-summary/SKILL.md": "af84ecb400f23556",
"skills/gsd-mvp-phase/SKILL.md": "72b65ae927b280fe",
"skills/gsd-new-milestone/SKILL.md": "587574d2d475bb10",
"skills/gsd-new-project/SKILL.md": "129ac16e6a1f04ba",
"skills/gsd-ns-context/SKILL.md": "9b496da79789b3f9",
"skills/gsd-ns-ideate/SKILL.md": "84ca1cde06110981",
"skills/gsd-ns-manage/SKILL.md": "909dafa0cd19ba5a",
"skills/gsd-ns-project/SKILL.md": "fb8ad6c2223be3c3",
"skills/gsd-ns-review/SKILL.md": "022253010db0e072",
"skills/gsd-ns-workflow/SKILL.md": "14b6b1915178163f",
"skills/gsd-pause-work/SKILL.md": "b379469eed78a196",
"skills/gsd-phase/SKILL.md": "25477edc97a90c91",
"skills/gsd-plan-phase/SKILL.md": "19ead1acb151a868",
"skills/gsd-plan-review-convergence/SKILL.md": "f654089c11024027",
"skills/gsd-pr-branch/SKILL.md": "6901da15e321913e",
"skills/gsd-profile-user/SKILL.md": "6259fabfb6afe7be",
"skills/gsd-progress/SKILL.md": "85d76286162b9189",
"skills/gsd-quick/SKILL.md": "b4f4e711ba664aa0",
"skills/gsd-resume-work/SKILL.md": "04f6c2e5b579e8c4",
"skills/gsd-review-backlog/SKILL.md": "469696b944c4e7b5",
"skills/gsd-review/SKILL.md": "06044af5335989dc",
"skills/gsd-secure-phase/SKILL.md": "e64ad269c1e6e319",
"skills/gsd-settings/SKILL.md": "fcdda8dd545622ae",
"skills/gsd-ship/SKILL.md": "9615cc4c8f6de060",
"skills/gsd-sketch/SKILL.md": "90c219b843db7ec7",
"skills/gsd-spec-phase/SKILL.md": "56a5cbd606db9cba",
"skills/gsd-spike/SKILL.md": "77209fef7a04c11a",
"skills/gsd-stats/SKILL.md": "566024444ef71f44",
"skills/gsd-surface/SKILL.md": "492cda98187a969b",
"skills/gsd-thread/SKILL.md": "85326c97c83a02d1",
"skills/gsd-ui-phase/SKILL.md": "a0c8fbcbe5e3c2b9",
"skills/gsd-ui-review/SKILL.md": "081a3292a2d357f5",
"skills/gsd-ultraplan-phase/SKILL.md": "06fb3d76eb785f94",
"skills/gsd-undo/SKILL.md": "007d3b307e027af9",
"skills/gsd-update/SKILL.md": "e6e49e117c7c8f35",
"skills/gsd-validate-phase/SKILL.md": "373059517a94a194",
"skills/gsd-verify-work/SKILL.md": "4272275698e9a3fe",
"skills/gsd-workspace/SKILL.md": "06d6400d68318361",
"skills/gsd-workstreams/SKILL.md": "2f77bb94db1be1a4"
}

View File

@@ -0,0 +1,383 @@
{
".gsd-profile": "0e716a5fef4e6dc1",
".gsd/defaults.json": "560664b045e645cb",
"agents/gsd-advisor-researcher.agent.md": "0cd523fc827d40fd",
"agents/gsd-ai-researcher.agent.md": "36b15690217a4a07",
"agents/gsd-assumptions-analyzer.agent.md": "2d812e0bb0a04885",
"agents/gsd-code-fixer.agent.md": "32434a73c367faec",
"agents/gsd-code-reviewer.agent.md": "a0f0b6eafca6cf05",
"agents/gsd-codebase-mapper.agent.md": "c0d3dfa3fd9d3d8b",
"agents/gsd-debug-session-manager.agent.md": "dcfe78dafab52ae8",
"agents/gsd-debugger.agent.md": "0f7931c3e5c9f03c",
"agents/gsd-doc-classifier.agent.md": "c5025847cf6f968a",
"agents/gsd-doc-synthesizer.agent.md": "16cebf04d8998356",
"agents/gsd-doc-verifier.agent.md": "0230208ae7ab1a08",
"agents/gsd-doc-writer.agent.md": "a5aba58ecf1a6870",
"agents/gsd-domain-researcher.agent.md": "b06738b093df1cb9",
"agents/gsd-eval-auditor.agent.md": "6a7c7662aeb002a0",
"agents/gsd-eval-planner.agent.md": "14751876fc2b5f16",
"agents/gsd-executor.agent.md": "2ace688fe21cb778",
"agents/gsd-framework-selector.agent.md": "cafeec0b3489be45",
"agents/gsd-integration-checker.agent.md": "f962228d14a39fd1",
"agents/gsd-intel-updater.agent.md": "21ea4bd0bb45cc2f",
"agents/gsd-mempalace-curator.agent.md": "bbb2c654e8fbf8fb",
"agents/gsd-nyquist-auditor.agent.md": "f90fdd2c63936a90",
"agents/gsd-pattern-mapper.agent.md": "b1f488b0fa6a2395",
"agents/gsd-phase-researcher.agent.md": "a18855397c24b86d",
"agents/gsd-plan-checker.agent.md": "f425e78f7eaf2cfe",
"agents/gsd-planner.agent.md": "d67b2cf058055a82",
"agents/gsd-project-researcher.agent.md": "9cd4739389195a5f",
"agents/gsd-research-synthesizer.agent.md": "0ce237545afd492f",
"agents/gsd-roadmapper.agent.md": "03c946e0acc5d6b7",
"agents/gsd-security-auditor.agent.md": "8f858bb272471d04",
"agents/gsd-ui-auditor.agent.md": "d15ec6632ca12699",
"agents/gsd-ui-checker.agent.md": "4e46f787d6420062",
"agents/gsd-ui-researcher.agent.md": "9dd2acff7b24230e",
"agents/gsd-user-profiler.agent.md": "ae16a248e18dd42b",
"agents/gsd-verifier.agent.md": "ebd2c921c24e2d9b",
"copilot-instructions.md": "1fb04111759f1645",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/gsd-tools.cjs": "46deb2174be356dd",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"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",
"gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4",
"gsd-core/bin/verify-reapply-patches.cjs": "10226e9512dd44bf",
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
"gsd-core/contexts/review.md": "dc578fdd74bbea11",
"gsd-core/references/agent-contracts.md": "ff65e633c656c0d2",
"gsd-core/references/ai-evals.md": "b5afa786b938671e",
"gsd-core/references/ai-frameworks.md": "425dd69c629230e7",
"gsd-core/references/artifact-types.md": "f992de8b2b1a4420",
"gsd-core/references/autonomous-smart-discuss.md": "efd80aca449032ad",
"gsd-core/references/checkpoints.md": "c70b323dcb1583d5",
"gsd-core/references/common-bug-patterns.md": "780145be56352626",
"gsd-core/references/context-budget.md": "435474d5e10be65a",
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
"gsd-core/references/debugger-philosophy.md": "1cb61d4565081c88",
"gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474",
"gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e",
"gsd-core/references/domain-probes.md": "762b965e84035b72",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/requirements.json": "fbc1b355d8625eeb",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json": "66dd60957fee45f0",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json": "47fca61f076835fa",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/requirements.json": "80f04f5c04fb24cf",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json": "d38147adb0e5b342",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json": "bc552c01939bf4f8",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json": "688ec62c13e08afe",
"gsd-core/references/edge-probe.md": "5b91dca815b765e0",
"gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc",
"gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e",
"gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e",
"gsd-core/references/execute-phase-wave-guard.md": "1eb1e1e552ebd17b",
"gsd-core/references/executor-examples.md": "ba59243ed45c8ab1",
"gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4",
"gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8",
"gsd-core/references/gate-prompts.md": "43e867720e736464",
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "657a93c539c16cab",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
"gsd-core/references/model-profile-resolution.md": "1d392e37a746742a",
"gsd-core/references/model-profiles.md": "9e160d4e754b6b9e",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "2459c40bfc8a0ea8",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
"gsd-core/references/planner-guidance.md": "ccb2eab7d941313c",
"gsd-core/references/planner-human-verify-mode.md": "5262b23d822d9541",
"gsd-core/references/planner-interface-context.md": "b28fa3da6ae739a8",
"gsd-core/references/planner-load-graph-context.md": "641b6c1ce4dd0c8c",
"gsd-core/references/planner-mvp-mode.md": "35890221f823756f",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "ea950944302fba67",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
"gsd-core/references/prohibition-probe.md": "55178368c9d049d2",
"gsd-core/references/project-skills-discovery.md": "625f6e30257e10ee",
"gsd-core/references/questioning.md": "8f26dfe5794b1e6e",
"gsd-core/references/research-documentation-lookup.md": "c070007d1d72ab71",
"gsd-core/references/research-philosophy.md": "a602b41bfa081fdf",
"gsd-core/references/research-verification-protocol.md": "9c38c9d9a687e679",
"gsd-core/references/revision-loop.md": "e55ff32dd98c63df",
"gsd-core/references/scout-codebase.md": "ba266ecc18fbf172",
"gsd-core/references/security-asvs-levels.md": "4774fac3b94b6ca8",
"gsd-core/references/skeleton-template.md": "528691d1f0efa878",
"gsd-core/references/sketch-interactivity.md": "7d982fe877e1e1cc",
"gsd-core/references/sketch-theme-system.md": "33e2e96e450456f8",
"gsd-core/references/sketch-tooling.md": "df6c4f24c1c27611",
"gsd-core/references/sketch-variant-patterns.md": "66c197aa4fb52810",
"gsd-core/references/spidr-splitting.md": "074ac154c0e4f906",
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
"gsd-core/references/ui-brand.md": "48717bcfcd63bd27",
"gsd-core/references/universal-anti-patterns.md": "6a1245050b21df01",
"gsd-core/references/untrusted-input-boundary.md": "d33b80d4d348599a",
"gsd-core/references/user-profiling.md": "8e023a908d968af1",
"gsd-core/references/user-story-template.md": "0cc50e06a144ff8a",
"gsd-core/references/verification-overrides.md": "a3e2d5166d16a37b",
"gsd-core/references/verification-patterns.md": "a8e13ea38218638b",
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
"gsd-core/references/workstream-flag.md": "225910640adbb76d",
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
"gsd-core/templates/DEBUG.md": "a2eea97e7f1336bf",
"gsd-core/templates/README.md": "da29c64b438065b3",
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
"gsd-core/templates/UI-SPEC.md": "20ca56a4e3e21f01",
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
"gsd-core/templates/claude-md.md": "f436ae75a9c8518a",
"gsd-core/templates/codebase/architecture.md": "282db635ba093b1a",
"gsd-core/templates/codebase/concerns.md": "e66c584daa636fc5",
"gsd-core/templates/codebase/conventions.md": "c5f0324730852701",
"gsd-core/templates/codebase/integrations.md": "39bd23c71eedd564",
"gsd-core/templates/codebase/stack.md": "116e7e67dd87ddec",
"gsd-core/templates/codebase/structure.md": "27318be7b7c984e1",
"gsd-core/templates/codebase/testing.md": "76abff7f2050c9ea",
"gsd-core/templates/config.json": "1473dff11272d3c4",
"gsd-core/templates/context.md": "593d4e6d20fdde7c",
"gsd-core/templates/continue-here.md": "8b1dce4832c7922b",
"gsd-core/templates/copilot-instructions.md": "aea34bc52ff548ea",
"gsd-core/templates/debug-subagent-prompt.md": "8c18a89e25929d8e",
"gsd-core/templates/dev-preferences.md": "95048a71063d980b",
"gsd-core/templates/discovery.md": "e4ab738326eb70e0",
"gsd-core/templates/discussion-log.md": "da4e8e266efdc6c2",
"gsd-core/templates/milestone-archive.md": "591b6decdc0c0e51",
"gsd-core/templates/milestone.md": "74d2f750ae9f4a9c",
"gsd-core/templates/phase-prompt.md": "e2b07376944c84e8",
"gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f",
"gsd-core/templates/project.md": "e4a3b331be081e62",
"gsd-core/templates/requirements.md": "a44de4c2f146e473",
"gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0",
"gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f",
"gsd-core/templates/research-project/PITFALLS.md": "3ef75fa768422eec",
"gsd-core/templates/research-project/STACK.md": "82c85799ac4dd344",
"gsd-core/templates/research-project/SUMMARY.md": "dceb2f346388839d",
"gsd-core/templates/research.md": "b454f96fdf8b1d3d",
"gsd-core/templates/retrospective.md": "03981e30dd760103",
"gsd-core/templates/roadmap.md": "e4e35a9eb5dd4d4f",
"gsd-core/templates/spec.md": "8734f0df4df3a34b",
"gsd-core/templates/state.md": "a45a134631efe3f9",
"gsd-core/templates/summary-complex.md": "a5e40574fd8894dc",
"gsd-core/templates/summary-minimal.md": "7d09b5e709e2e67c",
"gsd-core/templates/summary-standard.md": "e8d9cf4a8377cdff",
"gsd-core/templates/summary.md": "23c40f6503b3ea98",
"gsd-core/templates/user-profile.md": "52abe2af968e8533",
"gsd-core/templates/user-setup.md": "1da2382725db080f",
"gsd-core/templates/verification-report.md": "78ab9264ce63ed7e",
"gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb",
"gsd-core/workflows/add-backlog.md": "e8483ee6b695820f",
"gsd-core/workflows/add-phase.md": "ccd0c5c85ea3172c",
"gsd-core/workflows/add-tests.md": "3868acebc8a61874",
"gsd-core/workflows/add-todo.md": "69ff299331bbedf1",
"gsd-core/workflows/ai-integration-phase.md": "4b802634f8dfcf58",
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
"gsd-core/workflows/audit-fix.md": "bd88277e075ec47f",
"gsd-core/workflows/audit-milestone.md": "3c1624402b54073d",
"gsd-core/workflows/audit-uat.md": "eccd8feb247425b0",
"gsd-core/workflows/autonomous.md": "00fa6860aa7653a8",
"gsd-core/workflows/check-todos.md": "4cdc0f448c772fbf",
"gsd-core/workflows/cleanup.md": "a67cfbd98eca5b86",
"gsd-core/workflows/code-review-fix.md": "84d5f91b2856a1f2",
"gsd-core/workflows/code-review.md": "fd8cd5c87ab977c2",
"gsd-core/workflows/complete-milestone.md": "f1a93edd3480bcf7",
"gsd-core/workflows/debug.md": "d9a9d4c858da1314",
"gsd-core/workflows/diagnose-issues.md": "3810d5329109a87e",
"gsd-core/workflows/discovery-phase.md": "8e99da61fb2b7074",
"gsd-core/workflows/discuss-phase-assumptions.md": "38ba3a06ab79f1ce",
"gsd-core/workflows/discuss-phase-power.md": "5c0d1ca6abda0383",
"gsd-core/workflows/discuss-phase.md": "1f4b3bbe790b46c8",
"gsd-core/workflows/discuss-phase/modes/advisor.md": "1247a438ddb8ba36",
"gsd-core/workflows/discuss-phase/modes/all.md": "e5fe9c9c1e2bec1a",
"gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105",
"gsd-core/workflows/discuss-phase/modes/auto.md": "7609f2b4b75f41ea",
"gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448",
"gsd-core/workflows/discuss-phase/modes/chain.md": "b54a5ee44b9d3a4b",
"gsd-core/workflows/discuss-phase/modes/default.md": "4c5ba5975dcc1e9c",
"gsd-core/workflows/discuss-phase/modes/power.md": "9c97731f22d7bce9",
"gsd-core/workflows/discuss-phase/modes/text.md": "c384c22ffff4dc02",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "2b56ec2868cbddb4",
"gsd-core/workflows/do.md": "4fe59d153e5d36b9",
"gsd-core/workflows/docs-update.md": "15436f1f87ce9bd2",
"gsd-core/workflows/edit-phase.md": "a619911fd32d1f8e",
"gsd-core/workflows/eval-review.md": "b29095c5e7149975",
"gsd-core/workflows/execute-phase.md": "fb2a96db43d28f8d",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "8d835dbbc9bc72cf",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "a01e6aae9f3e416e",
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
"gsd-core/workflows/execute-plan.md": "da6dddd551737699",
"gsd-core/workflows/explore.md": "072bcf510734657b",
"gsd-core/workflows/extract-learnings.md": "83d19c1c9f87f797",
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
"gsd-core/workflows/forensics.md": "54e9996cd7bcc05d",
"gsd-core/workflows/graduation.md": "e64a735e71c39307",
"gsd-core/workflows/health.md": "56d1a87cf530c9a8",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495",
"gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa",
"gsd-core/workflows/help/modes/full.md": "bb4ee969b98be538",
"gsd-core/workflows/help/modes/topic.md": "a404990fcf2d7df7",
"gsd-core/workflows/import.md": "0e4a8880126d196b",
"gsd-core/workflows/inbox.md": "a448220c548f27bc",
"gsd-core/workflows/ingest-docs.md": "c34b9511b9ea92d8",
"gsd-core/workflows/insert-phase.md": "fc8452ee57b3dbf8",
"gsd-core/workflows/list-phase-assumptions.md": "e7b5e35c9452e3b3",
"gsd-core/workflows/list-seeds.md": "7040c63f68b59c10",
"gsd-core/workflows/list-workspaces.md": "e8e224465d78e733",
"gsd-core/workflows/manager.md": "c4eac43acf69d7fd",
"gsd-core/workflows/map-codebase.md": "576d06b03edff8db",
"gsd-core/workflows/milestone-summary.md": "20d93b795568d970",
"gsd-core/workflows/mvp-phase.md": "803ddbd575f86311",
"gsd-core/workflows/new-milestone.md": "34888afc152da98e",
"gsd-core/workflows/new-project.md": "d0af61f0e5f99485",
"gsd-core/workflows/new-workspace.md": "e61ad52a17e7570a",
"gsd-core/workflows/next.md": "a4cb2a110e0bce2c",
"gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b",
"gsd-core/workflows/note.md": "4a5ee74cf2fc1f54",
"gsd-core/workflows/pause-work.md": "324e04e675dc7f7f",
"gsd-core/workflows/plan-milestone-gaps.md": "c0eb896eb42e22d4",
"gsd-core/workflows/plan-phase.md": "50042ca359933c51",
"gsd-core/workflows/plan-review-convergence.md": "c238b5858ceb4e57",
"gsd-core/workflows/plant-seed.md": "56451bdf104983b3",
"gsd-core/workflows/pr-branch.md": "a080aed95785cf32",
"gsd-core/workflows/profile-user.md": "f19b17f34ebd4527",
"gsd-core/workflows/progress.md": "09d94d774537e7e0",
"gsd-core/workflows/quick.md": "6700d7e6cd462aeb",
"gsd-core/workflows/reapply-patches.md": "7e1d16d9a9ccbb03",
"gsd-core/workflows/remove-phase.md": "e94ddfe4eabc0e08",
"gsd-core/workflows/remove-workspace.md": "f28be7f32249f0d4",
"gsd-core/workflows/resume-project.md": "4ebcb4acd3c29302",
"gsd-core/workflows/review.md": "58557fe552b6ff89",
"gsd-core/workflows/scan.md": "28a2847b8d04156e",
"gsd-core/workflows/secure-phase.md": "bae509fa254fe435",
"gsd-core/workflows/session-report.md": "2e5b1205324ddefa",
"gsd-core/workflows/settings-advanced.md": "dd145f9529a2502c",
"gsd-core/workflows/settings-integrations.md": "58e6551f9f342736",
"gsd-core/workflows/settings.md": "5dda66befcbb3ad8",
"gsd-core/workflows/ship.md": "0ee4d6bc7e34f716",
"gsd-core/workflows/sketch-wrap-up.md": "804bb69e6c3590a0",
"gsd-core/workflows/sketch.md": "b4d17647e0fb9e5d",
"gsd-core/workflows/spec-phase.md": "117abebab62d6df7",
"gsd-core/workflows/spike-wrap-up.md": "e203ed8e057f654c",
"gsd-core/workflows/spike.md": "716d74cdb2e39a3e",
"gsd-core/workflows/stats.md": "49085df6d4793df3",
"gsd-core/workflows/sync-skills.md": "eca50ffe8320dba8",
"gsd-core/workflows/thread.md": "4c44f10d41740f1d",
"gsd-core/workflows/transition.md": "724b6e9b34d85f26",
"gsd-core/workflows/ui-phase.md": "9fefa0db49f2aa3f",
"gsd-core/workflows/ui-review.md": "731bca05f9770a86",
"gsd-core/workflows/ultraplan-phase.md": "2dda203295895bc1",
"gsd-core/workflows/undo.md": "ba1ef7aa80bef6bd",
"gsd-core/workflows/update.md": "712ab18a9b7c14f5",
"gsd-core/workflows/validate-phase.md": "f923eac9442b6053",
"gsd-core/workflows/verify-phase.md": "543845af6f701518",
"gsd-core/workflows/verify-work.md": "e253fb8e33c68fa4",
"hooks/gsd-session.json": "0a462834f2a28fee",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",
"scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
"scripts/changeset/lint.cjs": "0066faed159154f0",
"scripts/changeset/new.cjs": "4991e21fd17f5541",
"scripts/changeset/parse.cjs": "f9a949cbcab56445",
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
"skills/gsd-add-tests/SKILL.md": "dfe3f8a07f34c438",
"skills/gsd-ai-integration-phase/SKILL.md": "7cdaa253924740b0",
"skills/gsd-audit-fix/SKILL.md": "ac3e209167e2171a",
"skills/gsd-audit-milestone/SKILL.md": "faa9473569f5fa4b",
"skills/gsd-audit-uat/SKILL.md": "00f0a430a5c43da0",
"skills/gsd-autonomous/SKILL.md": "14495e0ad75bc1fb",
"skills/gsd-capture/SKILL.md": "cbae7b34a19b53bb",
"skills/gsd-cleanup/SKILL.md": "d6eb72a251354d07",
"skills/gsd-code-review/SKILL.md": "bc47a62d7788d723",
"skills/gsd-complete-milestone/SKILL.md": "d92573108882ac2f",
"skills/gsd-config/SKILL.md": "2bbc2d3ee41d5360",
"skills/gsd-debug/SKILL.md": "7abbde8111d8592c",
"skills/gsd-discuss-phase/SKILL.md": "1a6496fbbf49df6d",
"skills/gsd-docs-update/SKILL.md": "abca4017f556ebb6",
"skills/gsd-eval-review/SKILL.md": "8efd5502979365d2",
"skills/gsd-execute-phase/SKILL.md": "40fb582d30596e03",
"skills/gsd-explore/SKILL.md": "410ba39431b4741d",
"skills/gsd-extract-learnings/SKILL.md": "1651508a604db325",
"skills/gsd-fast/SKILL.md": "ee4c04a1f009052a",
"skills/gsd-forensics/SKILL.md": "604425b1aff67ddb",
"skills/gsd-graphify/SKILL.md": "ad09359c401677a5",
"skills/gsd-health/SKILL.md": "f5a554c058adc41a",
"skills/gsd-help/SKILL.md": "effcefa49fba6aca",
"skills/gsd-import/SKILL.md": "1b3dde7a9bbdb928",
"skills/gsd-inbox/SKILL.md": "cb9ed3865b67c04f",
"skills/gsd-ingest-docs/SKILL.md": "10500de29525f6cf",
"skills/gsd-manager/SKILL.md": "9946975bec15e737",
"skills/gsd-map-codebase/SKILL.md": "75806f8189d8af49",
"skills/gsd-mempalace-capture/SKILL.md": "d7e72629ec3772e2",
"skills/gsd-mempalace-recall/SKILL.md": "5f397524acf592d1",
"skills/gsd-milestone-summary/SKILL.md": "5ca1dabfe0cd85f0",
"skills/gsd-mvp-phase/SKILL.md": "60ac3c3fa6a6a19b",
"skills/gsd-new-milestone/SKILL.md": "e5eafe44e271bb92",
"skills/gsd-new-project/SKILL.md": "4ce68352221126c6",
"skills/gsd-ns-context/SKILL.md": "d61edde87ae53105",
"skills/gsd-ns-ideate/SKILL.md": "ca62cdf78ebe3585",
"skills/gsd-ns-manage/SKILL.md": "9b1b7f6d9b877fcd",
"skills/gsd-ns-project/SKILL.md": "f1a666fb76527e6b",
"skills/gsd-ns-review/SKILL.md": "6405d0b1cf3f245d",
"skills/gsd-ns-workflow/SKILL.md": "4f8a304f83832794",
"skills/gsd-pause-work/SKILL.md": "4f0caa008a8001ff",
"skills/gsd-phase/SKILL.md": "d38c7f9b1d0d2360",
"skills/gsd-plan-phase/SKILL.md": "d257bb9b1786039d",
"skills/gsd-plan-review-convergence/SKILL.md": "9338b49ecddd4ae8",
"skills/gsd-pr-branch/SKILL.md": "9cd9740db385d95a",
"skills/gsd-profile-user/SKILL.md": "052a8e17ecda40f1",
"skills/gsd-progress/SKILL.md": "28b94a19f2bccb78",
"skills/gsd-quick/SKILL.md": "d66072399c0aa371",
"skills/gsd-resume-work/SKILL.md": "e3ab06060bdd9df0",
"skills/gsd-review-backlog/SKILL.md": "2af20161e555fb42",
"skills/gsd-review/SKILL.md": "980080d635e66afe",
"skills/gsd-secure-phase/SKILL.md": "8666d8933e02c74f",
"skills/gsd-settings/SKILL.md": "4ef66b6dc3a2b8ff",
"skills/gsd-ship/SKILL.md": "ea26e3a839afb372",
"skills/gsd-sketch/SKILL.md": "1187d843efabea37",
"skills/gsd-spec-phase/SKILL.md": "e402110c96d1f44f",
"skills/gsd-spike/SKILL.md": "de84271bdba0ef67",
"skills/gsd-stats/SKILL.md": "e0beaf89d27c8058",
"skills/gsd-surface/SKILL.md": "2f2647c7bd664605",
"skills/gsd-thread/SKILL.md": "8db4d6ebcf0a8898",
"skills/gsd-ui-phase/SKILL.md": "317081b3be7c536f",
"skills/gsd-ui-review/SKILL.md": "dc07bbe9094b6dbe",
"skills/gsd-ultraplan-phase/SKILL.md": "b528b261b43000cc",
"skills/gsd-undo/SKILL.md": "a9675a18d90cf91d",
"skills/gsd-update/SKILL.md": "94e3baab2c32b338",
"skills/gsd-validate-phase/SKILL.md": "6130f42daa172ceb",
"skills/gsd-verify-work/SKILL.md": "da83518143f85525",
"skills/gsd-workspace/SKILL.md": "d5ae2727cb5d9c0c",
"skills/gsd-workstreams/SKILL.md": "c9d172e6f971f846"
}

View File

@@ -0,0 +1,452 @@
{
".gsd-profile": "0e716a5fef4e6dc1",
".gsd/defaults.json": "560664b045e645cb",
"agents/gsd-advisor-researcher.md": "7dfdadd98ec1cccc",
"agents/gsd-ai-researcher.md": "0c7be272a6bf0ec6",
"agents/gsd-assumptions-analyzer.md": "dc5e9973ff0740d7",
"agents/gsd-code-fixer.md": "d5ccf417e00a2a30",
"agents/gsd-code-reviewer.md": "208cc79888f4afc3",
"agents/gsd-codebase-mapper.md": "a1930b15964fb5dc",
"agents/gsd-debug-session-manager.md": "b5ea52be3681f202",
"agents/gsd-debugger.md": "de22db5ea3c6dc40",
"agents/gsd-doc-classifier.md": "5807f1f7cfa40c42",
"agents/gsd-doc-synthesizer.md": "0897098024c17ccd",
"agents/gsd-doc-verifier.md": "9934ec11845d41c3",
"agents/gsd-doc-writer.md": "9569af1e7da67c7a",
"agents/gsd-domain-researcher.md": "56395dbdabf076f6",
"agents/gsd-eval-auditor.md": "fedfa9dacc1a710c",
"agents/gsd-eval-planner.md": "2049dac060d00eda",
"agents/gsd-executor.md": "eac0eacad4443ec2",
"agents/gsd-framework-selector.md": "4b77eebbe9288d80",
"agents/gsd-integration-checker.md": "cc0411b5ccc430f5",
"agents/gsd-intel-updater.md": "7f509a2fb5acb0fe",
"agents/gsd-mempalace-curator.md": "63676937f8970bf3",
"agents/gsd-nyquist-auditor.md": "f8a86a8bcdbb1a5d",
"agents/gsd-pattern-mapper.md": "1229c215677f740d",
"agents/gsd-phase-researcher.md": "e0002e198c1b927e",
"agents/gsd-plan-checker.md": "7a86d4b29de90549",
"agents/gsd-planner.md": "a83fd27f2d1fee34",
"agents/gsd-project-researcher.md": "e2f0675c872e369b",
"agents/gsd-research-synthesizer.md": "78dc4c71aed61878",
"agents/gsd-roadmapper.md": "9522c4b2ecc008ae",
"agents/gsd-security-auditor.md": "4980804a2e09047a",
"agents/gsd-ui-auditor.md": "a4f174ae28efc879",
"agents/gsd-ui-checker.md": "66b380ffcdfec7b5",
"agents/gsd-ui-researcher.md": "fe237aa42ccd9ad2",
"agents/gsd-user-profiler.md": "622220df0654b6bf",
"agents/gsd-verifier.md": "5ec35372f0a58d48",
"commands/gsd-add-tests.md": "1f89b16ab2cca426",
"commands/gsd-ai-integration-phase.md": "3ccac39673ffb92c",
"commands/gsd-audit-fix.md": "d88502ffa2151cec",
"commands/gsd-audit-milestone.md": "db525e85095d268a",
"commands/gsd-audit-uat.md": "70d1d0f175734d8f",
"commands/gsd-autonomous.md": "b4724d55cb75d902",
"commands/gsd-capture.md": "4071615ec4f8e92d",
"commands/gsd-cleanup.md": "b83caf1561ecd265",
"commands/gsd-code-review.md": "67cc90ca2ed00f06",
"commands/gsd-complete-milestone.md": "203e0b262ac5caff",
"commands/gsd-config.md": "3bc7743f39e28a92",
"commands/gsd-debug.md": "145a7f7f15436296",
"commands/gsd-discuss-phase.md": "3a484d3d237dbfc5",
"commands/gsd-docs-update.md": "d224ab2eeb46d98c",
"commands/gsd-eval-review.md": "bc16912f0a5584da",
"commands/gsd-execute-phase.md": "d0ce08060b83d88c",
"commands/gsd-explore.md": "dad2dfe948cd0d9f",
"commands/gsd-extract-learnings.md": "c4fb98df89e4f380",
"commands/gsd-fast.md": "184dd72f2f00203b",
"commands/gsd-forensics.md": "ff8a9a8f91c2c5e5",
"commands/gsd-graphify.md": "42bd74b6c09a75d6",
"commands/gsd-health.md": "0239b3eafb48000b",
"commands/gsd-help.md": "d7685d97f7fab1d5",
"commands/gsd-import.md": "02134b777c821174",
"commands/gsd-inbox.md": "e6bcee3f863d20db",
"commands/gsd-ingest-docs.md": "9e7f8757b9408c01",
"commands/gsd-manager.md": "f300b708a5487c76",
"commands/gsd-map-codebase.md": "cf50f4a600119c8a",
"commands/gsd-mempalace-capture.md": "eab7aa94d6e71138",
"commands/gsd-mempalace-recall.md": "7da498f89250cb0f",
"commands/gsd-milestone-summary.md": "adfad2cf43fc5aad",
"commands/gsd-mvp-phase.md": "e8debeee627a0bf2",
"commands/gsd-new-milestone.md": "64b997f99b1e6293",
"commands/gsd-new-project.md": "f1a6288e80cc16b0",
"commands/gsd-ns-context.md": "b551dcc549c6a23f",
"commands/gsd-ns-ideate.md": "32f561de74b1bc7b",
"commands/gsd-ns-manage.md": "24445a84bd817c5b",
"commands/gsd-ns-project.md": "b39b509ac4161d28",
"commands/gsd-ns-review.md": "c8550463fbab5e76",
"commands/gsd-ns-workflow.md": "8226be5dc9e99b90",
"commands/gsd-pause-work.md": "59630f05f95fff68",
"commands/gsd-phase.md": "9a073dcd0f934f90",
"commands/gsd-plan-phase.md": "57de92131fcb16b8",
"commands/gsd-plan-review-convergence.md": "bded2d831f8ac9de",
"commands/gsd-pr-branch.md": "ef2eedb0ed4295da",
"commands/gsd-profile-user.md": "0e99de36619c3b7d",
"commands/gsd-progress.md": "44a7c784dc98f735",
"commands/gsd-quick.md": "0061e478a896265d",
"commands/gsd-resume-work.md": "a98b447fffe07e1e",
"commands/gsd-review-backlog.md": "347abbe2fdad79c9",
"commands/gsd-review.md": "473b5a21ef15d510",
"commands/gsd-secure-phase.md": "1631b1ecedbee373",
"commands/gsd-settings.md": "8e4a2673e7c96cad",
"commands/gsd-ship.md": "de9d81fe35184ae2",
"commands/gsd-sketch.md": "021add6f8eb7e7f3",
"commands/gsd-spec-phase.md": "7c95987dcd7aa3fb",
"commands/gsd-spike.md": "8102cc426fa1f1b3",
"commands/gsd-stats.md": "eb39e4c4ec8eccea",
"commands/gsd-surface.md": "1fb3de1651eb182a",
"commands/gsd-thread.md": "fc5975fdb73eb045",
"commands/gsd-ui-phase.md": "b91b691e1eb007c2",
"commands/gsd-ui-review.md": "2f9842e07e7df4df",
"commands/gsd-ultraplan-phase.md": "2d50a8e37952daeb",
"commands/gsd-undo.md": "5504f2280ad1e6d4",
"commands/gsd-update.md": "1e0e80a3bfeebddf",
"commands/gsd-validate-phase.md": "9c37396572d1d58c",
"commands/gsd-verify-work.md": "86a42f859bc26dd6",
"commands/gsd-workspace.md": "5c40114e6af87e3d",
"commands/gsd-workstreams.md": "112660ceb663c750",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/gsd-tools.cjs": "46deb2174be356dd",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"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",
"gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4",
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
"gsd-core/contexts/review.md": "dc578fdd74bbea11",
"gsd-core/references/agent-contracts.md": "ff65e633c656c0d2",
"gsd-core/references/ai-evals.md": "b5afa786b938671e",
"gsd-core/references/ai-frameworks.md": "f827de93dde124eb",
"gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e",
"gsd-core/references/autonomous-smart-discuss.md": "273b371c5751f35a",
"gsd-core/references/checkpoints.md": "3001eeccb319781b",
"gsd-core/references/common-bug-patterns.md": "780145be56352626",
"gsd-core/references/context-budget.md": "304dcdab82a27623",
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
"gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3",
"gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474",
"gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e",
"gsd-core/references/domain-probes.md": "762b965e84035b72",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/requirements.json": "fbc1b355d8625eeb",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json": "66dd60957fee45f0",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json": "47fca61f076835fa",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/requirements.json": "80f04f5c04fb24cf",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json": "d38147adb0e5b342",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json": "bc552c01939bf4f8",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json": "688ec62c13e08afe",
"gsd-core/references/edge-probe.md": "692b44ca096f96e6",
"gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc",
"gsd-core/references/execute-phase-between-wave-reset.md": "44e31bdae72ed5d5",
"gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e",
"gsd-core/references/execute-phase-wave-guard.md": "b0e27ed2d8405974",
"gsd-core/references/executor-examples.md": "ba59243ed45c8ab1",
"gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4",
"gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8",
"gsd-core/references/gate-prompts.md": "099c8d52e3562336",
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "9840f521ad6612b5",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
"gsd-core/references/model-profile-resolution.md": "f32bb05102839767",
"gsd-core/references/model-profiles.md": "b7dccb17609c2a0f",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e562947d1bf5c5a4",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
"gsd-core/references/planner-guidance.md": "140b1266eeb096cb",
"gsd-core/references/planner-human-verify-mode.md": "5e7925ad77d931d1",
"gsd-core/references/planner-interface-context.md": "b28fa3da6ae739a8",
"gsd-core/references/planner-load-graph-context.md": "ca7a7af3f35ae61b",
"gsd-core/references/planner-mvp-mode.md": "ec33050db81101a8",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "e2330447f33f6609",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
"gsd-core/references/prohibition-probe.md": "8f3eb787e3845e2f",
"gsd-core/references/project-skills-discovery.md": "2d352e05e7773a6b",
"gsd-core/references/questioning.md": "faac32813d1735bd",
"gsd-core/references/research-documentation-lookup.md": "c070007d1d72ab71",
"gsd-core/references/research-philosophy.md": "62930e66cc979c1a",
"gsd-core/references/research-verification-protocol.md": "9c38c9d9a687e679",
"gsd-core/references/revision-loop.md": "e55ff32dd98c63df",
"gsd-core/references/scout-codebase.md": "ba266ecc18fbf172",
"gsd-core/references/security-asvs-levels.md": "4774fac3b94b6ca8",
"gsd-core/references/skeleton-template.md": "528691d1f0efa878",
"gsd-core/references/sketch-interactivity.md": "7d982fe877e1e1cc",
"gsd-core/references/sketch-theme-system.md": "33e2e96e450456f8",
"gsd-core/references/sketch-tooling.md": "df6c4f24c1c27611",
"gsd-core/references/sketch-variant-patterns.md": "66c197aa4fb52810",
"gsd-core/references/spidr-splitting.md": "074ac154c0e4f906",
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
"gsd-core/references/ui-brand.md": "48717bcfcd63bd27",
"gsd-core/references/universal-anti-patterns.md": "6a1245050b21df01",
"gsd-core/references/untrusted-input-boundary.md": "d33b80d4d348599a",
"gsd-core/references/user-profiling.md": "b50416fe57c1b321",
"gsd-core/references/user-story-template.md": "0cc50e06a144ff8a",
"gsd-core/references/verification-overrides.md": "a3e2d5166d16a37b",
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
"gsd-core/references/workstream-flag.md": "19c02b83bd1692bf",
"gsd-core/references/worktree-branch-check.md": "ab004404d028cc0d",
"gsd-core/references/worktree-path-safety.md": "66de0b35266c807d",
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
"gsd-core/templates/DEBUG.md": "57bd61bfd1d98e7e",
"gsd-core/templates/README.md": "83a3d5b593587e83",
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
"gsd-core/templates/UI-SPEC.md": "20ca56a4e3e21f01",
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
"gsd-core/templates/claude-md.md": "d6d7da8b7817a04c",
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
"gsd-core/templates/codebase/conventions.md": "c2e07698dad6b364",
"gsd-core/templates/codebase/integrations.md": "39bd23c71eedd564",
"gsd-core/templates/codebase/stack.md": "116e7e67dd87ddec",
"gsd-core/templates/codebase/structure.md": "762b16f9a6488474",
"gsd-core/templates/codebase/testing.md": "76abff7f2050c9ea",
"gsd-core/templates/config.json": "1473dff11272d3c4",
"gsd-core/templates/context.md": "69b01e7909ea3f66",
"gsd-core/templates/continue-here.md": "f522a51b6895fba8",
"gsd-core/templates/copilot-instructions.md": "aea34bc52ff548ea",
"gsd-core/templates/debug-subagent-prompt.md": "8c18a89e25929d8e",
"gsd-core/templates/dev-preferences.md": "95048a71063d980b",
"gsd-core/templates/discovery.md": "e4ab738326eb70e0",
"gsd-core/templates/discussion-log.md": "cac1b48ec0f4dcb8",
"gsd-core/templates/milestone-archive.md": "591b6decdc0c0e51",
"gsd-core/templates/milestone.md": "74d2f750ae9f4a9c",
"gsd-core/templates/phase-prompt.md": "213ccd947451ff2b",
"gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f",
"gsd-core/templates/project.md": "1f687c7a88381080",
"gsd-core/templates/requirements.md": "a44de4c2f146e473",
"gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0",
"gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f",
"gsd-core/templates/research-project/PITFALLS.md": "3ef75fa768422eec",
"gsd-core/templates/research-project/STACK.md": "82c85799ac4dd344",
"gsd-core/templates/research-project/SUMMARY.md": "dceb2f346388839d",
"gsd-core/templates/research.md": "fa6dfb2ff2e8d273",
"gsd-core/templates/retrospective.md": "03981e30dd760103",
"gsd-core/templates/roadmap.md": "e4e35a9eb5dd4d4f",
"gsd-core/templates/spec.md": "7dc900c355098d8b",
"gsd-core/templates/state.md": "73e424b8c70b765c",
"gsd-core/templates/summary-complex.md": "a5e40574fd8894dc",
"gsd-core/templates/summary-minimal.md": "7d09b5e709e2e67c",
"gsd-core/templates/summary-standard.md": "e8d9cf4a8377cdff",
"gsd-core/templates/summary.md": "23c40f6503b3ea98",
"gsd-core/templates/user-profile.md": "20749f23e4c413fc",
"gsd-core/templates/user-setup.md": "78b7d718b6e8d67c",
"gsd-core/templates/verification-report.md": "dd5faa6254183731",
"gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb",
"gsd-core/workflows/add-backlog.md": "05276889f397ae70",
"gsd-core/workflows/add-phase.md": "27164a671e14a789",
"gsd-core/workflows/add-tests.md": "e8a1387538bf94c6",
"gsd-core/workflows/add-todo.md": "d17cd00fa6610666",
"gsd-core/workflows/ai-integration-phase.md": "f103a92a82055846",
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
"gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b",
"gsd-core/workflows/audit-milestone.md": "5e9a35af57344e04",
"gsd-core/workflows/audit-uat.md": "69dbdec25cae2f12",
"gsd-core/workflows/autonomous.md": "70065ffffd8886cf",
"gsd-core/workflows/check-todos.md": "a993c1e7b0eff1f6",
"gsd-core/workflows/cleanup.md": "2bd6ad5f107fe439",
"gsd-core/workflows/code-review-fix.md": "c62547be55f13dcd",
"gsd-core/workflows/code-review.md": "fcb3f24e4cecc737",
"gsd-core/workflows/complete-milestone.md": "023cc8aa729b8987",
"gsd-core/workflows/debug.md": "2e3c29ded1ce0d28",
"gsd-core/workflows/diagnose-issues.md": "fa7ae5bb16f424a4",
"gsd-core/workflows/discovery-phase.md": "7dcf150998559c11",
"gsd-core/workflows/discuss-phase-assumptions.md": "6b33545647b2fea4",
"gsd-core/workflows/discuss-phase-power.md": "290c0d83d783f9f6",
"gsd-core/workflows/discuss-phase.md": "ed3b4ba5216c2bdb",
"gsd-core/workflows/discuss-phase/modes/advisor.md": "5aa0d0e4198a5364",
"gsd-core/workflows/discuss-phase/modes/all.md": "d2a1d16e2508a0cd",
"gsd-core/workflows/discuss-phase/modes/analyze.md": "c824ef897199b730",
"gsd-core/workflows/discuss-phase/modes/auto.md": "be6041997f72b02e",
"gsd-core/workflows/discuss-phase/modes/batch.md": "c23d5bdbdb60362c",
"gsd-core/workflows/discuss-phase/modes/chain.md": "c3eab4e57f93bd27",
"gsd-core/workflows/discuss-phase/modes/default.md": "4ada4fe332c5c985",
"gsd-core/workflows/discuss-phase/modes/power.md": "55b61b7dc83a58b2",
"gsd-core/workflows/discuss-phase/modes/text.md": "adec29a0217b6664",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "cd5d01c9ef84ab73",
"gsd-core/workflows/do.md": "e00573dc44d407b5",
"gsd-core/workflows/docs-update.md": "b05a59f3079f6fa7",
"gsd-core/workflows/edit-phase.md": "a3ab51739c5c021c",
"gsd-core/workflows/eval-review.md": "8cc5788e32c15783",
"gsd-core/workflows/execute-phase.md": "1816d1337fff9170",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "c133828cf177a772",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80",
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
"gsd-core/workflows/execute-plan.md": "0f88a132f66b3d8f",
"gsd-core/workflows/explore.md": "aee57d95497ca50a",
"gsd-core/workflows/extract-learnings.md": "ce4b5388074f19a3",
"gsd-core/workflows/fast.md": "0162075e44072447",
"gsd-core/workflows/forensics.md": "063dd4fe9eb8de15",
"gsd-core/workflows/graduation.md": "d00ac4dfe7e1cc43",
"gsd-core/workflows/health.md": "b53e17edbf70ff96",
"gsd-core/workflows/help.md": "08e1349950c5602a",
"gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495",
"gsd-core/workflows/help/modes/default.md": "37c5149aae232e61",
"gsd-core/workflows/help/modes/full.md": "58d35e918fb1f868",
"gsd-core/workflows/help/modes/topic.md": "9f00f5f94c5497aa",
"gsd-core/workflows/import.md": "791424ae67c9cf32",
"gsd-core/workflows/inbox.md": "797c287852eb8957",
"gsd-core/workflows/ingest-docs.md": "b8b06f0561e5e68f",
"gsd-core/workflows/insert-phase.md": "0ab06e370253622b",
"gsd-core/workflows/list-phase-assumptions.md": "eb986c301d59f620",
"gsd-core/workflows/list-seeds.md": "5c298515026e60b1",
"gsd-core/workflows/list-workspaces.md": "9b78bb9f71029169",
"gsd-core/workflows/manager.md": "cf0f01254eabfec7",
"gsd-core/workflows/map-codebase.md": "d43dffe5098a8684",
"gsd-core/workflows/milestone-summary.md": "40e3049e42ecde63",
"gsd-core/workflows/mvp-phase.md": "542d898e0e9b928f",
"gsd-core/workflows/new-milestone.md": "9912521d111bdd22",
"gsd-core/workflows/new-project.md": "559e93f61313311b",
"gsd-core/workflows/new-workspace.md": "7045e17f5dbdc204",
"gsd-core/workflows/next.md": "6c3900ed84f03670",
"gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b",
"gsd-core/workflows/note.md": "1c1e466c764e3deb",
"gsd-core/workflows/pause-work.md": "0be71264eafd16dc",
"gsd-core/workflows/plan-milestone-gaps.md": "1976bf2001969719",
"gsd-core/workflows/plan-phase.md": "8975739befb097bc",
"gsd-core/workflows/plan-review-convergence.md": "783c5171101b26b9",
"gsd-core/workflows/plant-seed.md": "b28224f37faa9b95",
"gsd-core/workflows/pr-branch.md": "1f77535b6b156ad9",
"gsd-core/workflows/profile-user.md": "0d86d846075afe0e",
"gsd-core/workflows/progress.md": "098f9bc1243cf6db",
"gsd-core/workflows/quick.md": "3f9e1e6349a6adec",
"gsd-core/workflows/reapply-patches.md": "2d7dada9edec108b",
"gsd-core/workflows/remove-phase.md": "f76e1c2a4dd31a09",
"gsd-core/workflows/remove-workspace.md": "dadbb14d9033ea3f",
"gsd-core/workflows/resume-project.md": "3dcaa7abe1800d35",
"gsd-core/workflows/review.md": "c12c3029d8640d31",
"gsd-core/workflows/scan.md": "8e1bbf2eed1752ca",
"gsd-core/workflows/secure-phase.md": "7bd4c335484fd121",
"gsd-core/workflows/session-report.md": "2e5b1205324ddefa",
"gsd-core/workflows/settings-advanced.md": "63a3916bf75ec6b3",
"gsd-core/workflows/settings-integrations.md": "d6e399eea4b4f3f9",
"gsd-core/workflows/settings.md": "507edbebad95cfc0",
"gsd-core/workflows/ship.md": "597f9423dd372337",
"gsd-core/workflows/sketch-wrap-up.md": "6780757b2db165ac",
"gsd-core/workflows/sketch.md": "4221996fa3d87f7c",
"gsd-core/workflows/spec-phase.md": "fca5397bf040156d",
"gsd-core/workflows/spike-wrap-up.md": "ec64f0f7ab03ef9b",
"gsd-core/workflows/spike.md": "9e37f8067adf87b7",
"gsd-core/workflows/stats.md": "17b4f2059f4b4ef2",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "06e31fdaf02ccabc",
"gsd-core/workflows/transition.md": "96ce39403ca69594",
"gsd-core/workflows/ui-phase.md": "dea2f2d43a43e0d0",
"gsd-core/workflows/ui-review.md": "6b16a7f7783be471",
"gsd-core/workflows/ultraplan-phase.md": "752df97bb6c14ce2",
"gsd-core/workflows/undo.md": "18dec684fb1076f9",
"gsd-core/workflows/update.md": "a27dcfd2814bf2b1",
"gsd-core/workflows/validate-phase.md": "f513c28c01a44cb7",
"gsd-core/workflows/verify-phase.md": "452968b6becb18a1",
"gsd-core/workflows/verify-work.md": "24d323b667d15d01",
"hooks/gsd-cursor-post-tool.js": "019d503aee8b4a3f",
"hooks/gsd-cursor-session-start.js": "c6e04ed597ea7020",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",
"scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
"scripts/changeset/lint.cjs": "0066faed159154f0",
"scripts/changeset/new.cjs": "4991e21fd17f5541",
"scripts/changeset/parse.cjs": "f9a949cbcab56445",
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
"skills/gsd-add-tests/SKILL.md": "2cfc1922a2c0f308",
"skills/gsd-ai-integration-phase/SKILL.md": "de0a4cba5ad1651e",
"skills/gsd-audit-fix/SKILL.md": "6f9986ff00316053",
"skills/gsd-audit-milestone/SKILL.md": "44f048f405be71d6",
"skills/gsd-audit-uat/SKILL.md": "df085a31c102fb9e",
"skills/gsd-autonomous/SKILL.md": "446aadb5cfbf52c6",
"skills/gsd-capture/SKILL.md": "9f6b83a85441693c",
"skills/gsd-cleanup/SKILL.md": "03ba6edc18b933d3",
"skills/gsd-code-review/SKILL.md": "6add7a9afc1f6a97",
"skills/gsd-complete-milestone/SKILL.md": "e10a29da26ba0bd4",
"skills/gsd-config/SKILL.md": "0284ff80c1ed0898",
"skills/gsd-debug/SKILL.md": "4b43729be1dc2eaf",
"skills/gsd-discuss-phase/SKILL.md": "c985a6f4c161fb4d",
"skills/gsd-docs-update/SKILL.md": "670c98be5994cb11",
"skills/gsd-eval-review/SKILL.md": "bb375b7ebbc416af",
"skills/gsd-execute-phase/SKILL.md": "695061c3dfea5b2c",
"skills/gsd-explore/SKILL.md": "34681d40134229b5",
"skills/gsd-extract-learnings/SKILL.md": "3073d3a5fe7ebd07",
"skills/gsd-fast/SKILL.md": "83eba8ec0f933cbe",
"skills/gsd-forensics/SKILL.md": "7375ebd3a971da09",
"skills/gsd-graphify/SKILL.md": "721039d5f186982d",
"skills/gsd-health/SKILL.md": "614dc5d4f9a6bc63",
"skills/gsd-help/SKILL.md": "e346f3202ffae1a1",
"skills/gsd-import/SKILL.md": "308a5ecc47871055",
"skills/gsd-inbox/SKILL.md": "f9b4ff17883ee7e4",
"skills/gsd-ingest-docs/SKILL.md": "01ed9183a00252ee",
"skills/gsd-manager/SKILL.md": "62cd9f671a39e8a4",
"skills/gsd-map-codebase/SKILL.md": "f529da27d3a30b09",
"skills/gsd-mempalace-capture/SKILL.md": "c6e93f22453145e8",
"skills/gsd-mempalace-recall/SKILL.md": "62c697606d67eddc",
"skills/gsd-milestone-summary/SKILL.md": "c5dbbc8edb97a7f7",
"skills/gsd-mvp-phase/SKILL.md": "9d8e2999fa9f7830",
"skills/gsd-new-milestone/SKILL.md": "642d0741c89b911a",
"skills/gsd-new-project/SKILL.md": "18f587ac0b390d94",
"skills/gsd-ns-context/SKILL.md": "dcf5711653d57354",
"skills/gsd-ns-ideate/SKILL.md": "0114f0bc5501c1e3",
"skills/gsd-ns-manage/SKILL.md": "f3232d05d5263f5b",
"skills/gsd-ns-project/SKILL.md": "9f737a544e8d3f31",
"skills/gsd-ns-review/SKILL.md": "8c686e92f293bfdd",
"skills/gsd-ns-workflow/SKILL.md": "180031baca2f6d24",
"skills/gsd-pause-work/SKILL.md": "10e7531a2cb392ad",
"skills/gsd-phase/SKILL.md": "1a2c9b64c1af7ffc",
"skills/gsd-plan-phase/SKILL.md": "0784da05d41dcfe7",
"skills/gsd-plan-review-convergence/SKILL.md": "6ffc6592e39f2e8a",
"skills/gsd-pr-branch/SKILL.md": "725727e3c2b66543",
"skills/gsd-profile-user/SKILL.md": "eb6842b23f1f9256",
"skills/gsd-progress/SKILL.md": "117243aef3e64b85",
"skills/gsd-quick/SKILL.md": "0fdc1838759e2d25",
"skills/gsd-resume-work/SKILL.md": "492e402cb66b1fcf",
"skills/gsd-review-backlog/SKILL.md": "cf7ff999c96d2f76",
"skills/gsd-review/SKILL.md": "8f6496868bb60e10",
"skills/gsd-secure-phase/SKILL.md": "970f53251c7adff7",
"skills/gsd-settings/SKILL.md": "c06a8c93de64314e",
"skills/gsd-ship/SKILL.md": "c7eeb21a15c66189",
"skills/gsd-sketch/SKILL.md": "44605f8ec5808162",
"skills/gsd-spec-phase/SKILL.md": "5c48117fbb7aa595",
"skills/gsd-spike/SKILL.md": "3850674027d81c2a",
"skills/gsd-stats/SKILL.md": "ebbd0d39b5cee9a9",
"skills/gsd-surface/SKILL.md": "805deb95c48af938",
"skills/gsd-thread/SKILL.md": "621cde6272262eef",
"skills/gsd-ui-phase/SKILL.md": "505ad61ef61c9e9c",
"skills/gsd-ui-review/SKILL.md": "dc79fe0ad42f4948",
"skills/gsd-ultraplan-phase/SKILL.md": "51c2fe437b7d9e22",
"skills/gsd-undo/SKILL.md": "886857ca7dbf15a5",
"skills/gsd-update/SKILL.md": "d87ddffc97e68ec5",
"skills/gsd-validate-phase/SKILL.md": "9148179afa585dad",
"skills/gsd-verify-work/SKILL.md": "28367b353ddfb65d",
"skills/gsd-workspace/SKILL.md": "9b1cf8be726b7b3a",
"skills/gsd-workstreams/SKILL.md": "55a94c63e32f85a6"
}

View File

@@ -0,0 +1,403 @@
{
".gsd-profile": "0e716a5fef4e6dc1",
".gsd/defaults.json": "560664b045e645cb",
"agents/gsd-advisor-researcher.md": "b8974f54d6cd2667",
"agents/gsd-ai-researcher.md": "7e4ed9746d91879c",
"agents/gsd-assumptions-analyzer.md": "94f13d08cbd6f01b",
"agents/gsd-code-fixer.md": "f09f115629154f10",
"agents/gsd-code-reviewer.md": "3b3b7e95c56c6938",
"agents/gsd-codebase-mapper.md": "1c4c8fdcecf34d47",
"agents/gsd-debug-session-manager.md": "e79b81434bd8b6ee",
"agents/gsd-debugger.md": "159427e280bb849e",
"agents/gsd-doc-classifier.md": "e2774e90fbf7d637",
"agents/gsd-doc-synthesizer.md": "f9350f45ec29bd78",
"agents/gsd-doc-verifier.md": "2ec24cbe0582bbe6",
"agents/gsd-doc-writer.md": "c0c01f730f866273",
"agents/gsd-domain-researcher.md": "ba1b6b24e2f8a952",
"agents/gsd-eval-auditor.md": "4ac9c6b9a952c0c3",
"agents/gsd-eval-planner.md": "ad757b253472269e",
"agents/gsd-executor.md": "e62fee7c05dd1636",
"agents/gsd-framework-selector.md": "1254f9adc2e95e4b",
"agents/gsd-integration-checker.md": "adc00e1a88278110",
"agents/gsd-intel-updater.md": "3111fd1028d155b5",
"agents/gsd-mempalace-curator.md": "ab78cc2c2e75c992",
"agents/gsd-nyquist-auditor.md": "dff34a7e2d844d6c",
"agents/gsd-pattern-mapper.md": "43a2ba37b24acdb2",
"agents/gsd-phase-researcher.md": "0161476db8048a22",
"agents/gsd-plan-checker.md": "3586ddf3d32a6708",
"agents/gsd-planner.md": "8e1515e240e0c8ab",
"agents/gsd-project-researcher.md": "545faffa64ffc15d",
"agents/gsd-research-synthesizer.md": "f23808b1e9387c2d",
"agents/gsd-roadmapper.md": "5a951f07136be592",
"agents/gsd-security-auditor.md": "3c2557ee3a5e3250",
"agents/gsd-ui-auditor.md": "82e9c855984e31ec",
"agents/gsd-ui-checker.md": "cb122369806c5467",
"agents/gsd-ui-researcher.md": "e1422e3b0f142f74",
"agents/gsd-user-profiler.md": "d6cb5430d841cea6",
"agents/gsd-verifier.md": "6f3d8f7d56b72475",
"commands/gsd/add-tests.toml": "297ba4d4c285fd99",
"commands/gsd/ai-integration-phase.toml": "411ba33b9a7d9e78",
"commands/gsd/audit-fix.toml": "f4a198a455f668a9",
"commands/gsd/audit-milestone.toml": "18842eaf6ed1807a",
"commands/gsd/audit-uat.toml": "c0239d3bd04986bf",
"commands/gsd/autonomous.toml": "4f4b576a7115d8b1",
"commands/gsd/capture.toml": "c1c5793b86c8f48b",
"commands/gsd/cleanup.toml": "8e6b1c74639e50f4",
"commands/gsd/code-review.toml": "ca94ab57acdc19e6",
"commands/gsd/complete-milestone.toml": "bb7089791fcae6f4",
"commands/gsd/config.toml": "eeae6354c86627db",
"commands/gsd/debug.toml": "55b7123102654b05",
"commands/gsd/discuss-phase.toml": "894826ab56cf5607",
"commands/gsd/docs-update.toml": "47e230a6ccc690e0",
"commands/gsd/eval-review.toml": "924a24261ca3fbe2",
"commands/gsd/execute-phase.toml": "04e76e06df6d726c",
"commands/gsd/explore.toml": "7f39ab33875ab2a4",
"commands/gsd/extract-learnings.toml": "f49b286ed791997f",
"commands/gsd/fast.toml": "41874bcaee134a50",
"commands/gsd/forensics.toml": "fc2286dc36a2be56",
"commands/gsd/graphify.toml": "feac28a2841a0425",
"commands/gsd/health.toml": "b1cbaa78f2a6d289",
"commands/gsd/help.toml": "c320e77702d95d87",
"commands/gsd/import.toml": "be6c5a8f9388e8cb",
"commands/gsd/inbox.toml": "63d2fddec20d38f1",
"commands/gsd/ingest-docs.toml": "cdc0a5130f64aaa4",
"commands/gsd/manager.toml": "e4164b936405c06b",
"commands/gsd/map-codebase.toml": "3f149a36061e4eea",
"commands/gsd/mempalace-capture.toml": "b6a089205e96820c",
"commands/gsd/mempalace-recall.toml": "18359171387de00b",
"commands/gsd/milestone-summary.toml": "03de0ae6e4d23ebc",
"commands/gsd/mvp-phase.toml": "fbaa7f45ec213bb5",
"commands/gsd/new-milestone.toml": "ca13145a1b414535",
"commands/gsd/new-project.toml": "ed9c9d44e2bad612",
"commands/gsd/ns-context.toml": "fc29ba4b8e8cd6ca",
"commands/gsd/ns-ideate.toml": "dd813a2d4dd91ade",
"commands/gsd/ns-manage.toml": "2fdb297bc681288e",
"commands/gsd/ns-project.toml": "81146d2a189556bc",
"commands/gsd/ns-review.toml": "2e48bcc682bb0c6a",
"commands/gsd/ns-workflow.toml": "409dd5a1848ef755",
"commands/gsd/pause-work.toml": "11899f0727c0ffe9",
"commands/gsd/phase.toml": "e062b8c130d3e954",
"commands/gsd/plan-phase.toml": "7d1c635bbdbd1f8b",
"commands/gsd/plan-review-convergence.toml": "aa71f85915b8b0de",
"commands/gsd/pr-branch.toml": "3ac7f2bf26c5acda",
"commands/gsd/profile-user.toml": "7192730d9bf899f5",
"commands/gsd/progress.toml": "bdc9ffaf4eee0b2f",
"commands/gsd/quick.toml": "b1f6d47488560def",
"commands/gsd/resume-work.toml": "5d1e36d643573d4c",
"commands/gsd/review-backlog.toml": "19461ca74224422c",
"commands/gsd/review.toml": "b8097bb984942e8e",
"commands/gsd/secure-phase.toml": "bbf0dc4d648f11fa",
"commands/gsd/settings.toml": "5369a6fbdce65ea9",
"commands/gsd/ship.toml": "fa360f1f63c8adec",
"commands/gsd/sketch.toml": "c0892fd97a9ed127",
"commands/gsd/spec-phase.toml": "fd8eed82220ae8d3",
"commands/gsd/spike.toml": "c9e37c9efa49cfbf",
"commands/gsd/stats.toml": "33ac1de9cfdb5e06",
"commands/gsd/surface.toml": "64e1d035854eb75d",
"commands/gsd/thread.toml": "ae86f2f38d8e1697",
"commands/gsd/ui-phase.toml": "300f0618f5756083",
"commands/gsd/ui-review.toml": "9a255ddc3ff1bd6e",
"commands/gsd/ultraplan-phase.toml": "c8c09e0313da7bfd",
"commands/gsd/undo.toml": "eea7699033036219",
"commands/gsd/update.toml": "20717a113502c7ac",
"commands/gsd/validate-phase.toml": "175c1e4ce78b7274",
"commands/gsd/verify-work.toml": "58ec25cb1f5d5434",
"commands/gsd/workspace.toml": "7f1658bb61c9743d",
"commands/gsd/workstreams.toml": "95f0c349b808a84c",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/gsd-tools.cjs": "b7968e3e3af00249",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"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",
"gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4",
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
"gsd-core/contexts/review.md": "dc578fdd74bbea11",
"gsd-core/references/agent-contracts.md": "ff65e633c656c0d2",
"gsd-core/references/ai-evals.md": "b5afa786b938671e",
"gsd-core/references/ai-frameworks.md": "f827de93dde124eb",
"gsd-core/references/artifact-types.md": "a6d2e1f9453ffbf5",
"gsd-core/references/autonomous-smart-discuss.md": "273b371c5751f35a",
"gsd-core/references/checkpoints.md": "6aa620c6ca38bdf0",
"gsd-core/references/common-bug-patterns.md": "780145be56352626",
"gsd-core/references/context-budget.md": "f1ce57bf418824af",
"gsd-core/references/continuation-format.md": "a57656e8b4206ed4",
"gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3",
"gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474",
"gsd-core/references/doc-conflict-engine.md": "67d019d23e17f934",
"gsd-core/references/domain-probes.md": "62d23ed1992c48a9",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/requirements.json": "fbc1b355d8625eeb",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json": "66dd60957fee45f0",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json": "47fca61f076835fa",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/requirements.json": "80f04f5c04fb24cf",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json": "d38147adb0e5b342",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json": "bc552c01939bf4f8",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json": "688ec62c13e08afe",
"gsd-core/references/edge-probe.md": "5687eba25a078561",
"gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc",
"gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e",
"gsd-core/references/execute-phase-context-guard.md": "982006c1f3364242",
"gsd-core/references/execute-phase-wave-guard.md": "de9ac22cead4cfd8",
"gsd-core/references/executor-examples.md": "ba59243ed45c8ab1",
"gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4",
"gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8",
"gsd-core/references/gate-prompts.md": "e69f5993ab944d80",
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "77bf9dff38b2c9d4",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
"gsd-core/references/model-profile-resolution.md": "f32bb05102839767",
"gsd-core/references/model-profiles.md": "d3513252c5de5465",
"gsd-core/references/mvp-concepts.md": "72f7e8b1f8ae7118",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "6aeffd9097e25e22",
"gsd-core/references/planner-guidance.md": "96486cac2f7885e6",
"gsd-core/references/planner-human-verify-mode.md": "56d05e841630b3f4",
"gsd-core/references/planner-interface-context.md": "b28fa3da6ae739a8",
"gsd-core/references/planner-load-graph-context.md": "ca7a7af3f35ae61b",
"gsd-core/references/planner-mvp-mode.md": "ec33050db81101a8",
"gsd-core/references/planner-reviews.md": "dda0193a0fbd4947",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "dc492b7de6203355",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
"gsd-core/references/prohibition-probe.md": "605dc3f5a118ff3b",
"gsd-core/references/project-skills-discovery.md": "c155e03dce8dc3c2",
"gsd-core/references/questioning.md": "faac32813d1735bd",
"gsd-core/references/research-documentation-lookup.md": "c070007d1d72ab71",
"gsd-core/references/research-philosophy.md": "62930e66cc979c1a",
"gsd-core/references/research-verification-protocol.md": "9c38c9d9a687e679",
"gsd-core/references/revision-loop.md": "e55ff32dd98c63df",
"gsd-core/references/scout-codebase.md": "ba266ecc18fbf172",
"gsd-core/references/security-asvs-levels.md": "4774fac3b94b6ca8",
"gsd-core/references/skeleton-template.md": "528691d1f0efa878",
"gsd-core/references/sketch-interactivity.md": "7d982fe877e1e1cc",
"gsd-core/references/sketch-theme-system.md": "33e2e96e450456f8",
"gsd-core/references/sketch-tooling.md": "df6c4f24c1c27611",
"gsd-core/references/sketch-variant-patterns.md": "66c197aa4fb52810",
"gsd-core/references/spidr-splitting.md": "074ac154c0e4f906",
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "41069529ef776e39",
"gsd-core/references/ui-brand.md": "48717bcfcd63bd27",
"gsd-core/references/universal-anti-patterns.md": "6a1245050b21df01",
"gsd-core/references/untrusted-input-boundary.md": "d33b80d4d348599a",
"gsd-core/references/user-profiling.md": "b50416fe57c1b321",
"gsd-core/references/user-story-template.md": "0cc50e06a144ff8a",
"gsd-core/references/verification-overrides.md": "8213de9bd62283b6",
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
"gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5",
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
"gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b",
"gsd-core/templates/DEBUG.md": "a13470b82b1935e7",
"gsd-core/templates/README.md": "93d3426fc64e2c12",
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
"gsd-core/templates/UAT.md": "9e296471b97ebcec",
"gsd-core/templates/UI-SPEC.md": "20ca56a4e3e21f01",
"gsd-core/templates/VALIDATION.md": "f53e0ca061d3528e",
"gsd-core/templates/claude-md.md": "d1d333e4b963c0d2",
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
"gsd-core/templates/codebase/conventions.md": "c2e07698dad6b364",
"gsd-core/templates/codebase/integrations.md": "39bd23c71eedd564",
"gsd-core/templates/codebase/stack.md": "116e7e67dd87ddec",
"gsd-core/templates/codebase/structure.md": "222997133232a6f5",
"gsd-core/templates/codebase/testing.md": "76abff7f2050c9ea",
"gsd-core/templates/config.json": "1473dff11272d3c4",
"gsd-core/templates/context.md": "69b01e7909ea3f66",
"gsd-core/templates/continue-here.md": "f522a51b6895fba8",
"gsd-core/templates/copilot-instructions.md": "d2872ac579934f0a",
"gsd-core/templates/debug-subagent-prompt.md": "920656683dedb869",
"gsd-core/templates/dev-preferences.md": "88d0a65ec0993a3a",
"gsd-core/templates/discovery.md": "9a0e0935cc825dbc",
"gsd-core/templates/discussion-log.md": "cac1b48ec0f4dcb8",
"gsd-core/templates/milestone-archive.md": "591b6decdc0c0e51",
"gsd-core/templates/milestone.md": "74d2f750ae9f4a9c",
"gsd-core/templates/phase-prompt.md": "b811bf951092df2f",
"gsd-core/templates/planner-subagent-prompt.md": "ebf29dbb27042370",
"gsd-core/templates/project.md": "ab4af6becca2bb23",
"gsd-core/templates/requirements.md": "a44de4c2f146e473",
"gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0",
"gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f",
"gsd-core/templates/research-project/PITFALLS.md": "3ef75fa768422eec",
"gsd-core/templates/research-project/STACK.md": "82c85799ac4dd344",
"gsd-core/templates/research-project/SUMMARY.md": "dceb2f346388839d",
"gsd-core/templates/research.md": "88ce0920417091d0",
"gsd-core/templates/retrospective.md": "03981e30dd760103",
"gsd-core/templates/roadmap.md": "e4e35a9eb5dd4d4f",
"gsd-core/templates/spec.md": "26d55bce940f0288",
"gsd-core/templates/state.md": "4d123aa6cea167fe",
"gsd-core/templates/summary-complex.md": "a5e40574fd8894dc",
"gsd-core/templates/summary-minimal.md": "7d09b5e709e2e67c",
"gsd-core/templates/summary-standard.md": "e8d9cf4a8377cdff",
"gsd-core/templates/summary.md": "23c40f6503b3ea98",
"gsd-core/templates/user-profile.md": "20749f23e4c413fc",
"gsd-core/templates/user-setup.md": "78b7d718b6e8d67c",
"gsd-core/templates/verification-report.md": "dd5faa6254183731",
"gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb",
"gsd-core/workflows/add-backlog.md": "1153d35058e3e24f",
"gsd-core/workflows/add-phase.md": "b98c2fc51cd123ba",
"gsd-core/workflows/add-tests.md": "7ec84770cbd9b850",
"gsd-core/workflows/add-todo.md": "a71015ef950e905a",
"gsd-core/workflows/ai-integration-phase.md": "56a079a218d9e0ee",
"gsd-core/workflows/analyze-dependencies.md": "52942af10f140717",
"gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b",
"gsd-core/workflows/audit-milestone.md": "fe7185bb70eafdb9",
"gsd-core/workflows/audit-uat.md": "ca6f1f0ef174f793",
"gsd-core/workflows/autonomous.md": "7cc800bc9a5bfc8a",
"gsd-core/workflows/check-todos.md": "34b3034a31e7dbe5",
"gsd-core/workflows/cleanup.md": "e73b3969f5c10dcf",
"gsd-core/workflows/code-review-fix.md": "b442c670f8c1fe93",
"gsd-core/workflows/code-review.md": "1bfa3bf542e30c5e",
"gsd-core/workflows/complete-milestone.md": "262c6bf1691b1ec9",
"gsd-core/workflows/debug.md": "1c137aaa9ffac0dc",
"gsd-core/workflows/diagnose-issues.md": "dfd26bce63e52b00",
"gsd-core/workflows/discovery-phase.md": "100b931f0f40bf1c",
"gsd-core/workflows/discuss-phase-assumptions.md": "5e26c16d4be817a1",
"gsd-core/workflows/discuss-phase-power.md": "0841f7dc6e9a054a",
"gsd-core/workflows/discuss-phase.md": "3eeeda447a9dd3b5",
"gsd-core/workflows/discuss-phase/modes/advisor.md": "d0bcd7bafe7c9a91",
"gsd-core/workflows/discuss-phase/modes/all.md": "6c456679da748bdb",
"gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105",
"gsd-core/workflows/discuss-phase/modes/auto.md": "057b13a030f0d14d",
"gsd-core/workflows/discuss-phase/modes/batch.md": "390f2c1fff33c963",
"gsd-core/workflows/discuss-phase/modes/chain.md": "ca3cc1ddfd19cd9d",
"gsd-core/workflows/discuss-phase/modes/default.md": "4ada4fe332c5c985",
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
"gsd-core/workflows/discuss-phase/modes/text.md": "5590f1f1a4554ad3",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "cd5d01c9ef84ab73",
"gsd-core/workflows/do.md": "cd4f183e89f95c44",
"gsd-core/workflows/docs-update.md": "4f0207fdaab85b1d",
"gsd-core/workflows/edit-phase.md": "e5624ac6e3f8bef5",
"gsd-core/workflows/eval-review.md": "f28d703285d611d2",
"gsd-core/workflows/execute-phase.md": "dcc50bd78c0047ea",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "8898e0ea533cc643",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80",
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
"gsd-core/workflows/execute-plan.md": "73a7c87e975fa393",
"gsd-core/workflows/explore.md": "11523b829cc67c29",
"gsd-core/workflows/extract-learnings.md": "a2e4836abdeb1fdb",
"gsd-core/workflows/fast.md": "94136fb570d20a9d",
"gsd-core/workflows/forensics.md": "76bea6e254652c2c",
"gsd-core/workflows/graduation.md": "d00ac4dfe7e1cc43",
"gsd-core/workflows/health.md": "ae213b0d090641a2",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "5fe077fbbdb5d9f7",
"gsd-core/workflows/help/modes/default.md": "cc8ef97de634c995",
"gsd-core/workflows/help/modes/full.md": "d15ffdcd90ff06b1",
"gsd-core/workflows/help/modes/topic.md": "d7c60d488810fbd6",
"gsd-core/workflows/import.md": "c740cfabacf7b70a",
"gsd-core/workflows/inbox.md": "41371f790ef06101",
"gsd-core/workflows/ingest-docs.md": "1ee3890d42d95576",
"gsd-core/workflows/insert-phase.md": "621f9e75725542b1",
"gsd-core/workflows/list-phase-assumptions.md": "53dd4b69536c1bc3",
"gsd-core/workflows/list-seeds.md": "0a466d04df300854",
"gsd-core/workflows/list-workspaces.md": "0409cb5e3859964f",
"gsd-core/workflows/manager.md": "fd5816b3fc7a68de",
"gsd-core/workflows/map-codebase.md": "582bddef590de9c6",
"gsd-core/workflows/milestone-summary.md": "f956783f7d063963",
"gsd-core/workflows/mvp-phase.md": "6cb2d9d97bd239b3",
"gsd-core/workflows/new-milestone.md": "7fbdbad9b2c38215",
"gsd-core/workflows/new-project.md": "72b2c17e9f9cb79d",
"gsd-core/workflows/new-workspace.md": "226482083477bc43",
"gsd-core/workflows/next.md": "48bd4b5d54f0d1f8",
"gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b",
"gsd-core/workflows/note.md": "95199087905ba3e6",
"gsd-core/workflows/pause-work.md": "7bcbdf27ba957c8b",
"gsd-core/workflows/plan-milestone-gaps.md": "02fee851c82e3b25",
"gsd-core/workflows/plan-phase.md": "b2904cffb7ff0127",
"gsd-core/workflows/plan-review-convergence.md": "57c284df29121220",
"gsd-core/workflows/plant-seed.md": "339890021123e017",
"gsd-core/workflows/pr-branch.md": "f2a35833fe784a53",
"gsd-core/workflows/profile-user.md": "abf4520bd9975305",
"gsd-core/workflows/progress.md": "1caa7b2be914c717",
"gsd-core/workflows/quick.md": "7d1e7a62213fa190",
"gsd-core/workflows/reapply-patches.md": "7915e40411490bbe",
"gsd-core/workflows/remove-phase.md": "d030f80ca0df4fa9",
"gsd-core/workflows/remove-workspace.md": "9f5589b4b3a0639a",
"gsd-core/workflows/resume-project.md": "b18b51fd15cbce95",
"gsd-core/workflows/review.md": "18ab093986814bb3",
"gsd-core/workflows/scan.md": "54ff1ff60041d065",
"gsd-core/workflows/secure-phase.md": "a2f6a03034444f14",
"gsd-core/workflows/session-report.md": "2e5b1205324ddefa",
"gsd-core/workflows/settings-advanced.md": "d1fb1c177d872b70",
"gsd-core/workflows/settings-integrations.md": "9753c48c7826cfdd",
"gsd-core/workflows/settings.md": "82536480fe362e82",
"gsd-core/workflows/ship.md": "dfbf2069ce4b276d",
"gsd-core/workflows/sketch-wrap-up.md": "067e2654f3fdaba2",
"gsd-core/workflows/sketch.md": "e1a544c83bb6e5be",
"gsd-core/workflows/spec-phase.md": "0d67fa7de33933c0",
"gsd-core/workflows/spike-wrap-up.md": "99a9e23d1c6cf66e",
"gsd-core/workflows/spike.md": "c9482514e665bcac",
"gsd-core/workflows/stats.md": "01c24349370a0e6d",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "c26ca43fdf928d46",
"gsd-core/workflows/transition.md": "69143573741c52e4",
"gsd-core/workflows/ui-phase.md": "bb5167948032872e",
"gsd-core/workflows/ui-review.md": "d256bec482e67af8",
"gsd-core/workflows/ultraplan-phase.md": "66c17ad2e555e262",
"gsd-core/workflows/undo.md": "993bb0a31edca7f8",
"gsd-core/workflows/update.md": "51c3af33474bdc24",
"gsd-core/workflows/validate-phase.md": "2d998cb78c918d08",
"gsd-core/workflows/verify-phase.md": "968d569ea4ef377f",
"gsd-core/workflows/verify-work.md": "1265e07f2c74a218",
"hooks/gsd-check-update-worker.js": "7a3eba8c1c166dd2",
"hooks/gsd-check-update.js": "c1c78326299f6eae",
"hooks/gsd-config-reload.js": "17bf778d432b3d2a",
"hooks/gsd-context-monitor.js": "c7793e66ce76aaeb",
"hooks/gsd-cursor-post-tool.js": "d61ee04f6ee7858c",
"hooks/gsd-cursor-session-start.js": "148b8ec4e2c97f00",
"hooks/gsd-ensure-canonical-path.js": "a19947cac42002d4",
"hooks/gsd-graphify-update.sh": "396ebda3c6705dc9",
"hooks/gsd-phase-boundary.sh": "6aa3ba9af3d465d9",
"hooks/gsd-prompt-guard.js": "4b08c2dce0233e2d",
"hooks/gsd-read-guard.js": "b602f88f046a7551",
"hooks/gsd-read-injection-scanner.js": "f8db0daa41afe13b",
"hooks/gsd-session-state.sh": "b1496e6a5204a6df",
"hooks/gsd-statusline.js": "c238ad773bacae32",
"hooks/gsd-update-banner.js": "74817c820b7a4ec1",
"hooks/gsd-validate-commit.sh": "14d3d966c74dc310",
"hooks/gsd-workflow-guard.js": "e22b9fb57f0e64f6",
"hooks/gsd-worktree-path-guard.js": "134c7919c4cbc78e",
"hooks/lib/git-cmd.js": "268ba15992ca0b23",
"hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
"hooks/managed-hooks-registry.cjs": "9372d0d21a2c4298",
"package.json": "dbf8353f77358bc1",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",
"scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
"scripts/changeset/lint.cjs": "0066faed159154f0",
"scripts/changeset/new.cjs": "4991e21fd17f5541",
"scripts/changeset/parse.cjs": "f9a949cbcab56445",
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7"
}

View File

@@ -0,0 +1,405 @@
{
".gsd-profile": "0e716a5fef4e6dc1",
".gsd/defaults.json": "560664b045e645cb",
"agents/gsd-advisor-researcher.md": "5a0c65ccc25ddfbe",
"agents/gsd-ai-researcher.md": "97fdf624a1c6c324",
"agents/gsd-assumptions-analyzer.md": "a8982fc704f7ec81",
"agents/gsd-code-fixer.md": "434ebbd947f07070",
"agents/gsd-code-reviewer.md": "1652918c20f42662",
"agents/gsd-codebase-mapper.md": "2d50f93ac1c0d3d5",
"agents/gsd-debug-session-manager.md": "6dd3555fa4ea8e93",
"agents/gsd-debugger.md": "0b4e9ac3601a6fb5",
"agents/gsd-doc-classifier.md": "5de2a66c751b2d58",
"agents/gsd-doc-synthesizer.md": "8e6fb8220f777022",
"agents/gsd-doc-verifier.md": "d3d8457bdd44bf10",
"agents/gsd-doc-writer.md": "82672f7a8a3ac381",
"agents/gsd-domain-researcher.md": "d4c07520f650ffd5",
"agents/gsd-eval-auditor.md": "95459532da30ab80",
"agents/gsd-eval-planner.md": "03448fc9c5774b56",
"agents/gsd-executor.md": "060d166bdb2a1ffc",
"agents/gsd-framework-selector.md": "ea9981d65d6b3429",
"agents/gsd-integration-checker.md": "342ddf68d898df2c",
"agents/gsd-intel-updater.md": "03e143f85ab105ed",
"agents/gsd-mempalace-curator.md": "576b8d0db51bc462",
"agents/gsd-nyquist-auditor.md": "354bd95e897a2946",
"agents/gsd-pattern-mapper.md": "cea092600aeb3978",
"agents/gsd-phase-researcher.md": "8d871d027ca41ec0",
"agents/gsd-plan-checker.md": "73ac6ffdef0c20cb",
"agents/gsd-planner.md": "1a60305d2a5daa3e",
"agents/gsd-project-researcher.md": "cc7e3bcb4f8ee30c",
"agents/gsd-research-synthesizer.md": "698d8c2f680b5a8d",
"agents/gsd-roadmapper.md": "3c19e19c06a1ba96",
"agents/gsd-security-auditor.md": "101f145e5f9e5724",
"agents/gsd-ui-auditor.md": "145b9c807012374c",
"agents/gsd-ui-checker.md": "32b2605c7254f959",
"agents/gsd-ui-researcher.md": "87cf9eebc37c4a37",
"agents/gsd-user-profiler.md": "ca3bf75581f211a0",
"agents/gsd-verifier.md": "4decc9b596090ca6",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/gsd-tools.cjs": "b7968e3e3af00249",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"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",
"gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4",
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
"gsd-core/contexts/review.md": "dc578fdd74bbea11",
"gsd-core/references/agent-contracts.md": "ff65e633c656c0d2",
"gsd-core/references/ai-evals.md": "b5afa786b938671e",
"gsd-core/references/ai-frameworks.md": "f827de93dde124eb",
"gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e",
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
"gsd-core/references/checkpoints.md": "db8a7425ed808e24",
"gsd-core/references/common-bug-patterns.md": "780145be56352626",
"gsd-core/references/context-budget.md": "b93e9f47aa1b1753",
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
"gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3",
"gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474",
"gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e",
"gsd-core/references/domain-probes.md": "762b965e84035b72",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/requirements.json": "fbc1b355d8625eeb",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json": "66dd60957fee45f0",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json": "47fca61f076835fa",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/requirements.json": "80f04f5c04fb24cf",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json": "d38147adb0e5b342",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json": "bc552c01939bf4f8",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json": "688ec62c13e08afe",
"gsd-core/references/edge-probe.md": "5687eba25a078561",
"gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc",
"gsd-core/references/execute-phase-between-wave-reset.md": "2c5cbdbc73cb053e",
"gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e",
"gsd-core/references/execute-phase-wave-guard.md": "b13d8860a76b7a41",
"gsd-core/references/executor-examples.md": "ba59243ed45c8ab1",
"gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4",
"gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8",
"gsd-core/references/gate-prompts.md": "099c8d52e3562336",
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "12d23fcbaa7fcf06",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
"gsd-core/references/model-profile-resolution.md": "f32bb05102839767",
"gsd-core/references/model-profiles.md": "2be36137de1ebb67",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
"gsd-core/references/planner-guidance.md": "140b1266eeb096cb",
"gsd-core/references/planner-human-verify-mode.md": "6cfa61ca5f6c1879",
"gsd-core/references/planner-interface-context.md": "b28fa3da6ae739a8",
"gsd-core/references/planner-load-graph-context.md": "8f598e08696843c0",
"gsd-core/references/planner-mvp-mode.md": "ec33050db81101a8",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "9b5f8ed49024cdbf",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
"gsd-core/references/prohibition-probe.md": "52872d5393ea9daf",
"gsd-core/references/project-skills-discovery.md": "0885d973eeac5234",
"gsd-core/references/questioning.md": "a8c988cab05f4651",
"gsd-core/references/research-documentation-lookup.md": "c070007d1d72ab71",
"gsd-core/references/research-philosophy.md": "62930e66cc979c1a",
"gsd-core/references/research-verification-protocol.md": "9c38c9d9a687e679",
"gsd-core/references/revision-loop.md": "e55ff32dd98c63df",
"gsd-core/references/scout-codebase.md": "ba266ecc18fbf172",
"gsd-core/references/security-asvs-levels.md": "4774fac3b94b6ca8",
"gsd-core/references/skeleton-template.md": "528691d1f0efa878",
"gsd-core/references/sketch-interactivity.md": "7d982fe877e1e1cc",
"gsd-core/references/sketch-theme-system.md": "33e2e96e450456f8",
"gsd-core/references/sketch-tooling.md": "df6c4f24c1c27611",
"gsd-core/references/sketch-variant-patterns.md": "66c197aa4fb52810",
"gsd-core/references/spidr-splitting.md": "074ac154c0e4f906",
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
"gsd-core/references/ui-brand.md": "48717bcfcd63bd27",
"gsd-core/references/universal-anti-patterns.md": "6a1245050b21df01",
"gsd-core/references/untrusted-input-boundary.md": "d33b80d4d348599a",
"gsd-core/references/user-profiling.md": "b50416fe57c1b321",
"gsd-core/references/user-story-template.md": "0cc50e06a144ff8a",
"gsd-core/references/verification-overrides.md": "a3e2d5166d16a37b",
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
"gsd-core/references/workstream-flag.md": "50ddf79d58950730",
"gsd-core/references/worktree-branch-check.md": "5d79e26e3b51d9ae",
"gsd-core/references/worktree-path-safety.md": "fa79fcdff2aaa5f0",
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
"gsd-core/templates/DEBUG.md": "57bd61bfd1d98e7e",
"gsd-core/templates/README.md": "89560317a9097a05",
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
"gsd-core/templates/UI-SPEC.md": "20ca56a4e3e21f01",
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
"gsd-core/templates/claude-md.md": "7c778398f79e25a3",
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
"gsd-core/templates/codebase/conventions.md": "c2e07698dad6b364",
"gsd-core/templates/codebase/integrations.md": "39bd23c71eedd564",
"gsd-core/templates/codebase/stack.md": "116e7e67dd87ddec",
"gsd-core/templates/codebase/structure.md": "6f968b6bb6e1982f",
"gsd-core/templates/codebase/testing.md": "76abff7f2050c9ea",
"gsd-core/templates/config.json": "1473dff11272d3c4",
"gsd-core/templates/context.md": "69b01e7909ea3f66",
"gsd-core/templates/continue-here.md": "f522a51b6895fba8",
"gsd-core/templates/copilot-instructions.md": "aea34bc52ff548ea",
"gsd-core/templates/debug-subagent-prompt.md": "8c18a89e25929d8e",
"gsd-core/templates/dev-preferences.md": "95048a71063d980b",
"gsd-core/templates/discovery.md": "e4ab738326eb70e0",
"gsd-core/templates/discussion-log.md": "cac1b48ec0f4dcb8",
"gsd-core/templates/milestone-archive.md": "591b6decdc0c0e51",
"gsd-core/templates/milestone.md": "74d2f750ae9f4a9c",
"gsd-core/templates/phase-prompt.md": "213ccd947451ff2b",
"gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f",
"gsd-core/templates/project.md": "1f687c7a88381080",
"gsd-core/templates/requirements.md": "a44de4c2f146e473",
"gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0",
"gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f",
"gsd-core/templates/research-project/PITFALLS.md": "3ef75fa768422eec",
"gsd-core/templates/research-project/STACK.md": "82c85799ac4dd344",
"gsd-core/templates/research-project/SUMMARY.md": "dceb2f346388839d",
"gsd-core/templates/research.md": "fa6dfb2ff2e8d273",
"gsd-core/templates/retrospective.md": "03981e30dd760103",
"gsd-core/templates/roadmap.md": "e4e35a9eb5dd4d4f",
"gsd-core/templates/spec.md": "7dc900c355098d8b",
"gsd-core/templates/state.md": "73e424b8c70b765c",
"gsd-core/templates/summary-complex.md": "a5e40574fd8894dc",
"gsd-core/templates/summary-minimal.md": "7d09b5e709e2e67c",
"gsd-core/templates/summary-standard.md": "e8d9cf4a8377cdff",
"gsd-core/templates/summary.md": "23c40f6503b3ea98",
"gsd-core/templates/user-profile.md": "20749f23e4c413fc",
"gsd-core/templates/user-setup.md": "78b7d718b6e8d67c",
"gsd-core/templates/verification-report.md": "dd5faa6254183731",
"gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb",
"gsd-core/workflows/add-backlog.md": "73e5ca92d9456f53",
"gsd-core/workflows/add-phase.md": "3683d413f223f138",
"gsd-core/workflows/add-tests.md": "49524ea9e54535b6",
"gsd-core/workflows/add-todo.md": "cc4a1b90384ad7b9",
"gsd-core/workflows/ai-integration-phase.md": "006583b7f234af02",
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
"gsd-core/workflows/audit-fix.md": "5aded4cc2682502b",
"gsd-core/workflows/audit-milestone.md": "c36d1c46d4aecca7",
"gsd-core/workflows/audit-uat.md": "5e93ef61f91ad0c0",
"gsd-core/workflows/autonomous.md": "7a482d2afb346e57",
"gsd-core/workflows/check-todos.md": "8807759cc4df46c0",
"gsd-core/workflows/cleanup.md": "6380894e67d2435d",
"gsd-core/workflows/code-review-fix.md": "5090840d834ec31a",
"gsd-core/workflows/code-review.md": "29046f7fa6a9d40a",
"gsd-core/workflows/complete-milestone.md": "96db03239ff95208",
"gsd-core/workflows/debug.md": "5840a39f14a029c4",
"gsd-core/workflows/diagnose-issues.md": "b350281a56ee5832",
"gsd-core/workflows/discovery-phase.md": "6161c60d752d0058",
"gsd-core/workflows/discuss-phase-assumptions.md": "c158386c6cd92bd5",
"gsd-core/workflows/discuss-phase-power.md": "290c0d83d783f9f6",
"gsd-core/workflows/discuss-phase.md": "f6aa630f777d3006",
"gsd-core/workflows/discuss-phase/modes/advisor.md": "432c381a366be630",
"gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54",
"gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105",
"gsd-core/workflows/discuss-phase/modes/auto.md": "524aaa69ae3a9ee5",
"gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448",
"gsd-core/workflows/discuss-phase/modes/chain.md": "1a6400d7663d7643",
"gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966",
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
"gsd-core/workflows/discuss-phase/modes/text.md": "e6d930e2b6769e49",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
"gsd-core/workflows/do.md": "a1a891c1d5d58d67",
"gsd-core/workflows/docs-update.md": "c9df0f7df1ebec79",
"gsd-core/workflows/edit-phase.md": "57d807e21fe70355",
"gsd-core/workflows/eval-review.md": "d16eebac88386c05",
"gsd-core/workflows/execute-phase.md": "168863795989881a",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "b890bafa4a0c8bd3",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "e34415dec69b8432",
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
"gsd-core/workflows/execute-plan.md": "eb5de66a1cb41271",
"gsd-core/workflows/explore.md": "1c0f3ced293df114",
"gsd-core/workflows/extract-learnings.md": "c6cfb696d3bb51c7",
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
"gsd-core/workflows/forensics.md": "b381b789a871507d",
"gsd-core/workflows/graduation.md": "1fb19f28634dd55a",
"gsd-core/workflows/health.md": "32c1276656602ccb",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495",
"gsd-core/workflows/help/modes/default.md": "bb6876c976996dbd",
"gsd-core/workflows/help/modes/full.md": "eba05fd7c355b65f",
"gsd-core/workflows/help/modes/topic.md": "bd2e4cc8e460f5bd",
"gsd-core/workflows/import.md": "da7ca19f487c6b60",
"gsd-core/workflows/inbox.md": "91aac6360e1a8672",
"gsd-core/workflows/ingest-docs.md": "8adc1e35097abce2",
"gsd-core/workflows/insert-phase.md": "dad4479236245bd9",
"gsd-core/workflows/list-phase-assumptions.md": "2a6b6a5acfb7742c",
"gsd-core/workflows/list-seeds.md": "e4f9d7c12c162ef7",
"gsd-core/workflows/list-workspaces.md": "d3726de6b2eb40b4",
"gsd-core/workflows/manager.md": "c8690740c613f1a5",
"gsd-core/workflows/map-codebase.md": "23fae66ceef58e1c",
"gsd-core/workflows/milestone-summary.md": "5cc04210fea41834",
"gsd-core/workflows/mvp-phase.md": "5ce3c326ef0f6e27",
"gsd-core/workflows/new-milestone.md": "13f278af2e696d8b",
"gsd-core/workflows/new-project.md": "40c94cfb81bde99b",
"gsd-core/workflows/new-workspace.md": "af3397e97cec7d0b",
"gsd-core/workflows/next.md": "e044321fdd6b5e9c",
"gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b",
"gsd-core/workflows/note.md": "42b66686b2c102cb",
"gsd-core/workflows/pause-work.md": "2c3abcaa1fa6d2e2",
"gsd-core/workflows/plan-milestone-gaps.md": "419744c1191354af",
"gsd-core/workflows/plan-phase.md": "7d6cbb6730d852d2",
"gsd-core/workflows/plan-review-convergence.md": "8ebcd05fcd5a0d15",
"gsd-core/workflows/plant-seed.md": "76379e2aeb18d53b",
"gsd-core/workflows/pr-branch.md": "79f4d93e31af9c49",
"gsd-core/workflows/profile-user.md": "8474c1e203be5c8c",
"gsd-core/workflows/progress.md": "173b166cd30fca13",
"gsd-core/workflows/quick.md": "29052a14c8dc71e0",
"gsd-core/workflows/reapply-patches.md": "7af45bb3f2fdd1b8",
"gsd-core/workflows/remove-phase.md": "f27cecd8c78008ae",
"gsd-core/workflows/remove-workspace.md": "977155e18b9df623",
"gsd-core/workflows/resume-project.md": "849f3d49d366ff13",
"gsd-core/workflows/review.md": "7dd0a479d2595ff0",
"gsd-core/workflows/scan.md": "cbde2b8b2b5fa5dd",
"gsd-core/workflows/secure-phase.md": "5fc8fbd5e217e48d",
"gsd-core/workflows/session-report.md": "2e5b1205324ddefa",
"gsd-core/workflows/settings-advanced.md": "26d73fcc5f68f3ad",
"gsd-core/workflows/settings-integrations.md": "ab490f2d5c7bbf34",
"gsd-core/workflows/settings.md": "9e35a3fedb0a8f53",
"gsd-core/workflows/ship.md": "3f6e6424d089d4d0",
"gsd-core/workflows/sketch-wrap-up.md": "eb5f0849f07479aa",
"gsd-core/workflows/sketch.md": "9a712af64fc2fff8",
"gsd-core/workflows/spec-phase.md": "79f136ab71edf595",
"gsd-core/workflows/spike-wrap-up.md": "79e23a81bb74bc95",
"gsd-core/workflows/spike.md": "80844a3c05339fdb",
"gsd-core/workflows/stats.md": "01289f444b66913d",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "7af5046e18c81ee9",
"gsd-core/workflows/transition.md": "adab3f53afd5d8aa",
"gsd-core/workflows/ui-phase.md": "dd213d91b5c258a5",
"gsd-core/workflows/ui-review.md": "83d6d3b1f26597ff",
"gsd-core/workflows/ultraplan-phase.md": "600377d719253f14",
"gsd-core/workflows/undo.md": "791e0bf96d9a057f",
"gsd-core/workflows/update.md": "472d4905fc8c5ce5",
"gsd-core/workflows/validate-phase.md": "067acd7aeed52c5b",
"gsd-core/workflows/verify-phase.md": "fecef63dcecc4104",
"gsd-core/workflows/verify-work.md": "aa0b4d000b15dbf1",
"hooks/gsd-check-update-worker.js": "80865e926e22623e",
"hooks/gsd-check-update.js": "57433c9f9b224e3e",
"hooks/gsd-config-reload.js": "ca99e7dc60a9815d",
"hooks/gsd-context-monitor.js": "f058fdb4b8b6c939",
"hooks/gsd-cursor-post-tool.js": "dd1b12f795de8d72",
"hooks/gsd-cursor-session-start.js": "a93095ac609a3ea6",
"hooks/gsd-ensure-canonical-path.js": "c49fb011c3b97f4a",
"hooks/gsd-graphify-update.sh": "396ebda3c6705dc9",
"hooks/gsd-phase-boundary.sh": "6aa3ba9af3d465d9",
"hooks/gsd-prompt-guard.js": "4b08c2dce0233e2d",
"hooks/gsd-read-guard.js": "474bc1800d34456f",
"hooks/gsd-read-injection-scanner.js": "2f32423c033ed5fd",
"hooks/gsd-session-state.sh": "b1496e6a5204a6df",
"hooks/gsd-statusline.js": "453cdf46bcf62368",
"hooks/gsd-update-banner.js": "d3228b9e674296b4",
"hooks/gsd-validate-commit.sh": "14d3d966c74dc310",
"hooks/gsd-workflow-guard.js": "6faa8f81812a8b5d",
"hooks/gsd-worktree-path-guard.js": "93bb15bf44b8c60d",
"hooks/lib/git-cmd.js": "268ba15992ca0b23",
"hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
"hooks/managed-hooks-registry.cjs": "2218a41c279720c2",
"package.json": "dbf8353f77358bc1",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",
"scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
"scripts/changeset/lint.cjs": "0066faed159154f0",
"scripts/changeset/new.cjs": "4991e21fd17f5541",
"scripts/changeset/parse.cjs": "f9a949cbcab56445",
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
"skills/gsd/DESCRIPTION.md": "5f38d874c5b24402",
"skills/gsd/gsd-ns-context/SKILL.md": "151b2ba0fac3941c",
"skills/gsd/gsd-ns-context/skills/docs-update/SKILL.md": "df94f6ae46ec5795",
"skills/gsd/gsd-ns-context/skills/extract-learnings/SKILL.md": "52be8a979bef730c",
"skills/gsd/gsd-ns-context/skills/graphify/SKILL.md": "f7dec1c111fb100e",
"skills/gsd/gsd-ns-context/skills/map-codebase/SKILL.md": "ccd09679064252b4",
"skills/gsd/gsd-ns-context/skills/mempalace-capture/SKILL.md": "046f39c201d7365a",
"skills/gsd/gsd-ns-context/skills/mempalace-recall/SKILL.md": "e1a57c1fec64d5f9",
"skills/gsd/gsd-ns-ideate/SKILL.md": "2e3c4e56eff154e5",
"skills/gsd/gsd-ns-ideate/skills/capture/SKILL.md": "b7bc43f69fd76622",
"skills/gsd/gsd-ns-ideate/skills/explore/SKILL.md": "360b2e6f645495db",
"skills/gsd/gsd-ns-ideate/skills/sketch/SKILL.md": "64ca8f967e319f27",
"skills/gsd/gsd-ns-ideate/skills/spec-phase/SKILL.md": "83186cb129fdae50",
"skills/gsd/gsd-ns-ideate/skills/spike/SKILL.md": "ce57cb5dc6d2a4a6",
"skills/gsd/gsd-ns-manage/SKILL.md": "fac0244e288b1760",
"skills/gsd/gsd-ns-manage/skills/cleanup/SKILL.md": "f17b38ef046f6479",
"skills/gsd/gsd-ns-manage/skills/config/SKILL.md": "472d62f10987917e",
"skills/gsd/gsd-ns-manage/skills/health/SKILL.md": "b3718922fb10baf2",
"skills/gsd/gsd-ns-manage/skills/help/SKILL.md": "3bdd8a49c2d9eeb9",
"skills/gsd/gsd-ns-manage/skills/inbox/SKILL.md": "dad3f572dc97e8d9",
"skills/gsd/gsd-ns-manage/skills/manager/SKILL.md": "45a0123746b538da",
"skills/gsd/gsd-ns-manage/skills/pause-work/SKILL.md": "f6b91ab34a52ec67",
"skills/gsd/gsd-ns-manage/skills/pr-branch/SKILL.md": "7d7e51e684ed5df6",
"skills/gsd/gsd-ns-manage/skills/resume-work/SKILL.md": "d50c1aac9c702a8d",
"skills/gsd/gsd-ns-manage/skills/settings/SKILL.md": "16975a50842c06c6",
"skills/gsd/gsd-ns-manage/skills/ship/SKILL.md": "8a3a195e339c5ab6",
"skills/gsd/gsd-ns-manage/skills/stats/SKILL.md": "f77e8240d8754d5e",
"skills/gsd/gsd-ns-manage/skills/surface/SKILL.md": "b292d9414a3ceb7a",
"skills/gsd/gsd-ns-manage/skills/thread/SKILL.md": "3a9ca4ac926b85d9",
"skills/gsd/gsd-ns-manage/skills/undo/SKILL.md": "3609c2bd80383cc7",
"skills/gsd/gsd-ns-manage/skills/update/SKILL.md": "38865b7c53ce3bb2",
"skills/gsd/gsd-ns-manage/skills/workspace/SKILL.md": "0af8b7bb3cff8ec3",
"skills/gsd/gsd-ns-manage/skills/workstreams/SKILL.md": "4f5f41bee17fddda",
"skills/gsd/gsd-ns-project/SKILL.md": "d7462813249bba6e",
"skills/gsd/gsd-ns-project/skills/audit-milestone/SKILL.md": "b6e35c162eade47e",
"skills/gsd/gsd-ns-project/skills/complete-milestone/SKILL.md": "60bd096bbbf1bcde",
"skills/gsd/gsd-ns-project/skills/import/SKILL.md": "a244b8a416de4151",
"skills/gsd/gsd-ns-project/skills/ingest-docs/SKILL.md": "744e20b470d1f38d",
"skills/gsd/gsd-ns-project/skills/milestone-summary/SKILL.md": "a4a3934f5dccfafa",
"skills/gsd/gsd-ns-project/skills/new-milestone/SKILL.md": "be1186bd49fa793f",
"skills/gsd/gsd-ns-project/skills/new-project/SKILL.md": "4b9851a476337bec",
"skills/gsd/gsd-ns-project/skills/profile-user/SKILL.md": "174895b891961f4a",
"skills/gsd/gsd-ns-project/skills/review-backlog/SKILL.md": "23b62ff57db3db7a",
"skills/gsd/gsd-ns-review/SKILL.md": "b8f3b659ce8069c6",
"skills/gsd/gsd-ns-review/skills/audit-fix/SKILL.md": "4ac64b41a68e0271",
"skills/gsd/gsd-ns-review/skills/audit-uat/SKILL.md": "6818606a6428f4fd",
"skills/gsd/gsd-ns-review/skills/code-review/SKILL.md": "9bbf2a634954e692",
"skills/gsd/gsd-ns-review/skills/debug/SKILL.md": "014bf3421ade2813",
"skills/gsd/gsd-ns-review/skills/eval-review/SKILL.md": "609ee9ace8cd424c",
"skills/gsd/gsd-ns-review/skills/forensics/SKILL.md": "d31dc39e02abc929",
"skills/gsd/gsd-ns-review/skills/review/SKILL.md": "0629aeccf352b059",
"skills/gsd/gsd-ns-review/skills/secure-phase/SKILL.md": "f615390f01694378",
"skills/gsd/gsd-ns-review/skills/ui-phase/SKILL.md": "aac4a77d61281591",
"skills/gsd/gsd-ns-review/skills/ui-review/SKILL.md": "ebe37a6d521dba62",
"skills/gsd/gsd-ns-review/skills/validate-phase/SKILL.md": "b9f0c4f3738fcb7e",
"skills/gsd/gsd-ns-workflow/SKILL.md": "8ae955e65342e183",
"skills/gsd/gsd-ns-workflow/skills/add-tests/SKILL.md": "274b0e83a06204d5",
"skills/gsd/gsd-ns-workflow/skills/ai-integration-phase/SKILL.md": "8415c05314ef1091",
"skills/gsd/gsd-ns-workflow/skills/autonomous/SKILL.md": "67a1d1880678e0d5",
"skills/gsd/gsd-ns-workflow/skills/discuss-phase/SKILL.md": "3b69cd5de487382e",
"skills/gsd/gsd-ns-workflow/skills/execute-phase/SKILL.md": "2b838b5e5737aade",
"skills/gsd/gsd-ns-workflow/skills/fast/SKILL.md": "c22843abbd530ebd",
"skills/gsd/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "615bfe82af659694",
"skills/gsd/gsd-ns-workflow/skills/phase/SKILL.md": "a407ca50ee0aeb6b",
"skills/gsd/gsd-ns-workflow/skills/plan-phase/SKILL.md": "7f077194059ede03",
"skills/gsd/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "99468f6eaf3c72b4",
"skills/gsd/gsd-ns-workflow/skills/progress/SKILL.md": "6ecd0f958ad93d20",
"skills/gsd/gsd-ns-workflow/skills/quick/SKILL.md": "3ba1337427843e91",
"skills/gsd/gsd-ns-workflow/skills/spec-phase/SKILL.md": "83186cb129fdae50",
"skills/gsd/gsd-ns-workflow/skills/ultraplan-phase/SKILL.md": "bc4d84237531c5e5",
"skills/gsd/gsd-ns-workflow/skills/verify-work/SKILL.md": "aa830ff978d73f1a"
}

View File

@@ -0,0 +1,473 @@
{
".gsd-profile": "0e716a5fef4e6dc1",
".gsd/defaults.json": "560664b045e645cb",
"agents/gsd-advisor-researcher.md": "3f23cbf011be54b4",
"agents/gsd-ai-researcher.md": "16d5148566737df0",
"agents/gsd-assumptions-analyzer.md": "e638c7dbe0dd8405",
"agents/gsd-code-fixer.md": "dfe11ff351e10d8a",
"agents/gsd-code-reviewer.md": "501bb541628df0b9",
"agents/gsd-codebase-mapper.md": "1b5538846f0c743d",
"agents/gsd-debug-session-manager.md": "5fd509a86b1335b7",
"agents/gsd-debugger.md": "52c4715abce6ddb3",
"agents/gsd-doc-classifier.md": "dd7670f4fb345994",
"agents/gsd-doc-synthesizer.md": "1e987faef95a8c71",
"agents/gsd-doc-verifier.md": "8016f792d0766b77",
"agents/gsd-doc-writer.md": "5b54aa02048cb1a0",
"agents/gsd-domain-researcher.md": "a3874d80bcbc7380",
"agents/gsd-eval-auditor.md": "c3295817a354d799",
"agents/gsd-eval-planner.md": "3db12cde12aeb2c1",
"agents/gsd-executor.md": "053c4c953130bee2",
"agents/gsd-framework-selector.md": "ad5f2c6b9bec6270",
"agents/gsd-integration-checker.md": "a350dd0503ff992d",
"agents/gsd-intel-updater.md": "b8eb72873ded3c14",
"agents/gsd-mempalace-curator.md": "6461da48ed937556",
"agents/gsd-nyquist-auditor.md": "2cdb16a2b095b5e5",
"agents/gsd-pattern-mapper.md": "6a5408fd11d70391",
"agents/gsd-phase-researcher.md": "46374922b18d5b94",
"agents/gsd-plan-checker.md": "c61432fb8d9b72f6",
"agents/gsd-planner.md": "5b0cb992023412a2",
"agents/gsd-project-researcher.md": "b433211bb78ebb23",
"agents/gsd-research-synthesizer.md": "941b85961b58758d",
"agents/gsd-roadmapper.md": "5304db525ad7a243",
"agents/gsd-security-auditor.md": "2f39af0364f31cf5",
"agents/gsd-ui-auditor.md": "cee3fb0c241faaa3",
"agents/gsd-ui-checker.md": "2a6c5551e354414b",
"agents/gsd-ui-researcher.md": "384af56f90784422",
"agents/gsd-user-profiler.md": "b8cb09319c517701",
"agents/gsd-verifier.md": "b16febf0774e2db7",
"command/gsd-add-tests.md": "c314f9a6be312bfa",
"command/gsd-ai-integration-phase.md": "bbab86a540e00db5",
"command/gsd-audit-fix.md": "4106e9dce9b71585",
"command/gsd-audit-milestone.md": "0f627d956b5030ed",
"command/gsd-audit-uat.md": "119f204ca3cd0cd6",
"command/gsd-autonomous.md": "b85f720c4675d567",
"command/gsd-capture.md": "678c0ff889b2ad77",
"command/gsd-cleanup.md": "36cfddb3528b7c46",
"command/gsd-code-review.md": "a60c5b90d7d40c43",
"command/gsd-complete-milestone.md": "c7f5d90ab35bfff6",
"command/gsd-config.md": "3ec39530e1569ea7",
"command/gsd-debug.md": "aa1b885755bf3469",
"command/gsd-discuss-phase.md": "718155162fa3557a",
"command/gsd-docs-update.md": "d9d1d24eba748102",
"command/gsd-eval-review.md": "6f0737654a3fd4bb",
"command/gsd-execute-phase.md": "ce4cdfb79eaf6403",
"command/gsd-explore.md": "c161fa4bf2caceef",
"command/gsd-extract-learnings.md": "d18cbd1a3a03f845",
"command/gsd-fast.md": "66cc15c968a72270",
"command/gsd-forensics.md": "219d4a8d7241603a",
"command/gsd-graphify.md": "043152b6c9d82538",
"command/gsd-health.md": "4e45942f1cc53493",
"command/gsd-help.md": "4ae69106952f5d23",
"command/gsd-import.md": "8038513633f0470b",
"command/gsd-inbox.md": "1429fc7f556337c3",
"command/gsd-ingest-docs.md": "e655ecf1d4433ba9",
"command/gsd-manager.md": "1cdc133079833552",
"command/gsd-map-codebase.md": "186c8f79319abc1c",
"command/gsd-mempalace-capture.md": "08b9750f1b1d1ba6",
"command/gsd-mempalace-recall.md": "2316f1a950490845",
"command/gsd-milestone-summary.md": "4ab29b777f62f0bb",
"command/gsd-mvp-phase.md": "273a1c26ca13274b",
"command/gsd-new-milestone.md": "a315b3205c5d3470",
"command/gsd-new-project.md": "f2763e2ccbb70ebe",
"command/gsd-ns-context.md": "9a2b55b64f2e1e4b",
"command/gsd-ns-ideate.md": "27e7fcdc69eeeb5f",
"command/gsd-ns-manage.md": "eded59052ca4b240",
"command/gsd-ns-project.md": "91417cf7b76581dd",
"command/gsd-ns-review.md": "61fe33e28eb1b961",
"command/gsd-ns-workflow.md": "3352c292c27fe50b",
"command/gsd-pause-work.md": "04e993b1c9f8322b",
"command/gsd-phase.md": "8f0e98dc6c223229",
"command/gsd-plan-phase.md": "b37e9a61f946c975",
"command/gsd-plan-review-convergence.md": "79a28ef110f9f481",
"command/gsd-pr-branch.md": "68e724607de3c480",
"command/gsd-profile-user.md": "9704158b2d79cad2",
"command/gsd-progress.md": "cba4805469307416",
"command/gsd-quick.md": "704662b2172df14d",
"command/gsd-resume-work.md": "e4bb44fb2e8076c0",
"command/gsd-review-backlog.md": "1e99d6a7a3806fa5",
"command/gsd-review.md": "5f6efc83706fec9b",
"command/gsd-secure-phase.md": "65eb1cd3fa6430a5",
"command/gsd-settings.md": "9bf5d13f13f7d49c",
"command/gsd-ship.md": "c0ae46a2cbc7a2b4",
"command/gsd-sketch.md": "5237dfdbb55735db",
"command/gsd-spec-phase.md": "8f8e3e109ebb7011",
"command/gsd-spike.md": "fdcb1ae289790818",
"command/gsd-stats.md": "b54c0d533cff9710",
"command/gsd-surface.md": "3290127fe8241ced",
"command/gsd-thread.md": "9c6a1900b3c57be6",
"command/gsd-ui-phase.md": "efeba2d2381173e3",
"command/gsd-ui-review.md": "35a12e93cddf266c",
"command/gsd-ultraplan-phase.md": "f2cfeb972bbb90f7",
"command/gsd-undo.md": "2522a6a2fbc1d0d2",
"command/gsd-update.md": "6f1d4ce787925990",
"command/gsd-validate-phase.md": "f647bae9dba988bb",
"command/gsd-verify-work.md": "d07409c940a6ff00",
"command/gsd-workspace.md": "9048133312f47fdc",
"command/gsd-workstreams.md": "5e57eed1881c3891",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/gsd-tools.cjs": "b7968e3e3af00249",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"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",
"gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4",
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
"gsd-core/contexts/review.md": "dc578fdd74bbea11",
"gsd-core/references/agent-contracts.md": "ff65e633c656c0d2",
"gsd-core/references/ai-evals.md": "b5afa786b938671e",
"gsd-core/references/ai-frameworks.md": "425dd69c629230e7",
"gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e",
"gsd-core/references/autonomous-smart-discuss.md": "3986d58011bf9006",
"gsd-core/references/checkpoints.md": "9feb961f644afa96",
"gsd-core/references/common-bug-patterns.md": "780145be56352626",
"gsd-core/references/context-budget.md": "533eae480bfc4bb8",
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
"gsd-core/references/debugger-philosophy.md": "1cb61d4565081c88",
"gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474",
"gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e",
"gsd-core/references/domain-probes.md": "762b965e84035b72",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/requirements.json": "fbc1b355d8625eeb",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json": "66dd60957fee45f0",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json": "47fca61f076835fa",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/requirements.json": "80f04f5c04fb24cf",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json": "d38147adb0e5b342",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json": "bc552c01939bf4f8",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json": "688ec62c13e08afe",
"gsd-core/references/edge-probe.md": "5687eba25a078561",
"gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc",
"gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e",
"gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e",
"gsd-core/references/execute-phase-wave-guard.md": "de9ac22cead4cfd8",
"gsd-core/references/executor-examples.md": "ba59243ed45c8ab1",
"gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4",
"gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8",
"gsd-core/references/gate-prompts.md": "43e867720e736464",
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "fbdf814a3af9c051",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
"gsd-core/references/model-profile-resolution.md": "f32bb05102839767",
"gsd-core/references/model-profiles.md": "9e160d4e754b6b9e",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "2459c40bfc8a0ea8",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
"gsd-core/references/planner-guidance.md": "b791ceb40cb79d8c",
"gsd-core/references/planner-human-verify-mode.md": "3a625b42d9cb93ee",
"gsd-core/references/planner-interface-context.md": "b28fa3da6ae739a8",
"gsd-core/references/planner-load-graph-context.md": "ca7a7af3f35ae61b",
"gsd-core/references/planner-mvp-mode.md": "ec33050db81101a8",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "4acefb3c71169c84",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
"gsd-core/references/prohibition-probe.md": "52872d5393ea9daf",
"gsd-core/references/project-skills-discovery.md": "0ada2e0c44531865",
"gsd-core/references/questioning.md": "a083e5e3e16dd802",
"gsd-core/references/research-documentation-lookup.md": "c070007d1d72ab71",
"gsd-core/references/research-philosophy.md": "a602b41bfa081fdf",
"gsd-core/references/research-verification-protocol.md": "9c38c9d9a687e679",
"gsd-core/references/revision-loop.md": "e55ff32dd98c63df",
"gsd-core/references/scout-codebase.md": "ba266ecc18fbf172",
"gsd-core/references/security-asvs-levels.md": "4774fac3b94b6ca8",
"gsd-core/references/skeleton-template.md": "528691d1f0efa878",
"gsd-core/references/sketch-interactivity.md": "7d982fe877e1e1cc",
"gsd-core/references/sketch-theme-system.md": "33e2e96e450456f8",
"gsd-core/references/sketch-tooling.md": "df6c4f24c1c27611",
"gsd-core/references/sketch-variant-patterns.md": "66c197aa4fb52810",
"gsd-core/references/spidr-splitting.md": "074ac154c0e4f906",
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
"gsd-core/references/ui-brand.md": "48717bcfcd63bd27",
"gsd-core/references/universal-anti-patterns.md": "6a1245050b21df01",
"gsd-core/references/untrusted-input-boundary.md": "d33b80d4d348599a",
"gsd-core/references/user-profiling.md": "8e023a908d968af1",
"gsd-core/references/user-story-template.md": "0cc50e06a144ff8a",
"gsd-core/references/verification-overrides.md": "a3e2d5166d16a37b",
"gsd-core/references/verification-patterns.md": "ac45d99076067f17",
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
"gsd-core/references/workstream-flag.md": "225910640adbb76d",
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
"gsd-core/templates/DEBUG.md": "a2eea97e7f1336bf",
"gsd-core/templates/README.md": "73d3c9689b6efbc9",
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
"gsd-core/templates/UI-SPEC.md": "20ca56a4e3e21f01",
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
"gsd-core/templates/claude-md.md": "f35856254768bf7d",
"gsd-core/templates/codebase/architecture.md": "282db635ba093b1a",
"gsd-core/templates/codebase/concerns.md": "e66c584daa636fc5",
"gsd-core/templates/codebase/conventions.md": "c5f0324730852701",
"gsd-core/templates/codebase/integrations.md": "39bd23c71eedd564",
"gsd-core/templates/codebase/stack.md": "116e7e67dd87ddec",
"gsd-core/templates/codebase/structure.md": "5b5dd37145241462",
"gsd-core/templates/codebase/testing.md": "76abff7f2050c9ea",
"gsd-core/templates/config.json": "1473dff11272d3c4",
"gsd-core/templates/context.md": "593d4e6d20fdde7c",
"gsd-core/templates/continue-here.md": "8b1dce4832c7922b",
"gsd-core/templates/copilot-instructions.md": "aea34bc52ff548ea",
"gsd-core/templates/debug-subagent-prompt.md": "8c18a89e25929d8e",
"gsd-core/templates/dev-preferences.md": "95048a71063d980b",
"gsd-core/templates/discovery.md": "e4ab738326eb70e0",
"gsd-core/templates/discussion-log.md": "da4e8e266efdc6c2",
"gsd-core/templates/milestone-archive.md": "591b6decdc0c0e51",
"gsd-core/templates/milestone.md": "74d2f750ae9f4a9c",
"gsd-core/templates/phase-prompt.md": "2e6fd96c2cc26470",
"gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f",
"gsd-core/templates/project.md": "e4a3b331be081e62",
"gsd-core/templates/requirements.md": "a44de4c2f146e473",
"gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0",
"gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f",
"gsd-core/templates/research-project/PITFALLS.md": "3ef75fa768422eec",
"gsd-core/templates/research-project/STACK.md": "82c85799ac4dd344",
"gsd-core/templates/research-project/SUMMARY.md": "dceb2f346388839d",
"gsd-core/templates/research.md": "b454f96fdf8b1d3d",
"gsd-core/templates/retrospective.md": "03981e30dd760103",
"gsd-core/templates/roadmap.md": "e4e35a9eb5dd4d4f",
"gsd-core/templates/spec.md": "8734f0df4df3a34b",
"gsd-core/templates/state.md": "a45a134631efe3f9",
"gsd-core/templates/summary-complex.md": "a5e40574fd8894dc",
"gsd-core/templates/summary-minimal.md": "7d09b5e709e2e67c",
"gsd-core/templates/summary-standard.md": "e8d9cf4a8377cdff",
"gsd-core/templates/summary.md": "23c40f6503b3ea98",
"gsd-core/templates/user-profile.md": "52abe2af968e8533",
"gsd-core/templates/user-setup.md": "1da2382725db080f",
"gsd-core/templates/verification-report.md": "78ab9264ce63ed7e",
"gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb",
"gsd-core/workflows/add-backlog.md": "5095b6e69b4e380a",
"gsd-core/workflows/add-phase.md": "27164a671e14a789",
"gsd-core/workflows/add-tests.md": "5bb66a4f4c6839bb",
"gsd-core/workflows/add-todo.md": "1a3b827cda68adde",
"gsd-core/workflows/ai-integration-phase.md": "87b004f0f20fe211",
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
"gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b",
"gsd-core/workflows/audit-milestone.md": "5e9a35af57344e04",
"gsd-core/workflows/audit-uat.md": "69dbdec25cae2f12",
"gsd-core/workflows/autonomous.md": "ac4f18090bd4b178",
"gsd-core/workflows/check-todos.md": "cde0a3025828bad8",
"gsd-core/workflows/cleanup.md": "d124682912dab9f6",
"gsd-core/workflows/code-review-fix.md": "a416c764425cbb61",
"gsd-core/workflows/code-review.md": "3999e5bc9ce9171e",
"gsd-core/workflows/complete-milestone.md": "cb9a1ad0d611c765",
"gsd-core/workflows/debug.md": "0fa12d266c29d9d4",
"gsd-core/workflows/diagnose-issues.md": "af98c318e0aa27bf",
"gsd-core/workflows/discovery-phase.md": "ca7b2be46e59e862",
"gsd-core/workflows/discuss-phase-assumptions.md": "6419d394b232d7b0",
"gsd-core/workflows/discuss-phase-power.md": "5c0d1ca6abda0383",
"gsd-core/workflows/discuss-phase.md": "322f0c5d18b87e5a",
"gsd-core/workflows/discuss-phase/modes/advisor.md": "0b16982b70abfcc2",
"gsd-core/workflows/discuss-phase/modes/all.md": "5ed71228ac96e728",
"gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105",
"gsd-core/workflows/discuss-phase/modes/auto.md": "28dc6398e331b418",
"gsd-core/workflows/discuss-phase/modes/batch.md": "78f6ef61690acb66",
"gsd-core/workflows/discuss-phase/modes/chain.md": "b16547a6b0423579",
"gsd-core/workflows/discuss-phase/modes/default.md": "5d12f2593ae4a813",
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
"gsd-core/workflows/discuss-phase/modes/text.md": "daf23a04b101ab38",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "04e4feee14772275",
"gsd-core/workflows/do.md": "c1aeb36469f7badc",
"gsd-core/workflows/docs-update.md": "87bf2a6b7b6ec9db",
"gsd-core/workflows/edit-phase.md": "a3ab51739c5c021c",
"gsd-core/workflows/eval-review.md": "f6183650f7fcabf9",
"gsd-core/workflows/execute-phase.md": "ff4e037f1a2afa58",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "c133828cf177a772",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80",
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
"gsd-core/workflows/execute-plan.md": "9b96f0ef3d149b2c",
"gsd-core/workflows/explore.md": "a1aa05e598caf7e3",
"gsd-core/workflows/extract-learnings.md": "ce4b5388074f19a3",
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
"gsd-core/workflows/forensics.md": "d0f079d1bcf924c3",
"gsd-core/workflows/graduation.md": "fc01dc810d4845f8",
"gsd-core/workflows/health.md": "955d5ebacd5740e6",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495",
"gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa",
"gsd-core/workflows/help/modes/full.md": "737a6396e998929e",
"gsd-core/workflows/help/modes/topic.md": "a404990fcf2d7df7",
"gsd-core/workflows/import.md": "95734bf6d48ef776",
"gsd-core/workflows/inbox.md": "a073396097c89c01",
"gsd-core/workflows/ingest-docs.md": "270a4dc138d239c4",
"gsd-core/workflows/insert-phase.md": "0ab06e370253622b",
"gsd-core/workflows/list-phase-assumptions.md": "e7b5e35c9452e3b3",
"gsd-core/workflows/list-seeds.md": "da9511b569ada7f9",
"gsd-core/workflows/list-workspaces.md": "9b78bb9f71029169",
"gsd-core/workflows/manager.md": "bedfe8a2a48a9605",
"gsd-core/workflows/map-codebase.md": "fcc2796ebf8ea2c7",
"gsd-core/workflows/milestone-summary.md": "423287cd509b7774",
"gsd-core/workflows/mvp-phase.md": "3935c0d9969e3e84",
"gsd-core/workflows/new-milestone.md": "c4ff690cd48a52db",
"gsd-core/workflows/new-project.md": "0dce9298c090bdb4",
"gsd-core/workflows/new-workspace.md": "074efbc589061182",
"gsd-core/workflows/next.md": "0a9b4e23ac0bf7ea",
"gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b",
"gsd-core/workflows/note.md": "f8c2842a2217f776",
"gsd-core/workflows/pause-work.md": "8b81699a46ca8e9b",
"gsd-core/workflows/plan-milestone-gaps.md": "1976bf2001969719",
"gsd-core/workflows/plan-phase.md": "2d8eda8f283735d2",
"gsd-core/workflows/plan-review-convergence.md": "88e294a5cc616e90",
"gsd-core/workflows/plant-seed.md": "249d3c6b4d474106",
"gsd-core/workflows/pr-branch.md": "c8827e8a15426bf5",
"gsd-core/workflows/profile-user.md": "9d0f46424df26c8f",
"gsd-core/workflows/progress.md": "e7522beba5bd09b6",
"gsd-core/workflows/quick.md": "a1f1c8384cc51667",
"gsd-core/workflows/reapply-patches.md": "2c44426624047ed0",
"gsd-core/workflows/remove-phase.md": "f76e1c2a4dd31a09",
"gsd-core/workflows/remove-workspace.md": "7bd5d1b63ef091a8",
"gsd-core/workflows/resume-project.md": "3dcaa7abe1800d35",
"gsd-core/workflows/review.md": "268745662d5f5df7",
"gsd-core/workflows/scan.md": "8e1bbf2eed1752ca",
"gsd-core/workflows/secure-phase.md": "87fdcb37a8610e58",
"gsd-core/workflows/session-report.md": "2e5b1205324ddefa",
"gsd-core/workflows/settings-advanced.md": "910b34606d32df5b",
"gsd-core/workflows/settings-integrations.md": "4d23553b9143e834",
"gsd-core/workflows/settings.md": "c345ec6b9b5ee963",
"gsd-core/workflows/ship.md": "b6149b0bc45cc759",
"gsd-core/workflows/sketch-wrap-up.md": "7673797d65af2377",
"gsd-core/workflows/sketch.md": "201772f9c5c02e97",
"gsd-core/workflows/spec-phase.md": "2c67506aeb25a7e1",
"gsd-core/workflows/spike-wrap-up.md": "b7ee3d961b5792c6",
"gsd-core/workflows/spike.md": "a782dd863771fe0a",
"gsd-core/workflows/stats.md": "17b4f2059f4b4ef2",
"gsd-core/workflows/sync-skills.md": "dc7b8b015afa4b3b",
"gsd-core/workflows/thread.md": "75df5cc71f72c33d",
"gsd-core/workflows/transition.md": "9040a76741f12de6",
"gsd-core/workflows/ui-phase.md": "33f7113e91c2bfe0",
"gsd-core/workflows/ui-review.md": "013272816a291305",
"gsd-core/workflows/ultraplan-phase.md": "db7df53187dae993",
"gsd-core/workflows/undo.md": "7cd2153f8b15e30d",
"gsd-core/workflows/update.md": "5d0a2356dadf2017",
"gsd-core/workflows/validate-phase.md": "7915e3a261f7c9c9",
"gsd-core/workflows/verify-phase.md": "452968b6becb18a1",
"gsd-core/workflows/verify-work.md": "7cb5144cc74986e7",
"hooks/gsd-check-update-worker.js": "8c48db40d2d74193",
"hooks/gsd-check-update.js": "1c863b30953b47c8",
"hooks/gsd-config-reload.js": "17bf778d432b3d2a",
"hooks/gsd-context-monitor.js": "8e9c39563be10827",
"hooks/gsd-cursor-post-tool.js": "d61ee04f6ee7858c",
"hooks/gsd-cursor-session-start.js": "148b8ec4e2c97f00",
"hooks/gsd-ensure-canonical-path.js": "a5c67a1a7abc90c0",
"hooks/gsd-graphify-update.sh": "396ebda3c6705dc9",
"hooks/gsd-phase-boundary.sh": "6aa3ba9af3d465d9",
"hooks/gsd-prompt-guard.js": "4b08c2dce0233e2d",
"hooks/gsd-read-guard.js": "b602f88f046a7551",
"hooks/gsd-read-injection-scanner.js": "c5d388fe1a61a12a",
"hooks/gsd-session-state.sh": "b1496e6a5204a6df",
"hooks/gsd-statusline.js": "e6eeb0972eb54bbe",
"hooks/gsd-update-banner.js": "74817c820b7a4ec1",
"hooks/gsd-validate-commit.sh": "14d3d966c74dc310",
"hooks/gsd-workflow-guard.js": "e22b9fb57f0e64f6",
"hooks/gsd-worktree-path-guard.js": "ca0d1af4a9357887",
"hooks/lib/git-cmd.js": "268ba15992ca0b23",
"hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
"hooks/managed-hooks-registry.cjs": "8a9f7633c6fe0ea0",
"kilo.json": "13151e97ff23c1aa",
"package.json": "dbf8353f77358bc1",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",
"scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
"scripts/changeset/lint.cjs": "0066faed159154f0",
"scripts/changeset/new.cjs": "4991e21fd17f5541",
"scripts/changeset/parse.cjs": "f9a949cbcab56445",
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
"skills/gsd-add-tests/SKILL.md": "addc3a220961a9c7",
"skills/gsd-ai-integration-phase/SKILL.md": "e74b83a991dc9fc7",
"skills/gsd-audit-fix/SKILL.md": "2c1f601f2fb52585",
"skills/gsd-audit-milestone/SKILL.md": "739ed755ad84e58e",
"skills/gsd-audit-uat/SKILL.md": "2c450432b6fd1c3e",
"skills/gsd-autonomous/SKILL.md": "37dc7b78ceb74803",
"skills/gsd-capture/SKILL.md": "6536a7dcc4ef6c46",
"skills/gsd-cleanup/SKILL.md": "a578d6536b9cabc3",
"skills/gsd-code-review/SKILL.md": "c0db8e37e7133bd8",
"skills/gsd-complete-milestone/SKILL.md": "048fd8cf3f502433",
"skills/gsd-config/SKILL.md": "5d6f52a964d06e4d",
"skills/gsd-debug/SKILL.md": "f5ca8a5780d89659",
"skills/gsd-discuss-phase/SKILL.md": "d9465728b0582991",
"skills/gsd-docs-update/SKILL.md": "d150afd41a25ec08",
"skills/gsd-eval-review/SKILL.md": "c76022e94ee30cb1",
"skills/gsd-execute-phase/SKILL.md": "e0a4298151e692b3",
"skills/gsd-explore/SKILL.md": "d8e26a5ed95a4ecc",
"skills/gsd-extract-learnings/SKILL.md": "d39269bea995fabc",
"skills/gsd-fast/SKILL.md": "8773badbed73f5b1",
"skills/gsd-forensics/SKILL.md": "68952d0d846737ff",
"skills/gsd-graphify/SKILL.md": "dfe8264197d8e525",
"skills/gsd-health/SKILL.md": "74a68e1c1b310bef",
"skills/gsd-help/SKILL.md": "8d01c91265b6357f",
"skills/gsd-import/SKILL.md": "f76076ae9fbc8b1d",
"skills/gsd-inbox/SKILL.md": "34370c6138415209",
"skills/gsd-ingest-docs/SKILL.md": "f049f06a6ec7da43",
"skills/gsd-manager/SKILL.md": "a37ecdbe32952262",
"skills/gsd-map-codebase/SKILL.md": "e8c01704e8ada1d2",
"skills/gsd-mempalace-capture/SKILL.md": "260e1dabc7014ba2",
"skills/gsd-mempalace-recall/SKILL.md": "045d85c8cab1afcc",
"skills/gsd-milestone-summary/SKILL.md": "da645171ca2299d8",
"skills/gsd-mvp-phase/SKILL.md": "eeb0ac0f88647475",
"skills/gsd-new-milestone/SKILL.md": "bc8989d97f3161ad",
"skills/gsd-new-project/SKILL.md": "c08047e101dbac9c",
"skills/gsd-ns-context/SKILL.md": "110fb2227bcde535",
"skills/gsd-ns-ideate/SKILL.md": "d093d59a8519decc",
"skills/gsd-ns-manage/SKILL.md": "2756981de613022e",
"skills/gsd-ns-project/SKILL.md": "757976d48e8b7a26",
"skills/gsd-ns-review/SKILL.md": "680bdd33c882b049",
"skills/gsd-ns-workflow/SKILL.md": "68effe2fc2c65317",
"skills/gsd-pause-work/SKILL.md": "34366b18a392a717",
"skills/gsd-phase/SKILL.md": "64a241d4f8665aa2",
"skills/gsd-plan-phase/SKILL.md": "c73cba04a26f0bfe",
"skills/gsd-plan-review-convergence/SKILL.md": "fae05d6ab16cac10",
"skills/gsd-pr-branch/SKILL.md": "a80da6aa95efc50d",
"skills/gsd-profile-user/SKILL.md": "4ac2c5ea45d17a9d",
"skills/gsd-progress/SKILL.md": "493f467c22d55b6b",
"skills/gsd-quick/SKILL.md": "605e596c680cbb1c",
"skills/gsd-resume-work/SKILL.md": "0c92e4a51d1b6d94",
"skills/gsd-review-backlog/SKILL.md": "27a9dbfe92e5d04c",
"skills/gsd-review/SKILL.md": "7309817dc0d54cef",
"skills/gsd-secure-phase/SKILL.md": "ceded474164b4e2d",
"skills/gsd-settings/SKILL.md": "4587e4bef7b8942c",
"skills/gsd-ship/SKILL.md": "4ad9695934e069ee",
"skills/gsd-sketch/SKILL.md": "d062bef61ffe98a7",
"skills/gsd-spec-phase/SKILL.md": "749dee6f739b9b44",
"skills/gsd-spike/SKILL.md": "0938ac1386ca4a58",
"skills/gsd-stats/SKILL.md": "25898070fb2a4b20",
"skills/gsd-surface/SKILL.md": "1bfb5b380f42a02b",
"skills/gsd-thread/SKILL.md": "d5917840279459f1",
"skills/gsd-ui-phase/SKILL.md": "c35f175ccc747d56",
"skills/gsd-ui-review/SKILL.md": "48267dc071481a89",
"skills/gsd-ultraplan-phase/SKILL.md": "5de4d0d88ce11eb3",
"skills/gsd-undo/SKILL.md": "23c275bc4a127bde",
"skills/gsd-update/SKILL.md": "f2ed6c6d4d89c32c",
"skills/gsd-validate-phase/SKILL.md": "62dc6ae62bb38c16",
"skills/gsd-verify-work/SKILL.md": "9b185c0aa2e000a8",
"skills/gsd-workspace/SKILL.md": "f8eac0ef91888629",
"skills/gsd-workstreams/SKILL.md": "44c62598142837b9"
}

View File

@@ -0,0 +1,417 @@
{
".gsd-profile": "0e716a5fef4e6dc1",
".gsd/defaults.json": "560664b045e645cb",
"agents/gsd.md": "60fee7782ae4f2c6",
"agents/gsd.yaml": "253a23ddda06c6c2",
"agents/subagents/gsd-advisor-researcher.md": "20bd45ab94df7931",
"agents/subagents/gsd-advisor-researcher.yaml": "662ced4837207406",
"agents/subagents/gsd-ai-researcher.md": "4a319934ab75a92a",
"agents/subagents/gsd-ai-researcher.yaml": "59edec2a11eb0a27",
"agents/subagents/gsd-assumptions-analyzer.md": "e88e552aae9d3b90",
"agents/subagents/gsd-assumptions-analyzer.yaml": "e7da772d8c7e3723",
"agents/subagents/gsd-code-fixer.md": "ee1ff10914839eff",
"agents/subagents/gsd-code-fixer.yaml": "41147d668c7e75cb",
"agents/subagents/gsd-code-reviewer.md": "702bb1240d755c20",
"agents/subagents/gsd-code-reviewer.yaml": "5f2398f56018f50d",
"agents/subagents/gsd-codebase-mapper.md": "39530e6f19156b36",
"agents/subagents/gsd-codebase-mapper.yaml": "bce1c6d15f55c477",
"agents/subagents/gsd-debug-session-manager.md": "54f87b28876dec1b",
"agents/subagents/gsd-debug-session-manager.yaml": "aab147717b5082e7",
"agents/subagents/gsd-debugger.md": "e786e8eb395bc494",
"agents/subagents/gsd-debugger.yaml": "6d02d7feb90cad43",
"agents/subagents/gsd-doc-classifier.md": "7810ff57b2dba86b",
"agents/subagents/gsd-doc-classifier.yaml": "a4e9cf7025b57503",
"agents/subagents/gsd-doc-synthesizer.md": "50cf72bc816460fd",
"agents/subagents/gsd-doc-synthesizer.yaml": "b4cfc60e11571632",
"agents/subagents/gsd-doc-verifier.md": "6b6eb3998d2167c8",
"agents/subagents/gsd-doc-verifier.yaml": "7200c09cefcd7667",
"agents/subagents/gsd-doc-writer.md": "067f34dc1387652f",
"agents/subagents/gsd-doc-writer.yaml": "166fa569d11adb9f",
"agents/subagents/gsd-domain-researcher.md": "c29b96a2c40f6e96",
"agents/subagents/gsd-domain-researcher.yaml": "269e21863e94f29f",
"agents/subagents/gsd-eval-auditor.md": "7c8e1106f1d53717",
"agents/subagents/gsd-eval-auditor.yaml": "e3d868bd5fefe938",
"agents/subagents/gsd-eval-planner.md": "70f8c5727bfb9876",
"agents/subagents/gsd-eval-planner.yaml": "df8499f7af297ec2",
"agents/subagents/gsd-executor.md": "362cf321f6d13907",
"agents/subagents/gsd-executor.yaml": "e29422986636fd64",
"agents/subagents/gsd-framework-selector.md": "a15b7aa1e0576e16",
"agents/subagents/gsd-framework-selector.yaml": "fb52c31cde27b0e3",
"agents/subagents/gsd-integration-checker.md": "6cd492199a92e0f8",
"agents/subagents/gsd-integration-checker.yaml": "3500c65ccbbe432d",
"agents/subagents/gsd-intel-updater.md": "8ffa8767b2270472",
"agents/subagents/gsd-intel-updater.yaml": "01445ee99bec4b31",
"agents/subagents/gsd-mempalace-curator.md": "34b7476d313bfda4",
"agents/subagents/gsd-mempalace-curator.yaml": "28dd095c371ada3b",
"agents/subagents/gsd-nyquist-auditor.md": "5e6335c615801f1c",
"agents/subagents/gsd-nyquist-auditor.yaml": "48ad300fa775dd5d",
"agents/subagents/gsd-pattern-mapper.md": "eb2d4e838aaeb10c",
"agents/subagents/gsd-pattern-mapper.yaml": "d1e537e77f953fd4",
"agents/subagents/gsd-phase-researcher.md": "fd8438c9b723e4a9",
"agents/subagents/gsd-phase-researcher.yaml": "7633c8e82617e7cc",
"agents/subagents/gsd-plan-checker.md": "6352e38b8546a89e",
"agents/subagents/gsd-plan-checker.yaml": "8295181071121db8",
"agents/subagents/gsd-planner.md": "df8c0ab06f9221f3",
"agents/subagents/gsd-planner.yaml": "2e83ee194bcd7fbd",
"agents/subagents/gsd-project-researcher.md": "50528d1cc19f2fc1",
"agents/subagents/gsd-project-researcher.yaml": "ce12586b0347e2dc",
"agents/subagents/gsd-research-synthesizer.md": "eefaa59ac7af07cf",
"agents/subagents/gsd-research-synthesizer.yaml": "898104ab3bb0b81a",
"agents/subagents/gsd-roadmapper.md": "2edc9acf9c0c7515",
"agents/subagents/gsd-roadmapper.yaml": "679772cb14f3a015",
"agents/subagents/gsd-security-auditor.md": "853395f34fdb22ab",
"agents/subagents/gsd-security-auditor.yaml": "fe8a4345cc13571d",
"agents/subagents/gsd-ui-auditor.md": "41011606fddfd8f8",
"agents/subagents/gsd-ui-auditor.yaml": "3fc98c1d9e8f10fd",
"agents/subagents/gsd-ui-checker.md": "f78439004e23919a",
"agents/subagents/gsd-ui-checker.yaml": "c42316006654fae3",
"agents/subagents/gsd-ui-researcher.md": "3b22f426c83ac46c",
"agents/subagents/gsd-ui-researcher.yaml": "15e215874bc2c37d",
"agents/subagents/gsd-user-profiler.md": "c16f94e09e433394",
"agents/subagents/gsd-user-profiler.yaml": "645826a29d079159",
"agents/subagents/gsd-verifier.md": "3345b59f7a3b8de3",
"agents/subagents/gsd-verifier.yaml": "2d2bd6b37626f382",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/gsd-tools.cjs": "b7968e3e3af00249",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"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",
"gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4",
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
"gsd-core/contexts/review.md": "dc578fdd74bbea11",
"gsd-core/references/agent-contracts.md": "ff65e633c656c0d2",
"gsd-core/references/ai-evals.md": "b5afa786b938671e",
"gsd-core/references/ai-frameworks.md": "f827de93dde124eb",
"gsd-core/references/artifact-types.md": "a6d2e1f9453ffbf5",
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
"gsd-core/references/checkpoints.md": "6aa620c6ca38bdf0",
"gsd-core/references/common-bug-patterns.md": "780145be56352626",
"gsd-core/references/context-budget.md": "f1ce57bf418824af",
"gsd-core/references/continuation-format.md": "ce73e57d053ab8a7",
"gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3",
"gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474",
"gsd-core/references/doc-conflict-engine.md": "67d019d23e17f934",
"gsd-core/references/domain-probes.md": "62d23ed1992c48a9",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/requirements.json": "fbc1b355d8625eeb",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json": "66dd60957fee45f0",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json": "47fca61f076835fa",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/requirements.json": "80f04f5c04fb24cf",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json": "d38147adb0e5b342",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json": "bc552c01939bf4f8",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json": "688ec62c13e08afe",
"gsd-core/references/edge-probe.md": "5687eba25a078561",
"gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc",
"gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e",
"gsd-core/references/execute-phase-context-guard.md": "982006c1f3364242",
"gsd-core/references/execute-phase-wave-guard.md": "de9ac22cead4cfd8",
"gsd-core/references/executor-examples.md": "ba59243ed45c8ab1",
"gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4",
"gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8",
"gsd-core/references/gate-prompts.md": "e69f5993ab944d80",
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "77bf9dff38b2c9d4",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
"gsd-core/references/model-profile-resolution.md": "f32bb05102839767",
"gsd-core/references/model-profiles.md": "d3513252c5de5465",
"gsd-core/references/mvp-concepts.md": "72f7e8b1f8ae7118",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "6aeffd9097e25e22",
"gsd-core/references/planner-guidance.md": "96486cac2f7885e6",
"gsd-core/references/planner-human-verify-mode.md": "56d05e841630b3f4",
"gsd-core/references/planner-interface-context.md": "b28fa3da6ae739a8",
"gsd-core/references/planner-load-graph-context.md": "ca7a7af3f35ae61b",
"gsd-core/references/planner-mvp-mode.md": "ec33050db81101a8",
"gsd-core/references/planner-reviews.md": "dda0193a0fbd4947",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "1c3a3aae2ae89e83",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
"gsd-core/references/prohibition-probe.md": "605dc3f5a118ff3b",
"gsd-core/references/project-skills-discovery.md": "c155e03dce8dc3c2",
"gsd-core/references/questioning.md": "a8c988cab05f4651",
"gsd-core/references/research-documentation-lookup.md": "c070007d1d72ab71",
"gsd-core/references/research-philosophy.md": "62930e66cc979c1a",
"gsd-core/references/research-verification-protocol.md": "9c38c9d9a687e679",
"gsd-core/references/revision-loop.md": "e55ff32dd98c63df",
"gsd-core/references/scout-codebase.md": "ba266ecc18fbf172",
"gsd-core/references/security-asvs-levels.md": "4774fac3b94b6ca8",
"gsd-core/references/skeleton-template.md": "528691d1f0efa878",
"gsd-core/references/sketch-interactivity.md": "7d982fe877e1e1cc",
"gsd-core/references/sketch-theme-system.md": "33e2e96e450456f8",
"gsd-core/references/sketch-tooling.md": "df6c4f24c1c27611",
"gsd-core/references/sketch-variant-patterns.md": "66c197aa4fb52810",
"gsd-core/references/spidr-splitting.md": "074ac154c0e4f906",
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "41069529ef776e39",
"gsd-core/references/ui-brand.md": "48717bcfcd63bd27",
"gsd-core/references/universal-anti-patterns.md": "6a1245050b21df01",
"gsd-core/references/untrusted-input-boundary.md": "d33b80d4d348599a",
"gsd-core/references/user-profiling.md": "b50416fe57c1b321",
"gsd-core/references/user-story-template.md": "0cc50e06a144ff8a",
"gsd-core/references/verification-overrides.md": "8213de9bd62283b6",
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
"gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5",
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
"gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b",
"gsd-core/templates/DEBUG.md": "a13470b82b1935e7",
"gsd-core/templates/README.md": "93d3426fc64e2c12",
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
"gsd-core/templates/UAT.md": "9e296471b97ebcec",
"gsd-core/templates/UI-SPEC.md": "20ca56a4e3e21f01",
"gsd-core/templates/VALIDATION.md": "f53e0ca061d3528e",
"gsd-core/templates/claude-md.md": "d1d333e4b963c0d2",
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
"gsd-core/templates/codebase/conventions.md": "c2e07698dad6b364",
"gsd-core/templates/codebase/integrations.md": "39bd23c71eedd564",
"gsd-core/templates/codebase/stack.md": "116e7e67dd87ddec",
"gsd-core/templates/codebase/structure.md": "222997133232a6f5",
"gsd-core/templates/codebase/testing.md": "76abff7f2050c9ea",
"gsd-core/templates/config.json": "1473dff11272d3c4",
"gsd-core/templates/context.md": "69b01e7909ea3f66",
"gsd-core/templates/continue-here.md": "f522a51b6895fba8",
"gsd-core/templates/copilot-instructions.md": "aea34bc52ff548ea",
"gsd-core/templates/debug-subagent-prompt.md": "920656683dedb869",
"gsd-core/templates/dev-preferences.md": "88d0a65ec0993a3a",
"gsd-core/templates/discovery.md": "9a0e0935cc825dbc",
"gsd-core/templates/discussion-log.md": "cac1b48ec0f4dcb8",
"gsd-core/templates/milestone-archive.md": "591b6decdc0c0e51",
"gsd-core/templates/milestone.md": "74d2f750ae9f4a9c",
"gsd-core/templates/phase-prompt.md": "b811bf951092df2f",
"gsd-core/templates/planner-subagent-prompt.md": "ebf29dbb27042370",
"gsd-core/templates/project.md": "ab4af6becca2bb23",
"gsd-core/templates/requirements.md": "a44de4c2f146e473",
"gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0",
"gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f",
"gsd-core/templates/research-project/PITFALLS.md": "3ef75fa768422eec",
"gsd-core/templates/research-project/STACK.md": "82c85799ac4dd344",
"gsd-core/templates/research-project/SUMMARY.md": "dceb2f346388839d",
"gsd-core/templates/research.md": "88ce0920417091d0",
"gsd-core/templates/retrospective.md": "03981e30dd760103",
"gsd-core/templates/roadmap.md": "e4e35a9eb5dd4d4f",
"gsd-core/templates/spec.md": "26d55bce940f0288",
"gsd-core/templates/state.md": "4d123aa6cea167fe",
"gsd-core/templates/summary-complex.md": "a5e40574fd8894dc",
"gsd-core/templates/summary-minimal.md": "7d09b5e709e2e67c",
"gsd-core/templates/summary-standard.md": "e8d9cf4a8377cdff",
"gsd-core/templates/summary.md": "23c40f6503b3ea98",
"gsd-core/templates/user-profile.md": "20749f23e4c413fc",
"gsd-core/templates/user-setup.md": "78b7d718b6e8d67c",
"gsd-core/templates/verification-report.md": "dd5faa6254183731",
"gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb",
"gsd-core/workflows/add-backlog.md": "1153d35058e3e24f",
"gsd-core/workflows/add-phase.md": "b98c2fc51cd123ba",
"gsd-core/workflows/add-tests.md": "2871f7e6409ba89e",
"gsd-core/workflows/add-todo.md": "3b913840c1f490b2",
"gsd-core/workflows/ai-integration-phase.md": "ad2ff20091d1c2c0",
"gsd-core/workflows/analyze-dependencies.md": "52942af10f140717",
"gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b",
"gsd-core/workflows/audit-milestone.md": "fe7185bb70eafdb9",
"gsd-core/workflows/audit-uat.md": "ca6f1f0ef174f793",
"gsd-core/workflows/autonomous.md": "ba6828223ba13c1f",
"gsd-core/workflows/check-todos.md": "1e3026abe782bd36",
"gsd-core/workflows/cleanup.md": "5cf0772521c192a4",
"gsd-core/workflows/code-review-fix.md": "b442c670f8c1fe93",
"gsd-core/workflows/code-review.md": "1bfa3bf542e30c5e",
"gsd-core/workflows/complete-milestone.md": "8a4cfb41a4de5a99",
"gsd-core/workflows/debug.md": "da62e7a62c113b29",
"gsd-core/workflows/diagnose-issues.md": "b1fd597cb9420c33",
"gsd-core/workflows/discovery-phase.md": "3ba7cfb89fb1e761",
"gsd-core/workflows/discuss-phase-assumptions.md": "a365fdca7f7281ad",
"gsd-core/workflows/discuss-phase-power.md": "0841f7dc6e9a054a",
"gsd-core/workflows/discuss-phase.md": "d0da99d5c9c09c42",
"gsd-core/workflows/discuss-phase/modes/advisor.md": "c7d4a3ff91655d24",
"gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54",
"gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105",
"gsd-core/workflows/discuss-phase/modes/auto.md": "3333b280afd68321",
"gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448",
"gsd-core/workflows/discuss-phase/modes/chain.md": "ca3cc1ddfd19cd9d",
"gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966",
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
"gsd-core/workflows/discuss-phase/modes/text.md": "da6d45207da4a988",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
"gsd-core/workflows/do.md": "152e9c5c512f79cb",
"gsd-core/workflows/docs-update.md": "806ada831b961116",
"gsd-core/workflows/edit-phase.md": "e5624ac6e3f8bef5",
"gsd-core/workflows/eval-review.md": "dfcfb4f8ce031fae",
"gsd-core/workflows/execute-phase.md": "7bfec3ab2f9f1106",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "8898e0ea533cc643",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "abd2aca069c04a80",
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
"gsd-core/workflows/execute-plan.md": "0cda7b15d42b6d6f",
"gsd-core/workflows/explore.md": "11523b829cc67c29",
"gsd-core/workflows/extract-learnings.md": "a2e4836abdeb1fdb",
"gsd-core/workflows/fast.md": "94136fb570d20a9d",
"gsd-core/workflows/forensics.md": "76bea6e254652c2c",
"gsd-core/workflows/graduation.md": "00d1b7fe7ed8578b",
"gsd-core/workflows/health.md": "e3cb8ff4e01e9e53",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "5fe077fbbdb5d9f7",
"gsd-core/workflows/help/modes/default.md": "cc8ef97de634c995",
"gsd-core/workflows/help/modes/full.md": "26b7c72f1a12a80f",
"gsd-core/workflows/help/modes/topic.md": "d7c60d488810fbd6",
"gsd-core/workflows/import.md": "97861d522319d56e",
"gsd-core/workflows/inbox.md": "437f981ef9ae7b26",
"gsd-core/workflows/ingest-docs.md": "77d9103d8d5432f3",
"gsd-core/workflows/insert-phase.md": "621f9e75725542b1",
"gsd-core/workflows/list-phase-assumptions.md": "53dd4b69536c1bc3",
"gsd-core/workflows/list-seeds.md": "0a466d04df300854",
"gsd-core/workflows/list-workspaces.md": "6e5c402000090d7b",
"gsd-core/workflows/manager.md": "a31f7e255dd7d01d",
"gsd-core/workflows/map-codebase.md": "582bddef590de9c6",
"gsd-core/workflows/milestone-summary.md": "f956783f7d063963",
"gsd-core/workflows/mvp-phase.md": "bfa668107be972ed",
"gsd-core/workflows/new-milestone.md": "6d07ca2fc7aec3a4",
"gsd-core/workflows/new-project.md": "69d356f41ea36aa2",
"gsd-core/workflows/new-workspace.md": "fdd63a9adf030cb1",
"gsd-core/workflows/next.md": "48bd4b5d54f0d1f8",
"gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b",
"gsd-core/workflows/note.md": "5a99eb396c744619",
"gsd-core/workflows/pause-work.md": "7bcbdf27ba957c8b",
"gsd-core/workflows/plan-milestone-gaps.md": "02fee851c82e3b25",
"gsd-core/workflows/plan-phase.md": "f210c67e41f89f4a",
"gsd-core/workflows/plan-review-convergence.md": "10007f8382864bcd",
"gsd-core/workflows/plant-seed.md": "7b795d7a1b4c9f06",
"gsd-core/workflows/pr-branch.md": "f2a35833fe784a53",
"gsd-core/workflows/profile-user.md": "fc41a92a13e7778b",
"gsd-core/workflows/progress.md": "057699b34b6198f7",
"gsd-core/workflows/quick.md": "d1f1fe161cd49775",
"gsd-core/workflows/reapply-patches.md": "7915e40411490bbe",
"gsd-core/workflows/remove-phase.md": "d030f80ca0df4fa9",
"gsd-core/workflows/remove-workspace.md": "b8817a3a5907f5bc",
"gsd-core/workflows/resume-project.md": "b18b51fd15cbce95",
"gsd-core/workflows/review.md": "18ab093986814bb3",
"gsd-core/workflows/scan.md": "54ff1ff60041d065",
"gsd-core/workflows/secure-phase.md": "1d1c66ad9ea01bd2",
"gsd-core/workflows/session-report.md": "2e5b1205324ddefa",
"gsd-core/workflows/settings-advanced.md": "e7e50f99e4de3872",
"gsd-core/workflows/settings-integrations.md": "351c5a6d0d5e27ed",
"gsd-core/workflows/settings.md": "48d337eb7e3f141b",
"gsd-core/workflows/ship.md": "d26fb5d3e965642a",
"gsd-core/workflows/sketch-wrap-up.md": "19046704ae337d73",
"gsd-core/workflows/sketch.md": "e42a914206c152ef",
"gsd-core/workflows/spec-phase.md": "2aa0353147153776",
"gsd-core/workflows/spike-wrap-up.md": "3f3e7f0018284059",
"gsd-core/workflows/spike.md": "be2295fe2b32956f",
"gsd-core/workflows/stats.md": "01c24349370a0e6d",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "c26ca43fdf928d46",
"gsd-core/workflows/transition.md": "eee3435817fab185",
"gsd-core/workflows/ui-phase.md": "3dfb9f5161375035",
"gsd-core/workflows/ui-review.md": "1ad3654435000881",
"gsd-core/workflows/ultraplan-phase.md": "66c17ad2e555e262",
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
"gsd-core/workflows/update.md": "6369691790864147",
"gsd-core/workflows/validate-phase.md": "50f37b705b6e44fb",
"gsd-core/workflows/verify-phase.md": "968d569ea4ef377f",
"gsd-core/workflows/verify-work.md": "6f9c666386cb6d7e",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",
"scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
"scripts/changeset/lint.cjs": "0066faed159154f0",
"scripts/changeset/new.cjs": "4991e21fd17f5541",
"scripts/changeset/parse.cjs": "f9a949cbcab56445",
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
"skills/gsd-add-tests/SKILL.md": "217fc2587d3e7ec2",
"skills/gsd-ai-integration-phase/SKILL.md": "739a1376f6f56094",
"skills/gsd-audit-fix/SKILL.md": "ed585da70ba6da12",
"skills/gsd-audit-milestone/SKILL.md": "ad78e50cef304155",
"skills/gsd-audit-uat/SKILL.md": "b8e73cbb993a30e2",
"skills/gsd-autonomous/SKILL.md": "20b5483ce0cfac1b",
"skills/gsd-capture/SKILL.md": "d229a25109ab5f25",
"skills/gsd-cleanup/SKILL.md": "188302809e37f3a8",
"skills/gsd-code-review/SKILL.md": "f1e4c9d83d367715",
"skills/gsd-complete-milestone/SKILL.md": "d64cf8e60bf953d8",
"skills/gsd-config/SKILL.md": "234548c60b978332",
"skills/gsd-debug/SKILL.md": "71a61812bfd55246",
"skills/gsd-discuss-phase/SKILL.md": "77340d9f1fffa66f",
"skills/gsd-docs-update/SKILL.md": "05f4d618a938d3d4",
"skills/gsd-eval-review/SKILL.md": "6b32f5735b170d73",
"skills/gsd-execute-phase/SKILL.md": "8c92fb28c150b645",
"skills/gsd-explore/SKILL.md": "4ed4085d70b490b5",
"skills/gsd-extract-learnings/SKILL.md": "f16892f054247db9",
"skills/gsd-fast/SKILL.md": "dbf45fa1a88a9a16",
"skills/gsd-forensics/SKILL.md": "3077371ecd612e1d",
"skills/gsd-graphify/SKILL.md": "dc7e931f4acf8bfb",
"skills/gsd-health/SKILL.md": "9aa2cfcd42443dce",
"skills/gsd-help/SKILL.md": "b592e8ac7d2e512f",
"skills/gsd-import/SKILL.md": "8cdba84960d1e5fa",
"skills/gsd-inbox/SKILL.md": "955779a4b1df1c33",
"skills/gsd-ingest-docs/SKILL.md": "6366644e623ae9e4",
"skills/gsd-manager/SKILL.md": "8a11a1beb8e35a9c",
"skills/gsd-map-codebase/SKILL.md": "55dade835b0f4954",
"skills/gsd-mempalace-capture/SKILL.md": "3746fa9b34e20e71",
"skills/gsd-mempalace-recall/SKILL.md": "07b1b0e767da162c",
"skills/gsd-milestone-summary/SKILL.md": "3ea93ccaa0d4d967",
"skills/gsd-mvp-phase/SKILL.md": "d2f98f1e955797b6",
"skills/gsd-new-milestone/SKILL.md": "52c3cbe5b931985b",
"skills/gsd-new-project/SKILL.md": "d74e7583377e3563",
"skills/gsd-ns-context/SKILL.md": "89f5bffe6702c0c5",
"skills/gsd-ns-ideate/SKILL.md": "e0c0420f6878906a",
"skills/gsd-ns-manage/SKILL.md": "b7fbe29e45e75f54",
"skills/gsd-ns-project/SKILL.md": "1292d4a6a4280ce9",
"skills/gsd-ns-review/SKILL.md": "2ff62330379f947f",
"skills/gsd-ns-workflow/SKILL.md": "3f5fcfec9da730a2",
"skills/gsd-pause-work/SKILL.md": "95017c70ae9dca0d",
"skills/gsd-phase/SKILL.md": "31578c329cc2583e",
"skills/gsd-plan-phase/SKILL.md": "54798eddf30056b5",
"skills/gsd-plan-review-convergence/SKILL.md": "0b549738d41d59b5",
"skills/gsd-pr-branch/SKILL.md": "67f468db29ff2cf1",
"skills/gsd-profile-user/SKILL.md": "19a1d3aba57f6c7c",
"skills/gsd-progress/SKILL.md": "cc46a92b92b989ce",
"skills/gsd-quick/SKILL.md": "e6aa7d96326fc874",
"skills/gsd-resume-work/SKILL.md": "6e83a416db8253e1",
"skills/gsd-review-backlog/SKILL.md": "ffc6216cfb6c3002",
"skills/gsd-review/SKILL.md": "c248b415238b49ee",
"skills/gsd-secure-phase/SKILL.md": "9aa4378c6371e5e4",
"skills/gsd-settings/SKILL.md": "dee7f5011c9a46f4",
"skills/gsd-ship/SKILL.md": "b2e10966b6781b95",
"skills/gsd-sketch/SKILL.md": "010431b46e681600",
"skills/gsd-spec-phase/SKILL.md": "23ff63ddf425c1c2",
"skills/gsd-spike/SKILL.md": "aa740909d20a82f2",
"skills/gsd-stats/SKILL.md": "a7e478f76e0b6db1",
"skills/gsd-surface/SKILL.md": "2f72da87138503aa",
"skills/gsd-thread/SKILL.md": "fb52a782c6e83e03",
"skills/gsd-ui-phase/SKILL.md": "1d7ed00d7970ed51",
"skills/gsd-ui-review/SKILL.md": "39b36951bafe1495",
"skills/gsd-ultraplan-phase/SKILL.md": "766e038ea49f1ca7",
"skills/gsd-undo/SKILL.md": "ce1c97ed1228ff6d",
"skills/gsd-update/SKILL.md": "5ecb292eca7e9563",
"skills/gsd-validate-phase/SKILL.md": "2995d65030d9e441",
"skills/gsd-verify-work/SKILL.md": "9268ea031159f121",
"skills/gsd-workspace/SKILL.md": "0ebfbc00112e3802",
"skills/gsd-workstreams/SKILL.md": "cd2ed0019f00302a"
}

View File

@@ -0,0 +1,473 @@
{
".gsd-profile": "0e716a5fef4e6dc1",
".gsd/defaults.json": "560664b045e645cb",
"agents/gsd-advisor-researcher.md": "fc4eba63daf0b1ee",
"agents/gsd-ai-researcher.md": "fb47a65999c957d0",
"agents/gsd-assumptions-analyzer.md": "cc0dbbd41e0a77a5",
"agents/gsd-code-fixer.md": "aa353a2a42b27981",
"agents/gsd-code-reviewer.md": "70deeb7ac7caf384",
"agents/gsd-codebase-mapper.md": "b9fd529aca682ccb",
"agents/gsd-debug-session-manager.md": "09c805b7283633fd",
"agents/gsd-debugger.md": "610a3ff965f9fb6a",
"agents/gsd-doc-classifier.md": "cd4169adec56c26f",
"agents/gsd-doc-synthesizer.md": "47a8b52fe974a810",
"agents/gsd-doc-verifier.md": "65bbc2ae6b9ace29",
"agents/gsd-doc-writer.md": "b7acb2d8238c44c4",
"agents/gsd-domain-researcher.md": "71250e759ca9e723",
"agents/gsd-eval-auditor.md": "8975c9f3bca95bd5",
"agents/gsd-eval-planner.md": "60bddb70a937f796",
"agents/gsd-executor.md": "bcdc3f8bc334190a",
"agents/gsd-framework-selector.md": "1c0a10355e787675",
"agents/gsd-integration-checker.md": "69cfb2bbdfa56e28",
"agents/gsd-intel-updater.md": "f9ef2797738b7f09",
"agents/gsd-mempalace-curator.md": "aa7cf2c611057735",
"agents/gsd-nyquist-auditor.md": "b9b9e935503e63a5",
"agents/gsd-pattern-mapper.md": "7c6d1d9817a9c1e7",
"agents/gsd-phase-researcher.md": "c206f5e7333fb2c9",
"agents/gsd-plan-checker.md": "f2c99e85291ce71b",
"agents/gsd-planner.md": "7a49c1bee3578da4",
"agents/gsd-project-researcher.md": "c70f9cf0d5593f09",
"agents/gsd-research-synthesizer.md": "a534bc0eaf1ac03b",
"agents/gsd-roadmapper.md": "6b8bdf6015939351",
"agents/gsd-security-auditor.md": "404f38e52ba883ff",
"agents/gsd-ui-auditor.md": "b040c900e8de2368",
"agents/gsd-ui-checker.md": "b98b00e586610657",
"agents/gsd-ui-researcher.md": "7ff5c528bef6af09",
"agents/gsd-user-profiler.md": "d825b4c0a6431f8b",
"agents/gsd-verifier.md": "1e0ff1d8d15a48ab",
"command/gsd-add-tests.md": "b9cd93ed01945f75",
"command/gsd-ai-integration-phase.md": "9d4bc4dcce7f1ee0",
"command/gsd-audit-fix.md": "5615403843d5e491",
"command/gsd-audit-milestone.md": "4c700c081f3918ba",
"command/gsd-audit-uat.md": "47dce58d5823da8d",
"command/gsd-autonomous.md": "d6444c6d39585b07",
"command/gsd-capture.md": "a1085d451e138028",
"command/gsd-cleanup.md": "66b219076f1e2aa3",
"command/gsd-code-review.md": "3256032e666821b5",
"command/gsd-complete-milestone.md": "92ee70af4d6235bb",
"command/gsd-config.md": "11045b66313fb788",
"command/gsd-debug.md": "cb6ac21129dff67f",
"command/gsd-discuss-phase.md": "a2a59956edf33a2c",
"command/gsd-docs-update.md": "668979b6c56708c0",
"command/gsd-eval-review.md": "28499776a3fde3ad",
"command/gsd-execute-phase.md": "da51f21998c75175",
"command/gsd-explore.md": "7618219025e28c15",
"command/gsd-extract-learnings.md": "42fd40385c7a7a3b",
"command/gsd-fast.md": "d1fcda0719ae90be",
"command/gsd-forensics.md": "051270e8c76c1b13",
"command/gsd-graphify.md": "1a4ec781f74862e2",
"command/gsd-health.md": "66d298ed71d57cb0",
"command/gsd-help.md": "a26c6ba391002635",
"command/gsd-import.md": "e1bff34deb61c802",
"command/gsd-inbox.md": "cc850bab897aed1f",
"command/gsd-ingest-docs.md": "b47c812c247e58a4",
"command/gsd-manager.md": "86ece154b34b6d1b",
"command/gsd-map-codebase.md": "1fb678f8a17a380e",
"command/gsd-mempalace-capture.md": "08b9750f1b1d1ba6",
"command/gsd-mempalace-recall.md": "2316f1a950490845",
"command/gsd-milestone-summary.md": "86a827271bc647c5",
"command/gsd-mvp-phase.md": "d45fd76cb9cff3ef",
"command/gsd-new-milestone.md": "64c9dc73425a66a2",
"command/gsd-new-project.md": "0086f0de26002219",
"command/gsd-ns-context.md": "9a2b55b64f2e1e4b",
"command/gsd-ns-ideate.md": "27e7fcdc69eeeb5f",
"command/gsd-ns-manage.md": "eded59052ca4b240",
"command/gsd-ns-project.md": "91417cf7b76581dd",
"command/gsd-ns-review.md": "61fe33e28eb1b961",
"command/gsd-ns-workflow.md": "3352c292c27fe50b",
"command/gsd-pause-work.md": "bb5bf91a2e3e480e",
"command/gsd-phase.md": "6bcda1539f949d5a",
"command/gsd-plan-phase.md": "7ee44086b59862b9",
"command/gsd-plan-review-convergence.md": "79e141ca34edba9a",
"command/gsd-pr-branch.md": "31fca4f1d6c4ee62",
"command/gsd-profile-user.md": "725c14ae7203b5b6",
"command/gsd-progress.md": "001f2754c427a0a9",
"command/gsd-quick.md": "07c02ab7547aec8e",
"command/gsd-resume-work.md": "3ac18b2a8cc41066",
"command/gsd-review-backlog.md": "1e99d6a7a3806fa5",
"command/gsd-review.md": "e1aee41cc2d736b5",
"command/gsd-secure-phase.md": "b536ad6e68af3a26",
"command/gsd-settings.md": "a3d2cb48b06c9b90",
"command/gsd-ship.md": "062d0bb5656fa31b",
"command/gsd-sketch.md": "1af54bb16c370798",
"command/gsd-spec-phase.md": "b92bca076ca2c5c6",
"command/gsd-spike.md": "1b2fa4b468e831dc",
"command/gsd-stats.md": "51af934859f87623",
"command/gsd-surface.md": "26a5f0aab82c1c4a",
"command/gsd-thread.md": "ae3b000bee0ee1e0",
"command/gsd-ui-phase.md": "21c9c043d813dc0a",
"command/gsd-ui-review.md": "ef36603b519e8fe8",
"command/gsd-ultraplan-phase.md": "d18d13428ae3f8e6",
"command/gsd-undo.md": "dbbf9423ce795b89",
"command/gsd-update.md": "df2be717088fe8d0",
"command/gsd-validate-phase.md": "f320705816d725f3",
"command/gsd-verify-work.md": "f23fff8e6d71f704",
"command/gsd-workspace.md": "1e581bdb33bc8f55",
"command/gsd-workstreams.md": "5e57eed1881c3891",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/gsd-tools.cjs": "b7968e3e3af00249",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"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",
"gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4",
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
"gsd-core/contexts/review.md": "dc578fdd74bbea11",
"gsd-core/references/agent-contracts.md": "ff65e633c656c0d2",
"gsd-core/references/ai-evals.md": "b5afa786b938671e",
"gsd-core/references/ai-frameworks.md": "425dd69c629230e7",
"gsd-core/references/artifact-types.md": "218c55caf8aff6df",
"gsd-core/references/autonomous-smart-discuss.md": "3986d58011bf9006",
"gsd-core/references/checkpoints.md": "9feb961f644afa96",
"gsd-core/references/common-bug-patterns.md": "780145be56352626",
"gsd-core/references/context-budget.md": "355826e667f9ccd1",
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
"gsd-core/references/debugger-philosophy.md": "1cb61d4565081c88",
"gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474",
"gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e",
"gsd-core/references/domain-probes.md": "762b965e84035b72",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/requirements.json": "fbc1b355d8625eeb",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json": "66dd60957fee45f0",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json": "47fca61f076835fa",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/requirements.json": "80f04f5c04fb24cf",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json": "d38147adb0e5b342",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json": "bc552c01939bf4f8",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json": "688ec62c13e08afe",
"gsd-core/references/edge-probe.md": "47e6193c678eefe5",
"gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc",
"gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e",
"gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e",
"gsd-core/references/execute-phase-wave-guard.md": "de9ac22cead4cfd8",
"gsd-core/references/executor-examples.md": "ba59243ed45c8ab1",
"gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4",
"gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8",
"gsd-core/references/gate-prompts.md": "43e867720e736464",
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "fbdf814a3af9c051",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
"gsd-core/references/model-profile-resolution.md": "858c16730df68ac2",
"gsd-core/references/model-profiles.md": "9e160d4e754b6b9e",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "2459c40bfc8a0ea8",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
"gsd-core/references/planner-guidance.md": "7fe925c09092476b",
"gsd-core/references/planner-human-verify-mode.md": "3a625b42d9cb93ee",
"gsd-core/references/planner-interface-context.md": "b28fa3da6ae739a8",
"gsd-core/references/planner-load-graph-context.md": "97f6e67b56c072c1",
"gsd-core/references/planner-mvp-mode.md": "2901bb0fdb156d5c",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "4acefb3c71169c84",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
"gsd-core/references/prohibition-probe.md": "5892b08550d8444e",
"gsd-core/references/project-skills-discovery.md": "c2ba4b8beda7bbcc",
"gsd-core/references/questioning.md": "a083e5e3e16dd802",
"gsd-core/references/research-documentation-lookup.md": "c070007d1d72ab71",
"gsd-core/references/research-philosophy.md": "a602b41bfa081fdf",
"gsd-core/references/research-verification-protocol.md": "9c38c9d9a687e679",
"gsd-core/references/revision-loop.md": "e55ff32dd98c63df",
"gsd-core/references/scout-codebase.md": "ba266ecc18fbf172",
"gsd-core/references/security-asvs-levels.md": "4774fac3b94b6ca8",
"gsd-core/references/skeleton-template.md": "528691d1f0efa878",
"gsd-core/references/sketch-interactivity.md": "7d982fe877e1e1cc",
"gsd-core/references/sketch-theme-system.md": "33e2e96e450456f8",
"gsd-core/references/sketch-tooling.md": "df6c4f24c1c27611",
"gsd-core/references/sketch-variant-patterns.md": "66c197aa4fb52810",
"gsd-core/references/spidr-splitting.md": "074ac154c0e4f906",
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
"gsd-core/references/ui-brand.md": "48717bcfcd63bd27",
"gsd-core/references/universal-anti-patterns.md": "6a1245050b21df01",
"gsd-core/references/untrusted-input-boundary.md": "d33b80d4d348599a",
"gsd-core/references/user-profiling.md": "8e023a908d968af1",
"gsd-core/references/user-story-template.md": "0cc50e06a144ff8a",
"gsd-core/references/verification-overrides.md": "a3e2d5166d16a37b",
"gsd-core/references/verification-patterns.md": "3bd98d30eee6c5a1",
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
"gsd-core/references/workstream-flag.md": "225910640adbb76d",
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
"gsd-core/templates/DEBUG.md": "a2eea97e7f1336bf",
"gsd-core/templates/README.md": "73d3c9689b6efbc9",
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
"gsd-core/templates/UI-SPEC.md": "20ca56a4e3e21f01",
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
"gsd-core/templates/claude-md.md": "a4f5e38984001194",
"gsd-core/templates/codebase/architecture.md": "282db635ba093b1a",
"gsd-core/templates/codebase/concerns.md": "e66c584daa636fc5",
"gsd-core/templates/codebase/conventions.md": "c5f0324730852701",
"gsd-core/templates/codebase/integrations.md": "39bd23c71eedd564",
"gsd-core/templates/codebase/stack.md": "116e7e67dd87ddec",
"gsd-core/templates/codebase/structure.md": "bb76f9538f2bc4e0",
"gsd-core/templates/codebase/testing.md": "76abff7f2050c9ea",
"gsd-core/templates/config.json": "1473dff11272d3c4",
"gsd-core/templates/context.md": "593d4e6d20fdde7c",
"gsd-core/templates/continue-here.md": "8b1dce4832c7922b",
"gsd-core/templates/copilot-instructions.md": "aea34bc52ff548ea",
"gsd-core/templates/debug-subagent-prompt.md": "8c18a89e25929d8e",
"gsd-core/templates/dev-preferences.md": "95048a71063d980b",
"gsd-core/templates/discovery.md": "e4ab738326eb70e0",
"gsd-core/templates/discussion-log.md": "da4e8e266efdc6c2",
"gsd-core/templates/milestone-archive.md": "591b6decdc0c0e51",
"gsd-core/templates/milestone.md": "74d2f750ae9f4a9c",
"gsd-core/templates/phase-prompt.md": "ee8880432b4d1566",
"gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f",
"gsd-core/templates/project.md": "e4a3b331be081e62",
"gsd-core/templates/requirements.md": "a44de4c2f146e473",
"gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0",
"gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f",
"gsd-core/templates/research-project/PITFALLS.md": "3ef75fa768422eec",
"gsd-core/templates/research-project/STACK.md": "82c85799ac4dd344",
"gsd-core/templates/research-project/SUMMARY.md": "dceb2f346388839d",
"gsd-core/templates/research.md": "b454f96fdf8b1d3d",
"gsd-core/templates/retrospective.md": "03981e30dd760103",
"gsd-core/templates/roadmap.md": "e4e35a9eb5dd4d4f",
"gsd-core/templates/spec.md": "8734f0df4df3a34b",
"gsd-core/templates/state.md": "a45a134631efe3f9",
"gsd-core/templates/summary-complex.md": "a5e40574fd8894dc",
"gsd-core/templates/summary-minimal.md": "7d09b5e709e2e67c",
"gsd-core/templates/summary-standard.md": "e8d9cf4a8377cdff",
"gsd-core/templates/summary.md": "23c40f6503b3ea98",
"gsd-core/templates/user-profile.md": "52abe2af968e8533",
"gsd-core/templates/user-setup.md": "1da2382725db080f",
"gsd-core/templates/verification-report.md": "78ab9264ce63ed7e",
"gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb",
"gsd-core/workflows/add-backlog.md": "b06846965aac2c53",
"gsd-core/workflows/add-phase.md": "226a281548498ae5",
"gsd-core/workflows/add-tests.md": "29a06d57250bc054",
"gsd-core/workflows/add-todo.md": "c98d2b68d0f0bf6d",
"gsd-core/workflows/ai-integration-phase.md": "bd7f0c25f1f52a95",
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
"gsd-core/workflows/audit-fix.md": "c7878f1dff04adf1",
"gsd-core/workflows/audit-milestone.md": "99f0b884c9208dde",
"gsd-core/workflows/audit-uat.md": "e530acf37fd9c699",
"gsd-core/workflows/autonomous.md": "9a19deccc06a702e",
"gsd-core/workflows/check-todos.md": "42806d03eacf9ff6",
"gsd-core/workflows/cleanup.md": "daca0c4f1d531a02",
"gsd-core/workflows/code-review-fix.md": "618c850533bd5c9e",
"gsd-core/workflows/code-review.md": "e362de9cce43c8fc",
"gsd-core/workflows/complete-milestone.md": "f48a1771ebb15067",
"gsd-core/workflows/debug.md": "0e12f6f3589cc0ea",
"gsd-core/workflows/diagnose-issues.md": "d8c817d029ea186e",
"gsd-core/workflows/discovery-phase.md": "724408336596c50c",
"gsd-core/workflows/discuss-phase-assumptions.md": "42418e64617c5de3",
"gsd-core/workflows/discuss-phase-power.md": "5c0d1ca6abda0383",
"gsd-core/workflows/discuss-phase.md": "3b4b9908e57b329f",
"gsd-core/workflows/discuss-phase/modes/advisor.md": "f44a1979ba5841a3",
"gsd-core/workflows/discuss-phase/modes/all.md": "5ed71228ac96e728",
"gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105",
"gsd-core/workflows/discuss-phase/modes/auto.md": "69d274e077af5292",
"gsd-core/workflows/discuss-phase/modes/batch.md": "78f6ef61690acb66",
"gsd-core/workflows/discuss-phase/modes/chain.md": "b01b9974f762af76",
"gsd-core/workflows/discuss-phase/modes/default.md": "5d12f2593ae4a813",
"gsd-core/workflows/discuss-phase/modes/power.md": "799fc7e1283b568f",
"gsd-core/workflows/discuss-phase/modes/text.md": "daf23a04b101ab38",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "04e4feee14772275",
"gsd-core/workflows/do.md": "9464559b832bf9c0",
"gsd-core/workflows/docs-update.md": "93e969c3afb446a0",
"gsd-core/workflows/edit-phase.md": "ed948a400a0146c7",
"gsd-core/workflows/eval-review.md": "1ba1af74a43c07db",
"gsd-core/workflows/execute-phase.md": "54846f6fffad0cea",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "a640b093a5a7b028",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "8b42f5df1a2c231f",
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
"gsd-core/workflows/execute-plan.md": "7894850154836fcf",
"gsd-core/workflows/explore.md": "96ba55f53899a261",
"gsd-core/workflows/extract-learnings.md": "b8851263c2d28702",
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
"gsd-core/workflows/forensics.md": "706b3983dd315789",
"gsd-core/workflows/graduation.md": "7d03b353a0323cce",
"gsd-core/workflows/health.md": "1fad392ce1aec410",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495",
"gsd-core/workflows/help/modes/default.md": "b544113eb9aa54fa",
"gsd-core/workflows/help/modes/full.md": "4683429199900853",
"gsd-core/workflows/help/modes/topic.md": "a404990fcf2d7df7",
"gsd-core/workflows/import.md": "46337b37d375f4da",
"gsd-core/workflows/inbox.md": "a073396097c89c01",
"gsd-core/workflows/ingest-docs.md": "bbb4f5fb3ab75113",
"gsd-core/workflows/insert-phase.md": "a305657b04dc3f1f",
"gsd-core/workflows/list-phase-assumptions.md": "e7b5e35c9452e3b3",
"gsd-core/workflows/list-seeds.md": "f8a55d8f83a4492d",
"gsd-core/workflows/list-workspaces.md": "74aa5ac3cb9b00bf",
"gsd-core/workflows/manager.md": "e77230eb5a8a1c78",
"gsd-core/workflows/map-codebase.md": "40624186d001658f",
"gsd-core/workflows/milestone-summary.md": "0acae8647e544018",
"gsd-core/workflows/mvp-phase.md": "efeb5d11f5b10e73",
"gsd-core/workflows/new-milestone.md": "56ae3ae36ab32cef",
"gsd-core/workflows/new-project.md": "d3c0ce0e163d5048",
"gsd-core/workflows/new-workspace.md": "cfbe1d7f60f2bfe4",
"gsd-core/workflows/next.md": "83ccac8577032cb6",
"gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b",
"gsd-core/workflows/note.md": "0d1374f2a2257858",
"gsd-core/workflows/pause-work.md": "c9f0b8826845dda7",
"gsd-core/workflows/plan-milestone-gaps.md": "5ec459734bf7570c",
"gsd-core/workflows/plan-phase.md": "1aea2bd181a782cf",
"gsd-core/workflows/plan-review-convergence.md": "4f884d793d72d3fd",
"gsd-core/workflows/plant-seed.md": "507e886d0f70d84c",
"gsd-core/workflows/pr-branch.md": "3abaa18246facdc3",
"gsd-core/workflows/profile-user.md": "6c16f62edaaebdc9",
"gsd-core/workflows/progress.md": "6b34c4542cfe90b0",
"gsd-core/workflows/quick.md": "47baa1c8712f1911",
"gsd-core/workflows/reapply-patches.md": "a6cfec7e2a0e7ee2",
"gsd-core/workflows/remove-phase.md": "863c58e99e9d630d",
"gsd-core/workflows/remove-workspace.md": "4ed03c52e5c7bd4d",
"gsd-core/workflows/resume-project.md": "15153ce5a4c38674",
"gsd-core/workflows/review.md": "dd336f71a0b8f228",
"gsd-core/workflows/scan.md": "4634caefa32a7307",
"gsd-core/workflows/secure-phase.md": "9616682fe23cf042",
"gsd-core/workflows/session-report.md": "2e5b1205324ddefa",
"gsd-core/workflows/settings-advanced.md": "6ea6dd988fefdab3",
"gsd-core/workflows/settings-integrations.md": "6bd6cccc1aff9bc9",
"gsd-core/workflows/settings.md": "4c24ab123703d769",
"gsd-core/workflows/ship.md": "5ffb515478d78cb6",
"gsd-core/workflows/sketch-wrap-up.md": "1a9f5b8e01a43506",
"gsd-core/workflows/sketch.md": "89acaae8de9bf8c9",
"gsd-core/workflows/spec-phase.md": "eb94ceb386b2a328",
"gsd-core/workflows/spike-wrap-up.md": "3609a57dbd8b5ac0",
"gsd-core/workflows/spike.md": "df52b9f31a72d204",
"gsd-core/workflows/stats.md": "598b1bb510ed0451",
"gsd-core/workflows/sync-skills.md": "7e2c138cdbef4282",
"gsd-core/workflows/thread.md": "c11265f0fa0a95d3",
"gsd-core/workflows/transition.md": "2d6739f730c3ea10",
"gsd-core/workflows/ui-phase.md": "38dac814d2d03d6f",
"gsd-core/workflows/ui-review.md": "3d972d3bd30527b3",
"gsd-core/workflows/ultraplan-phase.md": "11db7f58a45aca2e",
"gsd-core/workflows/undo.md": "0bba5e7f6196c894",
"gsd-core/workflows/update.md": "af51041a3172c523",
"gsd-core/workflows/validate-phase.md": "0fc5991f6d7c6c39",
"gsd-core/workflows/verify-phase.md": "d8999a0a1cd7b6de",
"gsd-core/workflows/verify-work.md": "52f6011634cff599",
"hooks/gsd-check-update-worker.js": "5882dbd41918c863",
"hooks/gsd-check-update.js": "5fb0027b7b76986c",
"hooks/gsd-config-reload.js": "17bf778d432b3d2a",
"hooks/gsd-context-monitor.js": "6afbef2291b68874",
"hooks/gsd-cursor-post-tool.js": "d61ee04f6ee7858c",
"hooks/gsd-cursor-session-start.js": "148b8ec4e2c97f00",
"hooks/gsd-ensure-canonical-path.js": "5f8be5b0a01a88ea",
"hooks/gsd-graphify-update.sh": "396ebda3c6705dc9",
"hooks/gsd-phase-boundary.sh": "6aa3ba9af3d465d9",
"hooks/gsd-prompt-guard.js": "4b08c2dce0233e2d",
"hooks/gsd-read-guard.js": "b602f88f046a7551",
"hooks/gsd-read-injection-scanner.js": "fb5730e37a300e69",
"hooks/gsd-session-state.sh": "b1496e6a5204a6df",
"hooks/gsd-statusline.js": "a0e7b01ec5012940",
"hooks/gsd-update-banner.js": "74817c820b7a4ec1",
"hooks/gsd-validate-commit.sh": "14d3d966c74dc310",
"hooks/gsd-workflow-guard.js": "e22b9fb57f0e64f6",
"hooks/gsd-worktree-path-guard.js": "3df1fd5409d358f3",
"hooks/lib/git-cmd.js": "268ba15992ca0b23",
"hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
"hooks/managed-hooks-registry.cjs": "763730ef31e5fd1c",
"opencode.json": "13151e97ff23c1aa",
"package.json": "dbf8353f77358bc1",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",
"scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
"scripts/changeset/lint.cjs": "0066faed159154f0",
"scripts/changeset/new.cjs": "4991e21fd17f5541",
"scripts/changeset/parse.cjs": "f9a949cbcab56445",
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
"skills/gsd-add-tests/SKILL.md": "f60794b90b48cbac",
"skills/gsd-ai-integration-phase/SKILL.md": "868ca7c86ef61033",
"skills/gsd-audit-fix/SKILL.md": "740d255df04b6e93",
"skills/gsd-audit-milestone/SKILL.md": "68b57f54877f35a9",
"skills/gsd-audit-uat/SKILL.md": "d73e6e175a711ed9",
"skills/gsd-autonomous/SKILL.md": "b3191d241afe2c87",
"skills/gsd-capture/SKILL.md": "880a3b965d53c689",
"skills/gsd-cleanup/SKILL.md": "e65d36bc64d7ce56",
"skills/gsd-code-review/SKILL.md": "f5c5d139d9f58e30",
"skills/gsd-complete-milestone/SKILL.md": "f794594de6a2e6c8",
"skills/gsd-config/SKILL.md": "6bcfbc815e5abddd",
"skills/gsd-debug/SKILL.md": "fbf869a73b318bfc",
"skills/gsd-discuss-phase/SKILL.md": "b86f39c16163c3ca",
"skills/gsd-docs-update/SKILL.md": "b0377eebbf71f802",
"skills/gsd-eval-review/SKILL.md": "a0da1d2b8b0dec62",
"skills/gsd-execute-phase/SKILL.md": "6d93b3fa856aef8f",
"skills/gsd-explore/SKILL.md": "79a05b06d9854d56",
"skills/gsd-extract-learnings/SKILL.md": "039975449139eb77",
"skills/gsd-fast/SKILL.md": "5b39ef1a6ad40b93",
"skills/gsd-forensics/SKILL.md": "1e0be6b8862ac549",
"skills/gsd-graphify/SKILL.md": "578621183849fe03",
"skills/gsd-health/SKILL.md": "b0bb84935cfbdd61",
"skills/gsd-help/SKILL.md": "326eb69ee18b4265",
"skills/gsd-import/SKILL.md": "23ac1e4e73e175d4",
"skills/gsd-inbox/SKILL.md": "3b2dd319d91dbab4",
"skills/gsd-ingest-docs/SKILL.md": "8f294b4894f782a5",
"skills/gsd-manager/SKILL.md": "cf40f237b4f20aa7",
"skills/gsd-map-codebase/SKILL.md": "6d74ea41e29ff035",
"skills/gsd-mempalace-capture/SKILL.md": "260e1dabc7014ba2",
"skills/gsd-mempalace-recall/SKILL.md": "045d85c8cab1afcc",
"skills/gsd-milestone-summary/SKILL.md": "175366bb500b5e64",
"skills/gsd-mvp-phase/SKILL.md": "0531d0e907af41ce",
"skills/gsd-new-milestone/SKILL.md": "45688741cc4bab41",
"skills/gsd-new-project/SKILL.md": "feef18d69466fdf9",
"skills/gsd-ns-context/SKILL.md": "110fb2227bcde535",
"skills/gsd-ns-ideate/SKILL.md": "d093d59a8519decc",
"skills/gsd-ns-manage/SKILL.md": "2756981de613022e",
"skills/gsd-ns-project/SKILL.md": "757976d48e8b7a26",
"skills/gsd-ns-review/SKILL.md": "680bdd33c882b049",
"skills/gsd-ns-workflow/SKILL.md": "68effe2fc2c65317",
"skills/gsd-pause-work/SKILL.md": "c7e9ba4f242c4648",
"skills/gsd-phase/SKILL.md": "ee78c0c56c814d84",
"skills/gsd-plan-phase/SKILL.md": "6abcc3a1568a6bb9",
"skills/gsd-plan-review-convergence/SKILL.md": "15ab9274bbb733a7",
"skills/gsd-pr-branch/SKILL.md": "8fa5a8fa217fe913",
"skills/gsd-profile-user/SKILL.md": "3e6155a64523d59f",
"skills/gsd-progress/SKILL.md": "1dfd9327510e500c",
"skills/gsd-quick/SKILL.md": "a9a971a0d471b64f",
"skills/gsd-resume-work/SKILL.md": "aa6a7d9e88fe26b6",
"skills/gsd-review-backlog/SKILL.md": "27a9dbfe92e5d04c",
"skills/gsd-review/SKILL.md": "9fe549f07cf4da07",
"skills/gsd-secure-phase/SKILL.md": "b37a0dbae84dd74a",
"skills/gsd-settings/SKILL.md": "d72a537765bf690a",
"skills/gsd-ship/SKILL.md": "fc88192bae429756",
"skills/gsd-sketch/SKILL.md": "e3fd03e727bc20df",
"skills/gsd-spec-phase/SKILL.md": "332028ed34b85b1f",
"skills/gsd-spike/SKILL.md": "9303cd74a8bf0741",
"skills/gsd-stats/SKILL.md": "2af976632e239069",
"skills/gsd-surface/SKILL.md": "ea512089d0e1d057",
"skills/gsd-thread/SKILL.md": "9ff9979a8213dbf8",
"skills/gsd-ui-phase/SKILL.md": "5eee1bdd13640252",
"skills/gsd-ui-review/SKILL.md": "c99d6725326bfbc4",
"skills/gsd-ultraplan-phase/SKILL.md": "5c28ee1f65be343b",
"skills/gsd-undo/SKILL.md": "4a5d3472c7da4cc9",
"skills/gsd-update/SKILL.md": "268677bd0089ea9b",
"skills/gsd-validate-phase/SKILL.md": "8d29201527e7d9d4",
"skills/gsd-verify-work/SKILL.md": "bea3cee3b2f5170e",
"skills/gsd-workspace/SKILL.md": "f3c295e6b7c2e38a",
"skills/gsd-workstreams/SKILL.md": "44c62598142837b9"
}

View File

@@ -0,0 +1,404 @@
{
".gsd-profile": "0e716a5fef4e6dc1",
".gsd/defaults.json": "560664b045e645cb",
"agents/gsd-advisor-researcher.md": "5a0c65ccc25ddfbe",
"agents/gsd-ai-researcher.md": "97fdf624a1c6c324",
"agents/gsd-assumptions-analyzer.md": "a8982fc704f7ec81",
"agents/gsd-code-fixer.md": "f6da5df6c2cc1b14",
"agents/gsd-code-reviewer.md": "0f586b04f8628cc2",
"agents/gsd-codebase-mapper.md": "397ae2efb6e00487",
"agents/gsd-debug-session-manager.md": "c88ad88c7a9fff8b",
"agents/gsd-debugger.md": "dc5a6e749f132d67",
"agents/gsd-doc-classifier.md": "5de2a66c751b2d58",
"agents/gsd-doc-synthesizer.md": "8e6fb8220f777022",
"agents/gsd-doc-verifier.md": "3767850df78f4a36",
"agents/gsd-doc-writer.md": "7d9e39254bba203a",
"agents/gsd-domain-researcher.md": "d4c07520f650ffd5",
"agents/gsd-eval-auditor.md": "8d70a305103219ac",
"agents/gsd-eval-planner.md": "03448fc9c5774b56",
"agents/gsd-executor.md": "b672a6f59a043f9e",
"agents/gsd-framework-selector.md": "ea9981d65d6b3429",
"agents/gsd-integration-checker.md": "599ae0380d5218fc",
"agents/gsd-intel-updater.md": "22cc46f64ad4c336",
"agents/gsd-mempalace-curator.md": "576b8d0db51bc462",
"agents/gsd-nyquist-auditor.md": "61be7d5ed9aeb520",
"agents/gsd-pattern-mapper.md": "9ab071c3ffc1cf46",
"agents/gsd-phase-researcher.md": "e1df6362eba320a5",
"agents/gsd-plan-checker.md": "9e5a435b15b9274a",
"agents/gsd-planner.md": "d75b6e16d5338166",
"agents/gsd-project-researcher.md": "d8140745d468c79a",
"agents/gsd-research-synthesizer.md": "94365f77f72611f4",
"agents/gsd-roadmapper.md": "5dd0803e15660e85",
"agents/gsd-security-auditor.md": "f1554fb939be79fc",
"agents/gsd-ui-auditor.md": "4d8388dfe33496b1",
"agents/gsd-ui-checker.md": "7a383f6a3fbba34b",
"agents/gsd-ui-researcher.md": "67596ca5ee2f4547",
"agents/gsd-user-profiler.md": "ca3bf75581f211a0",
"agents/gsd-verifier.md": "82b7967e24c2065b",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/gsd-tools.cjs": "b7968e3e3af00249",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"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",
"gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4",
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
"gsd-core/contexts/review.md": "dc578fdd74bbea11",
"gsd-core/references/agent-contracts.md": "ff65e633c656c0d2",
"gsd-core/references/ai-evals.md": "b5afa786b938671e",
"gsd-core/references/ai-frameworks.md": "f827de93dde124eb",
"gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e",
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
"gsd-core/references/checkpoints.md": "046171320f816346",
"gsd-core/references/common-bug-patterns.md": "780145be56352626",
"gsd-core/references/context-budget.md": "a1351dd40ef8691f",
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
"gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3",
"gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474",
"gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e",
"gsd-core/references/domain-probes.md": "762b965e84035b72",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/requirements.json": "fbc1b355d8625eeb",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json": "66dd60957fee45f0",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json": "47fca61f076835fa",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/requirements.json": "80f04f5c04fb24cf",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json": "d38147adb0e5b342",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json": "bc552c01939bf4f8",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json": "688ec62c13e08afe",
"gsd-core/references/edge-probe.md": "5687eba25a078561",
"gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc",
"gsd-core/references/execute-phase-between-wave-reset.md": "8c2e5a596401dd33",
"gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e",
"gsd-core/references/execute-phase-wave-guard.md": "41d8123374d3838b",
"gsd-core/references/executor-examples.md": "ba59243ed45c8ab1",
"gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4",
"gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8",
"gsd-core/references/gate-prompts.md": "099c8d52e3562336",
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "bd249d9024c39c0d",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
"gsd-core/references/model-profile-resolution.md": "f32bb05102839767",
"gsd-core/references/model-profiles.md": "8e209cb8ec89b0fb",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
"gsd-core/references/planner-guidance.md": "140b1266eeb096cb",
"gsd-core/references/planner-human-verify-mode.md": "ee0edddeed8eb946",
"gsd-core/references/planner-interface-context.md": "b28fa3da6ae739a8",
"gsd-core/references/planner-load-graph-context.md": "3f6f5ee62d86f72d",
"gsd-core/references/planner-mvp-mode.md": "ec33050db81101a8",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "32430b855023bfdb",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
"gsd-core/references/prohibition-probe.md": "52872d5393ea9daf",
"gsd-core/references/project-skills-discovery.md": "955696ea2864c826",
"gsd-core/references/questioning.md": "a8c988cab05f4651",
"gsd-core/references/research-documentation-lookup.md": "c070007d1d72ab71",
"gsd-core/references/research-philosophy.md": "62930e66cc979c1a",
"gsd-core/references/research-verification-protocol.md": "9c38c9d9a687e679",
"gsd-core/references/revision-loop.md": "e55ff32dd98c63df",
"gsd-core/references/scout-codebase.md": "ba266ecc18fbf172",
"gsd-core/references/security-asvs-levels.md": "4774fac3b94b6ca8",
"gsd-core/references/skeleton-template.md": "528691d1f0efa878",
"gsd-core/references/sketch-interactivity.md": "7d982fe877e1e1cc",
"gsd-core/references/sketch-theme-system.md": "33e2e96e450456f8",
"gsd-core/references/sketch-tooling.md": "df6c4f24c1c27611",
"gsd-core/references/sketch-variant-patterns.md": "66c197aa4fb52810",
"gsd-core/references/spidr-splitting.md": "074ac154c0e4f906",
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
"gsd-core/references/ui-brand.md": "48717bcfcd63bd27",
"gsd-core/references/universal-anti-patterns.md": "6a1245050b21df01",
"gsd-core/references/untrusted-input-boundary.md": "d33b80d4d348599a",
"gsd-core/references/user-profiling.md": "b50416fe57c1b321",
"gsd-core/references/user-story-template.md": "0cc50e06a144ff8a",
"gsd-core/references/verification-overrides.md": "a3e2d5166d16a37b",
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
"gsd-core/references/workstream-flag.md": "59804937da1ddaa9",
"gsd-core/references/worktree-branch-check.md": "3fc21ae9462c35c8",
"gsd-core/references/worktree-path-safety.md": "b4111595eabec186",
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
"gsd-core/templates/DEBUG.md": "57bd61bfd1d98e7e",
"gsd-core/templates/README.md": "f4825d4fa594f2b1",
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
"gsd-core/templates/UI-SPEC.md": "20ca56a4e3e21f01",
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
"gsd-core/templates/claude-md.md": "ec5972ab31c0f5d0",
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
"gsd-core/templates/codebase/conventions.md": "c2e07698dad6b364",
"gsd-core/templates/codebase/integrations.md": "39bd23c71eedd564",
"gsd-core/templates/codebase/stack.md": "116e7e67dd87ddec",
"gsd-core/templates/codebase/structure.md": "fe32daf7235d2a93",
"gsd-core/templates/codebase/testing.md": "76abff7f2050c9ea",
"gsd-core/templates/config.json": "1473dff11272d3c4",
"gsd-core/templates/context.md": "69b01e7909ea3f66",
"gsd-core/templates/continue-here.md": "f522a51b6895fba8",
"gsd-core/templates/copilot-instructions.md": "aea34bc52ff548ea",
"gsd-core/templates/debug-subagent-prompt.md": "8c18a89e25929d8e",
"gsd-core/templates/dev-preferences.md": "95048a71063d980b",
"gsd-core/templates/discovery.md": "e4ab738326eb70e0",
"gsd-core/templates/discussion-log.md": "cac1b48ec0f4dcb8",
"gsd-core/templates/milestone-archive.md": "591b6decdc0c0e51",
"gsd-core/templates/milestone.md": "74d2f750ae9f4a9c",
"gsd-core/templates/phase-prompt.md": "213ccd947451ff2b",
"gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f",
"gsd-core/templates/project.md": "1f687c7a88381080",
"gsd-core/templates/requirements.md": "a44de4c2f146e473",
"gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0",
"gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f",
"gsd-core/templates/research-project/PITFALLS.md": "3ef75fa768422eec",
"gsd-core/templates/research-project/STACK.md": "82c85799ac4dd344",
"gsd-core/templates/research-project/SUMMARY.md": "dceb2f346388839d",
"gsd-core/templates/research.md": "fa6dfb2ff2e8d273",
"gsd-core/templates/retrospective.md": "03981e30dd760103",
"gsd-core/templates/roadmap.md": "e4e35a9eb5dd4d4f",
"gsd-core/templates/spec.md": "7dc900c355098d8b",
"gsd-core/templates/state.md": "73e424b8c70b765c",
"gsd-core/templates/summary-complex.md": "a5e40574fd8894dc",
"gsd-core/templates/summary-minimal.md": "7d09b5e709e2e67c",
"gsd-core/templates/summary-standard.md": "e8d9cf4a8377cdff",
"gsd-core/templates/summary.md": "23c40f6503b3ea98",
"gsd-core/templates/user-profile.md": "20749f23e4c413fc",
"gsd-core/templates/user-setup.md": "78b7d718b6e8d67c",
"gsd-core/templates/verification-report.md": "dd5faa6254183731",
"gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb",
"gsd-core/workflows/add-backlog.md": "4b75a93042406fb8",
"gsd-core/workflows/add-phase.md": "e660b7f2793e6057",
"gsd-core/workflows/add-tests.md": "258d0a918a40f2b4",
"gsd-core/workflows/add-todo.md": "53acd2035bee5cbb",
"gsd-core/workflows/ai-integration-phase.md": "ce4775b1ea73c8ec",
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
"gsd-core/workflows/audit-fix.md": "75f9d02e6924913c",
"gsd-core/workflows/audit-milestone.md": "49d1978340cf89ef",
"gsd-core/workflows/audit-uat.md": "b38b4e18e2abd51b",
"gsd-core/workflows/autonomous.md": "aa104d2eec3f112f",
"gsd-core/workflows/check-todos.md": "7fc4a39f3e83dde7",
"gsd-core/workflows/cleanup.md": "804c5d481279f008",
"gsd-core/workflows/code-review-fix.md": "7d6caed073170b2a",
"gsd-core/workflows/code-review.md": "ca4a87c143bb2d55",
"gsd-core/workflows/complete-milestone.md": "d72e6131a14244da",
"gsd-core/workflows/debug.md": "6000ef61c0a67d84",
"gsd-core/workflows/diagnose-issues.md": "1aa7b1f3c4cbe15d",
"gsd-core/workflows/discovery-phase.md": "6161c60d752d0058",
"gsd-core/workflows/discuss-phase-assumptions.md": "6360526c14233193",
"gsd-core/workflows/discuss-phase-power.md": "290c0d83d783f9f6",
"gsd-core/workflows/discuss-phase.md": "b5731ee756a9a724",
"gsd-core/workflows/discuss-phase/modes/advisor.md": "1bcf72db1553bbf2",
"gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54",
"gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105",
"gsd-core/workflows/discuss-phase/modes/auto.md": "9b87eb70ef459efa",
"gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448",
"gsd-core/workflows/discuss-phase/modes/chain.md": "2a6782b674cf4ca6",
"gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966",
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
"gsd-core/workflows/discuss-phase/modes/text.md": "6914c661b95859ee",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
"gsd-core/workflows/do.md": "1f0dc350abac269a",
"gsd-core/workflows/docs-update.md": "12433c1e3cf9e40e",
"gsd-core/workflows/edit-phase.md": "4ba06a05cb29f3b7",
"gsd-core/workflows/eval-review.md": "0ab8368c8edf91fb",
"gsd-core/workflows/execute-phase.md": "9222c85add7d9ae3",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "9320986ccf0e8a60",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "4116471249699255",
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
"gsd-core/workflows/execute-plan.md": "73f47e5a189cd27d",
"gsd-core/workflows/explore.md": "42f73d9fc38429da",
"gsd-core/workflows/extract-learnings.md": "1d0a3cbf17159316",
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
"gsd-core/workflows/forensics.md": "ac80bcbe9bef175f",
"gsd-core/workflows/graduation.md": "7398492ff69af5e7",
"gsd-core/workflows/health.md": "de79abe3b83a0252",
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495",
"gsd-core/workflows/help/modes/default.md": "cef457f954a9991e",
"gsd-core/workflows/help/modes/full.md": "c4e359b86de6b99d",
"gsd-core/workflows/help/modes/topic.md": "bd2e4cc8e460f5bd",
"gsd-core/workflows/import.md": "5c0e3e97b0a59a06",
"gsd-core/workflows/inbox.md": "91aac6360e1a8672",
"gsd-core/workflows/ingest-docs.md": "9cbe45380eed4a0e",
"gsd-core/workflows/insert-phase.md": "080d2f56cf0021ab",
"gsd-core/workflows/list-phase-assumptions.md": "2a6b6a5acfb7742c",
"gsd-core/workflows/list-seeds.md": "e8d404a07c612d46",
"gsd-core/workflows/list-workspaces.md": "0bda9b42bb5c509b",
"gsd-core/workflows/manager.md": "f2ae9c83a80cc690",
"gsd-core/workflows/map-codebase.md": "8ce1e33f45827202",
"gsd-core/workflows/milestone-summary.md": "886ec00825fb1442",
"gsd-core/workflows/mvp-phase.md": "b3561a8ab1b26a4c",
"gsd-core/workflows/new-milestone.md": "8ec6c5fbc26d8227",
"gsd-core/workflows/new-project.md": "6c1440959e637d2d",
"gsd-core/workflows/new-workspace.md": "9b41c1b5c0196936",
"gsd-core/workflows/next.md": "80f2feb243818c90",
"gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b",
"gsd-core/workflows/note.md": "42b66686b2c102cb",
"gsd-core/workflows/pause-work.md": "54f1c0a9e79e2c59",
"gsd-core/workflows/plan-milestone-gaps.md": "1b820f4e70acce86",
"gsd-core/workflows/plan-phase.md": "fcc0bfeadf4aa5c4",
"gsd-core/workflows/plan-review-convergence.md": "b809588bff4f48b5",
"gsd-core/workflows/plant-seed.md": "e3949fcbcf5d375f",
"gsd-core/workflows/pr-branch.md": "95850381230787ed",
"gsd-core/workflows/profile-user.md": "07e634c1dab106fc",
"gsd-core/workflows/progress.md": "eb2dafb8e419b784",
"gsd-core/workflows/quick.md": "21c35985860be6bc",
"gsd-core/workflows/reapply-patches.md": "4a93b90cbe70a2f1",
"gsd-core/workflows/remove-phase.md": "17c46fdcef27df2d",
"gsd-core/workflows/remove-workspace.md": "1d34788a9b2272d2",
"gsd-core/workflows/resume-project.md": "bba3250afbea8f09",
"gsd-core/workflows/review.md": "3d7c8df929053b79",
"gsd-core/workflows/scan.md": "514d3eba81565193",
"gsd-core/workflows/secure-phase.md": "a7e8edb0e5f48256",
"gsd-core/workflows/session-report.md": "2e5b1205324ddefa",
"gsd-core/workflows/settings-advanced.md": "8691bf2e1502eb19",
"gsd-core/workflows/settings-integrations.md": "8110932b38057f2f",
"gsd-core/workflows/settings.md": "1bd9dc8b2e7402e6",
"gsd-core/workflows/ship.md": "e10d21edabf201a7",
"gsd-core/workflows/sketch-wrap-up.md": "7630ee69ab22462d",
"gsd-core/workflows/sketch.md": "68c337d92c79dc9b",
"gsd-core/workflows/spec-phase.md": "dbe5f223d7bc026c",
"gsd-core/workflows/spike-wrap-up.md": "96b8244988d651fd",
"gsd-core/workflows/spike.md": "52fcd95f7b343232",
"gsd-core/workflows/stats.md": "7ffa072290ebcae3",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "d85a53d03a3167e0",
"gsd-core/workflows/transition.md": "1f0a1478d75d89ec",
"gsd-core/workflows/ui-phase.md": "1c91323daf451053",
"gsd-core/workflows/ui-review.md": "f1f82d8257e910cc",
"gsd-core/workflows/ultraplan-phase.md": "edcaa0b29f942df0",
"gsd-core/workflows/undo.md": "791e0bf96d9a057f",
"gsd-core/workflows/update.md": "baae1a977fbeba49",
"gsd-core/workflows/validate-phase.md": "0e153ccb3bdb9dda",
"gsd-core/workflows/verify-phase.md": "33a17f66c8291096",
"gsd-core/workflows/verify-work.md": "8a4157d179fce9c4",
"hooks/gsd-check-update-worker.js": "74edb6f6b1010c85",
"hooks/gsd-check-update.js": "81962511d619d038",
"hooks/gsd-config-reload.js": "e5b430ced986ea68",
"hooks/gsd-context-monitor.js": "8e55e33027fb54d4",
"hooks/gsd-cursor-post-tool.js": "dd1b12f795de8d72",
"hooks/gsd-cursor-session-start.js": "a93095ac609a3ea6",
"hooks/gsd-ensure-canonical-path.js": "4c1626ed20ab7a75",
"hooks/gsd-graphify-update.sh": "396ebda3c6705dc9",
"hooks/gsd-phase-boundary.sh": "6aa3ba9af3d465d9",
"hooks/gsd-prompt-guard.js": "4b08c2dce0233e2d",
"hooks/gsd-read-guard.js": "9d1b227b6fcb6dba",
"hooks/gsd-read-injection-scanner.js": "e48bc03685078bc7",
"hooks/gsd-session-state.sh": "b1496e6a5204a6df",
"hooks/gsd-statusline.js": "b9d07c3acc630b5d",
"hooks/gsd-update-banner.js": "d3228b9e674296b4",
"hooks/gsd-validate-commit.sh": "14d3d966c74dc310",
"hooks/gsd-workflow-guard.js": "6faa8f81812a8b5d",
"hooks/gsd-worktree-path-guard.js": "d9054ef9ec469312",
"hooks/lib/git-cmd.js": "268ba15992ca0b23",
"hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
"hooks/managed-hooks-registry.cjs": "a57697c1ae4ac163",
"package.json": "dbf8353f77358bc1",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",
"scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
"scripts/changeset/lint.cjs": "0066faed159154f0",
"scripts/changeset/new.cjs": "4991e21fd17f5541",
"scripts/changeset/parse.cjs": "f9a949cbcab56445",
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
"skills/gsd-ns-context/SKILL.md": "654c71262d91650c",
"skills/gsd-ns-context/skills/docs-update/SKILL.md": "3d41e81ec571de60",
"skills/gsd-ns-context/skills/extract-learnings/SKILL.md": "8d38e55e5f8b774b",
"skills/gsd-ns-context/skills/graphify/SKILL.md": "ac3661e6e576188b",
"skills/gsd-ns-context/skills/map-codebase/SKILL.md": "5009595dbde69739",
"skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "e9b66db79fce0a2f",
"skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "9bfa9e76c7a10e26",
"skills/gsd-ns-ideate/SKILL.md": "4a0d2691054b23e5",
"skills/gsd-ns-ideate/skills/capture/SKILL.md": "05fa421c95fbad2d",
"skills/gsd-ns-ideate/skills/explore/SKILL.md": "7ee5c455f37093be",
"skills/gsd-ns-ideate/skills/sketch/SKILL.md": "e531174c131acc85",
"skills/gsd-ns-ideate/skills/spec-phase/SKILL.md": "7e4dfa2070b7d9d1",
"skills/gsd-ns-ideate/skills/spike/SKILL.md": "04d5f50d8d4a1c1a",
"skills/gsd-ns-manage/SKILL.md": "b6a1480f20b33bfa",
"skills/gsd-ns-manage/skills/cleanup/SKILL.md": "ea0ddedf403f309d",
"skills/gsd-ns-manage/skills/config/SKILL.md": "09a21c976161e5ae",
"skills/gsd-ns-manage/skills/health/SKILL.md": "ab21123ba99ec255",
"skills/gsd-ns-manage/skills/help/SKILL.md": "af56ff76cbd5e248",
"skills/gsd-ns-manage/skills/inbox/SKILL.md": "d05a099c0be02c60",
"skills/gsd-ns-manage/skills/manager/SKILL.md": "1370d93741e47828",
"skills/gsd-ns-manage/skills/pause-work/SKILL.md": "c7ea1020a3b4d06d",
"skills/gsd-ns-manage/skills/pr-branch/SKILL.md": "c5e26f2c6dff1355",
"skills/gsd-ns-manage/skills/resume-work/SKILL.md": "55df1b1adb14530c",
"skills/gsd-ns-manage/skills/settings/SKILL.md": "6d9fbddb0b00fd46",
"skills/gsd-ns-manage/skills/ship/SKILL.md": "bd6cb3b46d57123f",
"skills/gsd-ns-manage/skills/stats/SKILL.md": "5403a46852241fa8",
"skills/gsd-ns-manage/skills/surface/SKILL.md": "0b3fe299b6544de7",
"skills/gsd-ns-manage/skills/thread/SKILL.md": "a76c70c368f82dee",
"skills/gsd-ns-manage/skills/undo/SKILL.md": "0ad1218f55c94e4b",
"skills/gsd-ns-manage/skills/update/SKILL.md": "530b4206d729b56d",
"skills/gsd-ns-manage/skills/workspace/SKILL.md": "047c3f4247bc869e",
"skills/gsd-ns-manage/skills/workstreams/SKILL.md": "f4e54cb9b1ca0442",
"skills/gsd-ns-project/SKILL.md": "a58b3170197968be",
"skills/gsd-ns-project/skills/audit-milestone/SKILL.md": "edb6a0cc6305d724",
"skills/gsd-ns-project/skills/complete-milestone/SKILL.md": "f6799a5a713be7bb",
"skills/gsd-ns-project/skills/import/SKILL.md": "88f83921a85e536b",
"skills/gsd-ns-project/skills/ingest-docs/SKILL.md": "eb85e654917a503a",
"skills/gsd-ns-project/skills/milestone-summary/SKILL.md": "33d51a325d314f3a",
"skills/gsd-ns-project/skills/new-milestone/SKILL.md": "ac99ffb8a966fe9d",
"skills/gsd-ns-project/skills/new-project/SKILL.md": "9d5c27ebfa2c4746",
"skills/gsd-ns-project/skills/profile-user/SKILL.md": "78ca46045e85223f",
"skills/gsd-ns-project/skills/review-backlog/SKILL.md": "1708aab6cb919223",
"skills/gsd-ns-review/SKILL.md": "7badceb8627d8154",
"skills/gsd-ns-review/skills/audit-fix/SKILL.md": "d47c757ad361e503",
"skills/gsd-ns-review/skills/audit-uat/SKILL.md": "f3cb11adb6dab54f",
"skills/gsd-ns-review/skills/code-review/SKILL.md": "e862dc22848a6d24",
"skills/gsd-ns-review/skills/debug/SKILL.md": "42de44884d97d86d",
"skills/gsd-ns-review/skills/eval-review/SKILL.md": "b6b6059061388363",
"skills/gsd-ns-review/skills/forensics/SKILL.md": "4ef11f4cf902186f",
"skills/gsd-ns-review/skills/review/SKILL.md": "a17c6ffbcde6071a",
"skills/gsd-ns-review/skills/secure-phase/SKILL.md": "a6adf4729b606d5a",
"skills/gsd-ns-review/skills/ui-phase/SKILL.md": "7c9404102a9b9d74",
"skills/gsd-ns-review/skills/ui-review/SKILL.md": "ef8f643abff1486b",
"skills/gsd-ns-review/skills/validate-phase/SKILL.md": "70375e2381319d2b",
"skills/gsd-ns-workflow/SKILL.md": "46f5e3e89eed3743",
"skills/gsd-ns-workflow/skills/add-tests/SKILL.md": "6661195a66f25ae8",
"skills/gsd-ns-workflow/skills/ai-integration-phase/SKILL.md": "96c8151779ad510e",
"skills/gsd-ns-workflow/skills/autonomous/SKILL.md": "fb57d2c08ea9e8bc",
"skills/gsd-ns-workflow/skills/discuss-phase/SKILL.md": "ff522155265107d2",
"skills/gsd-ns-workflow/skills/execute-phase/SKILL.md": "13518a22e020e1bf",
"skills/gsd-ns-workflow/skills/fast/SKILL.md": "5f3f8b0c3f564d14",
"skills/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "f9a1348c6c297579",
"skills/gsd-ns-workflow/skills/phase/SKILL.md": "1ed640e5f06c7be6",
"skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "75979bb1db5557af",
"skills/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "c3dd8bfa877eaed5",
"skills/gsd-ns-workflow/skills/progress/SKILL.md": "943538c4ac6bde19",
"skills/gsd-ns-workflow/skills/quick/SKILL.md": "bd5e4cb79bc41611",
"skills/gsd-ns-workflow/skills/spec-phase/SKILL.md": "7e4dfa2070b7d9d1",
"skills/gsd-ns-workflow/skills/ultraplan-phase/SKILL.md": "2d78c7b16aabebce",
"skills/gsd-ns-workflow/skills/verify-work/SKILL.md": "4e7825f61f3cf69c"
}

View File

@@ -0,0 +1,382 @@
{
".gsd-profile": "0e716a5fef4e6dc1",
".gsd/defaults.json": "560664b045e645cb",
"agents/gsd-advisor-researcher.md": "7dfdadd98ec1cccc",
"agents/gsd-ai-researcher.md": "0c7be272a6bf0ec6",
"agents/gsd-assumptions-analyzer.md": "dc5e9973ff0740d7",
"agents/gsd-code-fixer.md": "b64e97f0427daa68",
"agents/gsd-code-reviewer.md": "1a7ab7a2b76b6227",
"agents/gsd-codebase-mapper.md": "9bee4506eb5ff300",
"agents/gsd-debug-session-manager.md": "410e3739329bd9ac",
"agents/gsd-debugger.md": "4d6ce9b022df2a89",
"agents/gsd-doc-classifier.md": "5807f1f7cfa40c42",
"agents/gsd-doc-synthesizer.md": "0897098024c17ccd",
"agents/gsd-doc-verifier.md": "e51e50892963ccc7",
"agents/gsd-doc-writer.md": "a7367a8f99991382",
"agents/gsd-domain-researcher.md": "b80f76874c04e515",
"agents/gsd-eval-auditor.md": "220e0002679f7aa2",
"agents/gsd-eval-planner.md": "22334fde85723c9d",
"agents/gsd-executor.md": "63ab2c73cc093f60",
"agents/gsd-framework-selector.md": "7726fccc86bfeb50",
"agents/gsd-integration-checker.md": "7c3dbd934a2a189b",
"agents/gsd-intel-updater.md": "2751bbd33912aa1b",
"agents/gsd-mempalace-curator.md": "63676937f8970bf3",
"agents/gsd-nyquist-auditor.md": "5fb6cc4fef7ef276",
"agents/gsd-pattern-mapper.md": "b5d7a4abb1baecb9",
"agents/gsd-phase-researcher.md": "6d71f5c878fd1107",
"agents/gsd-plan-checker.md": "e2f092bafa6f2646",
"agents/gsd-planner.md": "e5913ce6c4887d8d",
"agents/gsd-project-researcher.md": "729378aedf68e404",
"agents/gsd-research-synthesizer.md": "27e70b07a4502b86",
"agents/gsd-roadmapper.md": "867a8ea6a533dce1",
"agents/gsd-security-auditor.md": "8303af19808131fb",
"agents/gsd-ui-auditor.md": "1513c76befcf221f",
"agents/gsd-ui-checker.md": "843c1deeaa1cb5e7",
"agents/gsd-ui-researcher.md": "e09f0f7034eaa366",
"agents/gsd-user-profiler.md": "622220df0654b6bf",
"agents/gsd-verifier.md": "1e8a6492303366a0",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/gsd-tools.cjs": "46deb2174be356dd",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"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",
"gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4",
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
"gsd-core/contexts/review.md": "dc578fdd74bbea11",
"gsd-core/references/agent-contracts.md": "ff65e633c656c0d2",
"gsd-core/references/ai-evals.md": "b5afa786b938671e",
"gsd-core/references/ai-frameworks.md": "f827de93dde124eb",
"gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e",
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
"gsd-core/references/checkpoints.md": "4b8c645ffa695067",
"gsd-core/references/common-bug-patterns.md": "780145be56352626",
"gsd-core/references/context-budget.md": "b7e9640063775c98",
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
"gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3",
"gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474",
"gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e",
"gsd-core/references/domain-probes.md": "762b965e84035b72",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/requirements.json": "fbc1b355d8625eeb",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json": "66dd60957fee45f0",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json": "47fca61f076835fa",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/requirements.json": "80f04f5c04fb24cf",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json": "d38147adb0e5b342",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json": "bc552c01939bf4f8",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json": "688ec62c13e08afe",
"gsd-core/references/edge-probe.md": "5687eba25a078561",
"gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc",
"gsd-core/references/execute-phase-between-wave-reset.md": "7a1aa0ad7963f809",
"gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e",
"gsd-core/references/execute-phase-wave-guard.md": "973a3a6a5db7e449",
"gsd-core/references/executor-examples.md": "ba59243ed45c8ab1",
"gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4",
"gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8",
"gsd-core/references/gate-prompts.md": "099c8d52e3562336",
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "1bd40c3f94d712b1",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
"gsd-core/references/model-profile-resolution.md": "f32bb05102839767",
"gsd-core/references/model-profiles.md": "88c4308630f27f48",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e562947d1bf5c5a4",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
"gsd-core/references/planner-guidance.md": "140b1266eeb096cb",
"gsd-core/references/planner-human-verify-mode.md": "0bb1176995ac1d81",
"gsd-core/references/planner-interface-context.md": "b28fa3da6ae739a8",
"gsd-core/references/planner-load-graph-context.md": "9a9383599893ea7e",
"gsd-core/references/planner-mvp-mode.md": "ec33050db81101a8",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "970c47f816acdb30",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
"gsd-core/references/prohibition-probe.md": "52872d5393ea9daf",
"gsd-core/references/project-skills-discovery.md": "2aa2a5388d41a97e",
"gsd-core/references/questioning.md": "a8c988cab05f4651",
"gsd-core/references/research-documentation-lookup.md": "c070007d1d72ab71",
"gsd-core/references/research-philosophy.md": "62930e66cc979c1a",
"gsd-core/references/research-verification-protocol.md": "9c38c9d9a687e679",
"gsd-core/references/revision-loop.md": "e55ff32dd98c63df",
"gsd-core/references/scout-codebase.md": "ba266ecc18fbf172",
"gsd-core/references/security-asvs-levels.md": "4774fac3b94b6ca8",
"gsd-core/references/skeleton-template.md": "528691d1f0efa878",
"gsd-core/references/sketch-interactivity.md": "7d982fe877e1e1cc",
"gsd-core/references/sketch-theme-system.md": "33e2e96e450456f8",
"gsd-core/references/sketch-tooling.md": "df6c4f24c1c27611",
"gsd-core/references/sketch-variant-patterns.md": "66c197aa4fb52810",
"gsd-core/references/spidr-splitting.md": "074ac154c0e4f906",
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
"gsd-core/references/ui-brand.md": "48717bcfcd63bd27",
"gsd-core/references/universal-anti-patterns.md": "6a1245050b21df01",
"gsd-core/references/untrusted-input-boundary.md": "d33b80d4d348599a",
"gsd-core/references/user-profiling.md": "b50416fe57c1b321",
"gsd-core/references/user-story-template.md": "0cc50e06a144ff8a",
"gsd-core/references/verification-overrides.md": "a3e2d5166d16a37b",
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
"gsd-core/references/workstream-flag.md": "77d0e004039fb480",
"gsd-core/references/worktree-branch-check.md": "8de8075d76ff71cd",
"gsd-core/references/worktree-path-safety.md": "34689482908229bc",
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
"gsd-core/templates/DEBUG.md": "57bd61bfd1d98e7e",
"gsd-core/templates/README.md": "332f65072c3f03ae",
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
"gsd-core/templates/UI-SPEC.md": "20ca56a4e3e21f01",
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
"gsd-core/templates/claude-md.md": "17217a07ab8a6485",
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
"gsd-core/templates/codebase/conventions.md": "c2e07698dad6b364",
"gsd-core/templates/codebase/integrations.md": "39bd23c71eedd564",
"gsd-core/templates/codebase/stack.md": "116e7e67dd87ddec",
"gsd-core/templates/codebase/structure.md": "c9c5df7a8911bca9",
"gsd-core/templates/codebase/testing.md": "76abff7f2050c9ea",
"gsd-core/templates/config.json": "1473dff11272d3c4",
"gsd-core/templates/context.md": "69b01e7909ea3f66",
"gsd-core/templates/continue-here.md": "f522a51b6895fba8",
"gsd-core/templates/copilot-instructions.md": "aea34bc52ff548ea",
"gsd-core/templates/debug-subagent-prompt.md": "8c18a89e25929d8e",
"gsd-core/templates/dev-preferences.md": "95048a71063d980b",
"gsd-core/templates/discovery.md": "e4ab738326eb70e0",
"gsd-core/templates/discussion-log.md": "cac1b48ec0f4dcb8",
"gsd-core/templates/milestone-archive.md": "591b6decdc0c0e51",
"gsd-core/templates/milestone.md": "74d2f750ae9f4a9c",
"gsd-core/templates/phase-prompt.md": "213ccd947451ff2b",
"gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f",
"gsd-core/templates/project.md": "1f687c7a88381080",
"gsd-core/templates/requirements.md": "a44de4c2f146e473",
"gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0",
"gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f",
"gsd-core/templates/research-project/PITFALLS.md": "3ef75fa768422eec",
"gsd-core/templates/research-project/STACK.md": "82c85799ac4dd344",
"gsd-core/templates/research-project/SUMMARY.md": "dceb2f346388839d",
"gsd-core/templates/research.md": "fa6dfb2ff2e8d273",
"gsd-core/templates/retrospective.md": "03981e30dd760103",
"gsd-core/templates/roadmap.md": "e4e35a9eb5dd4d4f",
"gsd-core/templates/spec.md": "7dc900c355098d8b",
"gsd-core/templates/state.md": "73e424b8c70b765c",
"gsd-core/templates/summary-complex.md": "a5e40574fd8894dc",
"gsd-core/templates/summary-minimal.md": "7d09b5e709e2e67c",
"gsd-core/templates/summary-standard.md": "e8d9cf4a8377cdff",
"gsd-core/templates/summary.md": "23c40f6503b3ea98",
"gsd-core/templates/user-profile.md": "20749f23e4c413fc",
"gsd-core/templates/user-setup.md": "78b7d718b6e8d67c",
"gsd-core/templates/verification-report.md": "dd5faa6254183731",
"gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb",
"gsd-core/workflows/add-backlog.md": "36f58e864aeaf24d",
"gsd-core/workflows/add-phase.md": "4e498058a786615f",
"gsd-core/workflows/add-tests.md": "688a232a0a4b918e",
"gsd-core/workflows/add-todo.md": "792592b2133698a7",
"gsd-core/workflows/ai-integration-phase.md": "0672cc9afb7b7a0b",
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
"gsd-core/workflows/audit-fix.md": "493e4abe4f701662",
"gsd-core/workflows/audit-milestone.md": "26b2428d9a8df7b2",
"gsd-core/workflows/audit-uat.md": "f02cd45df6304b06",
"gsd-core/workflows/autonomous.md": "09f390b492bc8801",
"gsd-core/workflows/check-todos.md": "e4209530a4132312",
"gsd-core/workflows/cleanup.md": "78080ff25ba43f8c",
"gsd-core/workflows/code-review-fix.md": "4eebfb7f1612b441",
"gsd-core/workflows/code-review.md": "7630639b5f2f9ff2",
"gsd-core/workflows/complete-milestone.md": "0bbdd56c4251797d",
"gsd-core/workflows/debug.md": "87c20def8d313e45",
"gsd-core/workflows/diagnose-issues.md": "a0b3fee49d516c0b",
"gsd-core/workflows/discovery-phase.md": "b32b6197b66c9a13",
"gsd-core/workflows/discuss-phase-assumptions.md": "3689bacffdd7cdd4",
"gsd-core/workflows/discuss-phase-power.md": "290c0d83d783f9f6",
"gsd-core/workflows/discuss-phase.md": "9c4af7ae57aaad8f",
"gsd-core/workflows/discuss-phase/modes/advisor.md": "5522bd33cbd9b9b8",
"gsd-core/workflows/discuss-phase/modes/all.md": "e698b84ebb2ff56d",
"gsd-core/workflows/discuss-phase/modes/analyze.md": "c824ef897199b730",
"gsd-core/workflows/discuss-phase/modes/auto.md": "bb489751893f4498",
"gsd-core/workflows/discuss-phase/modes/batch.md": "21ee55869eaa7ece",
"gsd-core/workflows/discuss-phase/modes/chain.md": "c643b0b42b24e0d4",
"gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966",
"gsd-core/workflows/discuss-phase/modes/power.md": "55b61b7dc83a58b2",
"gsd-core/workflows/discuss-phase/modes/text.md": "e1043e27b50a5e18",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
"gsd-core/workflows/do.md": "461d545bbde0dc8f",
"gsd-core/workflows/docs-update.md": "dd1050b32c2dc170",
"gsd-core/workflows/edit-phase.md": "38f9c9945073ac8c",
"gsd-core/workflows/eval-review.md": "48fdef1cf0e67525",
"gsd-core/workflows/execute-phase.md": "65f0e997673291b6",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "44d46d3e98942efc",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "a2fc97089560ec0a",
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
"gsd-core/workflows/execute-plan.md": "6d437a23e6d9ffcc",
"gsd-core/workflows/explore.md": "9f24bf678b1ef341",
"gsd-core/workflows/extract-learnings.md": "0e0eead67cec3d28",
"gsd-core/workflows/fast.md": "0162075e44072447",
"gsd-core/workflows/forensics.md": "4b38a662876628a2",
"gsd-core/workflows/graduation.md": "63b74175d5e9cc1e",
"gsd-core/workflows/health.md": "9ddf28b84e1ce089",
"gsd-core/workflows/help.md": "08e1349950c5602a",
"gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495",
"gsd-core/workflows/help/modes/default.md": "1b3c315342701265",
"gsd-core/workflows/help/modes/full.md": "ffb3e525818ed5bc",
"gsd-core/workflows/help/modes/topic.md": "5419498effee148f",
"gsd-core/workflows/import.md": "47cc99b635e45f82",
"gsd-core/workflows/inbox.md": "e9ea37b2d46dc5b4",
"gsd-core/workflows/ingest-docs.md": "9554d457d64b7c17",
"gsd-core/workflows/insert-phase.md": "ff204ee159b41506",
"gsd-core/workflows/list-phase-assumptions.md": "eb986c301d59f620",
"gsd-core/workflows/list-seeds.md": "fa287a9ed912eb17",
"gsd-core/workflows/list-workspaces.md": "4668ebdc3380a7a6",
"gsd-core/workflows/manager.md": "79a6e4de6654f4e7",
"gsd-core/workflows/map-codebase.md": "f90d0577d254c38e",
"gsd-core/workflows/milestone-summary.md": "b50a5d4369d29978",
"gsd-core/workflows/mvp-phase.md": "1d2292f3c444c13d",
"gsd-core/workflows/new-milestone.md": "28d4d2b571cae752",
"gsd-core/workflows/new-project.md": "d1a0070ed292c25a",
"gsd-core/workflows/new-workspace.md": "555689ccf58bafdb",
"gsd-core/workflows/next.md": "569c68513fd94ea7",
"gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b",
"gsd-core/workflows/note.md": "acc9130fb1e94f0b",
"gsd-core/workflows/pause-work.md": "09a6b8980f7b771a",
"gsd-core/workflows/plan-milestone-gaps.md": "022822b3b6971b75",
"gsd-core/workflows/plan-phase.md": "c3e494c63f5c04c5",
"gsd-core/workflows/plan-review-convergence.md": "8fb889570c17db15",
"gsd-core/workflows/plant-seed.md": "dc911406ada4d188",
"gsd-core/workflows/pr-branch.md": "e939128047e02395",
"gsd-core/workflows/profile-user.md": "0831c4b96b1265c9",
"gsd-core/workflows/progress.md": "3e2b44a7a175654c",
"gsd-core/workflows/quick.md": "42b6f01afa2fc359",
"gsd-core/workflows/reapply-patches.md": "ea66e63f56e7deb3",
"gsd-core/workflows/remove-phase.md": "5a2521695edd486b",
"gsd-core/workflows/remove-workspace.md": "ed8e5e30c33f1bfd",
"gsd-core/workflows/resume-project.md": "ee9dcc4e3dd3e32c",
"gsd-core/workflows/review.md": "402fcc0b4b6a2794",
"gsd-core/workflows/scan.md": "afc48f3339293b30",
"gsd-core/workflows/secure-phase.md": "882886f04d3b7e82",
"gsd-core/workflows/session-report.md": "2e5b1205324ddefa",
"gsd-core/workflows/settings-advanced.md": "724b30d7abcd168c",
"gsd-core/workflows/settings-integrations.md": "9aa7005e6dd84bcc",
"gsd-core/workflows/settings.md": "4332d1ee0efe797b",
"gsd-core/workflows/ship.md": "0647d19b5487b1a3",
"gsd-core/workflows/sketch-wrap-up.md": "4894dac77fc42655",
"gsd-core/workflows/sketch.md": "52f4a04f511e205e",
"gsd-core/workflows/spec-phase.md": "56cecc44b2cc0bc4",
"gsd-core/workflows/spike-wrap-up.md": "1f57905138a648ac",
"gsd-core/workflows/spike.md": "48df8b626cbd378d",
"gsd-core/workflows/stats.md": "18089135bc41f1b4",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "9fe3ec12e491bec3",
"gsd-core/workflows/transition.md": "b49ddd9247f804e7",
"gsd-core/workflows/ui-phase.md": "a725ebdd4f47fb97",
"gsd-core/workflows/ui-review.md": "b3221cac976daffa",
"gsd-core/workflows/ultraplan-phase.md": "06ac6fbb061b2464",
"gsd-core/workflows/undo.md": "59b8baa54efc4110",
"gsd-core/workflows/update.md": "e259898f86ae7133",
"gsd-core/workflows/validate-phase.md": "70d102b4d5113dd4",
"gsd-core/workflows/verify-phase.md": "ba797ce64e593a10",
"gsd-core/workflows/verify-work.md": "1e2a10168f8fdc2b",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",
"scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
"scripts/changeset/lint.cjs": "0066faed159154f0",
"scripts/changeset/new.cjs": "4991e21fd17f5541",
"scripts/changeset/parse.cjs": "f9a949cbcab56445",
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7",
"skills/gsd-ns-context/SKILL.md": "e278a50f3ecb8f56",
"skills/gsd-ns-context/skills/docs-update/SKILL.md": "52755343585b987b",
"skills/gsd-ns-context/skills/extract-learnings/SKILL.md": "d39269bea995fabc",
"skills/gsd-ns-context/skills/graphify/SKILL.md": "e0253aef14693a7e",
"skills/gsd-ns-context/skills/map-codebase/SKILL.md": "0910348701b1fc65",
"skills/gsd-ns-context/skills/mempalace-capture/SKILL.md": "92740c97e0ce6942",
"skills/gsd-ns-context/skills/mempalace-recall/SKILL.md": "d41523e659d1920f",
"skills/gsd-ns-ideate/SKILL.md": "c10342345c01c91f",
"skills/gsd-ns-ideate/skills/capture/SKILL.md": "90aee26970fa7639",
"skills/gsd-ns-ideate/skills/explore/SKILL.md": "d8e26a5ed95a4ecc",
"skills/gsd-ns-ideate/skills/sketch/SKILL.md": "ede2d3ab60a3c613",
"skills/gsd-ns-ideate/skills/spec-phase/SKILL.md": "f773e17e1ae7fb35",
"skills/gsd-ns-ideate/skills/spike/SKILL.md": "da215c1fb96a70e5",
"skills/gsd-ns-manage/SKILL.md": "0f4fb6d2f96ed7e9",
"skills/gsd-ns-manage/skills/cleanup/SKILL.md": "a578d6536b9cabc3",
"skills/gsd-ns-manage/skills/config/SKILL.md": "becac686746b68a4",
"skills/gsd-ns-manage/skills/health/SKILL.md": "74a68e1c1b310bef",
"skills/gsd-ns-manage/skills/help/SKILL.md": "0f0ae57a446b4601",
"skills/gsd-ns-manage/skills/inbox/SKILL.md": "34370c6138415209",
"skills/gsd-ns-manage/skills/manager/SKILL.md": "fba2aa10f8b29d84",
"skills/gsd-ns-manage/skills/pause-work/SKILL.md": "42924a70d6a4b96f",
"skills/gsd-ns-manage/skills/pr-branch/SKILL.md": "c25b5a3e31ab6f74",
"skills/gsd-ns-manage/skills/resume-work/SKILL.md": "5f0d4d0e86b99180",
"skills/gsd-ns-manage/skills/settings/SKILL.md": "67eff2d16e17403c",
"skills/gsd-ns-manage/skills/ship/SKILL.md": "4ad9695934e069ee",
"skills/gsd-ns-manage/skills/stats/SKILL.md": "25898070fb2a4b20",
"skills/gsd-ns-manage/skills/surface/SKILL.md": "c30399ea5d11cc5d",
"skills/gsd-ns-manage/skills/thread/SKILL.md": "67b5a0451b58c50c",
"skills/gsd-ns-manage/skills/undo/SKILL.md": "2a37b9c270d4c785",
"skills/gsd-ns-manage/skills/update/SKILL.md": "2fc47bf059aa7b38",
"skills/gsd-ns-manage/skills/workspace/SKILL.md": "257d17b9d20274d8",
"skills/gsd-ns-manage/skills/workstreams/SKILL.md": "737841783c7fdd4f",
"skills/gsd-ns-project/SKILL.md": "5668e3a5e1d8896d",
"skills/gsd-ns-project/skills/audit-milestone/SKILL.md": "0ccabc5556d65d56",
"skills/gsd-ns-project/skills/complete-milestone/SKILL.md": "a69d534b385d6aaf",
"skills/gsd-ns-project/skills/import/SKILL.md": "a11e630bfd8ae4de",
"skills/gsd-ns-project/skills/ingest-docs/SKILL.md": "d26637cdafd1a629",
"skills/gsd-ns-project/skills/milestone-summary/SKILL.md": "9d408f56712ba948",
"skills/gsd-ns-project/skills/new-milestone/SKILL.md": "7cbc011130e8590c",
"skills/gsd-ns-project/skills/new-project/SKILL.md": "ff0d57491df30624",
"skills/gsd-ns-project/skills/profile-user/SKILL.md": "4f526120cda2f6cc",
"skills/gsd-ns-project/skills/review-backlog/SKILL.md": "d8a150558cc9326a",
"skills/gsd-ns-review/SKILL.md": "c5afe33c212947dd",
"skills/gsd-ns-review/skills/audit-fix/SKILL.md": "2c1f601f2fb52585",
"skills/gsd-ns-review/skills/audit-uat/SKILL.md": "2c450432b6fd1c3e",
"skills/gsd-ns-review/skills/code-review/SKILL.md": "71f717d78fd4954d",
"skills/gsd-ns-review/skills/debug/SKILL.md": "9d814fba870c538e",
"skills/gsd-ns-review/skills/eval-review/SKILL.md": "d42b504c0ca2dc69",
"skills/gsd-ns-review/skills/forensics/SKILL.md": "250f476c4c547a0f",
"skills/gsd-ns-review/skills/review/SKILL.md": "ace2ad1db5c625c6",
"skills/gsd-ns-review/skills/secure-phase/SKILL.md": "b35ac9da51635368",
"skills/gsd-ns-review/skills/ui-phase/SKILL.md": "89a29a2fa62b177e",
"skills/gsd-ns-review/skills/ui-review/SKILL.md": "3e23efe03dafd691",
"skills/gsd-ns-review/skills/validate-phase/SKILL.md": "fa1ab5c9a869f6cd",
"skills/gsd-ns-workflow/SKILL.md": "7dbd699b5130c0d5",
"skills/gsd-ns-workflow/skills/add-tests/SKILL.md": "6d64ae85b590274f",
"skills/gsd-ns-workflow/skills/ai-integration-phase/SKILL.md": "c458b792bdf5b1f2",
"skills/gsd-ns-workflow/skills/autonomous/SKILL.md": "37dc7b78ceb74803",
"skills/gsd-ns-workflow/skills/discuss-phase/SKILL.md": "c41cf9bf50dc6be6",
"skills/gsd-ns-workflow/skills/execute-phase/SKILL.md": "eb0158de64f22a55",
"skills/gsd-ns-workflow/skills/fast/SKILL.md": "3eae6536d09c2532",
"skills/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "81c98f4436888cb8",
"skills/gsd-ns-workflow/skills/phase/SKILL.md": "50f6cc4df79a26b7",
"skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "44d42fa41a094ad9",
"skills/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "fee26bc1daedbff5",
"skills/gsd-ns-workflow/skills/progress/SKILL.md": "de48301875978833",
"skills/gsd-ns-workflow/skills/quick/SKILL.md": "d81670625c884d2c",
"skills/gsd-ns-workflow/skills/spec-phase/SKILL.md": "f773e17e1ae7fb35",
"skills/gsd-ns-workflow/skills/ultraplan-phase/SKILL.md": "1cc863a090cdcc6b",
"skills/gsd-ns-workflow/skills/verify-work/SKILL.md": "aae57a48a1b966ac"
}

View File

@@ -0,0 +1,312 @@
{
".gsd-profile": "0e716a5fef4e6dc1",
".gsd/defaults.json": "560664b045e645cb",
"agents/gsd-advisor-researcher.md": "7dfdadd98ec1cccc",
"agents/gsd-ai-researcher.md": "0c7be272a6bf0ec6",
"agents/gsd-assumptions-analyzer.md": "dc5e9973ff0740d7",
"agents/gsd-code-fixer.md": "8a0a2d602e2e553b",
"agents/gsd-code-reviewer.md": "b9eae8c588ca34fc",
"agents/gsd-codebase-mapper.md": "5212f81b9bdddf4e",
"agents/gsd-debug-session-manager.md": "40edd70065aa07bb",
"agents/gsd-debugger.md": "643fa461a0249194",
"agents/gsd-doc-classifier.md": "5807f1f7cfa40c42",
"agents/gsd-doc-synthesizer.md": "0897098024c17ccd",
"agents/gsd-doc-verifier.md": "ede2f297b73b5a86",
"agents/gsd-doc-writer.md": "6b5d454ed7ca8fcb",
"agents/gsd-domain-researcher.md": "56395dbdabf076f6",
"agents/gsd-eval-auditor.md": "7ae0c5e3ab6871f6",
"agents/gsd-eval-planner.md": "2049dac060d00eda",
"agents/gsd-executor.md": "b78eb2bdf8d83ab3",
"agents/gsd-framework-selector.md": "4b77eebbe9288d80",
"agents/gsd-integration-checker.md": "2ee5c85edce7842a",
"agents/gsd-intel-updater.md": "16ee6795da80a7c0",
"agents/gsd-mempalace-curator.md": "63676937f8970bf3",
"agents/gsd-nyquist-auditor.md": "8c02fb3e41caed29",
"agents/gsd-pattern-mapper.md": "ada0c169daa2f0ec",
"agents/gsd-phase-researcher.md": "43d0390c4468a8eb",
"agents/gsd-plan-checker.md": "9dc374ed91d8cdcf",
"agents/gsd-planner.md": "13e2861f9c325194",
"agents/gsd-project-researcher.md": "5c708d9ccacf40b6",
"agents/gsd-research-synthesizer.md": "7afe0b71bf76a91f",
"agents/gsd-roadmapper.md": "befd552019727d2d",
"agents/gsd-security-auditor.md": "092271a639d991a6",
"agents/gsd-ui-auditor.md": "e9b377d2a0f5185d",
"agents/gsd-ui-checker.md": "bd8e9be4c75dcdcf",
"agents/gsd-ui-researcher.md": "f04d24e6459bd23d",
"agents/gsd-user-profiler.md": "622220df0654b6bf",
"agents/gsd-verifier.md": "88eac9841f52dd8c",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
"gsd-core/bin/gsd-tools.cjs": "46deb2174be356dd",
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
"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",
"gsd-core/bin/shared/runtime-aliases.manifest.json": "f6c8b3af10dcfdc4",
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
"gsd-core/contexts/review.md": "dc578fdd74bbea11",
"gsd-core/references/agent-contracts.md": "ff65e633c656c0d2",
"gsd-core/references/ai-evals.md": "b5afa786b938671e",
"gsd-core/references/ai-frameworks.md": "f827de93dde124eb",
"gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e",
"gsd-core/references/autonomous-smart-discuss.md": "273b371c5751f35a",
"gsd-core/references/checkpoints.md": "808e4fcaa2fda15c",
"gsd-core/references/common-bug-patterns.md": "780145be56352626",
"gsd-core/references/context-budget.md": "ff843cd6139c8564",
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
"gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3",
"gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474",
"gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e",
"gsd-core/references/domain-probes.md": "762b965e84035b72",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/01-round-half-even/requirements.json": "fbc1b355d8625eeb",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json": "66dd60957fee45f0",
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json": "47fca61f076835fa",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json": "72d1e29cedc854ec",
"gsd-core/references/edge-probe-fixtures/04-money-rounding/requirements.json": "80f04f5c04fb24cf",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json": "fad67dcc8294f6da",
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json": "d38147adb0e5b342",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json": "bc552c01939bf4f8",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json": "30a78ee9ce3473ea",
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json": "688ec62c13e08afe",
"gsd-core/references/edge-probe.md": "692b44ca096f96e6",
"gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc",
"gsd-core/references/execute-phase-between-wave-reset.md": "1587345770b19c7f",
"gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e",
"gsd-core/references/execute-phase-wave-guard.md": "96485eccd4606e54",
"gsd-core/references/executor-examples.md": "ba59243ed45c8ab1",
"gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4",
"gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8",
"gsd-core/references/gate-prompts.md": "099c8d52e3562336",
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "6ec36ea6b868655f",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
"gsd-core/references/model-profile-resolution.md": "f32bb05102839767",
"gsd-core/references/model-profiles.md": "7f812fafd1fe4b52",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e562947d1bf5c5a4",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
"gsd-core/references/planner-guidance.md": "140b1266eeb096cb",
"gsd-core/references/planner-human-verify-mode.md": "86c8c7052806711f",
"gsd-core/references/planner-interface-context.md": "b28fa3da6ae739a8",
"gsd-core/references/planner-load-graph-context.md": "18d50b6d12db830e",
"gsd-core/references/planner-mvp-mode.md": "ec33050db81101a8",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
"gsd-core/references/planning-config.md": "742e11db47c5c0aa",
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
"gsd-core/references/prohibition-probe.md": "8f3eb787e3845e2f",
"gsd-core/references/project-skills-discovery.md": "8a03bb1f0960e235",
"gsd-core/references/questioning.md": "faac32813d1735bd",
"gsd-core/references/research-documentation-lookup.md": "c070007d1d72ab71",
"gsd-core/references/research-philosophy.md": "62930e66cc979c1a",
"gsd-core/references/research-verification-protocol.md": "9c38c9d9a687e679",
"gsd-core/references/revision-loop.md": "e55ff32dd98c63df",
"gsd-core/references/scout-codebase.md": "ba266ecc18fbf172",
"gsd-core/references/security-asvs-levels.md": "4774fac3b94b6ca8",
"gsd-core/references/skeleton-template.md": "528691d1f0efa878",
"gsd-core/references/sketch-interactivity.md": "7d982fe877e1e1cc",
"gsd-core/references/sketch-theme-system.md": "33e2e96e450456f8",
"gsd-core/references/sketch-tooling.md": "df6c4f24c1c27611",
"gsd-core/references/sketch-variant-patterns.md": "66c197aa4fb52810",
"gsd-core/references/spidr-splitting.md": "074ac154c0e4f906",
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
"gsd-core/references/ui-brand.md": "48717bcfcd63bd27",
"gsd-core/references/universal-anti-patterns.md": "6a1245050b21df01",
"gsd-core/references/untrusted-input-boundary.md": "d33b80d4d348599a",
"gsd-core/references/user-profiling.md": "b50416fe57c1b321",
"gsd-core/references/user-story-template.md": "0cc50e06a144ff8a",
"gsd-core/references/verification-overrides.md": "a3e2d5166d16a37b",
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
"gsd-core/references/workstream-flag.md": "481ec11fe3e22236",
"gsd-core/references/worktree-branch-check.md": "f6018dddf15bc1cb",
"gsd-core/references/worktree-path-safety.md": "0e8a26b9b3424974",
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
"gsd-core/templates/DEBUG.md": "57bd61bfd1d98e7e",
"gsd-core/templates/README.md": "ee35799bf08677f3",
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
"gsd-core/templates/UI-SPEC.md": "20ca56a4e3e21f01",
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
"gsd-core/templates/claude-md.md": "20be2a0201ab92cd",
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
"gsd-core/templates/codebase/conventions.md": "c2e07698dad6b364",
"gsd-core/templates/codebase/integrations.md": "39bd23c71eedd564",
"gsd-core/templates/codebase/stack.md": "116e7e67dd87ddec",
"gsd-core/templates/codebase/structure.md": "f7e0345b72e84e6e",
"gsd-core/templates/codebase/testing.md": "76abff7f2050c9ea",
"gsd-core/templates/config.json": "1473dff11272d3c4",
"gsd-core/templates/context.md": "69b01e7909ea3f66",
"gsd-core/templates/continue-here.md": "f522a51b6895fba8",
"gsd-core/templates/copilot-instructions.md": "aea34bc52ff548ea",
"gsd-core/templates/debug-subagent-prompt.md": "8c18a89e25929d8e",
"gsd-core/templates/dev-preferences.md": "95048a71063d980b",
"gsd-core/templates/discovery.md": "e4ab738326eb70e0",
"gsd-core/templates/discussion-log.md": "cac1b48ec0f4dcb8",
"gsd-core/templates/milestone-archive.md": "591b6decdc0c0e51",
"gsd-core/templates/milestone.md": "74d2f750ae9f4a9c",
"gsd-core/templates/phase-prompt.md": "213ccd947451ff2b",
"gsd-core/templates/planner-subagent-prompt.md": "6c9f1b23ee3dc05f",
"gsd-core/templates/project.md": "1f687c7a88381080",
"gsd-core/templates/requirements.md": "a44de4c2f146e473",
"gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0",
"gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f",
"gsd-core/templates/research-project/PITFALLS.md": "3ef75fa768422eec",
"gsd-core/templates/research-project/STACK.md": "82c85799ac4dd344",
"gsd-core/templates/research-project/SUMMARY.md": "dceb2f346388839d",
"gsd-core/templates/research.md": "fa6dfb2ff2e8d273",
"gsd-core/templates/retrospective.md": "03981e30dd760103",
"gsd-core/templates/roadmap.md": "e4e35a9eb5dd4d4f",
"gsd-core/templates/spec.md": "7dc900c355098d8b",
"gsd-core/templates/state.md": "73e424b8c70b765c",
"gsd-core/templates/summary-complex.md": "a5e40574fd8894dc",
"gsd-core/templates/summary-minimal.md": "7d09b5e709e2e67c",
"gsd-core/templates/summary-standard.md": "e8d9cf4a8377cdff",
"gsd-core/templates/summary.md": "23c40f6503b3ea98",
"gsd-core/templates/user-profile.md": "20749f23e4c413fc",
"gsd-core/templates/user-setup.md": "78b7d718b6e8d67c",
"gsd-core/templates/verification-report.md": "dd5faa6254183731",
"gsd-core/workflows/_runtime-launcher.snippet.sh": "c0994e00f976dbfb",
"gsd-core/workflows/add-backlog.md": "b84c744efaed7a2e",
"gsd-core/workflows/add-phase.md": "199ac1b4879fb51a",
"gsd-core/workflows/add-tests.md": "5aafbe6d624d41c9",
"gsd-core/workflows/add-todo.md": "7151303ccc3e6d05",
"gsd-core/workflows/ai-integration-phase.md": "9b287efec21a3c0b",
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
"gsd-core/workflows/audit-fix.md": "e1ad3e58979d9eef",
"gsd-core/workflows/audit-milestone.md": "e578d1ce71b172e6",
"gsd-core/workflows/audit-uat.md": "0f779101b40c7229",
"gsd-core/workflows/autonomous.md": "fbd5185763707f74",
"gsd-core/workflows/check-todos.md": "ad2ff17a672e7101",
"gsd-core/workflows/cleanup.md": "edc0bc375acdb563",
"gsd-core/workflows/code-review-fix.md": "aa750f6d1abd3b9f",
"gsd-core/workflows/code-review.md": "20c76ddd702e7cd5",
"gsd-core/workflows/complete-milestone.md": "6706e0dc3e95acd0",
"gsd-core/workflows/debug.md": "9679214d9472e213",
"gsd-core/workflows/diagnose-issues.md": "7c0b8debfc906ca0",
"gsd-core/workflows/discovery-phase.md": "7dcf150998559c11",
"gsd-core/workflows/discuss-phase-assumptions.md": "3f3b0ac79cdb5631",
"gsd-core/workflows/discuss-phase-power.md": "290c0d83d783f9f6",
"gsd-core/workflows/discuss-phase.md": "25d8a61ecf8c21a0",
"gsd-core/workflows/discuss-phase/modes/advisor.md": "1be08d135fd60027",
"gsd-core/workflows/discuss-phase/modes/all.md": "d2a1d16e2508a0cd",
"gsd-core/workflows/discuss-phase/modes/analyze.md": "c824ef897199b730",
"gsd-core/workflows/discuss-phase/modes/auto.md": "a66e476942667f9f",
"gsd-core/workflows/discuss-phase/modes/batch.md": "c23d5bdbdb60362c",
"gsd-core/workflows/discuss-phase/modes/chain.md": "58125711f7c432ce",
"gsd-core/workflows/discuss-phase/modes/default.md": "4ada4fe332c5c985",
"gsd-core/workflows/discuss-phase/modes/power.md": "55b61b7dc83a58b2",
"gsd-core/workflows/discuss-phase/modes/text.md": "aeb56fe7b95dd786",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "cd5d01c9ef84ab73",
"gsd-core/workflows/do.md": "fc00009666985144",
"gsd-core/workflows/docs-update.md": "a3c2ec2c856aaabc",
"gsd-core/workflows/edit-phase.md": "1666ca537fbef030",
"gsd-core/workflows/eval-review.md": "bb01b3300db963bc",
"gsd-core/workflows/execute-phase.md": "72d0692329295c0d",
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "579a3dcf8d69de31",
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "bbd704d6b6f0787b",
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
"gsd-core/workflows/execute-plan.md": "f6bc701c05bb7d70",
"gsd-core/workflows/explore.md": "7a9bb001b196409f",
"gsd-core/workflows/extract-learnings.md": "58ce8fbc17388788",
"gsd-core/workflows/fast.md": "0162075e44072447",
"gsd-core/workflows/forensics.md": "3ec427afe7ab8bb8",
"gsd-core/workflows/graduation.md": "5734685667d8f512",
"gsd-core/workflows/health.md": "644b42c215b1b00e",
"gsd-core/workflows/help.md": "08e1349950c5602a",
"gsd-core/workflows/help/modes/brief.md": "2e923b3ed635d495",
"gsd-core/workflows/help/modes/default.md": "91509fe03bad9795",
"gsd-core/workflows/help/modes/full.md": "fec340660fa7b2ff",
"gsd-core/workflows/help/modes/topic.md": "9f00f5f94c5497aa",
"gsd-core/workflows/import.md": "f5b3826c4cfb2682",
"gsd-core/workflows/inbox.md": "797c287852eb8957",
"gsd-core/workflows/ingest-docs.md": "6f0ddb1130216a7d",
"gsd-core/workflows/insert-phase.md": "238e327203e04ed1",
"gsd-core/workflows/list-phase-assumptions.md": "eb986c301d59f620",
"gsd-core/workflows/list-seeds.md": "a87319b154d0fb8c",
"gsd-core/workflows/list-workspaces.md": "ff4ad30adc55d5b8",
"gsd-core/workflows/manager.md": "072a9f2ba6084641",
"gsd-core/workflows/map-codebase.md": "6c89a16e0d9fddfe",
"gsd-core/workflows/milestone-summary.md": "1ced13b54a1fab0b",
"gsd-core/workflows/mvp-phase.md": "bcc8037866fa1d4d",
"gsd-core/workflows/new-milestone.md": "763c096ead93de90",
"gsd-core/workflows/new-project.md": "d6709238a3ada30c",
"gsd-core/workflows/new-workspace.md": "8a9ab30eac218190",
"gsd-core/workflows/next.md": "3ebbf30622521e76",
"gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b",
"gsd-core/workflows/note.md": "1c1e466c764e3deb",
"gsd-core/workflows/pause-work.md": "5ce6a137bd9fc0f8",
"gsd-core/workflows/plan-milestone-gaps.md": "19911e87fd4185f2",
"gsd-core/workflows/plan-phase.md": "98210e414d5d9e0b",
"gsd-core/workflows/plan-review-convergence.md": "7e01c19b7b9a2aad",
"gsd-core/workflows/plant-seed.md": "9d36ecd08093a494",
"gsd-core/workflows/pr-branch.md": "cc28ab5cd9db16b9",
"gsd-core/workflows/profile-user.md": "fa3b87e1f2d71371",
"gsd-core/workflows/progress.md": "36f1d4621c1798a4",
"gsd-core/workflows/quick.md": "c05946f016806c5f",
"gsd-core/workflows/reapply-patches.md": "04885b2129cbb457",
"gsd-core/workflows/remove-phase.md": "24559d23e008c9c3",
"gsd-core/workflows/remove-workspace.md": "e958c1e932aef492",
"gsd-core/workflows/resume-project.md": "c5731b8aabed70f9",
"gsd-core/workflows/review.md": "77124fdbb3e3bc7e",
"gsd-core/workflows/scan.md": "8aa95448b1ba4a4a",
"gsd-core/workflows/secure-phase.md": "550152cd82c25c00",
"gsd-core/workflows/session-report.md": "2e5b1205324ddefa",
"gsd-core/workflows/settings-advanced.md": "8381d23e29081352",
"gsd-core/workflows/settings-integrations.md": "ff9af62cdc5c7908",
"gsd-core/workflows/settings.md": "38a801a7b89a9379",
"gsd-core/workflows/ship.md": "ddfd8e847836dd94",
"gsd-core/workflows/sketch-wrap-up.md": "67e90c60062d0d5f",
"gsd-core/workflows/sketch.md": "7418628ba45dd6c0",
"gsd-core/workflows/spec-phase.md": "e8ed811cd67076b7",
"gsd-core/workflows/spike-wrap-up.md": "f8e39782c6e42ef7",
"gsd-core/workflows/spike.md": "aa5934044317ba7a",
"gsd-core/workflows/stats.md": "c49d3de15375d04b",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "5ad6ddb308909770",
"gsd-core/workflows/transition.md": "9a49f9c48805f666",
"gsd-core/workflows/ui-phase.md": "54e01f1973450a3c",
"gsd-core/workflows/ui-review.md": "fea93c281767f8d7",
"gsd-core/workflows/ultraplan-phase.md": "a164cc6aa4fb5bbb",
"gsd-core/workflows/undo.md": "18dec684fb1076f9",
"gsd-core/workflows/update.md": "cbf978622ad0f577",
"gsd-core/workflows/validate-phase.md": "a36cf2c688c261ac",
"gsd-core/workflows/verify-phase.md": "6adfc47bee438b5d",
"gsd-core/workflows/verify-work.md": "7586bdeeeb9ecba6",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",
"scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
"scripts/changeset/lint.cjs": "0066faed159154f0",
"scripts/changeset/new.cjs": "4991e21fd17f5541",
"scripts/changeset/parse.cjs": "f9a949cbcab56445",
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
"scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660",
"scripts/lib/cli-exit.cjs": "612d0c372c75b7e7"
}

View File

@@ -0,0 +1,93 @@
'use strict';
/**
* Drift-guard: getDirName must be derived from the capability registry.
* Verifies:
* 1. For every known runtime id, getDirName(id) equals the hardcoded golden
* expected map — a pinned oracle that catches BOTH formula bugs AND
* unintended registry drift (adding/removing a runtime or changing its
* localConfigDir forces a deliberate golden-map update here).
* 2. getDirName('unknown') and getDirName('') fall back to '.claude'.
* 3. Every registry runtime entry has a non-empty dot-dir localConfigDir string —
* cross-check from a different angle than the production derivation formula.
*
* ADR-1239 Phase B (#1679).
* Behavioral tests only: assert on returned values, no source-grep.
*/
const { test } = require('node:test');
const assert = require('node:assert/strict');
const runtimeNamePolicy = require('../gsd-core/bin/lib/runtime-name-policy.cjs');
const registry = require('../gsd-core/bin/lib/capability-registry.cjs');
const { getDirName } = runtimeNamePolicy;
// Golden oracle: hardcoded expected map of all 16 runtime ids to their local config dir.
// A pinned expected value in a TEST is correct — the test IS the oracle (non-circular).
// Only PRODUCTION code should derive dynamically from the registry.
// If this map diverges from getDirName output, either the formula is wrong
// OR the registry changed — both require a deliberate golden-map update here.
const GOLDEN_DIR_MAP = {
claude: '.claude',
copilot: '.github',
opencode: '.opencode',
gemini: '.gemini',
kilo: '.kilo',
codex: '.codex',
antigravity: '.agents',
cursor: '.cursor',
windsurf: '.windsurf',
augment: '.augment',
trae: '.trae',
qwen: '.qwen',
hermes: '.hermes',
kimi: '.kimi-code',
codebuddy: '.codebuddy',
cline: '.cline',
};
test('getDirName: golden map matches for all 16 known runtime ids', () => {
for (const [id, expected] of Object.entries(GOLDEN_DIR_MAP)) {
const actual = getDirName(id);
assert.strictEqual(
actual,
expected,
`getDirName('${id}') diverged from golden.\n` +
` actual: ${JSON.stringify(actual)}\n` +
` expected: ${JSON.stringify(expected)}`,
);
}
});
test('drift guard: registry runtime id set EXACTLY equals the golden map (adding/removing a runtime forces a golden update)', () => {
// Without this, a newly-added runtime would pass (its value never checked) and
// removing `claude` could pass via the .claude fallback. Pin the set both ways.
const registryIds = Object.keys(registry.runtimes).sort();
const goldenIds = Object.keys(GOLDEN_DIR_MAP).sort();
assert.deepEqual(registryIds, goldenIds,
'registry.runtimes id set must exactly match GOLDEN_DIR_MAP — update the golden map when adding/removing a runtime');
});
test('getDirName fallback: unknown runtime returns ".claude"', () => {
assert.strictEqual(getDirName('unknown'), '.claude',
'getDirName("unknown") must return ".claude" (default fallback)');
});
test('getDirName fallback: empty string returns ".claude"', () => {
assert.strictEqual(getDirName(''), '.claude',
'getDirName("") must return ".claude" (empty-input fallback)');
});
test('registry cross-check: every runtimes[id].runtime.localConfigDir is a non-empty dot-dir string', () => {
for (const [id, entry] of Object.entries(registry.runtimes)) {
if (!entry || typeof entry !== 'object') continue;
const runtimeBlock = entry.runtime;
if (!runtimeBlock || typeof runtimeBlock !== 'object') continue;
const dir = runtimeBlock.localConfigDir;
assert.strictEqual(typeof dir, 'string',
`registry.runtimes['${id}'].runtime.localConfigDir must be a string (got: ${typeof dir})`);
assert.ok(dir.length > 0,
`registry.runtimes['${id}'].runtime.localConfigDir must be non-empty`);
assert.ok(dir.startsWith('.'),
`registry.runtimes['${id}'].runtime.localConfigDir must start with '.' (got: ${JSON.stringify(dir)})`);
}
});

View File

@@ -0,0 +1,178 @@
'use strict';
/**
* golden-install-parity.test.cjs — ADR-1239 Phase B safety-net harness.
*
* Captures a byte-stable manifest of every file emitted by the installer for
* all 16 runtimes, so a later PR moving installRuntimeArtifacts can prove
* byte-identical output parity.
*
* ## Determinism invariants (empirically established pre-Phase-B)
*
* After replacing every occurrence of the temp root path with the literal
* '<HOME>' in file contents, the install output is byte-identical run-to-run
* for ALL files EXCEPT exactly two volatile metadata files that are EXCLUDED
* from the parity manifest:
* - gsd-file-manifest.json (timestamp + install-time absolute paths)
* - gsd-install-state.json (install-time absolute paths)
*
* Everything else (≈545–616 files per runtime) is deterministic.
*
* ## UPDATE mode
*
* Run with UPDATE_GOLDEN=1 to (re-)capture fixtures:
* UPDATE_GOLDEN=1 node --test tests/golden-install-parity.test.cjs
*/
const { test, before } = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const crypto = require('node:crypto');
const { execFileSync } = require('node:child_process');
const { cleanup } = require('./helpers.cjs');
const { walk, RUNTIME_META, runMinimalInstall, BUILD_SCRIPT } = require('./helpers/install-shared.cjs');
// hooks/dist is gitignored and built (DEFECT.HOOKS-DIST-SCOPED-CI). The scoped
// CI test lane does not run build:hooks, so a real install there emits no hooks/
// dir — making the golden (captured with hooks built) report "removed (N) hooks/…".
// Build it idempotently here so the harness is lane-independent (mirrors the
// pattern in bug-1834-sh-hooks-installed and install-minimal-hooks).
before(() => {
execFileSync(process.execPath, [BUILD_SCRIPT], { encoding: 'utf-8', stdio: 'pipe' });
});
const UPDATE = process.env.UPDATE_GOLDEN === '1';
const FIXTURE_DIR = path.join(__dirname, 'fixtures', 'golden-install-parity');
// Volatile metadata files always excluded from the parity manifest.
const VOLATILE_FILES = new Set(['gsd-file-manifest.json', 'gsd-install-state.json']);
// Hook-registration config files excluded from the parity manifest. These are
// written by the hook/permission install path (applySettingsJsonHooks /
// finishInstall) — NOT by installRuntimeArtifacts, so they are outside the scope
// of the engine deep-move this harness guards. They also embed the resolved
// node-runner invocation, whose FORM (absolute-quoted "/abs/bin/node" on macOS
// vs bare `node` resolved from PATH on Linux/CI) — not just the binary path —
// varies by platform and cannot be normalized to a single sentinel reliably.
// Their content is asserted directly by the dedicated hook tests
// (install-minimal-hooks, sh-hook-paths, codex-config, etc.). Matched by basename.
// settings.json = Claude/Antigravity/Augment/etc. hook surface; hooks.json =
// 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.
*
* For each file:
* - rel = POSIX-slash relative path from configDir
* - hash = sha256(content with root replaced by '<HOME>').slice(0,16)
*
* Returns a plain object with sorted keys for stable JSON comparison.
*
* @param {string} configDir - absolute path to the installed runtime config dir
* @param {string} root - temp root path to replace with '<HOME>'
* @returns {{ [rel: string]: string }}
*/
function buildParityManifest(configDir, root) {
const allFiles = walk(configDir);
const unsorted = {};
for (const full of allFiles) {
// Build POSIX-style relative path for cross-platform stability
const rel = path.relative(configDir, full).split(path.sep).join('/');
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.
// The only other platform-varying content (the node-runner command form) lives
// exclusively in the excluded HOOK_CONFIG_FILES, so no further normalization is
// needed — a scan of all 16 installs confirmed no other file embeds it.
const normalized = content.toString('utf8').split(root).join('<HOME>');
const hash = crypto.createHash('sha256').update(normalized).digest('hex').slice(0, 16);
unsorted[rel] = hash;
}
// Reconstruct with sorted keys for stable JSON serialisation
const sorted = {};
for (const key of Object.keys(unsorted).sort()) {
sorted[key] = unsorted[key];
}
return sorted;
}
// Ensure the fixture directory exists (needed for UPDATE mode)
if (UPDATE) {
fs.mkdirSync(FIXTURE_DIR, { recursive: true });
}
const runtimes = Object.keys(RUNTIME_META);
for (const runtime of runtimes) {
test(`golden parity — ${runtime}`, async (t) => {
if (process.platform === 'win32') {
t.skip('install output is platform-specific on Windows (backslash paths); parity is asserted on macOS + Linux');
return;
}
const { configDir, root } = runMinimalInstall({ runtime, scope: 'global' });
let actual;
try {
actual = buildParityManifest(configDir, root);
} finally {
cleanup(root);
}
const fixturePath = path.join(FIXTURE_DIR, `${runtime}.json`);
if (UPDATE) {
fs.writeFileSync(fixturePath, JSON.stringify(actual, null, 2) + '\n', 'utf8');
const fileCount = Object.keys(actual).length;
// Report to stdout so the capture run is self-documenting
process.stdout.write(` [UPDATE] ${runtime}: wrote ${fileCount} file hashes → ${fixturePath}\n`);
return;
}
// Assert mode: compare against golden fixture
if (!fs.existsSync(fixturePath)) {
assert.fail(
`Golden fixture missing for runtime '${runtime}': ${fixturePath}\n` +
'Run UPDATE_GOLDEN=1 node --test tests/golden-install-parity.test.cjs to capture.'
);
}
const golden = JSON.parse(fs.readFileSync(fixturePath, 'utf8'));
const goldenKeys = new Set(Object.keys(golden));
const actualKeys = new Set(Object.keys(actual));
const added = [...actualKeys].filter(k => !goldenKeys.has(k));
const removed = [...goldenKeys].filter(k => !actualKeys.has(k));
const changed = [...actualKeys].filter(k => goldenKeys.has(k) && actual[k] !== golden[k]);
if (added.length > 0 || removed.length > 0 || changed.length > 0) {
const lines = [`Parity mismatch for runtime '${runtime}':`];
if (added.length) lines.push(` added (${added.length}): ${added.join(', ')}`);
if (removed.length) lines.push(` removed (${removed.length}): ${removed.join(', ')}`);
if (changed.length) lines.push(` changed (${changed.length}): ${changed.join(', ')}`);
lines.push('Run UPDATE_GOLDEN=1 to recapture if the change is intentional.');
assert.deepEqual(actual, golden, lines.join('\n'));
}
});
}

View File

@@ -41,7 +41,7 @@ const PROJECTION_PATH = path.join(
function codeOnly(file) {
return fs.readFileSync(file, 'utf8')
.replace(/\/\*[\s\S]*?\*\//g, '')
.replace(/(^|[^:])\/\/[^\n]*/g, '$1');
.replace(/(^|[^:])\/\/[^\r\n]*/g, '$1');
}
describe('execNpm: Windows npm spawn platform gate (PR #3102, relocated #498)', () => {

View File

@@ -55,7 +55,7 @@ describe('phase-researcher: Architectural Responsibility Mapping', () => {
test('step is a pure reasoning step with no tool calls', () => {
// Extract the ARM section content (between the ARM heading and the next ## Step heading)
const armHeadingMatch = content.match(/## Step 1\.5[^\n]*Architectural Responsibility Map/);
const armHeadingMatch = content.match(/## Step 1\.5[^\r\n]*Architectural Responsibility Map/);
assert.ok(armHeadingMatch, 'Must have a Step 1.5 heading for Architectural Responsibility Mapping');
const armStart = content.indexOf(armHeadingMatch[0]);

View File

@@ -30,7 +30,7 @@ describe('command files: gsd-tools path references (#1766)', () => {
for (const file of files) {
const content = fs.readFileSync(file, 'utf-8');
const lines = content.split('\n');
const lines = content.split(/\r?\n/);
for (let i = 0; i < lines.length; i++) {
if (/\bgsd-sdk\s+query\b|\$GSD_SDK\s+query/.test(lines[i])) {
violations.push(`${rel(file)}:${i + 1}: ${lines[i].trim()}`);

View File

@@ -59,7 +59,7 @@ function scanFiles(files, pattern, _description) {
const failures = [];
for (const file of files) {
const content = fs.readFileSync(file, 'utf8');
const lines = content.split('\n');
const lines = content.split(/\r?\n/);
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
const trimmed = line.trimStart();
@@ -105,7 +105,7 @@ describe('no hardcoded /home/ absolute paths', () => {
test('no /home/<username>/ paths in string literals', () => {
// Requires: quote + /home/ + non-slash chars (the username) + /
// This avoids matching things like regex patterns /^home/
const homePath = /['"`]\/home\/[^/\s'"` \n]+\//;
const homePath = /['"`]\/home\/[^/\s'"` \r\n]+\//;
const failures = scanFiles(sourceFiles, homePath);
assert.deepStrictEqual(
failures, [],
@@ -122,7 +122,7 @@ describe('no hardcoded /home/ absolute paths', () => {
describe('no hardcoded /Users/ absolute paths', () => {
test('no /Users/<username>/ paths in string literals', () => {
// Requires: quote + /Users/ + username chars + /
const usersPath = /['"`]\/Users\/[^/\s'"` \n]+\//;
const usersPath = /['"`]\/Users\/[^/\s'"` \r\n]+\//;
const failures = scanFiles(sourceFiles, usersPath);
assert.deepStrictEqual(
failures, [],

View File

@@ -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');
@@ -176,7 +177,7 @@ describe('Hermes Agent: installRuntimeArtifacts', () => {
assert.ok(fm.description && fm.description.length > 0, 'description present and non-empty');
assert.strictEqual(fm.version, pkg.version,
`Hermes SKILL.md must declare version (got ${JSON.stringify(fm.version)})`);
assert.ok(/^allowed-tools:\s*\n(?:\s+-\s+\S+\n?)+/m.test(content),
assert.ok(/^allowed-tools:\s*\r?\n(?:\s+-\s+\S+\r?\n?)+/m.test(content),
'allowed-tools rendered as YAML block list');
assert.ok(content.includes('<objective>'), 'body content preserved');
});
@@ -316,7 +317,7 @@ describe('Hermes Agent: SKILL.md format validation', () => {
assert.strictEqual(fm.version, pkg.version, 'version matches package.json');
assert.strictEqual(fm.agent, 'gsd-code-reviewer', 'agent preserved');
assert.strictEqual(fm['argument-hint'], '[PR number or branch]', 'argument-hint preserved and unquoted');
assert.ok(/^allowed-tools:\s*\n(?:\s+-\s+\S+\n?)+/m.test(result),
assert.ok(/^allowed-tools:\s*\r?\n(?:\s+-\s+\S+\r?\n?)+/m.test(result),
'allowed-tools rendered as YAML block list');
});

View File

@@ -0,0 +1,400 @@
'use strict';
/**
* ADR-1239 Phase A: Descriptor tests — validate that all 16 role:runtime
* capability descriptors have correct hostIntegration axes, pass the validator,
* and negotiate correctly via the host-integration module.
*
* Expectations are derived from the generated capability registry and
* .host-cli-final.json (source of truth). Values are verbatim; 'undocumented'
* sentinels fail-closed in negotiation (safe documented default, never propagate).
*/
const { describe, test } = require('node:test');
const assert = require('node:assert/strict');
const path = require('node:path');
const {
negotiateHostCapabilities,
profileOf,
shouldFlattenDispatch,
} = require(path.join(__dirname, '../gsd-core/bin/lib/host-integration.cjs'));
const registry = require(path.join(__dirname, '../gsd-core/bin/lib/capability-registry.cjs'));
const {
validateCapability,
} = require(path.join(__dirname, '../gsd-core/bin/lib/capability-validator.cjs'));
// All 8 scalar hostIntegration axis keys
const SCALAR_AXES = ['embeddingMode', 'commandSurface', 'modelMode', 'hookBus', 'stateIO', 'transport', 'runtime'];
// All 6 dispatch sub-keys (includes backgroundDispatch added in feat/1679-dispatch-flatten)
const DISPATCH_KEYS = ['namedDispatch', 'nested', 'maxDepth', 'background', 'subagentToolkit', 'backgroundDispatch'];
// All 16 runtime IDs (ordered alphabetically)
const RUNTIME_IDS = [
'antigravity', 'augment', 'claude', 'cline', 'codebuddy',
'codex', 'copilot', 'cursor', 'gemini', 'hermes',
'kilo', 'kimi', 'opencode', 'qwen', 'trae', 'windsurf',
];
// Contract-pinned profile split (derived from .host-cli-final.json):
// programmatic-cli: claude, cline, cursor, hermes, kilo, kimi, opencode, qwen, trae (9)
// declarative-cli: antigravity, augment, codebuddy, codex, copilot, gemini, windsurf (7)
// ide: 0
const EXPECTED_PROFILES = {
claude: 'programmatic-cli',
cline: 'programmatic-cli',
cursor: 'programmatic-cli',
hermes: 'programmatic-cli',
kilo: 'programmatic-cli',
kimi: 'programmatic-cli',
opencode: 'programmatic-cli',
qwen: 'programmatic-cli',
trae: 'programmatic-cli',
antigravity: 'declarative-cli',
augment: 'declarative-cli',
codebuddy: 'declarative-cli',
codex: 'declarative-cli',
copilot: 'declarative-cli',
gemini: 'declarative-cli',
windsurf: 'declarative-cli',
};
describe('ADR-1239 Phase A: hostIntegration descriptors', () => {
// ─── Registry shape ──────────────────────────────────────────────────────────
test('registry.runtimes contains all 16 expected runtime ids', () => {
for (const id of RUNTIME_IDS) {
assert.ok(
Object.prototype.hasOwnProperty.call(registry.runtimes, id),
'registry.runtimes must contain "' + id + '"',
);
}
assert.strictEqual(
Object.keys(registry.runtimes).length,
16,
'registry.runtimes must have exactly 16 entries',
);
});
// ─── Per-runtime assertions ───────────────────────────────────────────────────
for (const id of RUNTIME_IDS) {
describe('runtime: ' + id, () => {
const cap = registry.runtimes[id];
const hi = cap && cap.runtime && cap.runtime.hostIntegration;
// (i) Validator passes with zero errors
test('(i) validateCapability returns zero errors', () => {
const errors = validateCapability(cap, id);
assert.deepEqual(
errors,
[],
id + ': validateCapability must return no errors, got: ' + JSON.stringify(errors),
);
});
// (ii) hostIntegration object is present with all required keys
test('(ii) cap.runtime.hostIntegration is present with all 8 axis keys and 6 dispatch sub-keys', () => {
assert.ok(
hi !== undefined && hi !== null && typeof hi === 'object',
id + ': cap.runtime.hostIntegration must be a non-null object',
);
// All 8 scalar axes present
for (const axis of SCALAR_AXES) {
assert.ok(
Object.prototype.hasOwnProperty.call(hi, axis),
id + ': hostIntegration must have axis "' + axis + '"',
);
}
// dispatch is an object
assert.ok(
hi.dispatch !== null && typeof hi.dispatch === 'object',
id + ': hostIntegration.dispatch must be a non-null object',
);
// All 5 dispatch sub-keys present
for (const key of DISPATCH_KEYS) {
assert.ok(
Object.prototype.hasOwnProperty.call(hi.dispatch, key),
id + ': hostIntegration.dispatch must have key "' + key + '"',
);
}
});
// (iii) negotiateHostCapabilities does not throw and behaves correctly
test('(iii) negotiateHostCapabilities: documented scalars pass through; undocumented scalars degrade with warning', () => {
assert.ok(hi, id + ': hostIntegration must exist to negotiate');
let result;
assert.doesNotThrow(() => {
result = negotiateHostCapabilities(hi);
}, id + ': negotiateHostCapabilities must not throw');
const eff = result.effective;
// For each scalar axis: if declared !== 'undocumented', effective === declared
// If declared === 'undocumented', effective !== 'undocumented' (safe default) and
// warnings must mention that axis.
for (const axis of SCALAR_AXES) {
const declared = hi[axis];
if (declared !== 'undocumented') {
assert.strictEqual(
eff[axis],
declared,
id + ': effective.' + axis + ' must equal declared (' + JSON.stringify(declared) + '), got: ' + JSON.stringify(eff[axis]),
);
} else {
// fail-closed: effective must be a documented safe default, not 'undocumented'
assert.notStrictEqual(
eff[axis],
'undocumented',
id + ': effective.' + axis + ' must NOT be "undocumented" (fail-closed)',
);
// warnings must mention this axis
const mentionsAxis = result.warnings.some((w) => w.includes(axis));
assert.ok(
mentionsAxis,
id + ': result.warnings must mention axis "' + axis + '" when declared is undocumented, got: ' + JSON.stringify(result.warnings),
);
}
}
});
// (iii-b) dispatch negotiation for namedDispatch
test('(iii-b) dispatch.namedDispatch negotiation', () => {
assert.ok(hi, id + ': hostIntegration must exist to negotiate');
const result = negotiateHostCapabilities(hi);
const declaredND = hi.dispatch && hi.dispatch.namedDispatch;
if (declaredND === true) {
// documented as true → effective must be true
assert.strictEqual(
result.effective.dispatch.namedDispatch,
true,
id + ': effective.dispatch.namedDispatch must be true when declared is true',
);
} else if (declaredND === 'undocumented') {
// undocumented → fail-closed: effective namedDispatch must be false
assert.strictEqual(
result.effective.dispatch.namedDispatch,
false,
id + ': effective.dispatch.namedDispatch must be false when declared is "undocumented" (fail-closed)',
);
// dispatch.effectiveLevel must be 'absent' (no named dispatch)
assert.strictEqual(
result.points.dispatch.effectiveLevel,
'absent',
id + ': points.dispatch.effectiveLevel must be "absent" when namedDispatch is undocumented',
);
}
});
// (iv) profileOf returns expected profile
test('(iv) profileOf returns expected profile', () => {
assert.ok(hi, id + ': hostIntegration must exist to profile');
const profile = profileOf(hi);
assert.ok(
profile !== null,
id + ': profileOf must return a non-null profile',
);
assert.strictEqual(
profile,
EXPECTED_PROFILES[id],
id + ': profileOf must return "' + EXPECTED_PROFILES[id] + '" (got: "' + profile + '")',
);
});
});
}
// ─── Contract-pin profile split ───────────────────────────────────────────────
test('contract-pin: exactly 9 programmatic-cli, 7 declarative-cli, 0 ide', () => {
const counts = { 'programmatic-cli': 0, 'declarative-cli': 0, 'ide': 0 };
for (const id of RUNTIME_IDS) {
const cap = registry.runtimes[id];
const hi = cap && cap.runtime && cap.runtime.hostIntegration;
assert.ok(hi, id + ': hostIntegration must exist for profile count');
const profile = profileOf(hi);
assert.ok(profile !== null, id + ': profileOf must be non-null');
if (counts[profile] !== undefined) {
counts[profile]++;
}
}
assert.strictEqual(counts['programmatic-cli'], 9, 'Must have exactly 9 programmatic-cli runtimes');
assert.strictEqual(counts['declarative-cli'], 7, 'Must have exactly 7 declarative-cli runtimes');
assert.strictEqual(counts['ide'], 0, 'Must have exactly 0 ide runtimes');
});
// ─── backgroundDispatch presence ─────────────────────────────────────────────
test('every runtime descriptor has dispatch.backgroundDispatch (boolean or "undocumented")', () => {
for (const id of RUNTIME_IDS) {
const cap = registry.runtimes[id];
const dispatch = cap && cap.runtime && cap.runtime.hostIntegration && cap.runtime.hostIntegration.dispatch;
assert.ok(
dispatch !== null && typeof dispatch === 'object',
id + ': hostIntegration.dispatch must be an object',
);
assert.ok(
Object.prototype.hasOwnProperty.call(dispatch, 'backgroundDispatch'),
id + ': dispatch must have a backgroundDispatch key',
);
const v = dispatch.backgroundDispatch;
assert.ok(
v === true || v === false || v === 'undocumented',
id + ': dispatch.backgroundDispatch must be true, false, or "undocumented", got: ' + JSON.stringify(v),
);
}
});
// ─── shouldFlattenDispatch per-host (#853 discriminator) ─────────────────────
// Expected: false (may background) for codex and cursor ONLY; true (must inline) for the other 14.
const EXPECTED_FLATTEN = {
antigravity: true,
augment: true,
claude: true,
cline: true,
codebuddy: true,
codex: false,
copilot: true,
cursor: false,
gemini: true,
hermes: true,
kilo: true,
kimi: true,
opencode: true,
qwen: true,
trae: true,
windsurf: true,
};
for (const id of RUNTIME_IDS) {
test('shouldFlattenDispatch(' + id + ') === ' + EXPECTED_FLATTEN[id], () => {
const cap = registry.runtimes[id];
const dispatch = cap && cap.runtime && cap.runtime.hostIntegration && cap.runtime.hostIntegration.dispatch;
assert.ok(dispatch, id + ': dispatch must exist');
const result = shouldFlattenDispatch(dispatch);
assert.strictEqual(
result,
EXPECTED_FLATTEN[id],
id + ': shouldFlattenDispatch must return ' + EXPECTED_FLATTEN[id] + ' (got: ' + result + ')',
);
});
}
test('contract-pin: exactly 2 hosts are background-eligible (shouldFlattenDispatch === false): codex and cursor', () => {
const eligible = RUNTIME_IDS.filter((id) => {
const cap = registry.runtimes[id];
const dispatch = cap && cap.runtime && cap.runtime.hostIntegration && cap.runtime.hostIntegration.dispatch;
return dispatch && shouldFlattenDispatch(dispatch) === false;
});
assert.deepEqual(
eligible.slice().sort(),
['codex', 'cursor'],
'Exactly codex and cursor must be background-eligible, got: ' + JSON.stringify(eligible.sort()),
);
});
test('contract-pin: spot-check claude→programmatic-cli, codex→declarative-cli, opencode→programmatic-cli, gemini→declarative-cli', () => {
const checks = [
['claude', 'programmatic-cli'],
['codex', 'declarative-cli'],
['opencode', 'programmatic-cli'],
['gemini', 'declarative-cli'],
];
for (const [id, expectedProfile] of checks) {
const cap = registry.runtimes[id];
const hi = cap && cap.runtime && cap.runtime.hostIntegration;
assert.ok(hi, id + ': hostIntegration must exist');
const profile = profileOf(hi);
assert.strictEqual(
profile,
expectedProfile,
id + ': profileOf must return "' + expectedProfile + '" (got: "' + profile + '")',
);
}
});
// ─── NEGATIVE cases ───────────────────────────────────────────────────────────
describe('NEGATIVE: invalid hostIntegration.embeddingMode triggers validator error', () => {
test('embeddingMode "bogus" produces a validator error naming embeddingMode', () => {
const cap = {
id: 'test-neg',
role: 'runtime',
version: '1.0.0',
title: 'Test Negative',
description: 'Negative case for hostIntegration validation.',
tier: 'core',
requires: [],
runtime: {
configHome: { kind: 'dot-home', name: '.test-neg', env: [] },
configFormat: 'settings-json',
artifactLayout: { global: [], local: [] },
commandStyle: 'slash-hyphen',
hooksSurface: 'settings-json',
hookEvents: 'claude',
sandboxTier: 'none',
supportTier: 1,
installSurface: 'settings-json',
writesSharedSettings: true,
permissionWriter: null,
extendedHookEvents: [],
hostIntegration: {
embeddingMode: 'bogus',
commandSurface: 'slash-file',
dispatch: { namedDispatch: true, nested: false, maxDepth: 1, background: false, subagentToolkit: 'full', backgroundDispatch: false },
modelMode: 'passive',
hookBus: 'host',
stateIO: 'filesystem',
transport: 'mcp',
runtime: 'node',
},
},
};
const errors = validateCapability(cap, 'test-neg');
assert.ok(errors.length > 0, 'Expected validation errors for bogus embeddingMode');
assert.ok(
errors.some((e) => e.includes('embeddingMode')),
'At least one error must mention embeddingMode, got: ' + JSON.stringify(errors),
);
});
});
describe('NEGATIVE: missing hostIntegration produces required-object error', () => {
test('runtime body without hostIntegration produces the required-object error', () => {
const cap = {
id: 'test-missing-hi',
role: 'runtime',
version: '1.0.0',
title: 'Test Missing HI',
description: 'Negative case for missing hostIntegration.',
tier: 'core',
requires: [],
runtime: {
configHome: { kind: 'dot-home', name: '.test-missing-hi', env: [] },
configFormat: 'settings-json',
artifactLayout: { global: [], local: [] },
commandStyle: 'slash-hyphen',
hooksSurface: 'settings-json',
hookEvents: 'claude',
sandboxTier: 'none',
supportTier: 1,
installSurface: 'settings-json',
writesSharedSettings: true,
permissionWriter: null,
extendedHookEvents: [],
// hostIntegration intentionally absent
},
};
const errors = validateCapability(cap, 'test-missing-hi');
assert.ok(errors.length > 0, 'Expected validation errors for missing hostIntegration');
assert.ok(
errors.some((e) => e.includes('hostIntegration') && e.includes('required')),
'At least one error must mention hostIntegration and required, got: ' + JSON.stringify(errors),
);
});
});
});

View File

@@ -0,0 +1,432 @@
'use strict';
/**
* ADR-1239 Phase A: Parity guard — validator VALID_* sets MUST exactly match
* HOST_INTEGRATION_AXES arrays from host-integration.cjs.
*
* If either side drifts, this test fails immediately (not silently).
*/
const { describe, test } = require('node:test');
const assert = require('node:assert/strict');
const path = require('node:path');
const {
HOST_INTEGRATION_AXES,
} = require(path.join(__dirname, '../gsd-core/bin/lib/host-integration.cjs'));
const {
_HOST_INTEGRATION_VOCAB,
validateCapability,
} = require(path.join(__dirname, '../gsd-core/bin/lib/capability-validator.cjs'));
// Sort for deterministic comparison
function sorted(arr) {
return [...arr].sort();
}
// Minimal valid runtime capability descriptor (all documented values)
function makeMinimalRuntimeCap(overrides = {}) {
return {
id: 'test-runtime',
role: 'runtime',
title: 'Test Runtime',
description: 'Test runtime capability for parity tests',
tier: 'core',
requires: [],
version: '1.0.0',
runtime: {
configHome: {
kind: 'dot-home',
name: '.test-runtime',
env: [],
},
configFormat: 'markdown',
artifactLayout: {
global: [],
local: [],
},
commandStyle: 'slash-hyphen',
hooksSurface: 'none',
sandboxTier: 'none',
supportTier: 1,
installSurface: 'profile-marker-only',
localConfigDir: '.test-runtime',
writesSharedSettings: false,
permissionWriter: null,
extendedHookEvents: [],
hostIntegration: {
embeddingMode: 'imperative',
commandSurface: 'slash-file',
modelMode: 'passive',
hookBus: 'host',
stateIO: 'filesystem',
transport: 'mcp',
runtime: 'node',
dispatch: {
namedDispatch: true,
nested: false,
maxDepth: 1,
background: false,
subagentToolkit: 'full',
backgroundDispatch: false,
},
},
...overrides,
},
};
}
describe('ADR-1239 Phase A: host-integration validator parity', () => {
test('_HOST_INTEGRATION_VOCAB is exported from capability-validator.cjs', () => {
assert.ok(
_HOST_INTEGRATION_VOCAB !== undefined && _HOST_INTEGRATION_VOCAB !== null,
'_HOST_INTEGRATION_VOCAB must be exported from capability-validator.cjs',
);
assert.strictEqual(typeof _HOST_INTEGRATION_VOCAB, 'object');
});
test('embeddingMode: validator set === HOST_INTEGRATION_AXES.embeddingMode', () => {
assert.deepEqual(
sorted(_HOST_INTEGRATION_VOCAB.embeddingMode),
sorted(HOST_INTEGRATION_AXES.embeddingMode),
'validator VALID_EMBEDDING_MODES must exactly match HOST_INTEGRATION_AXES.embeddingMode',
);
});
test('commandSurface: validator set === HOST_INTEGRATION_AXES.commandSurface', () => {
assert.deepEqual(
sorted(_HOST_INTEGRATION_VOCAB.commandSurface),
sorted(HOST_INTEGRATION_AXES.commandSurface),
'validator VALID_COMMAND_SURFACES must exactly match HOST_INTEGRATION_AXES.commandSurface',
);
});
test('modelMode: validator set === HOST_INTEGRATION_AXES.modelMode', () => {
assert.deepEqual(
sorted(_HOST_INTEGRATION_VOCAB.modelMode),
sorted(HOST_INTEGRATION_AXES.modelMode),
'validator VALID_MODEL_MODES must exactly match HOST_INTEGRATION_AXES.modelMode',
);
});
test('hookBus: validator set === HOST_INTEGRATION_AXES.hookBus', () => {
assert.deepEqual(
sorted(_HOST_INTEGRATION_VOCAB.hookBus),
sorted(HOST_INTEGRATION_AXES.hookBus),
'validator VALID_HOOK_BUSES must exactly match HOST_INTEGRATION_AXES.hookBus',
);
});
test('stateIO: validator set === HOST_INTEGRATION_AXES.stateIO', () => {
assert.deepEqual(
sorted(_HOST_INTEGRATION_VOCAB.stateIO),
sorted(HOST_INTEGRATION_AXES.stateIO),
'validator VALID_STATE_IO must exactly match HOST_INTEGRATION_AXES.stateIO',
);
});
test('transport: validator set === HOST_INTEGRATION_AXES.transport', () => {
assert.deepEqual(
sorted(_HOST_INTEGRATION_VOCAB.transport),
sorted(HOST_INTEGRATION_AXES.transport),
'validator VALID_TRANSPORTS must exactly match HOST_INTEGRATION_AXES.transport',
);
});
test('runtime (axis): validator set === HOST_INTEGRATION_AXES.runtime (8 documented values)', () => {
assert.deepEqual(
sorted(_HOST_INTEGRATION_VOCAB.runtime),
sorted(HOST_INTEGRATION_AXES.runtime),
'validator VALID_HOST_RUNTIMES must exactly match HOST_INTEGRATION_AXES.runtime',
);
});
test('subagentToolkit: validator set === HOST_INTEGRATION_AXES.subagentToolkit', () => {
assert.deepEqual(
sorted(_HOST_INTEGRATION_VOCAB.subagentToolkit),
sorted(HOST_INTEGRATION_AXES.subagentToolkit),
'validator VALID_SUBAGENT_TOOLKITS must exactly match HOST_INTEGRATION_AXES.subagentToolkit',
);
});
test('all axis keys in HOST_INTEGRATION_AXES are covered by _HOST_INTEGRATION_VOCAB', () => {
const axisKeys = Object.keys(HOST_INTEGRATION_AXES).sort();
const vocabKeys = Object.keys(_HOST_INTEGRATION_VOCAB).sort();
assert.deepEqual(
vocabKeys,
axisKeys,
'_HOST_INTEGRATION_VOCAB must cover exactly the same axis keys as HOST_INTEGRATION_AXES',
);
});
test('_HOST_INTEGRATION_VOCAB does NOT include "undocumented" (documented vocab only)', () => {
for (const [axis, values] of Object.entries(_HOST_INTEGRATION_VOCAB)) {
assert.ok(
!values.includes('undocumented'),
`_HOST_INTEGRATION_VOCAB.${axis} must not include "undocumented" (sentinel is NOT documented vocab)`,
);
}
});
});
// ---------------------------------------------------------------------------
// Behavioral: "undocumented" passes validator; bogus values still fail
// ---------------------------------------------------------------------------
describe('ADR-1239 validator behavioral: undocumented sentinel passes, bogus fails', () => {
const SCALAR_AXES = ['embeddingMode', 'commandSurface', 'modelMode', 'hookBus', 'stateIO', 'transport', 'runtime'];
for (const axis of SCALAR_AXES) {
test(`hostIntegration.${axis}:"undocumented" → ZERO validator errors`, () => {
const cap = makeMinimalRuntimeCap({
hostIntegration: {
...makeMinimalRuntimeCap().runtime.hostIntegration,
[axis]: 'undocumented',
},
});
const errors = validateCapability(cap, 'test-runtime');
const hiErrors = errors.filter((e) => e.includes('hostIntegration.' + axis));
assert.strictEqual(hiErrors.length, 0,
`"undocumented" for axis "${axis}" must produce no validator errors; got: ${hiErrors.join(', ')}`);
});
test(`hostIntegration.${axis}:"zzz" → produces a validator error`, () => {
const cap = makeMinimalRuntimeCap({
hostIntegration: {
...makeMinimalRuntimeCap().runtime.hostIntegration,
[axis]: 'zzz',
},
});
const errors = validateCapability(cap, 'test-runtime');
const hiErrors = errors.filter((e) => e.includes('hostIntegration.' + axis));
assert.ok(hiErrors.length > 0,
`bogus value "zzz" for axis "${axis}" must produce a validator error`);
});
}
test('dispatch.namedDispatch:"undocumented" → ZERO validator errors for that field', () => {
const cap = makeMinimalRuntimeCap({
hostIntegration: {
...makeMinimalRuntimeCap().runtime.hostIntegration,
dispatch: {
namedDispatch: 'undocumented',
nested: 'undocumented',
maxDepth: 'undocumented',
background: 'undocumented',
subagentToolkit: 'undocumented',
backgroundDispatch: 'undocumented',
},
},
});
const errors = validateCapability(cap, 'test-runtime');
const dispatchErrors = errors.filter((e) => e.includes('hostIntegration.dispatch'));
assert.strictEqual(dispatchErrors.length, 0,
`"undocumented" for all dispatch fields must produce no validator errors; got: ${dispatchErrors.join(', ')}`);
});
test('dispatch boolean fields: true/false still accepted', () => {
const cap = makeMinimalRuntimeCap();
const errors = validateCapability(cap, 'test-runtime');
const dispatchErrors = errors.filter((e) => e.includes('hostIntegration.dispatch'));
assert.strictEqual(dispatchErrors.length, 0,
`Valid boolean dispatch fields must produce no errors; got: ${dispatchErrors.join(', ')}`);
});
// Phase B: backgroundDispatch field validation
test('dispatch.backgroundDispatch:true → ZERO validator errors', () => {
const cap = makeMinimalRuntimeCap({
hostIntegration: {
...makeMinimalRuntimeCap().runtime.hostIntegration,
dispatch: { ...makeMinimalRuntimeCap().runtime.hostIntegration.dispatch, backgroundDispatch: true },
},
});
const errors = validateCapability(cap, 'test-runtime');
const bdErrors = errors.filter((e) => e.includes('backgroundDispatch'));
assert.strictEqual(bdErrors.length, 0,
`backgroundDispatch:true must produce no errors; got: ${bdErrors.join(', ')}`);
});
test('dispatch.backgroundDispatch:false → ZERO validator errors', () => {
const cap = makeMinimalRuntimeCap({
hostIntegration: {
...makeMinimalRuntimeCap().runtime.hostIntegration,
dispatch: { ...makeMinimalRuntimeCap().runtime.hostIntegration.dispatch, backgroundDispatch: false },
},
});
const errors = validateCapability(cap, 'test-runtime');
const bdErrors = errors.filter((e) => e.includes('backgroundDispatch'));
assert.strictEqual(bdErrors.length, 0,
`backgroundDispatch:false must produce no errors; got: ${bdErrors.join(', ')}`);
});
test('dispatch.backgroundDispatch:"undocumented" → ZERO validator errors', () => {
const cap = makeMinimalRuntimeCap({
hostIntegration: {
...makeMinimalRuntimeCap().runtime.hostIntegration,
dispatch: { ...makeMinimalRuntimeCap().runtime.hostIntegration.dispatch, backgroundDispatch: 'undocumented' },
},
});
const errors = validateCapability(cap, 'test-runtime');
const bdErrors = errors.filter((e) => e.includes('backgroundDispatch'));
assert.strictEqual(bdErrors.length, 0,
`backgroundDispatch:"undocumented" must produce no errors; got: ${bdErrors.join(', ')}`);
});
test('dispatch.backgroundDispatch:"zzz" → produces a validator error', () => {
const cap = makeMinimalRuntimeCap({
hostIntegration: {
...makeMinimalRuntimeCap().runtime.hostIntegration,
dispatch: { ...makeMinimalRuntimeCap().runtime.hostIntegration.dispatch, backgroundDispatch: 'zzz' },
},
});
const errors = validateCapability(cap, 'test-runtime');
const bdErrors = errors.filter((e) => e.includes('backgroundDispatch'));
assert.ok(bdErrors.length > 0,
`bogus value "zzz" for backgroundDispatch must produce a validator error`);
});
test('dispatch without backgroundDispatch key → validator error (required field — all 16 descriptors carry it)', () => {
// backgroundDispatch is now REQUIRED (matches sibling fields namedDispatch/nested/background/subagentToolkit/maxDepth).
const cap = makeMinimalRuntimeCap({
hostIntegration: {
...makeMinimalRuntimeCap().runtime.hostIntegration,
dispatch: (() => {
const d = { ...makeMinimalRuntimeCap().runtime.hostIntegration.dispatch };
delete d.backgroundDispatch;
return d;
})(),
},
});
const errors = validateCapability(cap, 'test-runtime');
const bdErrors = errors.filter((e) => e.includes('backgroundDispatch'));
assert.ok(bdErrors.length > 0,
`Missing backgroundDispatch (required field) must produce a validator error`);
});
});
// ---------------------------------------------------------------------------
// Fix 3: validator must reject reserved keys on hostIntegration and dispatch
// ---------------------------------------------------------------------------
describe('Fix 3: reserved-key guard on hostIntegration and hostIntegration.dispatch', () => {
// Base valid runtime body (all documented values, claude layout)
// We build it via JSON.parse to produce an own "__proto__" key that would
// normally be swallowed by a spread (JSON.parse always produces own props).
const BASE_RUNTIME_JSON = JSON.stringify({
id: 'test-runtime',
role: 'runtime',
title: 'Test',
description: 'Test runtime',
tier: 'core',
requires: [],
version: '1.6.0',
engines: { gsd: '>=1.6.0' },
runtime: {
configHome: { kind: 'dot-home', name: '.test', env: [] },
configFormat: 'settings-json',
artifactLayout: { global: [], local: [] },
commandStyle: 'slash-hyphen',
hooksSurface: 'settings-json',
hookEvents: 'claude',
sandboxTier: 'none',
supportTier: 1,
installSurface: 'settings-json',
localConfigDir: '.test-runtime',
writesSharedSettings: true,
permissionWriter: null,
extendedHookEvents: ['SubagentStop', 'Stop', 'PreCompact', 'FileChanged'],
hostIntegration: {
embeddingMode: 'imperative',
commandSurface: 'slash-file',
dispatch: {
namedDispatch: true,
nested: true,
maxDepth: 5,
background: true,
subagentToolkit: 'full',
backgroundDispatch: true,
},
modelMode: 'passive',
hookBus: 'host',
stateIO: 'filesystem',
transport: 'mcp',
runtime: 'node',
},
},
});
test('baseline (no reserved keys) → ZERO errors', () => {
const cap = JSON.parse(BASE_RUNTIME_JSON);
const errors = validateCapability(cap, 'test-runtime');
assert.strictEqual(errors.length, 0,
'Baseline with no reserved keys must produce zero errors; got: ' + errors.join(', '));
});
test('hostIntegration with own __proto__ key → error mentioning "reserved key" and "__proto__"', () => {
// Inject a raw __proto__ key via JSON string manipulation — JSON.parse gives it
// as an OWN property (unlike { ..., __proto__: ... } which sets prototype chain).
const json = BASE_RUNTIME_JSON.replace(
'"hostIntegration":{',
'"hostIntegration":{"__proto__":{"polluted":true},',
);
const cap = JSON.parse(json);
// Verify the own-key is actually present (our assumption about JSON.parse)
assert.ok(
Object.prototype.hasOwnProperty.call(cap.runtime.hostIntegration, '__proto__'),
'JSON.parse must produce an own __proto__ key on hostIntegration',
);
const errors = validateCapability(cap, 'test-runtime');
const reservedErrors = errors.filter((e) => e.includes('reserved key') && e.includes('__proto__'));
assert.ok(reservedErrors.length > 0,
'Must produce an error mentioning "reserved key" and "__proto__" for hostIntegration; got: ' + errors.join(', '));
});
test('hostIntegration with own "constructor" key → error mentioning "reserved key" and "constructor"', () => {
const json = BASE_RUNTIME_JSON.replace(
'"hostIntegration":{',
'"hostIntegration":{"constructor":"polluted",',
);
const cap = JSON.parse(json);
assert.ok(
Object.prototype.hasOwnProperty.call(cap.runtime.hostIntegration, 'constructor'),
'JSON.parse must produce an own constructor key on hostIntegration',
);
const errors = validateCapability(cap, 'test-runtime');
const reservedErrors = errors.filter((e) => e.includes('reserved key') && e.includes('constructor'));
assert.ok(reservedErrors.length > 0,
'Must produce an error for "constructor" reserved key on hostIntegration; got: ' + errors.join(', '));
});
test('hostIntegration.dispatch with own __proto__ key → error mentioning "reserved key" and "__proto__"', () => {
const json = BASE_RUNTIME_JSON.replace(
'"dispatch":{',
'"dispatch":{"__proto__":{"polluted":true},',
);
const cap = JSON.parse(json);
assert.ok(
Object.prototype.hasOwnProperty.call(cap.runtime.hostIntegration.dispatch, '__proto__'),
'JSON.parse must produce an own __proto__ key on dispatch',
);
const errors = validateCapability(cap, 'test-runtime');
const reservedErrors = errors.filter((e) => e.includes('reserved key') && e.includes('__proto__'));
assert.ok(reservedErrors.length > 0,
'Must produce an error for "__proto__" reserved key on dispatch; got: ' + errors.join(', '));
});
test('hostIntegration.dispatch with own "prototype" key → error mentioning "reserved key" and "prototype"', () => {
const json = BASE_RUNTIME_JSON.replace(
'"dispatch":{',
'"dispatch":{"prototype":{"polluted":true},',
);
const cap = JSON.parse(json);
assert.ok(
Object.prototype.hasOwnProperty.call(cap.runtime.hostIntegration.dispatch, 'prototype'),
'JSON.parse must produce an own prototype key on dispatch',
);
const errors = validateCapability(cap, 'test-runtime');
const reservedErrors = errors.filter((e) => e.includes('reserved key') && e.includes('prototype'));
assert.ok(reservedErrors.length > 0,
'Must produce an error for "prototype" reserved key on dispatch; got: ' + errors.join(', '));
});
});

File diff suppressed because it is too large Load Diff

View File

@@ -1406,7 +1406,7 @@ describe('cmdInitMapCodebase', () => {
path.join(__dirname, '..', 'gsd-core', 'workflows', 'map-codebase.md'), 'utf8'
);
// OpenCode must NOT appear in the "WITHOUT Task tool" / "NOT available" condition
const withoutLine = workflow.split('\n').find(l =>
const withoutLine = workflow.split(/\r?\n/).find(l =>
l.includes('NOT available') || l.includes('WITHOUT Task tool')
);
assert.ok(withoutLine, 'workflow should have a line about Task tool NOT being available');

View File

@@ -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');

View File

@@ -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');

View File

@@ -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');

View File

@@ -0,0 +1,385 @@
'use strict';
/**
* Behavioral regression tests for ADR-1239 Phase B write-confinement.
*
* Tests cover:
* - copyWithPathReplacement: happy path, escape rejection, dest===root,
* fail-closed (no confinementRoot), symlink escape
* - installCodexConfig: happy path, agent name-injection rejection
* - _copyStaged: escape rejection, symlink escape (regression preserved)
*/
const { describe, test } = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const os = require('node:os');
const path = require('node:path');
const { cleanup } = require('./helpers.cjs');
process.env['GSD_TEST_MODE'] = '1';
const {
copyWithPathReplacement,
installCodexConfig,
_copyStaged,
} = require('../bin/install.js');
// ---------------------------------------------------------------------------
// copyWithPathReplacement
// ---------------------------------------------------------------------------
describe('copyWithPathReplacement write-confinement', () => {
test('1. happy path: file is written under confinementRoot', () => {
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-cwpr-happy-'));
try {
const srcDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-cwpr-src-'));
try {
fs.writeFileSync(path.join(srcDir, 'test.md'), '---\nname: test\n---\nbody\n', 'utf8');
const destDir = path.join(root, 'sub', 'dest');
copyWithPathReplacement(srcDir, destDir, '~/.claude/', 'claude', false, false, root);
// The dest dir and its content must exist inside root
const written = fs.existsSync(path.join(destDir, 'test.md'));
assert.ok(written, 'test.md must have been written to destDir under root');
assert.ok(
path.resolve(destDir).startsWith(path.resolve(root) + path.sep),
'destDir must be under root',
);
} finally {
cleanup(srcDir);
}
} finally {
cleanup(root);
}
});
test('2. escape rejected: destDir outside confinementRoot → throws, nothing written at escape path', () => {
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-cwpr-root-'));
const escapeName = 'gsd-cwpr-escape-' + Date.now();
const escapePath = path.join(os.tmpdir(), escapeName);
try {
const srcDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-cwpr-src2-'));
try {
fs.writeFileSync(path.join(srcDir, 'evil.md'), '# evil\n', 'utf8');
// destDir resolves outside root via parent traversal
const destDir = path.join(root, '..', escapeName);
assert.throws(
() => copyWithPathReplacement(srcDir, destDir, '~/.claude/', 'claude', false, false, root),
/escap|must be a strict subpath|refusing/i,
);
// Nothing must have been created at the escape path
assert.ok(!fs.existsSync(escapePath), 'must not create anything at the escape path');
} finally {
cleanup(srcDir);
}
} finally {
cleanup(root);
// also remove escapePath if it was somehow created (defensive)
if (fs.existsSync(escapePath)) cleanup(escapePath);
}
});
test('3. dest === root rejected: throws when destDir equals confinementRoot', () => {
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-cwpr-eqroot-'));
try {
const srcDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-cwpr-src3-'));
try {
fs.writeFileSync(path.join(srcDir, 'x.md'), '# x\n', 'utf8');
assert.throws(
() => copyWithPathReplacement(srcDir, root, '~/.claude/', 'claude', false, false, root),
/escap|must be a strict subpath|refusing|configHome itself/i,
);
} finally {
cleanup(srcDir);
}
} finally {
cleanup(root);
}
});
test('4. fail-closed: omitting confinementRoot throws with descriptive message', () => {
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-cwpr-fc-'));
try {
const srcDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-cwpr-src4-'));
try {
fs.writeFileSync(path.join(srcDir, 'y.md'), '# y\n', 'utf8');
const destDir = path.join(root, 'sub');
assert.throws(
() => copyWithPathReplacement(srcDir, destDir, '~/.claude/', 'claude', false, false, undefined),
/confinementRoot is required/,
);
} finally {
cleanup(srcDir);
}
} finally {
cleanup(root);
}
});
test('5. symlink escape: destDir via symlink outside root → throws', (t) => {
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-cwpr-syml-'));
const outside = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-cwpr-out-'));
try {
const srcDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-cwpr-src5-'));
try {
fs.writeFileSync(path.join(srcDir, 'z.md'), '# z\n', 'utf8');
const linkPath = path.join(root, 'link');
try {
fs.symlinkSync(outside, linkPath);
} catch (_symlinkErr) {
// Symlink creation unsupported on this platform/privilege — skip test body
t.skip('symlink creation unsupported on this platform/privilege');
return;
}
const destDir = path.join(linkPath, 'sub');
assert.throws(
() => copyWithPathReplacement(srcDir, destDir, '~/.claude/', 'claude', false, false, root),
/symlink|escap|confinement|install root/i,
);
// Nothing written to outside
assert.strictEqual(fs.readdirSync(outside).length, 0, 'must not write to the outside dir via symlink');
} finally {
cleanup(srcDir);
}
} finally {
// unlink the symlink before cleanup to avoid crossing boundaries
try { fs.unlinkSync(path.join(root, 'link')); } catch { /* already gone */ }
cleanup(root);
cleanup(outside);
}
});
});
// ---------------------------------------------------------------------------
// installCodexConfig
// ---------------------------------------------------------------------------
describe('installCodexConfig write-confinement', () => {
test('6. happy path: config.toml and agents/<name>.toml written under targetDir', () => {
const targetDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-icc-happy-'));
try {
const agentsSrc = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-icc-src-'));
try {
// Minimal valid agent frontmatter
fs.writeFileSync(
path.join(agentsSrc, 'gsd-foo.md'),
'---\nname: gsd-foo\ndescription: x\n---\nbody\n',
'utf8',
);
const count = installCodexConfig(targetDir, agentsSrc);
assert.strictEqual(count, 1, 'must return count of 1 agent processed');
assert.ok(fs.existsSync(path.join(targetDir, 'config.toml')), 'config.toml must exist under targetDir');
assert.ok(fs.existsSync(path.join(targetDir, 'agents', 'gsd-foo.toml')), 'agents/gsd-foo.toml must exist under targetDir');
} finally {
cleanup(agentsSrc);
}
} finally {
cleanup(targetDir);
}
});
test('7a. name-injection rejected: frontmatter name "../../evil" must throw, nothing written at escape', () => {
const targetDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-icc-inj-'));
// Use a unique escape name derived from the targetDir basename so the escape
// path can never collide with pre-existing files in os.tmpdir().
// agentsTomlDir = resolve(targetDir, 'agents'); ../../<escapeName>.toml from
// there = resolve(targetDir, '../<escapeName>.toml') = dirname(targetDir)/<name>.toml
const escapeName = path.basename(targetDir) + '-escape';
const escapePath = path.join(path.dirname(targetDir), escapeName + '.toml');
try {
const agentsSrc = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-icc-src-inj-'));
try {
fs.writeFileSync(
path.join(agentsSrc, 'gsd-evil.md'),
`---\nname: ../../${escapeName}\ndescription: injected\n---\nbody\n`,
'utf8',
);
assert.throws(
() => installCodexConfig(targetDir, agentsSrc),
/escap|strict subpath|refusing|NUL/i,
);
// Verify nothing was written at the escape location
assert.ok(!fs.existsSync(escapePath), 'no file/dir written at escape location');
} finally {
cleanup(agentsSrc);
}
} finally {
cleanup(targetDir);
if (fs.existsSync(escapePath)) cleanup(escapePath);
}
});
test('7b. name-injection: "../config" and "../evil" must both throw (clobber-prevention, tighter agentsTomlDir root)', () => {
// With confinement rooted at agentsTomlDir (not targetDir), a name like
// "../config" resolves to targetDir/config.toml — still inside the configHome
// but OUTSIDE agents/ — so the gate must throw (clobber prevention).
// Similarly "../evil" resolves to targetDir/evil.toml, also outside agents/.
// Both must throw regardless of whether they escape targetDir.
// Case A: "../config" — would clobber config.toml, must throw.
const targetDirA = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-icc-inj2a-'));
try {
const agentsSrcA = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-icc-src-inj2a-'));
try {
fs.writeFileSync(
path.join(agentsSrcA, 'gsd-clobber.md'),
'---\nname: ../config\ndescription: clobber attempt\n---\nbody\n',
'utf8',
);
assert.throws(
() => installCodexConfig(targetDirA, agentsSrcA),
/escap|strict subpath|refusing|NUL/i,
'name "../config" must throw — it escapes agents/ even though it stays inside targetDir',
);
} finally {
cleanup(agentsSrcA);
}
} finally {
cleanup(targetDirA);
}
// Case B: "../evil" — escapes agents/, must throw (new behavior with agentsTomlDir root).
const targetDirB = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-icc-inj2b-'));
try {
const agentsSrcB = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-icc-src-inj2b-'));
try {
fs.writeFileSync(
path.join(agentsSrcB, 'gsd-up.md'),
'---\nname: ../up-escape-attempt\ndescription: boundary test\n---\nbody\n',
'utf8',
);
assert.throws(
() => installCodexConfig(targetDirB, agentsSrcB),
/escap|strict subpath|refusing|NUL/i,
'name "../evil" must throw — it escapes agents/ (resolves to targetDir/evil.toml)',
);
} finally {
cleanup(agentsSrcB);
}
} finally {
cleanup(targetDirB);
}
// Case C: "../../evil" still throws (escapes both agents/ and targetDir).
const targetDirC = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-icc-inj2c-'));
try {
const agentsSrcC = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-icc-src-inj2c-'));
try {
fs.writeFileSync(
path.join(agentsSrcC, 'gsd-deep.md'),
'---\nname: ../../deep-escape\ndescription: deep escape\n---\nbody\n',
'utf8',
);
assert.throws(
() => installCodexConfig(targetDirC, agentsSrcC),
/escap|strict subpath|refusing|NUL/i,
);
} finally {
cleanup(agentsSrcC);
}
} finally {
cleanup(targetDirC);
}
});
test('10. symlink-escape: agents/ is a symlink outside targetDir → throws', (t) => {
const targetDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-icc-syml-'));
const outsideDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-icc-syml-out-'));
try {
const agentsSrc = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-icc-syml-src-'));
try {
fs.writeFileSync(
path.join(agentsSrc, 'gsd-foo.md'),
'---\nname: gsd-foo\ndescription: x\n---\nbody\n',
'utf8',
);
const agentsLink = path.join(targetDir, 'agents');
try {
fs.symlinkSync(outsideDir, agentsLink);
} catch (_symlinkErr) {
// Symlink creation unsupported on this platform/privilege — skip
t.skip('symlink creation unsupported on this platform/privilege');
return;
}
assert.throws(
() => installCodexConfig(targetDir, agentsSrc),
/symlink|escap|refusing/i,
);
// Nothing must have been written to the outside dir via the symlink
assert.strictEqual(fs.readdirSync(outsideDir).length, 0, 'must not write to the outside dir via symlink');
} finally {
cleanup(agentsSrc);
}
} finally {
try { fs.unlinkSync(path.join(targetDir, 'agents')); } catch { /* already gone */ }
cleanup(targetDir);
cleanup(outsideDir);
}
});
});
// ---------------------------------------------------------------------------
// _copyStaged
// ---------------------------------------------------------------------------
describe('_copyStaged write-confinement', () => {
test('8. escape rejected (regression): destDir escaping configDir → throws', () => {
const configDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-cs-cfg-'));
const stagedDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-cs-staged-'));
const outsideDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-cs-outside-'));
try {
fs.writeFileSync(path.join(stagedDir, 'help.md'), '# help\n', 'utf8');
assert.throws(
() => _copyStaged(stagedDir, outsideDir, { kind: 'commands', destSubpath: 'commands', prefix: 'gsd-' }, configDir),
/escap|strict subpath|refusing|configHome/i,
);
} finally {
cleanup(configDir);
cleanup(stagedDir);
cleanup(outsideDir);
}
});
test('9. symlink escape rejected: destDir containing symlink to outside → throws', (t) => {
const configDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-cs-syml-'));
const outside = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-cs-syml-out-'));
const stagedDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-cs-staged2-'));
try {
fs.writeFileSync(path.join(stagedDir, 'help.md'), '# help\n', 'utf8');
const linkPath = path.join(configDir, 'link');
try {
fs.symlinkSync(outside, linkPath);
} catch (symlinkErr) {
// Symlink creation unsupported on this platform/privilege — skip
t.skip('symlink creation unsupported on this platform/privilege');
return;
}
const destDir = path.join(linkPath, 'sub');
assert.throws(
() => _copyStaged(stagedDir, destDir, { kind: 'commands', destSubpath: 'commands/link/sub', prefix: 'gsd-' }, configDir),
/symlink|escap|confinement|install root/i,
);
assert.strictEqual(fs.readdirSync(outside).length, 0, 'must not have written to outside dir');
} finally {
try { fs.unlinkSync(path.join(configDir, 'link')); } catch { /* already gone */ }
cleanup(configDir);
cleanup(outside);
cleanup(stagedDir);
}
});
test('11. fail-closed: omitting configDir throws with descriptive message', () => {
const stagedDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-cs-fc-staged-'));
const destDir = path.join(os.tmpdir(), 'gsd-cs-fc-dest-' + Date.now());
try {
fs.writeFileSync(path.join(stagedDir, 'help.md'), '# help\n', 'utf8');
assert.throws(
() => _copyStaged(stagedDir, destDir, { kind: 'commands', destSubpath: 'commands', prefix: 'gsd-' }, undefined),
/configDir.*required|required to confine/i,
);
} finally {
cleanup(stagedDir);
if (fs.existsSync(destDir)) cleanup(destDir);
}
});
});

View File

@@ -207,7 +207,7 @@ describe('getGlobalConfigDir — explicit configDir overrides env for all runtim
const savedHome = process.env.HERMES_HOME;
process.env.HERMES_HOME = '~/from-env';
try {
assert.strictEqual(getGlobalConfigDir('hermes', '/explicit/hermes'), '/explicit/hermes');
assert.strictEqual(String(getGlobalConfigDir('hermes', '/explicit/hermes')).replace(/\\/g, '/'), '/explicit/hermes');
} finally {
if (savedHome !== undefined) process.env.HERMES_HOME = savedHome;
else delete process.env.HERMES_HOME;
@@ -218,7 +218,7 @@ describe('getGlobalConfigDir — explicit configDir overrides env for all runtim
const saved = process.env.KILO_CONFIG_DIR;
process.env.KILO_CONFIG_DIR = '~/from-env';
try {
assert.strictEqual(getGlobalConfigDir('kilo', '/explicit/kilo'), '/explicit/kilo');
assert.strictEqual(String(getGlobalConfigDir('kilo', '/explicit/kilo')).replace(/\\/g, '/'), '/explicit/kilo');
} finally {
if (saved !== undefined) process.env.KILO_CONFIG_DIR = saved;
else delete process.env.KILO_CONFIG_DIR;

View File

@@ -1134,7 +1134,7 @@ describe('#1000 regression: gsd-intel-updater emits canonical intel filenames',
// Guard against substring false-positives (e.g. 'files.json' inside 'file-roles.json'):
// canonical long names never contain these short tokens, verified by the canonical set.
const offendingLines = agentPrompt
.split('\n')
.split(/\r?\n/)
.filter((line) => line.includes(shortName));
assert.strictEqual(
offendingLines.length,

View File

@@ -21,7 +21,7 @@ const INVENTORY_PATH = path.join(ROOT, 'docs', 'INVENTORY.md');
test('docs/INVENTORY.md has no "(N shipped)" count scalars in headings', () => {
const content = fs.readFileSync(INVENTORY_PATH, 'utf8');
const offenders = content
.split('\n')
.split(/\r?\n/)
.filter((line) => /^##\s+.+\(\d+\s+shipped\)/.test(line));
assert.ok(

View File

@@ -57,17 +57,21 @@ function writeConfig(tmpDir, obj) {
// behavior. Capture HOME, point it at an isolated tmpdir for the duration of
// each test, restore on teardown.
let _origHome;
let _origUserProfile;
let _origGsdHome;
let _isolatedHome;
function isolateHome() {
_origHome = process.env.HOME;
_origUserProfile = process.env.USERPROFILE;
_origGsdHome = process.env.GSD_HOME;
_isolatedHome = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-home-iso-'));
process.env.HOME = _isolatedHome;
process.env.USERPROFILE = _isolatedHome;
process.env.GSD_HOME = _isolatedHome;
}
function restoreHome() {
if (_origHome === undefined) delete process.env.HOME; else process.env.HOME = _origHome;
if (_origUserProfile === undefined) delete process.env.USERPROFILE; else process.env.USERPROFILE = _origUserProfile;
if (_origGsdHome === undefined) delete process.env.GSD_HOME; else process.env.GSD_HOME = _origGsdHome;
cleanup(_isolatedHome);
_isolatedHome = null;

View File

@@ -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');

View File

@@ -1,136 +0,0 @@
// windows-portability-ok: fixture strings for the lint's own unit test, not real execution
'use strict';
/**
* Tests for scripts/lint-windows-test-portability.cjs
*
* Uses the exported `scanContent` pure function to avoid spawning real
* subprocesses or touching the filesystem. This keeps the test portable and
* prevents the lint from flagging itself (the opt-out comment above covers the
* chmod/bash-c fixture strings below).
*/
const { describe, test } = require('node:test');
const assert = require('node:assert/strict');
const { scanContent } = require('../scripts/lint-windows-test-portability.cjs');
describe('lint-windows-test-portability: scanContent', () => {
test('(a) chmod 0o755 + bash -c with no guard => violation', () => {
const src = `
'use strict';
fs.chmodSync(fixture, 0o755);
execFileSync('bash', ['-c', 'echo hi']);
`;
const result = scanContent(src);
assert.strictEqual(result.makesExecutable, true, 'makesExecutable');
assert.strictEqual(result.shellDashC, true, 'shellDashC');
assert.strictEqual(result.guarded, false, 'guarded');
assert.strictEqual(result.optOut, false, 'optOut');
assert.strictEqual(result.violation, true, 'violation');
});
test('(b) chmod 0o755 + bash -c + process.platform guard => no violation', () => {
const src = `
'use strict';
fs.chmodSync(fixture, 0o755);
execFileSync('bash', ['-c', 'echo hi']);
if (process.platform !== 'win32') { runIt(); }
`;
const result = scanContent(src);
assert.strictEqual(result.makesExecutable, true, 'makesExecutable');
assert.strictEqual(result.shellDashC, true, 'shellDashC');
assert.strictEqual(result.guarded, true, 'guarded');
assert.strictEqual(result.violation, false, 'violation');
});
test('(c) chmod 0o644 (no exec bit) + bash -c => no violation', () => {
const src = `
'use strict';
fs.chmodSync(fixture, 0o644);
execFileSync('bash', ['-c', 'cat file']);
`;
const result = scanContent(src);
assert.strictEqual(result.makesExecutable, false, 'makesExecutable');
assert.strictEqual(result.shellDashC, true, 'shellDashC');
assert.strictEqual(result.violation, false, 'violation');
});
test('(d) chmod 0o755 + execFileSync(sh, [path]) with no -c => no violation', () => {
const src = `
'use strict';
fs.chmodSync(fixture, 0o755);
execFileSync('sh', [fixturePath]);
`;
const result = scanContent(src);
assert.strictEqual(result.makesExecutable, true, 'makesExecutable');
assert.strictEqual(result.shellDashC, false, 'shellDashC');
assert.strictEqual(result.violation, false, 'violation');
});
test('(e) violation pattern + windows-portability-ok opt-out => no violation', () => {
const src = `
// windows-portability-ok: intentional cross-platform test
'use strict';
fs.chmodSync(fixture, 0o755);
execFileSync('bash', ['-c', 'run']);
`;
const result = scanContent(src);
assert.strictEqual(result.makesExecutable, true, 'makesExecutable');
assert.strictEqual(result.shellDashC, true, 'shellDashC');
assert.strictEqual(result.optOut, true, 'optOut');
assert.strictEqual(result.violation, false, 'violation');
});
test('chmod 0o111 (pure exec bits) is detected as executable', () => {
const src = `fs.chmodSync(f, 0o111); spawnSync('sh', ['-c', 'x']);`;
const result = scanContent(src);
assert.strictEqual(result.makesExecutable, true, 'makesExecutable');
assert.strictEqual(result.shellDashC, true, 'shellDashC');
assert.strictEqual(result.violation, true, 'violation');
});
test('chmod 0o444 (read-only) is not executable', () => {
const src = `fs.chmodSync(f, 0o444); execFileSync('bash', ['-c', 'x']);`;
const result = scanContent(src);
assert.strictEqual(result.makesExecutable, false, 'makesExecutable');
assert.strictEqual(result.violation, false, 'violation');
});
test('string-literal sh -c form is detected', () => {
const src = `
fs.chmodSync(f, 0o755);
exec('sh -c "run.sh"');
`;
const result = scanContent(src);
assert.strictEqual(result.shellDashC, true, 'shellDashC from string literal');
assert.strictEqual(result.violation, true, 'violation');
});
test('/bin/bash prefix in array form is detected', () => {
const src = `
fs.chmodSync(f, 0o755);
execFileSync('/bin/bash', ['-c', 'run']);
`;
const result = scanContent(src);
assert.strictEqual(result.shellDashC, true, 'shellDashC with /bin/bash prefix');
assert.strictEqual(result.violation, true, 'violation');
});
test('isWindows guard suppresses violation', () => {
const src = `
const isWindows = process.platform === 'win32';
fs.chmodSync(f, 0o755);
execFileSync('bash', ['-c', 'run']);
`;
const result = scanContent(src);
assert.strictEqual(result.guarded, true, 'guarded via isWindows');
assert.strictEqual(result.violation, false, 'violation');
});
test('no chmod at all => no violation regardless of shell -c', () => {
const src = `execFileSync('bash', ['-c', 'echo hi']);`;
const result = scanContent(src);
assert.strictEqual(result.makesExecutable, false, 'makesExecutable');
assert.strictEqual(result.violation, false, 'violation');
});
});

View File

@@ -191,7 +191,7 @@ describe('milestone-summary artifact path resolution', () => {
test('current milestone paths point to .planning/ root', () => {
const content = fs.readFileSync(workflowPath, 'utf-8');
// Current milestone should read from .planning/ root
const lines = content.split('\n');
const lines = content.split(/\r?\n/);
const currentSection = lines.slice(
lines.findIndex(l => l.includes('Current/in-progress')),
lines.findIndex(l => l.includes('Current/in-progress')) + 10

View File

@@ -0,0 +1,93 @@
'use strict';
/**
* tests/mutation-matrix-stdin-eagain.test.cjs
*
* Regression tests for the EAGAIN-resilient readStdinSync() helper added to
* scripts/mutation-matrix.cjs (issue #1733).
*
* Background: On macOS, libuv sets a piped stdin fd to non-blocking mode.
* Under heavy CI shard load a synchronous fs.readFileSync(process.stdin.fd)
* can throw EAGAIN before the writer has filled the pipe, aborting the script
* with status 2. readStdinSync() retries on EAGAIN; these tests verify that
* contract deterministically by monkeypatching fs.readSync (never via chmod /
* permission tricks — see cross-platform IO-failure-injection convention).
*/
const { test, describe } = require('node:test');
const assert = require('node:assert/strict');
const fs = require('fs');
const path = require('path');
const matrix = require(path.resolve(__dirname, '../scripts/mutation-matrix.cjs'));
describe('readStdinSync: EAGAIN resilience', () => {
test('exports readStdinSync as a function', () => {
assert.strictEqual(
typeof matrix.readStdinSync,
'function',
'mutation-matrix.cjs must export readStdinSync'
);
});
test('retries on EAGAIN then returns the full payload', () => {
// Arrange: stub fs.readSync driven by a closure counter.
// Call 1 → throw EAGAIN (simulates non-blocking pipe not ready)
// Call 2 → write payload into buffer, return byte length
// Call 3+ → return 0 (clean EOF)
const payload = 'src/core-utils.cts\nsrc/adr-parser.cts\n';
const payloadBuf = Buffer.from(payload, 'utf8');
let callCount = 0;
const origReadSync = fs.readSync;
try {
fs.readSync = (fd, buf, offset, _length, _position) => {
callCount++;
if (callCount === 1) {
throw Object.assign(new Error('EAGAIN: resource temporarily unavailable'), { code: 'EAGAIN' });
}
if (callCount === 2) {
payloadBuf.copy(buf, offset, 0, payloadBuf.length);
return payloadBuf.length;
}
// Call 3+: EOF
return 0;
};
const result = matrix.readStdinSync();
assert.strictEqual(
result,
payload,
'readStdinSync must return the full payload after retrying the EAGAIN'
);
assert.ok(
callCount >= 3,
`expected at least 3 fs.readSync calls (EAGAIN + data + EOF), got ${callCount}`
);
} finally {
fs.readSync = origReadSync;
}
});
test('non-EAGAIN errors propagate (are not swallowed)', () => {
// Arrange: stub fs.readSync to throw a non-retryable error.
const origReadSync = fs.readSync;
try {
fs.readSync = () => {
throw Object.assign(new Error('EACCES: permission denied'), { code: 'EACCES' });
};
assert.throws(
() => matrix.readStdinSync(),
(err) => {
assert.strictEqual(err.code, 'EACCES');
return true;
},
'readStdinSync must rethrow non-EAGAIN errors'
);
} finally {
fs.readSync = origReadSync;
}
});
});

View File

@@ -0,0 +1,201 @@
'use strict';
// This file is an eslint-rule RuleTester fixture. It contains npm exec
// command strings as TEST DATA (fixtures the rule must lint) — not real
// invocations. See ALLOWLIST in scripts/prompt-injection-scan.sh.
/**
* no-bare-npm-exec.rule.test.cjs
*
* RuleTester unit tests for the local/no-bare-npm-exec ESLint rule.
*
* Rule (G5): flag execFileSync/spawnSync/spawn('npm', ...) without
* { shell: true } — Windows needs npm.cmd via a shell.
*
* execSync('npm ...') is explicitly NOT flagged: execSync always runs through
* a shell (cmd.exe on Windows resolves npm.cmd automatically), so it is safe
* without shell: true.
*/
const { test, describe } = require('node:test');
const assert = require('node:assert/strict');
const { RuleTester } = require('eslint');
const rule = require('../eslint-rules/no-bare-npm-exec.cjs');
const ruleTester = new RuleTester({
languageOptions: {
ecmaVersion: 2022,
sourceType: 'commonjs',
},
});
// ─── module shape ─────────────────────────────────────────────────────────────
describe('no-bare-npm-exec rule module', () => {
test('exports meta and create', () => {
assert.strictEqual(typeof rule.meta, 'object');
assert.strictEqual(typeof rule.create, 'function');
assert.strictEqual(rule.meta.type, 'problem');
assert.ok(rule.meta.messages.bareNpmExec, 'bareNpmExec message must exist');
});
});
// ─── INVALID cases ────────────────────────────────────────────────────────────
describe('no-bare-npm-exec: invalid cases', () => {
test('invalid: execFileSync("npm", ["install"]) with no options', () => {
ruleTester.run('no-bare-npm-exec', rule, {
valid: [],
invalid: [
{
code: `execFileSync('npm', ['install']);`,
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'bareNpmExec' }],
},
],
});
});
test('invalid: execFileSync("npm", ["ci"], { cwd }) without shell', () => {
ruleTester.run('no-bare-npm-exec', rule, {
valid: [],
invalid: [
{
code: `execFileSync('npm', ['ci'], { cwd: '/some/dir' });`,
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'bareNpmExec' }],
},
],
});
});
test('invalid: spawnSync("npm", ["run", "build"]) with no options', () => {
ruleTester.run('no-bare-npm-exec', rule, {
valid: [],
invalid: [
{
code: `spawnSync('npm', ['run', 'build']);`,
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'bareNpmExec' }],
},
],
});
});
test('invalid: spawn("npm", ["install"]) with no options', () => {
ruleTester.run('no-bare-npm-exec', rule, {
valid: [],
invalid: [
{
code: `spawn('npm', ['install']);`,
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'bareNpmExec' }],
},
],
});
});
});
// ─── VALID cases ──────────────────────────────────────────────────────────────
describe('no-bare-npm-exec: valid cases', () => {
test('valid: execFileSync("npm", ["install"], { shell: true })', () => {
ruleTester.run('no-bare-npm-exec', rule, {
valid: [
{
code: `execFileSync('npm', ['install'], { shell: true });`,
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
test('valid: execFileSync("npm", ["ci"], { shell: true, cwd: dir })', () => {
ruleTester.run('no-bare-npm-exec', rule, {
valid: [
{
code: `execFileSync('npm', ['ci'], { shell: true, cwd: dir });`,
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
test('valid: execFileSync("npm", ...) with shell: isWindows', () => {
ruleTester.run('no-bare-npm-exec', rule, {
valid: [
{
code: `execFileSync('npm', ['install'], { shell: isWindows });`,
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
test('valid: execFileSync("npm", ...) with shell: process.platform === "win32"', () => {
ruleTester.run('no-bare-npm-exec', rule, {
valid: [
{
code: `execFileSync('npm', ['install'], { shell: process.platform === 'win32' });`,
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
test('valid: spawnSync("npm", ["run", "test"], { shell: true })', () => {
ruleTester.run('no-bare-npm-exec', rule, {
valid: [
{
code: `spawnSync('npm', ['run', 'test'], { shell: true });`,
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
test('valid: execFileSync("node", ["script.js"]) — not npm, no flag needed', () => {
ruleTester.run('no-bare-npm-exec', rule, {
valid: [
{
code: `execFileSync('node', ['script.js']);`,
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
test('valid: execFileSync("npx", ["mocha"]) — not npm, different command', () => {
ruleTester.run('no-bare-npm-exec', rule, {
valid: [
{
code: `execFileSync('npx', ['mocha']);`,
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
test('valid: execSync("npm install") — execSync uses a shell by default, safe without shell:true', () => {
ruleTester.run('no-bare-npm-exec', rule, {
valid: [
{
// execSync always invokes a shell (cmd.exe on Windows resolves npm.cmd),
// so it does NOT need shell: true. Rule only flags execFileSync/spawnSync/spawn.
code: `execSync('npm install');`,
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
});

View File

@@ -0,0 +1,338 @@
'use strict';
/**
* no-crlf-fragile-split.rule.test.cjs
*
* RuleTester unit tests for the local/no-crlf-fragile-split ESLint rule.
*
* Rule covers three sub-patterns:
* G1 — .split('\n') on readFileSync-derived content (crlfFragileSplit)
* G2 — RegExp with bare \n on readFileSync-derived content (crlfFragileRegex)
* G3 — RegExp with bare \n containing markdown fence or frontmatter anchor
* (crlfFragileRegex) — caught even without direct data-flow
*
* NOTE: Fixture code strings must encode actual \n characters as \\n inside
* the JavaScript string literals used for RuleTester `code` fields, so that
* the ESLint parser receives the intended source text.
*/
const { test, describe } = require('node:test');
const assert = require('node:assert/strict');
const { RuleTester } = require('eslint');
const rule = require('../eslint-rules/no-crlf-fragile-split.cjs');
const ruleTester = new RuleTester({
languageOptions: {
ecmaVersion: 2022,
sourceType: 'commonjs',
},
});
// ─── module shape ─────────────────────────────────────────────────────────────
describe('no-crlf-fragile-split rule module', () => {
test('exports meta and create', () => {
assert.strictEqual(typeof rule.meta, 'object');
assert.strictEqual(typeof rule.create, 'function');
assert.strictEqual(rule.meta.type, 'problem');
assert.ok(rule.meta.messages.crlfFragileSplit, 'crlfFragileSplit message must exist');
assert.ok(rule.meta.messages.crlfFragileRegex, 'crlfFragileRegex message must exist');
});
});
// ─── G1: INVALID cases ────────────────────────────────────────────────────────
describe('G1 — no-crlf-fragile-split: invalid (crlfFragileSplit)', () => {
test('G1-invalid: readFileSync(p).split("\\n") — direct chain', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [],
invalid: [
{
// code that ESLint will parse: fs.readFileSync(p, 'utf8').split('\n')
code: "const lines = fs.readFileSync(p, 'utf8').split('\\n');",
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'crlfFragileSplit' }],
},
],
});
});
test('G1-invalid: readFileSync(p).toString().split("\\n") — chained call', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [],
invalid: [
{
code: "const lines = readFileSync(p).toString().split('\\n');",
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'crlfFragileSplit' }],
},
],
});
});
test('G1-invalid: content = readFileSync(...); content.split("\\n") — via variable', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [],
invalid: [
{
code: [
"const content = fs.readFileSync(filePath, 'utf8');",
"const lines = content.split('\\n');",
].join('\n'),
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'crlfFragileSplit' }],
},
],
});
});
test('G1-invalid: double-quoted "\\n" in split', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [],
invalid: [
{
code: 'const lines = fs.readFileSync(\'file.txt\', \'utf8\').split("\\n");',
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'crlfFragileSplit' }],
},
],
});
});
});
// ─── G1: VALID cases ──────────────────────────────────────────────────────────
describe('G1 — no-crlf-fragile-split: valid cases', () => {
test('G1-valid: .split(/\\r?\\n/) — correct regex', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [
{
// /\r?\n/ in source — no bare \n in a string argument
code: "const lines = fs.readFileSync(p, 'utf8').split(/\\r?\\n/);",
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
test('G1-valid: non-file content split — "\\n" on a plain string literal', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [
{
code: "const lines = someString.split('\\n');",
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
test('G1-valid: non-file content split — "\\n" on variable not from readFileSync', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [
{
code: [
"const content = 'hello\\\\nworld';",
"const lines = content.split('\\n');",
].join('\n'),
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
test('G1-valid: .split("\\n") on a fetch/HTTP response (not readFileSync)', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [
{
code: "const lines = response.text.split('\\n');",
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
});
// ─── G2/G3: INVALID cases ─────────────────────────────────────────────────────
describe('G2/G3 — no-crlf-fragile-split: invalid (crlfFragileRegex)', () => {
test('G2-invalid: bare \\n in regex on readFileSync content via .match()', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [],
invalid: [
{
// /foo\nbar/ — regex with bare \n; .match() on readFileSync result
code: "const m = fs.readFileSync(p, 'utf8').match(/foo\\nbar/);",
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'crlfFragileRegex' }],
},
],
});
});
test('G2-invalid: bare \\n in regex on readFileSync content via .test()', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [],
invalid: [
{
// /hello\nworld/.test(readFileSync(...))
code: "const ok = /hello\\nworld/.test(fs.readFileSync(p, 'utf8'));",
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'crlfFragileRegex' }],
},
],
});
});
test('G2-invalid: bare \\n in regex on readFileSync content via .replace()', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [],
invalid: [
{
code: "const out = fs.readFileSync(p, 'utf8').replace(/foo\\nbar/, 'x');",
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'crlfFragileRegex' }],
},
],
});
});
test('G3-invalid: markdown fence regex with bare \\n (```bash\\n)', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [],
invalid: [
{
// content.match(/```bash\nsome/) — fence regex with bare \n
code: "const m = content.match(/```bash\\nsome/);",
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'crlfFragileRegex' }],
},
],
});
});
test('G3-invalid: frontmatter anchor regex with bare \\n (/^---\\n/)', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [],
invalid: [
{
// /^---\ntitle/.test(content) — frontmatter with bare \n
code: "const hasFM = /^---\\ntitle/.test(content);",
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'crlfFragileRegex' }],
},
],
});
});
});
// ─── G2/G3: VALID cases ───────────────────────────────────────────────────────
describe('G2/G3 — no-crlf-fragile-split: valid cases', () => {
test('G2-valid: regex with \\r?\\n (already CRLF-safe) on readFileSync content', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [
{
// /foo\r?\nbar/ — has \r?\n so it's safe
code: "const m = fs.readFileSync(p, 'utf8').match(/foo\\r?\\nbar/);",
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
test('G2-valid: regex with bare \\n but used on a non-file string (ok per known boundaries)', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [
{
// /hello\nworld/.test(someRuntimeString) — not file content
code: "const ok = /hello\\nworld/.test(someRuntimeString);",
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
test('G3-valid: markdown fence regex but with \\r?\\n (already CRLF-safe)', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [
{
code: "const m = content.match(/```bash\\r?\\nsome/);",
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
test('G3-valid: frontmatter regex with \\r\\n (explicitly CRLF-safe)', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [
{
code: "const hasFM = /^---\\r\\ntitle/.test(content);",
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
// C3 per-occurrence classification cases
test('C3-valid: /\\r?\\n/ — single safe occurrence, not flagged', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [
{
code: "const m = fs.readFileSync(p, 'utf8').match(/\\r?\\n/);",
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
test('C3-invalid: regex with both safe \\r?\\n AND a separate bare \\n — flagged', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [],
invalid: [
{
// /\r?\nfoo|\nbar/ — the second \n (after |) is bare and fragile
code: "const m = fs.readFileSync(p, 'utf8').match(/\\r?\\nfoo|\\nbar/);",
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'crlfFragileRegex' }],
},
],
});
});
test('C3-invalid: [^\\n] — \\n in class without \\r is fragile', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [],
invalid: [
{
// /[^\n]+/ — class has \n but no \r
code: "const m = fs.readFileSync(p, 'utf8').match(/[^\\n]+/);",
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'crlfFragileRegex' }],
},
],
});
});
test('C3-valid: [^\\r\\n] — \\n in class with \\r is safe', () => {
ruleTester.run('no-crlf-fragile-split', rule, {
valid: [
{
code: "const m = fs.readFileSync(p, 'utf8').match(/[^\\r\\n]+/);",
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
});

View File

@@ -0,0 +1,184 @@
'use strict';
/**
* no-hardcoded-tmp.rule.test.cjs
*
* RuleTester unit tests for the local/no-hardcoded-tmp ESLint rule.
*
* Rule (G4): flag a string Literal starting with `/tmp/` (or exactly `/tmp`)
* passed to an `fs.<method>(...)` call or `path.join('/tmp/...', …)`.
* Message: use `os.tmpdir()`.
*/
const { test, describe } = require('node:test');
const assert = require('node:assert/strict');
const { RuleTester } = require('eslint');
const rule = require('../eslint-rules/no-hardcoded-tmp.cjs');
const ruleTester = new RuleTester({
languageOptions: {
ecmaVersion: 2022,
sourceType: 'commonjs',
},
});
// ─── module shape ─────────────────────────────────────────────────────────────
describe('no-hardcoded-tmp rule module', () => {
test('exports meta and create', () => {
assert.strictEqual(typeof rule.meta, 'object');
assert.strictEqual(typeof rule.create, 'function');
assert.strictEqual(rule.meta.type, 'problem');
assert.ok(rule.meta.messages.hardcodedTmp, 'hardcodedTmp message must exist');
});
});
// ─── INVALID cases ────────────────────────────────────────────────────────────
describe('no-hardcoded-tmp: invalid cases', () => {
test('invalid: fs.writeFileSync("/tmp/x", data)', () => {
ruleTester.run('no-hardcoded-tmp', rule, {
valid: [],
invalid: [
{
code: `fs.writeFileSync('/tmp/x', data);`,
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'hardcodedTmp' }],
},
],
});
});
test('invalid: fs.readFileSync("/tmp/file.txt", "utf8")', () => {
ruleTester.run('no-hardcoded-tmp', rule, {
valid: [],
invalid: [
{
code: `const c = fs.readFileSync('/tmp/file.txt', 'utf8');`,
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'hardcodedTmp' }],
},
],
});
});
test('invalid: fs.mkdirSync("/tmp/mydir", { recursive: true })', () => {
ruleTester.run('no-hardcoded-tmp', rule, {
valid: [],
invalid: [
{
code: `fs.mkdirSync('/tmp/mydir', { recursive: true });`,
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'hardcodedTmp' }],
},
],
});
});
test('invalid: path.join("/tmp/dir", "sub")', () => {
ruleTester.run('no-hardcoded-tmp', rule, {
valid: [],
invalid: [
{
code: `const p = path.join('/tmp/dir', 'sub');`,
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'hardcodedTmp' }],
},
],
});
});
test('invalid: fs.existsSync("/tmp")', () => {
ruleTester.run('no-hardcoded-tmp', rule, {
valid: [],
invalid: [
{
code: `fs.existsSync('/tmp');`,
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'hardcodedTmp' }],
},
],
});
});
test('invalid: fs.rmSync("/tmp/x", { recursive: true })', () => {
ruleTester.run('no-hardcoded-tmp', rule, {
valid: [],
invalid: [
{
code: `fs.rmSync('/tmp/x', { recursive: true });`,
filename: 'tests/foo.test.cjs',
errors: [{ messageId: 'hardcodedTmp' }],
},
],
});
});
});
// ─── VALID cases ──────────────────────────────────────────────────────────────
describe('no-hardcoded-tmp: valid cases', () => {
test('valid: os.tmpdir() — portable temp directory', () => {
ruleTester.run('no-hardcoded-tmp', rule, {
valid: [
{
code: `
const tmpDir = os.tmpdir();
fs.writeFileSync(path.join(tmpDir, 'x'), data);
`,
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
test('valid: fs.writeFileSync with a variable (not hardcoded /tmp/)', () => {
ruleTester.run('no-hardcoded-tmp', rule, {
valid: [
{
code: `fs.writeFileSync(tmpFile, data);`,
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
test('valid: path.join with non-tmp first arg', () => {
ruleTester.run('no-hardcoded-tmp', rule, {
valid: [
{
code: `const p = path.join(__dirname, 'fixtures', 'test.txt');`,
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
test('valid: /tmp/ string not passed to fs or path.join (assignment)', () => {
ruleTester.run('no-hardcoded-tmp', rule, {
valid: [
{
code: `const note = 'uses /tmp/ on POSIX';`,
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
test('valid: /tmp/ as a non-first arg to path.join', () => {
ruleTester.run('no-hardcoded-tmp', rule, {
valid: [
{
code: `const p = path.join(os.tmpdir(), '/tmp/subdir');`,
filename: 'tests/foo.test.cjs',
},
],
invalid: [],
});
});
});

Some files were not shown because too many files have changed in this diff Show More