@intentius/chant 0.85.0 → 0.87.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/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/registry.d.ts +13 -1
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.d.ts +13 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/sessions.d.ts +23 -0
- package/dist/workspace/__fixtures__/sessions.d.ts.map +1 -0
- package/dist/workspace/checks/records.d.ts +1 -0
- package/dist/workspace/checks/records.d.ts.map +1 -1
- package/dist/workspace/checks.d.ts +4 -0
- package/dist/workspace/checks.d.ts.map +1 -1
- package/dist/workspace/composites.d.ts +14 -1
- package/dist/workspace/composites.d.ts.map +1 -1
- package/dist/workspace/conformance/index.d.ts +211 -0
- package/dist/workspace/conformance/index.d.ts.map +1 -0
- package/dist/workspace/conformance/vitest.d.ts +11 -0
- package/dist/workspace/conformance/vitest.d.ts.map +1 -0
- package/dist/workspace/declaration.d.ts +28 -0
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.schema.json +40 -0
- package/dist/workspace/declared-kinds.d.ts +43 -0
- package/dist/workspace/declared-kinds.d.ts.map +1 -0
- package/dist/workspace/graph-cli.d.ts +11 -0
- package/dist/workspace/graph-cli.d.ts.map +1 -1
- package/dist/workspace/intent-cli.d.ts +2 -1
- package/dist/workspace/intent-cli.d.ts.map +1 -1
- package/dist/workspace/intent-joins.d.ts +45 -8
- package/dist/workspace/intent-joins.d.ts.map +1 -1
- package/dist/workspace/intent.d.ts +71 -7
- package/dist/workspace/intent.d.ts.map +1 -1
- package/dist/workspace/ls.d.ts +31 -1
- package/dist/workspace/ls.d.ts.map +1 -1
- package/dist/workspace/reason-codes.d.ts +47 -4
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/record-sessions.d.ts +51 -0
- package/dist/workspace/record-sessions.d.ts.map +1 -0
- package/dist/workspace/record-source.d.ts +2 -0
- package/dist/workspace/record-source.d.ts.map +1 -1
- package/dist/workspace/records-cli.d.ts +71 -4
- package/dist/workspace/records-cli.d.ts.map +1 -1
- package/dist/workspace/records-since.d.ts +90 -0
- package/dist/workspace/records-since.d.ts.map +1 -0
- package/dist/workspace/records-write.d.ts +171 -0
- package/dist/workspace/records-write.d.ts.map +1 -0
- package/dist/workspace/records.d.ts +244 -15
- package/dist/workspace/records.d.ts.map +1 -1
- package/dist/workspace/runtimes.d.ts +60 -0
- package/dist/workspace/runtimes.d.ts.map +1 -0
- package/dist/workspace/status-gates.d.ts +90 -0
- package/dist/workspace/status-gates.d.ts.map +1 -0
- package/dist/workspace/status.d.ts +17 -0
- package/dist/workspace/status.d.ts.map +1 -1
- package/dist/workspace/trust/seal.d.ts +85 -0
- package/dist/workspace/trust/seal.d.ts.map +1 -0
- package/dist/workspace/trust/ssh-commit.d.ts +7 -0
- package/dist/workspace/trust/ssh-commit.d.ts.map +1 -1
- package/dist/workspace/work.d.ts +56 -0
- package/dist/workspace/work.d.ts.map +1 -0
- package/package.json +19 -1
- package/src/cli/main.ts +55 -3
- package/src/cli/registry.ts +13 -1
- package/src/lifecycle/gate-ledger.ts +14 -0
- package/src/workspace/__fixtures__/sessions.ts +66 -0
- package/src/workspace/checks/records.ts +19 -0
- package/src/workspace/checks.test.ts +2 -0
- package/src/workspace/checks.ts +7 -1
- package/src/workspace/composites.schema.json +65 -3
- package/src/workspace/composites.test.ts +95 -5
- package/src/workspace/composites.ts +28 -7
- package/src/workspace/conformance/__fixture__/app/package.json +7 -0
- package/src/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
- package/src/workspace/conformance/__fixture__/decisions/decision.kind.mjs +32 -0
- package/src/workspace/conformance/__fixture__/decisions/decision.schema.json +376 -0
- package/src/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
- package/src/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
- package/src/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
- package/src/workspace/conformance/__fixture__/delivery/package.json +7 -0
- package/src/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
- package/src/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
- package/src/workspace/conformance/conformance.test.ts +149 -0
- package/src/workspace/conformance/index.mjs +31 -0
- package/src/workspace/conformance/index.ts +453 -0
- package/src/workspace/conformance/vitest.ts +62 -0
- package/src/workspace/declaration.schema.json +40 -0
- package/src/workspace/declaration.ts +62 -0
- package/src/workspace/declared-kinds.test.ts +321 -0
- package/src/workspace/declared-kinds.ts +76 -0
- package/src/workspace/graph-cli.ts +8 -0
- package/src/workspace/intent-cli.ts +29 -6
- package/src/workspace/intent-gaps.test.ts +217 -0
- package/src/workspace/intent-joins.test.ts +60 -0
- package/src/workspace/intent-joins.ts +71 -19
- package/src/workspace/intent.schema.json +304 -7
- package/src/workspace/intent.test.ts +99 -0
- package/src/workspace/intent.ts +365 -46
- package/src/workspace/ls.schema.json +34 -0
- package/src/workspace/ls.ts +69 -4
- package/src/workspace/read-contract.test.ts +30 -9
- package/src/workspace/reason-codes.test.ts +16 -4
- package/src/workspace/reason-codes.ts +55 -4
- package/src/workspace/record-assets.test.ts +3 -1
- package/src/workspace/record-sessions.ts +105 -0
- package/src/workspace/record-source.ts +14 -5
- package/src/workspace/records-amend.schema.json +167 -0
- package/src/workspace/records-cli.ts +308 -19
- package/src/workspace/records-contract.test.ts +57 -2
- package/src/workspace/records-formats.test.ts +640 -0
- package/src/workspace/records-new.schema.json +158 -0
- package/src/workspace/records-quorum.test.ts +196 -0
- package/src/workspace/records-review.schema.json +227 -0
- package/src/workspace/records-sessions.test.ts +108 -0
- package/src/workspace/records-since.schema.json +193 -0
- package/src/workspace/records-since.test.ts +174 -0
- package/src/workspace/records-since.ts +259 -0
- package/src/workspace/records-write-contract.test.ts +125 -0
- package/src/workspace/records-write.test.ts +373 -0
- package/src/workspace/records-write.ts +765 -0
- package/src/workspace/records.schema.json +202 -9
- package/src/workspace/records.ts +700 -41
- package/src/workspace/runtimes.ts +107 -0
- package/src/workspace/status-contract.test.ts +163 -0
- package/src/workspace/status-gates.ts +215 -0
- package/src/workspace/status.schema.json +69 -3
- package/src/workspace/status.ts +35 -2
- package/src/workspace/trust/seal.test.ts +232 -0
- package/src/workspace/trust/seal.ts +195 -0
- package/src/workspace/trust/ssh-commit.ts +2 -2
- package/src/workspace/work.test.ts +390 -0
- package/src/workspace/work.ts +163 -0
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* A record kind is data. It says where its records live, which JSON Schema
|
|
5
5
|
* they follow and which of their states are closed. This module reads every
|
|
6
|
-
* record a kind locates, parses its front matter as the
|
|
6
|
+
* record a kind locates, parses its structured core (the front matter, as the
|
|
7
|
+
* JSON subset of YAML, or the whole file as one I-JSON object, ws-053),
|
|
7
8
|
* validates it against the kind's schema and derives supersession from the
|
|
8
|
-
* records' own `supersedes` links. It never writes a record.
|
|
9
|
+
* records' own `supersedes` links. It never writes a record; `records-write.ts`
|
|
10
|
+
* does, through the rules here (#2670).
|
|
9
11
|
*
|
|
10
12
|
* A record that fails any of that is still returned, with reason codes, and the
|
|
11
13
|
* read succeeds. Only a failure to read the kind, its schema or the revision is
|
|
@@ -17,22 +19,46 @@
|
|
|
17
19
|
*/
|
|
18
20
|
import { z } from "zod";
|
|
19
21
|
import { type AssetPin } from "./record-assets.js";
|
|
22
|
+
import { type SessionCitation } from "./record-sessions.js";
|
|
20
23
|
import type { RecordSource } from "./record-source.js";
|
|
21
24
|
import type { WorkspaceTree } from "./tree.js";
|
|
25
|
+
import type { DecisionWork, WorkLink, WorkWarningCode } from "./work.js";
|
|
22
26
|
/**
|
|
23
27
|
* Why one record is not valid. The list is closed: a reader may switch on it,
|
|
24
28
|
* and a new code is a contract change (#2536).
|
|
25
29
|
*/
|
|
26
|
-
export declare const RECORD_REASON_CODES: readonly ["record-unparseable", "record-schema-invalid", "record-id-duplicate", "record-supersedes-unknown", "record-supersedes-conflict"];
|
|
30
|
+
export declare const RECORD_REASON_CODES: readonly ["record-unparseable", "record-schema-invalid", "record-id-duplicate", "record-supersedes-unknown", "record-supersedes-conflict", "session-seal-mismatch", "session-verdict-unknown-record"];
|
|
27
31
|
export type RecordReasonCode = (typeof RECORD_REASON_CODES)[number];
|
|
28
32
|
/**
|
|
29
33
|
* Why a record carries a warning. Closed, like the reason codes. A warning
|
|
30
34
|
* never makes a record invalid, and `--current` still lists the record.
|
|
31
35
|
*/
|
|
32
|
-
export declare const RECORD_WARNING_CODES: readonly ["asset-drift", "asset-missing", "asset-stale", "record-supersedes-pending", "record-no-evidence"];
|
|
36
|
+
export declare const RECORD_WARNING_CODES: readonly ["asset-drift", "asset-missing", "asset-stale", "record-supersedes-pending", "record-no-evidence", "review-undigested"];
|
|
33
37
|
export type RecordWarningCode = (typeof RECORD_WARNING_CODES)[number];
|
|
38
|
+
/**
|
|
39
|
+
* Why a verdict does not count toward a record's quorum (#2671). Closed, like
|
|
40
|
+
* the reason codes. A verdict with none of these counts.
|
|
41
|
+
*/
|
|
42
|
+
export declare const REVIEW_REASON_CODES: readonly ["review-decider", "review-agent", "review-duplicate", "review-older-digest", "review-unattested"];
|
|
43
|
+
export type ReviewReasonCode = (typeof REVIEW_REASON_CODES)[number];
|
|
44
|
+
/**
|
|
45
|
+
* Why a verdict's seal is not attested (#2687). Closed, like the reason
|
|
46
|
+
* codes. Every verdict in the quorum carries one of these in its
|
|
47
|
+
* `attestation`, unless its seal verified.
|
|
48
|
+
*/
|
|
49
|
+
export declare const SEAL_REASON_CODES: readonly ["seal-missing", "seal-signer-unlisted", "seal-signature-invalid", "seal-unverifiable"];
|
|
50
|
+
export type SealCode = (typeof SEAL_REASON_CODES)[number];
|
|
51
|
+
/** What a verdict's seal establishes (#2687). See `trust/seal.ts`. */
|
|
52
|
+
export interface VerdictAttestation {
|
|
53
|
+
/** Why the verdict is not attested. Absent when its seal verified. */
|
|
54
|
+
code?: SealCode;
|
|
55
|
+
message: string;
|
|
56
|
+
/** The fingerprint of the key that made the signature, when it was checked. */
|
|
57
|
+
key?: string;
|
|
58
|
+
}
|
|
34
59
|
export interface RecordWarning {
|
|
35
|
-
|
|
60
|
+
/** A work kind's records also carry the codes of `WORK_WARNING_CODES` (#2683). */
|
|
61
|
+
code: RecordWarningCode | WorkWarningCode;
|
|
36
62
|
message: string;
|
|
37
63
|
}
|
|
38
64
|
/**
|
|
@@ -45,6 +71,9 @@ export declare class RecordReadError extends Error {
|
|
|
45
71
|
readonly code: ReadErrorCode;
|
|
46
72
|
constructor(code: ReadErrorCode, message: string);
|
|
47
73
|
}
|
|
74
|
+
/** The formats a kind file may name. Closed. */
|
|
75
|
+
export declare const RECORD_FORMATS: readonly ["markdown-front-matter", "json"];
|
|
76
|
+
export type RecordFormat = (typeof RECORD_FORMATS)[number];
|
|
48
77
|
/** The data a kind file exports as `recordKind`. */
|
|
49
78
|
export declare const recordKindSchema: z.ZodObject<{
|
|
50
79
|
name: z.ZodString;
|
|
@@ -52,19 +81,27 @@ export declare const recordKindSchema: z.ZodObject<{
|
|
|
52
81
|
dir: z.ZodString;
|
|
53
82
|
match: z.ZodString;
|
|
54
83
|
}, z.core.$strict>;
|
|
55
|
-
format: z.
|
|
84
|
+
format: z.ZodEnum<{
|
|
85
|
+
json: "json";
|
|
86
|
+
"markdown-front-matter": "markdown-front-matter";
|
|
87
|
+
}>;
|
|
56
88
|
schema: z.ZodObject<{
|
|
57
89
|
id: z.ZodString;
|
|
58
90
|
path: z.ZodString;
|
|
91
|
+
refs: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
92
|
+
id: z.ZodString;
|
|
93
|
+
path: z.ZodString;
|
|
94
|
+
}, z.core.$strict>>>;
|
|
59
95
|
}, z.core.$strict>;
|
|
60
|
-
idField: z.ZodString
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
96
|
+
idField: z.ZodOptional<z.ZodString>;
|
|
97
|
+
idFrom: z.ZodOptional<z.ZodLiteral<"sha256">>;
|
|
98
|
+
stateField: z.ZodOptional<z.ZodString>;
|
|
99
|
+
states: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
100
|
+
closedStates: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
101
|
+
supersedes: z.ZodOptional<z.ZodObject<{
|
|
65
102
|
field: z.ZodString;
|
|
66
|
-
key: z.ZodString
|
|
67
|
-
}, z.core.$strict
|
|
103
|
+
key: z.ZodOptional<z.ZodString>;
|
|
104
|
+
}, z.core.$strict>>;
|
|
68
105
|
approval: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
|
|
69
106
|
pins: z.ZodOptional<z.ZodObject<{
|
|
70
107
|
field: z.ZodString;
|
|
@@ -72,6 +109,25 @@ export declare const recordKindSchema: z.ZodObject<{
|
|
|
72
109
|
constrains: z.ZodOptional<z.ZodObject<{
|
|
73
110
|
field: z.ZodString;
|
|
74
111
|
}, z.core.$strict>>;
|
|
112
|
+
reviews: z.ZodOptional<z.ZodObject<{
|
|
113
|
+
field: z.ZodString;
|
|
114
|
+
decider: z.ZodString;
|
|
115
|
+
}, z.core.$strict>>;
|
|
116
|
+
session: z.ZodOptional<z.ZodObject<{
|
|
117
|
+
verdicts: z.ZodString;
|
|
118
|
+
seal: z.ZodString;
|
|
119
|
+
subjects: z.ZodObject<{
|
|
120
|
+
kind: z.ZodString;
|
|
121
|
+
}, z.core.$strict>;
|
|
122
|
+
}, z.core.$strict>>;
|
|
123
|
+
work: z.ZodOptional<z.ZodObject<{
|
|
124
|
+
needs: z.ZodString;
|
|
125
|
+
implements: z.ZodString;
|
|
126
|
+
decisions: z.ZodString;
|
|
127
|
+
open: z.ZodString;
|
|
128
|
+
done: z.ZodString;
|
|
129
|
+
closedOn: z.ZodString;
|
|
130
|
+
}, z.core.$strict>>;
|
|
75
131
|
}, z.core.$strict>;
|
|
76
132
|
export type RecordKind = z.infer<typeof recordKindSchema>;
|
|
77
133
|
/** A kind as loaded: its data, where it came from, and its schema. */
|
|
@@ -82,6 +138,8 @@ export interface LoadedRecordKind {
|
|
|
82
138
|
/** Absolute path of the records directory in the working tree. */
|
|
83
139
|
dir: string;
|
|
84
140
|
schema: Record<string, unknown>;
|
|
141
|
+
/** The schema files `schema.refs` names, in order (ws-053). Empty without it. */
|
|
142
|
+
refs: Record<string, unknown>[];
|
|
85
143
|
}
|
|
86
144
|
/**
|
|
87
145
|
* Import the kind file at `path` through the path loader lexicons use (#2520).
|
|
@@ -104,6 +162,140 @@ export type FrontMatter = {
|
|
|
104
162
|
* cannot hold, are refused, so the same text always reads as the same JSON.
|
|
105
163
|
*/
|
|
106
164
|
export declare function parseFrontMatter(text: string): FrontMatter;
|
|
165
|
+
/**
|
|
166
|
+
* A JSON record: the whole file is one object, read as I-JSON (RFC 7493)
|
|
167
|
+
* requires on the two points JSON.parse lets through (ws-053). A top-level
|
|
168
|
+
* value other than an object is refused, and so is a member name that repeats
|
|
169
|
+
* within one object, at any depth, which JSON.parse accepts by keeping the
|
|
170
|
+
* last value. Names compare after their escapes are decoded, so `"a"` and
|
|
171
|
+
* `"\u0061"` are the same name. A number too large for a double is refused as
|
|
172
|
+
* front matter's is.
|
|
173
|
+
*/
|
|
174
|
+
export declare function parseJsonRecord(text: string): FrontMatter;
|
|
175
|
+
/** A record's structured core, parsed as the kind's format says. */
|
|
176
|
+
export declare function parseRecord(format: RecordFormat, text: string): FrontMatter;
|
|
177
|
+
/**
|
|
178
|
+
* The digest a review verdict names: the lowercase hex SHA-256 of the record
|
|
179
|
+
* file's text with its reviews block taken out of the front matter (#2672), or
|
|
180
|
+
* for a JSON record its reviews member taken out of the object (ws-053).
|
|
181
|
+
* Adding, changing or removing a verdict leaves it as it was; any other edit
|
|
182
|
+
* to the file changes it, so a verdict given before an amendment stops
|
|
183
|
+
* counting.
|
|
184
|
+
*
|
|
185
|
+
* The rule, which a hand-editor can follow with a text editor and
|
|
186
|
+
* `sha256sum`:
|
|
187
|
+
*
|
|
188
|
+
* 1. Line endings become LF (CRLF and a lone CR each become one LF).
|
|
189
|
+
* 2. When the text starts with a `---` line and a later line is exactly
|
|
190
|
+
* `---`, the lines between them are the front matter. In it, the line
|
|
191
|
+
* that starts, at column 0, with the key `field` (bare, or in single or
|
|
192
|
+
* double quotes), optional spaces or tabs and a `:`, is removed, and so
|
|
193
|
+
* is every line after it, up to the closing `---`, that is empty or
|
|
194
|
+
* starts with a space, a tab, `#` or `-`. Removal stops at the first
|
|
195
|
+
* other line. Everything else, the `---` lines and the body included, is
|
|
196
|
+
* kept byte for byte.
|
|
197
|
+
* 3. The digest is the SHA-256 of the result's UTF-8 bytes.
|
|
198
|
+
*
|
|
199
|
+
* Text with no front matter, or no such key, is hashed after step 1 alone.
|
|
200
|
+
* A writer that adds a verdict must change only the reviews block: a
|
|
201
|
+
* reformatted front matter is a new digest, and every earlier verdict stops
|
|
202
|
+
* counting.
|
|
203
|
+
*/
|
|
204
|
+
export declare function recordTextDigest(text: string, field?: string | null, format?: RecordFormat): string;
|
|
205
|
+
/** The quorum a workspace sets when its declaration names none: two verdicts besides the decider's (#2555). */
|
|
206
|
+
export declare const DEFAULT_QUORUM = 2;
|
|
207
|
+
/** A principal as the quorum compares it: NFKC, trimmed and lower-cased, so `alice` and `Alice ` are one reviewer (#2671). */
|
|
208
|
+
export declare function normalisePrincipal(name: string): string;
|
|
209
|
+
/** One verdict as the quorum reads it. */
|
|
210
|
+
export interface QuorumVerdict {
|
|
211
|
+
/** The entry's position in the record's reviews list, from 0. */
|
|
212
|
+
index: number;
|
|
213
|
+
/** The reviewer, normalised. */
|
|
214
|
+
principal: string;
|
|
215
|
+
/** The reviewer as written. */
|
|
216
|
+
reviewer: string;
|
|
217
|
+
verdict: "agree" | "dissent" | "abstain";
|
|
218
|
+
/** The digest the verdict names, or null when it names none. */
|
|
219
|
+
digest: string | null;
|
|
220
|
+
/**
|
|
221
|
+
* true when its seal verifies for the reviewer against the signers at base;
|
|
222
|
+
* false when a seal is missing under an active policy, or fails; null when
|
|
223
|
+
* nothing here can say (#2687).
|
|
224
|
+
*/
|
|
225
|
+
attested: boolean | null;
|
|
226
|
+
attestation: VerdictAttestation;
|
|
227
|
+
/** Why it does not count. Absent on a counted verdict. */
|
|
228
|
+
reason?: {
|
|
229
|
+
code: ReviewReasonCode;
|
|
230
|
+
message: string;
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
/** A dissent that is neither addressed nor withdrawn. */
|
|
234
|
+
export interface OpenConcern {
|
|
235
|
+
index: number;
|
|
236
|
+
principal: string;
|
|
237
|
+
reviewer: string;
|
|
238
|
+
note: string | null;
|
|
239
|
+
/** The proposed decision the dissent opened, when it names one. */
|
|
240
|
+
proposes?: string;
|
|
241
|
+
}
|
|
242
|
+
export interface Quorum {
|
|
243
|
+
/** How many counted agree verdicts, besides the decider's, the record needs. */
|
|
244
|
+
need: number;
|
|
245
|
+
/** Whether `need` comes from the workspace declaration or is the default. */
|
|
246
|
+
needFrom: "declaration" | "default";
|
|
247
|
+
/** Counted verdicts that agree. */
|
|
248
|
+
agreed: number;
|
|
249
|
+
/** Verdicts that count: one per principal, the latest, after the exclusions. */
|
|
250
|
+
counted: QuorumVerdict[];
|
|
251
|
+
/** Verdicts that don't, each with its reason. */
|
|
252
|
+
notCounted: QuorumVerdict[];
|
|
253
|
+
openConcerns: OpenConcern[];
|
|
254
|
+
/** `agreed` reaches `need`. */
|
|
255
|
+
met: boolean;
|
|
256
|
+
/** `met`, with at least one open concern. A met quorum with an open concern is never consensus (RFC 7282). */
|
|
257
|
+
metWithObjections: boolean;
|
|
258
|
+
}
|
|
259
|
+
export interface QuorumOptions {
|
|
260
|
+
need: number;
|
|
261
|
+
needFrom: "declaration" | "default";
|
|
262
|
+
/** Normalised principals that hold the agent role. */
|
|
263
|
+
agents: ReadonlySet<string>;
|
|
264
|
+
/** Whether an attestation policy is active, so a verdict needs a seal to count. */
|
|
265
|
+
attestation: boolean;
|
|
266
|
+
/**
|
|
267
|
+
* Checks one verdict's seal (#2687), as `trust/seal.ts` does against the
|
|
268
|
+
* policy at base. Without it no seal is checked: a sealed verdict is
|
|
269
|
+
* `seal-unverifiable`, so under an active policy none counts.
|
|
270
|
+
*/
|
|
271
|
+
verifySeal?: (v: SealInput) => {
|
|
272
|
+
attested: boolean | null;
|
|
273
|
+
} & VerdictAttestation;
|
|
274
|
+
}
|
|
275
|
+
/** What a seal check reads of one verdict. */
|
|
276
|
+
export interface SealInput {
|
|
277
|
+
record: string | null;
|
|
278
|
+
reviewer: string;
|
|
279
|
+
verdict: string;
|
|
280
|
+
on: unknown;
|
|
281
|
+
digest: string | null;
|
|
282
|
+
seal: unknown;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* The quorum of one record, read from its reviews list, or null when the
|
|
286
|
+
* kind has no reviews list or the front matter could not be read (#2671).
|
|
287
|
+
* Malformed entries are skipped; the schema reports them.
|
|
288
|
+
*
|
|
289
|
+
* A verdict is not counted when its reviewer is the decider, holds the agent
|
|
290
|
+
* role, names a digest other than the record's own now, or, under an active
|
|
291
|
+
* attestation policy, carries no seal that verifies for its reviewer (#2687),
|
|
292
|
+
* in that order. Of the rest, the latest verdict per principal counts and
|
|
293
|
+
* each earlier one is a duplicate. Every verdict reports its seal's check in
|
|
294
|
+
* `attested` and `attestation`, whether it counts or not.
|
|
295
|
+
*/
|
|
296
|
+
export declare function computeQuorum(kind: RecordKind, entry: Pick<RecordEntry, "data" | "digest"> & {
|
|
297
|
+
id?: string | null;
|
|
298
|
+
}, options: QuorumOptions): Quorum | null;
|
|
107
299
|
export interface RecordReason {
|
|
108
300
|
code: RecordReasonCode;
|
|
109
301
|
message: string;
|
|
@@ -119,12 +311,26 @@ export interface RecordEntry {
|
|
|
119
311
|
reasons: RecordReason[];
|
|
120
312
|
/** The id of the closed record whose `supersedes` link replaces this one, or null. */
|
|
121
313
|
supersededBy: string | null;
|
|
122
|
-
/** The front matter
|
|
314
|
+
/** The record's structured core as JSON (the front matter, or the whole JSON file), or null when it could not be parsed. */
|
|
123
315
|
data: Record<string, unknown> | null;
|
|
124
|
-
/**
|
|
316
|
+
/**
|
|
317
|
+
* Each workspace file the record pins, checked against the tree read
|
|
318
|
+
* (#2549). Empty when nothing was checked. A content-addressed record whose
|
|
319
|
+
* name claims a hash other than its bytes' lists itself, drifted (ws-053).
|
|
320
|
+
*/
|
|
125
321
|
assets: AssetPin[];
|
|
126
322
|
/** Findings that leave the record valid, such as a pinned file that changed (#2549). */
|
|
127
323
|
warnings: RecordWarning[];
|
|
324
|
+
/** {@link recordTextDigest} of the file's text, without the kind's reviews list when it has one (#2672). */
|
|
325
|
+
digest: string;
|
|
326
|
+
/** For a session kind only: the subject records' review entries that name this session (#2673). */
|
|
327
|
+
citedBy?: SessionCitation[];
|
|
328
|
+
/** For a work kind (#2683): the record's state is its kind's open state and every need is done. */
|
|
329
|
+
ready?: boolean;
|
|
330
|
+
/** For a work kind: each need that is not done, with its state, or null when no record has the id. */
|
|
331
|
+
blockedBy?: WorkLink[];
|
|
332
|
+
/** For a work kind: each decision the record implements, with its state, or null when no decision has the id. */
|
|
333
|
+
implements?: WorkLink[];
|
|
128
334
|
}
|
|
129
335
|
export interface ReadRecordsOptions {
|
|
130
336
|
/** Where record paths are reported from, and what `source` reads relative to. */
|
|
@@ -143,6 +349,21 @@ export interface ReadRecordsOptions {
|
|
|
143
349
|
* compared.
|
|
144
350
|
*/
|
|
145
351
|
history?: RecordHistory;
|
|
352
|
+
/**
|
|
353
|
+
* For a session kind: the records its `session.subjects.kind` locates, read
|
|
354
|
+
* from the same tree (#2673). Without them no verdict is checked and no
|
|
355
|
+
* session is cited.
|
|
356
|
+
*/
|
|
357
|
+
subjects?: {
|
|
358
|
+
records: RecordEntry[];
|
|
359
|
+
reviews: string;
|
|
360
|
+
};
|
|
361
|
+
/**
|
|
362
|
+
* The workspace root, from `root` with / separators ("." for `root`
|
|
363
|
+
* itself): where a content-addressed record's own path is reported from
|
|
364
|
+
* when it lists itself in `assets` (ws-053). Defaults to ".".
|
|
365
|
+
*/
|
|
366
|
+
workspaceRoot?: string;
|
|
146
367
|
}
|
|
147
368
|
/** Commit times, in seconds since the epoch, read from git. */
|
|
148
369
|
export interface RecordHistory {
|
|
@@ -159,7 +380,15 @@ export interface ReadRecordsResult {
|
|
|
159
380
|
invalid: number;
|
|
160
381
|
superseded: number;
|
|
161
382
|
};
|
|
383
|
+
/** For a work kind (#2683): every decision its decision kind reads, with the work records implementing it. */
|
|
384
|
+
decisions?: DecisionWork[];
|
|
162
385
|
}
|
|
386
|
+
/**
|
|
387
|
+
* The ids a record's supersedes field names (ws-053). With the kind's `key`,
|
|
388
|
+
* the field is a list of objects and each one's `key` holds an id; without
|
|
389
|
+
* it, the field holds one id or a list of ids. Anything else names none.
|
|
390
|
+
*/
|
|
391
|
+
export declare function supersedesTargets(kind: Pick<RecordKind, "supersedes">, data: Record<string, unknown> | null): string[];
|
|
163
392
|
/** Read every record `loaded` locates, through `options.source`. */
|
|
164
393
|
export declare function readRecords(loaded: LoadedRecordKind, options: ReadRecordsOptions): Promise<ReadRecordsResult>;
|
|
165
394
|
//# sourceMappingURL=records.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/workspace/records.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/workspace/records.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The runtimes a member's components can deploy on, for `chant workspace
|
|
3
|
+
* graph --composites` (#2674): the built-in `local` runtime, and every lexicon
|
|
4
|
+
* the member's `chant.config.ts` configures whose `opRuntime` hosts
|
|
5
|
+
* `chant run --components`. That is the list `chant run --components <name>
|
|
6
|
+
* --on <runtime>` accepts in the member's directory (`../cli/handlers/run.ts`),
|
|
7
|
+
* so a reader such as hud offers these and never guesses a runtime.
|
|
8
|
+
*
|
|
9
|
+
* `local` is the default. A configured default (`run.on`) is read once the
|
|
10
|
+
* config type has one; until then the command without `--on` runs locally.
|
|
11
|
+
*
|
|
12
|
+
* The config is read the way `chant run` reads it, from the member's
|
|
13
|
+
* directory, in the working tree or in the tree `--at` exported. Reading it
|
|
14
|
+
* runs the member's `chant.config.ts` and imports the lexicons it lists.
|
|
15
|
+
*/
|
|
16
|
+
/** The runtime core provides, which `chant run` uses without `--on`. */
|
|
17
|
+
export declare const LOCAL_RUNTIME = "local";
|
|
18
|
+
/** Why a member's runtimes list only part of what its config names. Closed: part of the read contract. */
|
|
19
|
+
export declare const RUNTIME_REASON_CODES: readonly ["runtimes-config-unreadable", "runtimes-lexicon-unreadable"];
|
|
20
|
+
export type RuntimeReasonCode = (typeof RUNTIME_REASON_CODES)[number];
|
|
21
|
+
export interface RuntimeReason {
|
|
22
|
+
code: RuntimeReasonCode;
|
|
23
|
+
message: string;
|
|
24
|
+
}
|
|
25
|
+
/** One runtime a component can deploy on. */
|
|
26
|
+
export interface ComponentRuntime {
|
|
27
|
+
/** What `--on` takes: the lexicon's name, or `local`. */
|
|
28
|
+
name: string;
|
|
29
|
+
/** The lexicon that hosts it, or null for `local`. */
|
|
30
|
+
lexicon: string | null;
|
|
31
|
+
/** True for the runtime `chant run --components` uses without `--on`. */
|
|
32
|
+
default: boolean;
|
|
33
|
+
/** The command that deploys the component on it, run in the member's directory. */
|
|
34
|
+
command: string;
|
|
35
|
+
}
|
|
36
|
+
/** What one member's config says about runtimes. */
|
|
37
|
+
export interface MemberRuntimes {
|
|
38
|
+
/** Configured lexicons whose `opRuntime` hosts component runs, in config order. */
|
|
39
|
+
lexicons: string[];
|
|
40
|
+
/** The default runtime's name. */
|
|
41
|
+
default: string;
|
|
42
|
+
reasons: RuntimeReason[];
|
|
43
|
+
}
|
|
44
|
+
/** Loads a lexicon plugin by name; `loadPlugin` from the CLI unless a test swaps it. */
|
|
45
|
+
export type PluginLoader = (name: string) => Promise<{
|
|
46
|
+
opRuntime?: {
|
|
47
|
+
runComponents?: unknown;
|
|
48
|
+
};
|
|
49
|
+
}>;
|
|
50
|
+
/** Read the runtimes a member's config offers. `dir` is the member's directory on disk. */
|
|
51
|
+
export declare function readMemberRuntimes(dir: string, load?: PluginLoader): Promise<MemberRuntimes>;
|
|
52
|
+
/** The runtimes one component can deploy on, `local` first, each with its command line. */
|
|
53
|
+
export declare function componentRuntimes(component: string, member: MemberRuntimes | undefined): ComponentRuntime[];
|
|
54
|
+
/** Read the runtimes of each member of kind chant, from the tree at `root`. */
|
|
55
|
+
export declare function readRuntimesIn(root: string, members: readonly {
|
|
56
|
+
name: string;
|
|
57
|
+
dir: string;
|
|
58
|
+
kind: string;
|
|
59
|
+
}[], load?: PluginLoader): Promise<Map<string, MemberRuntimes>>;
|
|
60
|
+
//# sourceMappingURL=runtimes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimes.d.ts","sourceRoot":"","sources":["../../src/workspace/runtimes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,wEAAwE;AACxE,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC,0GAA0G;AAC1G,eAAO,MAAM,oBAAoB,wEAKS,CAAC;AAC3C,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,yEAAyE;IACzE,OAAO,EAAE,OAAO,CAAC;IACjB,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,oDAAoD;AACpD,MAAM,WAAW,cAAc;IAC7B,mFAAmF;IACnF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,wFAAwF;AACxF,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,SAAS,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,CAAC,CAAC;AAIlG,2FAA2F;AAC3F,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAoBlG;AAED,2FAA2F;AAC3F,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,gBAAgB,EAAE,CAS3G;AAED,+EAA+E;AAC/E,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAO7K"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gate state for `chant workspace status --json` (#2674): each member's gates
|
|
3
|
+
* as its gate ledger on `chant/lifecycle` records them, so a reader such as
|
|
4
|
+
* hud never runs `git show` on the branch itself.
|
|
5
|
+
*
|
|
6
|
+
* A member's gate ledger is the `_gates/` directory under its ledger prefix:
|
|
7
|
+
* `_members/<member>/_gates/<component>.jsonl` for a member that writes the
|
|
8
|
+
* member layout (#2538), and the flat `_gates/<component>.jsonl` otherwise,
|
|
9
|
+
* chosen the same way as its release ledger. Each file is keyed by the
|
|
10
|
+
* component, or by the op for a gate an Op run reached, and holds both the
|
|
11
|
+
* pending facts a run records and the approvals `chant approve` records
|
|
12
|
+
* (`../lifecycle/gate-ledger.ts`).
|
|
13
|
+
*
|
|
14
|
+
* A gate's state is decided the way a run decides it (`evaluateGate` in
|
|
15
|
+
* `../op/gate.ts`), without writing anything: the newest pending fact for the
|
|
16
|
+
* gate in its environment is the anchor, only approvals recorded since it and
|
|
17
|
+
* for its plan count, and a gate with an `approval` block counts them with
|
|
18
|
+
* `tallyGateApprovals`, as `describeApprovalProgress` does after an approve.
|
|
19
|
+
*/
|
|
20
|
+
/** Why a member's gates can't be listed. Closed: a new code is a contract change. */
|
|
21
|
+
export declare const GATE_REASON_CODES: readonly ["gates-no-ledger", "gates-no-gate-ledger", "gates-ledger-unreadable"];
|
|
22
|
+
export type GateReasonCode = (typeof GATE_REASON_CODES)[number];
|
|
23
|
+
export type GateState = "pending" | "approved" | "expired" | "superseded";
|
|
24
|
+
export interface StatusGateApproval {
|
|
25
|
+
/** Who recorded it: `chant approve --approver`, or the CI or shell identity. */
|
|
26
|
+
principal: string;
|
|
27
|
+
/** The channel it was recorded on (`cli`, `mcp`, `acp`), or null for a record older than chant#2384. */
|
|
28
|
+
channel: string | null;
|
|
29
|
+
at: string;
|
|
30
|
+
}
|
|
31
|
+
export interface StatusGate {
|
|
32
|
+
/** The ledger file's key: the component, or the op for a gate an Op run reached. */
|
|
33
|
+
component: string;
|
|
34
|
+
/** The gate's name. */
|
|
35
|
+
name: string;
|
|
36
|
+
/** The environment the gate was reached in, or null for a gate that records none (an Op gate). */
|
|
37
|
+
env: string | null;
|
|
38
|
+
/** The plan the run reached the gate with, or null for a gate that binds no plan. */
|
|
39
|
+
planDigest: string | null;
|
|
40
|
+
state: GateState;
|
|
41
|
+
/** When the run recorded the pending fact the state is read against. */
|
|
42
|
+
recordedAt: string;
|
|
43
|
+
expiresAt: string;
|
|
44
|
+
/** The approvals that count toward the gate for this plan, oldest first. */
|
|
45
|
+
approvals: StatusGateApproval[];
|
|
46
|
+
/** How many human approvals the gate needs: its quorum's count, 1 without one. */
|
|
47
|
+
needed: number;
|
|
48
|
+
/** The command that approves it, run in the member's directory. */
|
|
49
|
+
approve: string;
|
|
50
|
+
}
|
|
51
|
+
export interface StatusGateLedger {
|
|
52
|
+
/** `members` for `_members/<member>/_gates`, `flat` for `_gates`. */
|
|
53
|
+
layout: "members" | "flat";
|
|
54
|
+
/** The gate ledger directory on the branch. */
|
|
55
|
+
path: string;
|
|
56
|
+
/** True when more than one member in this output reads the same flat directory. */
|
|
57
|
+
shared: boolean;
|
|
58
|
+
/** Lines that are neither a pending fact nor an approval, skipped. */
|
|
59
|
+
malformed: number;
|
|
60
|
+
reason: {
|
|
61
|
+
code: GateReasonCode;
|
|
62
|
+
message: string;
|
|
63
|
+
} | null;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Reads the gate ledger files in `dir` on the branch at `commit`: file name
|
|
67
|
+
* without `.jsonl` to contents. Null when the directory doesn't exist; throws
|
|
68
|
+
* when it can't be read.
|
|
69
|
+
*/
|
|
70
|
+
export type GateLedgerReader = (dir: string, commit: string, cwd: string) => Promise<Map<string, string> | null>;
|
|
71
|
+
export declare const defaultGateLedgerReader: GateLedgerReader;
|
|
72
|
+
/** The exact `chant approve` line for a gate. */
|
|
73
|
+
export declare function approveCommand(component: string, gate: string, env: string | null): string;
|
|
74
|
+
/**
|
|
75
|
+
* Every gate in one ledger file, one per gate and environment, for the
|
|
76
|
+
* environments in `envs`. A gate whose facts record no environment (an Op
|
|
77
|
+
* gate) is listed whatever `envs` is. A pending fact with no environment on a
|
|
78
|
+
* gate whose other facts have one is left out, as a run leaves it out: such a
|
|
79
|
+
* line binds no environment, and `chant approve --expire` writes one.
|
|
80
|
+
*/
|
|
81
|
+
export declare function gatesInLedger(component: string, content: string, envs: readonly string[], now: string): {
|
|
82
|
+
gates: StatusGate[];
|
|
83
|
+
malformed: number;
|
|
84
|
+
};
|
|
85
|
+
/** Read one member's gate ledger directory at `commit` and list its gates. */
|
|
86
|
+
export declare function readMemberGates(dir: string, layout: "members" | "flat", commit: string | null, envs: readonly string[], cwd: string, now: string, read?: GateLedgerReader): Promise<{
|
|
87
|
+
gates: StatusGate[];
|
|
88
|
+
ledger: StatusGateLedger;
|
|
89
|
+
}>;
|
|
90
|
+
//# sourceMappingURL=status-gates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-gates.d.ts","sourceRoot":"","sources":["../../src/workspace/status-gates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,qFAAqF;AACrF,eAAO,MAAM,iBAAiB,iFAOY,CAAC;AAC3C,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC;AAE1E,MAAM,WAAW,kBAAkB;IACjC,gFAAgF;IAChF,SAAS,EAAE,MAAM,CAAC;IAClB,wGAAwG;IACxG,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,UAAU;IACzB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,kGAAkG;IAClG,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,qFAAqF;IACrF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,SAAS,CAAC;IACjB,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,kFAAkF;IAClF,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,qEAAqE;IACrE,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,MAAM,EAAE,OAAO,CAAC;IAChB,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC1D;AAED;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;AAMjH,eAAO,MAAM,uBAAuB,EAAE,gBAYrC,CAAC;AAEF,iDAAiD;AACjD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE1F;AAgDD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAkBlJ;AAED,8EAA8E;AAC9E,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,SAAS,GAAG,MAAM,EAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,gBAA0C,GAC/C,OAAO,CAAC;IAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC,CAsB5D"}
|
|
@@ -20,10 +20,16 @@
|
|
|
20
20
|
* declaration that can't be read, or an environment name that can't be one,
|
|
21
21
|
* exits 1. The `--json` output is part of the read contract and is described
|
|
22
22
|
* by `status.schema.json` beside this file.
|
|
23
|
+
*
|
|
24
|
+
* The JSON also lists each member's gates, read from its gate ledger on the
|
|
25
|
+
* same branch (#2674, `status-gates.ts`): the state of each, the approvals
|
|
26
|
+
* that count, and the `chant approve` line that answers it. The text view
|
|
27
|
+
* doesn't show them.
|
|
23
28
|
*/
|
|
24
29
|
import type { CommandContext } from "../cli/registry.js";
|
|
25
30
|
import { type ReleaseRecord } from "../lifecycle/release-ledger.js";
|
|
26
31
|
import { type ErrorLocation } from "./declaration.js";
|
|
32
|
+
import { type GateLedgerReader, type StatusGate, type StatusGateLedger } from "./status-gates.js";
|
|
27
33
|
/** The version of the `status` output this chant writes. */
|
|
28
34
|
export declare const STATUS_CONTRACT_VERSION = 1;
|
|
29
35
|
/** `$id` of the JSON Schema for the `--json` output, shipped beside this file. */
|
|
@@ -38,6 +44,8 @@ export declare const MEMBERS_DIR = "_members";
|
|
|
38
44
|
*/
|
|
39
45
|
export declare const STATUS_REASON_CODES: readonly ["ledger-unreadable", "ledger-malformed"];
|
|
40
46
|
export type StatusReasonCode = (typeof STATUS_REASON_CODES)[number];
|
|
47
|
+
/** Why a member's gates can't be listed (#2674). Closed, like {@link STATUS_REASON_CODES}. */
|
|
48
|
+
export declare const STATUS_GATE_REASON_CODES: readonly ["gates-no-ledger", "gates-no-gate-ledger", "gates-ledger-unreadable"];
|
|
41
49
|
/**
|
|
42
50
|
* Why the status couldn't be read at all. The declaration's own codes, except
|
|
43
51
|
* the two that only `--at` returns, and one for the environment name.
|
|
@@ -93,7 +101,12 @@ export interface StatusMember {
|
|
|
93
101
|
environments: StatusEnvironment[];
|
|
94
102
|
/** Null without `--compare-to`. */
|
|
95
103
|
compare: StatusCompare | null;
|
|
104
|
+
/** True when no environment's release ledger has a reason. Gate reasons don't change it. */
|
|
96
105
|
readable: boolean;
|
|
106
|
+
/** Where the member's gates were read from, and why none are listed when none can be (#2674). */
|
|
107
|
+
gateLedger: StatusGateLedger;
|
|
108
|
+
/** Each gate in the member's gate ledger, one per environment asked for, sorted by component then gate. */
|
|
109
|
+
gates: StatusGate[];
|
|
97
110
|
}
|
|
98
111
|
export type StatusDocument = {
|
|
99
112
|
$schema: string;
|
|
@@ -138,6 +151,10 @@ export interface StatusQuery {
|
|
|
138
151
|
compareTo?: string;
|
|
139
152
|
/** Reads one ledger; the lifecycle reader unless a test swaps it. */
|
|
140
153
|
readLedger?: LedgerReader;
|
|
154
|
+
/** Reads one member's gate ledger directory; git unless a test swaps it. */
|
|
155
|
+
readGates?: GateLedgerReader;
|
|
156
|
+
/** The instant a gate's expiry is measured against; now by default. */
|
|
157
|
+
now?: string;
|
|
141
158
|
}
|
|
142
159
|
export declare function compareEnvironments(a: StatusEnvironment, b: StatusEnvironment): StatusCompare;
|
|
143
160
|
/** Find the workspace, read every member's ledger and build the document `--json` prints. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/workspace/status.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/workspace/status.ts"],"names":[],"mappings":"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"}
|