adr-kit 0.2.4 → 0.2.6
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/LICENSE +1 -1
- package/README.md +57 -45
- package/README.zh.md +53 -41
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +10 -11
- package/dist/cli.js.map +1 -1
- package/dist/commands/accept.d.ts.map +1 -1
- package/dist/commands/accept.js +12 -14
- package/dist/commands/accept.js.map +1 -1
- package/dist/commands/decide.d.ts.map +1 -1
- package/dist/commands/decide.js +3 -2
- package/dist/commands/decide.js.map +1 -1
- package/dist/commands/init.js +2 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/instructions.d.ts.map +1 -1
- package/dist/commands/instructions.js +24 -25
- package/dist/commands/instructions.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +14 -14
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/propose.d.ts.map +1 -1
- package/dist/commands/propose.js +12 -5
- package/dist/commands/propose.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 +8 -19
- package/dist/commands/reject.js.map +1 -1
- package/dist/commands/show.d.ts.map +1 -1
- package/dist/commands/show.js +16 -2
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +15 -14
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/supersede.d.ts.map +1 -1
- package/dist/commands/supersede.js +14 -5
- package/dist/commands/supersede.js.map +1 -1
- package/dist/core/adr.d.ts +24 -9
- package/dist/core/adr.d.ts.map +1 -1
- package/dist/core/adr.js +97 -65
- package/dist/core/adr.js.map +1 -1
- package/dist/core/git.d.ts +9 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +22 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/repository.d.ts +11 -0
- package/dist/core/repository.d.ts.map +1 -1
- package/dist/core/repository.js +95 -18
- package/dist/core/repository.js.map +1 -1
- package/dist/core/templates.d.ts +18 -10
- package/dist/core/templates.d.ts.map +1 -1
- package/dist/core/templates.js +65 -41
- package/dist/core/templates.js.map +1 -1
- package/dist/core/tool-integrations.d.ts.map +1 -1
- package/dist/core/tool-integrations.js +38 -30
- package/dist/core/tool-integrations.js.map +1 -1
- package/dist/core/validate.d.ts +7 -1
- package/dist/core/validate.d.ts.map +1 -1
- package/dist/core/validate.js +109 -97
- package/dist/core/validate.js.map +1 -1
- package/package.json +3 -2
package/dist/core/templates.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { parse, stringify } from 'yaml';
|
|
2
|
+
import { FRONT_MATTER_ORDER, PROPOSAL_ERA_HEADINGS, section, todayStamp, } from './adr.js';
|
|
2
3
|
/** Proposal sections that survive the mechanical accept rewrite. */
|
|
3
4
|
const PRESERVED_SECTIONS = [
|
|
4
5
|
'Problem',
|
|
@@ -29,10 +30,23 @@ ${text}
|
|
|
29
30
|
-->
|
|
30
31
|
`;
|
|
31
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Render a YAML front matter block. Fields are written in the canonical
|
|
35
|
+
* order (status, date, commit, reason, superseded-by); only the fields
|
|
36
|
+
* present in `fields` are emitted.
|
|
37
|
+
*/
|
|
38
|
+
export function frontMatter(fields) {
|
|
39
|
+
const ordered = {};
|
|
40
|
+
for (const key of FRONT_MATTER_ORDER) {
|
|
41
|
+
const value = fields[key];
|
|
42
|
+
if (value !== undefined)
|
|
43
|
+
ordered[key] = value;
|
|
44
|
+
}
|
|
45
|
+
return `---\n${stringify(ordered)}---\n`;
|
|
46
|
+
}
|
|
32
47
|
export function proposalTemplate(title, context) {
|
|
33
|
-
return
|
|
34
|
-
|
|
35
|
-
Date: ${todayStamp()}
|
|
48
|
+
return `${frontMatter({ status: 'proposed', date: todayStamp() })}
|
|
49
|
+
# ADR: ${title}
|
|
36
50
|
|
|
37
51
|
${contextBlock(context)}## Problem
|
|
38
52
|
|
|
@@ -56,10 +70,12 @@ ${contextBlock(context)}## Problem
|
|
|
56
70
|
<!-- What could go wrong, and what the change knowingly gives up. -->
|
|
57
71
|
`;
|
|
58
72
|
}
|
|
59
|
-
export function decisionTemplate(number, title, context) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
73
|
+
export function decisionTemplate(number, title, context, commit) {
|
|
74
|
+
const fields = { status: 'accepted', date: todayStamp() };
|
|
75
|
+
if (commit !== undefined)
|
|
76
|
+
fields.commit = commit;
|
|
77
|
+
return `${frontMatter(fields)}
|
|
78
|
+
# ADR: ${number} ${title}
|
|
63
79
|
|
|
64
80
|
${contextBlock(context)}## Problem
|
|
65
81
|
|
|
@@ -79,30 +95,13 @@ ${contextBlock(context)}## Problem
|
|
|
79
95
|
<!-- What the trade-off cost and bought. -->
|
|
80
96
|
`;
|
|
81
97
|
}
|
|
82
|
-
export function rejectedTemplate(title, reason) {
|
|
83
|
-
return `# ADR: ${title}
|
|
84
|
-
Status: rejected — ${reason}
|
|
85
|
-
Date: ${todayStamp()}
|
|
86
|
-
|
|
87
|
-
## Problem
|
|
88
|
-
|
|
89
|
-
<!-- What problem or opportunity was this proposal addressing? -->
|
|
90
|
-
|
|
91
|
-
## Proposal
|
|
92
|
-
|
|
93
|
-
<!-- The rejected proposal. -->
|
|
94
|
-
|
|
95
|
-
## Alternatives considered
|
|
96
|
-
|
|
97
|
-
<!-- Each genuine alternative and why it lost. -->
|
|
98
|
-
`;
|
|
99
|
-
}
|
|
100
98
|
/**
|
|
101
|
-
* Convert a proposal into an accepted decision using the same mechanical
|
|
99
|
+
* Convert a draft proposal into an accepted decision using the same mechanical
|
|
102
100
|
* rewrite the format requires: Proposal becomes Decision, and the
|
|
103
|
-
* acceptance criteria and risks are folded into Consequences.
|
|
101
|
+
* acceptance criteria and risks are folded into Consequences. `commit` anchors
|
|
102
|
+
* the decision to the code state it was recorded against.
|
|
104
103
|
*/
|
|
105
|
-
export function proposalToDecision(proposal, number) {
|
|
104
|
+
export function proposalToDecision(proposal, number, commit) {
|
|
106
105
|
const problem = sectionBody(proposal, 'Problem');
|
|
107
106
|
const decision = sectionBody(proposal, 'Proposal');
|
|
108
107
|
const alternatives = sectionBody(proposal, 'Alternatives considered');
|
|
@@ -124,9 +123,11 @@ export function proposalToDecision(proposal, number) {
|
|
|
124
123
|
// being dropped: a lifecycle move must never lose written content silently.
|
|
125
124
|
const passthrough = proposal.sections.filter((candidate) => !PRESERVED_SECTIONS.includes(candidate.heading) &&
|
|
126
125
|
!DROPPED_SECTION_HEADINGS.includes(candidate.heading));
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
126
|
+
const fields = { status: 'accepted', date: todayStamp() };
|
|
127
|
+
if (commit !== undefined)
|
|
128
|
+
fields.commit = commit;
|
|
129
|
+
let output = `${frontMatter(fields)}
|
|
130
|
+
# ADR: ${number} ${proposal.title}
|
|
130
131
|
|
|
131
132
|
## Problem
|
|
132
133
|
|
|
@@ -165,15 +166,38 @@ export function droppedSections(proposal) {
|
|
|
165
166
|
.filter((heading) => DROPPED_SECTION_HEADINGS.includes(heading));
|
|
166
167
|
}
|
|
167
168
|
/**
|
|
168
|
-
* Rewrite a record's
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
169
|
+
* Rewrite a record's front matter for a lifecycle move: parse the existing
|
|
170
|
+
* block, merge `patch` over it, and re-emit the fields in canonical order.
|
|
171
|
+
* Every non-creating move (accept, reject, supersede) must stamp the date so
|
|
172
|
+
* the front matter always reflects the current status; the Markdown body is
|
|
173
|
+
* left untouched. Unknown keys are preserved after the canonical ones so a
|
|
174
|
+
* mechanical rewrite never loses data silently (validate flags them).
|
|
172
175
|
*/
|
|
173
|
-
export function stampLifecycleMove(content,
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
176
|
+
export function stampLifecycleMove(content, patch) {
|
|
177
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
178
|
+
if (match === null) {
|
|
179
|
+
throw new Error('record has no YAML front matter block');
|
|
180
|
+
}
|
|
181
|
+
const existing = parse(match[1] ?? '');
|
|
182
|
+
const merged = {};
|
|
183
|
+
for (const key of FRONT_MATTER_ORDER) {
|
|
184
|
+
const patched = patch[key];
|
|
185
|
+
if (patched !== undefined) {
|
|
186
|
+
merged[key] = patched;
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
const kept = existing[key];
|
|
190
|
+
if (typeof kept === 'string' || typeof kept === 'number') {
|
|
191
|
+
merged[key] = kept;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
for (const [key, value] of Object.entries(existing)) {
|
|
195
|
+
if (FRONT_MATTER_ORDER.includes(key))
|
|
196
|
+
continue;
|
|
197
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
198
|
+
merged[key] = value;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return `---\n${stringify(merged)}---${content.slice(match[0].length)}`;
|
|
178
202
|
}
|
|
179
203
|
//# sourceMappingURL=templates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-integrations.d.ts","sourceRoot":"","sources":["../../src/core/tool-integrations.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,eAAe,oEAAqE,CAAC;AAClG,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAsBtD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAID,eAAO,MAAM,SAAS,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"tool-integrations.d.ts","sourceRoot":"","sources":["../../src/core/tool-integrations.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,eAAe,oEAAqE,CAAC;AAClG,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAsBtD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAID,eAAO,MAAM,SAAS,EAAE,QAAQ,EA+M/B,CAAC;AAEF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAwB9D;AAaD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CA8BtF;AAcD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAuB1E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAErF"}
|
|
@@ -40,14 +40,16 @@ Create an \`adr/\` repository in the target directory.
|
|
|
40
40
|
adrkit init [path]
|
|
41
41
|
\`\`\`
|
|
42
42
|
|
|
43
|
-
3. Confirm the output lists \`adr/config.yaml\`, \`adr/decisions\`,
|
|
44
|
-
\`adr
|
|
43
|
+
3. Confirm the output lists \`adr/config.yaml\`, \`adr/decisions\`, and
|
|
44
|
+
\`adr/.gitignore\`. Proposals are not a separate folder: they are ephemeral
|
|
45
|
+
drafts in \`adr/.drafts/\`, created by \`adrkit propose\`.
|
|
45
46
|
|
|
46
47
|
## Rules
|
|
47
48
|
|
|
48
49
|
- Never create \`adr/\` directories by hand; use the CLI so the config and
|
|
49
50
|
README stay canonical.
|
|
50
|
-
- After init, the next action is usually \`adrkit
|
|
51
|
+
- After init, the next action is usually \`adrkit decide "<title>"\`, or
|
|
52
|
+
\`adrkit propose "<title>"\` when the decision still needs review.`,
|
|
51
53
|
},
|
|
52
54
|
{
|
|
53
55
|
name: 'adrkit-propose',
|
|
@@ -56,8 +58,9 @@ adrkit init [path]
|
|
|
56
58
|
|
|
57
59
|
## Overview
|
|
58
60
|
|
|
59
|
-
Create
|
|
60
|
-
|
|
61
|
+
Create an ephemeral proposal draft in \`adr/.drafts/\`. A draft is temporary:
|
|
62
|
+
\`adrkit accept\` promotes it into a decision, \`adrkit reject\` discards it
|
|
63
|
+
without leaving a record.
|
|
61
64
|
|
|
62
65
|
## Steps
|
|
63
66
|
|
|
@@ -67,16 +70,17 @@ expected to fail \`adrkit validate\` until every required section is filled.
|
|
|
67
70
|
adrkit propose "<title>"
|
|
68
71
|
\`\`\`
|
|
69
72
|
|
|
70
|
-
2. Edit the created
|
|
73
|
+
2. Edit the created draft. Fill every section with real content:
|
|
71
74
|
\`## Problem\`, \`## Proposal\`, \`## Alternatives considered\`,
|
|
72
75
|
\`## Acceptance criteria\`, \`## Risks\`.
|
|
73
|
-
3.
|
|
76
|
+
3. Promote the completed draft with \`adrkit accept "<title>"\`; the CLI
|
|
77
|
+
validates it before promoting.
|
|
74
78
|
|
|
75
79
|
## Rules
|
|
76
80
|
|
|
77
81
|
- Do not skip \`## Alternatives considered\`. A proposal without alternatives
|
|
78
82
|
is invalid by design.
|
|
79
|
-
- Keep the
|
|
83
|
+
- Keep the front matter exactly \`status: proposed\`.
|
|
80
84
|
- Before proposing, run \`adrkit list\` and check whether this decision
|
|
81
85
|
supersedes or overlaps an existing one; mention that in the record. Re-run
|
|
82
86
|
it even if you ran it earlier in this conversation: session memory can be
|
|
@@ -89,8 +93,8 @@ adrkit propose "<title>"
|
|
|
89
93
|
|
|
90
94
|
## Overview
|
|
91
95
|
|
|
92
|
-
|
|
93
|
-
|
|
96
|
+
Record an already-made decision directly in \`adr/decisions/\` with the next
|
|
97
|
+
\`N\` number.
|
|
94
98
|
|
|
95
99
|
## Steps
|
|
96
100
|
|
|
@@ -131,24 +135,25 @@ adrkit validate [name] [--all] [--json]
|
|
|
131
135
|
## Rules
|
|
132
136
|
|
|
133
137
|
- Treat any non-OK output as a blocker for \`adrkit accept\`.
|
|
134
|
-
-
|
|
135
|
-
|
|
138
|
+
- \`adrkit validate\` checks durable decisions only; a draft in \`adr/.drafts/\`
|
|
139
|
+
is validated by \`adrkit accept\` right before it is promoted.`,
|
|
136
140
|
},
|
|
137
141
|
{
|
|
138
142
|
name: 'adrkit-accept',
|
|
139
|
-
description: 'Use when a
|
|
143
|
+
description: 'Use when a proposal draft is complete, and the team has decided to accept it.',
|
|
140
144
|
body: `# ADR Kit Accept
|
|
141
145
|
|
|
142
146
|
## Overview
|
|
143
147
|
|
|
144
|
-
|
|
145
|
-
\`N\`
|
|
146
|
-
\`Acceptance criteria\` and \`Risks\` into \`## Consequences\`,
|
|
147
|
-
|
|
148
|
+
Promote a completed draft to a decision. The CLI validates the draft, assigns
|
|
149
|
+
the next \`N\` number, rewrites \`## Proposal\` to \`## Decision\`, folds
|
|
150
|
+
\`Acceptance criteria\` and \`Risks\` into \`## Consequences\`, writes
|
|
151
|
+
\`adr/decisions/N-*.md\`, and discards the draft from \`adr/.drafts/\`.
|
|
148
152
|
|
|
149
153
|
## Steps
|
|
150
154
|
|
|
151
|
-
1.
|
|
155
|
+
1. Review the draft with \`adrkit show "<name>"\`; every section must have real
|
|
156
|
+
content before accepting.
|
|
152
157
|
2. Run:
|
|
153
158
|
|
|
154
159
|
\`\`\`bash
|
|
@@ -159,9 +164,9 @@ adrkit accept "<name>"
|
|
|
159
164
|
|
|
160
165
|
## Rules
|
|
161
166
|
|
|
162
|
-
- Never accept an invalid
|
|
163
|
-
- Re-run \`adrkit
|
|
164
|
-
|
|
167
|
+
- Never accept an invalid draft; the command refuses.
|
|
168
|
+
- Re-run \`adrkit show "<name>"\` immediately before accepting, even if you
|
|
169
|
+
reviewed it earlier in this conversation; the repo may have changed since.
|
|
165
170
|
- Review the generated \`## Consequences\` after accepting.
|
|
166
171
|
- The command warns when a proposal contains sections that have no place in
|
|
167
172
|
an accepted decision (for example \`## Plan\`); save their content elsewhere
|
|
@@ -169,24 +174,26 @@ adrkit accept "<name>"
|
|
|
169
174
|
},
|
|
170
175
|
{
|
|
171
176
|
name: 'adrkit-reject',
|
|
172
|
-
description: 'Use when a
|
|
177
|
+
description: 'Use when a proposal draft should be declined and discarded.',
|
|
173
178
|
body: `# ADR Kit Reject
|
|
174
179
|
|
|
175
180
|
## Overview
|
|
176
181
|
|
|
177
|
-
|
|
178
|
-
|
|
182
|
+
Discard a proposal draft. The CLI deletes the draft from \`adr/.drafts/\` and
|
|
183
|
+
leaves no record - rejection lives in the winning decision's
|
|
184
|
+
\`## Alternatives considered\`, not in a standalone rejected record.
|
|
179
185
|
|
|
180
186
|
## Steps
|
|
181
187
|
|
|
182
188
|
\`\`\`bash
|
|
183
|
-
adrkit reject "<name>" --reason "<why it was rejected>"
|
|
189
|
+
adrkit reject "<name>" [--reason "<why it was rejected>"]
|
|
184
190
|
\`\`\`
|
|
185
191
|
|
|
186
192
|
## Rules
|
|
187
193
|
|
|
188
|
-
-
|
|
189
|
-
|
|
194
|
+
- \`--reason\` is optional and is only echoed; nothing is persisted. If the
|
|
195
|
+
rejection matters, record it in \`## Alternatives considered\` of the decision
|
|
196
|
+
that won.`,
|
|
190
197
|
},
|
|
191
198
|
{
|
|
192
199
|
name: 'adrkit-supersede',
|
|
@@ -195,9 +202,10 @@ adrkit reject "<name>" --reason "<why it was rejected>"
|
|
|
195
202
|
|
|
196
203
|
## Overview
|
|
197
204
|
|
|
198
|
-
Mark an accepted decision as superseded. The CLI rewrites its
|
|
199
|
-
to \`
|
|
200
|
-
|
|
205
|
+
Mark an accepted decision as superseded. The CLI rewrites its front matter
|
|
206
|
+
to \`status: superseded\` with \`superseded-by: N\`, stamps the supersede date
|
|
207
|
+
on the \`date\` field, and leaves the record in \`adr/decisions/\` as frozen
|
|
208
|
+
history.
|
|
201
209
|
|
|
202
210
|
## Steps
|
|
203
211
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-integrations.js","sourceRoot":"","sources":["../../src/core/tool-integrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAOpD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,CAAU,CAAC;AAGlG,MAAM,gBAAgB,GAA2B;IAC/C,MAAM,EAAE,kBAAkB;IAC1B,KAAK,EAAE,iBAAiB;IACxB,MAAM,EAAE,kBAAkB;IAC1B,gBAAgB,EAAE,iBAAiB;IACnC,MAAM,EAAE,kBAAkB;CAC3B,CAAC;AAEF;;;;GAIG;AACH,MAAM,cAAc,GAAoC;IACtD,MAAM,EAAE,gBAAgB;IACxB,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,gBAAgB;CACzB,CAAC;AAQF,mEAAmE;AACnE,gDAAgD;AAChD,MAAM,CAAC,MAAM,SAAS,GAAe;IACnC;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,gGAAgG;QAC7G,IAAI,EAAE
|
|
1
|
+
{"version":3,"file":"tool-integrations.js","sourceRoot":"","sources":["../../src/core/tool-integrations.ts"],"names":[],"mappings":"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"}
|
package/dist/core/validate.d.ts
CHANGED
|
@@ -4,9 +4,15 @@ export interface ValidationIssue {
|
|
|
4
4
|
message: string;
|
|
5
5
|
}
|
|
6
6
|
export declare function validateRecord(root: string, record: AdrRecord): ValidationIssue[];
|
|
7
|
+
/**
|
|
8
|
+
* Validate a draft proposal in `adr/.drafts/` before `accept` promotes it.
|
|
9
|
+
* Drafts are ephemeral and deliberately outside the `adrkit validate` surface;
|
|
10
|
+
* this is the gate that keeps a half-written proposal from becoming a decision.
|
|
11
|
+
*/
|
|
12
|
+
export declare function validateDraft(root: string, draft: AdrRecord): ValidationIssue[];
|
|
7
13
|
export declare function validateRepository(root: string): ValidationIssue[];
|
|
8
14
|
/**
|
|
9
|
-
* Repository-level checks for a single record: a
|
|
15
|
+
* Repository-level checks for a single record: a `superseded-by: N` reference
|
|
10
16
|
* must point at an existing decision that is not itself superseded.
|
|
11
17
|
* validateRecord only sees one file; this adds the cross-record half so
|
|
12
18
|
* `adrkit validate <name>` keeps the same promise as a full validate.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,SAAS,EAEf,MAAM,UAAU,CAAC;AAIlB,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAiED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,eAAe,EAAE,CA0DjF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,eAAe,EAAE,CA0B/E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CA+ClE;AA0BD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,SAAS,EAAE,GACnB,eAAe,EAAE,CAQnB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAI9D"}
|