* fix(#4132): verify durable runtime surface sources * chore(#4132): record PR number in changeset * test(#4132): cover rejected commands source alias * fix(#4132): reject aliased package fallback * test(#4132): cover rejected agents source alias * test(#4132): cover partially aliased marker provider * fix(#4132): reject partially aliased source providers * test(#4132): cover routed source identity probes * fix(#4132): route installed source identity probes * refactor(#4132): tighten installer source metadata * test(#4132): cover corpus trust boundary attacks * fix(#4132): close installed corpus trust gaps * refactor(#4132): keep installer authority private * fix(#4132): preserve private installer fallback * test(#4132): preserve fixture source authority * fix(#4132): reject overlapping source fallback * fix(#4132): avoid redundant installed corpus reads * refactor(#4132): simplify provider resolution * test(#4132): sync install tree fixtures after rebase --------- Co-authored-by: Tom Boucher <trekkie@nomorestars.com>
57 lines
2.1 KiB
JavaScript
57 lines
2.1 KiB
JavaScript
/**
|
|
* 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)'
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('#4132 regression: surface.md uses the state-last public contract', () => {
|
|
// allow-test-rule: source-text-is-the-product (#4132)
|
|
const content = fs.readFileSync(SURFACE_MD, 'utf-8');
|
|
|
|
test('mutations pass an in-memory candidate without an eager state write', () => {
|
|
assert.match(content, /surfaceState/);
|
|
assert.match(content, /publishes the candidate state only after/);
|
|
assert.doesNotMatch(content, /writeSurface\(runtimeConfigDir, surfaceState\)/);
|
|
});
|
|
|
|
test('reset is represented as an absent-state candidate, not an eager delete', () => {
|
|
assert.match(content, /surfaceState: null/);
|
|
});
|
|
});
|