* fix(#2351): replace hardcoded gnu timeout with portable run-with-timeout Stock macOS ships neither `timeout` nor `gtimeout` (GNU coreutils). The 10 hardcoded `timeout <n> <cmd>` calls across the workflow/agent/reference gates exited 127 ("command not found") on such hosts, and the gates — which only distinguish 0/124/other — misreported a passing build or test as a FAILURE. Fix: a single Node-based `gsd_run run-with-timeout <secs> [--] <cmd…>` verb in gsd-tools.cjs. Coreutils-independent (stock macOS AND Windows), keeps GNU `timeout`'s exit-code contract (124 timeout, passthrough, 127/126 ENOENT/EACCES, 128+signum on signal), inherits stdio so pipes/redirects work, and reaps the whole process group so a watch-mode runner cannot outlive its budget. Runs before gsd-tools' flag parsing so the wrapped argv stays opaque. Hardened per adversarial review: - On timeout, SIGKILL the group SYNCHRONOUSLY before resolving — a descendant that traps SIGTERM was otherwise orphaned holding stdout, hanging captured gates (the exact watch-mode hang the feature prevents). - Forward SIGINT/SIGTERM to the child tree instead of dying and orphaning it. - Reject blank/whitespace <seconds> (was a silent unbounded run); clamp the timer to the 32-bit setTimeout ceiling (was a spurious immediate timeout). - Lint detector: catch GNU long options / `-k5` / `$((...))`; anchor to command position so prose "timeout 30 seconds" no longer false-positives. Resolution lives once in the CLI; all 10 sites call the shared verb. A parity guard (scripts/lint-portable-timeout.cjs, wired into lint:ci) fails the build if a bare `timeout`/`gtimeout` execution reappears (the portable `command -v timeout` probe form is intentionally allowed). Also fixes the identical bug in the zh-CN checkpoints translation, updates the tests that asserted the old strings, trims a redundant phrase in gsd-verifier.md to keep it under its size hard cap, and refreshes the size baselines + golden install-parity fixtures. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore(#2351): add changeset (#2426) * chore: regenerate golden/size baseline after rebase onto next --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
5
.changeset/2351-portable-timeout.md
Normal file
5
.changeset/2351-portable-timeout.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
type: Fixed
|
||||
pr: 2426
|
||||
---
|
||||
**Post-merge, regression, and other GSD test/build gates no longer fail with a spurious "command not found" on stock macOS.** These gates hardcoded GNU coreutils' `timeout`, which stock macOS ships neither as `timeout` nor `gtimeout`; a passing build or test run now completes under a portable, coreutils-independent `run-with-timeout` wrapper instead of exiting 127 and being misreported as a failure. (#2351)
|
||||
@@ -537,11 +537,11 @@ grep -R -n -E 'probe-[^[:space:]]+\.sh|scripts/.*/tests/probe-.*\.sh' "$PHASE_DI
|
||||
|
||||
1. Build the `PROBES` list from explicit PLAN declarations first; include conventional `scripts/*/tests/probe-*.sh` when the phase is a migration/tooling phase or the success criteria mention probes.
|
||||
2. For every documented probe path, if the file is missing or unreadable, mark `MISSING_PROBE` and set `status: gaps_found`. Do not require the executable bit because probes run through `bash "$probe"`.
|
||||
3. Run each probe from the built `PROBES` list (declared + conventional) from the repository root:
|
||||
3. Run each probe from the built `PROBES` list from the repository root:
|
||||
|
||||
```bash
|
||||
for probe in "${PROBES[@]}"; do
|
||||
timeout 30s bash "$probe"
|
||||
gsd_run run-with-timeout 30 -- bash "$probe"
|
||||
done
|
||||
```
|
||||
|
||||
|
||||
@@ -323,7 +323,7 @@ npm run dev &
|
||||
DEV_SERVER_PID=$!
|
||||
|
||||
# 等待就绪(最多 30s)
|
||||
timeout 30 bash -c 'until curl -s localhost:3000 > /dev/null 2>&1; do sleep 1; done'
|
||||
gsd_run run-with-timeout 30 -- bash -c 'until curl -s localhost:3000 > /dev/null 2>&1; do sleep 1; done'
|
||||
```
|
||||
|
||||
**端口冲突:** 终止陈旧进程(`lsof -ti:3000 | xargs kill`)或使用备用端口(`--port 3001`)。
|
||||
|
||||
@@ -2071,11 +2071,163 @@ async function dispatchHostCommand({ command, args, cwd, raw, error, defaultValu
|
||||
|
||||
// ─── Arg parsing helpers ──────────────────────────────────────────────────────
|
||||
|
||||
// ─── run-with-timeout (#2351) ─────────────────────────────────────────────────
|
||||
// Portable, coreutils-independent wall-clock cap for a spawned command. Replaces
|
||||
// the GNU-only `timeout <n> …` calls that were hardcoded across gsd
|
||||
// workflow/agent files: stock macOS ships neither `timeout` nor `gtimeout`, so
|
||||
// those calls exited 127 ("command not found") and a passing build/test was
|
||||
// misreported as a FAILURE. The resolution lives here ONCE — every call site
|
||||
// invokes `gsd_run run-with-timeout <secs> [--] <cmd> [args…]` instead of
|
||||
// hand-rolling a `command -v timeout` probe per file.
|
||||
//
|
||||
// Exit-code contract (kept identical to GNU `timeout` so the existing per-site
|
||||
// dispatch — `-eq 124` for timeout, `-eq 0` for pass, non-zero for fail — is
|
||||
// unchanged):
|
||||
// • command exits normally → exit with the command's own code
|
||||
// • wall-clock budget exceeded → exit 124
|
||||
// • command killed by a signal → exit 128+signum
|
||||
// • command not found / not exec → exit 127 / 126 (spawn ENOENT / EACCES)
|
||||
// • bad wrapper args → exit 2 (usage — a workflow-authoring bug)
|
||||
// • <secs> == 0 → run with NO timer (matches `timeout 0`)
|
||||
// • blank / negative / NaN <secs> → exit 2 (usage — fails SAFE, never unbounded)
|
||||
//
|
||||
// The wrapped command's argv is OPAQUE: this executes BEFORE gsd-tools' own
|
||||
// global-flag parsing (see main()), so a wrapped `--raw`/`--cwd`/`--pick` passes
|
||||
// through verbatim rather than being consumed by this dispatcher. stdio is
|
||||
// inherited so shell pipes (`echo x | gsd_run run-with-timeout …`) and redirects
|
||||
// keep working. No shell is spawned (argv array) — no injection surface beyond
|
||||
// the old `timeout … bash -c "$CMD"`.
|
||||
function runWithTimeout(argv) {
|
||||
const { spawn } = require('node:child_process');
|
||||
const os = require('node:os');
|
||||
|
||||
const USAGE = 'Usage: gsd_run run-with-timeout <seconds> [--] <command> [args...]';
|
||||
const usageError = (msg) => new ExitError(2, `run-with-timeout: ${msg}\n${USAGE}`);
|
||||
|
||||
const rawSecs = argv[0];
|
||||
if (rawSecs === undefined) throw usageError('missing <seconds>');
|
||||
// Accept a bare number or a GNU-style trailing `s` unit (the only unit callers
|
||||
// use). A blank/whitespace value is a USAGE ERROR — never a silent "no timer",
|
||||
// which would drop the wall-clock bound if a config value ever resolved to "".
|
||||
const secsText = String(rawSecs).trim().replace(/s$/, '');
|
||||
const secs = Number(secsText);
|
||||
if (secsText === '' || !Number.isFinite(secs) || secs < 0) {
|
||||
throw usageError(`invalid <seconds>: ${rawSecs}`);
|
||||
}
|
||||
|
||||
let i = 1;
|
||||
if (argv[i] === '--') i += 1; // optional POSIX end-of-options separator
|
||||
const cmd = argv[i];
|
||||
if (cmd === undefined) throw usageError('missing <command>');
|
||||
const cmdArgs = argv.slice(i + 1);
|
||||
|
||||
const isWin = process.platform === 'win32';
|
||||
// Detached (own process group) on POSIX so a timeout can reap the WHOLE tree —
|
||||
// a bare child.kill() misses grandchildren (e.g. a test runner's workers) and
|
||||
// would not actually bound the wall clock. Windows has no POSIX process
|
||||
// groups; a direct kill is the best portable option there.
|
||||
const detached = !isWin && secs > 0;
|
||||
const spawnFailureCode = (err) =>
|
||||
(err && err.code === 'ENOENT' ? 127 : err && err.code === 'EACCES' ? 126 : 125);
|
||||
// Node's setTimeout delay is a 32-bit signed ms int; a larger value silently
|
||||
// clamps to 1ms → a spurious immediate timeout. Cap the budget (~24.8 days).
|
||||
const timerMs = Math.min(Math.round(secs * 1000), 2 ** 31 - 1);
|
||||
|
||||
// Resolve with the numeric exit code — never process.exit() (banned by
|
||||
// n/no-process-exit). main() returns this code and runMain() maps it to
|
||||
// process.exitCode, so stdout/stderr flush and cleanup hooks still fire.
|
||||
return new Promise((resolve) => {
|
||||
let child;
|
||||
try {
|
||||
child = spawn(cmd, cmdArgs, { stdio: 'inherit', detached });
|
||||
} catch (err) {
|
||||
process.stderr.write(`run-with-timeout: ${cmd}: ${err && err.message ? err.message : 'failed to start'}\n`);
|
||||
resolve(spawnFailureCode(err));
|
||||
return;
|
||||
}
|
||||
|
||||
const killTree = (signal) => {
|
||||
try {
|
||||
if (detached && child.pid) {
|
||||
try { process.kill(-child.pid, signal); return; } catch { /* group already gone */ }
|
||||
}
|
||||
child.kill(signal);
|
||||
} catch { /* already exited */ }
|
||||
};
|
||||
|
||||
let timedOut = false;
|
||||
let killTimer = null;
|
||||
// Backstop SIGKILL for a descendant that traps SIGTERM. The child keeps the
|
||||
// event loop alive until this fires, so it stays ref'd (not unref'd).
|
||||
const armEscalation = () => {
|
||||
if (!killTimer) killTimer = setTimeout(() => killTree('SIGKILL'), 3000);
|
||||
};
|
||||
|
||||
const timer = secs > 0
|
||||
? setTimeout(() => { timedOut = true; killTree('SIGTERM'); armEscalation(); }, timerMs)
|
||||
: null;
|
||||
|
||||
// Forward an interrupt to the child tree rather than dying and orphaning it
|
||||
// (GNU `timeout` forwards received signals). Without this, SIGINT/SIGTERM to
|
||||
// the wrapper — Ctrl-C, CI cancellation — would leave the detached child
|
||||
// running unbounded with no supervisor left to enforce the cap.
|
||||
const onSignal = (sig) => { killTree(sig); armEscalation(); };
|
||||
const onSigint = () => onSignal('SIGINT');
|
||||
const onSigterm = () => onSignal('SIGTERM');
|
||||
process.on('SIGINT', onSigint);
|
||||
process.on('SIGTERM', onSigterm);
|
||||
|
||||
const finish = (exitCode) => {
|
||||
if (timer) clearTimeout(timer);
|
||||
if (killTimer) clearTimeout(killTimer);
|
||||
process.removeListener('SIGINT', onSigint);
|
||||
process.removeListener('SIGTERM', onSigterm);
|
||||
resolve(exitCode);
|
||||
};
|
||||
|
||||
child.on('error', (err) => {
|
||||
process.stderr.write(`run-with-timeout: ${cmd}: ${err && err.message ? err.message : 'failed to start'}\n`);
|
||||
finish(spawnFailureCode(err));
|
||||
});
|
||||
|
||||
child.on('exit', (code, signal) => {
|
||||
if (timedOut) {
|
||||
// The direct child exited on our SIGTERM, but a SIGTERM-trapping descendant
|
||||
// may still hold the inherited stdio — orphaning it would hang a captured
|
||||
// or piped gate. Reap the whole group SYNCHRONOUSLY here; the escalation
|
||||
// timer can't fire once we resolve and the loop drains.
|
||||
killTree('SIGKILL');
|
||||
finish(124); // matches GNU `timeout`
|
||||
return;
|
||||
}
|
||||
if (signal) {
|
||||
const num = os.constants.signals[signal] || 0;
|
||||
finish(num ? 128 + num : 1); // bash's 128+signum convention
|
||||
return;
|
||||
}
|
||||
finish(code == null ? 1 : code);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// ─── CLI Router ───────────────────────────────────────────────────────────────
|
||||
|
||||
async function main() {
|
||||
let args = process.argv.slice(2);
|
||||
|
||||
// #2351: run-with-timeout bounds a spawned command's wall clock portably
|
||||
// (coreutils-independent). It MUST intercept HERE, before the global-flag
|
||||
// parsing below — the wrapped command's argv is opaque and may itself contain
|
||||
// --raw / --cwd / --pick that this dispatcher would otherwise consume.
|
||||
{
|
||||
let rwt = args;
|
||||
if (rwt[0] === 'query') rwt = rwt.slice(1);
|
||||
if (rwt[0] === 'run-with-timeout') {
|
||||
// Return the child's exit code; runMain() maps it to process.exitCode.
|
||||
return runWithTimeout(rwt.slice(1));
|
||||
}
|
||||
}
|
||||
|
||||
// --json-errors / GSD_JSON_ERRORS=1: when active, error() emits structured
|
||||
// JSON ({ ok: false, reason: <ERROR_REASON code>, message }) to stderr
|
||||
// instead of "Error: <text>". Lets test suites assert on typed reason codes
|
||||
|
||||
@@ -474,7 +474,7 @@ npm run dev &
|
||||
DEV_SERVER_PID=$!
|
||||
|
||||
# Wait for ready (max 30s) — uses fetch() for cross-platform compatibility
|
||||
timeout 30 bash -c 'until node -e "fetch(\"http://localhost:3000\").then(r=>{process.exit(r.ok?0:1)}).catch(()=>process.exit(1))" 2>/dev/null; do sleep 1; done'
|
||||
gsd_run run-with-timeout 30 -- bash -c 'until node -e "fetch(\"http://localhost:3000\").then(r=>{process.exit(r.ok?0:1)}).catch(()=>process.exit(1))" 2>/dev/null; do sleep 1; done'
|
||||
```
|
||||
|
||||
**Port conflicts:** Kill stale process (`lsof -ti:3000 | xargs kill`) or use alternate port (`--port 3001`).
|
||||
|
||||
@@ -128,7 +128,7 @@ fi
|
||||
# timeout so a watch-mode runner cannot hang the audit gate indefinitely.
|
||||
AUDIT_TEST_CMD=$(gsd_run query normalize-test-command "$AUDIT_TEST_CMD" --cwd . 2>/dev/null || echo "$AUDIT_TEST_CMD")
|
||||
TEST_GATE_TIMEOUT=$(gsd_run query config-get workflow.test_gate_timeout 2>/dev/null || echo "600")
|
||||
timeout "$TEST_GATE_TIMEOUT" bash -c "$AUDIT_TEST_CMD" 2>&1 | tail -20
|
||||
gsd_run run-with-timeout "$TEST_GATE_TIMEOUT" -- bash -c "$AUDIT_TEST_CMD" 2>&1 | tail -20
|
||||
AUDIT_TEST_EXIT=${PIPESTATUS[0]}
|
||||
if [ "$AUDIT_TEST_EXIT" -eq 124 ]; then
|
||||
echo "✗ Audit test gate timed out after ${TEST_GATE_TIMEOUT}s — likely stuck in watch/dev mode (e.g. vitest without 'run'). Run tests one-shot (e.g. 'vitest run') or raise workflow.test_gate_timeout."
|
||||
|
||||
@@ -398,7 +398,7 @@ if [ \"$FALLOW_SCOPE\" = \"phase\" ]; then
|
||||
fi
|
||||
fi
|
||||
|
||||
timeout 120 \"$FALLOW_BIN\" audit --format json --quiet --max-crap \"$FALLOW_MAX_CRAP\" \"${FALLOW_SCOPE_ARGS[@]+\"${FALLOW_SCOPE_ARGS[@]}\"}\" > \"${FALLOW_JSON_PATH}.tmp\" 2>\"$FALLOW_STDERR_TMP\"
|
||||
gsd_run run-with-timeout 120 -- \"$FALLOW_BIN\" audit --format json --quiet --max-crap \"$FALLOW_MAX_CRAP\" \"${FALLOW_SCOPE_ARGS[@]+\"${FALLOW_SCOPE_ARGS[@]}\"}\" > \"${FALLOW_JSON_PATH}.tmp\" 2>\"$FALLOW_STDERR_TMP\"
|
||||
FALLOW_EXIT=$?
|
||||
|
||||
# fallow exits 0 (clean) or 1 (issues found) — BOTH are successful runs that produce a
|
||||
|
||||
@@ -403,7 +403,7 @@ CROSS_AI_TIMEOUT=$(gsd_run query config-get workflow.cross_ai_timeout 2>/dev/nul
|
||||
3. **Run the external command** from the project root, writing the prompt to stdin.
|
||||
Never shell-interpolate the prompt — always pipe via stdin to prevent injection:
|
||||
```bash
|
||||
echo "$TASK_PROMPT" | timeout "${CROSS_AI_TIMEOUT}s" ${CROSS_AI_CMD} > "$CANDIDATE_SUMMARY" 2>"$ERROR_LOG"
|
||||
echo "$TASK_PROMPT" | gsd_run run-with-timeout "${CROSS_AI_TIMEOUT}" -- ${CROSS_AI_CMD} > "$CANDIDATE_SUMMARY" 2>"$ERROR_LOG"
|
||||
EXIT_CODE=$?
|
||||
```
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ fi
|
||||
# Run build with 5-minute timeout
|
||||
BUILD_EXIT=0
|
||||
if [ -n "$BUILD_CMD" ]; then
|
||||
timeout 300 bash -c "$BUILD_CMD" 2>&1
|
||||
gsd_run run-with-timeout 300 -- bash -c "$BUILD_CMD" 2>&1
|
||||
BUILD_EXIT=$?
|
||||
if [ "${BUILD_EXIT}" -eq 0 ]; then
|
||||
echo "✓ Post-merge build gate passed"
|
||||
@@ -100,7 +100,7 @@ fi
|
||||
TEST_CMD=$(gsd_run query normalize-test-command "$TEST_CMD" --cwd . 2>/dev/null || echo "$TEST_CMD")
|
||||
TEST_GATE_TIMEOUT=$(gsd_run query config-get workflow.test_gate_timeout 2>/dev/null || echo "600")
|
||||
TEST_EXIT=0
|
||||
timeout "$TEST_GATE_TIMEOUT" bash -c "$TEST_CMD" 2>&1
|
||||
gsd_run run-with-timeout "$TEST_GATE_TIMEOUT" -- bash -c "$TEST_CMD" 2>&1
|
||||
TEST_EXIT=$?
|
||||
if [ "${TEST_EXIT}" -eq 0 ]; then
|
||||
echo "✓ Post-merge test gate passed — no cross-plan conflicts"
|
||||
|
||||
@@ -32,7 +32,7 @@ fi
|
||||
# with a timeout so a watch-mode runner cannot hang the gate indefinitely.
|
||||
REG_TEST_CMD=$(gsd_run query normalize-test-command "$REG_TEST_CMD" --cwd . 2>/dev/null || echo "$REG_TEST_CMD")
|
||||
TEST_GATE_TIMEOUT=$(gsd_run query config-get workflow.test_gate_timeout 2>/dev/null || echo "600")
|
||||
timeout "$TEST_GATE_TIMEOUT" bash -c "$REG_TEST_CMD" 2>&1
|
||||
gsd_run run-with-timeout "$TEST_GATE_TIMEOUT" -- bash -c "$REG_TEST_CMD" 2>&1
|
||||
REG_TEST_EXIT=$?
|
||||
if [ "$REG_TEST_EXIT" -eq 124 ]; then
|
||||
echo "✗ REGRESSION GATE ABORTED — test runner did not exit within ${TEST_GATE_TIMEOUT}s, likely stuck in watch/dev mode (e.g. vitest without 'run'). Run tests one-shot (e.g. 'vitest run'), set workflow.test_command, or raise workflow.test_gate_timeout."
|
||||
|
||||
@@ -328,7 +328,7 @@ If `REVIEW_CMD` is non-empty and not `"null"`, run the external review:
|
||||
# ship runs — same or different phase, same or different project — never
|
||||
# clobber or read each other's stderr. Portable via ${TMPDIR:-/tmp}.
|
||||
REVIEW_STDERR_FILE=$(mktemp "${TMPDIR:-/tmp}/gsd-review-stderr-XXXXXX")
|
||||
REVIEW_OUTPUT=$(echo "${REVIEW_PROMPT}" | timeout 120 ${REVIEW_CMD} 2>"${REVIEW_STDERR_FILE}")
|
||||
REVIEW_OUTPUT=$(echo "${REVIEW_PROMPT}" | gsd_run run-with-timeout 120 -- ${REVIEW_CMD} 2>"${REVIEW_STDERR_FILE}")
|
||||
REVIEW_EXIT=$?
|
||||
```
|
||||
|
||||
|
||||
@@ -291,7 +291,7 @@ fi
|
||||
# Run all tests (timeout: 5 min). #1857: normalize to one-shot so watch mode exits.
|
||||
TEST_CMD=$(gsd_run query normalize-test-command "$TEST_CMD" --cwd . 2>/dev/null || echo "$TEST_CMD")
|
||||
TEST_EXIT=0
|
||||
timeout 300 bash -c "$TEST_CMD" 2>&1
|
||||
gsd_run run-with-timeout 300 -- bash -c "$TEST_CMD" 2>&1
|
||||
TEST_EXIT=$?
|
||||
if [ "${TEST_EXIT}" -eq 0 ]; then
|
||||
echo "✓ Test suite passed"
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
"lint": "eslint . --cache --cache-location node_modules/.cache/eslint/",
|
||||
"lint:fix": "eslint . --fix",
|
||||
"lint:table-schema-drift": "node scripts/lint-table-schema-drift.cjs",
|
||||
"lint:ci": "npm run lint && npm run lint:skill-deps && npm run lint:generated-sync && node scripts/lint-test-file-count.cjs && node scripts/lint-command-contract.cjs && node scripts/lint-pr-check-project-dir.cjs && npm run lint:legacy-name && node scripts/lint-regression-test-names.cjs && node scripts/lint-allow-test-rule-refs.cjs && node scripts/lint-resolution-provenance.cjs && node scripts/validate-registry.cjs && node scripts/lint-table-schema-drift.cjs",
|
||||
"lint:ci": "npm run lint && npm run lint:skill-deps && npm run lint:generated-sync && node scripts/lint-test-file-count.cjs && node scripts/lint-command-contract.cjs && node scripts/lint-pr-check-project-dir.cjs && npm run lint:legacy-name && node scripts/lint-regression-test-names.cjs && node scripts/lint-allow-test-rule-refs.cjs && node scripts/lint-resolution-provenance.cjs && node scripts/lint-portable-timeout.cjs && node scripts/validate-registry.cjs && node scripts/lint-table-schema-drift.cjs",
|
||||
"lint:allow-test-rule-refs": "node scripts/lint-allow-test-rule-refs.cjs",
|
||||
"lint:regression-names": "node scripts/lint-regression-test-names.cjs",
|
||||
"lint:descriptions": "node scripts/lint-descriptions.cjs",
|
||||
|
||||
140
scripts/lint-portable-timeout.cjs
Normal file
140
scripts/lint-portable-timeout.cjs
Normal file
@@ -0,0 +1,140 @@
|
||||
#!/usr/bin/env node
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* lint-portable-timeout.cjs — ban hardcoded GNU-`timeout` in gsd
|
||||
* workflow / agent / reference / command markdown (#2351).
|
||||
*
|
||||
* ## Why
|
||||
*
|
||||
* `timeout` and `gtimeout` are GNU coreutils. Stock macOS ships NEITHER
|
||||
* (`brew install coreutils` only provides `gtimeout`, and only if installed).
|
||||
* A hardcoded `timeout <n> <cmd>` inside an executable workflow snippet exits
|
||||
* 127 ("command not found") on such a host, and the gate that runs it — which
|
||||
* only distinguishes 0 (pass) / 124 (timeout) / other (fail) — misreports a
|
||||
* perfectly good build or test command as a FAILURE (#2351).
|
||||
*
|
||||
* The portable, coreutils-independent replacement is the
|
||||
* `gsd_run run-with-timeout <secs> [--] <cmd…>` verb (gsd-core/bin/gsd-tools.cjs):
|
||||
* a Node-based wall-clock cap that keeps GNU `timeout`'s exit-code contract
|
||||
* (124 on timeout) on every platform. The resolution lives there ONCE and is
|
||||
* reused by every call site instead of a per-file `command -v timeout` probe.
|
||||
*
|
||||
* This ratchet fails the build if a NEW bare `timeout`/`gtimeout` execution
|
||||
* slips into any of these surfaces.
|
||||
*
|
||||
* ## What PASSES
|
||||
*
|
||||
* - `gsd_run run-with-timeout 300 -- bash -c "$CMD"` — the approved verb.
|
||||
* - `command -v timeout` / `command -v gtimeout` / `which timeout` capability
|
||||
* PROBES — portable: they detect the binary, they do not unconditionally
|
||||
* execute it (see gsd-core/workflows/review.md's `_AGY_KILLER` fallback).
|
||||
* - Prose ("timed out after 5 minutes"), config keys
|
||||
* (`workflow.test_gate_timeout`), CI `timeout-minutes:`, the agy
|
||||
* `--print-timeout` flag, `$TIMEOUT`-style variable names — none of which is
|
||||
* a bare timeout command invocation.
|
||||
*
|
||||
* ## What FAILS
|
||||
*
|
||||
* A bare `timeout <duration> …` / `gtimeout <duration> …` command invocation,
|
||||
* where `<duration>` is a number, a `"$VAR"`, or a `${VAR}` (optionally with a
|
||||
* leading `-k`/`-s` option).
|
||||
*/
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const { ExitError, runMain } = require('./lib/cli-exit.cjs');
|
||||
|
||||
const ROOT = path.join(__dirname, '..');
|
||||
|
||||
// Surfaces whose markdown carries agent-executed bash. Kept broad so the guard
|
||||
// catches a regression anywhere a workflow snippet could bound a command.
|
||||
const DEFAULT_ROOTS = ['gsd-core/workflows', 'gsd-core/references', 'agents', 'commands'];
|
||||
|
||||
// Capability probes to strip BEFORE testing for an invocation, so a portable
|
||||
// `command -v timeout` on the same line is never mistaken for a bare execution.
|
||||
const PROBE_RE = /command\s+-v\s+g?timeout|which\s+g?timeout/g;
|
||||
|
||||
// A `timeout`/`gtimeout` token INVOKED AS A COMMAND with a duration argument.
|
||||
// Anchored to a command position — line start or right after `| & ; ( ` {` — so
|
||||
// prose ("increase the timeout 30 seconds") and the `--print-timeout` flag / the
|
||||
// approved `run-with-timeout` verb (no separator before "timeout") never match.
|
||||
// Between the token and the duration, allow any number of leading options in
|
||||
// short OR long form (`-k5`, `-k 5`, `--kill-after=5`, `--foreground`,
|
||||
// `--signal=KILL`). The duration is a digit, `$((arith))`, a `$VAR`, or `${VAR}`.
|
||||
const EXEC_RE = /(?:^|[|&;(`{])[ \t]*g?timeout[ \t]+(?:-{1,2}[\w-]+(?:=\S+)?[ \t]+)*["']?(?:\$\{?[A-Za-z_]|\$\(\(|\d)/;
|
||||
|
||||
/**
|
||||
* Locate bare `timeout`/`gtimeout` invocations in a block of text.
|
||||
*
|
||||
* Pure (no I/O): callers pass the file contents; the caller reads files. Returns
|
||||
* structured findings so tests assert on typed values, never on grepped text.
|
||||
*
|
||||
* @param {string} text file contents
|
||||
* @returns {{ line: number, snippet: string }[]} findings (empty array = clean)
|
||||
*/
|
||||
function findRawTimeoutInvocations(text) {
|
||||
const findings = [];
|
||||
const lines = String(text).split(/\r?\n/);
|
||||
for (let i = 0; i < lines.length; i += 1) {
|
||||
const stripped = lines[i].replace(PROBE_RE, '');
|
||||
if (EXEC_RE.test(stripped)) findings.push({ line: i + 1, snippet: lines[i].trim() });
|
||||
}
|
||||
return findings;
|
||||
}
|
||||
|
||||
function walkMarkdown(dir) {
|
||||
const out = [];
|
||||
let entries;
|
||||
try {
|
||||
entries = fs.readdirSync(dir, { withFileTypes: true });
|
||||
} catch {
|
||||
return out; // a missing root is not an error — some surfaces are optional
|
||||
}
|
||||
for (const entry of entries) {
|
||||
const full = path.join(dir, entry.name);
|
||||
if (entry.isDirectory()) out.push(...walkMarkdown(full));
|
||||
else if (entry.isFile() && entry.name.endsWith('.md')) out.push(full);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
/**
|
||||
* Scan the given roots (repo-relative) for bare timeout invocations.
|
||||
* @param {string[]} roots
|
||||
* @returns {{ file: string, line: number, snippet: string }[]}
|
||||
*/
|
||||
function scan(roots = DEFAULT_ROOTS) {
|
||||
const offenders = [];
|
||||
for (const rel of roots) {
|
||||
const abs = path.isAbsolute(rel) ? rel : path.join(ROOT, rel);
|
||||
for (const file of walkMarkdown(abs)) {
|
||||
const findings = findRawTimeoutInvocations(fs.readFileSync(file, 'utf8'));
|
||||
for (const f of findings) {
|
||||
offenders.push({ file: path.relative(ROOT, file), line: f.line, snippet: f.snippet });
|
||||
}
|
||||
}
|
||||
}
|
||||
return offenders;
|
||||
}
|
||||
|
||||
function main() {
|
||||
const rootsEnv = process.env.GSD_LINT_PORTABLE_TIMEOUT_ROOTS;
|
||||
const roots = rootsEnv ? rootsEnv.split(path.delimiter).filter(Boolean) : DEFAULT_ROOTS;
|
||||
const offenders = scan(roots);
|
||||
if (offenders.length > 0) {
|
||||
const detail = offenders.map((o) => ` ${o.file}:${o.line} ${o.snippet}`).join('\n');
|
||||
throw new ExitError(
|
||||
1,
|
||||
'lint-portable-timeout: hardcoded `timeout`/`gtimeout` is not portable — stock\n' +
|
||||
'macOS ships no coreutils, so these exit 127 and misreport a passing command as a\n' +
|
||||
'failure. Use `gsd_run run-with-timeout <secs> [--] <cmd…>` instead (#2351):\n' +
|
||||
detail,
|
||||
);
|
||||
}
|
||||
console.log(`ok lint-portable-timeout: no hardcoded timeout invocations in ${roots.length} root(s)`);
|
||||
}
|
||||
|
||||
module.exports = { findRawTimeoutInvocations, scan, DEFAULT_ROOTS };
|
||||
|
||||
if (require.main === module) runMain(main);
|
||||
@@ -32,5 +32,5 @@
|
||||
"gsd-ui-checker.md": 14118,
|
||||
"gsd-ui-researcher.md": 19557,
|
||||
"gsd-user-profiler.md": 8516,
|
||||
"gsd-verifier.md": 49147
|
||||
"gsd-verifier.md": 49140
|
||||
}
|
||||
|
||||
@@ -34,12 +34,12 @@
|
||||
"agents/gsd-ui-checker.md": "216af34b01e277aa",
|
||||
"agents/gsd-ui-researcher.md": "5f86de1decbd16d2",
|
||||
"agents/gsd-user-profiler.md": "25d65f6458454764",
|
||||
"agents/gsd-verifier.md": "224e8df2d8fd1d95",
|
||||
"agents/gsd-verifier.md": "134de2aa70d323b4",
|
||||
"gsd-core/.gsd-runtime": "54e851f5dd76ba94",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "ea841e2865248e74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "0a2fc4e226f009c5",
|
||||
"gsd-core/bin/gsd-tools.cjs": "2fcf88250beb9214",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0",
|
||||
@@ -56,7 +56,7 @@
|
||||
"gsd-core/references/api-coverage.md": "205a43c5fa7c221c",
|
||||
"gsd-core/references/artifact-types.md": "e176817364a7cbf4",
|
||||
"gsd-core/references/autonomous-smart-discuss.md": "efd80aca449032ad",
|
||||
"gsd-core/references/checkpoints.md": "509700508de43306",
|
||||
"gsd-core/references/checkpoints.md": "130bb6ef705fc065",
|
||||
"gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29",
|
||||
"gsd-core/references/context-budget.md": "177520ead2ae3a23",
|
||||
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
|
||||
@@ -212,14 +212,14 @@
|
||||
"gsd-core/workflows/add-todo.md": "e410a72c168e43c0",
|
||||
"gsd-core/workflows/ai-integration-phase.md": "ea5a229a9cad3b4d",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "582e9a31df15dd8b",
|
||||
"gsd-core/workflows/audit-fix.md": "68d2133e0d483905",
|
||||
"gsd-core/workflows/audit-milestone.md": "280cd85908dd45cb",
|
||||
"gsd-core/workflows/audit-uat.md": "ea8ddd910ed16ba4",
|
||||
"gsd-core/workflows/autonomous.md": "603ce2019835f00e",
|
||||
"gsd-core/workflows/check-todos.md": "5a62092df800ad7c",
|
||||
"gsd-core/workflows/cleanup.md": "12c8fd85d3010fe6",
|
||||
"gsd-core/workflows/code-review-fix.md": "60640e633b0a124b",
|
||||
"gsd-core/workflows/code-review.md": "2d9943e121908327",
|
||||
"gsd-core/workflows/code-review.md": "1a72ce22df16b3fa",
|
||||
"gsd-core/workflows/complete-milestone.md": "aaf272074acec69d",
|
||||
"gsd-core/workflows/debug.md": "0b802b267d0ca2d1",
|
||||
"gsd-core/workflows/diagnose-issues.md": "c8c41993c277363c",
|
||||
@@ -243,11 +243,11 @@
|
||||
"gsd-core/workflows/docs-update.md": "8e986e26d0e6e1a0",
|
||||
"gsd-core/workflows/edit-phase.md": "fc932e82ba1f585a",
|
||||
"gsd-core/workflows/eval-review.md": "eb4040eaa5b8497f",
|
||||
"gsd-core/workflows/execute-phase.md": "e35fc8cb7e4b2097",
|
||||
"gsd-core/workflows/execute-phase.md": "8c06d5d57f2adaa7",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "55d0706e80a2554a",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "5e9635a80ca6c3a5",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "3c66870732e77709",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "13aa54f8279960ae",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "476f88892510a09e",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "b5eec9e33626aefa",
|
||||
"gsd-core/workflows/explore.md": "934c00f9f216dbdb",
|
||||
@@ -302,7 +302,7 @@
|
||||
"gsd-core/workflows/settings-advanced.md": "6d25100a9de15b31",
|
||||
"gsd-core/workflows/settings-integrations.md": "4d3001ad2b5dad8f",
|
||||
"gsd-core/workflows/settings.md": "8258f7bd3700d608",
|
||||
"gsd-core/workflows/ship.md": "782e5998a4257acf",
|
||||
"gsd-core/workflows/ship.md": "8575dcc6d75a17c5",
|
||||
"gsd-core/workflows/sketch-wrap-up.md": "0f842a609851a401",
|
||||
"gsd-core/workflows/sketch.md": "314b7d323c6b57eb",
|
||||
"gsd-core/workflows/smart-entry.md": "3ce5b6228238fdb6",
|
||||
@@ -319,7 +319,7 @@
|
||||
"gsd-core/workflows/undo.md": "6ab639d1fc7e0721",
|
||||
"gsd-core/workflows/update.md": "2c58df5e21c41c31",
|
||||
"gsd-core/workflows/validate-phase.md": "ae3f0180a2316fcd",
|
||||
"gsd-core/workflows/verify-phase.md": "20503ec39197757b",
|
||||
"gsd-core/workflows/verify-phase.md": "913acaef091797d7",
|
||||
"gsd-core/workflows/verify-work.md": "59276d94999ee022",
|
||||
"hooks/gsd-check-update-worker.js": "fa301e6366270d5f",
|
||||
"hooks/gsd-check-update.js": "4617a98bf529e4c3",
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
"agents/gsd-ui-checker.md": "5c27ec0d88ef87c2",
|
||||
"agents/gsd-ui-researcher.md": "bcc591f2dfebdb60",
|
||||
"agents/gsd-user-profiler.md": "622220df0654b6bf",
|
||||
"agents/gsd-verifier.md": "f5c00a9b08fc1a7e",
|
||||
"agents/gsd-verifier.md": "b310112ee195819b",
|
||||
"commands/gsd-add-tests.md": "3608d0cf4b515103",
|
||||
"commands/gsd-ai-integration-phase.md": "cbc59ad7a5064b26",
|
||||
"commands/gsd-audit-fix.md": "1b805946362c4f19",
|
||||
@@ -110,7 +110,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
|
||||
"gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3",
|
||||
"gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0",
|
||||
@@ -127,7 +127,7 @@
|
||||
"gsd-core/references/api-coverage.md": "66264d41dfd9154a",
|
||||
"gsd-core/references/artifact-types.md": "a6d2e1f9453ffbf5",
|
||||
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
|
||||
"gsd-core/references/checkpoints.md": "b1530628d693fc85",
|
||||
"gsd-core/references/checkpoints.md": "c2fe89c42ca88349",
|
||||
"gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29",
|
||||
"gsd-core/references/context-budget.md": "f1ce57bf418824af",
|
||||
"gsd-core/references/continuation-format.md": "ce73e57d053ab8a7",
|
||||
@@ -283,14 +283,14 @@
|
||||
"gsd-core/workflows/add-todo.md": "953314cdfef56bc4",
|
||||
"gsd-core/workflows/ai-integration-phase.md": "45c727e49de71636",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "52942af10f140717",
|
||||
"gsd-core/workflows/audit-fix.md": "ca751f6538c8f496",
|
||||
"gsd-core/workflows/audit-fix.md": "d511f4094ce351aa",
|
||||
"gsd-core/workflows/audit-milestone.md": "3835762c3147a927",
|
||||
"gsd-core/workflows/audit-uat.md": "fcfbec501620b564",
|
||||
"gsd-core/workflows/autonomous.md": "7e5683728ef33707",
|
||||
"gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc",
|
||||
"gsd-core/workflows/cleanup.md": "0daa2f2720c111f1",
|
||||
"gsd-core/workflows/code-review-fix.md": "2e113d1f4350a075",
|
||||
"gsd-core/workflows/code-review.md": "2aa1957579f50a87",
|
||||
"gsd-core/workflows/code-review.md": "c877ad812b4a511e",
|
||||
"gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2",
|
||||
"gsd-core/workflows/debug.md": "98c8ed5af882ef8f",
|
||||
"gsd-core/workflows/diagnose-issues.md": "6cc3900891dfb927",
|
||||
@@ -314,11 +314,11 @@
|
||||
"gsd-core/workflows/docs-update.md": "f35922d15b7061c9",
|
||||
"gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04",
|
||||
"gsd-core/workflows/eval-review.md": "f898936e2cfe4130",
|
||||
"gsd-core/workflows/execute-phase.md": "c18baf04228abf68",
|
||||
"gsd-core/workflows/execute-phase.md": "4b21d07643d1647a",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "83cb02952b514bd8",
|
||||
"gsd-core/workflows/explore.md": "6c04f2e658d93261",
|
||||
@@ -373,7 +373,7 @@
|
||||
"gsd-core/workflows/settings-advanced.md": "414db4dbea97ba44",
|
||||
"gsd-core/workflows/settings-integrations.md": "70515c5838fb9826",
|
||||
"gsd-core/workflows/settings.md": "d96ddf01fb85e61e",
|
||||
"gsd-core/workflows/ship.md": "f486f2731ca8b72a",
|
||||
"gsd-core/workflows/ship.md": "369f1461685d1897",
|
||||
"gsd-core/workflows/sketch-wrap-up.md": "5f5ebb6a80d610c6",
|
||||
"gsd-core/workflows/sketch.md": "8319cedf3f93fc35",
|
||||
"gsd-core/workflows/smart-entry.md": "449238eb94abe187",
|
||||
@@ -390,7 +390,7 @@
|
||||
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
|
||||
"gsd-core/workflows/update.md": "fd160e13f8b7e83c",
|
||||
"gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607",
|
||||
"gsd-core/workflows/verify-phase.md": "499a0ade5e21fe6f",
|
||||
"gsd-core/workflows/verify-phase.md": "d26a2c3269340caf",
|
||||
"gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3",
|
||||
"hooks/gsd-check-update-worker.js": "cc1ef5f840f9dfc9",
|
||||
"hooks/gsd-check-update.js": "7b3a7983d5f1f5d3",
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
"agents/gsd-ui-checker.md": "33ffdc73d2105a24",
|
||||
"agents/gsd-ui-researcher.md": "4b36852c839f1134",
|
||||
"agents/gsd-user-profiler.md": "d40584599906f3b7",
|
||||
"agents/gsd-verifier.md": "628ef3a944a7a6eb",
|
||||
"agents/gsd-verifier.md": "5280f380566a4eb6",
|
||||
"commands/gsd-add-tests.md": "057e3e440989e681",
|
||||
"commands/gsd-ai-integration-phase.md": "e1f1e0bd6c50506d",
|
||||
"commands/gsd-audit-fix.md": "ebdcc267a2bebaab",
|
||||
@@ -109,7 +109,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
|
||||
"gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3",
|
||||
"gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0",
|
||||
@@ -126,7 +126,7 @@
|
||||
"gsd-core/references/api-coverage.md": "205a43c5fa7c221c",
|
||||
"gsd-core/references/artifact-types.md": "251040866a3a1818",
|
||||
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
|
||||
"gsd-core/references/checkpoints.md": "b1530628d693fc85",
|
||||
"gsd-core/references/checkpoints.md": "c2fe89c42ca88349",
|
||||
"gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29",
|
||||
"gsd-core/references/context-budget.md": "6bfac08025ea3106",
|
||||
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
|
||||
@@ -282,14 +282,14 @@
|
||||
"gsd-core/workflows/add-todo.md": "0a0f4d718ea50bea",
|
||||
"gsd-core/workflows/ai-integration-phase.md": "462b75ae916e2793",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "b441993d57cf83bc",
|
||||
"gsd-core/workflows/audit-fix.md": "f03266102d4ee978",
|
||||
"gsd-core/workflows/audit-milestone.md": "ae8605b4ecc37c0b",
|
||||
"gsd-core/workflows/audit-uat.md": "1c4a02a8c1ab930f",
|
||||
"gsd-core/workflows/autonomous.md": "6adf957e64518d15",
|
||||
"gsd-core/workflows/check-todos.md": "8f2c6b27f18cc5e2",
|
||||
"gsd-core/workflows/cleanup.md": "bfbab4b981d39544",
|
||||
"gsd-core/workflows/code-review-fix.md": "78c716068ccdf820",
|
||||
"gsd-core/workflows/code-review.md": "595f0d9c7f475809",
|
||||
"gsd-core/workflows/code-review.md": "7db21e884906595e",
|
||||
"gsd-core/workflows/complete-milestone.md": "9962377cddee50d7",
|
||||
"gsd-core/workflows/debug.md": "80c413b3a9877433",
|
||||
"gsd-core/workflows/diagnose-issues.md": "db6a599674efbc4d",
|
||||
@@ -313,11 +313,11 @@
|
||||
"gsd-core/workflows/docs-update.md": "cd753783ab95da00",
|
||||
"gsd-core/workflows/edit-phase.md": "dbbb6191f5a8b65e",
|
||||
"gsd-core/workflows/eval-review.md": "086a1f2b3c11462c",
|
||||
"gsd-core/workflows/execute-phase.md": "e4babdc61b00b387",
|
||||
"gsd-core/workflows/execute-phase.md": "fcd7aaeb14e5880d",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "6d38bfd540030da4",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "e5d65c3a0ae0ed2a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "ccd95645902f57af",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "a7f9b9a45303382f",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "b14d7fa2c4ec2406",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "587757b937368212",
|
||||
"gsd-core/workflows/explore.md": "95e463d4bdd6dadd",
|
||||
@@ -372,7 +372,7 @@
|
||||
"gsd-core/workflows/settings-advanced.md": "94d61da368e9f85b",
|
||||
"gsd-core/workflows/settings-integrations.md": "dfe3672c4fabf139",
|
||||
"gsd-core/workflows/settings.md": "acdd79110699a608",
|
||||
"gsd-core/workflows/ship.md": "3a0262c1197cf2f8",
|
||||
"gsd-core/workflows/ship.md": "cae3fbefba655818",
|
||||
"gsd-core/workflows/sketch-wrap-up.md": "d52a5462bafda830",
|
||||
"gsd-core/workflows/sketch.md": "dbe6acc4d976060c",
|
||||
"gsd-core/workflows/smart-entry.md": "1850447c045f36d8",
|
||||
@@ -389,7 +389,7 @@
|
||||
"gsd-core/workflows/undo.md": "d759702f84e308fa",
|
||||
"gsd-core/workflows/update.md": "2a59b4edf4a3c8c7",
|
||||
"gsd-core/workflows/validate-phase.md": "3150904744b4a1bd",
|
||||
"gsd-core/workflows/verify-phase.md": "05f5370a02941f39",
|
||||
"gsd-core/workflows/verify-phase.md": "90773de32a966c85",
|
||||
"gsd-core/workflows/verify-work.md": "de14acdc8e925338",
|
||||
"hooks/gsd-check-update-worker.js": "a530efdb5fdc0da3",
|
||||
"hooks/gsd-check-update.js": "25cde66a12d6b886",
|
||||
|
||||
20
tests/fixtures/golden-install-parity/claude.json
vendored
20
tests/fixtures/golden-install-parity/claude.json
vendored
@@ -33,12 +33,12 @@
|
||||
"agents/gsd-ui-checker.md": "8126405043f99cb6",
|
||||
"agents/gsd-ui-researcher.md": "9e3ac030767167e0",
|
||||
"agents/gsd-user-profiler.md": "003276f85792cfda",
|
||||
"agents/gsd-verifier.md": "2271174b5aa20e31",
|
||||
"agents/gsd-verifier.md": "d1fe290d4673e379",
|
||||
"gsd-core/.gsd-runtime": "98038b25280788a4",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
|
||||
"gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3",
|
||||
"gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0",
|
||||
@@ -55,7 +55,7 @@
|
||||
"gsd-core/references/api-coverage.md": "205a43c5fa7c221c",
|
||||
"gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e",
|
||||
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
|
||||
"gsd-core/references/checkpoints.md": "b1530628d693fc85",
|
||||
"gsd-core/references/checkpoints.md": "c2fe89c42ca88349",
|
||||
"gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29",
|
||||
"gsd-core/references/context-budget.md": "533eae480bfc4bb8",
|
||||
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
|
||||
@@ -211,14 +211,14 @@
|
||||
"gsd-core/workflows/add-todo.md": "2c5176263ad4ae8f",
|
||||
"gsd-core/workflows/ai-integration-phase.md": "a280593ad22fc9a3",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "ca751f6538c8f496",
|
||||
"gsd-core/workflows/audit-fix.md": "d511f4094ce351aa",
|
||||
"gsd-core/workflows/audit-milestone.md": "9f8ec364e58d5710",
|
||||
"gsd-core/workflows/audit-uat.md": "e11db0d74c2a7405",
|
||||
"gsd-core/workflows/autonomous.md": "722397c04272dfaa",
|
||||
"gsd-core/workflows/check-todos.md": "6c2a43d1d3e86589",
|
||||
"gsd-core/workflows/cleanup.md": "0daa2f2720c111f1",
|
||||
"gsd-core/workflows/code-review-fix.md": "722416b71b31c5fc",
|
||||
"gsd-core/workflows/code-review.md": "14682c0ba32d5dc6",
|
||||
"gsd-core/workflows/code-review.md": "3fd49c93357fe4f7",
|
||||
"gsd-core/workflows/complete-milestone.md": "dcf1182398efb1ca",
|
||||
"gsd-core/workflows/debug.md": "b4c658c9608d08e2",
|
||||
"gsd-core/workflows/diagnose-issues.md": "75ffc381ac3059ff",
|
||||
@@ -242,11 +242,11 @@
|
||||
"gsd-core/workflows/docs-update.md": "63082608d3ae92be",
|
||||
"gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a",
|
||||
"gsd-core/workflows/eval-review.md": "f59e8329dae1e528",
|
||||
"gsd-core/workflows/execute-phase.md": "7f2b133debb7b88f",
|
||||
"gsd-core/workflows/execute-phase.md": "132c985f8dbd766b",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "facb0e816d87a0c7",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "bc1c2a159117642c",
|
||||
"gsd-core/workflows/explore.md": "b9eea1bac358c9ce",
|
||||
@@ -301,7 +301,7 @@
|
||||
"gsd-core/workflows/settings-advanced.md": "339def28c34b0797",
|
||||
"gsd-core/workflows/settings-integrations.md": "53649313d20694ae",
|
||||
"gsd-core/workflows/settings.md": "7e7458cdb2b68ec5",
|
||||
"gsd-core/workflows/ship.md": "cc8428f393c44f67",
|
||||
"gsd-core/workflows/ship.md": "f777449b79ee3357",
|
||||
"gsd-core/workflows/sketch-wrap-up.md": "121ed4b8127abf04",
|
||||
"gsd-core/workflows/sketch.md": "737c0492686fea2d",
|
||||
"gsd-core/workflows/smart-entry.md": "ad20cf74ae2e8291",
|
||||
@@ -318,7 +318,7 @@
|
||||
"gsd-core/workflows/undo.md": "791e0bf96d9a057f",
|
||||
"gsd-core/workflows/update.md": "f9e7d8a760d0d3c8",
|
||||
"gsd-core/workflows/validate-phase.md": "7a3db6ab8ce9f380",
|
||||
"gsd-core/workflows/verify-phase.md": "b321551a82bc7c2f",
|
||||
"gsd-core/workflows/verify-phase.md": "b8cca6ef3be502b9",
|
||||
"gsd-core/workflows/verify-work.md": "c8ffee621e7319de",
|
||||
"hooks/gsd-check-update-worker.js": "a530efdb5fdc0da3",
|
||||
"hooks/gsd-check-update.js": "25cde66a12d6b886",
|
||||
|
||||
20
tests/fixtures/golden-install-parity/cline.json
vendored
20
tests/fixtures/golden-install-parity/cline.json
vendored
@@ -37,12 +37,12 @@
|
||||
"agents/gsd-ui-checker.md": "151d12b4e007cbbf",
|
||||
"agents/gsd-ui-researcher.md": "1bb303f3a3c4dfc9",
|
||||
"agents/gsd-user-profiler.md": "622220df0654b6bf",
|
||||
"agents/gsd-verifier.md": "75912e9cadd83eb3",
|
||||
"agents/gsd-verifier.md": "403502d1071ef8df",
|
||||
"gsd-core/.gsd-runtime": "98d4891544955482",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "476aa24e8c4f03cf",
|
||||
"gsd-core/bin/gsd-tools.cjs": "0f718645418266a8",
|
||||
"gsd-core/bin/gsd-tools.cjs": "81330ef8b3bb63c1",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0",
|
||||
@@ -59,7 +59,7 @@
|
||||
"gsd-core/references/api-coverage.md": "66264d41dfd9154a",
|
||||
"gsd-core/references/artifact-types.md": "a6d2e1f9453ffbf5",
|
||||
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
|
||||
"gsd-core/references/checkpoints.md": "4919e8aa1130fb04",
|
||||
"gsd-core/references/checkpoints.md": "f66fb7d5b435682d",
|
||||
"gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29",
|
||||
"gsd-core/references/context-budget.md": "c154ba00dbbf4477",
|
||||
"gsd-core/references/continuation-format.md": "ce73e57d053ab8a7",
|
||||
@@ -215,14 +215,14 @@
|
||||
"gsd-core/workflows/add-todo.md": "aa89018230c87f13",
|
||||
"gsd-core/workflows/ai-integration-phase.md": "878d0a2c6eb08c88",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "52942af10f140717",
|
||||
"gsd-core/workflows/audit-fix.md": "d6a41fc6879424f8",
|
||||
"gsd-core/workflows/audit-fix.md": "635168ce87774bd4",
|
||||
"gsd-core/workflows/audit-milestone.md": "202b726748604c93",
|
||||
"gsd-core/workflows/audit-uat.md": "1fb7b2ab9d587c8f",
|
||||
"gsd-core/workflows/autonomous.md": "cc5217b1b2238a4c",
|
||||
"gsd-core/workflows/check-todos.md": "32fdf33f5dc8bdde",
|
||||
"gsd-core/workflows/cleanup.md": "b0ebfc48792b407b",
|
||||
"gsd-core/workflows/code-review-fix.md": "e4549af672e74e6f",
|
||||
"gsd-core/workflows/code-review.md": "2f9cacacbc862af3",
|
||||
"gsd-core/workflows/code-review.md": "e2bfb4267041812a",
|
||||
"gsd-core/workflows/complete-milestone.md": "c0808127038a8f86",
|
||||
"gsd-core/workflows/debug.md": "870682af53182a6c",
|
||||
"gsd-core/workflows/diagnose-issues.md": "e616d0d730328d68",
|
||||
@@ -246,11 +246,11 @@
|
||||
"gsd-core/workflows/docs-update.md": "39f288623a8f6f32",
|
||||
"gsd-core/workflows/edit-phase.md": "9c9fadc047c61d74",
|
||||
"gsd-core/workflows/eval-review.md": "3e1d7829ed2ed494",
|
||||
"gsd-core/workflows/execute-phase.md": "2b087f64c9fa112c",
|
||||
"gsd-core/workflows/execute-phase.md": "678e84b47fe9024f",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "67ebc93f51968cb6",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "27505ecd7d5b4e57",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "91eac50d2e1f5a2f",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "35612890c1173577",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "26825e1aacf224d0",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "0db7b9db6454f380",
|
||||
"gsd-core/workflows/explore.md": "e83af8ceae314cf9",
|
||||
@@ -305,7 +305,7 @@
|
||||
"gsd-core/workflows/settings-advanced.md": "69f3a19bf2c61160",
|
||||
"gsd-core/workflows/settings-integrations.md": "76eee76d6eb57657",
|
||||
"gsd-core/workflows/settings.md": "3701faed09d55247",
|
||||
"gsd-core/workflows/ship.md": "416cfe6c07694753",
|
||||
"gsd-core/workflows/ship.md": "a58d05ab03124d0b",
|
||||
"gsd-core/workflows/sketch-wrap-up.md": "1f44789553180d84",
|
||||
"gsd-core/workflows/sketch.md": "2226779b6003a71c",
|
||||
"gsd-core/workflows/smart-entry.md": "9a64f43927641ca4",
|
||||
@@ -322,7 +322,7 @@
|
||||
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
|
||||
"gsd-core/workflows/update.md": "165beec33490bd28",
|
||||
"gsd-core/workflows/validate-phase.md": "706627c190ae11aa",
|
||||
"gsd-core/workflows/verify-phase.md": "377fa009ccf04cbe",
|
||||
"gsd-core/workflows/verify-phase.md": "a8b3c15e7ef9c394",
|
||||
"gsd-core/workflows/verify-work.md": "3fb282f2bce34a79",
|
||||
"scripts/changeset/README.md": "86ff89331dfd94b2",
|
||||
"scripts/changeset/cli.cjs": "68f92a344b199271",
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
"agents/gsd-ui-checker.md": "25822359044cd708",
|
||||
"agents/gsd-ui-researcher.md": "e37d9f53ade25d1f",
|
||||
"agents/gsd-user-profiler.md": "622220df0654b6bf",
|
||||
"agents/gsd-verifier.md": "c8a8c73a277a512f",
|
||||
"agents/gsd-verifier.md": "107ad9d3193bcafc",
|
||||
"commands/gsd-add-tests.md": "aa65032141557fb7",
|
||||
"commands/gsd-ai-integration-phase.md": "6199b7198f928adc",
|
||||
"commands/gsd-audit-fix.md": "c21ef925131fade7",
|
||||
@@ -110,7 +110,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
|
||||
"gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3",
|
||||
"gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0",
|
||||
@@ -127,7 +127,7 @@
|
||||
"gsd-core/references/api-coverage.md": "66264d41dfd9154a",
|
||||
"gsd-core/references/artifact-types.md": "a6d2e1f9453ffbf5",
|
||||
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
|
||||
"gsd-core/references/checkpoints.md": "b1530628d693fc85",
|
||||
"gsd-core/references/checkpoints.md": "c2fe89c42ca88349",
|
||||
"gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29",
|
||||
"gsd-core/references/context-budget.md": "f1ce57bf418824af",
|
||||
"gsd-core/references/continuation-format.md": "ce73e57d053ab8a7",
|
||||
@@ -283,14 +283,14 @@
|
||||
"gsd-core/workflows/add-todo.md": "953314cdfef56bc4",
|
||||
"gsd-core/workflows/ai-integration-phase.md": "45c727e49de71636",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "52942af10f140717",
|
||||
"gsd-core/workflows/audit-fix.md": "ca751f6538c8f496",
|
||||
"gsd-core/workflows/audit-fix.md": "d511f4094ce351aa",
|
||||
"gsd-core/workflows/audit-milestone.md": "3835762c3147a927",
|
||||
"gsd-core/workflows/audit-uat.md": "fcfbec501620b564",
|
||||
"gsd-core/workflows/autonomous.md": "7e5683728ef33707",
|
||||
"gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc",
|
||||
"gsd-core/workflows/cleanup.md": "0daa2f2720c111f1",
|
||||
"gsd-core/workflows/code-review-fix.md": "2e113d1f4350a075",
|
||||
"gsd-core/workflows/code-review.md": "2aa1957579f50a87",
|
||||
"gsd-core/workflows/code-review.md": "c877ad812b4a511e",
|
||||
"gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2",
|
||||
"gsd-core/workflows/debug.md": "98c8ed5af882ef8f",
|
||||
"gsd-core/workflows/diagnose-issues.md": "77d98ac07c4a26ff",
|
||||
@@ -314,11 +314,11 @@
|
||||
"gsd-core/workflows/docs-update.md": "f35922d15b7061c9",
|
||||
"gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04",
|
||||
"gsd-core/workflows/eval-review.md": "f898936e2cfe4130",
|
||||
"gsd-core/workflows/execute-phase.md": "64b6a432d49e3136",
|
||||
"gsd-core/workflows/execute-phase.md": "bae1b74bd250c6e6",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "1c26c1cf464fa6b7",
|
||||
"gsd-core/workflows/explore.md": "6c04f2e658d93261",
|
||||
@@ -373,7 +373,7 @@
|
||||
"gsd-core/workflows/settings-advanced.md": "414db4dbea97ba44",
|
||||
"gsd-core/workflows/settings-integrations.md": "70515c5838fb9826",
|
||||
"gsd-core/workflows/settings.md": "d96ddf01fb85e61e",
|
||||
"gsd-core/workflows/ship.md": "f486f2731ca8b72a",
|
||||
"gsd-core/workflows/ship.md": "369f1461685d1897",
|
||||
"gsd-core/workflows/sketch-wrap-up.md": "2aba89ecd8f41a0d",
|
||||
"gsd-core/workflows/sketch.md": "5eedd93f9a5b49d5",
|
||||
"gsd-core/workflows/smart-entry.md": "449238eb94abe187",
|
||||
@@ -390,7 +390,7 @@
|
||||
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
|
||||
"gsd-core/workflows/update.md": "5ff1f77222977648",
|
||||
"gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607",
|
||||
"gsd-core/workflows/verify-phase.md": "499a0ade5e21fe6f",
|
||||
"gsd-core/workflows/verify-phase.md": "d26a2c3269340caf",
|
||||
"gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3",
|
||||
"hooks/gsd-check-update-worker.js": "bdc9324a2f080ddd",
|
||||
"hooks/gsd-check-update.js": "b7669f605631e506",
|
||||
|
||||
22
tests/fixtures/golden-install-parity/codex.json
vendored
22
tests/fixtures/golden-install-parity/codex.json
vendored
@@ -138,14 +138,14 @@
|
||||
"agents/gsd-ui-researcher.toml": "7a38aff7b13d9e37",
|
||||
"agents/gsd-user-profiler.md": "1bf5033c929181c1",
|
||||
"agents/gsd-user-profiler.toml": "b9c244bb8fbf8140",
|
||||
"agents/gsd-verifier.md": "4ac4b860e2504374",
|
||||
"agents/gsd-verifier.toml": "8ed9fb961409e894",
|
||||
"agents/gsd-verifier.md": "c924485d9feb6a8d",
|
||||
"agents/gsd-verifier.toml": "e37a57b02a7647a9",
|
||||
"config.toml": "aa0b484a070f603c",
|
||||
"gsd-core/.gsd-runtime": "243b0dc9b847e66c",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
|
||||
"gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3",
|
||||
"gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0",
|
||||
@@ -162,7 +162,7 @@
|
||||
"gsd-core/references/api-coverage.md": "524382216a8e713f",
|
||||
"gsd-core/references/artifact-types.md": "3218cafb0c92dc32",
|
||||
"gsd-core/references/autonomous-smart-discuss.md": "4156025334411073",
|
||||
"gsd-core/references/checkpoints.md": "afc6933d99f73358",
|
||||
"gsd-core/references/checkpoints.md": "d52116f59e92ca43",
|
||||
"gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29",
|
||||
"gsd-core/references/context-budget.md": "0b67ea1d5db4bc08",
|
||||
"gsd-core/references/continuation-format.md": "e64c0da2b3d0f2f0",
|
||||
@@ -318,14 +318,14 @@
|
||||
"gsd-core/workflows/add-todo.md": "776e554602e3d1b7",
|
||||
"gsd-core/workflows/ai-integration-phase.md": "d46f7e1a0b24345a",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "f799abc00907377f",
|
||||
"gsd-core/workflows/audit-fix.md": "ca751f6538c8f496",
|
||||
"gsd-core/workflows/audit-fix.md": "d511f4094ce351aa",
|
||||
"gsd-core/workflows/audit-milestone.md": "5f362cead97ceaca",
|
||||
"gsd-core/workflows/audit-uat.md": "2564078edb15b5e9",
|
||||
"gsd-core/workflows/autonomous.md": "92f08626d4aea668",
|
||||
"gsd-core/workflows/check-todos.md": "b2b103e8638e760a",
|
||||
"gsd-core/workflows/cleanup.md": "5d48d64664222a3e",
|
||||
"gsd-core/workflows/code-review-fix.md": "ae7f9c6b39a23c12",
|
||||
"gsd-core/workflows/code-review.md": "8ac44419de9d2ab5",
|
||||
"gsd-core/workflows/code-review.md": "9b02ebf8fc9b87fa",
|
||||
"gsd-core/workflows/complete-milestone.md": "017df7443bd08da5",
|
||||
"gsd-core/workflows/debug.md": "63691293c0bc0294",
|
||||
"gsd-core/workflows/diagnose-issues.md": "e38bb21d06dff077",
|
||||
@@ -349,11 +349,11 @@
|
||||
"gsd-core/workflows/docs-update.md": "e255317df939e302",
|
||||
"gsd-core/workflows/edit-phase.md": "e592a4d85ce5380f",
|
||||
"gsd-core/workflows/eval-review.md": "63d0d0670b54c244",
|
||||
"gsd-core/workflows/execute-phase.md": "916e24c2bd0da0f7",
|
||||
"gsd-core/workflows/execute-phase.md": "2f0e853490af3972",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f4cacd27d37bac65",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "4492431f93e1df8c",
|
||||
"gsd-core/workflows/explore.md": "2ef10d17c8864a04",
|
||||
@@ -408,7 +408,7 @@
|
||||
"gsd-core/workflows/settings-advanced.md": "2431433811616f76",
|
||||
"gsd-core/workflows/settings-integrations.md": "77730321d3d6d317",
|
||||
"gsd-core/workflows/settings.md": "054c8c31b3905ced",
|
||||
"gsd-core/workflows/ship.md": "779e345e22f3f974",
|
||||
"gsd-core/workflows/ship.md": "2c2ab4e0243a2b27",
|
||||
"gsd-core/workflows/sketch-wrap-up.md": "07724a390fbb43f6",
|
||||
"gsd-core/workflows/sketch.md": "576f300dfdde1b7d",
|
||||
"gsd-core/workflows/smart-entry.md": "6f686195ae531b03",
|
||||
@@ -425,7 +425,7 @@
|
||||
"gsd-core/workflows/undo.md": "5ff7d63b0a2f46d5",
|
||||
"gsd-core/workflows/update.md": "5c35c0ec0f462ea6",
|
||||
"gsd-core/workflows/validate-phase.md": "6d6d10fe53f6b1d0",
|
||||
"gsd-core/workflows/verify-phase.md": "9ceb46a60cb6608b",
|
||||
"gsd-core/workflows/verify-phase.md": "ce508f9c2242b91f",
|
||||
"gsd-core/workflows/verify-work.md": "5b348e73fc0d0829",
|
||||
"hooks/gsd-check-update.js": "ef48957eb6ac6a10",
|
||||
"hooks/gsd-context-monitor.js": "ec76b23f45d29b02",
|
||||
|
||||
@@ -34,13 +34,13 @@
|
||||
"agents/gsd-ui-checker.agent.md": "47d8cf3486009e11",
|
||||
"agents/gsd-ui-researcher.agent.md": "0746daeb54f83008",
|
||||
"agents/gsd-user-profiler.agent.md": "ae16a248e18dd42b",
|
||||
"agents/gsd-verifier.agent.md": "87a8e3238e838a39",
|
||||
"agents/gsd-verifier.agent.md": "b8fd5f43eac96078",
|
||||
"copilot-instructions.md": "1fb04111759f1645",
|
||||
"gsd-core/.gsd-runtime": "d0bcfb0a7f01f8c9",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "ea841e2865248e74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "0a2fc4e226f009c5",
|
||||
"gsd-core/bin/gsd-tools.cjs": "2fcf88250beb9214",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0",
|
||||
@@ -57,7 +57,7 @@
|
||||
"gsd-core/references/api-coverage.md": "205a43c5fa7c221c",
|
||||
"gsd-core/references/artifact-types.md": "f992de8b2b1a4420",
|
||||
"gsd-core/references/autonomous-smart-discuss.md": "efd80aca449032ad",
|
||||
"gsd-core/references/checkpoints.md": "53ca1c205dda8b65",
|
||||
"gsd-core/references/checkpoints.md": "d26b11ab5ece9e61",
|
||||
"gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29",
|
||||
"gsd-core/references/context-budget.md": "435474d5e10be65a",
|
||||
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
|
||||
@@ -213,14 +213,14 @@
|
||||
"gsd-core/workflows/add-todo.md": "f86f4efa25a5d0d6",
|
||||
"gsd-core/workflows/ai-integration-phase.md": "9dd7f80180f9c8e9",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "646fc39302300887",
|
||||
"gsd-core/workflows/audit-fix.md": "1baff2494a1c093e",
|
||||
"gsd-core/workflows/audit-milestone.md": "258e4dfd259ab13f",
|
||||
"gsd-core/workflows/audit-uat.md": "5ea0e30548ed0933",
|
||||
"gsd-core/workflows/autonomous.md": "dd972ddde9663295",
|
||||
"gsd-core/workflows/check-todos.md": "be9b50b5f28d7504",
|
||||
"gsd-core/workflows/cleanup.md": "8233b05ebf011bec",
|
||||
"gsd-core/workflows/code-review-fix.md": "fda53892ae4b17fc",
|
||||
"gsd-core/workflows/code-review.md": "d58b02fb3a6160a8",
|
||||
"gsd-core/workflows/code-review.md": "e36479e4d924c9a6",
|
||||
"gsd-core/workflows/complete-milestone.md": "470cf39261400ee2",
|
||||
"gsd-core/workflows/debug.md": "37c900b9f6c11663",
|
||||
"gsd-core/workflows/diagnose-issues.md": "42acbe2a43fc886e",
|
||||
@@ -244,11 +244,11 @@
|
||||
"gsd-core/workflows/docs-update.md": "9292cfa3c52c434e",
|
||||
"gsd-core/workflows/edit-phase.md": "8667c28b22b1599f",
|
||||
"gsd-core/workflows/eval-review.md": "81c8e72ba3862856",
|
||||
"gsd-core/workflows/execute-phase.md": "95afff0cf3e75bf6",
|
||||
"gsd-core/workflows/execute-phase.md": "b402721e78b44197",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "63b712920f21a40f",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "1963079fe27412c6",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "bce45e41bc6802e8",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "25bebed74e645109",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "dc0b96d285327b18",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "388f3cd58a3adac5",
|
||||
"gsd-core/workflows/explore.md": "5fd91a8510e1114b",
|
||||
@@ -303,7 +303,7 @@
|
||||
"gsd-core/workflows/settings-advanced.md": "230a658de9c017a6",
|
||||
"gsd-core/workflows/settings-integrations.md": "a1d146d6bfd14db5",
|
||||
"gsd-core/workflows/settings.md": "f611f14f2f447f1e",
|
||||
"gsd-core/workflows/ship.md": "3d0022d2d3ed8f78",
|
||||
"gsd-core/workflows/ship.md": "7e52f4b11bd15b58",
|
||||
"gsd-core/workflows/sketch-wrap-up.md": "f2590cb6ddbfad94",
|
||||
"gsd-core/workflows/sketch.md": "e2063966439af8c1",
|
||||
"gsd-core/workflows/smart-entry.md": "6c707b959a41900b",
|
||||
@@ -320,7 +320,7 @@
|
||||
"gsd-core/workflows/undo.md": "ba1ef7aa80bef6bd",
|
||||
"gsd-core/workflows/update.md": "f444a7cfcd246cfb",
|
||||
"gsd-core/workflows/validate-phase.md": "e7aa423ebdd6a230",
|
||||
"gsd-core/workflows/verify-phase.md": "dd76fff851c66df5",
|
||||
"gsd-core/workflows/verify-phase.md": "3fcc54a0c46e5e2f",
|
||||
"gsd-core/workflows/verify-work.md": "c966971a3cbd1d71",
|
||||
"hooks/gsd-session.json": "3382597f61e3a559",
|
||||
"scripts/changeset/README.md": "86ff89331dfd94b2",
|
||||
|
||||
20
tests/fixtures/golden-install-parity/cursor.json
vendored
20
tests/fixtures/golden-install-parity/cursor.json
vendored
@@ -34,7 +34,7 @@
|
||||
"agents/gsd-ui-checker.md": "c6c24e8066470830",
|
||||
"agents/gsd-ui-researcher.md": "0f5be5e55501f7e8",
|
||||
"agents/gsd-user-profiler.md": "622220df0654b6bf",
|
||||
"agents/gsd-verifier.md": "dea8e61123848fb4",
|
||||
"agents/gsd-verifier.md": "f618c5051fa5c317",
|
||||
"commands/gsd-add-tests.md": "1f89b16ab2cca426",
|
||||
"commands/gsd-ai-integration-phase.md": "99f66291ded1899d",
|
||||
"commands/gsd-audit-fix.md": "d88502ffa2151cec",
|
||||
@@ -110,7 +110,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "2525f1ae8b086828",
|
||||
"gsd-core/bin/gsd-tools.cjs": "35ec4c40e46036eb",
|
||||
"gsd-core/bin/gsd-tools.cjs": "31f45cfd36e5dfdb",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0",
|
||||
@@ -127,7 +127,7 @@
|
||||
"gsd-core/references/api-coverage.md": "205a43c5fa7c221c",
|
||||
"gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e",
|
||||
"gsd-core/references/autonomous-smart-discuss.md": "273b371c5751f35a",
|
||||
"gsd-core/references/checkpoints.md": "f852c96c5fe25015",
|
||||
"gsd-core/references/checkpoints.md": "a44e66095240c46e",
|
||||
"gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29",
|
||||
"gsd-core/references/context-budget.md": "304dcdab82a27623",
|
||||
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
|
||||
@@ -283,14 +283,14 @@
|
||||
"gsd-core/workflows/add-todo.md": "1ee0525664fb062f",
|
||||
"gsd-core/workflows/ai-integration-phase.md": "a349e94b18839873",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "ca751f6538c8f496",
|
||||
"gsd-core/workflows/audit-fix.md": "d511f4094ce351aa",
|
||||
"gsd-core/workflows/audit-milestone.md": "9f8ec364e58d5710",
|
||||
"gsd-core/workflows/audit-uat.md": "e11db0d74c2a7405",
|
||||
"gsd-core/workflows/autonomous.md": "4b20eda9a0b587ce",
|
||||
"gsd-core/workflows/check-todos.md": "1a67337d1630848f",
|
||||
"gsd-core/workflows/cleanup.md": "db47963f103c2748",
|
||||
"gsd-core/workflows/code-review-fix.md": "c57af378033b1b58",
|
||||
"gsd-core/workflows/code-review.md": "8d7d2de8781fb3f9",
|
||||
"gsd-core/workflows/code-review.md": "9860df7228426ae5",
|
||||
"gsd-core/workflows/complete-milestone.md": "1400a4856f592f3e",
|
||||
"gsd-core/workflows/debug.md": "fb9e5ecb5027b98e",
|
||||
"gsd-core/workflows/diagnose-issues.md": "cd582747131726e3",
|
||||
@@ -314,11 +314,11 @@
|
||||
"gsd-core/workflows/docs-update.md": "e86d7d7e2e3dac6d",
|
||||
"gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a",
|
||||
"gsd-core/workflows/eval-review.md": "a86279dd98dd5c03",
|
||||
"gsd-core/workflows/execute-phase.md": "875819cbb102d6bc",
|
||||
"gsd-core/workflows/execute-phase.md": "a09f05b2295ae2d2",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "facb0e816d87a0c7",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "13e9664263d3844d",
|
||||
"gsd-core/workflows/explore.md": "b9eea1bac358c9ce",
|
||||
@@ -373,7 +373,7 @@
|
||||
"gsd-core/workflows/settings-advanced.md": "bf8ea69c8f7ae019",
|
||||
"gsd-core/workflows/settings-integrations.md": "166ca51b1f33c2a3",
|
||||
"gsd-core/workflows/settings.md": "0623c673eaf04799",
|
||||
"gsd-core/workflows/ship.md": "36603e9c574e8374",
|
||||
"gsd-core/workflows/ship.md": "6e3ac35dc933a39a",
|
||||
"gsd-core/workflows/sketch-wrap-up.md": "5be73b7bdf96b539",
|
||||
"gsd-core/workflows/sketch.md": "373bc0d83368a411",
|
||||
"gsd-core/workflows/smart-entry.md": "c8fc316358cdcd7b",
|
||||
@@ -390,7 +390,7 @@
|
||||
"gsd-core/workflows/undo.md": "18dec684fb1076f9",
|
||||
"gsd-core/workflows/update.md": "23e294ba707c3580",
|
||||
"gsd-core/workflows/validate-phase.md": "d03a94b7b807be12",
|
||||
"gsd-core/workflows/verify-phase.md": "b321551a82bc7c2f",
|
||||
"gsd-core/workflows/verify-phase.md": "b8cca6ef3be502b9",
|
||||
"gsd-core/workflows/verify-work.md": "e7e7e900c4874490",
|
||||
"hooks/gsd-cursor-post-tool.js": "019d503aee8b4a3f",
|
||||
"hooks/gsd-cursor-pre-tool.js": "fe274720781fcbb5",
|
||||
|
||||
20
tests/fixtures/golden-install-parity/hermes.json
vendored
20
tests/fixtures/golden-install-parity/hermes.json
vendored
@@ -34,12 +34,12 @@
|
||||
"agents/gsd-ui-checker.md": "cfc8a3bac0a0ef5b",
|
||||
"agents/gsd-ui-researcher.md": "8799b6013e06ae49",
|
||||
"agents/gsd-user-profiler.md": "ca3bf75581f211a0",
|
||||
"agents/gsd-verifier.md": "82d3e9015ed04017",
|
||||
"agents/gsd-verifier.md": "de64454ee98634cd",
|
||||
"gsd-core/.gsd-runtime": "d53ba9ce30ffd743",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "3a3409215044af9f",
|
||||
"gsd-core/bin/gsd-tools.cjs": "693bd27cb9b76b76",
|
||||
"gsd-core/bin/gsd-tools.cjs": "6df1804284c68471",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0",
|
||||
@@ -56,7 +56,7 @@
|
||||
"gsd-core/references/api-coverage.md": "205a43c5fa7c221c",
|
||||
"gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e",
|
||||
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
|
||||
"gsd-core/references/checkpoints.md": "36b2de4768b228af",
|
||||
"gsd-core/references/checkpoints.md": "6e4b08a89c485c71",
|
||||
"gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29",
|
||||
"gsd-core/references/context-budget.md": "b93e9f47aa1b1753",
|
||||
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
|
||||
@@ -212,14 +212,14 @@
|
||||
"gsd-core/workflows/add-todo.md": "8ba173153be63a40",
|
||||
"gsd-core/workflows/ai-integration-phase.md": "753a41301e4d2a4c",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "bf84c94d2ccdacbf",
|
||||
"gsd-core/workflows/audit-fix.md": "a7f94d5c43583aeb",
|
||||
"gsd-core/workflows/audit-milestone.md": "b96a78c6bd2e7690",
|
||||
"gsd-core/workflows/audit-uat.md": "86d9131fccabf2ad",
|
||||
"gsd-core/workflows/autonomous.md": "853dd93846332743",
|
||||
"gsd-core/workflows/check-todos.md": "ea9a303c48a5d752",
|
||||
"gsd-core/workflows/cleanup.md": "6c488059fc152a49",
|
||||
"gsd-core/workflows/code-review-fix.md": "5e396494a79c3f19",
|
||||
"gsd-core/workflows/code-review.md": "cf7735c3643d9190",
|
||||
"gsd-core/workflows/code-review.md": "b73d0784b9abd2f4",
|
||||
"gsd-core/workflows/complete-milestone.md": "f1866541148dc291",
|
||||
"gsd-core/workflows/debug.md": "a8132ea4480a4730",
|
||||
"gsd-core/workflows/diagnose-issues.md": "385096674965c043",
|
||||
@@ -243,11 +243,11 @@
|
||||
"gsd-core/workflows/docs-update.md": "ba4cf926fc463cbe",
|
||||
"gsd-core/workflows/edit-phase.md": "7f27003f20e88fb8",
|
||||
"gsd-core/workflows/eval-review.md": "f510e5762212dc6f",
|
||||
"gsd-core/workflows/execute-phase.md": "e69d330bed0d9468",
|
||||
"gsd-core/workflows/execute-phase.md": "4181b4370acee4ec",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "14a27cc0828f59d3",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "26ee34c543926402",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "5d3a54df40320dbf",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "1ec347a324814b1d",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "362123fdf99e9980",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "a691e3afe88031b8",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "ed1528fcbfb792a8",
|
||||
"gsd-core/workflows/explore.md": "d931b4d85a74c795",
|
||||
@@ -302,7 +302,7 @@
|
||||
"gsd-core/workflows/settings-advanced.md": "49be159144d7f426",
|
||||
"gsd-core/workflows/settings-integrations.md": "1dce76db0aca08a5",
|
||||
"gsd-core/workflows/settings.md": "9ced580679ed0255",
|
||||
"gsd-core/workflows/ship.md": "36029cf37057f466",
|
||||
"gsd-core/workflows/ship.md": "8e8c1d3c8204769d",
|
||||
"gsd-core/workflows/sketch-wrap-up.md": "f1ece50ac65ea281",
|
||||
"gsd-core/workflows/sketch.md": "d5887983e62b574a",
|
||||
"gsd-core/workflows/smart-entry.md": "47f5c5e8608e5f7a",
|
||||
@@ -319,7 +319,7 @@
|
||||
"gsd-core/workflows/undo.md": "791e0bf96d9a057f",
|
||||
"gsd-core/workflows/update.md": "7499bb4cb2a3ce6f",
|
||||
"gsd-core/workflows/validate-phase.md": "24be83176c7db9f9",
|
||||
"gsd-core/workflows/verify-phase.md": "d2a254cc06eb2e84",
|
||||
"gsd-core/workflows/verify-phase.md": "42f0fba74d069537",
|
||||
"gsd-core/workflows/verify-work.md": "3847a7ccd4bd88a8",
|
||||
"hooks/gsd-check-update-worker.js": "7989cc2bedd1138d",
|
||||
"hooks/gsd-check-update.js": "25f5ad726f76fc11",
|
||||
|
||||
20
tests/fixtures/golden-install-parity/kilo.json
vendored
20
tests/fixtures/golden-install-parity/kilo.json
vendored
@@ -34,7 +34,7 @@
|
||||
"agents/gsd-ui-checker.md": "e078ea5a07313976",
|
||||
"agents/gsd-ui-researcher.md": "cc9578c4f686d926",
|
||||
"agents/gsd-user-profiler.md": "b8cb09319c517701",
|
||||
"agents/gsd-verifier.md": "af609b1959cde3f3",
|
||||
"agents/gsd-verifier.md": "49a733b54fa955c2",
|
||||
"command/gsd-add-tests.md": "c314f9a6be312bfa",
|
||||
"command/gsd-ai-integration-phase.md": "9c47e446af993c53",
|
||||
"command/gsd-audit-fix.md": "4106e9dce9b71585",
|
||||
@@ -110,7 +110,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
|
||||
"gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3",
|
||||
"gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0",
|
||||
@@ -127,7 +127,7 @@
|
||||
"gsd-core/references/api-coverage.md": "205a43c5fa7c221c",
|
||||
"gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e",
|
||||
"gsd-core/references/autonomous-smart-discuss.md": "3986d58011bf9006",
|
||||
"gsd-core/references/checkpoints.md": "afc6933d99f73358",
|
||||
"gsd-core/references/checkpoints.md": "d52116f59e92ca43",
|
||||
"gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29",
|
||||
"gsd-core/references/context-budget.md": "533eae480bfc4bb8",
|
||||
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
|
||||
@@ -283,14 +283,14 @@
|
||||
"gsd-core/workflows/add-todo.md": "31bc520d77b14139",
|
||||
"gsd-core/workflows/ai-integration-phase.md": "d4400169618e6925",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "ca751f6538c8f496",
|
||||
"gsd-core/workflows/audit-fix.md": "d511f4094ce351aa",
|
||||
"gsd-core/workflows/audit-milestone.md": "9f8ec364e58d5710",
|
||||
"gsd-core/workflows/audit-uat.md": "e11db0d74c2a7405",
|
||||
"gsd-core/workflows/autonomous.md": "73f429f7472c9949",
|
||||
"gsd-core/workflows/check-todos.md": "ed4b4eb12be222d7",
|
||||
"gsd-core/workflows/cleanup.md": "c5f1bf186395d67d",
|
||||
"gsd-core/workflows/code-review-fix.md": "722416b71b31c5fc",
|
||||
"gsd-core/workflows/code-review.md": "14682c0ba32d5dc6",
|
||||
"gsd-core/workflows/code-review.md": "3fd49c93357fe4f7",
|
||||
"gsd-core/workflows/complete-milestone.md": "59753bf44d4300da",
|
||||
"gsd-core/workflows/debug.md": "e88c2d430c3625b6",
|
||||
"gsd-core/workflows/diagnose-issues.md": "210b5b313e8a559a",
|
||||
@@ -314,11 +314,11 @@
|
||||
"gsd-core/workflows/docs-update.md": "79afaaf19fd527cc",
|
||||
"gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a",
|
||||
"gsd-core/workflows/eval-review.md": "926eda8bbee28b23",
|
||||
"gsd-core/workflows/execute-phase.md": "a470b8e99e963c83",
|
||||
"gsd-core/workflows/execute-phase.md": "17fe49293d779e2f",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "facb0e816d87a0c7",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "0e40eda4ae70fcab",
|
||||
"gsd-core/workflows/explore.md": "14242d36d4822df6",
|
||||
@@ -373,7 +373,7 @@
|
||||
"gsd-core/workflows/settings-advanced.md": "edd858cd6cfddaf1",
|
||||
"gsd-core/workflows/settings-integrations.md": "3ea8095d5fad891b",
|
||||
"gsd-core/workflows/settings.md": "1925ecc2225c2216",
|
||||
"gsd-core/workflows/ship.md": "e8ea6299b57fef04",
|
||||
"gsd-core/workflows/ship.md": "7afe19fa2d472013",
|
||||
"gsd-core/workflows/sketch-wrap-up.md": "888c0548e63197b3",
|
||||
"gsd-core/workflows/sketch.md": "34a0c10fa56af7ea",
|
||||
"gsd-core/workflows/smart-entry.md": "7ffe4fdb93935400",
|
||||
@@ -390,7 +390,7 @@
|
||||
"gsd-core/workflows/undo.md": "7cd2153f8b15e30d",
|
||||
"gsd-core/workflows/update.md": "07dc2fba78ad1865",
|
||||
"gsd-core/workflows/validate-phase.md": "52b9fa8a9533b444",
|
||||
"gsd-core/workflows/verify-phase.md": "b321551a82bc7c2f",
|
||||
"gsd-core/workflows/verify-phase.md": "b8cca6ef3be502b9",
|
||||
"gsd-core/workflows/verify-work.md": "9fc717845828c6e3",
|
||||
"hooks/gsd-check-update-worker.js": "c992bbad91d0e994",
|
||||
"hooks/gsd-check-update.js": "fdd77abe7ef26a2d",
|
||||
|
||||
20
tests/fixtures/golden-install-parity/kimi.json
vendored
20
tests/fixtures/golden-install-parity/kimi.json
vendored
@@ -97,13 +97,13 @@
|
||||
"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": "699f62763424ac68",
|
||||
"agents/subagents/gsd-verifier.md": "862e8f8dcb059014",
|
||||
"agents/subagents/gsd-verifier.yaml": "2d2bd6b37626f382",
|
||||
"gsd-core/.gsd-runtime": "cb556f5d5cee2779",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
|
||||
"gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3",
|
||||
"gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0",
|
||||
@@ -120,7 +120,7 @@
|
||||
"gsd-core/references/api-coverage.md": "66264d41dfd9154a",
|
||||
"gsd-core/references/artifact-types.md": "a6d2e1f9453ffbf5",
|
||||
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
|
||||
"gsd-core/references/checkpoints.md": "b1530628d693fc85",
|
||||
"gsd-core/references/checkpoints.md": "c2fe89c42ca88349",
|
||||
"gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29",
|
||||
"gsd-core/references/context-budget.md": "f1ce57bf418824af",
|
||||
"gsd-core/references/continuation-format.md": "ce73e57d053ab8a7",
|
||||
@@ -276,14 +276,14 @@
|
||||
"gsd-core/workflows/add-todo.md": "953314cdfef56bc4",
|
||||
"gsd-core/workflows/ai-integration-phase.md": "45c727e49de71636",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "52942af10f140717",
|
||||
"gsd-core/workflows/audit-fix.md": "ca751f6538c8f496",
|
||||
"gsd-core/workflows/audit-fix.md": "d511f4094ce351aa",
|
||||
"gsd-core/workflows/audit-milestone.md": "3835762c3147a927",
|
||||
"gsd-core/workflows/audit-uat.md": "fcfbec501620b564",
|
||||
"gsd-core/workflows/autonomous.md": "7e5683728ef33707",
|
||||
"gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc",
|
||||
"gsd-core/workflows/cleanup.md": "0daa2f2720c111f1",
|
||||
"gsd-core/workflows/code-review-fix.md": "2e113d1f4350a075",
|
||||
"gsd-core/workflows/code-review.md": "2aa1957579f50a87",
|
||||
"gsd-core/workflows/code-review.md": "c877ad812b4a511e",
|
||||
"gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2",
|
||||
"gsd-core/workflows/debug.md": "98c8ed5af882ef8f",
|
||||
"gsd-core/workflows/diagnose-issues.md": "67c058fc7ae6026b",
|
||||
@@ -307,11 +307,11 @@
|
||||
"gsd-core/workflows/docs-update.md": "f35922d15b7061c9",
|
||||
"gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04",
|
||||
"gsd-core/workflows/eval-review.md": "f898936e2cfe4130",
|
||||
"gsd-core/workflows/execute-phase.md": "d06e2f3aa15eba2b",
|
||||
"gsd-core/workflows/execute-phase.md": "81e1f72a08f74e44",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "045ad8cb48444e57",
|
||||
"gsd-core/workflows/explore.md": "6c04f2e658d93261",
|
||||
@@ -366,7 +366,7 @@
|
||||
"gsd-core/workflows/settings-advanced.md": "414db4dbea97ba44",
|
||||
"gsd-core/workflows/settings-integrations.md": "70515c5838fb9826",
|
||||
"gsd-core/workflows/settings.md": "d96ddf01fb85e61e",
|
||||
"gsd-core/workflows/ship.md": "f486f2731ca8b72a",
|
||||
"gsd-core/workflows/ship.md": "369f1461685d1897",
|
||||
"gsd-core/workflows/sketch-wrap-up.md": "b767a1d3db129a8a",
|
||||
"gsd-core/workflows/sketch.md": "88cfdf4edcf222ab",
|
||||
"gsd-core/workflows/smart-entry.md": "449238eb94abe187",
|
||||
@@ -383,7 +383,7 @@
|
||||
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
|
||||
"gsd-core/workflows/update.md": "6718e0632bba26ca",
|
||||
"gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607",
|
||||
"gsd-core/workflows/verify-phase.md": "499a0ade5e21fe6f",
|
||||
"gsd-core/workflows/verify-phase.md": "d26a2c3269340caf",
|
||||
"gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3",
|
||||
"scripts/changeset/README.md": "86ff89331dfd94b2",
|
||||
"scripts/changeset/cli.cjs": "68f92a344b199271",
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
"agents/gsd-ui-checker.md": "4f88fd4c9d4c56a3",
|
||||
"agents/gsd-ui-researcher.md": "ecb617901cb7ad06",
|
||||
"agents/gsd-user-profiler.md": "d825b4c0a6431f8b",
|
||||
"agents/gsd-verifier.md": "b9f2e801f9395a35",
|
||||
"agents/gsd-verifier.md": "2460e48bbb991adc",
|
||||
"commands/gsd-add-tests.md": "b9cd93ed01945f75",
|
||||
"commands/gsd-ai-integration-phase.md": "038709fe91d897e4",
|
||||
"commands/gsd-audit-fix.md": "5615403843d5e491",
|
||||
@@ -110,7 +110,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
|
||||
"gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3",
|
||||
"gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0",
|
||||
@@ -127,7 +127,7 @@
|
||||
"gsd-core/references/api-coverage.md": "205a43c5fa7c221c",
|
||||
"gsd-core/references/artifact-types.md": "218c55caf8aff6df",
|
||||
"gsd-core/references/autonomous-smart-discuss.md": "3986d58011bf9006",
|
||||
"gsd-core/references/checkpoints.md": "afc6933d99f73358",
|
||||
"gsd-core/references/checkpoints.md": "d52116f59e92ca43",
|
||||
"gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29",
|
||||
"gsd-core/references/context-budget.md": "355826e667f9ccd1",
|
||||
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
|
||||
@@ -283,14 +283,14 @@
|
||||
"gsd-core/workflows/add-todo.md": "36b6d7fec9631ec7",
|
||||
"gsd-core/workflows/ai-integration-phase.md": "f8288f0434d17c84",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "20d2c2a6c49e750b",
|
||||
"gsd-core/workflows/audit-fix.md": "3aaafee8857dcfab",
|
||||
"gsd-core/workflows/audit-milestone.md": "8bd0b730de08d1a8",
|
||||
"gsd-core/workflows/audit-uat.md": "c800099fab1e1c1b",
|
||||
"gsd-core/workflows/autonomous.md": "6cb0c014f5f56965",
|
||||
"gsd-core/workflows/check-todos.md": "6526b64ee88c7d2e",
|
||||
"gsd-core/workflows/cleanup.md": "94d771d26f62dc86",
|
||||
"gsd-core/workflows/code-review-fix.md": "adb9388bb157610c",
|
||||
"gsd-core/workflows/code-review.md": "8ff9884096ae8341",
|
||||
"gsd-core/workflows/code-review.md": "016d1c9cbabf04f2",
|
||||
"gsd-core/workflows/complete-milestone.md": "614299b2c08e66c3",
|
||||
"gsd-core/workflows/debug.md": "161be2a77ffce47a",
|
||||
"gsd-core/workflows/diagnose-issues.md": "2971c699d52f1b85",
|
||||
@@ -314,11 +314,11 @@
|
||||
"gsd-core/workflows/docs-update.md": "850366c2ef8fb780",
|
||||
"gsd-core/workflows/edit-phase.md": "1876c855fb0a0a39",
|
||||
"gsd-core/workflows/eval-review.md": "5394694d29ad7543",
|
||||
"gsd-core/workflows/execute-phase.md": "e5a4f684bd87245c",
|
||||
"gsd-core/workflows/execute-phase.md": "14319ad35214eda9",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "1804215577f1ad35",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "01c2fe9e5bcb57be",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "86b8a7f50115162f",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "c4cba01539f0368a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "21f4d9b3abc334ce",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "ac4a07ff7e42190d",
|
||||
"gsd-core/workflows/explore.md": "7f5f9231cfd3089b",
|
||||
@@ -373,7 +373,7 @@
|
||||
"gsd-core/workflows/settings-advanced.md": "252b0d3edc315339",
|
||||
"gsd-core/workflows/settings-integrations.md": "d1711a95f44fdbde",
|
||||
"gsd-core/workflows/settings.md": "2e42ee34c791378a",
|
||||
"gsd-core/workflows/ship.md": "1875ec8f59fcf0b4",
|
||||
"gsd-core/workflows/ship.md": "fb70add4f61cf3e8",
|
||||
"gsd-core/workflows/sketch-wrap-up.md": "681800323681c5c6",
|
||||
"gsd-core/workflows/sketch.md": "fcb7af914159ef7b",
|
||||
"gsd-core/workflows/smart-entry.md": "2a253fe437496eea",
|
||||
@@ -390,7 +390,7 @@
|
||||
"gsd-core/workflows/undo.md": "0bba5e7f6196c894",
|
||||
"gsd-core/workflows/update.md": "71b6cd852f38b4bc",
|
||||
"gsd-core/workflows/validate-phase.md": "434d9927c65f2bba",
|
||||
"gsd-core/workflows/verify-phase.md": "763485e1b7547cdb",
|
||||
"gsd-core/workflows/verify-phase.md": "73025aa5d8bf7bd5",
|
||||
"gsd-core/workflows/verify-work.md": "ae07b3fa8b6f864e",
|
||||
"hooks/gsd-check-update-worker.js": "385fb7c67810baf6",
|
||||
"hooks/gsd-check-update.js": "4549451414ffa7d7",
|
||||
|
||||
18
tests/fixtures/golden-install-parity/pi.json
vendored
18
tests/fixtures/golden-install-parity/pi.json
vendored
@@ -6,7 +6,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
|
||||
"gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3",
|
||||
"gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0",
|
||||
@@ -23,7 +23,7 @@
|
||||
"gsd-core/references/api-coverage.md": "66264d41dfd9154a",
|
||||
"gsd-core/references/artifact-types.md": "a6d2e1f9453ffbf5",
|
||||
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
|
||||
"gsd-core/references/checkpoints.md": "b1530628d693fc85",
|
||||
"gsd-core/references/checkpoints.md": "c2fe89c42ca88349",
|
||||
"gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29",
|
||||
"gsd-core/references/context-budget.md": "f1ce57bf418824af",
|
||||
"gsd-core/references/continuation-format.md": "ce73e57d053ab8a7",
|
||||
@@ -179,14 +179,14 @@
|
||||
"gsd-core/workflows/add-todo.md": "953314cdfef56bc4",
|
||||
"gsd-core/workflows/ai-integration-phase.md": "45c727e49de71636",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "52942af10f140717",
|
||||
"gsd-core/workflows/audit-fix.md": "ca751f6538c8f496",
|
||||
"gsd-core/workflows/audit-fix.md": "d511f4094ce351aa",
|
||||
"gsd-core/workflows/audit-milestone.md": "3835762c3147a927",
|
||||
"gsd-core/workflows/audit-uat.md": "fcfbec501620b564",
|
||||
"gsd-core/workflows/autonomous.md": "7e5683728ef33707",
|
||||
"gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc",
|
||||
"gsd-core/workflows/cleanup.md": "0daa2f2720c111f1",
|
||||
"gsd-core/workflows/code-review-fix.md": "2e113d1f4350a075",
|
||||
"gsd-core/workflows/code-review.md": "2aa1957579f50a87",
|
||||
"gsd-core/workflows/code-review.md": "c877ad812b4a511e",
|
||||
"gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2",
|
||||
"gsd-core/workflows/debug.md": "98c8ed5af882ef8f",
|
||||
"gsd-core/workflows/diagnose-issues.md": "d6d978fddfd5da8d",
|
||||
@@ -210,11 +210,11 @@
|
||||
"gsd-core/workflows/docs-update.md": "f35922d15b7061c9",
|
||||
"gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04",
|
||||
"gsd-core/workflows/eval-review.md": "f898936e2cfe4130",
|
||||
"gsd-core/workflows/execute-phase.md": "01ccacd935b7c620",
|
||||
"gsd-core/workflows/execute-phase.md": "7c0a1f21258543e0",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "6412aa2edd5a4452",
|
||||
"gsd-core/workflows/explore.md": "6c04f2e658d93261",
|
||||
@@ -269,7 +269,7 @@
|
||||
"gsd-core/workflows/settings-advanced.md": "414db4dbea97ba44",
|
||||
"gsd-core/workflows/settings-integrations.md": "70515c5838fb9826",
|
||||
"gsd-core/workflows/settings.md": "d96ddf01fb85e61e",
|
||||
"gsd-core/workflows/ship.md": "f486f2731ca8b72a",
|
||||
"gsd-core/workflows/ship.md": "369f1461685d1897",
|
||||
"gsd-core/workflows/sketch-wrap-up.md": "838c701bd072ae73",
|
||||
"gsd-core/workflows/sketch.md": "c7725562b3efd311",
|
||||
"gsd-core/workflows/smart-entry.md": "449238eb94abe187",
|
||||
@@ -286,7 +286,7 @@
|
||||
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
|
||||
"gsd-core/workflows/update.md": "7e69d278375a2493",
|
||||
"gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607",
|
||||
"gsd-core/workflows/verify-phase.md": "499a0ade5e21fe6f",
|
||||
"gsd-core/workflows/verify-phase.md": "d26a2c3269340caf",
|
||||
"gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3",
|
||||
"hooks/gsd-check-update-worker.js": "55376b5b9335a580",
|
||||
"hooks/gsd-check-update.js": "a89562537a41f83d",
|
||||
|
||||
20
tests/fixtures/golden-install-parity/qwen.json
vendored
20
tests/fixtures/golden-install-parity/qwen.json
vendored
@@ -34,12 +34,12 @@
|
||||
"agents/gsd-ui-checker.md": "7d708c53a106f748",
|
||||
"agents/gsd-ui-researcher.md": "e3768304c1c77753",
|
||||
"agents/gsd-user-profiler.md": "13388a80dc302a66",
|
||||
"agents/gsd-verifier.md": "113d8dcff860b595",
|
||||
"agents/gsd-verifier.md": "76c590718eac86e5",
|
||||
"gsd-core/.gsd-runtime": "2b626670f713516a",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "6e98d76e955e35a2",
|
||||
"gsd-core/bin/gsd-tools.cjs": "3f367ea99374b291",
|
||||
"gsd-core/bin/gsd-tools.cjs": "ebbae1afe8c7fcd5",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0",
|
||||
@@ -56,7 +56,7 @@
|
||||
"gsd-core/references/api-coverage.md": "205a43c5fa7c221c",
|
||||
"gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e",
|
||||
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
|
||||
"gsd-core/references/checkpoints.md": "83c7ac100419e9e0",
|
||||
"gsd-core/references/checkpoints.md": "5e2d923303f16667",
|
||||
"gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29",
|
||||
"gsd-core/references/context-budget.md": "a1351dd40ef8691f",
|
||||
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
|
||||
@@ -212,14 +212,14 @@
|
||||
"gsd-core/workflows/add-todo.md": "83426131a56b8e77",
|
||||
"gsd-core/workflows/ai-integration-phase.md": "dd58ee9044bdf3c2",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "fe2e5a89d158f9eb",
|
||||
"gsd-core/workflows/audit-fix.md": "83896ff28c48b182",
|
||||
"gsd-core/workflows/audit-milestone.md": "78dbc1e8c4499d7d",
|
||||
"gsd-core/workflows/audit-uat.md": "97d441d07e7972b3",
|
||||
"gsd-core/workflows/autonomous.md": "3014ff90115f0daf",
|
||||
"gsd-core/workflows/check-todos.md": "ec8c22920f6b2df1",
|
||||
"gsd-core/workflows/cleanup.md": "6a18b165752e3087",
|
||||
"gsd-core/workflows/code-review-fix.md": "f3725ae9d685bed2",
|
||||
"gsd-core/workflows/code-review.md": "6076e252b0d315f4",
|
||||
"gsd-core/workflows/code-review.md": "657f309742b1a4c9",
|
||||
"gsd-core/workflows/complete-milestone.md": "40085d32b15805c8",
|
||||
"gsd-core/workflows/debug.md": "09b6bad63939bb82",
|
||||
"gsd-core/workflows/diagnose-issues.md": "652ae26975f82242",
|
||||
@@ -243,11 +243,11 @@
|
||||
"gsd-core/workflows/docs-update.md": "45d2f0d173c84e07",
|
||||
"gsd-core/workflows/edit-phase.md": "0fb5e0123cfc6f36",
|
||||
"gsd-core/workflows/eval-review.md": "6dee8a1e40ececd4",
|
||||
"gsd-core/workflows/execute-phase.md": "e51bcc011f22d197",
|
||||
"gsd-core/workflows/execute-phase.md": "e98c1a00c1cdd6a3",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "36af8d91e4ae8b9c",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "94765e9fc206efbf",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "463e4e1b57b22b24",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "0b04cc2dcab61107",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "9cbf100b17f4bcb1",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "25ef51fc9900f4b4",
|
||||
"gsd-core/workflows/explore.md": "e1a83a8982532e5b",
|
||||
@@ -302,7 +302,7 @@
|
||||
"gsd-core/workflows/settings-advanced.md": "5e05212fb5cba531",
|
||||
"gsd-core/workflows/settings-integrations.md": "29c5de27fbbb18e9",
|
||||
"gsd-core/workflows/settings.md": "26b9b7979d3a5747",
|
||||
"gsd-core/workflows/ship.md": "a07a8ab18935985a",
|
||||
"gsd-core/workflows/ship.md": "55cc3a0b0d188021",
|
||||
"gsd-core/workflows/sketch-wrap-up.md": "89e0eab2af946b04",
|
||||
"gsd-core/workflows/sketch.md": "483387542d6fc3af",
|
||||
"gsd-core/workflows/smart-entry.md": "d309710bcabd4675",
|
||||
@@ -319,7 +319,7 @@
|
||||
"gsd-core/workflows/undo.md": "791e0bf96d9a057f",
|
||||
"gsd-core/workflows/update.md": "b34cb866152d4de3",
|
||||
"gsd-core/workflows/validate-phase.md": "dfb9bd178ee1b67b",
|
||||
"gsd-core/workflows/verify-phase.md": "683719ec1ee82e38",
|
||||
"gsd-core/workflows/verify-phase.md": "7d8e241350136ca0",
|
||||
"gsd-core/workflows/verify-work.md": "3355ddc14f052fff",
|
||||
"hooks/gsd-check-update-worker.js": "4bb354044e0dff91",
|
||||
"hooks/gsd-check-update.js": "d2065cb3e725a42a",
|
||||
|
||||
20
tests/fixtures/golden-install-parity/trae.json
vendored
20
tests/fixtures/golden-install-parity/trae.json
vendored
@@ -34,12 +34,12 @@
|
||||
"agents/gsd-ui-checker.md": "7ecd910efa6eb00e",
|
||||
"agents/gsd-ui-researcher.md": "9e1a84a55a4cac99",
|
||||
"agents/gsd-user-profiler.md": "622220df0654b6bf",
|
||||
"agents/gsd-verifier.md": "99e95e235aacffbf",
|
||||
"agents/gsd-verifier.md": "6c7e68a4a64cac57",
|
||||
"gsd-core/.gsd-runtime": "c96852d55ce78a68",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "de4627dff103d527",
|
||||
"gsd-core/bin/gsd-tools.cjs": "84762454c60a6c9a",
|
||||
"gsd-core/bin/gsd-tools.cjs": "1673458b3332be8a",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0",
|
||||
@@ -56,7 +56,7 @@
|
||||
"gsd-core/references/api-coverage.md": "205a43c5fa7c221c",
|
||||
"gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e",
|
||||
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
|
||||
"gsd-core/references/checkpoints.md": "610690dba4d600c1",
|
||||
"gsd-core/references/checkpoints.md": "4d24ce110ed6c746",
|
||||
"gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29",
|
||||
"gsd-core/references/context-budget.md": "b7e9640063775c98",
|
||||
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
|
||||
@@ -212,14 +212,14 @@
|
||||
"gsd-core/workflows/add-todo.md": "fefa923ed596225f",
|
||||
"gsd-core/workflows/ai-integration-phase.md": "197ebcc6abb0b873",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "2d4d783caf51f781",
|
||||
"gsd-core/workflows/audit-fix.md": "eb92f0de6ccc23a5",
|
||||
"gsd-core/workflows/audit-milestone.md": "ebec95af8f68f2ed",
|
||||
"gsd-core/workflows/audit-uat.md": "6e768b1c208a787a",
|
||||
"gsd-core/workflows/autonomous.md": "c482645c5d1ead46",
|
||||
"gsd-core/workflows/check-todos.md": "0dda8236355e8c9c",
|
||||
"gsd-core/workflows/cleanup.md": "82f65f5214ecd748",
|
||||
"gsd-core/workflows/code-review-fix.md": "f2761f7f8c4a5674",
|
||||
"gsd-core/workflows/code-review.md": "c5311718997f7681",
|
||||
"gsd-core/workflows/code-review.md": "41f0c51d8c4e7732",
|
||||
"gsd-core/workflows/complete-milestone.md": "6e918b72bd885426",
|
||||
"gsd-core/workflows/debug.md": "04b29e0ba18603b6",
|
||||
"gsd-core/workflows/diagnose-issues.md": "9274b11a3db98c65",
|
||||
@@ -243,11 +243,11 @@
|
||||
"gsd-core/workflows/docs-update.md": "f13571f08e083356",
|
||||
"gsd-core/workflows/edit-phase.md": "7facd0faa33c8cad",
|
||||
"gsd-core/workflows/eval-review.md": "37d545d4f0db4927",
|
||||
"gsd-core/workflows/execute-phase.md": "13789ed1d5ffc4e4",
|
||||
"gsd-core/workflows/execute-phase.md": "73649315fea5bd61",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "c985a30317a1aa6b",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "06f115a379580094",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "9d58274a5a1b14f5",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7d30384e9bf82664",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "90efedae3decaffe",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "1a409bc80100b6ee",
|
||||
"gsd-core/workflows/explore.md": "8a5437aa0c239c38",
|
||||
@@ -302,7 +302,7 @@
|
||||
"gsd-core/workflows/settings-advanced.md": "39e66386f6c48025",
|
||||
"gsd-core/workflows/settings-integrations.md": "f8f756709ec02363",
|
||||
"gsd-core/workflows/settings.md": "44b10c59215633b8",
|
||||
"gsd-core/workflows/ship.md": "1d471a767b11e961",
|
||||
"gsd-core/workflows/ship.md": "7d6e81541d393db2",
|
||||
"gsd-core/workflows/sketch-wrap-up.md": "dbec602d104cb951",
|
||||
"gsd-core/workflows/sketch.md": "44ff275150b6d045",
|
||||
"gsd-core/workflows/smart-entry.md": "d8018578571f08d5",
|
||||
@@ -319,7 +319,7 @@
|
||||
"gsd-core/workflows/undo.md": "59b8baa54efc4110",
|
||||
"gsd-core/workflows/update.md": "1f935251fca1f276",
|
||||
"gsd-core/workflows/validate-phase.md": "58fd1a0a679d7115",
|
||||
"gsd-core/workflows/verify-phase.md": "40047a62ab2da6b2",
|
||||
"gsd-core/workflows/verify-phase.md": "101bf5a6e15f0b04",
|
||||
"gsd-core/workflows/verify-work.md": "dde2a42a56c27c4e",
|
||||
"scripts/changeset/README.md": "86ff89331dfd94b2",
|
||||
"scripts/changeset/cli.cjs": "68f92a344b199271",
|
||||
|
||||
@@ -34,12 +34,12 @@
|
||||
"agents/gsd-ui-checker.md": "56698909c270b130",
|
||||
"agents/gsd-ui-researcher.md": "c348aa3ff8412ecb",
|
||||
"agents/gsd-user-profiler.md": "622220df0654b6bf",
|
||||
"agents/gsd-verifier.md": "a07b00b9c5b7b338",
|
||||
"agents/gsd-verifier.md": "4c43a4929c6f8013",
|
||||
"gsd-core/.gsd-runtime": "fe100af8906532d6",
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "5636ca0b726871b2",
|
||||
"gsd-core/bin/gsd-tools.cjs": "3a0f24b2def05244",
|
||||
"gsd-core/bin/gsd-tools.cjs": "ecc544c0f939432b",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0",
|
||||
@@ -56,7 +56,7 @@
|
||||
"gsd-core/references/api-coverage.md": "205a43c5fa7c221c",
|
||||
"gsd-core/references/artifact-types.md": "8bd01fd75a2ba70e",
|
||||
"gsd-core/references/autonomous-smart-discuss.md": "273b371c5751f35a",
|
||||
"gsd-core/references/checkpoints.md": "de9f3b7bd86a44ac",
|
||||
"gsd-core/references/checkpoints.md": "900530adaf675e38",
|
||||
"gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29",
|
||||
"gsd-core/references/context-budget.md": "ff843cd6139c8564",
|
||||
"gsd-core/references/continuation-format.md": "580287399ad3ba68",
|
||||
@@ -212,14 +212,14 @@
|
||||
"gsd-core/workflows/add-todo.md": "50d17053c6cfbc31",
|
||||
"gsd-core/workflows/ai-integration-phase.md": "e556fe979752c52b",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "fe4d636f2dca6d74",
|
||||
"gsd-core/workflows/audit-fix.md": "f12182fa57f92cb5",
|
||||
"gsd-core/workflows/audit-milestone.md": "868db5a8f5d55040",
|
||||
"gsd-core/workflows/audit-uat.md": "d496e39402e160de",
|
||||
"gsd-core/workflows/autonomous.md": "fe7bb7c978f305a2",
|
||||
"gsd-core/workflows/check-todos.md": "afc840fceb07bf99",
|
||||
"gsd-core/workflows/cleanup.md": "93c14107979a4428",
|
||||
"gsd-core/workflows/code-review-fix.md": "b99b1f20bb27c291",
|
||||
"gsd-core/workflows/code-review.md": "ac70888b14a21aaf",
|
||||
"gsd-core/workflows/code-review.md": "a89512ce6c30693c",
|
||||
"gsd-core/workflows/complete-milestone.md": "f463bf4e86ac26f6",
|
||||
"gsd-core/workflows/debug.md": "830c309b48c35c8c",
|
||||
"gsd-core/workflows/diagnose-issues.md": "447072aa72385271",
|
||||
@@ -243,11 +243,11 @@
|
||||
"gsd-core/workflows/docs-update.md": "70f73cc8c27e0ca0",
|
||||
"gsd-core/workflows/edit-phase.md": "c0ae7d0063f3e789",
|
||||
"gsd-core/workflows/eval-review.md": "b28be79ef29f16fd",
|
||||
"gsd-core/workflows/execute-phase.md": "0fc874e8103061d5",
|
||||
"gsd-core/workflows/execute-phase.md": "1b27831de2d19613",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "47ae5482f8e64100",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "003c6a0f21a4aa61",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "e469e777fb8e7fbb",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "fb4497767cdf73a3",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "c54d55fad3ab5263",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "864931070aedf894",
|
||||
"gsd-core/workflows/explore.md": "04e461ff8159a24e",
|
||||
@@ -302,7 +302,7 @@
|
||||
"gsd-core/workflows/settings-advanced.md": "2f86ec7b998f9485",
|
||||
"gsd-core/workflows/settings-integrations.md": "b082fc518b484c07",
|
||||
"gsd-core/workflows/settings.md": "002eb0ce3c10c741",
|
||||
"gsd-core/workflows/ship.md": "4ff6590f1e04f124",
|
||||
"gsd-core/workflows/ship.md": "6f611c07a1d34ff2",
|
||||
"gsd-core/workflows/sketch-wrap-up.md": "10063f56c2c7f141",
|
||||
"gsd-core/workflows/sketch.md": "25c1f8f7acfb1da9",
|
||||
"gsd-core/workflows/smart-entry.md": "bd81482cb6a7ac53",
|
||||
@@ -319,7 +319,7 @@
|
||||
"gsd-core/workflows/undo.md": "18dec684fb1076f9",
|
||||
"gsd-core/workflows/update.md": "79aaf4b8f1f83045",
|
||||
"gsd-core/workflows/validate-phase.md": "bf16fd7ff71286b2",
|
||||
"gsd-core/workflows/verify-phase.md": "8b7122e986853576",
|
||||
"gsd-core/workflows/verify-phase.md": "382490481d794ed5",
|
||||
"gsd-core/workflows/verify-work.md": "cce8ae44b30957f1",
|
||||
"hooks/gsd-windsurf-pre-command.js": "7467a8a63e354aad",
|
||||
"hooks/gsd-windsurf-pre-write.js": "1c8a776d7ae2dcce",
|
||||
|
||||
20
tests/fixtures/golden-install-parity/zcode.json
vendored
20
tests/fixtures/golden-install-parity/zcode.json
vendored
@@ -34,7 +34,7 @@
|
||||
"agents/gsd-ui-checker.md": "15949ccab982b71c",
|
||||
"agents/gsd-ui-researcher.md": "0e8ec8509d476904",
|
||||
"agents/gsd-user-profiler.md": "ca3bf75581f211a0",
|
||||
"agents/gsd-verifier.md": "8282761ba471c022",
|
||||
"agents/gsd-verifier.md": "cd5bea62bf704829",
|
||||
"commands/gsd-add-tests.md": "51542808862d4aa7",
|
||||
"commands/gsd-ai-integration-phase.md": "a693c0ade172bc3d",
|
||||
"commands/gsd-audit-fix.md": "24d7e5478c271584",
|
||||
@@ -110,7 +110,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
|
||||
"gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3",
|
||||
"gsd-core/bin/gsd-tools.cjs": "acf82db0f1b06ae8",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0",
|
||||
@@ -127,7 +127,7 @@
|
||||
"gsd-core/references/api-coverage.md": "66264d41dfd9154a",
|
||||
"gsd-core/references/artifact-types.md": "a6d2e1f9453ffbf5",
|
||||
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
|
||||
"gsd-core/references/checkpoints.md": "b1530628d693fc85",
|
||||
"gsd-core/references/checkpoints.md": "c2fe89c42ca88349",
|
||||
"gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29",
|
||||
"gsd-core/references/context-budget.md": "f1ce57bf418824af",
|
||||
"gsd-core/references/continuation-format.md": "ce73e57d053ab8a7",
|
||||
@@ -283,14 +283,14 @@
|
||||
"gsd-core/workflows/add-todo.md": "953314cdfef56bc4",
|
||||
"gsd-core/workflows/ai-integration-phase.md": "45c727e49de71636",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "52942af10f140717",
|
||||
"gsd-core/workflows/audit-fix.md": "ca751f6538c8f496",
|
||||
"gsd-core/workflows/audit-fix.md": "d511f4094ce351aa",
|
||||
"gsd-core/workflows/audit-milestone.md": "3835762c3147a927",
|
||||
"gsd-core/workflows/audit-uat.md": "fcfbec501620b564",
|
||||
"gsd-core/workflows/autonomous.md": "7e5683728ef33707",
|
||||
"gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc",
|
||||
"gsd-core/workflows/cleanup.md": "0daa2f2720c111f1",
|
||||
"gsd-core/workflows/code-review-fix.md": "2e113d1f4350a075",
|
||||
"gsd-core/workflows/code-review.md": "2aa1957579f50a87",
|
||||
"gsd-core/workflows/code-review.md": "c877ad812b4a511e",
|
||||
"gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2",
|
||||
"gsd-core/workflows/debug.md": "98c8ed5af882ef8f",
|
||||
"gsd-core/workflows/diagnose-issues.md": "aa8d787db8f3c46c",
|
||||
@@ -314,11 +314,11 @@
|
||||
"gsd-core/workflows/docs-update.md": "f35922d15b7061c9",
|
||||
"gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04",
|
||||
"gsd-core/workflows/eval-review.md": "f898936e2cfe4130",
|
||||
"gsd-core/workflows/execute-phase.md": "2f43fae80c4c4fab",
|
||||
"gsd-core/workflows/execute-phase.md": "19fffcd1a2d76d4e",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "ee300f9c6f7626c8",
|
||||
"gsd-core/workflows/explore.md": "6c04f2e658d93261",
|
||||
@@ -373,7 +373,7 @@
|
||||
"gsd-core/workflows/settings-advanced.md": "414db4dbea97ba44",
|
||||
"gsd-core/workflows/settings-integrations.md": "70515c5838fb9826",
|
||||
"gsd-core/workflows/settings.md": "d96ddf01fb85e61e",
|
||||
"gsd-core/workflows/ship.md": "f486f2731ca8b72a",
|
||||
"gsd-core/workflows/ship.md": "369f1461685d1897",
|
||||
"gsd-core/workflows/sketch-wrap-up.md": "86db87b16548117e",
|
||||
"gsd-core/workflows/sketch.md": "e96f1866d3e60cab",
|
||||
"gsd-core/workflows/smart-entry.md": "449238eb94abe187",
|
||||
@@ -390,7 +390,7 @@
|
||||
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
|
||||
"gsd-core/workflows/update.md": "dc580dee13f881a6",
|
||||
"gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607",
|
||||
"gsd-core/workflows/verify-phase.md": "499a0ade5e21fe6f",
|
||||
"gsd-core/workflows/verify-phase.md": "d26a2c3269340caf",
|
||||
"gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3",
|
||||
"scripts/changeset/README.md": "86ff89331dfd94b2",
|
||||
"scripts/changeset/cli.cjs": "68f92a344b199271",
|
||||
|
||||
281
tests/run-with-timeout.test.cjs
Normal file
281
tests/run-with-timeout.test.cjs
Normal file
@@ -0,0 +1,281 @@
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* #2351 — `gsd_run run-with-timeout`: a portable, coreutils-independent
|
||||
* wall-clock cap for a spawned command, plus the parity guard that keeps
|
||||
* hardcoded GNU `timeout` from reappearing in workflow/agent/reference markdown.
|
||||
*
|
||||
* Root cause it fixes: workflow gates hardcoded `timeout <n> <cmd>`. `timeout`
|
||||
* is GNU coreutils; stock macOS ships neither it nor `gtimeout`, so the call
|
||||
* exited 127 ("command not found") and a passing build/test was misreported as
|
||||
* a FAILURE. The verb replaces every such call with a Node-based cap that keeps
|
||||
* GNU `timeout`'s exit-code contract (124 on timeout) on every platform.
|
||||
*
|
||||
* These are behavioral tests driven through the real CLI entrypoint
|
||||
* (spawnSync of gsd-tools.cjs), never source-text assertions. The parity block
|
||||
* consumes the lint module's typed findings, not grepped text.
|
||||
*/
|
||||
|
||||
const { describe, test } = require('node:test');
|
||||
const assert = require('node:assert/strict');
|
||||
const { spawnSync } = require('node:child_process');
|
||||
const os = require('node:os');
|
||||
const path = require('node:path');
|
||||
const fs = require('node:fs');
|
||||
const { setTimeout: sleep } = require('node:timers/promises');
|
||||
const { createTempDir, cleanup } = require('./helpers.cjs');
|
||||
|
||||
const ROOT = path.join(__dirname, '..');
|
||||
const GSD_TOOLS = path.join(ROOT, 'gsd-core', 'bin', 'gsd-tools.cjs');
|
||||
const NODE = process.execPath;
|
||||
|
||||
// run-with-timeout intercepts before gsd-tools' cwd/workstream resolution, so it
|
||||
// needs no project fixture — run from a neutral temp dir to prove independence.
|
||||
function runVerb(args, opts = {}) {
|
||||
return spawnSync(NODE, [GSD_TOOLS, 'run-with-timeout', ...args], {
|
||||
cwd: os.tmpdir(),
|
||||
encoding: 'utf8',
|
||||
timeout: 30000, // test-harness backstop; the verb's own cap is what we assert
|
||||
...opts,
|
||||
});
|
||||
}
|
||||
|
||||
// A guaranteed-hanging child, cross-platform (no reliance on `sleep`).
|
||||
const HANG = [NODE, '-e', 'setTimeout(() => {}, 60000)'];
|
||||
// A guaranteed-fast child.
|
||||
const OK = [NODE, '-e', 'process.exit(0)'];
|
||||
|
||||
describe('#2351 run-with-timeout — exit-code contract', () => {
|
||||
test('passes a fast zero-exit command through as exit 0', () => {
|
||||
const r = runVerb(['5', '--', ...OK]);
|
||||
assert.equal(r.status, 0);
|
||||
});
|
||||
|
||||
test('passes a non-zero exit code through unchanged', () => {
|
||||
const r = runVerb(['5', '--', NODE, '-e', 'process.exit(7)']);
|
||||
assert.equal(r.status, 7);
|
||||
});
|
||||
|
||||
test('exits 124 when the wall-clock budget is exceeded (matches GNU timeout)', () => {
|
||||
const start = Date.now();
|
||||
const r = runVerb(['1', '--', ...HANG]);
|
||||
assert.equal(r.status, 124, 'a timed-out command must exit 124');
|
||||
// Sanity: the cap actually fired promptly, not the 30s harness backstop.
|
||||
assert.ok(Date.now() - start < 15000, 'timeout should fire near the 1s budget');
|
||||
});
|
||||
|
||||
test('exits 127 when the command is not found (matches GNU timeout)', () => {
|
||||
const r = runVerb(['5', '--', 'this-command-does-not-exist-2351']);
|
||||
assert.equal(r.status, 127);
|
||||
});
|
||||
|
||||
test('runs without a timer when <seconds> is 0 — a slow child is NOT killed', () => {
|
||||
// Proves 0 = no timer (not "timer fired at 0ms"): a child that outlives any
|
||||
// mis-armed timer must still exit 0. A wrongly-armed 0ms timer would give 124.
|
||||
const r = runVerb(['0', '--', NODE, '-e', 'setTimeout(() => process.exit(0), 1500)']);
|
||||
assert.equal(r.status, 0, '<seconds> 0 must run untimed');
|
||||
});
|
||||
|
||||
test('a budget past the 32-bit setTimeout ceiling does not spuriously time out', () => {
|
||||
// secs*1000 > 2**31-1 → Node clamps setTimeout to 1ms → an immediate false 124
|
||||
// unless the delay is capped. The fast child must still exit 0, with no warning.
|
||||
const r = runVerb(['3000000', '--', ...OK]);
|
||||
assert.equal(r.status, 0, 'oversized budget must not fire an immediate timeout');
|
||||
assert.doesNotMatch(r.stderr || '', /TimeoutOverflowWarning/, 'delay must be clamped');
|
||||
});
|
||||
});
|
||||
|
||||
describe('#2351 run-with-timeout — argument handling (negative matrix)', () => {
|
||||
test('missing <seconds> is a usage error (exit 2), not a crash', () => {
|
||||
const r = runVerb([]);
|
||||
assert.equal(r.status, 2);
|
||||
assert.match(r.stderr, /missing <seconds>/);
|
||||
assert.doesNotMatch(r.stderr, /at Object|at Module|\.cjs:\d+/, 'no stack trace in usage error');
|
||||
});
|
||||
|
||||
test('non-numeric <seconds> is a usage error (exit 2)', () => {
|
||||
const r = runVerb(['not-a-number', '--', ...OK]);
|
||||
assert.equal(r.status, 2);
|
||||
assert.match(r.stderr, /invalid <seconds>/);
|
||||
});
|
||||
|
||||
test('blank / whitespace <seconds> is a usage error — never a silent unbounded run', () => {
|
||||
for (const blank of ['', ' ']) {
|
||||
const r = runVerb([blank, '--', ...OK]);
|
||||
assert.equal(r.status, 2, `blank seconds ${JSON.stringify(blank)} must error, not disable the timer`);
|
||||
assert.match(r.stderr, /invalid <seconds>/);
|
||||
}
|
||||
});
|
||||
|
||||
test('missing <command> is a usage error (exit 2)', () => {
|
||||
const r = runVerb(['5']);
|
||||
assert.equal(r.status, 2);
|
||||
assert.match(r.stderr, /missing <command>/);
|
||||
});
|
||||
|
||||
test('a trailing `s` on the duration is accepted (GNU-style unit)', () => {
|
||||
const r = runVerb(['5s', '--', ...OK]);
|
||||
assert.equal(r.status, 0);
|
||||
});
|
||||
|
||||
test('the `--` separator is optional', () => {
|
||||
const r = runVerb(['5', ...OK]);
|
||||
assert.equal(r.status, 0);
|
||||
});
|
||||
|
||||
test("the wrapped command's argv is opaque — gsd-tools flags are NOT consumed", (t) => {
|
||||
// --raw / --cwd / --pick are gsd-tools' own global flags. They must reach the
|
||||
// wrapped command verbatim, not be stripped by the dispatcher. Use a script
|
||||
// FILE, not `node -e` — node parses leading --flags after -e as its OWN options
|
||||
// ("bad option", exit 9); after a script path it treats them as argv.
|
||||
const dir = createTempDir('rwt-argv');
|
||||
t.after(() => cleanup(dir));
|
||||
const script = path.join(dir, 'argcheck.js');
|
||||
fs.writeFileSync(script,
|
||||
'process.exit(process.argv.slice(2).join(",") === "--raw,--cwd,x,--pick,y" ? 0 : 3);');
|
||||
const r = runVerb(['5', '--', NODE, script, '--raw', '--cwd', 'x', '--pick', 'y']);
|
||||
assert.equal(r.status, 0, 'wrapped --raw/--cwd/--pick must be passed through untouched');
|
||||
});
|
||||
|
||||
test('the `query` meta-prefix form is accepted', () => {
|
||||
const r = spawnSync(NODE, [GSD_TOOLS, 'query', 'run-with-timeout', '5', '--', ...OK], {
|
||||
cwd: os.tmpdir(), encoding: 'utf8', timeout: 30000,
|
||||
});
|
||||
assert.equal(r.status, 0);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#2351 run-with-timeout — kill semantics (POSIX process groups)', () => {
|
||||
const posix = process.platform !== 'win32';
|
||||
|
||||
test('a timed-out command whose descendant traps SIGTERM is still reaped — no orphan/hang (C1)', { skip: !posix }, async (t) => {
|
||||
// The HIGH-severity regression: the direct child exits on SIGTERM fast, but a
|
||||
// descendant that IGNORES SIGTERM survives holding the inherited stdio. The
|
||||
// whole process group must be SIGKILL-reaped, or a captured/piped gate hangs
|
||||
// on the orphan. A node parent spawns the trapping child in the SAME process
|
||||
// group (spawn WITHOUT `detached` → the child inherits the parent's pgid,
|
||||
// deterministically, on every platform). We deliberately avoid `bash … &`:
|
||||
// bash job-control can move a backgrounded job into its own process group,
|
||||
// which no group-kill (nor GNU `timeout`) can reach. The parent exits fast on
|
||||
// SIGTERM; the child ignores it and must still be reaped.
|
||||
//
|
||||
// Liveness is detected by a HEARTBEAT the child rewrites every 100ms — NOT
|
||||
// `kill(pid, 0)`: a SIGKILL'd orphan lingers as a zombie until reaped, and a
|
||||
// container's PID 1 reaps slowly, so `kill(pid,0)` reads a dead child as
|
||||
// "alive". A reaped child stops ticking; a genuine orphan keeps ticking.
|
||||
const dir = createTempDir('rwt-c1');
|
||||
t.after(() => cleanup(dir));
|
||||
const parentFile = path.join(dir, 'parent.js');
|
||||
const hbFile = path.join(dir, 'heartbeat');
|
||||
fs.writeFileSync(parentFile, [
|
||||
'const cp = require("child_process");',
|
||||
"const childCode = 'const fs=require(\"fs\");const hb=process.argv[1];process.on(\"SIGTERM\",()=>{});setInterval(()=>fs.writeFileSync(hb,String(Date.now())),100);';",
|
||||
'cp.spawn(process.execPath, ["-e", childCode, process.argv[2]], { stdio: "ignore" });',
|
||||
'process.on("SIGTERM", () => process.exit(0));',
|
||||
'setInterval(() => {}, 1000);',
|
||||
].join('\n'));
|
||||
const r = runVerb(['1', '--', NODE, parentFile, hbFile], { timeout: 20000 });
|
||||
assert.equal(r.status, 124, 'must report a timeout (124), not hang');
|
||||
assert.ok(fs.existsSync(hbFile), 'child heartbeat should exist');
|
||||
await sleep(300); // let any in-flight write settle after the SIGKILL
|
||||
const first = fs.readFileSync(hbFile, 'utf8');
|
||||
await sleep(600); // >> the 100ms heartbeat interval
|
||||
const second = fs.readFileSync(hbFile, 'utf8');
|
||||
assert.equal(second, first, 'descendant must be reaped (heartbeat frozen), not orphaned and still ticking');
|
||||
});
|
||||
|
||||
test('a command killed by a signal exits 128+signum (bash convention)', { skip: !posix }, () => {
|
||||
const r = runVerb(['10', '--', 'bash', '-c', 'kill -TERM $$']);
|
||||
assert.equal(r.status, 143, 'self-SIGTERM (15) → 128+15 = 143');
|
||||
});
|
||||
});
|
||||
|
||||
describe('#2351 run-with-timeout — coreutils independence (the regression)', () => {
|
||||
// The whole point: no dependency on GNU `timeout`/`gtimeout`. Prove it by
|
||||
// scrubbing PATH so neither could be found, and driving the child by absolute
|
||||
// path. Before #2351 the gates called `timeout …` directly and exited 127 here.
|
||||
const scrubbedEnv = { ...process.env, PATH: '' };
|
||||
|
||||
test('a real zero-exit command passes even with an empty PATH (no coreutils)', () => {
|
||||
const r = runVerb(['5', '--', ...OK], { env: scrubbedEnv });
|
||||
assert.equal(r.status, 0, 'must pass (exit 0), not 127, when coreutils is absent');
|
||||
});
|
||||
|
||||
test('a genuine timeout is still detected (exit 124) with an empty PATH', () => {
|
||||
const r = runVerb(['1', '--', ...HANG], { env: scrubbedEnv });
|
||||
assert.equal(r.status, 124);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#2351 parity guard — no hardcoded timeout in workflow/agent/reference/command md', () => {
|
||||
const { findRawTimeoutInvocations, scan, DEFAULT_ROOTS } = require('../scripts/lint-portable-timeout.cjs');
|
||||
|
||||
// Decoy fixtures sourced from the issue report (an author independent of the
|
||||
// detector), per the fixture-provenance rule (#2371): the exact bug forms the
|
||||
// guard must catch.
|
||||
const BUG_FORMS = [
|
||||
'timeout 300 bash -c "$BUILD_CMD" 2>&1',
|
||||
'timeout "$TEST_GATE_TIMEOUT" bash -c "$TEST_CMD" 2>&1',
|
||||
'timeout "$TEST_GATE_TIMEOUT" bash -c "$AUDIT_TEST_CMD" 2>&1 | tail -20',
|
||||
'echo "$TASK_PROMPT" | timeout "${CROSS_AI_TIMEOUT}s" ${CROSS_AI_CMD} > out 2>err',
|
||||
'timeout 120 "$FALLOW_BIN" audit --format json --quiet',
|
||||
'REVIEW_OUTPUT=$(echo "$X" | timeout 120 ${REVIEW_CMD} 2>/tmp/e.log)',
|
||||
'timeout 30s bash "$probe"',
|
||||
'gtimeout 60 bash -c "x"',
|
||||
// GNU long options / no-space short opt / arithmetic budget (review #2351 C3)
|
||||
'timeout --kill-after=5 30 bash -c x',
|
||||
'timeout --foreground 30 bash -c x',
|
||||
'timeout --signal=KILL 30 bash -c x',
|
||||
'timeout -k5 30 bash -c x',
|
||||
'timeout $((60*5)) bash -c x',
|
||||
'cmd && timeout 30 bash x',
|
||||
];
|
||||
|
||||
// Forms that must NEVER be flagged: the approved verb, portable capability
|
||||
// probes, config keys, the agy flag, prose, and variable names.
|
||||
const CLEAN_FORMS = [
|
||||
'gsd_run run-with-timeout 300 -- bash -c "$BUILD_CMD"',
|
||||
'echo "$X" | gsd_run run-with-timeout "${CROSS_AI_TIMEOUT}" -- ${CROSS_AI_CMD}',
|
||||
'_AGY_KILLER="$(command -v timeout 2>/dev/null || command -v gtimeout 2>/dev/null || true)"',
|
||||
'"$_AGY_KILLER" 600 agy --print-timeout 540s "$@" -p "$PROMPT"',
|
||||
'TEST_GATE_TIMEOUT=$(gsd_run query config-get workflow.test_gate_timeout || echo "600")',
|
||||
'echo "⚠ test gate timed out after ${TEST_GATE_TIMEOUT}s"',
|
||||
'# bound the build with a 5-minute timeout',
|
||||
'const TIMEOUT = 300;',
|
||||
// prose mentions of "timeout <n>" mid-sentence must not be flagged (review #2351 C4)
|
||||
'increase the timeout 30 seconds if the runner is slow',
|
||||
'# we replaced timeout 300 with the run-with-timeout verb',
|
||||
'sometimeout 30 is not the timeout command',
|
||||
];
|
||||
|
||||
for (const form of BUG_FORMS) {
|
||||
test(`flags a bare timeout invocation: ${form.slice(0, 42)}…`, () => {
|
||||
const findings = findRawTimeoutInvocations(form);
|
||||
assert.equal(findings.length, 1, `should flag: ${form}`);
|
||||
assert.equal(findings[0].line, 1);
|
||||
});
|
||||
}
|
||||
|
||||
for (const form of CLEAN_FORMS) {
|
||||
test(`does not flag a portable/unrelated form: ${form.slice(0, 42)}…`, () => {
|
||||
assert.deepEqual(findRawTimeoutInvocations(form), [], `should NOT flag: ${form}`);
|
||||
});
|
||||
}
|
||||
|
||||
test('multi-line input reports the correct line numbers', () => {
|
||||
const text = ['clean line', 'gsd_run run-with-timeout 5 -- true', 'timeout 30 bash x'].join('\n');
|
||||
const findings = findRawTimeoutInvocations(text);
|
||||
assert.equal(findings.length, 1);
|
||||
assert.equal(findings[0].line, 3);
|
||||
});
|
||||
|
||||
test('every shipped workflow/agent/reference/command surface is clean (regression)', () => {
|
||||
// Would have returned 10 offenders before the #2351 conversions landed.
|
||||
const offenders = scan(DEFAULT_ROOTS);
|
||||
assert.deepEqual(
|
||||
offenders,
|
||||
[],
|
||||
`hardcoded timeout still present:\n${offenders.map((o) => `${o.file}:${o.line} ${o.snippet}`).join('\n')}`,
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -7,12 +7,12 @@
|
||||
* Three gates were UNBOUNDED or silently-continued and are the core fix. They must:
|
||||
* - route the resolved command through the shared `normalize-test-command`
|
||||
* helper (defeats vitest/jest watch mode), so the paths cannot drift,
|
||||
* - bound execution with `timeout` using the `workflow.test_gate_timeout`
|
||||
* budget, and
|
||||
* - bound execution with `gsd_run run-with-timeout` using the
|
||||
* `workflow.test_gate_timeout` budget, and
|
||||
* - surface a timeout (exit 124) with a watch-mode hint — the regression gate
|
||||
* ABORTS, the others surface clearly (never silently ignored).
|
||||
*
|
||||
* verify-phase's gate was ALREADY bounded (a fixed `timeout 300`, not a hang), so
|
||||
* verify-phase's gate was ALREADY bounded (a fixed `run-with-timeout 300`, not a hang), so
|
||||
* it only needs the normalizer (so a watch runner exits fast) and keeps its own
|
||||
* fixed 5-minute bound — asserted separately below.
|
||||
*/
|
||||
@@ -50,7 +50,7 @@ describe('#1857: test gates normalize to one-shot and bound with a timeout', ()
|
||||
test('bounds execution with a timeout using the workflow.test_gate_timeout budget', () => {
|
||||
const c = read(file);
|
||||
assert.match(c, /workflow\.test_gate_timeout/, `${label} must read workflow.test_gate_timeout`);
|
||||
assert.match(c, /timeout "\$TEST_GATE_TIMEOUT"/, `${label} must wrap the test command in a timeout with the configured budget`);
|
||||
assert.match(c, /run-with-timeout "\$TEST_GATE_TIMEOUT"/, `${label} must wrap the test command in run-with-timeout with the configured budget`);
|
||||
});
|
||||
test('surfaces a timeout (exit 124) with a watch-mode hint — never a silent hang', () => {
|
||||
const c = read(file);
|
||||
@@ -60,7 +60,7 @@ describe('#1857: test gates normalize to one-shot and bound with a timeout', ()
|
||||
});
|
||||
}
|
||||
|
||||
// verify-phase is already bounded (fixed `timeout 300`, not a hang); it only
|
||||
// verify-phase is already bounded (fixed `run-with-timeout 300`, not a hang); it only
|
||||
// needs the normalizer so a watch runner exits fast, and names watch mode on 124.
|
||||
describe('verify-phase gate (already bounded — normalize-only)', () => {
|
||||
test('routes the resolved command through the shared normalize-test-command helper', () => {
|
||||
|
||||
@@ -180,11 +180,11 @@ describe('bug #3321: gsd-verifier runs probes instead of trusting SUMMARY claims
|
||||
assert.deepEqual(contract.executionSteps, [
|
||||
'Build the `PROBES` list from explicit PLAN declarations first; include conventional `scripts/*/tests/probe-*.sh` when the phase is a migration/tooling phase or the success criteria mention probes.',
|
||||
'For every documented probe path, if the file is missing or unreadable, mark `MISSING_PROBE` and set `status: gaps_found`. Do not require the executable bit because probes run through `bash "$probe"`.',
|
||||
'Run each probe from the built `PROBES` list (declared + conventional) from the repository root:',
|
||||
'Run each probe from the built `PROBES` list from the repository root:',
|
||||
'Exit code 0 is PASS. Any non-zero exit is FAILED and must include stdout/stderr evidence in VERIFICATION.md.',
|
||||
'Do not substitute executor narration, SUMMARY.md PASS-marker counts, or a different dry-run driver command for the probe result.',
|
||||
]);
|
||||
assert.equal(contract.executionCommand, 'for probe in "${PROBES[@]}"; do\n timeout 30s bash "$probe"\ndone');
|
||||
assert.equal(contract.executionCommand, 'for probe in "${PROBES[@]}"; do\n gsd_run run-with-timeout 30 -- bash "$probe"\ndone');
|
||||
assert.deepEqual(contract.statusRows, [{
|
||||
probe: 'scripts/.../probe-name.sh',
|
||||
command: 'bash "$probe"',
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
"add-todo.md": 10734,
|
||||
"ai-integration-phase.md": 15134,
|
||||
"analyze-dependencies.md": 3887,
|
||||
"audit-fix.md": 11723,
|
||||
"audit-fix.md": 11743,
|
||||
"audit-milestone.md": 18448,
|
||||
"audit-uat.md": 7469,
|
||||
"autonomous.md": 42474,
|
||||
"check-todos.md": 9475,
|
||||
"cleanup.md": 9941,
|
||||
"code-review-fix.md": 24320,
|
||||
"code-review.md": 32504,
|
||||
"code-review.md": 32524,
|
||||
"complete-milestone.md": 31071,
|
||||
"debug.md": 19031,
|
||||
"diagnose-issues.md": 12864,
|
||||
@@ -24,7 +24,7 @@
|
||||
"docs-update.md": 55706,
|
||||
"edit-phase.md": 12927,
|
||||
"eval-review.md": 9967,
|
||||
"execute-phase.md": 93376,
|
||||
"execute-phase.md": 93395,
|
||||
"execute-plan.md": 34262,
|
||||
"explore.md": 10541,
|
||||
"extract-learnings.md": 12893,
|
||||
@@ -71,7 +71,7 @@
|
||||
"settings-advanced.md": 40019,
|
||||
"settings-integrations.md": 15892,
|
||||
"settings.md": 33467,
|
||||
"ship.md": 25555,
|
||||
"ship.md": 25575,
|
||||
"sketch-wrap-up.md": 14267,
|
||||
"sketch.md": 20004,
|
||||
"smart-entry.md": 11124,
|
||||
@@ -88,6 +88,6 @@
|
||||
"undo.md": 10431,
|
||||
"update.md": 20914,
|
||||
"validate-phase.md": 10849,
|
||||
"verify-phase.md": 40929,
|
||||
"verify-phase.md": 40949,
|
||||
"verify-work.md": 40247
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user