chore: make OpenSpec toolchain explicit and diagnosable (WealthLedger/specs#4) #43
@@ -18,6 +18,7 @@ OpenSpec применяется после явного решения Change Ow
|
|||||||
Для native validation из этого репозитория:
|
Для native validation из этого репозитория:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
npm run check:openspec
|
||||||
openspec schema validate wealth-ledger-sdd --verbose
|
openspec schema validate wealth-ledger-sdd --verbose
|
||||||
openspec schema validate wealth-ledger-sdd-v2 --verbose
|
openspec schema validate wealth-ledger-sdd-v2 --verbose
|
||||||
openspec status --change <change> --store wealth-ledger-specs
|
openspec status --change <change> --store wealth-ledger-specs
|
||||||
@@ -25,10 +26,11 @@ openspec validate <change> --type change --strict --store wealth-ledger-specs
|
|||||||
openspec validate --specs --strict --store wealth-ledger-specs
|
openspec validate --specs --strict --store wealth-ledger-specs
|
||||||
```
|
```
|
||||||
|
|
||||||
Версия OpenSpec CLI не закреплена отдельным файлом: при обновлении проверяйте обе
|
OpenSpec CLI ставится глобально и не закрепляется в `package.json`: его транзитивная
|
||||||
schema, затронутые changes и canonical specs, фиксируя `openspec --version` вместе
|
зависимость `braces` имеет advisory без исправления в 3.x. Ожидаемая версия хранится
|
||||||
с результатами проверок. Structural validation не заменяет semantic verification
|
в `openspec/.cli-version`; `npm run check:openspec` проверяет Node из `.nvmrc`, версию
|
||||||
и independent read-only review перед archive.
|
CLI и доступность store, и при расхождении выводит команду исправления. Structural
|
||||||
|
validation не заменяет semantic verification и independent read-only review перед archive.
|
||||||
|
|
||||||
Node задаётся собственной `.nvmrc`; после `nvm use --silent` выполните `npm ci`.
|
Node задаётся собственной `.nvmrc`; после `nvm use --silent` выполните `npm ci`.
|
||||||
`npm run verify` проверяет diff. OpenSpec validation остаётся отдельной проверкой
|
`npm run verify` проверяет diff. OpenSpec validation остаётся отдельной проверкой
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
1.13.1
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"verify": "git diff --check",
|
"verify": "git diff --check",
|
||||||
|
"check:openspec": "node scripts/check-openspec.cjs",
|
||||||
"release:preview": "release-it --dry-run --ci",
|
"release:preview": "release-it --dry-run --ci",
|
||||||
"release:prepare": "release-it --ci",
|
"release:prepare": "release-it --ci",
|
||||||
"commitlint": "commitlint",
|
"commitlint": "commitlint",
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
const assert = require("node:assert/strict");
|
||||||
|
const { execFileSync } = require("node:child_process");
|
||||||
|
const { readFileSync } = require("node:fs");
|
||||||
|
const path = require("node:path");
|
||||||
|
|
||||||
|
// OpenSpec CLI is installed globally (no npm pin: its transitive braces advisory has no 3.x fix).
|
||||||
|
// This check fails fast with an actionable message instead of silently using another version.
|
||||||
|
const root = path.resolve(__dirname, "..");
|
||||||
|
const expectedCli = readFileSync(path.join(root, "openspec/.cli-version"), "utf8").trim();
|
||||||
|
const expectedNode = readFileSync(path.join(root, ".nvmrc"), "utf8").trim();
|
||||||
|
const store = "wealth-ledger-specs";
|
||||||
|
|
||||||
|
const run = (command, args) =>
|
||||||
|
execFileSync(command, args, { cwd: root, encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] }).trim();
|
||||||
|
|
||||||
|
assert.equal(
|
||||||
|
process.version.replace(/^v/, ""), expectedNode,
|
||||||
|
`Node ${process.version} differs from .nvmrc ${expectedNode}. Run: nvm use --silent`,
|
||||||
|
);
|
||||||
|
|
||||||
|
let cliVersion;
|
||||||
|
try {
|
||||||
|
cliVersion = run("openspec", ["--version"]);
|
||||||
|
} catch {
|
||||||
|
assert.fail(`openspec CLI not found. Install it globally: npm install -g @fission-ai/openspec@${expectedCli}`);
|
||||||
|
}
|
||||||
|
assert.equal(
|
||||||
|
cliVersion, expectedCli,
|
||||||
|
`openspec ${cliVersion} differs from openspec/.cli-version ${expectedCli}. Reinstall: npm install -g @fission-ai/openspec@${expectedCli}`,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Store presence is checked by the CLI itself: an unknown store must fail, not fall back silently.
|
||||||
|
try {
|
||||||
|
run("openspec", ["validate", "--specs", "--store", store]);
|
||||||
|
} catch (error) {
|
||||||
|
assert.fail(`openspec store '${store}' is not usable: ${error.stderr || error.stdout || error.message}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`openspec ${cliVersion} on Node ${expectedNode}: toolchain matches`);
|
||||||
Reference in New Issue
Block a user