adr-kit 0.13.0 → 0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -211
- package/README.zh.md +58 -174
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +41 -25
- package/dist/cli.js.map +1 -1
- package/dist/commands/archive.d.ts +2 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +62 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/completion.d.ts.map +1 -1
- package/dist/commands/completion.js +5 -4
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/{accept.d.ts → implement.d.ts} +2 -2
- package/dist/commands/implement.d.ts.map +1 -0
- package/dist/commands/implement.js +42 -0
- package/dist/commands/implement.js.map +1 -0
- package/dist/commands/init.js +3 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/instructions.d.ts.map +1 -1
- package/dist/commands/instructions.js +24 -81
- package/dist/commands/instructions.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +9 -14
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/propose.d.ts.map +1 -1
- package/dist/commands/propose.js +9 -10
- package/dist/commands/propose.js.map +1 -1
- package/dist/commands/{decide.d.ts → record.d.ts} +2 -2
- package/dist/commands/record.d.ts.map +1 -0
- package/dist/commands/{decide.js → record.js} +6 -6
- package/dist/commands/{decide.js.map → record.js.map} +1 -1
- package/dist/commands/reject.d.ts +1 -1
- package/dist/commands/reject.d.ts.map +1 -1
- package/dist/commands/reject.js +24 -8
- package/dist/commands/reject.js.map +1 -1
- package/dist/commands/show.d.ts.map +1 -1
- package/dist/commands/show.js +2 -16
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +6 -17
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/supersede.d.ts.map +1 -1
- package/dist/commands/supersede.js +44 -10
- package/dist/commands/supersede.js.map +1 -1
- package/dist/commands/validate.d.ts +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +11 -3
- package/dist/commands/validate.js.map +1 -1
- package/dist/core/adr.d.ts +22 -20
- package/dist/core/adr.d.ts.map +1 -1
- package/dist/core/adr.js +31 -10
- package/dist/core/adr.js.map +1 -1
- package/dist/core/archive-seal.d.ts +48 -0
- package/dist/core/archive-seal.d.ts.map +1 -0
- package/dist/core/archive-seal.js +122 -0
- package/dist/core/archive-seal.js.map +1 -0
- package/dist/core/cli-options.d.ts +2 -2
- package/dist/core/cli-options.d.ts.map +1 -1
- package/dist/core/cli-options.js +8 -6
- package/dist/core/cli-options.js.map +1 -1
- package/dist/core/config.d.ts +1 -1
- package/dist/core/deliberation.d.ts.map +1 -1
- package/dist/core/deliberation.js +2 -3
- package/dist/core/deliberation.js.map +1 -1
- package/dist/core/git.d.ts +9 -0
- package/dist/core/git.d.ts.map +1 -1
- package/dist/core/git.js +31 -0
- package/dist/core/git.js.map +1 -1
- package/dist/core/graph-html.js +5 -5
- package/dist/core/graph-html.js.map +1 -1
- package/dist/core/graph.d.ts +2 -1
- package/dist/core/graph.d.ts.map +1 -1
- package/dist/core/graph.js +9 -4
- package/dist/core/graph.js.map +1 -1
- package/dist/core/repository.d.ts +3 -11
- package/dist/core/repository.d.ts.map +1 -1
- package/dist/core/repository.js +60 -141
- package/dist/core/repository.js.map +1 -1
- package/dist/core/templates.d.ts +6 -7
- package/dist/core/templates.d.ts.map +1 -1
- package/dist/core/templates.js +13 -14
- package/dist/core/templates.js.map +1 -1
- package/dist/core/tool-integrations.d.ts.map +1 -1
- package/dist/core/tool-integrations.js +77 -422
- package/dist/core/tool-integrations.js.map +1 -1
- package/dist/core/validate.d.ts +19 -6
- package/dist/core/validate.d.ts.map +1 -1
- package/dist/core/validate.js +295 -91
- package/dist/core/validate.js.map +1 -1
- package/package.json +1 -1
- package/dist/commands/accept.d.ts.map +0 -1
- package/dist/commands/accept.js +0 -42
- package/dist/commands/accept.js.map +0 -1
- package/dist/commands/decide.d.ts.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -3,10 +3,11 @@ import { pathToFileURL } from 'node:url';
|
|
|
3
3
|
import { VERSION } from './version.js';
|
|
4
4
|
import { isDecidedBy, isRaisedBy } from './core/adr.js';
|
|
5
5
|
import { unsupportedOptions } from './core/cli-options.js';
|
|
6
|
-
import {
|
|
6
|
+
import { archiveCommand } from './commands/archive.js';
|
|
7
7
|
import { completionCommand } from './commands/completion.js';
|
|
8
8
|
import { configCommand } from './commands/config.js';
|
|
9
|
-
import {
|
|
9
|
+
import { recordCommand } from './commands/record.js';
|
|
10
|
+
import { implementCommand } from './commands/implement.js';
|
|
10
11
|
import { graphCommand } from './commands/graph.js';
|
|
11
12
|
import { initCommand } from './commands/init.js';
|
|
12
13
|
import { instructionsCommand } from './commands/instructions.js';
|
|
@@ -21,9 +22,9 @@ import { updateCommand } from './commands/update.js';
|
|
|
21
22
|
import { validateCommand } from './commands/validate.js';
|
|
22
23
|
const HELP = `adrkit ${VERSION} - A lightweight ADR workflow for humans and agents
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
Records live in adr/proposed/, adr/implemented/, adr/rejected/, or adr/archived/.
|
|
26
|
+
An unshipped proposal stays proposed until implementation. record and
|
|
27
|
+
implement require two declarations. --raised-by records who put the decision on
|
|
27
28
|
the table; --decided-by records whose judgment settled it: human when a person
|
|
28
29
|
determined the direction (they stated it, changed a proposal into what shipped,
|
|
29
30
|
or you are recording one they made earlier), agent when it came from the
|
|
@@ -33,18 +34,20 @@ infers nor verifies either.
|
|
|
33
34
|
Usage:
|
|
34
35
|
adrkit init [path] [--tools <list>] [--workflows <list>]
|
|
35
36
|
Initialize an ADR Kit repository
|
|
36
|
-
adrkit
|
|
37
|
-
Record
|
|
38
|
-
adrkit propose <title> Create an
|
|
39
|
-
adrkit
|
|
40
|
-
|
|
41
|
-
adrkit reject <name>
|
|
42
|
-
adrkit
|
|
43
|
-
adrkit
|
|
44
|
-
adrkit
|
|
37
|
+
adrkit record <title> --raised-by <human|agent> --decided-by <human|agent>
|
|
38
|
+
Record an already-shipped decision
|
|
39
|
+
adrkit propose <title> Create an unshipped proposal
|
|
40
|
+
adrkit implement <name> --raised-by <human|agent> --decided-by <human|agent>
|
|
41
|
+
Mark shipped proposal implemented; assign number
|
|
42
|
+
adrkit reject <name> --reason <reason> Reject a proposal; keep it as an anti-pattern
|
|
43
|
+
adrkit archive <name> --reason <reason> Retire an implemented record
|
|
44
|
+
adrkit supersede <name> --by <name> Replace and archive an implemented decision
|
|
45
|
+
adrkit list List all lifecycle records
|
|
46
|
+
adrkit show <name> Show a record
|
|
45
47
|
adrkit status Show lifecycle counts and validity
|
|
46
48
|
adrkit instructions Print the next workflow step
|
|
47
|
-
adrkit validate [name] [--all]
|
|
49
|
+
adrkit validate [name] [--all] [--base <git-ref>]
|
|
50
|
+
Validate one record or the whole repo
|
|
48
51
|
adrkit update [--tools <list>] [--workflows <list>]
|
|
49
52
|
Rewrite AI tool integrations
|
|
50
53
|
adrkit config Print the current configuration
|
|
@@ -53,6 +56,7 @@ Usage:
|
|
|
53
56
|
adrkit tree <name> [--mermaid|--text|--html] Render the record's deliberation tree
|
|
54
57
|
adrkit completion <bash|zsh|fish> Print a shell completion script
|
|
55
58
|
adrkit version Print the version
|
|
59
|
+
adrkit help Print this help
|
|
56
60
|
adrkit -h, --help Print this help
|
|
57
61
|
adrkit -V, --version Print the version
|
|
58
62
|
|
|
@@ -75,6 +79,7 @@ export function main(argv) {
|
|
|
75
79
|
tokens: true,
|
|
76
80
|
options: {
|
|
77
81
|
all: { type: 'boolean', default: false },
|
|
82
|
+
base: { type: 'string' },
|
|
78
83
|
by: { type: 'string' },
|
|
79
84
|
'decided-by': { type: 'string' },
|
|
80
85
|
'raised-by': { type: 'string' },
|
|
@@ -103,11 +108,11 @@ export function main(argv) {
|
|
|
103
108
|
const command = positionals[0] ?? '';
|
|
104
109
|
const rest = positionals.slice(1);
|
|
105
110
|
try {
|
|
106
|
-
// Only
|
|
111
|
+
// Only record and implement assign provenance. Anywhere else the flags are a
|
|
107
112
|
// mistake, not something to ignore, and this has to run before the switch
|
|
108
113
|
// so a non-recording command never reaches the required-declaration check.
|
|
109
114
|
for (const flag of ['decided-by', 'raised-by']) {
|
|
110
|
-
if (values[flag] !== undefined && command !== '
|
|
115
|
+
if (values[flag] !== undefined && command !== 'record' && command !== 'implement') {
|
|
111
116
|
throw new Error(`adrkit ${command.length > 0 ? command : '(no command)'} does not take --${flag}`);
|
|
112
117
|
}
|
|
113
118
|
}
|
|
@@ -145,19 +150,24 @@ export function main(argv) {
|
|
|
145
150
|
console.log(proposeCommand(rest[0], process.cwd()));
|
|
146
151
|
return;
|
|
147
152
|
}
|
|
148
|
-
case '
|
|
149
|
-
requireTitle(rest, '
|
|
150
|
-
console.log(
|
|
153
|
+
case 'record': {
|
|
154
|
+
requireTitle(rest, 'record');
|
|
155
|
+
console.log(recordCommand(rest[0], process.cwd(), requireDecidedBy(values['decided-by']), requireRaisedBy(values['raised-by'])));
|
|
151
156
|
return;
|
|
152
157
|
}
|
|
153
|
-
case '
|
|
154
|
-
requireTitle(rest, '
|
|
155
|
-
console.log(
|
|
158
|
+
case 'implement': {
|
|
159
|
+
requireTitle(rest, 'implement');
|
|
160
|
+
console.log(implementCommand(rest[0], process.cwd(), requireDecidedBy(values['decided-by']), requireRaisedBy(values['raised-by'])));
|
|
156
161
|
return;
|
|
157
162
|
}
|
|
158
163
|
case 'reject': {
|
|
159
164
|
requireTitle(rest, 'reject');
|
|
160
|
-
console.log(rejectCommand(rest[0], values.reason, process.cwd()));
|
|
165
|
+
console.log(rejectCommand(rest[0], requireReason(values.reason, 'reject'), process.cwd()));
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
case 'archive': {
|
|
169
|
+
requireTitle(rest, 'archive');
|
|
170
|
+
console.log(archiveCommand(rest[0], requireReason(values.reason, 'archive'), process.cwd()));
|
|
161
171
|
return;
|
|
162
172
|
}
|
|
163
173
|
case 'supersede': {
|
|
@@ -226,7 +236,7 @@ export function main(argv) {
|
|
|
226
236
|
return;
|
|
227
237
|
}
|
|
228
238
|
case 'validate': {
|
|
229
|
-
const result = validateCommand(process.cwd(), values.all ? undefined : rest[0]);
|
|
239
|
+
const result = validateCommand(process.cwd(), values.all ? undefined : rest[0], values.base);
|
|
230
240
|
console.log(result.output);
|
|
231
241
|
if (result.valid === false)
|
|
232
242
|
process.exitCode = 1;
|
|
@@ -247,6 +257,12 @@ function requireTitle(rest, command) {
|
|
|
247
257
|
throw new Error(`${command} requires a title or name`);
|
|
248
258
|
}
|
|
249
259
|
}
|
|
260
|
+
function requireReason(value, command) {
|
|
261
|
+
if (value === undefined || value.trim().length === 0) {
|
|
262
|
+
throw new Error(`${command} requires --reason <reason>`);
|
|
263
|
+
}
|
|
264
|
+
return value;
|
|
265
|
+
}
|
|
250
266
|
/**
|
|
251
267
|
* `decided-by` is a declaration of where the choice came from, so the CLI asks
|
|
252
268
|
* for it instead of guessing: no environment, terminal, or agent marker can
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"AAiBA,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAoDjF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { existsSync, rmSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { todayStamp } from '../core/adr.js';
|
|
4
|
+
import { appendSeal, ARCHIVED_DIR, driftedSeals, MANIFEST_FILE, readArchiveManifest, sealBytes, writeArchiveManifest, } from '../core/archive-seal.js';
|
|
5
|
+
import { ADR_DIR, requireRoot } from '../core/config.js';
|
|
6
|
+
import { formatIssues, validateRecord } from '../core/validate.js';
|
|
7
|
+
import { folderPath, readRecord, removeRecord, resolveRecord, writeRecord } from '../core/repository.js';
|
|
8
|
+
import { stampLifecycleMove } from '../core/templates.js';
|
|
9
|
+
export function archiveCommand(query, reason, cwd) {
|
|
10
|
+
const root = requireRoot(cwd);
|
|
11
|
+
const record = resolveRecord(root, query);
|
|
12
|
+
if (record.folder !== 'implemented' || record.status !== 'implemented') {
|
|
13
|
+
throw new Error(`"${query}" must be an implemented decision`);
|
|
14
|
+
}
|
|
15
|
+
if (reason.trim().length === 0)
|
|
16
|
+
throw new Error('archive requires a non-empty --reason');
|
|
17
|
+
if (record.frontMatterExtras?.length) {
|
|
18
|
+
throw new Error(`"${query}" has unknown front matter field(s): ${record.frontMatterExtras.join(', ')}`);
|
|
19
|
+
}
|
|
20
|
+
// Seal only a record that validates: the archive is frozen and its seal
|
|
21
|
+
// forbids repairing the bytes, so moving an invalid body in is permanent.
|
|
22
|
+
const recordIssues = validateRecord(root, record);
|
|
23
|
+
if (recordIssues.length > 0) {
|
|
24
|
+
throw new Error(`"${query}" is not valid; fix it before archiving:\n${formatIssues(recordIssues)}`);
|
|
25
|
+
}
|
|
26
|
+
if (existsSync(join(folderPath(root, 'archived'), record.fileName))) {
|
|
27
|
+
throw new Error(`archived record already exists: adr/archived/${record.fileName}`);
|
|
28
|
+
}
|
|
29
|
+
// Preflight the manifest before anything moves: archiving appends exactly
|
|
30
|
+
// one seal, so a missing or malformed manifest fails while the record is
|
|
31
|
+
// still safely in implemented/. A duplicate seal would launder changed
|
|
32
|
+
// archived bytes, so it is refused the same way.
|
|
33
|
+
const manifest = readArchiveManifest(root);
|
|
34
|
+
if (manifest === undefined) {
|
|
35
|
+
throw new Error(`missing ${ADR_DIR}/${ARCHIVED_DIR}/${MANIFEST_FILE}; the archive manifest must exist before archiving`);
|
|
36
|
+
}
|
|
37
|
+
if (manifest.entries.some((entry) => entry.path === record.fileName)) {
|
|
38
|
+
throw new Error(`the archive manifest already seals adr/archived/${record.fileName}`);
|
|
39
|
+
}
|
|
40
|
+
const drift = driftedSeals(root, manifest);
|
|
41
|
+
if (drift.length > 0) {
|
|
42
|
+
throw new Error(`the archive is inconsistent; fix it before archiving:\n ${drift.join('\n ')}`);
|
|
43
|
+
}
|
|
44
|
+
const content = stampLifecycleMove(readRecord(record), {
|
|
45
|
+
date: todayStamp(),
|
|
46
|
+
archived: todayStamp(),
|
|
47
|
+
'archive-reason': reason.trim(),
|
|
48
|
+
});
|
|
49
|
+
writeRecord(root, 'archived', record.fileName, content);
|
|
50
|
+
try {
|
|
51
|
+
writeArchiveManifest(root, appendSeal(manifest, record.fileName, sealBytes(content)));
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
// Roll the staged archived file back: the active source must survive a
|
|
55
|
+
// failed seal so the move never half-happens.
|
|
56
|
+
rmSync(join(folderPath(root, 'archived'), record.fileName), { force: true });
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
removeRecord(record);
|
|
60
|
+
return `archived adr/implemented/${record.fileName} as adr/archived/${record.fileName} and sealed it in ${ADR_DIR}/${ARCHIVED_DIR}/${MANIFEST_FILE}`;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=archive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AA+BA,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAiGvD"}
|
|
@@ -2,10 +2,11 @@ import { DECIDED_BY_VALUES } from '../core/adr.js';
|
|
|
2
2
|
import { COMMANDS, COMMAND_OPTIONS, takesValue, VALUE_OPTIONS } from '../core/cli-options.js';
|
|
3
3
|
/** Short descriptions for the shells that show one next to an option. */
|
|
4
4
|
const OPTION_DESCRIPTIONS = {
|
|
5
|
+
'--base': 'git ref the archive history must have grown from',
|
|
5
6
|
'--by': 'the decision that replaces this one',
|
|
6
7
|
'--decided-by': 'whose judgment settled the decision',
|
|
7
8
|
'--raised-by': 'who raised the decision',
|
|
8
|
-
'--reason': 'why
|
|
9
|
+
'--reason': 'why this record changes lifecycle',
|
|
9
10
|
'--tag': 'filter to one theme',
|
|
10
11
|
'--out': 'write the output to this file',
|
|
11
12
|
'--tools': 'AI tools to install integrations for',
|
|
@@ -37,7 +38,7 @@ export function completionCommand(shell) {
|
|
|
37
38
|
|
|
38
39
|
case "$prev" in
|
|
39
40
|
--decided-by|--raised-by)
|
|
40
|
-
if [[ "$command" == "
|
|
41
|
+
if [[ "$command" == "record" || "$command" == "implement" ]]; then
|
|
41
42
|
COMPREPLY=( $(compgen -W "${DECIDED_BY_VALUES.join(' ')}" -- "$cur") )
|
|
42
43
|
else
|
|
43
44
|
# The flag is not accepted here, so its values are not candidates.
|
|
@@ -105,9 +106,9 @@ _adrkit "$@"
|
|
|
105
106
|
'\n' +
|
|
106
107
|
// `-x` requires the value and suppresses file candidates; both
|
|
107
108
|
// declarations live on one line with the two values as `-a`.
|
|
108
|
-
`complete -c adrkit -n "__fish_seen_subcommand_from
|
|
109
|
+
`complete -c adrkit -n "__fish_seen_subcommand_from record implement" -l raised-by -x -a "${DECIDED_BY_VALUES.join(' ')}"` +
|
|
109
110
|
'\n' +
|
|
110
|
-
`complete -c adrkit -n "__fish_seen_subcommand_from
|
|
111
|
+
`complete -c adrkit -n "__fish_seen_subcommand_from record implement" -l decided-by -x -a "${DECIDED_BY_VALUES.join(' ')}"` +
|
|
111
112
|
'\n');
|
|
112
113
|
default:
|
|
113
114
|
throw new Error(`unsupported shell "${shell}". Supported: bash, zsh, fish`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE9F,yEAAyE;AACzE,MAAM,mBAAmB,GAA2B;IAClD,MAAM,EAAE,qCAAqC;IAC7C,cAAc,EAAE,qCAAqC;IACrD,aAAa,EAAE,yBAAyB;IACxC,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,5 +4,5 @@ import type { DecidedBy, RaisedBy } from '../core/adr.js';
|
|
|
4
4
|
* the CLI cannot observe who chose, so the value travels in rather than being
|
|
5
5
|
* inferred. Promotion is also where the value enters the durable record.
|
|
6
6
|
*/
|
|
7
|
-
export declare function
|
|
8
|
-
//# sourceMappingURL=
|
|
7
|
+
export declare function implementCommand(query: string, cwd: string, decidedBy: DecidedBy, raisedBy: RaisedBy): string;
|
|
8
|
+
//# sourceMappingURL=implement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implement.d.ts","sourceRoot":"","sources":["../../src/commands/implement.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAO1D;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,GACjB,MAAM,CA+BR"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { requireRoot } from '../core/config.js';
|
|
4
|
+
import { gitHead } from '../core/git.js';
|
|
5
|
+
import { folderPath, nextDecisionNumber, removeRecord, resolveProposed, writeRecord } from '../core/repository.js';
|
|
6
|
+
import { droppedSections, proposalToDecision } from '../core/templates.js';
|
|
7
|
+
import { formatIssues, validateRecord } from '../core/validate.js';
|
|
8
|
+
/**
|
|
9
|
+
* `decidedBy` is the declaration the caller made for the promoted decision:
|
|
10
|
+
* the CLI cannot observe who chose, so the value travels in rather than being
|
|
11
|
+
* inferred. Promotion is also where the value enters the durable record.
|
|
12
|
+
*/
|
|
13
|
+
export function implementCommand(query, cwd, decidedBy, raisedBy) {
|
|
14
|
+
const root = requireRoot(cwd);
|
|
15
|
+
const proposal = resolveProposed(root, query);
|
|
16
|
+
if (/^\d+\s+/.test(proposal.title)) {
|
|
17
|
+
throw new Error('proposal title must not start with a number; ADR Kit assigns decision numbers');
|
|
18
|
+
}
|
|
19
|
+
const issues = validateRecord(root, proposal);
|
|
20
|
+
if (issues.length > 0) {
|
|
21
|
+
throw new Error(`proposal is not ready to implement:\n${formatIssues(issues)}`);
|
|
22
|
+
}
|
|
23
|
+
const number = nextDecisionNumber(root);
|
|
24
|
+
const slug = proposal.fileName.replace(/^\d{4}-\d{2}-\d{2}-/, '').replace(/\.md$/, '');
|
|
25
|
+
const fileName = `${number}-${slug}.md`;
|
|
26
|
+
const path = join(folderPath(root, 'implemented'), fileName);
|
|
27
|
+
if (existsSync(path)) {
|
|
28
|
+
throw new Error(`decision already exists: adr/implemented/${fileName}`);
|
|
29
|
+
}
|
|
30
|
+
const content = proposalToDecision(proposal, number, gitHead(root), decidedBy, raisedBy);
|
|
31
|
+
writeRecord(root, 'implemented', fileName, content);
|
|
32
|
+
removeRecord(proposal);
|
|
33
|
+
let output = `implemented adr/proposed/${proposal.fileName} as adr/implemented/${fileName}`;
|
|
34
|
+
const dropped = droppedSections(proposal);
|
|
35
|
+
if (dropped.length > 0) {
|
|
36
|
+
output += `\nwarning: dropped section(s) with no place in an implemented decision: ${dropped
|
|
37
|
+
.map((heading) => `## ${heading}`)
|
|
38
|
+
.join(', ')}`;
|
|
39
|
+
}
|
|
40
|
+
return output;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=implement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implement.js","sourceRoot":"","sources":["../../src/commands/implement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACnH,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEnE;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,GAAW,EACX,SAAoB,EACpB,QAAkB;IAElB,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9C,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC;IACnG,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,wCAAwC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,GAAG,MAAM,IAAI,IAAI,KAAK,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC7D,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,4CAA4C,QAAQ,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACzF,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpD,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvB,IAAI,MAAM,GAAG,4BAA4B,QAAQ,CAAC,QAAQ,uBAAuB,QAAQ,EAAE,CAAC;IAC5F,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,2EAA2E,OAAO;aACzF,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,OAAO,EAAE,CAAC;aACjC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -6,7 +6,7 @@ export function initCommand(targetDir, toolsValue, workflowsValue) {
|
|
|
6
6
|
const tools = parseTools(toolsValue);
|
|
7
7
|
const workflows = parseWorkflows(workflowsValue);
|
|
8
8
|
// `undefined` keeps the config key absent: only an explicit subset is
|
|
9
|
-
// recorded,
|
|
9
|
+
// recorded, and an absent key means every workflow.
|
|
10
10
|
const { root, created } = initRepository(targetDir, tools, workflowsValue === undefined ? undefined : workflows);
|
|
11
11
|
const lines = created.map((path) => ` created ${path}`);
|
|
12
12
|
const integrations = writeToolIntegrations(root, tools, workflows);
|
|
@@ -19,8 +19,8 @@ export function initCommand(targetDir, toolsValue, workflowsValue) {
|
|
|
19
19
|
...(note === undefined ? [] : ['', note]),
|
|
20
20
|
'',
|
|
21
21
|
'Next:',
|
|
22
|
-
' adrkit
|
|
23
|
-
' adrkit
|
|
22
|
+
' adrkit propose "use sqlite for sessions" # plan an unshipped choice',
|
|
23
|
+
' adrkit record "a shipped choice" --raised-by human --decided-by human',
|
|
24
24
|
].join('\n');
|
|
25
25
|
}
|
|
26
26
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,UAAmB,EAAE,cAAuB;IACzF,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;IACjD,sEAAsE;IACtE,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,UAAmB,EAAE,cAAuB;IACzF,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;IACjD,sEAAsE;IACtE,oDAAoD;IACpD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,cAAc,CACtC,SAAS,EACT,KAAK,EACL,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CACrD,CAAC;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,qBAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACnE,wBAAwB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACpD,OAAO;QACL,0BAA0B,IAAI,EAAE;QAChC,GAAG,KAAK;QACR,GAAG,kBAAkB,CAAC,IAAI,EAAE,YAAY,CAAC;QACzC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACzC,EAAE;QACF,OAAO;QACP,uEAAuE;QACvE,yEAAyE;KAC1E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../../src/commands/instructions.ts"],"names":[],"mappings":"AAKA,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../../src/commands/instructions.ts"],"names":[],"mappings":"AAKA,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAmCvD"}
|
|
@@ -1,101 +1,44 @@
|
|
|
1
1
|
import { findRoot, installedWithNotice, readConfigSafe, withNotice } from '../core/config.js';
|
|
2
|
-
import {
|
|
3
|
-
import { formatIssues,
|
|
2
|
+
import { listRecords } from '../core/repository.js';
|
|
3
|
+
import { formatIssues, validateRecord, validateRepository } from '../core/validate.js';
|
|
4
4
|
import { VERSION } from '../version.js';
|
|
5
5
|
export function instructionsCommand(cwd) {
|
|
6
|
-
const root = findRoot(cwd);
|
|
7
|
-
const config = root === undefined ? undefined : readConfigSafe(root);
|
|
8
|
-
const notice = config === undefined ? undefined : installedWithNotice(config, VERSION);
|
|
9
|
-
return withNotice(instructionsOutput(cwd), notice);
|
|
10
|
-
}
|
|
11
|
-
function instructionsOutput(cwd) {
|
|
12
6
|
const root = findRoot(cwd);
|
|
13
7
|
if (root === undefined) {
|
|
14
|
-
|
|
15
|
-
'No ADR Kit repository found.',
|
|
16
|
-
'',
|
|
17
|
-
'Next:',
|
|
18
|
-
' adrkit init',
|
|
19
|
-
' adrkit decide "your first decision" --raised-by <human|agent> --decided-by <human|agent>',
|
|
20
|
-
' (raised-by: who raised it; decided-by: whose judgment settled it)',
|
|
21
|
-
].join('\n');
|
|
22
|
-
return output;
|
|
8
|
+
return 'No ADR Kit repository found.\n\nNext:\n adrkit init';
|
|
23
9
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
10
|
+
const config = readConfigSafe(root);
|
|
11
|
+
const notice = config === undefined ? undefined : installedWithNotice(config, VERSION);
|
|
12
|
+
const issues = validateRepository(root);
|
|
13
|
+
let records;
|
|
28
14
|
try {
|
|
29
|
-
listRecords(root);
|
|
15
|
+
records = listRecords(root);
|
|
30
16
|
}
|
|
31
17
|
catch {
|
|
32
|
-
|
|
33
|
-
const output = [
|
|
34
|
-
'The repository has validation issues. Fix them before creating more records.',
|
|
35
|
-
'',
|
|
36
|
-
formatIssues(issues),
|
|
37
|
-
'',
|
|
38
|
-
'Next:',
|
|
39
|
-
' adrkit validate',
|
|
40
|
-
].join('\n');
|
|
41
|
-
return output;
|
|
18
|
+
return withNotice(`The repository has validation issues.\n\n${formatIssues(issues)}\n\nNext:\n adrkit validate`, notice);
|
|
42
19
|
}
|
|
43
|
-
const
|
|
44
|
-
if (
|
|
20
|
+
const proposed = records.filter((record) => record.folder === 'proposed');
|
|
21
|
+
if (proposed.length > 0) {
|
|
22
|
+
const lines = [`${proposed.length} proposal${proposed.length === 1 ? '' : 's'} pending:`];
|
|
45
23
|
const ready = [];
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
needsWork[draft.fileName] = issues.map((issue) => issue.message);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
const readySet = new Set(ready);
|
|
57
|
-
const lines = [`${drafts.length} draft${drafts.length === 1 ? '' : 's'} pending:`];
|
|
58
|
-
for (const draft of drafts) {
|
|
59
|
-
if (readySet.has(draft.fileName)) {
|
|
60
|
-
lines.push(` ✓ ${draft.fileName} validated - ready to accept`);
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
const first = needsWork[draft.fileName]?.[0] ?? 'validation failed';
|
|
64
|
-
lines.push(` ✗ ${draft.fileName} ${first}`);
|
|
65
|
-
}
|
|
24
|
+
for (const record of proposed) {
|
|
25
|
+
const recordIssues = validateRecord(root, record);
|
|
26
|
+
if (recordIssues.length === 0)
|
|
27
|
+
ready.push(record.fileName);
|
|
28
|
+
lines.push(` ${recordIssues.length === 0 ? '✓' : '✗'} ${record.fileName} ${recordIssues.length === 0 ? 'validated - ready after shipping' : recordIssues[0].message}`);
|
|
66
29
|
}
|
|
67
30
|
lines.push('', 'Next:');
|
|
68
31
|
for (const name of ready) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
lines.push(` adrkit accept ${name} --raised-by <human|agent> --decided-by <human|agent> # promote to a decision`);
|
|
32
|
+
lines.push(` adrkit implement ${name} --raised-by <human|agent> --decided-by <human|agent> # after shipping`);
|
|
33
|
+
lines.push(` adrkit reject ${name} --reason <reason> # if declined`);
|
|
72
34
|
}
|
|
73
|
-
|
|
74
|
-
lines.push(
|
|
75
|
-
|
|
76
|
-
const output = lines.join('\n');
|
|
77
|
-
return output;
|
|
35
|
+
if (ready.length < proposed.length)
|
|
36
|
+
lines.push(' adrkit validate # fix incomplete proposals first');
|
|
37
|
+
return withNotice(lines.join('\n'), notice);
|
|
78
38
|
}
|
|
79
|
-
const issues = validateRepository(root);
|
|
80
39
|
if (issues.length > 0) {
|
|
81
|
-
|
|
82
|
-
'The repository has validation issues. Fix them before creating more records.',
|
|
83
|
-
'',
|
|
84
|
-
formatIssues(issues),
|
|
85
|
-
'',
|
|
86
|
-
'Next:',
|
|
87
|
-
' adrkit validate',
|
|
88
|
-
].join('\n');
|
|
89
|
-
return output;
|
|
40
|
+
return withNotice(`The repository has validation issues.\n\n${formatIssues(issues)}\n\nNext:\n adrkit validate`, notice);
|
|
90
41
|
}
|
|
91
|
-
|
|
92
|
-
'No proposals waiting.',
|
|
93
|
-
'',
|
|
94
|
-
'Next:',
|
|
95
|
-
' adrkit decide "an already-made decision" --raised-by <human|agent> --decided-by <human|agent>',
|
|
96
|
-
' (raised-by: who raised it; decided-by: whose judgment settled it)',
|
|
97
|
-
' adrkit propose "a decision that still needs review" # ephemeral draft (the exception)',
|
|
98
|
-
].join('\n');
|
|
99
|
-
return output;
|
|
42
|
+
return withNotice('No proposals waiting.\n\nNext:\n adrkit propose "an unshipped choice"\n adrkit record "an already-shipped choice" --raised-by <human|agent> --decided-by <human|agent>', notice);
|
|
100
43
|
}
|
|
101
44
|
//# sourceMappingURL=instructions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/commands/instructions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9F,OAAO,EAAE,
|
|
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":"AAIA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA0B/C"}
|