@specship/specship-win32-arm64 0.25.0 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/specship.cmd +31 -1
- package/lib/dist/activation/cheatsheet.d.ts +17 -1
- package/lib/dist/activation/cheatsheet.d.ts.map +1 -1
- package/lib/dist/activation/cheatsheet.js +47 -3
- package/lib/dist/activation/cheatsheet.js.map +1 -1
- package/lib/dist/activation/hook-output.d.ts +80 -0
- package/lib/dist/activation/hook-output.d.ts.map +1 -0
- package/lib/dist/activation/hook-output.js +103 -0
- package/lib/dist/activation/hook-output.js.map +1 -0
- package/lib/dist/activation/search-intercept.d.ts +60 -29
- package/lib/dist/activation/search-intercept.d.ts.map +1 -1
- package/lib/dist/activation/search-intercept.js +159 -55
- package/lib/dist/activation/search-intercept.js.map +1 -1
- package/lib/dist/activation/steering.d.ts +8 -10
- package/lib/dist/activation/steering.d.ts.map +1 -1
- package/lib/dist/activation/steering.js +21 -6
- package/lib/dist/activation/steering.js.map +1 -1
- package/lib/dist/behaviour/behaviour-surface.d.ts +47 -0
- package/lib/dist/behaviour/behaviour-surface.d.ts.map +1 -1
- package/lib/dist/behaviour/behaviour-surface.js +108 -2
- package/lib/dist/behaviour/behaviour-surface.js.map +1 -1
- package/lib/dist/bin/node-version-check.d.ts +22 -7
- package/lib/dist/bin/node-version-check.d.ts.map +1 -1
- package/lib/dist/bin/node-version-check.js +39 -9
- package/lib/dist/bin/node-version-check.js.map +1 -1
- package/lib/dist/bin/specship.js +762 -81
- package/lib/dist/bin/specship.js.map +1 -1
- package/lib/dist/commands/specship/learn.md +22 -0
- package/lib/dist/commands/specship/spec.md +12 -0
- package/lib/dist/db/sqlite-adapter.d.ts +7 -5
- package/lib/dist/db/sqlite-adapter.d.ts.map +1 -1
- package/lib/dist/db/sqlite-adapter.js +11 -9
- package/lib/dist/db/sqlite-adapter.js.map +1 -1
- package/lib/dist/enforce/changed-files.d.ts +11 -0
- package/lib/dist/enforce/changed-files.d.ts.map +1 -1
- package/lib/dist/enforce/changed-files.js +42 -0
- package/lib/dist/enforce/changed-files.js.map +1 -1
- package/lib/dist/enforce/enforce.d.ts +25 -1
- package/lib/dist/enforce/enforce.d.ts.map +1 -1
- package/lib/dist/enforce/enforce.js +58 -3
- package/lib/dist/enforce/enforce.js.map +1 -1
- package/lib/dist/enforce/mutation.d.ts +46 -0
- package/lib/dist/enforce/mutation.d.ts.map +1 -0
- package/lib/dist/enforce/mutation.js +104 -0
- package/lib/dist/enforce/mutation.js.map +1 -0
- package/lib/dist/enforce/suppressions.d.ts +33 -0
- package/lib/dist/enforce/suppressions.d.ts.map +1 -0
- package/lib/dist/enforce/suppressions.js +159 -0
- package/lib/dist/enforce/suppressions.js.map +1 -0
- package/lib/dist/extraction/specs/markdown-spec-extractor.d.ts.map +1 -1
- package/lib/dist/extraction/specs/markdown-spec-extractor.js +16 -2
- package/lib/dist/extraction/specs/markdown-spec-extractor.js.map +1 -1
- package/lib/dist/graph/spec-coverage.d.ts +57 -1
- package/lib/dist/graph/spec-coverage.d.ts.map +1 -1
- package/lib/dist/graph/spec-coverage.js +129 -5
- package/lib/dist/graph/spec-coverage.js.map +1 -1
- package/lib/dist/health/smoke-check.js +2 -2
- package/lib/dist/health/smoke-check.js.map +1 -1
- package/lib/dist/index.d.ts +8 -3
- package/lib/dist/index.d.ts.map +1 -1
- package/lib/dist/index.js +65 -9
- package/lib/dist/index.js.map +1 -1
- package/lib/dist/installer/gemini-commands.d.ts +107 -0
- package/lib/dist/installer/gemini-commands.d.ts.map +1 -0
- package/lib/dist/installer/gemini-commands.js +264 -0
- package/lib/dist/installer/gemini-commands.js.map +1 -0
- package/lib/dist/installer/index.d.ts +23 -1
- package/lib/dist/installer/index.d.ts.map +1 -1
- package/lib/dist/installer/index.js +22 -3
- package/lib/dist/installer/index.js.map +1 -1
- package/lib/dist/installer/install-defaults.d.ts +19 -0
- package/lib/dist/installer/install-defaults.d.ts.map +1 -1
- package/lib/dist/installer/install-defaults.js +28 -0
- package/lib/dist/installer/install-defaults.js.map +1 -1
- package/lib/dist/installer/instructions-template.d.ts +22 -0
- package/lib/dist/installer/instructions-template.d.ts.map +1 -1
- package/lib/dist/installer/instructions-template.js +37 -1
- package/lib/dist/installer/instructions-template.js.map +1 -1
- package/lib/dist/installer/targets/claude.d.ts +4 -0
- package/lib/dist/installer/targets/claude.d.ts.map +1 -1
- package/lib/dist/installer/targets/claude.js +8 -25
- package/lib/dist/installer/targets/claude.js.map +1 -1
- package/lib/dist/installer/targets/gemini.d.ts +85 -12
- package/lib/dist/installer/targets/gemini.d.ts.map +1 -1
- package/lib/dist/installer/targets/gemini.js +527 -30
- package/lib/dist/installer/targets/gemini.js.map +1 -1
- package/lib/dist/installer/targets/shared.d.ts +13 -0
- package/lib/dist/installer/targets/shared.d.ts.map +1 -1
- package/lib/dist/installer/targets/shared.js +18 -0
- package/lib/dist/installer/targets/shared.js.map +1 -1
- package/lib/dist/installer/targets/types.d.ts +12 -0
- package/lib/dist/installer/targets/types.d.ts.map +1 -1
- package/lib/dist/jira/auto-publish.d.ts +71 -4
- package/lib/dist/jira/auto-publish.d.ts.map +1 -1
- package/lib/dist/jira/auto-publish.js +186 -17
- package/lib/dist/jira/auto-publish.js.map +1 -1
- package/lib/dist/jira/reconcile.d.ts +24 -1
- package/lib/dist/jira/reconcile.d.ts.map +1 -1
- package/lib/dist/jira/reconcile.js +46 -2
- package/lib/dist/jira/reconcile.js.map +1 -1
- package/lib/dist/jira/repo-config.d.ts +9 -0
- package/lib/dist/jira/repo-config.d.ts.map +1 -1
- package/lib/dist/jira/repo-config.js +11 -0
- package/lib/dist/jira/repo-config.js.map +1 -1
- package/lib/dist/jira/types.d.ts +7 -0
- package/lib/dist/jira/types.d.ts.map +1 -1
- package/lib/dist/jira/types.js.map +1 -1
- package/lib/dist/knowledge/enforce.d.ts +75 -0
- package/lib/dist/knowledge/enforce.d.ts.map +1 -0
- package/lib/dist/knowledge/enforce.js +250 -0
- package/lib/dist/knowledge/enforce.js.map +1 -0
- package/lib/dist/knowledge/facts.d.ts +33 -0
- package/lib/dist/knowledge/facts.d.ts.map +1 -0
- package/lib/dist/knowledge/facts.js +117 -0
- package/lib/dist/knowledge/facts.js.map +1 -0
- package/lib/dist/knowledge/proposals.d.ts +88 -0
- package/lib/dist/knowledge/proposals.d.ts.map +1 -0
- package/lib/dist/knowledge/proposals.js +360 -0
- package/lib/dist/knowledge/proposals.js.map +1 -0
- package/lib/dist/knowledge/stale.d.ts +64 -0
- package/lib/dist/knowledge/stale.d.ts.map +1 -0
- package/lib/dist/knowledge/stale.js +174 -0
- package/lib/dist/knowledge/stale.js.map +1 -0
- package/lib/dist/mcp/gemini-session.d.ts +50 -0
- package/lib/dist/mcp/gemini-session.d.ts.map +1 -0
- package/lib/dist/mcp/gemini-session.js +159 -0
- package/lib/dist/mcp/gemini-session.js.map +1 -0
- package/lib/dist/mcp/jira-tools.d.ts.map +1 -1
- package/lib/dist/mcp/jira-tools.js +25 -0
- package/lib/dist/mcp/jira-tools.js.map +1 -1
- package/lib/dist/mcp/model-context.d.ts +22 -9
- package/lib/dist/mcp/model-context.d.ts.map +1 -1
- package/lib/dist/mcp/model-context.js +35 -13
- package/lib/dist/mcp/model-context.js.map +1 -1
- package/lib/dist/mcp/proxy.js +1 -1
- package/lib/dist/mcp/proxy.js.map +1 -1
- package/lib/dist/mcp/server-instructions.d.ts +16 -15
- package/lib/dist/mcp/server-instructions.d.ts.map +1 -1
- package/lib/dist/mcp/server-instructions.js +67 -1
- package/lib/dist/mcp/server-instructions.js.map +1 -1
- package/lib/dist/mcp/session.js +1 -1
- package/lib/dist/mcp/session.js.map +1 -1
- package/lib/dist/mcp/spec-tools.d.ts +9 -1
- package/lib/dist/mcp/spec-tools.d.ts.map +1 -1
- package/lib/dist/mcp/spec-tools.js +69 -21
- package/lib/dist/mcp/spec-tools.js.map +1 -1
- package/lib/dist/mcp/tools.d.ts +37 -1
- package/lib/dist/mcp/tools.d.ts.map +1 -1
- package/lib/dist/mcp/tools.js +120 -9
- package/lib/dist/mcp/tools.js.map +1 -1
- package/lib/dist/pulse/pulse.d.ts +93 -0
- package/lib/dist/pulse/pulse.d.ts.map +1 -0
- package/lib/dist/pulse/pulse.js +401 -0
- package/lib/dist/pulse/pulse.js.map +1 -0
- package/lib/dist/reflect/apply.d.ts.map +1 -1
- package/lib/dist/reflect/apply.js +38 -3
- package/lib/dist/reflect/apply.js.map +1 -1
- package/lib/dist/reflect/auto-sweep.d.ts +26 -0
- package/lib/dist/reflect/auto-sweep.d.ts.map +1 -0
- package/lib/dist/reflect/auto-sweep.js +90 -0
- package/lib/dist/reflect/auto-sweep.js.map +1 -0
- package/lib/dist/reflect/cli.d.ts +62 -0
- package/lib/dist/reflect/cli.d.ts.map +1 -0
- package/lib/dist/reflect/cli.js +163 -0
- package/lib/dist/reflect/cli.js.map +1 -0
- package/lib/dist/reflect/miner.d.ts.map +1 -1
- package/lib/dist/reflect/miner.js +119 -0
- package/lib/dist/reflect/miner.js.map +1 -1
- package/lib/dist/reflect/sweep.d.ts +1 -0
- package/lib/dist/reflect/sweep.d.ts.map +1 -1
- package/lib/dist/reflect/sweep.js +62 -13
- package/lib/dist/reflect/sweep.js.map +1 -1
- package/lib/dist/reflect/targets.d.ts +2 -0
- package/lib/dist/reflect/targets.d.ts.map +1 -1
- package/lib/dist/reflect/targets.js +33 -0
- package/lib/dist/reflect/targets.js.map +1 -1
- package/lib/dist/reflect/types.d.ts +19 -2
- package/lib/dist/reflect/types.d.ts.map +1 -1
- package/lib/dist/resolution/test-title-links.d.ts.map +1 -1
- package/lib/dist/resolution/test-title-links.js +3 -14
- package/lib/dist/resolution/test-title-links.js.map +1 -1
- package/lib/dist/server/routes/claude.js +15 -7
- package/lib/dist/server/routes/knowledge.js +118 -0
- package/lib/dist/server/server.js +2 -0
- package/lib/dist/spec-lint/lint.d.ts +1 -1
- package/lib/dist/spec-lint/lint.d.ts.map +1 -1
- package/lib/dist/spec-lint/lint.js +63 -2
- package/lib/dist/spec-lint/lint.js.map +1 -1
- package/lib/dist/spec-quality/criterion-ids.d.ts +13 -0
- package/lib/dist/spec-quality/criterion-ids.d.ts.map +1 -0
- package/lib/dist/spec-quality/criterion-ids.js +38 -0
- package/lib/dist/spec-quality/criterion-ids.js.map +1 -0
- package/lib/dist/spec-quality/evidence-kind.d.ts +54 -0
- package/lib/dist/spec-quality/evidence-kind.d.ts.map +1 -0
- package/lib/dist/spec-quality/evidence-kind.js +183 -0
- package/lib/dist/spec-quality/evidence-kind.js.map +1 -0
- package/lib/dist/spec-quality/link-persist.d.ts +65 -0
- package/lib/dist/spec-quality/link-persist.d.ts.map +1 -0
- package/lib/dist/spec-quality/link-persist.js +249 -0
- package/lib/dist/spec-quality/link-persist.js.map +1 -0
- package/lib/dist/spec-quality/plan-scope.d.ts +38 -0
- package/lib/dist/spec-quality/plan-scope.d.ts.map +1 -0
- package/lib/dist/spec-quality/plan-scope.js +129 -0
- package/lib/dist/spec-quality/plan-scope.js.map +1 -0
- package/lib/dist/spec-quality/postcheck.d.ts +85 -0
- package/lib/dist/spec-quality/postcheck.d.ts.map +1 -0
- package/lib/dist/spec-quality/postcheck.js +390 -0
- package/lib/dist/spec-quality/postcheck.js.map +1 -0
- package/lib/dist/spec-quality/readiness.d.ts +72 -0
- package/lib/dist/spec-quality/readiness.d.ts.map +1 -0
- package/lib/dist/spec-quality/readiness.js +226 -0
- package/lib/dist/spec-quality/readiness.js.map +1 -0
- package/lib/dist/workflows/agents/claude.d.ts +16 -0
- package/lib/dist/workflows/agents/claude.d.ts.map +1 -0
- package/lib/dist/workflows/agents/claude.js +82 -0
- package/lib/dist/workflows/agents/claude.js.map +1 -0
- package/lib/dist/workflows/agents/gemini.d.ts +21 -0
- package/lib/dist/workflows/agents/gemini.d.ts.map +1 -0
- package/lib/dist/workflows/agents/gemini.js +124 -0
- package/lib/dist/workflows/agents/gemini.js.map +1 -0
- package/lib/dist/workflows/agents/index.d.ts +28 -0
- package/lib/dist/workflows/agents/index.d.ts.map +1 -0
- package/lib/dist/workflows/agents/index.js +104 -0
- package/lib/dist/workflows/agents/index.js.map +1 -0
- package/lib/dist/workflows/agents/types.d.ts +55 -0
- package/lib/dist/workflows/agents/types.d.ts.map +1 -0
- package/lib/dist/workflows/agents/types.js +46 -0
- package/lib/dist/workflows/agents/types.js.map +1 -0
- package/lib/dist/workflows/batch.d.ts +63 -0
- package/lib/dist/workflows/batch.d.ts.map +1 -0
- package/lib/dist/workflows/batch.js +151 -0
- package/lib/dist/workflows/batch.js.map +1 -0
- package/lib/dist/workflows/defaults/claude-design-implement.yaml +3 -4
- package/lib/dist/workflows/defaults/spec-author.yaml +11 -9
- package/lib/dist/workflows/defaults/spec-implement-mixed.yaml +21 -436
- package/lib/dist/workflows/defaults/spec-implement.yaml +465 -46
- package/lib/dist/workflows/discovery.d.ts +13 -0
- package/lib/dist/workflows/discovery.d.ts.map +1 -1
- package/lib/dist/workflows/discovery.js +79 -17
- package/lib/dist/workflows/discovery.js.map +1 -1
- package/lib/dist/workflows/executor.d.ts +18 -0
- package/lib/dist/workflows/executor.d.ts.map +1 -1
- package/lib/dist/workflows/executor.js +130 -33
- package/lib/dist/workflows/executor.js.map +1 -1
- package/lib/dist/workflows/gc.d.ts +50 -0
- package/lib/dist/workflows/gc.d.ts.map +1 -0
- package/lib/dist/workflows/gc.js +120 -0
- package/lib/dist/workflows/gc.js.map +1 -0
- package/lib/dist/workflows/merge-queue.d.ts +64 -0
- package/lib/dist/workflows/merge-queue.d.ts.map +1 -0
- package/lib/dist/workflows/merge-queue.js +162 -0
- package/lib/dist/workflows/merge-queue.js.map +1 -0
- package/lib/dist/workflows/runners/approval.d.ts +1 -1
- package/lib/dist/workflows/runners/approval.d.ts.map +1 -1
- package/lib/dist/workflows/runners/approval.js +11 -2
- package/lib/dist/workflows/runners/approval.js.map +1 -1
- package/lib/dist/workflows/runners/bash.d.ts +15 -0
- package/lib/dist/workflows/runners/bash.d.ts.map +1 -1
- package/lib/dist/workflows/runners/bash.js +50 -1
- package/lib/dist/workflows/runners/bash.js.map +1 -1
- package/lib/dist/workflows/runners/prompt.d.ts +16 -41
- package/lib/dist/workflows/runners/prompt.d.ts.map +1 -1
- package/lib/dist/workflows/runners/prompt.js +55 -120
- package/lib/dist/workflows/runners/prompt.js.map +1 -1
- package/lib/dist/workflows/runners/types.d.ts +12 -0
- package/lib/dist/workflows/runners/types.d.ts.map +1 -1
- package/lib/dist/workflows/schemas/workflow.d.ts +17 -0
- package/lib/dist/workflows/schemas/workflow.d.ts.map +1 -1
- package/lib/dist/workflows/schemas/workflow.js +27 -0
- package/lib/dist/workflows/schemas/workflow.js.map +1 -1
- package/lib/node_modules/.package-lock.json +1 -1
- package/lib/package.json +2 -2
- package/package.json +5 -3
- package/node.exe +0 -4
|
@@ -17,8 +17,11 @@
|
|
|
17
17
|
* extension; everything else flow-relevant (routes, handlers) is backend/batch.
|
|
18
18
|
*/
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.classifyCriterionShape = classifyCriterionShape;
|
|
21
|
+
exports.propertyFramework = propertyFramework;
|
|
20
22
|
exports.isUiNode = isUiNode;
|
|
21
23
|
exports.computeBehaviourSurface = computeBehaviourSurface;
|
|
24
|
+
exports.renderContractFuzzCommand = renderContractFuzzCommand;
|
|
22
25
|
exports.renderBehaviourSurface = renderBehaviourSurface;
|
|
23
26
|
/** Node kinds that are flow-relevant for a behaviour test (others are noise). */
|
|
24
27
|
const FLOW_KINDS = new Set([
|
|
@@ -29,6 +32,40 @@ const FLOW_KINDS = new Set([
|
|
|
29
32
|
]);
|
|
30
33
|
/** File extensions that are unambiguously front-end / UI. */
|
|
31
34
|
const UI_FILE = /\.(tsx|jsx|vue|svelte|astro)$/i;
|
|
35
|
+
/**
|
|
36
|
+
* Classify a criterion's test shape (REQ-QGATE-001.A1) — deterministic
|
|
37
|
+
* keyword/shape heuristic, no LLM. Invariant cues are universal quantifiers
|
|
38
|
+
* and negative universals ("for all", "every", "never", "always", "MUST
|
|
39
|
+
* NOT"), plus the classic property shapes (round-trip, idempotence,
|
|
40
|
+
* input-independence). Everything else is an example: a concrete
|
|
41
|
+
* stimulus→response pair.
|
|
42
|
+
*/
|
|
43
|
+
function classifyCriterionShape(text) {
|
|
44
|
+
const t = text.toLowerCase();
|
|
45
|
+
const cues = [
|
|
46
|
+
/\bfor (all|every|any)\b/,
|
|
47
|
+
/\b(every|any) (input|request|value|call|x)\b/,
|
|
48
|
+
/\bnever\b/,
|
|
49
|
+
/\balways\b/,
|
|
50
|
+
/\bmust not\b/,
|
|
51
|
+
/\bround-?trip\b/,
|
|
52
|
+
/\bidempotent\b/,
|
|
53
|
+
/\bregardless of\b/,
|
|
54
|
+
/\bno matter\b/,
|
|
55
|
+
/\barbitrary\b/,
|
|
56
|
+
];
|
|
57
|
+
return cues.some((re) => re.test(t)) ? 'invariant' : 'example';
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The property-testing framework the generated skeleton should use
|
|
61
|
+
* (REQ-QGATE-001.A2), picked from the linked implementation's file types:
|
|
62
|
+
* Python → Hypothesis, everything else (this tool's world is JS/TS) →
|
|
63
|
+
* fast-check.
|
|
64
|
+
*/
|
|
65
|
+
function propertyFramework(linkedNodes) {
|
|
66
|
+
const py = linkedNodes.some((n) => /\.pyi?$/i.test(n.filePath));
|
|
67
|
+
return py ? 'Hypothesis (@given)' : 'fast-check';
|
|
68
|
+
}
|
|
32
69
|
/** A node is UI when it's a component or lives in a front-end file. */
|
|
33
70
|
function isUiNode(node) {
|
|
34
71
|
return node.kind === 'component' || UI_FILE.test(node.filePath);
|
|
@@ -52,7 +89,10 @@ function toElement(node, linkedDirectly) {
|
|
|
52
89
|
*/
|
|
53
90
|
function computeBehaviourSurface(deps) {
|
|
54
91
|
if (!deps.requirementExists) {
|
|
55
|
-
return {
|
|
92
|
+
return {
|
|
93
|
+
requirementId: deps.requirementId, found: false, ui: [], backend: [], criteria: [],
|
|
94
|
+
contractFuzz: { eligible: false, routes: [] },
|
|
95
|
+
};
|
|
56
96
|
}
|
|
57
97
|
const seen = new Set();
|
|
58
98
|
const ui = [];
|
|
@@ -78,7 +118,36 @@ function computeBehaviourSurface(deps) {
|
|
|
78
118
|
a.startLine - b.startLine;
|
|
79
119
|
ui.sort(order);
|
|
80
120
|
backend.sort(order);
|
|
81
|
-
|
|
121
|
+
const criteria = (deps.criteria ?? []).map((c) => ({
|
|
122
|
+
id: c.id,
|
|
123
|
+
text: c.text,
|
|
124
|
+
testShape: classifyCriterionShape(c.text),
|
|
125
|
+
}));
|
|
126
|
+
const routes = [...ui, ...backend].filter((e) => e.kind === 'route' && e.linkedDirectly);
|
|
127
|
+
return {
|
|
128
|
+
requirementId: deps.requirementId, found: true, ui, backend, criteria,
|
|
129
|
+
contractFuzz: { eligible: routes.length > 0, routes },
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* The reviewable Schemathesis invocation for a route-backed spec
|
|
134
|
+
* (REQ-QGATE-003.A2) — scoped to the linked routes via a path regex, never
|
|
135
|
+
* the whole API. Emitted as text for a human/agent to review and run; this
|
|
136
|
+
* module executes nothing.
|
|
137
|
+
*/
|
|
138
|
+
function renderContractFuzzCommand(routes, schemaRef) {
|
|
139
|
+
const paths = routes.map((r) => {
|
|
140
|
+
// Route names carry an optional method prefix ("GET /api/users") —
|
|
141
|
+
// extract the path and normalize `{id}`/`:id` params to a wildcard
|
|
142
|
+
// BEFORE regex-escaping the literal segments.
|
|
143
|
+
const path = (r.name.match(/\/\S*/) ?? [r.name])[0];
|
|
144
|
+
return path
|
|
145
|
+
.split(/\{[^}]+\}|:\w+/)
|
|
146
|
+
.map((seg) => seg.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))
|
|
147
|
+
.join('[^/]+');
|
|
148
|
+
});
|
|
149
|
+
const regex = `^(${[...new Set(paths)].join('|')})$`;
|
|
150
|
+
return `st run ${schemaRef} --include-path-regex '${regex}' --checks all`;
|
|
82
151
|
}
|
|
83
152
|
/** Render a behaviour surface as markdown for the `specship_spec` response. */
|
|
84
153
|
function renderBehaviourSurface(surface) {
|
|
@@ -107,6 +176,43 @@ function renderBehaviourSurface(surface) {
|
|
|
107
176
|
};
|
|
108
177
|
section('UI tier (Playwright)', surface.ui, 'No UI surface — author backend/batch tests only.');
|
|
109
178
|
section('Backend / batch tier', surface.backend, 'No backend surface found.');
|
|
179
|
+
// Property lane (REQ-QGATE-001): classified criteria with the directive for
|
|
180
|
+
// invariant-shaped ones. Rendered only when criteria were supplied, so the
|
|
181
|
+
// pre-existing surface output is unchanged for callers that don't pass them.
|
|
182
|
+
if (surface.criteria.length > 0) {
|
|
183
|
+
const fw = propertyFramework([...surface.backend, ...surface.ui].filter((e) => e.linkedDirectly)
|
|
184
|
+
.map((e) => ({ filePath: e.filePath })));
|
|
185
|
+
lines.push('## Acceptance criteria — test shape');
|
|
186
|
+
for (const c of surface.criteria) {
|
|
187
|
+
lines.push(`- ${c.id} [${c.testShape}] — ${c.text}`);
|
|
188
|
+
}
|
|
189
|
+
if (surface.criteria.some((c) => c.testShape === 'invariant')) {
|
|
190
|
+
lines.push('');
|
|
191
|
+
lines.push(`_Author each **invariant** criterion as a property-based test with ${fw} — ` +
|
|
192
|
+
'generate inputs, assert the stated property; do not hard-code a single example. ' +
|
|
193
|
+
'Example-shaped criteria stay concrete example tests._');
|
|
194
|
+
}
|
|
195
|
+
lines.push('');
|
|
196
|
+
}
|
|
197
|
+
// Contract-fuzz leg (REQ-QGATE-003): emitted as a reviewable command for the
|
|
198
|
+
// linked routes — review the schema ref and run it yourself; nothing here
|
|
199
|
+
// executes it.
|
|
200
|
+
if (surface.contractFuzz.eligible) {
|
|
201
|
+
lines.push('## Contract-fuzz leg (Schemathesis)');
|
|
202
|
+
lines.push('This requirement links to API route(s) — its input space is fuzzable from the OpenAPI schema:');
|
|
203
|
+
for (const r of surface.contractFuzz.routes) {
|
|
204
|
+
lines.push(`- [route] \`${r.name}\` — ${r.filePath}:${r.startLine}`);
|
|
205
|
+
}
|
|
206
|
+
lines.push('');
|
|
207
|
+
lines.push('```bash');
|
|
208
|
+
lines.push(renderContractFuzzCommand(surface.contractFuzz.routes, '<openapi-schema (path or URL)>'));
|
|
209
|
+
lines.push('```');
|
|
210
|
+
lines.push('');
|
|
211
|
+
lines.push('_Review before running (staging only). Record the outcome through link verification: ' +
|
|
212
|
+
'a failing run → result "fail" with the failing case as reason; a passing run is ' +
|
|
213
|
+
'evidence under the existing rules — it does not mint tests-kind links._');
|
|
214
|
+
lines.push('');
|
|
215
|
+
}
|
|
110
216
|
return lines.join('\n').trimEnd();
|
|
111
217
|
}
|
|
112
218
|
//# sourceMappingURL=behaviour-surface.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"behaviour-surface.js","sourceRoot":"","sources":["../../src/behaviour/behaviour-surface.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;
|
|
1
|
+
{"version":3,"file":"behaviour-surface.js","sourceRoot":"","sources":["../../src/behaviour/behaviour-surface.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,16 +18,31 @@
|
|
|
18
18
|
*/
|
|
19
19
|
export declare function buildNode25BlockBanner(nodeVersion: string): string;
|
|
20
20
|
/**
|
|
21
|
-
* Lowest supported Node.js major
|
|
22
|
-
*
|
|
23
|
-
*
|
|
21
|
+
* Lowest supported Node.js version (major.minor). Matches the `engines` floor
|
|
22
|
+
* (`>=22.5.0 <25.0.0`) in package.json, npm-shim/package.json, and every
|
|
23
|
+
* package `scripts/pack-npm.sh` publishes. 22.5 is the first release with the
|
|
24
|
+
* built-in `node:sqlite` the SQLite adapter falls back to. `engines` alone only
|
|
24
25
|
* *warns* on install (unless the user set `engine-strict`), so the CLI bootstrap
|
|
25
|
-
* also hard-blocks here to actually enforce the floor.
|
|
26
|
+
* also hard-blocks here to actually enforce the floor (REQ-AUDFIX-007).
|
|
26
27
|
*/
|
|
27
|
-
export declare const MIN_NODE_MAJOR =
|
|
28
|
+
export declare const MIN_NODE_MAJOR = 22;
|
|
29
|
+
export declare const MIN_NODE_MINOR = 5;
|
|
30
|
+
/** Human-readable floor, e.g. "22.5". */
|
|
31
|
+
export declare const MIN_NODE_VERSION = "22.5";
|
|
28
32
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
33
|
+
* True when `nodeVersion` (e.g. "22.4.1", "v20.0.0") is below the supported
|
|
34
|
+
* floor. Compares major, then minor; an unparseable version counts as too old.
|
|
35
|
+
*/
|
|
36
|
+
export declare function isNodeTooOld(nodeVersion: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Startup decision for the Node floor: `ok` (supported), `block` (too old, exit
|
|
39
|
+
* 1), or `warn` (too old, but `SPECSHIP_ALLOW_UNSAFE_NODE` is set — show the
|
|
40
|
+
* banner and continue). Pure so the bootstrap and tests share one rule.
|
|
41
|
+
*/
|
|
42
|
+
export declare function nodeFloorDecision(nodeVersion: string, env?: Record<string, string | undefined>): 'ok' | 'block' | 'warn';
|
|
43
|
+
/**
|
|
44
|
+
* Build the bordered banner shown when SpecShip detects a Node.js version below
|
|
45
|
+
* {@link MIN_NODE_VERSION}. Pinned via unit test so the recovery commands and the
|
|
31
46
|
* override env var can't be silently stripped by future edits.
|
|
32
47
|
*
|
|
33
48
|
* Uses ASCII glyphs to stay readable on Windows OEM-codepage consoles
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-version-check.d.ts","sourceRoot":"","sources":["../../src/bin/node-version-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAmBlE;AAED
|
|
1
|
+
{"version":3,"file":"node-version-check.d.ts","sourceRoot":"","sources":["../../src/bin/node-version-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAmBlE;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,yCAAyC;AACzC,eAAO,MAAM,gBAAgB,SAAwC,CAAC;AAEtE;;;GAGG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAOzD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,IAAI,GAAG,OAAO,GAAG,MAAM,CAGzB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAkBjE"}
|
|
@@ -9,8 +9,10 @@
|
|
|
9
9
|
* safe to import from tests without triggering CLI bootstrap.
|
|
10
10
|
*/
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.MIN_NODE_MAJOR = void 0;
|
|
12
|
+
exports.MIN_NODE_VERSION = exports.MIN_NODE_MINOR = exports.MIN_NODE_MAJOR = void 0;
|
|
13
13
|
exports.buildNode25BlockBanner = buildNode25BlockBanner;
|
|
14
|
+
exports.isNodeTooOld = isNodeTooOld;
|
|
15
|
+
exports.nodeFloorDecision = nodeFloorDecision;
|
|
14
16
|
exports.buildNodeTooOldBanner = buildNodeTooOldBanner;
|
|
15
17
|
/**
|
|
16
18
|
* Build the bordered banner shown when SpecShip detects an
|
|
@@ -42,16 +44,44 @@ function buildNode25BlockBanner(nodeVersion) {
|
|
|
42
44
|
].join('\n');
|
|
43
45
|
}
|
|
44
46
|
/**
|
|
45
|
-
* Lowest supported Node.js major
|
|
46
|
-
*
|
|
47
|
-
*
|
|
47
|
+
* Lowest supported Node.js version (major.minor). Matches the `engines` floor
|
|
48
|
+
* (`>=22.5.0 <25.0.0`) in package.json, npm-shim/package.json, and every
|
|
49
|
+
* package `scripts/pack-npm.sh` publishes. 22.5 is the first release with the
|
|
50
|
+
* built-in `node:sqlite` the SQLite adapter falls back to. `engines` alone only
|
|
48
51
|
* *warns* on install (unless the user set `engine-strict`), so the CLI bootstrap
|
|
49
|
-
* also hard-blocks here to actually enforce the floor.
|
|
52
|
+
* also hard-blocks here to actually enforce the floor (REQ-AUDFIX-007).
|
|
50
53
|
*/
|
|
51
|
-
exports.MIN_NODE_MAJOR =
|
|
54
|
+
exports.MIN_NODE_MAJOR = 22;
|
|
55
|
+
exports.MIN_NODE_MINOR = 5;
|
|
56
|
+
/** Human-readable floor, e.g. "22.5". */
|
|
57
|
+
exports.MIN_NODE_VERSION = `${exports.MIN_NODE_MAJOR}.${exports.MIN_NODE_MINOR}`;
|
|
52
58
|
/**
|
|
53
|
-
*
|
|
54
|
-
*
|
|
59
|
+
* True when `nodeVersion` (e.g. "22.4.1", "v20.0.0") is below the supported
|
|
60
|
+
* floor. Compares major, then minor; an unparseable version counts as too old.
|
|
61
|
+
*/
|
|
62
|
+
function isNodeTooOld(nodeVersion) {
|
|
63
|
+
const [majStr, minStr] = nodeVersion.replace(/^v/, '').split('.');
|
|
64
|
+
const major = parseInt(majStr ?? '', 10);
|
|
65
|
+
const minor = parseInt(minStr ?? '0', 10);
|
|
66
|
+
if (!Number.isFinite(major))
|
|
67
|
+
return true;
|
|
68
|
+
if (major !== exports.MIN_NODE_MAJOR)
|
|
69
|
+
return major < exports.MIN_NODE_MAJOR;
|
|
70
|
+
return (Number.isFinite(minor) ? minor : 0) < exports.MIN_NODE_MINOR;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Startup decision for the Node floor: `ok` (supported), `block` (too old, exit
|
|
74
|
+
* 1), or `warn` (too old, but `SPECSHIP_ALLOW_UNSAFE_NODE` is set — show the
|
|
75
|
+
* banner and continue). Pure so the bootstrap and tests share one rule.
|
|
76
|
+
*/
|
|
77
|
+
function nodeFloorDecision(nodeVersion, env = process.env) {
|
|
78
|
+
if (!isNodeTooOld(nodeVersion))
|
|
79
|
+
return 'ok';
|
|
80
|
+
return env.SPECSHIP_ALLOW_UNSAFE_NODE ? 'warn' : 'block';
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Build the bordered banner shown when SpecShip detects a Node.js version below
|
|
84
|
+
* {@link MIN_NODE_VERSION}. Pinned via unit test so the recovery commands and the
|
|
55
85
|
* override env var can't be silently stripped by future edits.
|
|
56
86
|
*
|
|
57
87
|
* Uses ASCII glyphs to stay readable on Windows OEM-codepage consoles
|
|
@@ -63,7 +93,7 @@ function buildNodeTooOldBanner(nodeVersion) {
|
|
|
63
93
|
sep,
|
|
64
94
|
`[SpecShip] Unsupported Node.js version: ${nodeVersion}`,
|
|
65
95
|
sep,
|
|
66
|
-
`SpecShip requires Node.js ${exports.
|
|
96
|
+
`SpecShip requires Node.js ${exports.MIN_NODE_VERSION} or newer. Older versions lack`,
|
|
67
97
|
'language features and native APIs SpecShip depends on, and are not',
|
|
68
98
|
'tested or supported.',
|
|
69
99
|
'',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-version-check.js","sourceRoot":"","sources":["../../src/bin/node-version-check.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAWH,wDAmBC;AAmBD,sDAkBC;
|
|
1
|
+
{"version":3,"file":"node-version-check.js","sourceRoot":"","sources":["../../src/bin/node-version-check.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAWH,wDAmBC;AAmBD,oCAOC;AAOD,8CAMC;AAUD,sDAkBC;AA/FD;;;;;;;;GAQG;AACH,SAAgB,sBAAsB,CAAC,WAAmB;IACxD,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3B,OAAO;QACL,GAAG;QACH,2CAA2C,WAAW,EAAE;QACxD,GAAG;QACH,qEAAqE;QACrE,gEAAgE;QAChE,iEAAiE;QACjE,gFAAgF;QAChF,EAAE;QACF,8BAA8B;QAC9B,+DAA+D;QAC/D,6EAA6E;QAC7E,EAAE;QACF,sDAAsD;QACtD,6CAA6C;QAC7C,GAAG;KACJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACU,QAAA,cAAc,GAAG,EAAE,CAAC;AACpB,QAAA,cAAc,GAAG,CAAC,CAAC;AAChC,yCAAyC;AAC5B,QAAA,gBAAgB,GAAG,GAAG,sBAAc,IAAI,sBAAc,EAAE,CAAC;AAEtE;;;GAGG;AACH,SAAgB,YAAY,CAAC,WAAmB;IAC9C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,KAAK,KAAK,sBAAc;QAAE,OAAO,KAAK,GAAG,sBAAc,CAAC;IAC5D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,sBAAc,CAAC;AAC/D,CAAC;AAED;;;;GAIG;AACH,SAAgB,iBAAiB,CAC/B,WAAmB,EACnB,MAA0C,OAAO,CAAC,GAAG;IAErD,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;AAC3D,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,qBAAqB,CAAC,WAAmB;IACvD,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3B,OAAO;QACL,GAAG;QACH,2CAA2C,WAAW,EAAE;QACxD,GAAG;QACH,6BAA6B,wBAAgB,gCAAgC;QAC7E,oEAAoE;QACpE,sBAAsB;QACtB,EAAE;QACF,8BAA8B;QAC9B,+DAA+D;QAC/D,6EAA6E;QAC7E,EAAE;QACF,8CAA8C;QAC9C,6CAA6C;QAC7C,GAAG;KACJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|