adr-kit 0.12.0 → 0.14.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/README.md +62 -209
- package/README.zh.md +54 -174
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +40 -25
- package/dist/cli.js.map +1 -1
- package/dist/commands/archive.d.ts +2 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +62 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/completion.d.ts.map +1 -1
- package/dist/commands/completion.js +5 -4
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/{accept.d.ts → implement.d.ts} +2 -2
- package/dist/commands/implement.d.ts.map +1 -0
- package/dist/commands/implement.js +42 -0
- package/dist/commands/implement.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +5 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/instructions.d.ts.map +1 -1
- package/dist/commands/instructions.js +24 -81
- package/dist/commands/instructions.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +9 -14
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/propose.d.ts.map +1 -1
- package/dist/commands/propose.js +9 -10
- package/dist/commands/propose.js.map +1 -1
- package/dist/commands/{decide.d.ts → record.d.ts} +2 -2
- package/dist/commands/record.d.ts.map +1 -0
- package/dist/commands/{decide.js → record.js} +6 -6
- package/dist/commands/{decide.js.map → record.js.map} +1 -1
- package/dist/commands/reject.d.ts +1 -1
- package/dist/commands/reject.d.ts.map +1 -1
- package/dist/commands/reject.js +24 -8
- package/dist/commands/reject.js.map +1 -1
- package/dist/commands/show.d.ts.map +1 -1
- package/dist/commands/show.js +2 -16
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +6 -17
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/supersede.d.ts.map +1 -1
- package/dist/commands/supersede.js +44 -10
- package/dist/commands/supersede.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +4 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.d.ts +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +11 -3
- package/dist/commands/validate.js.map +1 -1
- package/dist/core/adr.d.ts +22 -20
- package/dist/core/adr.d.ts.map +1 -1
- package/dist/core/adr.js +97 -14
- package/dist/core/adr.js.map +1 -1
- package/dist/core/archive-seal.d.ts +48 -0
- package/dist/core/archive-seal.d.ts.map +1 -0
- package/dist/core/archive-seal.js +122 -0
- package/dist/core/archive-seal.js.map +1 -0
- package/dist/core/cli-options.d.ts +2 -2
- package/dist/core/cli-options.d.ts.map +1 -1
- package/dist/core/cli-options.js +8 -6
- package/dist/core/cli-options.js.map +1 -1
- package/dist/core/config.d.ts +1 -1
- package/dist/core/git.d.ts +17 -0
- package/dist/core/git.d.ts.map +1 -1
- package/dist/core/git.js +50 -0
- package/dist/core/git.js.map +1 -1
- package/dist/core/graph-html.js +5 -5
- package/dist/core/graph-html.js.map +1 -1
- package/dist/core/graph.d.ts +2 -1
- package/dist/core/graph.d.ts.map +1 -1
- package/dist/core/graph.js +9 -4
- package/dist/core/graph.js.map +1 -1
- package/dist/core/repository.d.ts +3 -11
- package/dist/core/repository.d.ts.map +1 -1
- package/dist/core/repository.js +52 -136
- package/dist/core/repository.js.map +1 -1
- package/dist/core/templates.d.ts +6 -7
- package/dist/core/templates.d.ts.map +1 -1
- package/dist/core/templates.js +11 -12
- package/dist/core/templates.js.map +1 -1
- package/dist/core/tool-integrations.d.ts +24 -0
- package/dist/core/tool-integrations.d.ts.map +1 -1
- package/dist/core/tool-integrations.js +129 -423
- package/dist/core/tool-integrations.js.map +1 -1
- package/dist/core/validate.d.ts +20 -6
- package/dist/core/validate.d.ts.map +1 -1
- package/dist/core/validate.js +302 -90
- package/dist/core/validate.js.map +1 -1
- package/package.json +1 -1
- package/dist/commands/accept.d.ts.map +0 -1
- package/dist/commands/accept.js +0 -42
- package/dist/commands/accept.js.map +0 -1
- package/dist/commands/decide.d.ts.map +0 -1
package/dist/core/adr.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type AdrStatus = 'proposed' | '
|
|
1
|
+
export type AdrStatus = 'proposed' | 'implemented' | 'rejected' | 'superseded';
|
|
2
2
|
/**
|
|
3
3
|
* The two declaration values, single-sourced: the parser, the CLI prompt, and
|
|
4
4
|
* the shell completion scripts all read the set from here, so a third value
|
|
@@ -23,22 +23,21 @@ export declare function isDecidedBy(value: unknown): value is DecidedBy;
|
|
|
23
23
|
* Who put the decision on the table, as opposed to `decided-by`, whose
|
|
24
24
|
* judgment settled it. The same two values on a different axis: a person may
|
|
25
25
|
* raise what the agent settles, and the agent may raise what a person settles.
|
|
26
|
-
* Declared
|
|
27
|
-
* never carries it.
|
|
26
|
+
* Declared on entry to implemented/, never inferred; proposals do not carry it.
|
|
28
27
|
*/
|
|
29
28
|
export type RaisedBy = DecidedBy;
|
|
30
29
|
/** Narrow an unknown front matter value to a raised-by declaration. */
|
|
31
30
|
export declare function isRaisedBy(value: unknown): value is RaisedBy;
|
|
32
31
|
/**
|
|
33
|
-
* The
|
|
34
|
-
*
|
|
35
|
-
* their own status, and drafts are proposals that will either be promoted or
|
|
36
|
-
* discarded.
|
|
32
|
+
* The four lifecycle directories. Numbered decisions occupy implemented/
|
|
33
|
+
* or archived/; unnumbered proposals occupy proposed/ or rejected/.
|
|
37
34
|
*/
|
|
38
|
-
export type AdrFolder = '
|
|
35
|
+
export type AdrFolder = 'proposed' | 'implemented' | 'rejected' | 'archived';
|
|
39
36
|
/** Canonical front matter field order; only fields that exist are written. */
|
|
40
|
-
export declare const FRONT_MATTER_ORDER: readonly ['status', 'date', 'raised-by', 'decided-by', 'created', 'commit', 'superseded-by', 'reason', 'tags'];
|
|
41
|
-
/**
|
|
37
|
+
export declare const FRONT_MATTER_ORDER: readonly ['status', 'date', 'raised-by', 'decided-by', 'created', 'commit', 'superseded-by', 'reason', 'archived', 'archive-reason', 'tags'];
|
|
38
|
+
/** File name of a numbered record in implemented/ or archived/: `N-slug.md`. */
|
|
39
|
+
export declare const NUMBERED_FILE_NAME_PATTERN: RegExp;
|
|
40
|
+
/** Sections that only make sense during the proposal era and must not appear in an implemented decision. */
|
|
42
41
|
export declare const PROPOSAL_ERA_HEADINGS: string[];
|
|
43
42
|
/** A `YYYY-MM-DD` date value. Shared by the parser (format) and validate (calendar validity). */
|
|
44
43
|
export declare const DATE_PATTERN: RegExp;
|
|
@@ -58,13 +57,13 @@ export interface AdrRecord {
|
|
|
58
57
|
fileName: string;
|
|
59
58
|
title: string;
|
|
60
59
|
status: AdrStatus;
|
|
61
|
-
/** Date the
|
|
60
|
+
/** Date of the latest lifecycle move, `YYYY-MM-DD` in local time. */
|
|
62
61
|
date: string;
|
|
63
62
|
/**
|
|
64
63
|
* For durable records: who put the decision on the table. The `decided-by`
|
|
65
64
|
* axis turned around: a person may raise what the agent settles, and vice
|
|
66
|
-
* versa. Declared by the writer
|
|
67
|
-
* verified.
|
|
65
|
+
* versa. Declared by the writer on implementation, never inferred or
|
|
66
|
+
* verified. An unshipped proposal never carries it.
|
|
68
67
|
*/
|
|
69
68
|
raisedBy?: RaisedBy;
|
|
70
69
|
/**
|
|
@@ -73,8 +72,8 @@ export interface AdrRecord {
|
|
|
73
72
|
* person's own choice, a proposal they changed into what shipped, and a
|
|
74
73
|
* choice they made earlier that is only now being recorded; `agent` means the
|
|
75
74
|
* direction came from the agent's own judgment, even when a person let it
|
|
76
|
-
* through. Declared by the writer at
|
|
77
|
-
* verified.
|
|
75
|
+
* through. Declared by the writer at record or implement time, never inferred or
|
|
76
|
+
* verified. An unshipped proposal never carries it.
|
|
78
77
|
*/
|
|
79
78
|
decidedBy?: DecidedBy;
|
|
80
79
|
/** Date the record was created; stamped once and never re-stamped, so the
|
|
@@ -84,8 +83,12 @@ export interface AdrRecord {
|
|
|
84
83
|
commit?: string;
|
|
85
84
|
rejectionReason?: string;
|
|
86
85
|
/** For superseded decisions: the number of the decision that replaced this one. */
|
|
87
|
-
/** Immediate historical successor; validation follows the chain to an
|
|
86
|
+
/** Immediate historical successor; validation follows the chain to an implemented record. */
|
|
88
87
|
supersededBy?: number;
|
|
88
|
+
/** Date a shipped record entered frozen history. */
|
|
89
|
+
archived?: string;
|
|
90
|
+
/** Why a shipped record no longer needs to be active guidance. */
|
|
91
|
+
archiveReason?: string;
|
|
89
92
|
/** Optional kebab-case theme keywords; validate checks the shape. */
|
|
90
93
|
tags?: string[];
|
|
91
94
|
number?: number;
|
|
@@ -105,7 +108,7 @@ export declare function hasMeaningfulBody(body: string | undefined): boolean;
|
|
|
105
108
|
* The format is YAML front matter followed by a Markdown body:
|
|
106
109
|
*
|
|
107
110
|
* ---
|
|
108
|
-
* status: proposed |
|
|
111
|
+
* status: proposed | implemented | rejected | superseded
|
|
109
112
|
* date: YYYY-MM-DD
|
|
110
113
|
* raised-by: human | agent (durable records only)
|
|
111
114
|
* decided-by: human | agent (durable records only)
|
|
@@ -118,9 +121,8 @@ export declare function hasMeaningfulBody(body: string | undefined): boolean;
|
|
|
118
121
|
* ## Problem
|
|
119
122
|
* ...
|
|
120
123
|
*
|
|
121
|
-
* The `date` field records the date the
|
|
122
|
-
* stamped by the CLI at every lifecycle move
|
|
123
|
-
* reject, supersede).
|
|
124
|
+
* The `date` field records the date of the latest lifecycle move and is
|
|
125
|
+
* stamped by the CLI at every lifecycle move.
|
|
124
126
|
*/
|
|
125
127
|
export declare function parseAdrFile(filePath: string): AdrRecord;
|
|
126
128
|
//# sourceMappingURL=adr.d.ts.map
|
package/dist/core/adr.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adr.d.ts","sourceRoot":"","sources":["../../src/core/adr.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"adr.d.ts","sourceRoot":"","sources":["../../src/core/adr.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,aAAa,GAAG,UAAU,GAAG,YAAY,CAAC;AAC/E;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,YAAI,OAAO,EAAE,OAAO,CAAU,CAAC;AAC7D;;;;;;;;;;GAUG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,6DAA6D;AAC7D,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAE9D;AACD;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC;AACjC,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE5D;AACD;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,aAAa,GAAG,UAAU,GAAG,UAAU,CAAC;AAE7E,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,YAAI,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,CAAU,CAAC;AAE/K,gFAAgF;AAChF,eAAO,MAAM,0BAA0B,QAAiC,CAAC;AAEzE,4GAA4G;AAC5G,eAAO,MAAM,qBAAqB,UAAyE,CAAC;AAE5G,iGAAiG;AACjG,eAAO,MAAM,YAAY,QAA8B,CAAC;AAExD;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAMnC;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,CAAC;IAClB,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;mDAC+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yFAAyF;IACzF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mFAAmF;IACnF,6FAA6F;IAC7F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,qBAAa,cAAe,SAAQ,KAAK;aAGrB,IAAI,EAAE,MAAM;IAF9B,YACE,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EAI7B;CACF;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE9E;AA0BD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAGnE;AAuCD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CA8MxD"}
|
package/dist/core/adr.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs';
|
|
1
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
2
2
|
import { basename } from 'node:path';
|
|
3
3
|
import { parse } from 'yaml';
|
|
4
4
|
/**
|
|
@@ -16,8 +16,10 @@ export function isRaisedBy(value) {
|
|
|
16
16
|
return isDecidedBy(value);
|
|
17
17
|
}
|
|
18
18
|
/** Canonical front matter field order; only fields that exist are written. */
|
|
19
|
-
export const FRONT_MATTER_ORDER = ['status', 'date', 'raised-by', 'decided-by', 'created', 'commit', 'superseded-by', 'reason', 'tags'];
|
|
20
|
-
/**
|
|
19
|
+
export const FRONT_MATTER_ORDER = ['status', 'date', 'raised-by', 'decided-by', 'created', 'commit', 'superseded-by', 'reason', 'archived', 'archive-reason', 'tags'];
|
|
20
|
+
/** File name of a numbered record in implemented/ or archived/: `N-slug.md`. */
|
|
21
|
+
export const NUMBERED_FILE_NAME_PATTERN = /^[1-9]\d*-[a-z0-9一-鿿-]+\.md$/;
|
|
22
|
+
/** Sections that only make sense during the proposal era and must not appear in an implemented decision. */
|
|
21
23
|
export const PROPOSAL_ERA_HEADINGS = ['Proposal', 'Acceptance criteria', 'Risks', 'Plan', 'Migration plan'];
|
|
22
24
|
/** A `YYYY-MM-DD` date value. Shared by the parser (format) and validate (calendar validity). */
|
|
23
25
|
export const DATE_PATTERN = /^(\d{4})-(\d{2})-(\d{2})$/;
|
|
@@ -44,11 +46,73 @@ export class AdrFormatError extends Error {
|
|
|
44
46
|
export function section(record, heading) {
|
|
45
47
|
return record.sections.find((candidate) => candidate.heading === heading)?.body;
|
|
46
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Text outside HTML comments. The scan walks `indexOf` from each `<!--` to the
|
|
51
|
+
* next `-->` rather than matching a `[\s\S]*?` expression: a marker with no
|
|
52
|
+
* closing tag makes the expression rescan to the end of the body from every
|
|
53
|
+
* position, so a crafted body costs the square of its size (~500 KB took over
|
|
54
|
+
* ten seconds, and multi-megabyte payloads never returned). An unterminated
|
|
55
|
+
* comment swallows the rest of the section, which is CommonMark's reading of a
|
|
56
|
+
* comment block that runs to its end of context.
|
|
57
|
+
*/
|
|
58
|
+
function stripComments(body) {
|
|
59
|
+
const open = '<!--';
|
|
60
|
+
const close = '-->';
|
|
61
|
+
let text = '';
|
|
62
|
+
let index = 0;
|
|
63
|
+
for (;;) {
|
|
64
|
+
const start = body.indexOf(open, index);
|
|
65
|
+
if (start === -1)
|
|
66
|
+
return text + body.slice(index);
|
|
67
|
+
text += body.slice(index, start);
|
|
68
|
+
const end = body.indexOf(close, start + open.length);
|
|
69
|
+
if (end === -1)
|
|
70
|
+
return text;
|
|
71
|
+
index = end + close.length;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
47
74
|
export function hasMeaningfulBody(body) {
|
|
48
75
|
if (body === undefined)
|
|
49
76
|
return false;
|
|
50
|
-
|
|
51
|
-
|
|
77
|
+
return stripComments(body).trim().length > 0;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The kind of a path that is not a regular file, named in the error so the
|
|
81
|
+
* reader learns what is there (`directory`, `fifo`, `character device`).
|
|
82
|
+
*/
|
|
83
|
+
function pathKind(info) {
|
|
84
|
+
if (info.isDirectory())
|
|
85
|
+
return 'directory';
|
|
86
|
+
if (info.isFIFO())
|
|
87
|
+
return 'fifo';
|
|
88
|
+
if (info.isSocket())
|
|
89
|
+
return 'socket';
|
|
90
|
+
if (info.isCharacterDevice())
|
|
91
|
+
return 'character device';
|
|
92
|
+
if (info.isBlockDevice())
|
|
93
|
+
return 'block device';
|
|
94
|
+
return 'special file';
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Read a record's text, refusing a path that does not resolve to a regular
|
|
98
|
+
* file. A FIFO blocks the read until a writer appears and a device (a symlink
|
|
99
|
+
* to `/dev/zero`, which git can carry as mode 120000) reads without end, so the
|
|
100
|
+
* kind is reported instead of read. The check follows symbolic links: a link
|
|
101
|
+
* whose target is a regular file is a record like any other.
|
|
102
|
+
*/
|
|
103
|
+
function readRecordFile(filePath) {
|
|
104
|
+
let info;
|
|
105
|
+
try {
|
|
106
|
+
info = statSync(filePath);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
110
|
+
throw new AdrFormatError(`record path cannot be read: ${detail}`, filePath);
|
|
111
|
+
}
|
|
112
|
+
if (!info.isFile()) {
|
|
113
|
+
throw new AdrFormatError(`record path is not a regular file (${pathKind(info)})`, filePath);
|
|
114
|
+
}
|
|
115
|
+
return readFileSync(filePath, 'utf8');
|
|
52
116
|
}
|
|
53
117
|
/**
|
|
54
118
|
* Parse a single ADR markdown file into its structured parts.
|
|
@@ -56,7 +120,7 @@ export function hasMeaningfulBody(body) {
|
|
|
56
120
|
* The format is YAML front matter followed by a Markdown body:
|
|
57
121
|
*
|
|
58
122
|
* ---
|
|
59
|
-
* status: proposed |
|
|
123
|
+
* status: proposed | implemented | rejected | superseded
|
|
60
124
|
* date: YYYY-MM-DD
|
|
61
125
|
* raised-by: human | agent (durable records only)
|
|
62
126
|
* decided-by: human | agent (durable records only)
|
|
@@ -69,12 +133,11 @@ export function hasMeaningfulBody(body) {
|
|
|
69
133
|
* ## Problem
|
|
70
134
|
* ...
|
|
71
135
|
*
|
|
72
|
-
* The `date` field records the date the
|
|
73
|
-
* stamped by the CLI at every lifecycle move
|
|
74
|
-
* reject, supersede).
|
|
136
|
+
* The `date` field records the date of the latest lifecycle move and is
|
|
137
|
+
* stamped by the CLI at every lifecycle move.
|
|
75
138
|
*/
|
|
76
139
|
export function parseAdrFile(filePath) {
|
|
77
|
-
const text =
|
|
140
|
+
const text = readRecordFile(filePath);
|
|
78
141
|
const lines = text.split(/\r?\n/);
|
|
79
142
|
if (lines[0] !== '---') {
|
|
80
143
|
throw new AdrFormatError('file must start with a YAML front matter block ("---")', filePath);
|
|
@@ -101,10 +164,10 @@ export function parseAdrFile(filePath) {
|
|
|
101
164
|
throw new AdrFormatError('front matter must include "status"', filePath);
|
|
102
165
|
}
|
|
103
166
|
if (statusText !== 'proposed' &&
|
|
104
|
-
statusText !== '
|
|
167
|
+
statusText !== 'implemented' &&
|
|
105
168
|
statusText !== 'rejected' &&
|
|
106
169
|
statusText !== 'superseded') {
|
|
107
|
-
throw new AdrFormatError('status must be "proposed", "
|
|
170
|
+
throw new AdrFormatError('status must be "proposed", "implemented", "rejected", or "superseded"', filePath);
|
|
108
171
|
}
|
|
109
172
|
const status = statusText;
|
|
110
173
|
const dateText = fields['date'];
|
|
@@ -179,6 +242,22 @@ export function parseAdrFile(filePath) {
|
|
|
179
242
|
else if (supersededByField !== undefined) {
|
|
180
243
|
throw new AdrFormatError('"superseded-by" is only allowed when status is "superseded"', filePath);
|
|
181
244
|
}
|
|
245
|
+
let archived;
|
|
246
|
+
const archivedField = fields['archived'];
|
|
247
|
+
if (archivedField !== undefined) {
|
|
248
|
+
if (typeof archivedField !== 'string' || !DATE_PATTERN.test(archivedField)) {
|
|
249
|
+
throw new AdrFormatError('archived must be a "YYYY-MM-DD" string', filePath);
|
|
250
|
+
}
|
|
251
|
+
archived = archivedField;
|
|
252
|
+
}
|
|
253
|
+
let archiveReason;
|
|
254
|
+
const archiveReasonField = fields['archive-reason'];
|
|
255
|
+
if (archiveReasonField !== undefined) {
|
|
256
|
+
if (typeof archiveReasonField !== 'string' || archiveReasonField.trim().length === 0) {
|
|
257
|
+
throw new AdrFormatError('archive-reason must be a non-empty string', filePath);
|
|
258
|
+
}
|
|
259
|
+
archiveReason = archiveReasonField.trim();
|
|
260
|
+
}
|
|
182
261
|
const body = lines.slice(closing + 1);
|
|
183
262
|
if ((body[0] ?? '') !== '') {
|
|
184
263
|
throw new AdrFormatError('front matter must be followed by a blank line', filePath);
|
|
@@ -214,9 +293,9 @@ export function parseAdrFile(filePath) {
|
|
|
214
293
|
sections.push(current);
|
|
215
294
|
const numberMatch = title.match(/^([1-9]\d*)\s+(.+)$/);
|
|
216
295
|
// The parser does not know which folder the file lives in; listRecords and
|
|
217
|
-
//
|
|
296
|
+
// Repository readers set the actual folder after scanning.
|
|
218
297
|
const parsed = {
|
|
219
|
-
folder: '
|
|
298
|
+
folder: 'proposed',
|
|
220
299
|
path: filePath,
|
|
221
300
|
fileName: basename(filePath),
|
|
222
301
|
title,
|
|
@@ -238,6 +317,10 @@ export function parseAdrFile(filePath) {
|
|
|
238
317
|
parsed.rejectionReason = rejectionReason;
|
|
239
318
|
if (supersededBy !== undefined)
|
|
240
319
|
parsed.supersededBy = supersededBy;
|
|
320
|
+
if (archived !== undefined)
|
|
321
|
+
parsed.archived = archived;
|
|
322
|
+
if (archiveReason !== undefined)
|
|
323
|
+
parsed.archiveReason = archiveReason;
|
|
241
324
|
if (extras.length > 0)
|
|
242
325
|
parsed.frontMatterExtras = extras;
|
|
243
326
|
if (numberMatch !== null) {
|
package/dist/core/adr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adr.js","sourceRoot":"","sources":["../../src/core/adr.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"adr.js","sourceRoot":"","sources":["../../src/core/adr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The archive seal. A committed manifest of every numbered record in
|
|
3
|
+
* adr/archived/, one entry per file, appended in archival order. It turns
|
|
4
|
+
* "archived records are frozen history" from a status label into bytes a
|
|
5
|
+
* validator can check: every sealed path names its file's exact content.
|
|
6
|
+
*/
|
|
7
|
+
export declare const MANIFEST_VERSION = 1;
|
|
8
|
+
export declare const ARCHIVED_DIR = "archived";
|
|
9
|
+
export declare const MANIFEST_FILE = "MANIFEST.json";
|
|
10
|
+
export interface ArchiveSeal {
|
|
11
|
+
/** Archive-relative file name, `N-slug.md`. */
|
|
12
|
+
path: string;
|
|
13
|
+
/** SHA-256 of the complete archived file bytes, lowercase hex. */
|
|
14
|
+
sha256: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ArchiveManifest {
|
|
17
|
+
version: number;
|
|
18
|
+
entries: ArchiveSeal[];
|
|
19
|
+
}
|
|
20
|
+
export declare function archivedManifestPath(root: string): string;
|
|
21
|
+
export declare function archivedRecordPath(root: string, fileName: string): string;
|
|
22
|
+
/** Repository-relative display path used in output and validation issues. */
|
|
23
|
+
export declare function sealedDisplayPath(fileName: string): string;
|
|
24
|
+
export declare function emptyArchiveManifest(): ArchiveManifest;
|
|
25
|
+
export declare function sealBytes(bytes: string | Buffer): string;
|
|
26
|
+
/**
|
|
27
|
+
* Parse manifest text. Every structural problem throws naming `source`, so
|
|
28
|
+
* validate can report the manifest as malformed and the archive commands can
|
|
29
|
+
* preflight it before any file moves.
|
|
30
|
+
*/
|
|
31
|
+
export declare function parseArchiveManifest(text: string, source: string): ArchiveManifest;
|
|
32
|
+
/** Read and parse the repository's manifest, or undefined when absent. */
|
|
33
|
+
export declare function readArchiveManifest(root: string): ArchiveManifest | undefined;
|
|
34
|
+
export declare function writeArchiveManifest(root: string, manifest: ArchiveManifest): void;
|
|
35
|
+
/**
|
|
36
|
+
* Append one seal to a parsed manifest, refusing a second seal for the same
|
|
37
|
+
* file: overwriting a seal would launder a change to archived bytes. Returns
|
|
38
|
+
* a new manifest; callers own writing it to disk.
|
|
39
|
+
*/
|
|
40
|
+
export declare function appendSeal(manifest: ArchiveManifest, fileName: string, sha256: string): ArchiveManifest;
|
|
41
|
+
/**
|
|
42
|
+
* Existing seals that no longer match their archived files. archive/supersede
|
|
43
|
+
* preflight this so a drifted manifest is refused instead of compounded: the
|
|
44
|
+
* design forbids re-sealing changed bytes, so appending on top of drift would
|
|
45
|
+
* cost the operator a manual repair.
|
|
46
|
+
*/
|
|
47
|
+
export declare function driftedSeals(root: string, manifest: ArchiveManifest): string[];
|
|
48
|
+
//# sourceMappingURL=archive-seal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive-seal.d.ts","sourceRoot":"","sources":["../../src/core/archive-seal.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,YAAY,aAAa,CAAC;AACvC,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAE7C,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,oBAAoB,IAAI,eAAe,CAEtD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAExD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CA6ClF;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAO7E;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI,CAElF;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CAKvG;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,MAAM,EAAE,CAa9E"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { NUMBERED_FILE_NAME_PATTERN } from './adr.js';
|
|
5
|
+
import { ADR_DIR } from './config.js';
|
|
6
|
+
/**
|
|
7
|
+
* The archive seal. A committed manifest of every numbered record in
|
|
8
|
+
* adr/archived/, one entry per file, appended in archival order. It turns
|
|
9
|
+
* "archived records are frozen history" from a status label into bytes a
|
|
10
|
+
* validator can check: every sealed path names its file's exact content.
|
|
11
|
+
*/
|
|
12
|
+
export const MANIFEST_VERSION = 1;
|
|
13
|
+
export const ARCHIVED_DIR = 'archived';
|
|
14
|
+
export const MANIFEST_FILE = 'MANIFEST.json';
|
|
15
|
+
export function archivedManifestPath(root) {
|
|
16
|
+
return join(root, ADR_DIR, ARCHIVED_DIR, MANIFEST_FILE);
|
|
17
|
+
}
|
|
18
|
+
export function archivedRecordPath(root, fileName) {
|
|
19
|
+
return join(root, ADR_DIR, ARCHIVED_DIR, fileName);
|
|
20
|
+
}
|
|
21
|
+
/** Repository-relative display path used in output and validation issues. */
|
|
22
|
+
export function sealedDisplayPath(fileName) {
|
|
23
|
+
return `${ADR_DIR}/${ARCHIVED_DIR}/${fileName}`;
|
|
24
|
+
}
|
|
25
|
+
export function emptyArchiveManifest() {
|
|
26
|
+
return { version: MANIFEST_VERSION, entries: [] };
|
|
27
|
+
}
|
|
28
|
+
export function sealBytes(bytes) {
|
|
29
|
+
return createHash('sha256').update(bytes).digest('hex');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Parse manifest text. Every structural problem throws naming `source`, so
|
|
33
|
+
* validate can report the manifest as malformed and the archive commands can
|
|
34
|
+
* preflight it before any file moves.
|
|
35
|
+
*/
|
|
36
|
+
export function parseArchiveManifest(text, source) {
|
|
37
|
+
let parsed;
|
|
38
|
+
try {
|
|
39
|
+
parsed = JSON.parse(text);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
43
|
+
throw new Error(`${source} is not valid JSON: ${detail}`);
|
|
44
|
+
}
|
|
45
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
46
|
+
throw new Error(`${source} must be a JSON object`);
|
|
47
|
+
}
|
|
48
|
+
const fields = parsed;
|
|
49
|
+
if (fields['version'] !== MANIFEST_VERSION) {
|
|
50
|
+
throw new Error(`${source} must carry "version": ${MANIFEST_VERSION}`);
|
|
51
|
+
}
|
|
52
|
+
const entries = fields['entries'];
|
|
53
|
+
if (!Array.isArray(entries)) {
|
|
54
|
+
throw new Error(`${source} must carry an "entries" array`);
|
|
55
|
+
}
|
|
56
|
+
const seen = new Set();
|
|
57
|
+
const seals = [];
|
|
58
|
+
for (const entry of entries) {
|
|
59
|
+
if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) {
|
|
60
|
+
throw new Error(`${source} entries must be objects`);
|
|
61
|
+
}
|
|
62
|
+
const entryFields = entry;
|
|
63
|
+
const path = entryFields['path'];
|
|
64
|
+
// The numbered-record pattern already excludes separators and `..`, so a
|
|
65
|
+
// manifest entry can only ever name a file directly inside archived/.
|
|
66
|
+
if (typeof path !== 'string' || !NUMBERED_FILE_NAME_PATTERN.test(path)) {
|
|
67
|
+
throw new Error(`${source} entries must carry an archive-relative "path" like "N-slug.md", got ${JSON.stringify(path ?? null)}`);
|
|
68
|
+
}
|
|
69
|
+
const sha256 = entryFields['sha256'];
|
|
70
|
+
if (typeof sha256 !== 'string' || !/^[0-9a-f]{64}$/.test(sha256)) {
|
|
71
|
+
throw new Error(`${source} entry "${path}" must carry a hex SHA-256 "sha256"`);
|
|
72
|
+
}
|
|
73
|
+
if (seen.has(path)) {
|
|
74
|
+
throw new Error(`${source} seals "${path}" more than once`);
|
|
75
|
+
}
|
|
76
|
+
seen.add(path);
|
|
77
|
+
seals.push({ path, sha256 });
|
|
78
|
+
}
|
|
79
|
+
return { version: MANIFEST_VERSION, entries: seals };
|
|
80
|
+
}
|
|
81
|
+
/** Read and parse the repository's manifest, or undefined when absent. */
|
|
82
|
+
export function readArchiveManifest(root) {
|
|
83
|
+
const path = archivedManifestPath(root);
|
|
84
|
+
if (!existsSync(path))
|
|
85
|
+
return undefined;
|
|
86
|
+
return parseArchiveManifest(readFileSync(path, 'utf8'), `${ADR_DIR}/${ARCHIVED_DIR}/${MANIFEST_FILE}`);
|
|
87
|
+
}
|
|
88
|
+
export function writeArchiveManifest(root, manifest) {
|
|
89
|
+
writeFileSync(archivedManifestPath(root), `${JSON.stringify(manifest, null, 2)}\n`);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Append one seal to a parsed manifest, refusing a second seal for the same
|
|
93
|
+
* file: overwriting a seal would launder a change to archived bytes. Returns
|
|
94
|
+
* a new manifest; callers own writing it to disk.
|
|
95
|
+
*/
|
|
96
|
+
export function appendSeal(manifest, fileName, sha256) {
|
|
97
|
+
if (manifest.entries.some((entry) => entry.path === fileName)) {
|
|
98
|
+
throw new Error(`the archive manifest already seals ${fileName}`);
|
|
99
|
+
}
|
|
100
|
+
return { version: manifest.version, entries: [...manifest.entries, { path: fileName, sha256 }] };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Existing seals that no longer match their archived files. archive/supersede
|
|
104
|
+
* preflight this so a drifted manifest is refused instead of compounded: the
|
|
105
|
+
* design forbids re-sealing changed bytes, so appending on top of drift would
|
|
106
|
+
* cost the operator a manual repair.
|
|
107
|
+
*/
|
|
108
|
+
export function driftedSeals(root, manifest) {
|
|
109
|
+
const problems = [];
|
|
110
|
+
for (const entry of manifest.entries) {
|
|
111
|
+
const path = archivedRecordPath(root, entry.path);
|
|
112
|
+
if (!existsSync(path)) {
|
|
113
|
+
problems.push(`${sealedDisplayPath(entry.path)}: sealed in the manifest but missing from archived/`);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (sealBytes(readFileSync(path)) !== entry.sha256) {
|
|
117
|
+
problems.push(`${sealedDisplayPath(entry.path)}: archived bytes no longer match the seal`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return problems;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=archive-seal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive-seal.js","sourceRoot":"","sources":["../../src/core/archive-seal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;AACvC,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAc7C,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,QAAgB;IAC/D,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,GAAG,OAAO,IAAI,YAAY,IAAI,QAAQ,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAsB;IAC9C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,MAAc;IAC/D,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,uBAAuB,MAAM,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,wBAAwB,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,MAAM,GAAG,MAAiC,CAAC;IACjD,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,gBAAgB,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,0BAA0B,gBAAgB,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,gCAAgC,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,0BAA0B,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,WAAW,GAAG,KAAgC,CAAC;QACrD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,yEAAyE;QACzE,sEAAsE;QACtE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvE,MAAM,IAAI,KAAK,CACb,GAAG,MAAM,wEAAwE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAChH,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,WAAW,IAAI,qCAAqC,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,WAAW,IAAI,kBAAkB,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACvD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,OAAO,oBAAoB,CACzB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAC1B,GAAG,OAAO,IAAI,YAAY,IAAI,aAAa,EAAE,CAC9C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,QAAyB;IAC1E,aAAa,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACtF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,QAAyB,EAAE,QAAgB,EAAE,MAAc;IACpF,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACnG,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,QAAyB;IAClE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;YACrG,SAAS;QACX,CAAC;QACD,IAAI,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;YACnD,QAAQ,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* `src/commands/completion.ts` uses it to offer the same options, so the two
|
|
5
5
|
* cannot drift apart. Update this table whenever the CLI surface changes.
|
|
6
6
|
*/
|
|
7
|
-
export declare const COMMANDS: readonly ['init', 'propose', '
|
|
7
|
+
export declare const COMMANDS: readonly ['init', 'propose', 'record', 'implement', 'reject', 'archive', 'supersede', 'list', 'show', 'status', 'instructions', 'validate', 'update', 'config', 'graph', 'tree', 'completion', 'version', 'help'];
|
|
8
8
|
/**
|
|
9
9
|
* Options each command accepts, spelled with their leading dashes. `--help` is
|
|
10
10
|
* valid everywhere; the global `--version` never reaches a command because the
|
|
@@ -16,7 +16,7 @@ export declare const COMMAND_OPTIONS: Record<string, string[]>;
|
|
|
16
16
|
* valueless would make every shell treat them as flags, so completion would
|
|
17
17
|
* repeat the option list where the CLI expects free text.
|
|
18
18
|
*/
|
|
19
|
-
export declare const VALUE_OPTIONS: readonly ['--by', '--reason', '--tag', '--tools', '--workflows', '--out'];
|
|
19
|
+
export declare const VALUE_OPTIONS: readonly ['--base', '--by', '--reason', '--tag', '--tools', '--workflows', '--out'];
|
|
20
20
|
export declare function takesValue(option: string): boolean;
|
|
21
21
|
/** Options supplied for a `command` that its synopsis does not list. */
|
|
22
22
|
export declare function unsupportedOptions(command: string, supplied: readonly string[]): string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-options.d.ts","sourceRoot":"","sources":["../../src/core/cli-options.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,QAAQ,YACnB,MAAM,EACN,SAAS,EACT,QAAQ,EACR,
|
|
1
|
+
{"version":3,"file":"cli-options.d.ts","sourceRoot":"","sources":["../../src/core/cli-options.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,QAAQ,YACnB,MAAM,EACN,SAAS,EACT,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,SAAS,EACT,WAAW,EACX,MAAM,EACN,MAAM,EACN,QAAQ,EACR,cAAc,EACd,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,MAAM,EACN,YAAY,EACZ,SAAS,EACT,MAAM,CACE,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAoBpD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,YAAI,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,CAAU,CAAC;AAEjH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAKzF"}
|
package/dist/core/cli-options.js
CHANGED
|
@@ -7,9 +7,10 @@
|
|
|
7
7
|
export const COMMANDS = [
|
|
8
8
|
'init',
|
|
9
9
|
'propose',
|
|
10
|
-
'
|
|
11
|
-
'
|
|
10
|
+
'record',
|
|
11
|
+
'implement',
|
|
12
12
|
'reject',
|
|
13
|
+
'archive',
|
|
13
14
|
'supersede',
|
|
14
15
|
'list',
|
|
15
16
|
'show',
|
|
@@ -32,15 +33,16 @@ export const COMMANDS = [
|
|
|
32
33
|
export const COMMAND_OPTIONS = {
|
|
33
34
|
init: ['--tools', '--workflows', '--help'],
|
|
34
35
|
propose: ['--help'],
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
record: ['--raised-by', '--decided-by', '--help'],
|
|
37
|
+
implement: ['--raised-by', '--decided-by', '--help'],
|
|
37
38
|
reject: ['--reason', '--help'],
|
|
39
|
+
archive: ['--reason', '--help'],
|
|
38
40
|
supersede: ['--by', '--help'],
|
|
39
41
|
list: ['--help'],
|
|
40
42
|
show: ['--help'],
|
|
41
43
|
status: ['--help'],
|
|
42
44
|
instructions: ['--help'],
|
|
43
|
-
validate: ['--all', '--help'],
|
|
45
|
+
validate: ['--all', '--base', '--help'],
|
|
44
46
|
update: ['--tools', '--workflows', '--help'],
|
|
45
47
|
config: ['--help'],
|
|
46
48
|
graph: ['--mermaid', '--dot', '--text', '--html', '--formal-only', '--tag', '--out', '--help'],
|
|
@@ -54,7 +56,7 @@ export const COMMAND_OPTIONS = {
|
|
|
54
56
|
* valueless would make every shell treat them as flags, so completion would
|
|
55
57
|
* repeat the option list where the CLI expects free text.
|
|
56
58
|
*/
|
|
57
|
-
export const VALUE_OPTIONS = ['--by', '--reason', '--tag', '--tools', '--workflows', '--out'];
|
|
59
|
+
export const VALUE_OPTIONS = ['--base', '--by', '--reason', '--tag', '--tools', '--workflows', '--out'];
|
|
58
60
|
export function takesValue(option) {
|
|
59
61
|
return VALUE_OPTIONS.includes(option);
|
|
60
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-options.js","sourceRoot":"","sources":["../../src/core/cli-options.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,MAAM;IACN,SAAS;IACT,QAAQ;IACR,
|
|
1
|
+
{"version":3,"file":"cli-options.js","sourceRoot":"","sources":["../../src/core/cli-options.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,MAAM;IACN,SAAS;IACT,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,SAAS;IACT,WAAW;IACX,MAAM;IACN,MAAM;IACN,QAAQ;IACR,cAAc;IACd,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;IACN,YAAY;IACZ,SAAS;IACT,MAAM;CACE,CAAC;AAEX;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAA6B;IACvD,IAAI,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,CAAC;IAC1C,OAAO,EAAE,CAAC,QAAQ,CAAC;IACnB,MAAM,EAAE,CAAC,aAAa,EAAE,cAAc,EAAE,QAAQ,CAAC;IACjD,SAAS,EAAE,CAAC,aAAa,EAAE,cAAc,EAAE,QAAQ,CAAC;IACpD,MAAM,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC;IAC9B,OAAO,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC;IAC/B,SAAS,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC7B,IAAI,EAAE,CAAC,QAAQ,CAAC;IAChB,IAAI,EAAE,CAAC,QAAQ,CAAC;IAChB,MAAM,EAAE,CAAC,QAAQ,CAAC;IAClB,YAAY,EAAE,CAAC,QAAQ,CAAC;IACxB,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC;IACvC,MAAM,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,CAAC;IAC5C,MAAM,EAAE,CAAC,QAAQ,CAAC;IAClB,KAAK,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC;IAC9F,IAAI,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;IACjD,UAAU,EAAE,CAAC,QAAQ,CAAC;IACtB,OAAO,EAAE,CAAC,QAAQ,CAAC;IACnB,IAAI,EAAE,CAAC,QAAQ,CAAC;CACjB,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,CAAU,CAAC;AAEjH,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAQ,aAAmC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,QAA2B;IAC7E,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7B,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACvD,CAAC"}
|
package/dist/core/config.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export interface AdrKitConfig {
|
|
|
7
7
|
rules?: Record<string, string[]>;
|
|
8
8
|
/** AI tool integrations selected at init time, e.g. `["claude", "codex"]`. */
|
|
9
9
|
tools?: string[];
|
|
10
|
-
/** Workflow subset for integrations, e.g. `["init", "
|
|
10
|
+
/** Workflow subset for integrations, e.g. `["init", "record", "validate"]`. */
|
|
11
11
|
workflows?: string[];
|
|
12
12
|
/** Version of the CLI that last wrote the integrations; absent before this stamp existed. */
|
|
13
13
|
installedWith?: string;
|
package/dist/core/git.d.ts
CHANGED
|
@@ -6,4 +6,21 @@
|
|
|
6
6
|
* failure. Callers stamp `commit` into the front matter only when defined.
|
|
7
7
|
*/
|
|
8
8
|
export declare function gitHead(cwd: string): string | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* True when `ref` resolves in the repository containing `cwd`. Base-aware
|
|
11
|
+
* validation needs the distinction between "ref unreadable" (fail loudly)
|
|
12
|
+
* and "file absent at ref" (a legitimate no-prior-seals state), so the two
|
|
13
|
+
* checks stay separate.
|
|
14
|
+
*/
|
|
15
|
+
export declare function gitRefExists(cwd: string, ref: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* True when `ref:path` names an entry at `ref`. Base-aware validation needs
|
|
18
|
+
* this to separate two states that look identical to a plain read: the path
|
|
19
|
+
* is absent at the base (a legitimate no-prior-seals state) versus the path
|
|
20
|
+
* exists there but its content cannot be read (a real error that must fail
|
|
21
|
+
* rather than be skipped).
|
|
22
|
+
*/
|
|
23
|
+
export declare function gitPathExists(cwd: string, ref: string, filePath: string): boolean;
|
|
24
|
+
/** A file's content at a git ref, or undefined when it does not exist there. */
|
|
25
|
+
export declare function gitShow(cwd: string, ref: string, filePath: string): string | undefined;
|
|
9
26
|
//# sourceMappingURL=git.d.ts.map
|