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.
Files changed (96) hide show
  1. package/README.md +62 -209
  2. package/README.zh.md +54 -174
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +40 -25
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/archive.d.ts +2 -0
  7. package/dist/commands/archive.d.ts.map +1 -0
  8. package/dist/commands/archive.js +62 -0
  9. package/dist/commands/archive.js.map +1 -0
  10. package/dist/commands/completion.d.ts.map +1 -1
  11. package/dist/commands/completion.js +5 -4
  12. package/dist/commands/completion.js.map +1 -1
  13. package/dist/commands/{accept.d.ts → implement.d.ts} +2 -2
  14. package/dist/commands/implement.d.ts.map +1 -0
  15. package/dist/commands/implement.js +42 -0
  16. package/dist/commands/implement.js.map +1 -0
  17. package/dist/commands/init.d.ts.map +1 -1
  18. package/dist/commands/init.js +5 -3
  19. package/dist/commands/init.js.map +1 -1
  20. package/dist/commands/instructions.d.ts.map +1 -1
  21. package/dist/commands/instructions.js +24 -81
  22. package/dist/commands/instructions.js.map +1 -1
  23. package/dist/commands/list.d.ts.map +1 -1
  24. package/dist/commands/list.js +9 -14
  25. package/dist/commands/list.js.map +1 -1
  26. package/dist/commands/propose.d.ts.map +1 -1
  27. package/dist/commands/propose.js +9 -10
  28. package/dist/commands/propose.js.map +1 -1
  29. package/dist/commands/{decide.d.ts → record.d.ts} +2 -2
  30. package/dist/commands/record.d.ts.map +1 -0
  31. package/dist/commands/{decide.js → record.js} +6 -6
  32. package/dist/commands/{decide.js.map → record.js.map} +1 -1
  33. package/dist/commands/reject.d.ts +1 -1
  34. package/dist/commands/reject.d.ts.map +1 -1
  35. package/dist/commands/reject.js +24 -8
  36. package/dist/commands/reject.js.map +1 -1
  37. package/dist/commands/show.d.ts.map +1 -1
  38. package/dist/commands/show.js +2 -16
  39. package/dist/commands/show.js.map +1 -1
  40. package/dist/commands/status.d.ts.map +1 -1
  41. package/dist/commands/status.js +6 -17
  42. package/dist/commands/status.js.map +1 -1
  43. package/dist/commands/supersede.d.ts.map +1 -1
  44. package/dist/commands/supersede.js +44 -10
  45. package/dist/commands/supersede.js.map +1 -1
  46. package/dist/commands/update.d.ts.map +1 -1
  47. package/dist/commands/update.js +4 -1
  48. package/dist/commands/update.js.map +1 -1
  49. package/dist/commands/validate.d.ts +1 -1
  50. package/dist/commands/validate.d.ts.map +1 -1
  51. package/dist/commands/validate.js +11 -3
  52. package/dist/commands/validate.js.map +1 -1
  53. package/dist/core/adr.d.ts +22 -20
  54. package/dist/core/adr.d.ts.map +1 -1
  55. package/dist/core/adr.js +97 -14
  56. package/dist/core/adr.js.map +1 -1
  57. package/dist/core/archive-seal.d.ts +48 -0
  58. package/dist/core/archive-seal.d.ts.map +1 -0
  59. package/dist/core/archive-seal.js +122 -0
  60. package/dist/core/archive-seal.js.map +1 -0
  61. package/dist/core/cli-options.d.ts +2 -2
  62. package/dist/core/cli-options.d.ts.map +1 -1
  63. package/dist/core/cli-options.js +8 -6
  64. package/dist/core/cli-options.js.map +1 -1
  65. package/dist/core/config.d.ts +1 -1
  66. package/dist/core/git.d.ts +17 -0
  67. package/dist/core/git.d.ts.map +1 -1
  68. package/dist/core/git.js +50 -0
  69. package/dist/core/git.js.map +1 -1
  70. package/dist/core/graph-html.js +5 -5
  71. package/dist/core/graph-html.js.map +1 -1
  72. package/dist/core/graph.d.ts +2 -1
  73. package/dist/core/graph.d.ts.map +1 -1
  74. package/dist/core/graph.js +9 -4
  75. package/dist/core/graph.js.map +1 -1
  76. package/dist/core/repository.d.ts +3 -11
  77. package/dist/core/repository.d.ts.map +1 -1
  78. package/dist/core/repository.js +52 -136
  79. package/dist/core/repository.js.map +1 -1
  80. package/dist/core/templates.d.ts +6 -7
  81. package/dist/core/templates.d.ts.map +1 -1
  82. package/dist/core/templates.js +11 -12
  83. package/dist/core/templates.js.map +1 -1
  84. package/dist/core/tool-integrations.d.ts +24 -0
  85. package/dist/core/tool-integrations.d.ts.map +1 -1
  86. package/dist/core/tool-integrations.js +129 -423
  87. package/dist/core/tool-integrations.js.map +1 -1
  88. package/dist/core/validate.d.ts +20 -6
  89. package/dist/core/validate.d.ts.map +1 -1
  90. package/dist/core/validate.js +302 -90
  91. package/dist/core/validate.js.map +1 -1
  92. package/package.json +1 -1
  93. package/dist/commands/accept.d.ts.map +0 -1
  94. package/dist/commands/accept.js +0 -42
  95. package/dist/commands/accept.js.map +0 -1
  96. package/dist/commands/decide.d.ts.map +0 -1
@@ -1,4 +1,4 @@
1
- export type AdrStatus = 'proposed' | 'accepted' | 'rejected' | 'superseded';
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 by the writer at decide or accept time, never inferred; a draft
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 durable records folder (`decisions/`) and the ephemeral drafts folder
34
- * (`adr/.drafts/`). Status is never implied by location: durable records carry
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 = 'decisions' | 'drafts';
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
- /** Sections that only make sense during the proposal era and must not appear in an accepted decision. */
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 current status was recorded, `YYYY-MM-DD` in local time. */
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 at decide or accept time, never inferred or
67
- * verified. A draft never carries it.
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 decide or accept time, never inferred or
77
- * verified. A draft never carries it (see the proposal-era rules in validate).
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 accepted record. */
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 | accepted | rejected | superseded
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 current status was reached and is
122
- * stamped by the CLI at every lifecycle move (propose, decide, accept,
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
@@ -1 +1 @@
1
- {"version":3,"file":"adr.d.ts","sourceRoot":"","sources":["../../src/core/adr.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;AAC5E;;;;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;;;;;;GAMG;AACH,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC;AACjC,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE5D;AACD;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE/C,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,YAAI,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC;AAEjJ,yGAAyG;AACzG,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,wEAAwE;IACxE,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,0FAA0F;IAC1F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,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;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAInE;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CA2LxD"}
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
- /** Sections that only make sense during the proposal era and must not appear in an accepted decision. */
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
- const withoutComments = body.replace(/<!--[\s\S]*?-->/g, '');
51
- return withoutComments.trim().length > 0;
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 | accepted | rejected | superseded
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 current status was reached and is
73
- * stamped by the CLI at every lifecycle move (propose, decide, accept,
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 = readFileSync(filePath, 'utf8');
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 !== 'accepted' &&
167
+ statusText !== 'implemented' &&
105
168
  statusText !== 'rejected' &&
106
169
  statusText !== 'superseded') {
107
- throw new AdrFormatError('status must be "proposed", "accepted", "rejected", or "superseded"', filePath);
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
- // listDrafts set `folder` after scanning. 'decisions' is a neutral placeholder.
296
+ // Repository readers set the actual folder after scanning.
218
297
  const parsed = {
219
- folder: 'decisions',
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) {
@@ -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":"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"}
@@ -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', 'decide', 'accept', 'reject', 'supersede', 'list', 'show', 'status', 'instructions', 'validate', 'update', 'config', 'graph', 'tree', 'completion', 'version', 'help'];
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,QAAQ,EACR,QAAQ,EACR,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,CAmBpD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,YAAI,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,CAAU,CAAC;AAEvG,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"}
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"}
@@ -7,9 +7,10 @@
7
7
  export const COMMANDS = [
8
8
  'init',
9
9
  'propose',
10
- 'decide',
11
- 'accept',
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
- decide: ['--raised-by', '--decided-by', '--help'],
36
- accept: ['--raised-by', '--decided-by', '--help'],
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,QAAQ;IACR,QAAQ;IACR,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,MAAM,EAAE,CAAC,aAAa,EAAE,cAAc,EAAE,QAAQ,CAAC;IACjD,MAAM,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC;IAC9B,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,CAAC;IAC7B,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,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,CAAU,CAAC;AAEvG,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"}
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"}
@@ -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", "decide", "validate"]`. */
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;
@@ -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