@am_shork/attest 0.2.2 → 0.4.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/CHANGELOG.md +876 -62
- package/README.md +157 -19
- package/dist/cli/index.js +91 -21
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/json.d.ts +52 -5
- package/dist/cli/json.d.ts.map +1 -1
- package/dist/cli/json.js +50 -2
- package/dist/cli/json.js.map +1 -1
- package/dist/cli/report.d.ts +11 -1
- package/dist/cli/report.d.ts.map +1 -1
- package/dist/cli/report.js +114 -3
- package/dist/cli/report.js.map +1 -1
- package/dist/core/apply.d.ts +8 -0
- package/dist/core/apply.d.ts.map +1 -1
- package/dist/core/apply.js +10 -0
- package/dist/core/apply.js.map +1 -1
- package/dist/core/gate.d.ts +27 -1
- package/dist/core/gate.d.ts.map +1 -1
- package/dist/core/gate.js +48 -1
- package/dist/core/gate.js.map +1 -1
- package/dist/core/loader.d.ts +8 -0
- package/dist/core/loader.d.ts.map +1 -1
- package/dist/core/loader.js +19 -1
- package/dist/core/loader.js.map +1 -1
- package/dist/core/locate.d.ts +22 -1
- package/dist/core/locate.d.ts.map +1 -1
- package/dist/core/locate.js +76 -7
- package/dist/core/locate.js.map +1 -1
- package/dist/core/paths.d.ts +15 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +36 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/pipeline.d.ts +75 -5
- package/dist/core/pipeline.d.ts.map +1 -1
- package/dist/core/pipeline.js +212 -35
- package/dist/core/pipeline.js.map +1 -1
- package/dist/core/red-record.d.ts +56 -0
- package/dist/core/red-record.d.ts.map +1 -0
- package/dist/core/red-record.js +177 -0
- package/dist/core/red-record.js.map +1 -0
- package/dist/core/render.d.ts +1 -1
- package/dist/core/render.d.ts.map +1 -1
- package/dist/core/render.js +16 -2
- package/dist/core/render.js.map +1 -1
- package/dist/core/runner.d.ts +1 -1
- package/dist/core/runner.d.ts.map +1 -1
- package/dist/core/runner.js +36 -11
- package/dist/core/runner.js.map +1 -1
- package/dist/core/skill.d.ts +23 -0
- package/dist/core/skill.d.ts.map +1 -0
- package/dist/core/skill.js +276 -0
- package/dist/core/skill.js.map +1 -0
- package/dist/core/static-registry.d.ts +28 -0
- package/dist/core/static-registry.d.ts.map +1 -1
- package/dist/core/static-registry.js +91 -25
- package/dist/core/static-registry.js.map +1 -1
- package/dist/core/status.d.ts +39 -0
- package/dist/core/status.d.ts.map +1 -0
- package/dist/core/status.js +64 -0
- package/dist/core/status.js.map +1 -0
- package/dist/core/targets.d.ts +52 -0
- package/dist/core/targets.d.ts.map +1 -0
- package/dist/core/targets.js +141 -0
- package/dist/core/targets.js.map +1 -0
- package/dist/core/types.d.ts +13 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/validator.d.ts +11 -0
- package/dist/core/validator.d.ts.map +1 -1
- package/dist/core/validator.js +28 -12
- package/dist/core/validator.js.map +1 -1
- package/dist/core/write.d.ts +2 -0
- package/dist/core/write.d.ts.map +1 -0
- package/dist/core/write.js +21 -0
- package/dist/core/write.js.map +1 -0
- package/dist/runtime.d.ts +9 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +10 -2
- package/dist/runtime.js.map +1 -1
- package/package.json +5 -5
package/dist/core/locate.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
// Locate layer (design §4, L1): find registry + spec files, load the registry
|
|
2
2
|
// via the TS loader, and parse all spec files into one merged AttestPlan.
|
|
3
3
|
import { readdir, readFile } from 'node:fs/promises';
|
|
4
|
-
import { basename, join
|
|
4
|
+
import { basename, join } from 'node:path';
|
|
5
|
+
import { relativePath } from './paths.js';
|
|
5
6
|
import { parseSpecFile } from './parser.js';
|
|
6
7
|
import { readRegistrySource } from './static-registry.js';
|
|
8
|
+
import { RegistryValidationError } from './registry.js';
|
|
9
|
+
import { RegistrySchema } from './schema.js';
|
|
7
10
|
import { byCodeUnit } from './order.js';
|
|
8
11
|
// Proposed changes and archived changes are excluded from normal scanning:
|
|
9
12
|
// a change's requirements/specs only count once its gate passes and it is
|
|
@@ -70,6 +73,22 @@ export async function scanProject(root) {
|
|
|
70
73
|
* This is what `verify` and `archive` use: they run the whole suite anyway, so
|
|
71
74
|
* declining to evaluate one more module buys them nothing. Everywhere else it
|
|
72
75
|
* is the opt-in behaviour behind `--eval`.
|
|
76
|
+
*
|
|
77
|
+
* The exported value is **validated**, not asserted. A module's default export
|
|
78
|
+
* is an `unknown` from the loader's point of view, and calling it a `Registry`
|
|
79
|
+
* because it is an object was a type assertion standing in for a check: a file
|
|
80
|
+
* that exports a plain literal instead of calling `defineRequirements` reached
|
|
81
|
+
* the validator, where `req.statement.matchAll` threw — so `--eval` answered
|
|
82
|
+
* `internal-error` with a raw TypeError for a file the static reader diagnoses
|
|
83
|
+
* with a code and a fix hint, and the static reader's own hint ("pass --eval")
|
|
84
|
+
* pointed straight at that crash. Two readers of one file must not disagree
|
|
85
|
+
* about what is wrong with it (the call `archive` already makes for the delta).
|
|
86
|
+
*
|
|
87
|
+
* Re-parsing costs nothing on the normal path: `defineRequirements` returns
|
|
88
|
+
* what this same schema already produced, so a registry authored the ordinary
|
|
89
|
+
* way parses to itself. What `--eval` buys remains untouched — it is about a
|
|
90
|
+
* registry being *computed* rather than written out, never about it being
|
|
91
|
+
* shaped differently.
|
|
73
92
|
*/
|
|
74
93
|
export function evalReader(loader) {
|
|
75
94
|
return {
|
|
@@ -87,8 +106,8 @@ export function evalReader(loader) {
|
|
|
87
106
|
},
|
|
88
107
|
};
|
|
89
108
|
}
|
|
90
|
-
const
|
|
91
|
-
if (!
|
|
109
|
+
const exported = isRecord(mod) ? mod['default'] : undefined;
|
|
110
|
+
if (!exported || typeof exported !== 'object') {
|
|
92
111
|
return {
|
|
93
112
|
issue: {
|
|
94
113
|
level: 'ERROR',
|
|
@@ -97,10 +116,27 @@ export function evalReader(loader) {
|
|
|
97
116
|
},
|
|
98
117
|
};
|
|
99
118
|
}
|
|
100
|
-
|
|
119
|
+
const parsed = RegistrySchema.safeParse(exported);
|
|
120
|
+
if (!parsed.success) {
|
|
121
|
+
// The same code, the same prefix and the same rendering of the field
|
|
122
|
+
// errors as `readRegistrySource` — going through RegistryValidationError
|
|
123
|
+
// keeps the message identical rather than merely similar.
|
|
124
|
+
return {
|
|
125
|
+
issue: {
|
|
126
|
+
level: 'ERROR',
|
|
127
|
+
code: 'registry-invalid',
|
|
128
|
+
message: `Failed to load registry: ${new RegistryValidationError(parsed.error.issues).message}`,
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
return { registry: parsed.data };
|
|
101
133
|
},
|
|
102
134
|
};
|
|
103
135
|
}
|
|
136
|
+
/** A loaded module namespace, before anything is claimed about its exports. */
|
|
137
|
+
function isRecord(value) {
|
|
138
|
+
return typeof value === 'object' && value !== null;
|
|
139
|
+
}
|
|
104
140
|
/**
|
|
105
141
|
* Read registries from the AST, without running a line of the project.
|
|
106
142
|
*
|
|
@@ -128,7 +164,8 @@ export function staticReader() {
|
|
|
128
164
|
/**
|
|
129
165
|
* Read and merge every `*.reqs.ts` registry under root, with the given reader.
|
|
130
166
|
* A registry the reader rejects becomes its own ERROR; a duplicate id across
|
|
131
|
-
* files becomes a duplicate-requirement ERROR
|
|
167
|
+
* files becomes a duplicate-requirement ERROR, and two files claiming one id
|
|
168
|
+
* prefix a duplicate-prefix ERROR.
|
|
132
169
|
*
|
|
133
170
|
* Pass `files` to reuse a {@link scanProject} result instead of re-walking.
|
|
134
171
|
*/
|
|
@@ -139,14 +176,42 @@ export async function loadRegistry(root, reader, files) {
|
|
|
139
176
|
const loaded = await Promise.all(paths.map(async (file) => ({ file, outcome: await reader.read(file) })));
|
|
140
177
|
const registry = {};
|
|
141
178
|
const issues = [];
|
|
179
|
+
// Which file first claimed each id prefix. The prefix is the only unit above
|
|
180
|
+
// the requirement (design §11) and nothing allocates it, so two files
|
|
181
|
+
// claiming one is the collision no command would otherwise report — the ids
|
|
182
|
+
// themselves can stay distinct forever while the space they share has two
|
|
183
|
+
// owners. First seen in sorted file order, so which file is called the owner
|
|
184
|
+
// does not depend on I/O timing.
|
|
185
|
+
const prefixOwner = new Map();
|
|
142
186
|
for (const entry of loaded) {
|
|
143
|
-
const display =
|
|
187
|
+
const display = relativePath(root, entry.file);
|
|
144
188
|
const { outcome } = entry;
|
|
145
189
|
if ('issue' in outcome) {
|
|
146
190
|
issues.push({ ...outcome.issue, file: display });
|
|
147
191
|
continue;
|
|
148
192
|
}
|
|
193
|
+
// One issue per colliding prefix rather than per requirement: the fact is
|
|
194
|
+
// about the pair of files, and a registry holding forty ids under a taken
|
|
195
|
+
// prefix would otherwise report the same sentence forty times.
|
|
196
|
+
const reported = new Set();
|
|
149
197
|
for (const [id, req] of Object.entries(outcome.registry)) {
|
|
198
|
+
const dash = id.indexOf('-');
|
|
199
|
+
const prefix = dash === -1 ? id : id.slice(0, dash);
|
|
200
|
+
const owner = prefixOwner.get(prefix);
|
|
201
|
+
if (owner === undefined) {
|
|
202
|
+
prefixOwner.set(prefix, display);
|
|
203
|
+
}
|
|
204
|
+
else if (owner !== display && !reported.has(prefix)) {
|
|
205
|
+
reported.add(prefix);
|
|
206
|
+
// No `reqId`: this is about two files, not about any one of the
|
|
207
|
+
// requirements that happen to reveal it.
|
|
208
|
+
issues.push({
|
|
209
|
+
level: 'ERROR',
|
|
210
|
+
code: 'duplicate-prefix',
|
|
211
|
+
file: display,
|
|
212
|
+
message: `Id prefix "${prefix}-" is already declared by "${owner}". Give each registry file a prefix of its own.`,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
150
215
|
if (Object.hasOwn(registry, id)) {
|
|
151
216
|
issues.push({
|
|
152
217
|
level: 'ERROR',
|
|
@@ -167,12 +232,16 @@ export async function loadRegistry(root, reader, files) {
|
|
|
167
232
|
* Parse the given spec files into one merged plan (paths shown relative to
|
|
168
233
|
* `displayRoot`). Files are read concurrently; the merge follows the input
|
|
169
234
|
* order, so the plan never depends on I/O timing.
|
|
235
|
+
*
|
|
236
|
+
* The paths are POSIX on every platform (see `paths.ts`): they are not only
|
|
237
|
+
* displayed, they become the child run's `include` globs, where a Windows
|
|
238
|
+
* separator would silently match nothing.
|
|
170
239
|
*/
|
|
171
240
|
export async function parseSpecs(files, displayRoot) {
|
|
172
241
|
const sources = await Promise.all(files.map((file) => readFile(file, 'utf8')));
|
|
173
242
|
const plan = { scenarios: [], paramRefs: [] };
|
|
174
243
|
for (const [i, file] of files.entries()) {
|
|
175
|
-
const parsed = parseSpecFile(
|
|
244
|
+
const parsed = parseSpecFile(relativePath(displayRoot, file), sources[i]);
|
|
176
245
|
plan.scenarios.push(...parsed.scenarios);
|
|
177
246
|
plan.paramRefs.push(...parsed.paramRefs);
|
|
178
247
|
}
|
package/dist/core/locate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locate.js","sourceRoot":"","sources":["../../src/core/locate.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,0EAA0E;AAE1E,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"locate.js","sourceRoot":"","sources":["../../src/core/locate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A native path as a POSIX one.
|
|
3
|
+
*
|
|
4
|
+
* `separator` is a parameter rather than a constant so the conversion is
|
|
5
|
+
* testable on any host — the bug it fixes only reproduces on Windows, and a
|
|
6
|
+
* regression test that can only fail on one platform is not a regression test.
|
|
7
|
+
*
|
|
8
|
+
* Conditional on the separator, never unconditional: on POSIX a backslash is a
|
|
9
|
+
* legal character in a filename, so rewriting it there would corrupt the path
|
|
10
|
+
* of a file genuinely called `a\b.spec.ts`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function toPosixPath(path: string, separator?: string): string;
|
|
13
|
+
/** `path.relative`, in the one spelling the rest of the engine expects. */
|
|
14
|
+
export declare function relativePath(from: string, to: string): string;
|
|
15
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAmBA;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM,CAEzE;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAE7D"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// One canonical spelling for every path derived from the project root.
|
|
2
|
+
//
|
|
3
|
+
// A relative path is not just something a report displays — `verify` and
|
|
4
|
+
// `archive` build the child run's `include` globs out of the plan's file paths
|
|
5
|
+
// (design §5.4). On Windows `path.relative` yields `deep\er\x.spec.ts`, and a
|
|
6
|
+
// backslash is an *escape character* in glob syntax, so that pattern matches
|
|
7
|
+
// nothing: the file is silently dropped from the run. The declared scenarios
|
|
8
|
+
// then surface as `declared-not-run`, which is at least loud, but the practical
|
|
9
|
+
// effect was that no spec file outside the project root ever executed on
|
|
10
|
+
// Windows — which is most real layouts. Every fixture in this repo happened to
|
|
11
|
+
// keep its specs at the root, so only the one nested change fixture ever showed
|
|
12
|
+
// it.
|
|
13
|
+
//
|
|
14
|
+
// Normalising here rather than at the glob has a second dividend: a report is
|
|
15
|
+
// then byte-identical across platforms, so a `--json` consumer diffing two CI
|
|
16
|
+
// runs is not reading the runner's operating system.
|
|
17
|
+
import { relative, sep } from 'node:path';
|
|
18
|
+
/**
|
|
19
|
+
* A native path as a POSIX one.
|
|
20
|
+
*
|
|
21
|
+
* `separator` is a parameter rather than a constant so the conversion is
|
|
22
|
+
* testable on any host — the bug it fixes only reproduces on Windows, and a
|
|
23
|
+
* regression test that can only fail on one platform is not a regression test.
|
|
24
|
+
*
|
|
25
|
+
* Conditional on the separator, never unconditional: on POSIX a backslash is a
|
|
26
|
+
* legal character in a filename, so rewriting it there would corrupt the path
|
|
27
|
+
* of a file genuinely called `a\b.spec.ts`.
|
|
28
|
+
*/
|
|
29
|
+
export function toPosixPath(path, separator = sep) {
|
|
30
|
+
return separator === '\\' ? path.replaceAll('\\', '/') : path;
|
|
31
|
+
}
|
|
32
|
+
/** `path.relative`, in the one spelling the rest of the engine expects. */
|
|
33
|
+
export function relativePath(from, to) {
|
|
34
|
+
return toPosixPath(relative(from, to));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,yEAAyE;AACzE,+EAA+E;AAC/E,8EAA8E;AAC9E,6EAA6E;AAC7E,6EAA6E;AAC7E,gFAAgF;AAChF,yEAAyE;AACzE,+EAA+E;AAC/E,gFAAgF;AAChF,MAAM;AACN,EAAE;AACF,8EAA8E;AAC9E,8EAA8E;AAC9E,qDAAqD;AAErD,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAE1C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,YAAoB,GAAG;IAC/D,OAAO,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChE,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,EAAU;IACnD,OAAO,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
package/dist/core/pipeline.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ObligationState, StatusRow } from './status.js';
|
|
1
2
|
import type { RenderTarget } from './render.js';
|
|
2
3
|
import type { Issue } from './types.js';
|
|
3
4
|
/**
|
|
@@ -10,8 +11,17 @@ import type { Issue } from './types.js';
|
|
|
10
11
|
* way back for a project whose registry is not a literal.
|
|
11
12
|
*/
|
|
12
13
|
export interface ReadOptions {
|
|
13
|
-
/**
|
|
14
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Read the registry by executing each `*.reqs.ts` (CLI: `--eval`).
|
|
16
|
+
*
|
|
17
|
+
* Explicitly `| undefined` under `exactOptionalPropertyTypes`: this is an
|
|
18
|
+
* options bag, and a caller forwarding a flag it did not receive is saying
|
|
19
|
+
* "unspecified", which is what the absent property already means. The
|
|
20
|
+
* exactness that matters is on the *data* shapes — an `Issue` or a
|
|
21
|
+
* `JsonReport` must never carry a key whose value is `undefined` — and those
|
|
22
|
+
* stay exact.
|
|
23
|
+
*/
|
|
24
|
+
evaluate?: boolean | undefined;
|
|
15
25
|
}
|
|
16
26
|
/** Static structural check (design §9: `attest check`). */
|
|
17
27
|
export declare function runCheck(root: string, options?: ReadOptions): Promise<Issue[]>;
|
|
@@ -35,7 +45,7 @@ export interface VerifyResult {
|
|
|
35
45
|
/** Options common to the commands that start a child Vitest run. */
|
|
36
46
|
export interface RunOptions {
|
|
37
47
|
/** Absolute path to a Vitest config to load (see {@link runAndCollect}). */
|
|
38
|
-
vitestConfig?: string;
|
|
48
|
+
vitestConfig?: string | undefined;
|
|
39
49
|
}
|
|
40
50
|
/** Executable verification (design §9: `attest verify`). */
|
|
41
51
|
export declare function runVerify(root: string, options?: RunOptions): Promise<VerifyResult>;
|
|
@@ -44,8 +54,28 @@ export interface CoverageRow {
|
|
|
44
54
|
covered: boolean;
|
|
45
55
|
scenarioCount: number;
|
|
46
56
|
}
|
|
47
|
-
|
|
48
|
-
|
|
57
|
+
export interface CoverResult {
|
|
58
|
+
/** One row per requirement, in id order. */
|
|
59
|
+
rows: CoverageRow[];
|
|
60
|
+
/**
|
|
61
|
+
* The same uncovered requirements as `uncovered: true` rows, in issue form —
|
|
62
|
+
* so `ok` derives from `hasError` like every other command, and a consumer
|
|
63
|
+
* told to read `issues[].code` is not handed an empty array by this one.
|
|
64
|
+
*/
|
|
65
|
+
issues: Issue[];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Coverage-only report (design §9: `attest cover`).
|
|
69
|
+
*
|
|
70
|
+
* A registry that failed to load is reported, never coveraged. Discarding the
|
|
71
|
+
* load issues turned an unreadable registry into an empty one, and an empty
|
|
72
|
+
* registry is fully covered — so the command answered `ok: true` on exactly the
|
|
73
|
+
* repo whose intent layer had stopped being readable. Refusing here is the same
|
|
74
|
+
* call `runRender` makes for the same reason: a report computed from a
|
|
75
|
+
* half-loaded registry is a lie, and a lie that reads as a pass is the worst
|
|
76
|
+
* shape it can take.
|
|
77
|
+
*/
|
|
78
|
+
export declare function runCover(root: string, options?: ReadOptions): Promise<CoverResult>;
|
|
49
79
|
export interface RenderResult {
|
|
50
80
|
/** The rendered document; empty string when `issues` contains an ERROR. */
|
|
51
81
|
markdown: string;
|
|
@@ -69,6 +99,27 @@ export declare function runRender(root: string, options?: ReadOptions): Promise<
|
|
|
69
99
|
* alongside a gate that fails when the file no longer matches its source.
|
|
70
100
|
*/
|
|
71
101
|
export declare function runRenderCheck(root: string, outFile: string, target: RenderTarget, options?: ReadOptions): Promise<Issue[]>;
|
|
102
|
+
export { SKILL_FILE, skillContent, TARGETS, TARGET_NAMES, DEFAULT_TARGET } from './targets.js';
|
|
103
|
+
export type { AgentTarget } from './targets.js';
|
|
104
|
+
/**
|
|
105
|
+
* `attest init`: write the workflow document for each agent target asked for.
|
|
106
|
+
*
|
|
107
|
+
* Naming none means the default one, decided here rather than in the CLI: it is
|
|
108
|
+
* what `init` does, not how a flag parses, and the CLI is a shell over these.
|
|
109
|
+
*
|
|
110
|
+
* Nothing is written while any name is unresolvable. A partial write would
|
|
111
|
+
* leave the repo carrying instructions for some agents and a failing command
|
|
112
|
+
* with no way to tell which — and the whole reason this is safe to put in a
|
|
113
|
+
* script is that its effect is the same on every run.
|
|
114
|
+
*
|
|
115
|
+
* Each file is a pure function of nothing, so re-running after an upgrade is the
|
|
116
|
+
* entire update mechanism (design §9); the write is atomic because every file
|
|
117
|
+
* Attest writes is one the user commits.
|
|
118
|
+
*/
|
|
119
|
+
export declare function runInit(root: string, names: readonly string[]): Promise<{
|
|
120
|
+
files: string[];
|
|
121
|
+
issues: Issue[];
|
|
122
|
+
}>;
|
|
72
123
|
/**
|
|
73
124
|
* The globs that keep *other* proposals out of a change's gate run.
|
|
74
125
|
*
|
|
@@ -78,6 +129,25 @@ export declare function runRenderCheck(root: string, outFile: string, target: Re
|
|
|
78
129
|
* widening the scope of the one check that decides "done".
|
|
79
130
|
*/
|
|
80
131
|
export declare function changeExcludeGlobs(others: string[]): string[];
|
|
132
|
+
export interface StatusResult {
|
|
133
|
+
change: string;
|
|
134
|
+
/** One row per added id, in id order. */
|
|
135
|
+
rows: StatusRow[];
|
|
136
|
+
/** Roll-up of the rows by state. */
|
|
137
|
+
counts: Record<ObligationState, number>;
|
|
138
|
+
/**
|
|
139
|
+
* Only the reasons the report could not be computed — never progress.
|
|
140
|
+
*
|
|
141
|
+
* A change mid-flight has unmet obligations by definition; reporting those as
|
|
142
|
+
* issues would put them in `summary.error`, and the verdict every command
|
|
143
|
+
* derives from `hasError` would then make `status` exit 1 on the normal state
|
|
144
|
+
* of every change in progress. That is a second gate disagreeing with the
|
|
145
|
+
* first, which is what this command exists *not* to be.
|
|
146
|
+
*/
|
|
147
|
+
issues: Issue[];
|
|
148
|
+
}
|
|
149
|
+
/** Per-change progress (design §9: `attest status <change>`). */
|
|
150
|
+
export declare function runStatus(root: string, changeName: string, options?: ReadOptions): Promise<StatusResult>;
|
|
81
151
|
/** Archive gate for a change (design §8, §9: `attest archive <change>`). */
|
|
82
152
|
export declare function runArchive(root: string, changeName: string, options?: RunOptions): Promise<Issue[]>;
|
|
83
153
|
//# 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,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"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"}
|