@am_shork/attest 0.1.3 → 0.1.5
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/CHANGELOG.md +81 -1
- package/README.md +20 -2
- package/dist/cli/index.js +11 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/core/pipeline.d.ts +7 -2
- package/dist/core/pipeline.d.ts.map +1 -1
- package/dist/core/pipeline.js +4 -4
- package/dist/core/pipeline.js.map +1 -1
- package/dist/core/runner.d.ts +20 -0
- package/dist/core/runner.d.ts.map +1 -1
- package/dist/core/runner.js +14 -5
- package/dist/core/runner.js.map +1 -1
- package/dist/core/schema.d.ts +6 -6
- package/dist/core/schema.d.ts.map +1 -1
- package/dist/core/schema.js +8 -1
- package/dist/core/schema.js.map +1 -1
- package/dist/core/validator.d.ts +6 -3
- package/dist/core/validator.d.ts.map +1 -1
- package/dist/core/validator.js +27 -20
- package/dist/core/validator.js.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,83 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
The breaking items below are held for **0.2.0** (under 0.x SemVer a breaking
|
|
11
|
+
change bumps the minor). "Breaking" means it changes the exit code of an existing
|
|
12
|
+
valid setup, rejects previously-valid input, removes/renames a public API or
|
|
13
|
+
`--json` field, or changes a default runtime behavior an existing invocation
|
|
14
|
+
relies on — diagnostic message text is not API.
|
|
15
|
+
|
|
16
|
+
### Planned for 0.2.0 (breaking)
|
|
17
|
+
|
|
18
|
+
- **A vacuous green stops passing.** Today `attest verify` on a spec that ran no
|
|
19
|
+
scenarios (an empty or requirement-less directory) prints
|
|
20
|
+
`✓ No issues. — 0 error, …` and exits `0`, because `runAndCollect` reads "no
|
|
21
|
+
failing tests" as `passed`. `verify` will instead emit a new `empty-spec`
|
|
22
|
+
ERROR when zero scenarios executed (or the registry has zero requirements),
|
|
23
|
+
so `ok` becomes `false` and the exit code follows the existing `hasError`
|
|
24
|
+
path. Wires up `hasSpecs()` (present in `pipeline.ts`, never called today).
|
|
25
|
+
*Breaking:* an "empty directory → exit 0" run flips to exit 1 — which is the
|
|
26
|
+
point, since that run attests nothing. *Non-breaking companion (may land
|
|
27
|
+
earlier in 0.1.x):* requirement/scenario counts in the summary line
|
|
28
|
+
(`— 33 requirements / 59 scenarios, 0 error, …`).
|
|
29
|
+
- **Default spec discovery ignores files with no `requirement()`.** `verify` at
|
|
30
|
+
a repo root currently sweeps every `**/*.spec.ts` — including a pre-existing
|
|
31
|
+
suite — into a runner with no aliases/DOM, a guaranteed red unrelated to the
|
|
32
|
+
code. The default will change to run only spec files that declare at least one
|
|
33
|
+
`requirement()`, so an incumbent suite is left untouched without forcing a
|
|
34
|
+
directory layout. *Breaking:* a repo relying on the root scan to pick up
|
|
35
|
+
requirement-less specs sees a different set run. *Non-breaking companion (may
|
|
36
|
+
land earlier in 0.1.x):* a pre-run report of how many spec files were located
|
|
37
|
+
and how many contain a `requirement()` call.
|
|
38
|
+
|
|
39
|
+
## [0.1.5] - 2026-07-24
|
|
40
|
+
|
|
41
|
+
A follow-up to the 0.1.4 adoption fixes, closing the framework-repo gap.
|
|
42
|
+
|
|
43
|
+
### Added
|
|
44
|
+
|
|
45
|
+
- **`--vitest-config <path>` on `verify` and `archive`.** Framework code —
|
|
46
|
+
`.vue`, a DOM environment, path aliases, auto-imports — needs transforms a
|
|
47
|
+
bare run cannot provide, which put most of a Nuxt/Vite repo out of reach. The
|
|
48
|
+
flag points the child run at a Vitest config that supplies the *environment*
|
|
49
|
+
(plugins, `resolve.alias`, `test.environment`); Attest still owns the run
|
|
50
|
+
*scope* — `include`/`exclude`/`root`/`watch` always win, so a config can
|
|
51
|
+
neither widen the spec set nor un-exclude `changes/`+`archive/`. Default stays
|
|
52
|
+
`config: false` (isolated and deterministic), so existing runs are unchanged;
|
|
53
|
+
the path is resolved against the cwd. No `--json` shape change (`schemaVersion`
|
|
54
|
+
stays `1`).
|
|
55
|
+
|
|
56
|
+
## [0.1.4] - 2026-07-24
|
|
57
|
+
|
|
58
|
+
Non-breaking fixes from two independent 0.1.3 adoptions — a plain-TS
|
|
59
|
+
re-onboarding and a first Nuxt 4 adoption.
|
|
60
|
+
|
|
61
|
+
### Added
|
|
62
|
+
|
|
63
|
+
- **`params` accepts an array of scalars, not just a lone scalar.** List-shaped
|
|
64
|
+
constants — vendor blacklists, id sets — are the values most prone to drift,
|
|
65
|
+
and rejecting arrays kept exactly those out of the single-source mechanism.
|
|
66
|
+
An array still has one owner (the spec) read from one place (the scenario).
|
|
67
|
+
Existing scalar registries are unaffected; the `params` type union widens to
|
|
68
|
+
admit `Array<number | string | boolean>`. `schemaVersion` is unchanged (no
|
|
69
|
+
`--json` shape change).
|
|
70
|
+
|
|
71
|
+
### Changed
|
|
72
|
+
|
|
73
|
+
- **The `possible-drift` heuristic is now evaluated per requirement, not per
|
|
74
|
+
scenario.** A requirement that owns params is quiet as soon as *any* one of
|
|
75
|
+
its covering scenarios reads them, so a correct multi-facet requirement is no
|
|
76
|
+
longer flagged forever by the facets that legitimately don't touch params. The
|
|
77
|
+
INFO is emitted at most once per requirement (anchored at its first covering
|
|
78
|
+
scenario). INFO only — the verdict and exit code are unaffected.
|
|
79
|
+
- **Widened peer ranges** to `vite ^5 || ^6 || ^7 || ^8` and
|
|
80
|
+
`vitest ^2 || ^3 || ^4`. Current generations (Vitest 4 / Vite 7–8) work against
|
|
81
|
+
the `startVitest` / `state.getFiles()` / `configDefaults` surface Attest uses;
|
|
82
|
+
the old ranges emitted peer warnings an adopter could only silence by
|
|
83
|
+
downgrading their framework's test stack. Verified by the packaging test.
|
|
84
|
+
- **Documented `cover --json`'s `scenarioCount`** — the README JSON section now
|
|
85
|
+
states the coverage row shape (`{ reqId, covered, scenarioCount }`).
|
|
86
|
+
|
|
10
87
|
## [0.1.3] - 2026-07-24
|
|
11
88
|
|
|
12
89
|
### Added
|
|
@@ -118,7 +195,10 @@ Initial release.
|
|
|
118
195
|
(MIT), whose four-stage engine and diff-first change model Attest's
|
|
119
196
|
architecture is adapted from (re-implemented from scratch, no source copied).
|
|
120
197
|
|
|
121
|
-
[Unreleased]: https://gitlab.com/Pseudorca/attest/-/compare/v0.1.
|
|
198
|
+
[Unreleased]: https://gitlab.com/Pseudorca/attest/-/compare/v0.1.5...main
|
|
199
|
+
[0.1.5]: https://gitlab.com/Pseudorca/attest/-/tags/v0.1.5
|
|
200
|
+
[0.1.4]: https://gitlab.com/Pseudorca/attest/-/tags/v0.1.4
|
|
201
|
+
[0.1.3]: https://gitlab.com/Pseudorca/attest/-/tags/v0.1.3
|
|
122
202
|
[0.1.2]: https://gitlab.com/Pseudorca/attest/-/tags/v0.1.2
|
|
123
203
|
[0.1.1]: https://gitlab.com/Pseudorca/attest/-/tags/v0.1.1
|
|
124
204
|
[0.1.0]: https://gitlab.com/Pseudorca/attest/-/tags/v0.1.0
|
package/README.md
CHANGED
|
@@ -10,7 +10,9 @@ by a stable ID and continuously detects drift.
|
|
|
10
10
|
|
|
11
11
|
The killer move against drift: values that change (timeouts, limits) live **once**
|
|
12
12
|
in a requirement's `params`, and tests read them from there — so a number is
|
|
13
|
-
physically impossible to drift between the spec and the assertion.
|
|
13
|
+
physically impossible to drift between the spec and the assertion. A param may be
|
|
14
|
+
a scalar or an array of scalars, so list-shaped constants (vendor blacklists, id
|
|
15
|
+
sets) get the same single source as a lone number.
|
|
14
16
|
|
|
15
17
|
See the authoritative design — [English](https://gitlab.com/Pseudorca/attest/-/blob/main/docs/en/attest-design.md) · [中文](https://gitlab.com/Pseudorca/attest/-/blob/main/docs/zh/attest-design.md) — and the rest of the [docs](https://gitlab.com/Pseudorca/attest/-/tree/main/docs).
|
|
16
18
|
|
|
@@ -70,6 +72,21 @@ attest cover # which requirements lack a scenario
|
|
|
70
72
|
attest archive <change> # gate a proposed change: green + covered + no drift
|
|
71
73
|
```
|
|
72
74
|
|
|
75
|
+
### Framework code (`.vue`, DOM, path aliases)
|
|
76
|
+
|
|
77
|
+
The child run isolates from any ambient config by default, so specs run in a bare
|
|
78
|
+
Vite/Vitest environment — no `.vue` transform, DOM, or `~/`/`@/` aliases. When
|
|
79
|
+
your specs need that environment, point `verify` (or `archive`) at a config:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
attest verify --vitest-config vitest.config.ts
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
The config supplies the environment (plugins, `resolve.alias`, `test.environment`);
|
|
86
|
+
Attest still owns the run scope — `include`/`exclude`/`root` always win, so a
|
|
87
|
+
config cannot pull in your existing suite or un-exclude `changes/`. Without the
|
|
88
|
+
flag the run stays isolated and deterministic.
|
|
89
|
+
|
|
73
90
|
### Machine-readable output
|
|
74
91
|
|
|
75
92
|
Every command takes `--json` and then writes exactly one JSON document to
|
|
@@ -102,7 +119,8 @@ attest check --json
|
|
|
102
119
|
```
|
|
103
120
|
|
|
104
121
|
`verify` adds `passed` (was the test run itself green, independent of the
|
|
105
|
-
overall verdict); `cover` adds `coverage[]`
|
|
122
|
+
overall verdict); `cover` adds `coverage[]` — one `{ reqId, covered,
|
|
123
|
+
scenarioCount }` row per requirement — plus a `requirements` roll-up;
|
|
106
124
|
`archive` adds `change`. `schemaVersion` is bumped on any breaking change to
|
|
107
125
|
the shape. The TypeScript type is exported as `JsonReport`.
|
|
108
126
|
|
package/dist/cli/index.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
// where the report is an `internal-error` envelope instead of a bare stack.
|
|
10
10
|
import { Command } from 'commander';
|
|
11
11
|
import chalk from 'chalk';
|
|
12
|
+
import { resolve } from 'node:path';
|
|
12
13
|
import { runCheck, runVerify, runCover, runArchive } from '../core/pipeline.js';
|
|
13
14
|
import { formatIssues, summarize, formatCoverage } from './report.js';
|
|
14
15
|
import { archiveReport, checkReport, coverReport, errorReport, renderJson, verifyReport, } from './json.js';
|
|
@@ -24,6 +25,12 @@ function root(dir) {
|
|
|
24
25
|
}
|
|
25
26
|
const JSON_FLAG = '--json';
|
|
26
27
|
const JSON_HELP = 'emit one machine-readable JSON report on stdout';
|
|
28
|
+
const VITEST_CONFIG_FLAG = '--vitest-config <path>';
|
|
29
|
+
const VITEST_CONFIG_HELP = 'load this Vitest config in the child run (transforms, aliases, environment); default: isolated';
|
|
30
|
+
/** Resolve a user-supplied config path against cwd, so Vitest gets an absolute one. */
|
|
31
|
+
function vitestConfig(opts) {
|
|
32
|
+
return opts.vitestConfig ? resolve(process.cwd(), opts.vitestConfig) : undefined;
|
|
33
|
+
}
|
|
27
34
|
/**
|
|
28
35
|
* Run one command's work with a single output + exit-code contract:
|
|
29
36
|
* - success: print the JSON report (`--json`) or the human rendering, and set
|
|
@@ -70,8 +77,9 @@ program
|
|
|
70
77
|
.description('Run tests + coverage + drift, emit a graded report.')
|
|
71
78
|
.argument('[dir]', 'project root', undefined)
|
|
72
79
|
.option(JSON_FLAG, JSON_HELP)
|
|
80
|
+
.option(VITEST_CONFIG_FLAG, VITEST_CONFIG_HELP)
|
|
73
81
|
.action((dir, opts) => runAction('verify', opts, async () => {
|
|
74
|
-
const { issues, passed, ok } = await runVerify(root(dir));
|
|
82
|
+
const { issues, passed, ok } = await runVerify(root(dir), { vitestConfig: vitestConfig(opts) });
|
|
75
83
|
return {
|
|
76
84
|
report: verifyReport(VERSION, issues, passed, ok),
|
|
77
85
|
human: () => {
|
|
@@ -101,9 +109,10 @@ program
|
|
|
101
109
|
.argument('<change>', 'change name to archive')
|
|
102
110
|
.argument('[dir]', 'project root', undefined)
|
|
103
111
|
.option(JSON_FLAG, JSON_HELP)
|
|
112
|
+
.option(VITEST_CONFIG_FLAG, VITEST_CONFIG_HELP)
|
|
104
113
|
.description('Run the archive gate; merge only if it passes.')
|
|
105
114
|
.action((change, dir, opts) => runAction('archive', opts, async () => {
|
|
106
|
-
const blocking = await runArchive(root(dir), change);
|
|
115
|
+
const blocking = await runArchive(root(dir), change, { vitestConfig: vitestConfig(opts) });
|
|
107
116
|
return {
|
|
108
117
|
report: archiveReport(VERSION, change, blocking),
|
|
109
118
|
human: () => {
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,+EAA+E;AAC/E,sCAAsC;AACtC,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,+EAA+E;AAC/E,2EAA2E;AAC3E,4EAA4E;AAE5E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EACL,aAAa,EACb,WAAW,EACX,WAAW,EACX,WAAW,EACX,UAAU,EACV,YAAY,GAGb,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;AAEjC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,iEAAiE,CAAC;KAC9E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,SAAS,IAAI,CAAC,GAAY;IACxB,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;AACnC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
package/dist/core/pipeline.d.ts
CHANGED
|
@@ -6,8 +6,13 @@ export interface VerifyResult {
|
|
|
6
6
|
passed: boolean;
|
|
7
7
|
ok: boolean;
|
|
8
8
|
}
|
|
9
|
+
/** Options common to the commands that start a child Vitest run. */
|
|
10
|
+
export interface RunOptions {
|
|
11
|
+
/** Absolute path to a Vitest config to load (see {@link runAndCollect}). */
|
|
12
|
+
vitestConfig?: string;
|
|
13
|
+
}
|
|
9
14
|
/** Executable verification (design §9: `attest verify`). */
|
|
10
|
-
export declare function runVerify(root: string): Promise<VerifyResult>;
|
|
15
|
+
export declare function runVerify(root: string, options?: RunOptions): Promise<VerifyResult>;
|
|
11
16
|
export interface CoverageRow {
|
|
12
17
|
reqId: string;
|
|
13
18
|
covered: boolean;
|
|
@@ -16,7 +21,7 @@ export interface CoverageRow {
|
|
|
16
21
|
/** Coverage-only report (design §9: `attest cover`). */
|
|
17
22
|
export declare function runCover(root: string): Promise<CoverageRow[]>;
|
|
18
23
|
/** Archive gate for a change (design §8, §9: `attest archive <change>`). */
|
|
19
|
-
export declare function runArchive(root: string, changeName: string): Promise<Issue[]>;
|
|
24
|
+
export declare function runArchive(root: string, changeName: string, options?: RunOptions): Promise<Issue[]>;
|
|
20
25
|
/** True when a spec suite exists at all (used by the CLI to warn on empty roots). */
|
|
21
26
|
export declare function hasSpecs(root: string): Promise<boolean>;
|
|
22
27
|
//# sourceMappingURL=pipeline.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAc,KAAK,EAAY,MAAM,YAAY,CAAC;AAE9D,2DAA2D;AAC3D,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAa7D;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,4DAA4D;AAC5D,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAc,KAAK,EAAY,MAAM,YAAY,CAAC;AAE9D,2DAA2D;AAC3D,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAa7D;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,oEAAoE;AACpE,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,4DAA4D;AAC5D,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAmC7F;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wDAAwD;AACxD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAmBnE;AAED,4EAA4E;AAC5E,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,KAAK,EAAE,CAAC,CA8ClB;AAED,qFAAqF;AACrF,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE7D"}
|
package/dist/core/pipeline.js
CHANGED
|
@@ -26,7 +26,7 @@ export async function runCheck(root) {
|
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
/** Executable verification (design §9: `attest verify`). */
|
|
29
|
-
export async function runVerify(root) {
|
|
29
|
+
export async function runVerify(root, options = {}) {
|
|
30
30
|
const loader = await createLoader();
|
|
31
31
|
let registry;
|
|
32
32
|
let plan;
|
|
@@ -42,7 +42,7 @@ export async function runVerify(root) {
|
|
|
42
42
|
}
|
|
43
43
|
issues.push(...validateStructure(registry, plan));
|
|
44
44
|
issues.push(...detectPotentialDrift(registry, plan, plan.paramRefs));
|
|
45
|
-
const run = await runAndCollect({ root, quiet: true });
|
|
45
|
+
const run = await runAndCollect({ root, quiet: true, vitestConfig: options.vitestConfig });
|
|
46
46
|
if (!run.passed) {
|
|
47
47
|
issues.push({ level: 'ERROR', code: 'tests-red', message: 'Some tests are failing.' });
|
|
48
48
|
}
|
|
@@ -83,7 +83,7 @@ export async function runCover(root) {
|
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
/** Archive gate for a change (design §8, §9: `attest archive <change>`). */
|
|
86
|
-
export async function runArchive(root, changeName) {
|
|
86
|
+
export async function runArchive(root, changeName, options = {}) {
|
|
87
87
|
const loader = await createLoader();
|
|
88
88
|
try {
|
|
89
89
|
const { registry: base, issues } = await loadRegistry(root, loader);
|
|
@@ -122,7 +122,7 @@ export async function runArchive(root, changeName) {
|
|
|
122
122
|
'**/archive/**',
|
|
123
123
|
...others.map((n) => `**/changes/${n}/**`),
|
|
124
124
|
];
|
|
125
|
-
const run = await runAndCollect({ root, quiet: true, exclude });
|
|
125
|
+
const run = await runAndCollect({ root, quiet: true, exclude, vitestConfig: options.vitestConfig });
|
|
126
126
|
return evaluateGate({ registry: applied.registry, plan, run });
|
|
127
127
|
}
|
|
128
128
|
finally {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,iFAAiF;AAEjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,SAAS,GACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,2DAA2D;AAC3D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO;YACL,GAAG,MAAM;YACT,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC;YACpC,GAAG,oBAAoB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;SACxD,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,iFAAiF;AAEjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,SAAS,GACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,2DAA2D;AAC3D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO;YACL,GAAG,MAAM;YACT,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC;YACpC,GAAG,oBAAoB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;SACxD,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAcD,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,UAAsB,EAAE;IACpE,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;IACpC,IAAI,QAAkB,CAAC;IACvB,IAAI,IAAgB,CAAC;IACrB,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAChD,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAClD,MAAM,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAErE,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC3F,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,OAAO;gBACd,IAAI,EAAE,kBAAkB;gBACxB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,aAAa,CAAC,CAAC,IAAI,oCAAoC,CAAC,CAAC,KAAK,2DAA2D;aACnI,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;AAC7E,CAAC;AAQD,wDAAwD;AACxD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;aACzB,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACf,KAAK;YACL,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;YACrC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;SACtC,CAAC,CAAC,CAAC;IACR,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,UAAkB,EAClB,UAAsB,EAAE;IAExB,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpE,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC;YAAE,OAAO,MAAM,CAAC;QAE3D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,uBAAuB,CAAC,CAAC;QAC7E,IAAI,KAAoB,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAA6B,SAAS,CAAC,CAAC;YACrE,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL;oBACE,KAAK,EAAE,OAAO;oBACd,IAAI,EAAE,kBAAkB;oBACxB,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;oBAC/B,OAAO,EAAE,gDAAgD,UAAU,MAAM,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;iBAC5H;aACF,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACxC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC;QAErD,qEAAqE;QACrE,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAe;YACvB,SAAS,EAAE,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,GAAG,UAAU,CAAC,SAAS,CAAC;YAC3D,SAAS,EAAE,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,GAAG,UAAU,CAAC,SAAS,CAAC;SAC5D,CAAC;QAEF,6EAA6E;QAC7E,MAAM,MAAM,GAAG,CAAC,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAG;YACd,GAAG,cAAc,CAAC,OAAO;YACzB,eAAe;YACf,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC;SAC3C,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QAEpG,OAAO,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACjE,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,OAAO,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3E,CAAC"}
|
package/dist/core/runner.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { startVitest } from 'vitest/node';
|
|
1
2
|
import type { RunResult } from './types.js';
|
|
2
3
|
export interface RunAndCollectOptions {
|
|
3
4
|
/** Project root to run. Defaults to the current working directory. */
|
|
@@ -10,6 +11,25 @@ export interface RunAndCollectOptions {
|
|
|
10
11
|
include?: string[];
|
|
11
12
|
/** Spec exclude globs (default: node_modules/dist + changes/archive). */
|
|
12
13
|
exclude?: string[];
|
|
14
|
+
/**
|
|
15
|
+
* Absolute path to a Vitest config the child run should load (transforms,
|
|
16
|
+
* `resolve.alias`, `test.environment`, plugins). Framework code — `.vue`,
|
|
17
|
+
* DOM, path aliases — cannot be specified without one. Omitted by default so
|
|
18
|
+
* the run stays isolated and deterministic.
|
|
19
|
+
*/
|
|
20
|
+
vitestConfig?: string;
|
|
13
21
|
}
|
|
22
|
+
/** The option object handed to `startVitest`. Kept separate so its shaping — in
|
|
23
|
+
* particular the config-vs-isolation precedence — is testable without a run. */
|
|
24
|
+
type VitestOptions = NonNullable<Parameters<typeof startVitest>[2]>;
|
|
25
|
+
/**
|
|
26
|
+
* Build the child-run options. Attest owns the run *scope* — include/exclude/
|
|
27
|
+
* root/watch always come from here, so the caller can neither widen the spec
|
|
28
|
+
* set nor un-exclude changes/archive via their config. A supplied `vitestConfig`
|
|
29
|
+
* only brings the *environment* (transforms, aliases, plugins); with none, the
|
|
30
|
+
* run isolates from any ambient config (`config: false`), which is the default.
|
|
31
|
+
*/
|
|
32
|
+
export declare function buildVitestOptions(options: RunAndCollectOptions): VitestOptions;
|
|
14
33
|
export declare function runAndCollect(options?: RunAndCollectOptions): Promise<RunResult>;
|
|
34
|
+
export {};
|
|
15
35
|
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAQ5C,MAAM,WAAW,oBAAoB;IACnC,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,kFAAkF;IAClF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;gFACgF;AAChF,KAAK,aAAa,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEpE;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAS/E;AAED,wBAAsB,aAAa,CACjC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,SAAS,CAAC,CAkCpB"}
|
package/dist/core/runner.js
CHANGED
|
@@ -8,16 +8,25 @@ import { configDefaults } from 'vitest/config';
|
|
|
8
8
|
const REQ_SUITE = /^\[(.+)\]$/;
|
|
9
9
|
/** Proposed / archived changes are excluded from a normal run (design §7, §8). */
|
|
10
10
|
const DEFAULT_EXCLUDE = [...configDefaults.exclude, '**/changes/**', '**/archive/**'];
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Build the child-run options. Attest owns the run *scope* — include/exclude/
|
|
13
|
+
* root/watch always come from here, so the caller can neither widen the spec
|
|
14
|
+
* set nor un-exclude changes/archive via their config. A supplied `vitestConfig`
|
|
15
|
+
* only brings the *environment* (transforms, aliases, plugins); with none, the
|
|
16
|
+
* run isolates from any ambient config (`config: false`), which is the default.
|
|
17
|
+
*/
|
|
18
|
+
export function buildVitestOptions(options) {
|
|
19
|
+
return {
|
|
13
20
|
watch: false,
|
|
14
21
|
root: options.root,
|
|
15
22
|
include: options.include ?? ['**/*.spec.ts'],
|
|
16
23
|
exclude: options.exclude ?? DEFAULT_EXCLUDE,
|
|
17
|
-
|
|
18
|
-
config: false,
|
|
24
|
+
config: options.vitestConfig ?? false,
|
|
19
25
|
...(options.quiet ? { silent: true, reporters: [{}] } : {}),
|
|
20
|
-
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export async function runAndCollect(options = {}) {
|
|
29
|
+
const vitest = await startVitest('test', options.filters ?? [], buildVitestOptions(options));
|
|
21
30
|
if (!vitest) {
|
|
22
31
|
throw new Error('runAndCollect: failed to start Vitest.');
|
|
23
32
|
}
|
package/dist/core/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,8EAA8E;AAC9E,4EAA4E;AAC5E,qEAAqE;AAErE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,mFAAmF;AACnF,MAAM,SAAS,GAAG,YAAY,CAAC;AAE/B,kFAAkF;AAClF,MAAM,eAAe,GAAG,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/core/schema.d.ts
CHANGED
|
@@ -3,34 +3,34 @@ import { z } from 'zod';
|
|
|
3
3
|
export declare const RequirementSchema: z.ZodObject<{
|
|
4
4
|
statement: z.ZodEffects<z.ZodString, string, string>;
|
|
5
5
|
rationale: z.ZodString;
|
|
6
|
-
params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodNumber, z.ZodString, z.ZodBoolean]>>>;
|
|
6
|
+
params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodUnion<[z.ZodNumber, z.ZodString, z.ZodBoolean]>, z.ZodArray<z.ZodUnion<[z.ZodNumber, z.ZodString, z.ZodBoolean]>, "many">]>>>;
|
|
7
7
|
outOfScope: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
8
8
|
}, "strip", z.ZodTypeAny, {
|
|
9
|
-
params: Record<string, string | number | boolean>;
|
|
9
|
+
params: Record<string, string | number | boolean | (string | number | boolean)[]>;
|
|
10
10
|
statement: string;
|
|
11
11
|
rationale: string;
|
|
12
12
|
outOfScope: string[];
|
|
13
13
|
}, {
|
|
14
14
|
statement: string;
|
|
15
15
|
rationale: string;
|
|
16
|
-
params?: Record<string, string | number | boolean> | undefined;
|
|
16
|
+
params?: Record<string, string | number | boolean | (string | number | boolean)[]> | undefined;
|
|
17
17
|
outOfScope?: string[] | undefined;
|
|
18
18
|
}>;
|
|
19
19
|
/** The requirement registry: stable ID -> requirement (design §2, §5.1). */
|
|
20
20
|
export declare const RegistrySchema: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
21
21
|
statement: z.ZodEffects<z.ZodString, string, string>;
|
|
22
22
|
rationale: z.ZodString;
|
|
23
|
-
params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodNumber, z.ZodString, z.ZodBoolean]>>>;
|
|
23
|
+
params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodUnion<[z.ZodNumber, z.ZodString, z.ZodBoolean]>, z.ZodArray<z.ZodUnion<[z.ZodNumber, z.ZodString, z.ZodBoolean]>, "many">]>>>;
|
|
24
24
|
outOfScope: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
25
25
|
}, "strip", z.ZodTypeAny, {
|
|
26
|
-
params: Record<string, string | number | boolean>;
|
|
26
|
+
params: Record<string, string | number | boolean | (string | number | boolean)[]>;
|
|
27
27
|
statement: string;
|
|
28
28
|
rationale: string;
|
|
29
29
|
outOfScope: string[];
|
|
30
30
|
}, {
|
|
31
31
|
statement: string;
|
|
32
32
|
rationale: string;
|
|
33
|
-
params?: Record<string, string | number | boolean> | undefined;
|
|
33
|
+
params?: Record<string, string | number | boolean | (string | number | boolean)[]> | undefined;
|
|
34
34
|
outOfScope?: string[] | undefined;
|
|
35
35
|
}>>;
|
|
36
36
|
/** Parsed (output) shapes — defaults applied. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,iDAAiD;AACjD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,iDAAiD;AACjD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;EAkB5B,CAAC;AAEH,4EAA4E;AAC5E,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;GAG1B,CAAC;AAEF,iDAAiD;AACjD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,+DAA+D;AAC/D,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AACjE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC"}
|
package/dist/core/schema.js
CHANGED
|
@@ -10,8 +10,15 @@ export const RequirementSchema = z.object({
|
|
|
10
10
|
message: 'statement must contain the RFC-2119 keyword SHALL or MUST',
|
|
11
11
|
}),
|
|
12
12
|
rationale: z.string().min(10, 'rationale must not be empty (the intent layer has to say why)'),
|
|
13
|
+
// A param is a scalar or a homogeneous-enough list of scalars. Lists (vendor
|
|
14
|
+
// blacklists, id sets) are the most drift-prone constants, so keeping them out
|
|
15
|
+
// of params left the highest-risk values unguarded; an array still has exactly
|
|
16
|
+
// one owner (the spec) read by exactly one place (the scenario).
|
|
13
17
|
params: z
|
|
14
|
-
.record(z.string(),
|
|
18
|
+
.record(z.string(), (() => {
|
|
19
|
+
const scalar = z.union([z.number(), z.string(), z.boolean()]);
|
|
20
|
+
return z.union([scalar, z.array(scalar)]);
|
|
21
|
+
})())
|
|
15
22
|
.default({}),
|
|
16
23
|
outOfScope: z.array(z.string()).default([]),
|
|
17
24
|
});
|
package/dist/core/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,4EAA4E;AAC5E,gEAAgE;AAEhE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,iDAAiD;AACjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;QACzC,OAAO,EAAE,2DAA2D;KACrE,CAAC;IACJ,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,+DAA+D,CAAC;IAC9F,MAAM,EAAE,CAAC;SACN,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,4EAA4E;AAC5E,gEAAgE;AAEhE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,iDAAiD;AACjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;QACzC,OAAO,EAAE,2DAA2D;KACrE,CAAC;IACJ,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,+DAA+D,CAAC;IAC9F,6EAA6E;IAC7E,+EAA+E;IAC/E,+EAA+E;IAC/E,iEAAiE;IACjE,MAAM,EAAE,CAAC;SACN,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,EAAE;QACxB,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,EAAE,CAAC;SACJ,OAAO,CAAC,EAAE,CAAC;IACd,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAC5C,CAAC,CAAC;AAEH,4EAA4E;AAC5E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CACpC,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,0BAA0B,CAAC,EAC5D,iBAAiB,CAClB,CAAC"}
|
package/dist/core/validator.d.ts
CHANGED
|
@@ -7,9 +7,12 @@ import type { AttestPlan, Issue, ParamRef, Registry } from './types.js';
|
|
|
7
7
|
*/
|
|
8
8
|
export declare function validateStructure(registry: Registry, plan: AttestPlan): Issue[];
|
|
9
9
|
/**
|
|
10
|
-
* Weak anti-drift heuristic (design §6, mechanism 3).
|
|
11
|
-
* scenario
|
|
12
|
-
*
|
|
10
|
+
* Weak anti-drift heuristic (design §6, mechanism 3). Evaluated per requirement,
|
|
11
|
+
* not per scenario: a requirement that owns params is quiet as soon as *any* one
|
|
12
|
+
* of its covering scenarios reads them. Flagging each individual scenario that
|
|
13
|
+
* happens not to read params punishes correct multi-facet requirements with
|
|
14
|
+
* noise that can never be cleared — and noise that can never be cleared stops
|
|
15
|
+
* being read, the exact failure this heuristic exists to prevent.
|
|
13
16
|
*/
|
|
14
17
|
export declare function detectPotentialDrift(registry: Registry, plan: AttestPlan, refs: ParamRef[]): Issue[];
|
|
15
18
|
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAExE;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,GAAG,KAAK,EAAE,CA+C/E;AAED
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAExE;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,GAAG,KAAK,EAAE,CA+C/E;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,QAAQ,EAAE,GACf,KAAK,EAAE,CAuBT"}
|
package/dist/core/validator.js
CHANGED
|
@@ -51,27 +51,34 @@ export function validateStructure(registry, plan) {
|
|
|
51
51
|
return issues;
|
|
52
52
|
}
|
|
53
53
|
/**
|
|
54
|
-
* Weak anti-drift heuristic (design §6, mechanism 3).
|
|
55
|
-
* scenario
|
|
56
|
-
*
|
|
54
|
+
* Weak anti-drift heuristic (design §6, mechanism 3). Evaluated per requirement,
|
|
55
|
+
* not per scenario: a requirement that owns params is quiet as soon as *any* one
|
|
56
|
+
* of its covering scenarios reads them. Flagging each individual scenario that
|
|
57
|
+
* happens not to read params punishes correct multi-facet requirements with
|
|
58
|
+
* noise that can never be cleared — and noise that can never be cleared stops
|
|
59
|
+
* being read, the exact failure this heuristic exists to prevent.
|
|
57
60
|
*/
|
|
58
61
|
export function detectPotentialDrift(registry, plan, refs) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
:
|
|
75
|
-
|
|
62
|
+
const readsParams = new Set(refs.map((r) => r.reqId));
|
|
63
|
+
const issues = [];
|
|
64
|
+
for (const [id, req] of Object.entries(registry)) {
|
|
65
|
+
if (Object.keys(req.params).length === 0)
|
|
66
|
+
continue;
|
|
67
|
+
const covering = plan.scenarios.filter((s) => s.reqId === id);
|
|
68
|
+
if (covering.length === 0 || readsParams.has(id))
|
|
69
|
+
continue;
|
|
70
|
+
// Anchor the hint at the first covering scenario so it stays clickable,
|
|
71
|
+
// even though the verdict is now about the requirement as a whole.
|
|
72
|
+
const at = covering[0];
|
|
73
|
+
issues.push({
|
|
74
|
+
level: 'INFO',
|
|
75
|
+
code: 'possible-drift',
|
|
76
|
+
reqId: id,
|
|
77
|
+
file: at.file,
|
|
78
|
+
line: at.line,
|
|
79
|
+
message: `${id} owns params, but none of its scenarios read them — a hardcoded literal could be drifting here.`,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return issues;
|
|
76
83
|
}
|
|
77
84
|
//# sourceMappingURL=validator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,8EAA8E;AAI9E;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAkB,EAAE,IAAgB;IACpE,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAE/D,yDAAyD;IACzD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,OAAO;gBACd,IAAI,EAAE,aAAa;gBACnB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,aAAa,CAAC,CAAC,IAAI,kCAAkC,CAAC,CAAC,KAAK,2CAA2C;aACjH,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,OAAO;gBACd,IAAI,EAAE,uBAAuB;gBAC7B,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,gBAAgB,EAAE,sEAAsE;aAClG,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;YACnB,IAAI,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,OAAO;oBACd,IAAI,EAAE,eAAe;oBACrB,KAAK,EAAE,EAAE;oBACT,OAAO,EAAE,gBAAgB,EAAE,WAAW,IAAI,oDAAoD;iBAC/F,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@am_shork/attest",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "TDD-native spec framework: tests are the source of truth for verification, ID-bound requirements the source of truth for intent.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -50,8 +50,8 @@
|
|
|
50
50
|
"zod": "^3.23.0"
|
|
51
51
|
},
|
|
52
52
|
"peerDependencies": {
|
|
53
|
-
"vite": "^5.0.0 || ^6.0.0",
|
|
54
|
-
"vitest": "^2.0.0 || ^3.0.0"
|
|
53
|
+
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0",
|
|
54
|
+
"vitest": "^2.0.0 || ^3.0.0 || ^4.0.0"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
57
|
"@eslint/js": "^9.9.0",
|