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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { findRoot } from '../core/config.js';
|
|
2
|
-
import { listRecords } from '../core/repository.js';
|
|
3
|
-
import { formatIssues,
|
|
2
|
+
import { listDrafts, listRecords } from '../core/repository.js';
|
|
3
|
+
import { formatIssues, validateDraft, validateRepository } from '../core/validate.js';
|
|
4
4
|
export function instructionsCommand(cwd, asJson = false) {
|
|
5
5
|
const root = findRoot(cwd);
|
|
6
6
|
if (root === undefined) {
|
|
@@ -9,19 +9,18 @@ export function instructionsCommand(cwd, asJson = false) {
|
|
|
9
9
|
'',
|
|
10
10
|
'Next:',
|
|
11
11
|
' adrkit init',
|
|
12
|
-
' adrkit
|
|
12
|
+
' adrkit decide "your first decision"',
|
|
13
13
|
].join('\n');
|
|
14
14
|
return asJson
|
|
15
15
|
? JSON.stringify({ step: 'init', message: output }, null, 2)
|
|
16
16
|
: output;
|
|
17
17
|
}
|
|
18
|
-
// Pending
|
|
19
|
-
// elsewhere in the repo must not hide the proposals that are ready.
|
|
20
|
-
//
|
|
21
|
-
// which reports the parse error as an issue.
|
|
22
|
-
let records;
|
|
18
|
+
// Pending drafts come first: promoting or discarding them is the steer, and a
|
|
19
|
+
// draft elsewhere in the repo must not hide the proposals that are ready.
|
|
20
|
+
// A corrupt durable record falls back to the repository-level validation
|
|
21
|
+
// output, which reports the parse error as an issue.
|
|
23
22
|
try {
|
|
24
|
-
|
|
23
|
+
listRecords(root);
|
|
25
24
|
}
|
|
26
25
|
catch {
|
|
27
26
|
const issues = validateRepository(root);
|
|
@@ -37,42 +36,42 @@ export function instructionsCommand(cwd, asJson = false) {
|
|
|
37
36
|
? JSON.stringify({ step: 'fix-validation', issues, message: output }, null, 2)
|
|
38
37
|
: output;
|
|
39
38
|
}
|
|
40
|
-
const
|
|
41
|
-
if (
|
|
39
|
+
const drafts = listDrafts(root);
|
|
40
|
+
if (drafts.length > 0) {
|
|
42
41
|
const ready = [];
|
|
43
42
|
const needsWork = {};
|
|
44
|
-
for (const
|
|
45
|
-
const issues =
|
|
43
|
+
for (const draft of drafts) {
|
|
44
|
+
const issues = validateDraft(root, draft);
|
|
46
45
|
if (issues.length === 0) {
|
|
47
|
-
ready.push(
|
|
46
|
+
ready.push(draft.fileName);
|
|
48
47
|
}
|
|
49
48
|
else {
|
|
50
|
-
needsWork[
|
|
49
|
+
needsWork[draft.fileName] = issues.map((issue) => issue.message);
|
|
51
50
|
}
|
|
52
51
|
}
|
|
53
52
|
const readySet = new Set(ready);
|
|
54
|
-
const lines = [`${
|
|
55
|
-
for (const
|
|
56
|
-
if (readySet.has(
|
|
57
|
-
lines.push(` ✓ ${
|
|
53
|
+
const lines = [`${drafts.length} draft${drafts.length === 1 ? '' : 's'} pending:`];
|
|
54
|
+
for (const draft of drafts) {
|
|
55
|
+
if (readySet.has(draft.fileName)) {
|
|
56
|
+
lines.push(` ✓ ${draft.fileName} validated - ready to accept`);
|
|
58
57
|
}
|
|
59
58
|
else {
|
|
60
|
-
const first = needsWork[
|
|
61
|
-
lines.push(` ✗ ${
|
|
59
|
+
const first = needsWork[draft.fileName]?.[0] ?? 'validation failed';
|
|
60
|
+
lines.push(` ✗ ${draft.fileName} ${first}`);
|
|
62
61
|
}
|
|
63
62
|
}
|
|
64
63
|
lines.push('', 'Next:');
|
|
65
64
|
for (const name of ready) {
|
|
66
|
-
lines.push(` adrkit accept ${name} #
|
|
65
|
+
lines.push(` adrkit accept ${name} # promote to a decision`);
|
|
67
66
|
}
|
|
68
67
|
for (const name of Object.keys(needsWork)) {
|
|
69
|
-
lines.push(` adrkit
|
|
68
|
+
lines.push(` adrkit reject ${name} # or fix adr/.drafts/${name} and accept it`);
|
|
70
69
|
}
|
|
71
70
|
const output = lines.join('\n');
|
|
72
71
|
return asJson
|
|
73
72
|
? JSON.stringify({
|
|
74
73
|
step: 'decide',
|
|
75
|
-
pending:
|
|
74
|
+
pending: drafts.map((draft) => draft.fileName),
|
|
76
75
|
readyToAccept: ready,
|
|
77
76
|
needsWork,
|
|
78
77
|
message: output,
|
|
@@ -97,7 +96,7 @@ export function instructionsCommand(cwd, asJson = false) {
|
|
|
97
96
|
'No proposals waiting.',
|
|
98
97
|
'',
|
|
99
98
|
'Next:',
|
|
100
|
-
' adrkit propose "
|
|
99
|
+
' adrkit propose "a decision you are unsure about" # ephemeral draft',
|
|
101
100
|
' adrkit decide "an already-made decision"',
|
|
102
101
|
].join('\n');
|
|
103
102
|
return asJson
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/commands/instructions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/commands/instructions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,MAAM,CA0C/D"}
|
package/dist/commands/list.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { requireRoot } from '../core/config.js';
|
|
2
|
-
import { displayName, listRecords, relativePath } from '../core/repository.js';
|
|
2
|
+
import { displayName, listDrafts, listRecords, relativePath } from '../core/repository.js';
|
|
3
3
|
export function listCommand(cwd, asJson = false) {
|
|
4
4
|
const root = requireRoot(cwd);
|
|
5
5
|
const records = listRecords(root);
|
|
6
|
+
const drafts = listDrafts(root);
|
|
6
7
|
if (asJson) {
|
|
7
|
-
const payload = records.map((record) => ({
|
|
8
|
+
const payload = [...records, ...drafts].map((record) => ({
|
|
8
9
|
folder: record.folder,
|
|
9
10
|
status: record.status,
|
|
10
11
|
number: record.number,
|
|
@@ -16,21 +17,13 @@ export function listCommand(cwd, asJson = false) {
|
|
|
16
17
|
}));
|
|
17
18
|
return JSON.stringify(payload, null, 2);
|
|
18
19
|
}
|
|
19
|
-
if (records.length === 0) {
|
|
20
|
+
if (records.length === 0 && drafts.length === 0) {
|
|
20
21
|
return 'no ADRs yet: start one with "adrkit propose <title>" or "adrkit decide <title>"';
|
|
21
22
|
}
|
|
22
|
-
const labels = {
|
|
23
|
-
decisions: 'Accepted',
|
|
24
|
-
proposed: 'Proposed',
|
|
25
|
-
rejected: 'Rejected',
|
|
26
|
-
};
|
|
27
23
|
const lines = [];
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
continue;
|
|
32
|
-
lines.push(labels[folder] ?? folder, '');
|
|
33
|
-
for (const record of group) {
|
|
24
|
+
if (records.length > 0) {
|
|
25
|
+
lines.push('Accepted', '');
|
|
26
|
+
for (const record of records) {
|
|
34
27
|
const supersededNote = record.status === 'superseded' && record.supersededBy !== undefined
|
|
35
28
|
? ` [superseded by ${record.supersededBy}]`
|
|
36
29
|
: '';
|
|
@@ -38,6 +31,13 @@ export function listCommand(cwd, asJson = false) {
|
|
|
38
31
|
}
|
|
39
32
|
lines.push('');
|
|
40
33
|
}
|
|
34
|
+
if (drafts.length > 0) {
|
|
35
|
+
lines.push('Drafts (pending)', '');
|
|
36
|
+
for (const draft of drafts) {
|
|
37
|
+
lines.push(` ${draft.title} (${relativePath(draft)})`);
|
|
38
|
+
}
|
|
39
|
+
lines.push('');
|
|
40
|
+
}
|
|
41
41
|
return lines.join('\n').trimEnd();
|
|
42
42
|
}
|
|
43
43
|
//# sourceMappingURL=list.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE3F,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,MAAM,GAAG,KAAK;IACrD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAEhC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACvD,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC;YAC1B,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC,CAAC,CAAC;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,iFAAiF,CAAC;IAC3F,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC3B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,KAAK,YAAY,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS;gBACxF,CAAC,CAAC,oBAAoB,MAAM,CAAC,YAAY,GAAG;gBAC5C,CAAC,CAAC,EAAE,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC,MAAM,CAAC,GAAG,cAAc,MAAM,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrF,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,KAAK,MAAM,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AACpC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propose.d.ts","sourceRoot":"","sources":["../../src/commands/propose.ts"],"names":[],"mappings":"AAQA,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"propose.d.ts","sourceRoot":"","sources":["../../src/commands/propose.ts"],"names":[],"mappings":"AAQA,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAyBjE"}
|
package/dist/commands/propose.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { readConfig, requireRoot } from '../core/config.js';
|
|
4
|
-
import {
|
|
4
|
+
import { draftsPath, writeRecord } from '../core/repository.js';
|
|
5
5
|
import { todayStamp } from '../core/adr.js';
|
|
6
6
|
import { proposalTemplate } from '../core/templates.js';
|
|
7
7
|
import { slugify } from '../core/slug.js';
|
|
@@ -16,12 +16,19 @@ export function proposeCommand(title, cwd) {
|
|
|
16
16
|
const root = requireRoot(cwd);
|
|
17
17
|
const slug = slugify(trimmed);
|
|
18
18
|
const fileName = `${todayStamp()}-${slug}.md`;
|
|
19
|
-
const path = join(
|
|
19
|
+
const path = join(draftsPath(root), fileName);
|
|
20
20
|
if (existsSync(path)) {
|
|
21
|
-
throw new Error(`
|
|
21
|
+
throw new Error(`draft already exists: adr/.drafts/${fileName}`);
|
|
22
22
|
}
|
|
23
23
|
const content = proposalTemplate(trimmed, readConfig(root).context);
|
|
24
|
-
writeRecord(root, '
|
|
25
|
-
return
|
|
24
|
+
writeRecord(root, 'drafts', fileName, content);
|
|
25
|
+
return [
|
|
26
|
+
`created adr/.drafts/${fileName}`,
|
|
27
|
+
'',
|
|
28
|
+
'A draft is ephemeral: promote it with',
|
|
29
|
+
` adrkit accept "${trimmed}"`,
|
|
30
|
+
'or discard it with',
|
|
31
|
+
` adrkit reject "${trimmed}"`,
|
|
32
|
+
].join('\n');
|
|
26
33
|
}
|
|
27
34
|
//# sourceMappingURL=propose.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propose.js","sourceRoot":"","sources":["../../src/commands/propose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,GAAW;IACvD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,GAAG,UAAU,EAAE,IAAI,IAAI,KAAK,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"propose.js","sourceRoot":"","sources":["../../src/commands/propose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,GAAW;IACvD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,GAAG,UAAU,EAAE,IAAI,IAAI,KAAK,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC9C,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;IACpE,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO;QACL,uBAAuB,QAAQ,EAAE;QACjC,EAAE;QACF,uCAAuC;QACvC,oBAAoB,OAAO,GAAG;QAC9B,oBAAoB;QACpB,oBAAoB,OAAO,GAAG;KAC/B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function rejectCommand(query: string, reason: string, cwd: string): string;
|
|
1
|
+
export declare function rejectCommand(query: string, reason: string | undefined, cwd: string): string;
|
|
2
2
|
//# sourceMappingURL=reject.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reject.d.ts","sourceRoot":"","sources":["../../src/commands/reject.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reject.d.ts","sourceRoot":"","sources":["../../src/commands/reject.ts"],"names":[],"mappings":"AAGA,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAa5F"}
|
package/dist/commands/reject.js
CHANGED
|
@@ -1,25 +1,14 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
1
|
import { requireRoot } from '../core/config.js';
|
|
4
|
-
import {
|
|
5
|
-
import { stampLifecycleMove } from '../core/templates.js';
|
|
2
|
+
import { removeRecord, resolveDraft } from '../core/repository.js';
|
|
6
3
|
export function rejectCommand(query, reason, cwd) {
|
|
7
4
|
const root = requireRoot(cwd);
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
const draft = resolveDraft(root, query);
|
|
6
|
+
removeRecord(draft);
|
|
7
|
+
const lines = [`rejected and discarded draft adr/.drafts/${draft.fileName}`];
|
|
8
|
+
if (reason !== undefined && reason.trim().length > 0) {
|
|
9
|
+
lines.push(`reason: ${reason.trim()}`);
|
|
11
10
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
throw new Error('a rejection reason is required: adrkit reject <name> --reason "..."');
|
|
15
|
-
}
|
|
16
|
-
const path = join(folderPath(root, 'rejected'), record.fileName);
|
|
17
|
-
if (existsSync(path)) {
|
|
18
|
-
throw new Error(`rejected record already exists: adr/rejected/${record.fileName}`);
|
|
19
|
-
}
|
|
20
|
-
const original = readRecord(record);
|
|
21
|
-
writeRecord(root, 'rejected', record.fileName, stampLifecycleMove(original, `Status: rejected — ${trimmedReason}`));
|
|
22
|
-
removeRecord(record);
|
|
23
|
-
return `rejected adr/proposed/${record.fileName} as adr/rejected/${record.fileName}`;
|
|
11
|
+
lines.push('No record was created - rejection lives in "Alternatives considered" of the', 'decision that won, not in a standalone rejected record.');
|
|
12
|
+
return lines.join('\n');
|
|
24
13
|
}
|
|
25
14
|
//# sourceMappingURL=reject.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reject.js","sourceRoot":"","sources":["../../src/commands/reject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"reject.js","sourceRoot":"","sources":["../../src/commands/reject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,MAA0B,EAAE,GAAW;IAClF,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxC,YAAY,CAAC,KAAK,CAAC,CAAC;IACpB,MAAM,KAAK,GAAG,CAAC,4CAA4C,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7E,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,KAAK,CAAC,IAAI,CACR,6EAA6E,EAC7E,yDAAyD,CAC1D,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAkB9D"}
|
package/dist/commands/show.js
CHANGED
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
2
|
import { requireRoot } from '../core/config.js';
|
|
3
|
-
import { relativePath, resolveRecord } from '../core/repository.js';
|
|
3
|
+
import { relativePath, resolveDraft, resolveRecord } from '../core/repository.js';
|
|
4
4
|
export function showCommand(query, cwd) {
|
|
5
5
|
const root = requireRoot(cwd);
|
|
6
|
-
|
|
6
|
+
// Decisions first, then ephemeral drafts - `show` doubles as a draft review.
|
|
7
|
+
// If neither resolves, surface the decisions-oriented error rather than the
|
|
8
|
+
// draft fallback's, so a mistyped number still says "no ADR matches".
|
|
9
|
+
let record;
|
|
10
|
+
try {
|
|
11
|
+
record = resolveRecord(root, query);
|
|
12
|
+
}
|
|
13
|
+
catch (decisionError) {
|
|
14
|
+
try {
|
|
15
|
+
record = resolveDraft(root, query);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
throw decisionError;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
7
21
|
const path = relativePath(record);
|
|
8
22
|
const content = readFileSync(record.path, 'utf8');
|
|
9
23
|
return `${path}\n${'='.repeat(path.length)}\n\n${content.trimEnd()}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAElF,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,GAAW;IACpD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,6EAA6E;IAC7E,4EAA4E;IAC5E,sEAAsE;IACtE,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,aAAa,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,aAAa,CAAC;QACtB,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAClD,OAAO,GAAG,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;AACvE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,YAAY,CA6CvE"}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { requireRoot } from '../core/config.js';
|
|
2
|
-
import { listRecords } from '../core/repository.js';
|
|
2
|
+
import { listDrafts, listRecords } from '../core/repository.js';
|
|
3
3
|
import { formatIssues, validateRepository } from '../core/validate.js';
|
|
4
4
|
export function statusCommand(cwd, asJson = false) {
|
|
5
5
|
const root = requireRoot(cwd);
|
|
@@ -11,19 +11,21 @@ export function statusCommand(cwd, asJson = false) {
|
|
|
11
11
|
catch {
|
|
12
12
|
// Validation already reported the parse failure above; keep counts empty.
|
|
13
13
|
}
|
|
14
|
-
|
|
14
|
+
let drafts = [];
|
|
15
|
+
try {
|
|
16
|
+
drafts = listDrafts(root);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// A corrupt draft is surfaced by accept/instructions, not by the count.
|
|
20
|
+
}
|
|
21
|
+
const counts = { accepted: 0, superseded: 0, drafts: 0 };
|
|
15
22
|
for (const record of records) {
|
|
16
|
-
if (record.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
counts.accepted += 1;
|
|
21
|
-
}
|
|
22
|
-
else if (record.folder === 'proposed')
|
|
23
|
-
counts.proposed += 1;
|
|
24
|
-
else if (record.folder === 'rejected')
|
|
25
|
-
counts.rejected += 1;
|
|
23
|
+
if (record.status === 'superseded')
|
|
24
|
+
counts.superseded += 1;
|
|
25
|
+
else
|
|
26
|
+
counts.accepted += 1;
|
|
26
27
|
}
|
|
28
|
+
counts.drafts = drafts.length;
|
|
27
29
|
if (asJson) {
|
|
28
30
|
return {
|
|
29
31
|
valid: issues.length === 0,
|
|
@@ -37,8 +39,7 @@ export function statusCommand(cwd, asJson = false) {
|
|
|
37
39
|
const lines = ['Lifecycle', ''];
|
|
38
40
|
lines.push(` accepted: ${counts.accepted}`);
|
|
39
41
|
lines.push(` superseded: ${counts.superseded}`);
|
|
40
|
-
lines.push(`
|
|
41
|
-
lines.push(` rejected: ${counts.rejected}`);
|
|
42
|
+
lines.push(` drafts (pending): ${counts.drafts}`);
|
|
42
43
|
lines.push('');
|
|
43
44
|
lines.push(issues.length === 0 ? 'validation: OK' : `validation: ${formatIssues(issues)}`);
|
|
44
45
|
return { valid: issues.length === 0, output: lines.join('\n') };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAOvE,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,MAAM,GAAG,KAAK;IACvD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,OAAO,GAAgB,EAAE,CAAC;IAC9B,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;IAC5E,CAAC;IACD,IAAI,MAAM,GAAgB,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;IAC1E,CAAC;IAED,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACzD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY;YAAE,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;;YACtD,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAE9B,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,MAAM,EAAE,IAAI,CAAC,SAAS,CACpB;gBACE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;gBAC1B,MAAM;gBACN,MAAM;aACP,EACD,IAAI,EACJ,CAAC,CACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IACjD,KAAK,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,eAAe,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3F,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAClE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supersede.d.ts","sourceRoot":"","sources":["../../src/commands/supersede.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"supersede.d.ts","sourceRoot":"","sources":["../../src/commands/supersede.ts"],"names":[],"mappings":"AAMA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAwCpF"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { todayStamp } from '../core/adr.js';
|
|
1
2
|
import { requireRoot } from '../core/config.js';
|
|
3
|
+
import { gitHead } from '../core/git.js';
|
|
2
4
|
import { readRecord, resolveRecord, writeRecord } from '../core/repository.js';
|
|
3
5
|
import { stampLifecycleMove } from '../core/templates.js';
|
|
4
6
|
export function supersedeCommand(query, byQuery, cwd) {
|
|
@@ -24,12 +26,19 @@ export function supersedeCommand(query, byQuery, cwd) {
|
|
|
24
26
|
if (replacement.number === undefined) {
|
|
25
27
|
throw new Error(`"--by ${byQuery}" has no decision number`);
|
|
26
28
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (currentStatus !== 'Status: accepted') {
|
|
30
|
-
throw new Error(`unexpected status line "${currentStatus ?? ''}" in ${record.fileName}`);
|
|
29
|
+
if (record.status !== 'accepted') {
|
|
30
|
+
throw new Error(`unexpected status "${record.status}" in ${record.fileName}`);
|
|
31
31
|
}
|
|
32
|
-
|
|
32
|
+
const original = readRecord(record);
|
|
33
|
+
const patch = {
|
|
34
|
+
status: 'superseded',
|
|
35
|
+
date: todayStamp(),
|
|
36
|
+
'superseded-by': replacement.number,
|
|
37
|
+
};
|
|
38
|
+
const commit = gitHead(root);
|
|
39
|
+
if (commit !== undefined)
|
|
40
|
+
patch.commit = commit;
|
|
41
|
+
writeRecord(root, 'decisions', record.fileName, stampLifecycleMove(original, patch));
|
|
33
42
|
return `superseded adr/decisions/${record.fileName} by adr/decisions/${replacement.fileName}`;
|
|
34
43
|
}
|
|
35
44
|
//# sourceMappingURL=supersede.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supersede.js","sourceRoot":"","sources":["../../src/commands/supersede.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,OAAe,EAAE,GAAW;IAC1E,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,2CAA2C,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;QACzC,MAAM,IAAI,KAAK,CACb,IAAI,KAAK,8BAA8B,OAAO,yDAAyD,CACxG,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,IAAI,WAAW,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,2CAA2C,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,2EAA2E,CAAC,CAAC;IAC/G,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,0BAA0B,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,
|
|
1
|
+
{"version":3,"file":"supersede.js","sourceRoot":"","sources":["../../src/commands/supersede.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,OAAe,EAAE,GAAW;IAC1E,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,2CAA2C,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;QACzC,MAAM,IAAI,KAAK,CACb,IAAI,KAAK,8BAA8B,OAAO,yDAAyD,CACxG,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,IAAI,WAAW,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,2CAA2C,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,2EAA2E,CAAC,CAAC;IAC/G,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,0BAA0B,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,MAAM,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,KAAK,GAAoC;QAC7C,MAAM,EAAE,YAAY;QACpB,IAAI,EAAE,UAAU,EAAE;QAClB,eAAe,EAAE,WAAW,CAAC,MAAM;KACpC,CAAC;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,MAAM,KAAK,SAAS;QAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IAChD,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,QAAQ,EAAE,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACrF,OAAO,4BAA4B,MAAM,CAAC,QAAQ,qBAAqB,WAAW,CAAC,QAAQ,EAAE,CAAC;AAChG,CAAC"}
|
package/dist/core/adr.d.ts
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
export type AdrStatus = 'proposed' | 'accepted' | 'rejected' | 'superseded';
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* The durable records folder (`decisions/`) and the ephemeral drafts folder
|
|
4
|
+
* (`adr/.drafts/`). Status is never implied by location: durable records carry
|
|
5
|
+
* their own status, and drafts are proposals that will either be promoted or
|
|
6
|
+
* discarded.
|
|
7
|
+
*/
|
|
8
|
+
export type AdrFolder = 'decisions' | 'drafts';
|
|
9
|
+
/** Canonical front matter field order; only fields that exist are written. */
|
|
10
|
+
export declare const FRONT_MATTER_ORDER: readonly ["status", "date", "commit", "reason", "superseded-by"];
|
|
3
11
|
/** Sections that only make sense during the proposal era and must not appear in an accepted decision. */
|
|
4
12
|
export declare const PROPOSAL_ERA_HEADINGS: string[];
|
|
5
13
|
/** A `YYYY-MM-DD` date value. Shared by the parser (format) and validate (calendar validity). */
|
|
6
14
|
export declare const DATE_PATTERN: RegExp;
|
|
7
15
|
/**
|
|
8
16
|
* Today's date as `YYYY-MM-DD` in local time. The single source of the date:
|
|
9
|
-
* it feeds the `
|
|
17
|
+
* it feeds the `date` front matter field that every record carries and the
|
|
10
18
|
* `YYYY-MM-DD-` prefix of proposal file names, so the two always agree.
|
|
11
19
|
*/
|
|
12
20
|
export declare function todayStamp(): string;
|
|
@@ -22,33 +30,40 @@ export interface AdrRecord {
|
|
|
22
30
|
status: AdrStatus;
|
|
23
31
|
/** Date the current status was recorded, `YYYY-MM-DD` in local time. */
|
|
24
32
|
date: string;
|
|
33
|
+
/** Short git hash the decision was recorded against; auto-stamped when in a git repo. */
|
|
34
|
+
commit?: string;
|
|
25
35
|
rejectionReason?: string;
|
|
26
36
|
/** For superseded decisions: the number of the decision that replaced this one. */
|
|
27
37
|
supersededBy?: number;
|
|
28
38
|
number?: number;
|
|
29
39
|
sections: AdrSection[];
|
|
40
|
+
/** Front matter keys outside the canonical set; validate reports them. */
|
|
41
|
+
frontMatterExtras?: string[];
|
|
30
42
|
}
|
|
31
43
|
export declare class AdrFormatError extends Error {
|
|
32
44
|
readonly path: string;
|
|
33
45
|
constructor(message: string, path: string);
|
|
34
46
|
}
|
|
35
|
-
export declare function statusForFolder(folder: AdrFolder): AdrStatus;
|
|
36
|
-
export declare function folderForStatus(status: AdrStatus): AdrFolder;
|
|
37
47
|
export declare function section(record: AdrRecord, heading: string): string | undefined;
|
|
38
48
|
export declare function hasMeaningfulBody(body: string | undefined): boolean;
|
|
39
49
|
/**
|
|
40
50
|
* Parse a single ADR markdown file into its structured parts.
|
|
41
51
|
*
|
|
42
|
-
* The format is
|
|
52
|
+
* The format is YAML front matter followed by a Markdown body:
|
|
53
|
+
*
|
|
54
|
+
* ---
|
|
55
|
+
* status: proposed | accepted | rejected | superseded
|
|
56
|
+
* date: YYYY-MM-DD
|
|
57
|
+
* reason: <why> (rejected only)
|
|
58
|
+
* superseded-by: <N> (superseded only)
|
|
59
|
+
* ---
|
|
43
60
|
*
|
|
44
61
|
* # ADR: <title or "N Title">
|
|
45
|
-
*
|
|
46
|
-
* Date: YYYY-MM-DD
|
|
47
|
-
* <blank line>
|
|
62
|
+
*
|
|
48
63
|
* ## Problem
|
|
49
64
|
* ...
|
|
50
65
|
*
|
|
51
|
-
* The `
|
|
66
|
+
* The `date` field records the date the current status was reached and is
|
|
52
67
|
* stamped by the CLI at every lifecycle move (propose, decide, accept,
|
|
53
68
|
* reject, supersede).
|
|
54
69
|
*/
|
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":"
|
|
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;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE/C,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,kEAAmE,CAAC;AAEnG,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,yFAAyF;IACzF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mFAAmF;IACnF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,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;gBAD5B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM;CAK/B;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;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAgJxD"}
|