Merge branch 'next' into fix/2135-milestone-name-clobber
This commit is contained in:
5
.changeset/2116-surface-bare-require.md
Normal file
5
.changeset/2116-surface-bare-require.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
type: Fixed
|
||||
pr: 2213
|
||||
---
|
||||
**Fixed unresolvable bare `require('gsd-core/...')` in `gsd-surface` command doc** — the four `require()` examples now derive the engine path from `runtimeConfigDir` (resolvable at runtime), and the reinstall hint corrects `npm i -g gsd-core` to `npm i -g @opengsd/gsd-core`. (#2116)
|
||||
5
.changeset/happy-seals-roam.md
Normal file
5
.changeset/happy-seals-roam.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
type: Fixed
|
||||
pr: 2214
|
||||
---
|
||||
**`/gsd-fast` now appends Quick Task rows to STATE.md again** — the log_to_state column-count guard used an off-by-one awk formula (`NF-1`) that was always one too high, so the schema gate rejected the very table quick.md creates and silently skipped the STATE.md update. Also now supports the 6-column validate-mode table. (#2133)
|
||||
@@ -37,9 +37,9 @@ Parse the first token of $ARGUMENTS:
|
||||
## list / status
|
||||
|
||||
Load the capability registry and call `listSurface(runtimeConfigDir, manifest, CLUSTERS, registry)` from
|
||||
`gsd-core/bin/lib/surface.cjs`. The registry is loaded via:
|
||||
the engine module at `${runtimeConfigDir}/gsd-core/bin/lib/surface.cjs`. The registry is loaded via:
|
||||
```js
|
||||
const registry = require('gsd-core/bin/lib/capability-registry.cjs');
|
||||
const registry = require(runtimeConfigDir + '/gsd-core/bin/lib/capability-registry.cjs');
|
||||
```
|
||||
Display:
|
||||
|
||||
@@ -71,7 +71,7 @@ Install profile: standard (from .gsd-profile)
|
||||
3. `writeSurface(runtimeConfigDir, surfaceState)`.
|
||||
4. Resolve and re-apply:
|
||||
```js
|
||||
const registry = require('gsd-core/bin/lib/capability-registry.cjs');
|
||||
const registry = require(runtimeConfigDir + '/gsd-core/bin/lib/capability-registry.cjs');
|
||||
const layout = resolveRuntimeArtifactLayout(runtime, runtimeConfigDir, scope);
|
||||
applySurface(runtimeConfigDir, layout, manifest, CLUSTERS, registry);
|
||||
```
|
||||
@@ -89,7 +89,7 @@ Valid cluster names: `core_loop`, `audit_review`, `milestone`, `research_ideate`
|
||||
3. Add cluster to `surfaceState.disabledClusters` (deduplicate).
|
||||
4. `writeSurface` → resolve layout → `applySurface`:
|
||||
```js
|
||||
const registry = require('gsd-core/bin/lib/capability-registry.cjs');
|
||||
const registry = require(runtimeConfigDir + '/gsd-core/bin/lib/capability-registry.cjs');
|
||||
const layout = resolveRuntimeArtifactLayout(runtime, runtimeConfigDir, scope);
|
||||
applySurface(runtimeConfigDir, layout, manifest, CLUSTERS, registry);
|
||||
```
|
||||
@@ -103,7 +103,7 @@ Valid cluster names: `core_loop`, `audit_review`, `milestone`, `research_ideate`
|
||||
2. Remove cluster from `surfaceState.disabledClusters`.
|
||||
3. `writeSurface` → resolve layout → `applySurface`:
|
||||
```js
|
||||
const registry = require('gsd-core/bin/lib/capability-registry.cjs');
|
||||
const registry = require(runtimeConfigDir + '/gsd-core/bin/lib/capability-registry.cjs');
|
||||
const layout = resolveRuntimeArtifactLayout(runtime, runtimeConfigDir, scope);
|
||||
applySurface(runtimeConfigDir, layout, manifest, CLUSTERS, registry);
|
||||
```
|
||||
@@ -151,7 +151,7 @@ All paths can be overridden by reading the `CLAUDE_CONFIG_DIR` env var if set.
|
||||
|
||||
- Unknown cluster name → list valid cluster names, exit without writing.
|
||||
- Unknown profile name → list known profiles (`core`, `standard`, `full`), exit.
|
||||
- Missing `surface.cjs` → prompt: "Run `npm i -g gsd-core` to reinstall GSD."
|
||||
- Missing `surface.cjs` → prompt: "Run `npm i -g @opengsd/gsd-core` to reinstall GSD."
|
||||
|
||||
<execution_context>
|
||||
Surface state file: `~/.claude/.gsd-surface.json`
|
||||
|
||||
@@ -72,22 +72,30 @@ malformed row.
|
||||
# Detect whether STATE.md has a Quick Tasks Completed table
|
||||
if grep -q "Quick Tasks Completed" .planning/STATE.md 2>/dev/null; then
|
||||
# Read the table header line to determine the column schema.
|
||||
# quick.md Step 7 creates a 5-column table:
|
||||
# | # | Description | Date | Commit | Directory |
|
||||
# Count pipe characters in the header to determine column count.
|
||||
# quick.md Step 7b writes two shapes:
|
||||
# 5-column (non-validate): | # | Description | Date | Commit | Directory |
|
||||
# 6-column (validate): | # | Description | Date | Commit | Status | Directory |
|
||||
HEADER_LINE=$(grep -A2 "Quick Tasks Completed" .planning/STATE.md 2>/dev/null | grep "^|" | head -1)
|
||||
# Count columns: number of | separators minus 1 gives column count
|
||||
COL_COUNT=$(echo "$HEADER_LINE" | awk -F'|' '{print NF-1}')
|
||||
# Count REAL columns: a markdown header has a leading and a trailing pipe, so
|
||||
# awk's NF counts (real columns + 2). NF-2 yields the real column count.
|
||||
# (NF-1 was the off-by-one root cause of #2133: it returned the pipe count,
|
||||
# making the `-eq 5` test unsatisfiable for the very header quick.md writes.)
|
||||
COL_COUNT=$(echo "$HEADER_LINE" | awk -F'|' '{print NF-2}')
|
||||
|
||||
# Next row number + latest commit hash are schema-independent.
|
||||
NEXT_NUM=$(awk '/Quick Tasks Completed/{found=1} found && /^\|/ && !/^[|][-: |]*[|]$/ && !/Description/{count++} END{print count+1}' .planning/STATE.md 2>/dev/null || echo "1")
|
||||
COMMIT_HASH=$(git rev-parse --short HEAD 2>/dev/null || echo "—")
|
||||
|
||||
# Select the appended row's template by the detected column count so its cell
|
||||
# count always matches the header (prevents the malformed-row symptom of #27).
|
||||
if [ "$COL_COUNT" -eq 5 ] && echo "$HEADER_LINE" | grep -qi "Description" && echo "$HEADER_LINE" | grep -qi "Commit" && echo "$HEADER_LINE" | grep -qi "Directory"; then
|
||||
# 5-column schema from quick.md Step 7: | # | Description | Date | Commit | Directory |
|
||||
# Determine the next row number by counting existing data rows (non-separator, non-header).
|
||||
NEXT_NUM=$(awk '/Quick Tasks Completed/{found=1} found && /^\|/ && !/^[|][-: |]*[|]$/ && !/Description/{count++} END{print count+1}' .planning/STATE.md 2>/dev/null || echo "1")
|
||||
# Get the latest commit hash (short)
|
||||
COMMIT_HASH=$(git rev-parse --short HEAD 2>/dev/null || echo "—")
|
||||
# 5-column schema from quick.md Step 7b (non-validate).
|
||||
echo "| $NEXT_NUM | $TASK | $(date +%Y-%m-%d) | $COMMIT_HASH | — |" >> .planning/STATE.md
|
||||
elif [ "$COL_COUNT" -eq 6 ] && echo "$HEADER_LINE" | grep -qi "Status" && echo "$HEADER_LINE" | grep -qi "Directory"; then
|
||||
# 6-column schema from quick.md Step 7b (validate, with Status).
|
||||
echo "| $NEXT_NUM | $TASK | $(date +%Y-%m-%d) | $COMMIT_HASH | — | — |" >> .planning/STATE.md
|
||||
else
|
||||
# Unrecognized table schema — skip to avoid appending a malformed row.
|
||||
# Unrecognized table schema — skip to avoid appending a malformed row (#27).
|
||||
echo "⚠ fast.md log_to_state: Quick Tasks Completed table has unrecognized schema (${COL_COUNT} columns); skipping STATE.md update."
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -37,9 +37,9 @@ Parse the first token of $ARGUMENTS:
|
||||
## list / status
|
||||
|
||||
Load the capability registry and call `listSurface(runtimeConfigDir, manifest, CLUSTERS, registry)` from
|
||||
`gsd-core/bin/lib/surface.cjs`. The registry is loaded via:
|
||||
the engine module at `${runtimeConfigDir}/gsd-core/bin/lib/surface.cjs`. The registry is loaded via:
|
||||
```js
|
||||
const registry = require('gsd-core/bin/lib/capability-registry.cjs');
|
||||
const registry = require(runtimeConfigDir + '/gsd-core/bin/lib/capability-registry.cjs');
|
||||
```
|
||||
Display:
|
||||
|
||||
@@ -71,7 +71,7 @@ Install profile: standard (from .gsd-profile)
|
||||
3. `writeSurface(runtimeConfigDir, surfaceState)`.
|
||||
4. Resolve and re-apply:
|
||||
```js
|
||||
const registry = require('gsd-core/bin/lib/capability-registry.cjs');
|
||||
const registry = require(runtimeConfigDir + '/gsd-core/bin/lib/capability-registry.cjs');
|
||||
const layout = resolveRuntimeArtifactLayout(runtime, runtimeConfigDir, scope);
|
||||
applySurface(runtimeConfigDir, layout, manifest, CLUSTERS, registry);
|
||||
```
|
||||
@@ -89,7 +89,7 @@ Valid cluster names: `core_loop`, `audit_review`, `milestone`, `research_ideate`
|
||||
3. Add cluster to `surfaceState.disabledClusters` (deduplicate).
|
||||
4. `writeSurface` → resolve layout → `applySurface`:
|
||||
```js
|
||||
const registry = require('gsd-core/bin/lib/capability-registry.cjs');
|
||||
const registry = require(runtimeConfigDir + '/gsd-core/bin/lib/capability-registry.cjs');
|
||||
const layout = resolveRuntimeArtifactLayout(runtime, runtimeConfigDir, scope);
|
||||
applySurface(runtimeConfigDir, layout, manifest, CLUSTERS, registry);
|
||||
```
|
||||
@@ -103,7 +103,7 @@ Valid cluster names: `core_loop`, `audit_review`, `milestone`, `research_ideate`
|
||||
2. Remove cluster from `surfaceState.disabledClusters`.
|
||||
3. `writeSurface` → resolve layout → `applySurface`:
|
||||
```js
|
||||
const registry = require('gsd-core/bin/lib/capability-registry.cjs');
|
||||
const registry = require(runtimeConfigDir + '/gsd-core/bin/lib/capability-registry.cjs');
|
||||
const layout = resolveRuntimeArtifactLayout(runtime, runtimeConfigDir, scope);
|
||||
applySurface(runtimeConfigDir, layout, manifest, CLUSTERS, registry);
|
||||
```
|
||||
@@ -151,7 +151,7 @@ All paths can be overridden by reading the `CLAUDE_CONFIG_DIR` env var if set.
|
||||
|
||||
- Unknown cluster name → list valid cluster names, exit without writing.
|
||||
- Unknown profile name → list known profiles (`core`, `standard`, `full`), exit.
|
||||
- Missing `surface.cjs` → prompt: "Run `npm i -g gsd-core` to reinstall GSD."
|
||||
- Missing `surface.cjs` → prompt: "Run `npm i -g @opengsd/gsd-core` to reinstall GSD."
|
||||
|
||||
<execution_context>
|
||||
Surface state file: `~/.claude/.gsd-surface.json`
|
||||
|
||||
178
tests/fix-2133-fast-md-log-to-state-schema.test.cjs
Normal file
178
tests/fix-2133-fast-md-log-to-state-schema.test.cjs
Normal file
@@ -0,0 +1,178 @@
|
||||
/**
|
||||
* #2133 — fast.md log_to_state schema gate is unreachable.
|
||||
*
|
||||
* PR #85 added a column-count guard to fast.md's log_to_state step that used
|
||||
* `awk -F'|' '{print NF-1}'`. A markdown table header has both a leading and a
|
||||
* trailing pipe, so NF counts (real columns + 2) and NF-1 is always one too
|
||||
* high. The `-eq 5` test could therefore never hold for the 5-column header
|
||||
* quick.md writes, so /gsd-fast has never appended a Quick Task row since #85.
|
||||
*
|
||||
* This test does what the removed prose-regex test (bug-3805-*) did not: it
|
||||
* EXTRACTS the actual bash block deployed in fast.md and EXECUTES it against
|
||||
* real STATE.md fixtures, asserting on the filesystem result (row appended,
|
||||
* cell count aligned with header). It fails on the NF-1 bug and passes once
|
||||
* the count uses NF-2 and both 5/6-column schemas are accepted.
|
||||
*/
|
||||
|
||||
const { test, describe } = require('node:test');
|
||||
const assert = require('node:assert/strict');
|
||||
const fs = require('node:fs');
|
||||
const path = require('node:path');
|
||||
const { execFileSync } = require('node:child_process');
|
||||
const { createTempProject, cleanup } = require('./helpers.cjs');
|
||||
|
||||
const FAST_MD = path.join(__dirname, '..', 'gsd-core', 'workflows', 'fast.md');
|
||||
|
||||
const HEADER_5COL = '| # | Description | Date | Commit | Directory |';
|
||||
const SEP_5COL = '|---|-------------|------|--------|-----------|';
|
||||
const HEADER_6COL = '| # | Description | Date | Commit | Status | Directory |';
|
||||
const SEP_6COL = '|---|-------------|------|--------|--------|-----------|';
|
||||
|
||||
/**
|
||||
* Extract the ```bash block embedded in fast.md's <step name="log_to_state">.
|
||||
* This is the exact program the workflow runs — executing it is a behavioral
|
||||
* test of the deployed product, not a source-grep over its prose.
|
||||
*/
|
||||
function extractLogToStateBash() {
|
||||
const content = fs.readFileSync(FAST_MD, 'utf8');
|
||||
const stepTag = '<step name="log_to_state">';
|
||||
const stepStart = content.indexOf(stepTag);
|
||||
assert.notEqual(stepStart, -1, 'fast.md must contain a log_to_state step');
|
||||
const stepEnd = content.indexOf('</step>', stepStart);
|
||||
assert.notEqual(stepEnd, -1, 'log_to_state step must close');
|
||||
const step = content.slice(stepStart, stepEnd);
|
||||
const fenceStart = step.indexOf('```bash');
|
||||
assert.notEqual(fenceStart, -1, 'log_to_state step must contain a bash block');
|
||||
const codeStart = step.indexOf('\n', fenceStart) + 1;
|
||||
const fenceEnd = step.indexOf('\n```', codeStart);
|
||||
assert.notEqual(fenceEnd, -1, 'log_to_state bash block must close');
|
||||
return step.slice(codeStart, fenceEnd);
|
||||
}
|
||||
|
||||
function makeStateMd(headerLine, separatorLine, existingRows) {
|
||||
return [
|
||||
'# Project State',
|
||||
'',
|
||||
'### Blockers/Concerns',
|
||||
'',
|
||||
'None.',
|
||||
'',
|
||||
'### Quick Tasks Completed',
|
||||
'',
|
||||
headerLine,
|
||||
separatorLine,
|
||||
...existingRows,
|
||||
'',
|
||||
].join('\n');
|
||||
}
|
||||
|
||||
/** Count `|` chars on a line — the invariant cell-count signal. */
|
||||
function pipeCount(line) {
|
||||
return (line.match(/\|/g) || []).length;
|
||||
}
|
||||
|
||||
/** Data rows = lines starting with `|` that are not the separator or header. */
|
||||
function dataRows(content) {
|
||||
return content.split(/\r?\n/).filter((l) => {
|
||||
if (!l.startsWith('|')) return false;
|
||||
if (/^[|][-: |]*[|]$/.test(l)) return false; // separator
|
||||
if (/Description/.test(l)) return false; // header
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
describe('#2133 fast.md log_to_state schema gate', () => {
|
||||
const bashBlock = extractLogToStateBash();
|
||||
const TASK_DESC = 'sample inline fix';
|
||||
|
||||
/**
|
||||
* Run the extracted log_to_state bash against a temp project's STATE.md and
|
||||
* return the post-run file content + captured stdout.
|
||||
*/
|
||||
function runAgainst(headerLine, separatorLine, existingRows) {
|
||||
const tmpDir = createTempProject('fix-2133-');
|
||||
const statePath = path.join(tmpDir, '.planning', 'STATE.md');
|
||||
fs.writeFileSync(statePath, makeStateMd(headerLine, separatorLine, existingRows));
|
||||
// Cleanup is bound by each caller via t.after(tmpDir).
|
||||
const stdout = execFileSync('bash', ['-c', bashBlock], {
|
||||
cwd: tmpDir,
|
||||
env: { ...process.env, TASK: TASK_DESC },
|
||||
encoding: 'utf8',
|
||||
});
|
||||
const after = fs.readFileSync(statePath, 'utf8');
|
||||
return { tmpDir, stdout, after };
|
||||
}
|
||||
|
||||
test('appends a 5-cell row to the 5-column (non-validate) schema (#27 stays fixed)', (t) => {
|
||||
const before = makeStateMd(HEADER_5COL, SEP_5COL, ['| 1 | earlier task | 2026-07-01 | deadbee | — |']);
|
||||
const { tmpDir, after } = runAgainst(HEADER_5COL, SEP_5COL, ['| 1 | earlier task | 2026-07-01 | deadbee | — |']);
|
||||
t.after(() => cleanup(tmpDir));
|
||||
|
||||
const rowsBefore = dataRows(before).length;
|
||||
const rowsAfter = dataRows(after).length;
|
||||
assert.equal(rowsAfter - rowsBefore, 1, 'exactly one row must be appended');
|
||||
|
||||
const appended = dataRows(after).slice(-1)[0];
|
||||
assert.equal(pipeCount(appended), pipeCount(HEADER_5COL),
|
||||
'appended row pipe-count must match the 5-column header (no malformed row)');
|
||||
assert.ok(appended.includes(TASK_DESC), 'appended row must carry the task description');
|
||||
});
|
||||
|
||||
test('appends a 6-cell row to the 6-column (validate, with Status) schema', (t) => {
|
||||
const before = makeStateMd(HEADER_6COL, SEP_6COL, []);
|
||||
const { tmpDir, after } = runAgainst(HEADER_6COL, SEP_6COL, []);
|
||||
t.after(() => cleanup(tmpDir));
|
||||
|
||||
const rowsBefore = dataRows(before).length;
|
||||
const rowsAfter = dataRows(after).length;
|
||||
assert.equal(rowsAfter - rowsBefore, 1, 'exactly one row must be appended to the 6-column table');
|
||||
|
||||
const appended = dataRows(after).slice(-1)[0];
|
||||
assert.equal(pipeCount(appended), pipeCount(HEADER_6COL),
|
||||
'appended row pipe-count must match the 6-column header (cell count aligned with header)');
|
||||
assert.ok(appended.includes(TASK_DESC), 'appended row must carry the task description');
|
||||
});
|
||||
|
||||
test('column count awk uses NF-2 (real columns — the off-by-one root cause)', () => {
|
||||
// The deployed bash must compute the real column count. A 5-column header
|
||||
// split on '|' yields NF=7; the correct real-column formula is NF-2=5.
|
||||
// (NF-1 was the off-by-one bug: it returned 6, making `-eq 5` unsatisfiable.)
|
||||
// Match the executable COL_COUNT assignment specifically — the explanatory
|
||||
// comment may still reference "NF-1" to document the history.
|
||||
assert.match(
|
||||
bashBlock,
|
||||
/COL_COUNT=\$\(.+awk -F'\|' '\{print NF-2\}'\)/,
|
||||
'COL_COUNT must be derived via awk NF-2 (NF-1 was the off-by-one bug)'
|
||||
);
|
||||
});
|
||||
|
||||
test('unrecognized schema still skips with a warning (safety guard intact)', (t) => {
|
||||
// A 3-column table quick.md never writes must NOT receive a row.
|
||||
const weirdHeader = '| Alpha | Beta | Gamma |';
|
||||
const weirdSep = '|-------|------|-------|';
|
||||
const before = makeStateMd(weirdHeader, weirdSep, []);
|
||||
const { tmpDir, stdout, after } = runAgainst(weirdHeader, weirdSep, []);
|
||||
t.after(() => cleanup(tmpDir));
|
||||
|
||||
assert.equal(dataRows(after).length, dataRows(before).length,
|
||||
'no row may be appended for an unrecognized schema');
|
||||
assert.ok(/unrecognized schema/i.test(stdout),
|
||||
'the unrecognized-schema warning must be emitted');
|
||||
});
|
||||
|
||||
test('no Quick Tasks table → silent no-op', (t) => {
|
||||
const tmpDir = createTempProject('fix-2133-noop-');
|
||||
t.after(() => cleanup(tmpDir));
|
||||
const statePath = path.join(tmpDir, '.planning', 'STATE.md');
|
||||
const before = '# Project State\n\n### Blockers/Concerns\n\nNone.\n';
|
||||
fs.writeFileSync(statePath, before);
|
||||
const stdout = execFileSync('bash', ['-c', bashBlock], {
|
||||
cwd: tmpDir,
|
||||
env: { ...process.env, TASK: TASK_DESC },
|
||||
encoding: 'utf8',
|
||||
});
|
||||
const after = fs.readFileSync(statePath, 'utf8');
|
||||
assert.equal(after, before, 'STATE.md must be untouched when no Quick Tasks table exists');
|
||||
assert.equal(stdout, '', 'no output when there is no table to update');
|
||||
});
|
||||
});
|
||||
@@ -242,7 +242,7 @@
|
||||
"gsd-core/workflows/execute-plan.md": "907af77eafc3d97b",
|
||||
"gsd-core/workflows/explore.md": "934c00f9f216dbdb",
|
||||
"gsd-core/workflows/extract-learnings.md": "167ea7f0e23bf496",
|
||||
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
|
||||
"gsd-core/workflows/fast.md": "0242082ca646819a",
|
||||
"gsd-core/workflows/forensics.md": "b64f0309b8c3fde1",
|
||||
"gsd-core/workflows/graduation.md": "a9d8f15ba81a993f",
|
||||
"gsd-core/workflows/health.md": "1ac4d567ee95acfb",
|
||||
@@ -413,7 +413,7 @@
|
||||
"skills/gsd-spec-phase/SKILL.md": "6b35d59f65e2e607",
|
||||
"skills/gsd-spike/SKILL.md": "63b5093cbc7978ca",
|
||||
"skills/gsd-stats/SKILL.md": "1cef40c0a0e7b19b",
|
||||
"skills/gsd-surface/SKILL.md": "963aa5a09d8e3695",
|
||||
"skills/gsd-surface/SKILL.md": "19e018ebe4c89857",
|
||||
"skills/gsd-thread/SKILL.md": "4d91aab9f5ed4ca7",
|
||||
"skills/gsd-ui-phase/SKILL.md": "b2412418ebf0dfb8",
|
||||
"skills/gsd-ui-review/SKILL.md": "e49734488684fd9a",
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
"commands/gsd-spec-phase.md": "8bb332566911dfd9",
|
||||
"commands/gsd-spike.md": "a99190d9496c6ac0",
|
||||
"commands/gsd-stats.md": "58b4d86a5390e243",
|
||||
"commands/gsd-surface.md": "acab871ec856e353",
|
||||
"commands/gsd-surface.md": "12078dca898a6c16",
|
||||
"commands/gsd-thread.md": "51be0cdeb925ab28",
|
||||
"commands/gsd-ui-phase.md": "75d4be44797ccef7",
|
||||
"commands/gsd-ui-review.md": "9191082973068dbf",
|
||||
@@ -313,7 +313,7 @@
|
||||
"gsd-core/workflows/execute-plan.md": "2c412310dce31a0b",
|
||||
"gsd-core/workflows/explore.md": "6c04f2e658d93261",
|
||||
"gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4",
|
||||
"gsd-core/workflows/fast.md": "94136fb570d20a9d",
|
||||
"gsd-core/workflows/fast.md": "8878ec034b401f36",
|
||||
"gsd-core/workflows/forensics.md": "0d500a3f5ab26913",
|
||||
"gsd-core/workflows/graduation.md": "47f1594c88c08501",
|
||||
"gsd-core/workflows/health.md": "107e3c72e76d9535",
|
||||
@@ -449,7 +449,7 @@
|
||||
"skills/gsd-ns-manage/skills/settings/SKILL.md": "8751c29421208a00",
|
||||
"skills/gsd-ns-manage/skills/ship/SKILL.md": "7498424e965545e1",
|
||||
"skills/gsd-ns-manage/skills/stats/SKILL.md": "0bce39e8f3b64f5e",
|
||||
"skills/gsd-ns-manage/skills/surface/SKILL.md": "0644bd7dbeeb0a73",
|
||||
"skills/gsd-ns-manage/skills/surface/SKILL.md": "ca10834ce41967c9",
|
||||
"skills/gsd-ns-manage/skills/thread/SKILL.md": "fbe591e8162f8b1c",
|
||||
"skills/gsd-ns-manage/skills/undo/SKILL.md": "5ffc86a2c67aa9df",
|
||||
"skills/gsd-ns-manage/skills/update/SKILL.md": "c8165b8085ba106a",
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
"commands/gsd-spec-phase.md": "383b4928c4df4bf1",
|
||||
"commands/gsd-spike.md": "98d789db7ca53873",
|
||||
"commands/gsd-stats.md": "a9c0e3f338bd61a5",
|
||||
"commands/gsd-surface.md": "998bf327c3f4a001",
|
||||
"commands/gsd-surface.md": "20bbba15eac52024",
|
||||
"commands/gsd-thread.md": "1b78c7b75b53ad4e",
|
||||
"commands/gsd-ui-phase.md": "67a759b3973f961f",
|
||||
"commands/gsd-ui-review.md": "9b4ecf2d40bdc476",
|
||||
@@ -312,7 +312,7 @@
|
||||
"gsd-core/workflows/execute-plan.md": "f17623fd47e795dd",
|
||||
"gsd-core/workflows/explore.md": "95e463d4bdd6dadd",
|
||||
"gsd-core/workflows/extract-learnings.md": "fd75072c339b58bd",
|
||||
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
|
||||
"gsd-core/workflows/fast.md": "0242082ca646819a",
|
||||
"gsd-core/workflows/forensics.md": "857d7b064f4cca21",
|
||||
"gsd-core/workflows/graduation.md": "ecf8da93e094fd2e",
|
||||
"gsd-core/workflows/health.md": "551e63aa6f3df711",
|
||||
|
||||
@@ -241,7 +241,7 @@
|
||||
"gsd-core/workflows/execute-plan.md": "cce1a33fe9a0a32d",
|
||||
"gsd-core/workflows/explore.md": "b9eea1bac358c9ce",
|
||||
"gsd-core/workflows/extract-learnings.md": "d8177b0c13b7e5ee",
|
||||
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
|
||||
"gsd-core/workflows/fast.md": "0242082ca646819a",
|
||||
"gsd-core/workflows/forensics.md": "c01da0178fb97b21",
|
||||
"gsd-core/workflows/graduation.md": "47f1594c88c08501",
|
||||
"gsd-core/workflows/health.md": "f934b1f1e9f3ae72",
|
||||
@@ -411,7 +411,7 @@
|
||||
"skills/gsd-spec-phase/SKILL.md": "7e4dfa2070b7d9d1",
|
||||
"skills/gsd-spike/SKILL.md": "04d5f50d8d4a1c1a",
|
||||
"skills/gsd-stats/SKILL.md": "5403a46852241fa8",
|
||||
"skills/gsd-surface/SKILL.md": "970f30acc073a7b9",
|
||||
"skills/gsd-surface/SKILL.md": "4b9c977a74a975ed",
|
||||
"skills/gsd-thread/SKILL.md": "a76c70c368f82dee",
|
||||
"skills/gsd-ui-phase/SKILL.md": "7c9404102a9b9d74",
|
||||
"skills/gsd-ui-review/SKILL.md": "ef8f643abff1486b",
|
||||
|
||||
@@ -245,7 +245,7 @@
|
||||
"gsd-core/workflows/execute-plan.md": "0c5551f99ee0a017",
|
||||
"gsd-core/workflows/explore.md": "e83af8ceae314cf9",
|
||||
"gsd-core/workflows/extract-learnings.md": "6f39375b7dc775f9",
|
||||
"gsd-core/workflows/fast.md": "94136fb570d20a9d",
|
||||
"gsd-core/workflows/fast.md": "8878ec034b401f36",
|
||||
"gsd-core/workflows/forensics.md": "9fc65a8eed5d8bfc",
|
||||
"gsd-core/workflows/graduation.md": "16fedecda36769eb",
|
||||
"gsd-core/workflows/health.md": "788fad84fa42eb9f",
|
||||
@@ -353,7 +353,7 @@
|
||||
"skills/gsd-ns-manage/skills/settings/SKILL.md": "67eff2d16e17403c",
|
||||
"skills/gsd-ns-manage/skills/ship/SKILL.md": "4ad9695934e069ee",
|
||||
"skills/gsd-ns-manage/skills/stats/SKILL.md": "25898070fb2a4b20",
|
||||
"skills/gsd-ns-manage/skills/surface/SKILL.md": "6d6ed15c90424f3f",
|
||||
"skills/gsd-ns-manage/skills/surface/SKILL.md": "a89b3bde1d2b620a",
|
||||
"skills/gsd-ns-manage/skills/thread/SKILL.md": "67b5a0451b58c50c",
|
||||
"skills/gsd-ns-manage/skills/undo/SKILL.md": "88407c6379617c7b",
|
||||
"skills/gsd-ns-manage/skills/update/SKILL.md": "2666ab7786b69017",
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
"commands/gsd-spec-phase.md": "145f2ab750344022",
|
||||
"commands/gsd-spike.md": "54c094f40b601688",
|
||||
"commands/gsd-stats.md": "60f7077e7949d2ad",
|
||||
"commands/gsd-surface.md": "29688da5df785b58",
|
||||
"commands/gsd-surface.md": "84d89b840d00b7f0",
|
||||
"commands/gsd-thread.md": "07da4f657b3efcc1",
|
||||
"commands/gsd-ui-phase.md": "3b90f3d1c8fa531d",
|
||||
"commands/gsd-ui-review.md": "4e5fb1e77def9b64",
|
||||
@@ -313,7 +313,7 @@
|
||||
"gsd-core/workflows/execute-plan.md": "933d10547116794a",
|
||||
"gsd-core/workflows/explore.md": "6c04f2e658d93261",
|
||||
"gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4",
|
||||
"gsd-core/workflows/fast.md": "94136fb570d20a9d",
|
||||
"gsd-core/workflows/fast.md": "8878ec034b401f36",
|
||||
"gsd-core/workflows/forensics.md": "0d500a3f5ab26913",
|
||||
"gsd-core/workflows/graduation.md": "47f1594c88c08501",
|
||||
"gsd-core/workflows/health.md": "107e3c72e76d9535",
|
||||
@@ -483,7 +483,7 @@
|
||||
"skills/gsd-spec-phase/SKILL.md": "96a095cd634129d8",
|
||||
"skills/gsd-spike/SKILL.md": "d4af42b801139876",
|
||||
"skills/gsd-stats/SKILL.md": "7d1fbadcae5f0b67",
|
||||
"skills/gsd-surface/SKILL.md": "5008f49701e7deea",
|
||||
"skills/gsd-surface/SKILL.md": "1b840c8ddd76b9c7",
|
||||
"skills/gsd-thread/SKILL.md": "18ddd2aa60997949",
|
||||
"skills/gsd-ui-phase/SKILL.md": "132ccf2ddc9e24e0",
|
||||
"skills/gsd-ui-review/SKILL.md": "7e8cf0bcee9859cd",
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
".agents/skills/gsd-spec-phase/SKILL.md": "56a5cbd606db9cba",
|
||||
".agents/skills/gsd-spike/SKILL.md": "77209fef7a04c11a",
|
||||
".agents/skills/gsd-stats/SKILL.md": "566024444ef71f44",
|
||||
".agents/skills/gsd-surface/SKILL.md": "492cda98187a969b",
|
||||
".agents/skills/gsd-surface/SKILL.md": "e8b9d3c291a5c18c",
|
||||
".agents/skills/gsd-thread/SKILL.md": "85326c97c83a02d1",
|
||||
".agents/skills/gsd-ui-phase/SKILL.md": "a0c8fbcbe5e3c2b9",
|
||||
".agents/skills/gsd-ui-review/SKILL.md": "081a3292a2d357f5",
|
||||
@@ -348,7 +348,7 @@
|
||||
"gsd-core/workflows/execute-plan.md": "ac1f1d9ada00a91e",
|
||||
"gsd-core/workflows/explore.md": "2ef10d17c8864a04",
|
||||
"gsd-core/workflows/extract-learnings.md": "f716aa03fcb5f8da",
|
||||
"gsd-core/workflows/fast.md": "13252d545947354d",
|
||||
"gsd-core/workflows/fast.md": "bbf1f8e219ec9031",
|
||||
"gsd-core/workflows/forensics.md": "2e8a01b5b44e65f3",
|
||||
"gsd-core/workflows/graduation.md": "47f1594c88c08501",
|
||||
"gsd-core/workflows/health.md": "5b835fc606fd3e9b",
|
||||
|
||||
@@ -243,7 +243,7 @@
|
||||
"gsd-core/workflows/execute-plan.md": "c5e9dae726db15cc",
|
||||
"gsd-core/workflows/explore.md": "5fd91a8510e1114b",
|
||||
"gsd-core/workflows/extract-learnings.md": "f34d0b1927545b18",
|
||||
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
|
||||
"gsd-core/workflows/fast.md": "0242082ca646819a",
|
||||
"gsd-core/workflows/forensics.md": "459644dce26ee2ef",
|
||||
"gsd-core/workflows/graduation.md": "f013efc29096faf0",
|
||||
"gsd-core/workflows/health.md": "f343fd32a0e398e4",
|
||||
@@ -386,7 +386,7 @@
|
||||
"skills/gsd-spec-phase/SKILL.md": "e402110c96d1f44f",
|
||||
"skills/gsd-spike/SKILL.md": "de84271bdba0ef67",
|
||||
"skills/gsd-stats/SKILL.md": "e0beaf89d27c8058",
|
||||
"skills/gsd-surface/SKILL.md": "2f2647c7bd664605",
|
||||
"skills/gsd-surface/SKILL.md": "c6ae441eb5e2e84a",
|
||||
"skills/gsd-thread/SKILL.md": "8db4d6ebcf0a8898",
|
||||
"skills/gsd-ui-phase/SKILL.md": "317081b3be7c536f",
|
||||
"skills/gsd-ui-review/SKILL.md": "dc07bbe9094b6dbe",
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
"commands/gsd-spec-phase.md": "7c95987dcd7aa3fb",
|
||||
"commands/gsd-spike.md": "8102cc426fa1f1b3",
|
||||
"commands/gsd-stats.md": "eb39e4c4ec8eccea",
|
||||
"commands/gsd-surface.md": "1fb3de1651eb182a",
|
||||
"commands/gsd-surface.md": "96a66a3607b253b4",
|
||||
"commands/gsd-thread.md": "fc5975fdb73eb045",
|
||||
"commands/gsd-ui-phase.md": "b91b691e1eb007c2",
|
||||
"commands/gsd-ui-review.md": "2f9842e07e7df4df",
|
||||
@@ -313,7 +313,7 @@
|
||||
"gsd-core/workflows/execute-plan.md": "83dc1bf7f73735c0",
|
||||
"gsd-core/workflows/explore.md": "b9eea1bac358c9ce",
|
||||
"gsd-core/workflows/extract-learnings.md": "d8177b0c13b7e5ee",
|
||||
"gsd-core/workflows/fast.md": "0162075e44072447",
|
||||
"gsd-core/workflows/fast.md": "91f126c4ef24217e",
|
||||
"gsd-core/workflows/forensics.md": "a65f817d4a515291",
|
||||
"gsd-core/workflows/graduation.md": "53a4a6fa3b4e6613",
|
||||
"gsd-core/workflows/health.md": "e4d770484b5e7496",
|
||||
@@ -461,7 +461,7 @@
|
||||
"skills/gsd-spec-phase/SKILL.md": "5c48117fbb7aa595",
|
||||
"skills/gsd-spike/SKILL.md": "3850674027d81c2a",
|
||||
"skills/gsd-stats/SKILL.md": "ebbd0d39b5cee9a9",
|
||||
"skills/gsd-surface/SKILL.md": "805deb95c48af938",
|
||||
"skills/gsd-surface/SKILL.md": "9b869434321867c3",
|
||||
"skills/gsd-thread/SKILL.md": "621cde6272262eef",
|
||||
"skills/gsd-ui-phase/SKILL.md": "505ad61ef61c9e9c",
|
||||
"skills/gsd-ui-review/SKILL.md": "dc79fe0ad42f4948",
|
||||
|
||||
@@ -242,7 +242,7 @@
|
||||
"gsd-core/workflows/execute-plan.md": "4dbe9b6f0c976245",
|
||||
"gsd-core/workflows/explore.md": "48770d68e8b9c132",
|
||||
"gsd-core/workflows/extract-learnings.md": "e9e167c718949c0b",
|
||||
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
|
||||
"gsd-core/workflows/fast.md": "0242082ca646819a",
|
||||
"gsd-core/workflows/forensics.md": "91961b811917c5c4",
|
||||
"gsd-core/workflows/graduation.md": "d1fd52bbe41dcf34",
|
||||
"gsd-core/workflows/health.md": "c622a5ad0d347d30",
|
||||
@@ -379,7 +379,7 @@
|
||||
"skills/gsd/gsd-ns-manage/skills/settings/SKILL.md": "db053a82acb85969",
|
||||
"skills/gsd/gsd-ns-manage/skills/ship/SKILL.md": "3f7e7023802a185d",
|
||||
"skills/gsd/gsd-ns-manage/skills/stats/SKILL.md": "847f1a79382e05a3",
|
||||
"skills/gsd/gsd-ns-manage/skills/surface/SKILL.md": "f63005360828e726",
|
||||
"skills/gsd/gsd-ns-manage/skills/surface/SKILL.md": "232dc849db8ec365",
|
||||
"skills/gsd/gsd-ns-manage/skills/thread/SKILL.md": "12e14ca63fe5a982",
|
||||
"skills/gsd/gsd-ns-manage/skills/undo/SKILL.md": "cb410bf1813a2d1e",
|
||||
"skills/gsd/gsd-ns-manage/skills/update/SKILL.md": "433a236998c305b0",
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
"command/gsd-spec-phase.md": "8f8e3e109ebb7011",
|
||||
"command/gsd-spike.md": "fdcb1ae289790818",
|
||||
"command/gsd-stats.md": "b54c0d533cff9710",
|
||||
"command/gsd-surface.md": "3290127fe8241ced",
|
||||
"command/gsd-surface.md": "e2e7898a020a954b",
|
||||
"command/gsd-thread.md": "9c6a1900b3c57be6",
|
||||
"command/gsd-ui-phase.md": "efeba2d2381173e3",
|
||||
"command/gsd-ui-review.md": "35a12e93cddf266c",
|
||||
@@ -313,7 +313,7 @@
|
||||
"gsd-core/workflows/execute-plan.md": "8dc89b35582407f7",
|
||||
"gsd-core/workflows/explore.md": "14242d36d4822df6",
|
||||
"gsd-core/workflows/extract-learnings.md": "d8177b0c13b7e5ee",
|
||||
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
|
||||
"gsd-core/workflows/fast.md": "0242082ca646819a",
|
||||
"gsd-core/workflows/forensics.md": "c01da0178fb97b21",
|
||||
"gsd-core/workflows/graduation.md": "5cc8638dabcbfd40",
|
||||
"gsd-core/workflows/health.md": "064b3668d5d9569a",
|
||||
@@ -457,7 +457,7 @@
|
||||
"skills/gsd-spec-phase/SKILL.md": "749dee6f739b9b44",
|
||||
"skills/gsd-spike/SKILL.md": "0938ac1386ca4a58",
|
||||
"skills/gsd-stats/SKILL.md": "25898070fb2a4b20",
|
||||
"skills/gsd-surface/SKILL.md": "1bfb5b380f42a02b",
|
||||
"skills/gsd-surface/SKILL.md": "0672169f8292ed7d",
|
||||
"skills/gsd-thread/SKILL.md": "d5917840279459f1",
|
||||
"skills/gsd-ui-phase/SKILL.md": "c35f175ccc747d56",
|
||||
"skills/gsd-ui-review/SKILL.md": "48267dc071481a89",
|
||||
|
||||
@@ -306,7 +306,7 @@
|
||||
"gsd-core/workflows/execute-plan.md": "c8502b7475d797a7",
|
||||
"gsd-core/workflows/explore.md": "6c04f2e658d93261",
|
||||
"gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4",
|
||||
"gsd-core/workflows/fast.md": "94136fb570d20a9d",
|
||||
"gsd-core/workflows/fast.md": "8878ec034b401f36",
|
||||
"gsd-core/workflows/forensics.md": "0d500a3f5ab26913",
|
||||
"gsd-core/workflows/graduation.md": "47f1594c88c08501",
|
||||
"gsd-core/workflows/health.md": "107e3c72e76d9535",
|
||||
@@ -448,7 +448,7 @@
|
||||
"skills/gsd-spec-phase/SKILL.md": "23ff63ddf425c1c2",
|
||||
"skills/gsd-spike/SKILL.md": "aa740909d20a82f2",
|
||||
"skills/gsd-stats/SKILL.md": "a7e478f76e0b6db1",
|
||||
"skills/gsd-surface/SKILL.md": "2f72da87138503aa",
|
||||
"skills/gsd-surface/SKILL.md": "f0356c0fef0b1d4c",
|
||||
"skills/gsd-thread/SKILL.md": "fb52a782c6e83e03",
|
||||
"skills/gsd-ui-phase/SKILL.md": "1d7ed00d7970ed51",
|
||||
"skills/gsd-ui-review/SKILL.md": "39b36951bafe1495",
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
"command/gsd-spec-phase.md": "b92bca076ca2c5c6",
|
||||
"command/gsd-spike.md": "1b2fa4b468e831dc",
|
||||
"command/gsd-stats.md": "51af934859f87623",
|
||||
"command/gsd-surface.md": "26a5f0aab82c1c4a",
|
||||
"command/gsd-surface.md": "e559ca6733ce288f",
|
||||
"command/gsd-thread.md": "ae3b000bee0ee1e0",
|
||||
"command/gsd-ui-phase.md": "21c9c043d813dc0a",
|
||||
"command/gsd-ui-review.md": "ef36603b519e8fe8",
|
||||
@@ -313,7 +313,7 @@
|
||||
"gsd-core/workflows/execute-plan.md": "e8de8ea661c1fe81",
|
||||
"gsd-core/workflows/explore.md": "7f5f9231cfd3089b",
|
||||
"gsd-core/workflows/extract-learnings.md": "92b3c0979604b7d0",
|
||||
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
|
||||
"gsd-core/workflows/fast.md": "0242082ca646819a",
|
||||
"gsd-core/workflows/forensics.md": "9354cb830152fd28",
|
||||
"gsd-core/workflows/graduation.md": "13080b5c24eec27d",
|
||||
"gsd-core/workflows/health.md": "a91e0a8e5d20b2e9",
|
||||
@@ -485,7 +485,7 @@
|
||||
"skills/gsd-spec-phase/SKILL.md": "332028ed34b85b1f",
|
||||
"skills/gsd-spike/SKILL.md": "9303cd74a8bf0741",
|
||||
"skills/gsd-stats/SKILL.md": "2af976632e239069",
|
||||
"skills/gsd-surface/SKILL.md": "ea512089d0e1d057",
|
||||
"skills/gsd-surface/SKILL.md": "a0cec79a0bbf9c97",
|
||||
"skills/gsd-thread/SKILL.md": "9ff9979a8213dbf8",
|
||||
"skills/gsd-ui-phase/SKILL.md": "5eee1bdd13640252",
|
||||
"skills/gsd-ui-review/SKILL.md": "c99d6725326bfbc4",
|
||||
|
||||
2
tests/fixtures/golden-install-parity/pi.json
vendored
2
tests/fixtures/golden-install-parity/pi.json
vendored
@@ -209,7 +209,7 @@
|
||||
"gsd-core/workflows/execute-plan.md": "ff172c3540b52e9d",
|
||||
"gsd-core/workflows/explore.md": "6c04f2e658d93261",
|
||||
"gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4",
|
||||
"gsd-core/workflows/fast.md": "94136fb570d20a9d",
|
||||
"gsd-core/workflows/fast.md": "8878ec034b401f36",
|
||||
"gsd-core/workflows/forensics.md": "0d500a3f5ab26913",
|
||||
"gsd-core/workflows/graduation.md": "47f1594c88c08501",
|
||||
"gsd-core/workflows/health.md": "107e3c72e76d9535",
|
||||
|
||||
@@ -242,7 +242,7 @@
|
||||
"gsd-core/workflows/execute-plan.md": "503b0ced0731dc38",
|
||||
"gsd-core/workflows/explore.md": "e1a83a8982532e5b",
|
||||
"gsd-core/workflows/extract-learnings.md": "dd4fdb88605de49a",
|
||||
"gsd-core/workflows/fast.md": "54fe93778b45a7eb",
|
||||
"gsd-core/workflows/fast.md": "0242082ca646819a",
|
||||
"gsd-core/workflows/forensics.md": "82800a3138ac1da9",
|
||||
"gsd-core/workflows/graduation.md": "40401655435beee3",
|
||||
"gsd-core/workflows/health.md": "043de14edb6a9723",
|
||||
@@ -378,7 +378,7 @@
|
||||
"skills/gsd-ns-manage/skills/settings/SKILL.md": "6d9fbddb0b00fd46",
|
||||
"skills/gsd-ns-manage/skills/ship/SKILL.md": "bd6cb3b46d57123f",
|
||||
"skills/gsd-ns-manage/skills/stats/SKILL.md": "5403a46852241fa8",
|
||||
"skills/gsd-ns-manage/skills/surface/SKILL.md": "0b3fe299b6544de7",
|
||||
"skills/gsd-ns-manage/skills/surface/SKILL.md": "ef08f90f89ca373c",
|
||||
"skills/gsd-ns-manage/skills/thread/SKILL.md": "a76c70c368f82dee",
|
||||
"skills/gsd-ns-manage/skills/undo/SKILL.md": "0ad1218f55c94e4b",
|
||||
"skills/gsd-ns-manage/skills/update/SKILL.md": "530b4206d729b56d",
|
||||
|
||||
@@ -242,7 +242,7 @@
|
||||
"gsd-core/workflows/execute-plan.md": "4910f75bab2040ab",
|
||||
"gsd-core/workflows/explore.md": "8a5437aa0c239c38",
|
||||
"gsd-core/workflows/extract-learnings.md": "3fcc858b20d0d0e6",
|
||||
"gsd-core/workflows/fast.md": "0162075e44072447",
|
||||
"gsd-core/workflows/fast.md": "91f126c4ef24217e",
|
||||
"gsd-core/workflows/forensics.md": "665546666547875d",
|
||||
"gsd-core/workflows/graduation.md": "1ca877cda258a5de",
|
||||
"gsd-core/workflows/health.md": "1f9fd2deea45896f",
|
||||
@@ -350,7 +350,7 @@
|
||||
"skills/gsd-ns-manage/skills/settings/SKILL.md": "e3590bb5e3d0fdf2",
|
||||
"skills/gsd-ns-manage/skills/ship/SKILL.md": "456609cf127b36dc",
|
||||
"skills/gsd-ns-manage/skills/stats/SKILL.md": "f5f5f1fbfe65cee8",
|
||||
"skills/gsd-ns-manage/skills/surface/SKILL.md": "025a48d0b1129e47",
|
||||
"skills/gsd-ns-manage/skills/surface/SKILL.md": "2c92a300547a5a97",
|
||||
"skills/gsd-ns-manage/skills/thread/SKILL.md": "48894eaf985265b3",
|
||||
"skills/gsd-ns-manage/skills/undo/SKILL.md": "0deb95bc44edf37c",
|
||||
"skills/gsd-ns-manage/skills/update/SKILL.md": "ffcd813ad256769b",
|
||||
|
||||
@@ -242,7 +242,7 @@
|
||||
"gsd-core/workflows/execute-plan.md": "c8567fb4438b4404",
|
||||
"gsd-core/workflows/explore.md": "04e461ff8159a24e",
|
||||
"gsd-core/workflows/extract-learnings.md": "af793bdf4ffd1c8a",
|
||||
"gsd-core/workflows/fast.md": "0162075e44072447",
|
||||
"gsd-core/workflows/fast.md": "91f126c4ef24217e",
|
||||
"gsd-core/workflows/forensics.md": "3d1ce16b5f605592",
|
||||
"gsd-core/workflows/graduation.md": "a766039ff6ca653f",
|
||||
"gsd-core/workflows/health.md": "7b19d6e2c0357c3e",
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
"commands/gsd-spec-phase.md": "c0e592ef19cc6721",
|
||||
"commands/gsd-spike.md": "5c85bade6e6b804f",
|
||||
"commands/gsd-stats.md": "bea8a4f0e6f2ddf3",
|
||||
"commands/gsd-surface.md": "b1ab5c2127dbf856",
|
||||
"commands/gsd-surface.md": "0317dc3b56ffcce6",
|
||||
"commands/gsd-thread.md": "56036040a95fc60b",
|
||||
"commands/gsd-ui-phase.md": "b48b780198ec7a2e",
|
||||
"commands/gsd-ui-review.md": "2ed61b5729f6e492",
|
||||
@@ -313,7 +313,7 @@
|
||||
"gsd-core/workflows/execute-plan.md": "ed874410972d32b7",
|
||||
"gsd-core/workflows/explore.md": "6c04f2e658d93261",
|
||||
"gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4",
|
||||
"gsd-core/workflows/fast.md": "94136fb570d20a9d",
|
||||
"gsd-core/workflows/fast.md": "8878ec034b401f36",
|
||||
"gsd-core/workflows/forensics.md": "0d500a3f5ab26913",
|
||||
"gsd-core/workflows/graduation.md": "47f1594c88c08501",
|
||||
"gsd-core/workflows/health.md": "107e3c72e76d9535",
|
||||
@@ -421,7 +421,7 @@
|
||||
"skills/gsd-ns-manage/skills/settings/SKILL.md": "8fcd8b04bb607ca7",
|
||||
"skills/gsd-ns-manage/skills/ship/SKILL.md": "eb23c16b4893b035",
|
||||
"skills/gsd-ns-manage/skills/stats/SKILL.md": "af60a0fed275a90b",
|
||||
"skills/gsd-ns-manage/skills/surface/SKILL.md": "9bc5790f601615cf",
|
||||
"skills/gsd-ns-manage/skills/surface/SKILL.md": "cf3c08a3fe963be7",
|
||||
"skills/gsd-ns-manage/skills/thread/SKILL.md": "59e0ea339e45a105",
|
||||
"skills/gsd-ns-manage/skills/undo/SKILL.md": "22d4462c987b7b66",
|
||||
"skills/gsd-ns-manage/skills/update/SKILL.md": "01ca0efbdb8f6efa",
|
||||
|
||||
41
tests/surface-md-paths.regression.test.cjs
Normal file
41
tests/surface-md-paths.regression.test.cjs
Normal file
@@ -0,0 +1,41 @@
|
||||
/**
|
||||
* Regression test for #2116 — commands/gsd/surface.md had unresolvable bare
|
||||
* `require('gsd-core/...')` specifiers and a wrong-package reinstall hint
|
||||
* (`npm i -g gsd-core` instead of `@opengsd/gsd-core`).
|
||||
*
|
||||
* This test asserts the doc uses resolvable paths (derived from runtimeConfigDir)
|
||||
* and the correct scoped package name in the reinstall hint.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
const { describe, test } = require('node:test');
|
||||
const assert = require('node:assert/strict');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const SURFACE_MD = path.join(__dirname, '..', 'commands', 'gsd', 'surface.md');
|
||||
|
||||
describe('#2116 regression: surface.md resolvable require + correct package', () => {
|
||||
const content = fs.readFileSync(SURFACE_MD, 'utf-8');
|
||||
|
||||
test('no bare require("gsd-core/...") specifiers', () => {
|
||||
assert.ok(
|
||||
!content.match(/require\s*\(\s*['"]gsd-core\//),
|
||||
'surface.md should not use bare require(\'gsd-core/...\') — use runtimeConfigDir-derived path (#2116)'
|
||||
);
|
||||
});
|
||||
|
||||
test('reinstall hint uses scoped package name', () => {
|
||||
assert.ok(
|
||||
content.includes('@opengsd/gsd-core'),
|
||||
'surface.md reinstall hint should reference @opengsd/gsd-core, not bare gsd-core (#2116)'
|
||||
);
|
||||
});
|
||||
|
||||
test('require examples use runtimeConfigDir-derived paths', () => {
|
||||
assert.ok(
|
||||
content.includes("require(runtimeConfigDir + '/gsd-core/bin/lib/capability-registry.cjs')"),
|
||||
'surface.md require examples should derive the path from runtimeConfigDir (#2116)'
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -28,7 +28,7 @@
|
||||
"execute-plan.md": 32655,
|
||||
"explore.md": 10541,
|
||||
"extract-learnings.md": 12893,
|
||||
"fast.md": 4149,
|
||||
"fast.md": 4790,
|
||||
"forensics.md": 12531,
|
||||
"graduation.md": 11622,
|
||||
"health.md": 11868,
|
||||
|
||||
Reference in New Issue
Block a user