adr-kit 0.2.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 (97) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -0
  3. package/README.zh.md +131 -0
  4. package/bin/openadr.js +5 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +176 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/commands/accept.d.ts +2 -0
  10. package/dist/commands/accept.d.ts.map +1 -0
  11. package/dist/commands/accept.js +33 -0
  12. package/dist/commands/accept.js.map +1 -0
  13. package/dist/commands/completion.d.ts +2 -0
  14. package/dist/commands/completion.d.ts.map +1 -0
  15. package/dist/commands/completion.js +40 -0
  16. package/dist/commands/completion.js.map +1 -0
  17. package/dist/commands/config.d.ts +2 -0
  18. package/dist/commands/config.d.ts.map +1 -0
  19. package/dist/commands/config.js +23 -0
  20. package/dist/commands/config.js.map +1 -0
  21. package/dist/commands/decide.d.ts +2 -0
  22. package/dist/commands/decide.d.ts.map +1 -0
  23. package/dist/commands/decide.js +27 -0
  24. package/dist/commands/decide.js.map +1 -0
  25. package/dist/commands/init.d.ts +2 -0
  26. package/dist/commands/init.d.ts.map +1 -0
  27. package/dist/commands/init.js +18 -0
  28. package/dist/commands/init.js.map +1 -0
  29. package/dist/commands/instructions.d.ts +2 -0
  30. package/dist/commands/instructions.d.ts.map +1 -0
  31. package/dist/commands/instructions.js +60 -0
  32. package/dist/commands/instructions.js.map +1 -0
  33. package/dist/commands/list.d.ts +2 -0
  34. package/dist/commands/list.d.ts.map +1 -0
  35. package/dist/commands/list.js +43 -0
  36. package/dist/commands/list.js.map +1 -0
  37. package/dist/commands/propose.d.ts +2 -0
  38. package/dist/commands/propose.d.ts.map +1 -0
  39. package/dist/commands/propose.js +26 -0
  40. package/dist/commands/propose.js.map +1 -0
  41. package/dist/commands/reject.d.ts +2 -0
  42. package/dist/commands/reject.d.ts.map +1 -0
  43. package/dist/commands/reject.js +26 -0
  44. package/dist/commands/reject.js.map +1 -0
  45. package/dist/commands/show.d.ts +2 -0
  46. package/dist/commands/show.d.ts.map +1 -0
  47. package/dist/commands/show.js +11 -0
  48. package/dist/commands/show.js.map +1 -0
  49. package/dist/commands/status.d.ts +6 -0
  50. package/dist/commands/status.d.ts.map +1 -0
  51. package/dist/commands/status.js +46 -0
  52. package/dist/commands/status.js.map +1 -0
  53. package/dist/commands/supersede.d.ts +2 -0
  54. package/dist/commands/supersede.d.ts.map +1 -0
  55. package/dist/commands/supersede.js +36 -0
  56. package/dist/commands/supersede.js.map +1 -0
  57. package/dist/commands/update.d.ts +2 -0
  58. package/dist/commands/update.d.ts.map +1 -0
  59. package/dist/commands/update.js +13 -0
  60. package/dist/commands/update.js.map +1 -0
  61. package/dist/commands/validate.d.ts +6 -0
  62. package/dist/commands/validate.d.ts.map +1 -0
  63. package/dist/commands/validate.js +38 -0
  64. package/dist/commands/validate.js.map +1 -0
  65. package/dist/core/adr.d.ts +44 -0
  66. package/dist/core/adr.d.ts.map +1 -0
  67. package/dist/core/adr.js +143 -0
  68. package/dist/core/adr.js.map +1 -0
  69. package/dist/core/config.d.ts +22 -0
  70. package/dist/core/config.d.ts.map +1 -0
  71. package/dist/core/config.js +63 -0
  72. package/dist/core/config.js.map +1 -0
  73. package/dist/core/repository.d.ts +19 -0
  74. package/dist/core/repository.d.ts.map +1 -0
  75. package/dist/core/repository.js +190 -0
  76. package/dist/core/repository.js.map +1 -0
  77. package/dist/core/slug.d.ts +10 -0
  78. package/dist/core/slug.d.ts.map +1 -0
  79. package/dist/core/slug.js +19 -0
  80. package/dist/core/slug.js.map +1 -0
  81. package/dist/core/templates.d.ts +11 -0
  82. package/dist/core/templates.d.ts.map +1 -0
  83. package/dist/core/templates.js +126 -0
  84. package/dist/core/templates.js.map +1 -0
  85. package/dist/core/tool-integrations.d.ts +16 -0
  86. package/dist/core/tool-integrations.d.ts.map +1 -0
  87. package/dist/core/tool-integrations.js +256 -0
  88. package/dist/core/tool-integrations.js.map +1 -0
  89. package/dist/core/validate.d.ts +9 -0
  90. package/dist/core/validate.d.ts.map +1 -0
  91. package/dist/core/validate.js +183 -0
  92. package/dist/core/validate.js.map +1 -0
  93. package/dist/version.d.ts +2 -0
  94. package/dist/version.d.ts.map +1 -0
  95. package/dist/version.js +2 -0
  96. package/dist/version.js.map +1 -0
  97. package/package.json +49 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 OpenADR contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,150 @@
1
+ <p align="center">
2
+ <img src="assets/social-preview.png" alt="OpenADR — Open Architecture Decision Records" width="768" />
3
+ </p>
4
+
5
+ <p align="center">
6
+ <strong>Open Architecture Decision Records</strong> — a lightweight ADR workflow for humans and agents.
7
+ </p>
8
+
9
+ <p align="center">
10
+ <a href="https://www.npmjs.com/package/adr-kit"><img src="https://img.shields.io/npm/v/adr-kit" alt="npm version" /></a>
11
+ <a href="https://github.com/luochang212/OpenADR/actions/workflows/ci.yml"><img src="https://github.com/luochang212/OpenADR/actions/workflows/ci.yml/badge.svg" alt="ci" /></a>
12
+ <a href="https://www.npmjs.com/package/adr-kit"><img src="https://img.shields.io/npm/dm/adr-kit" alt="npm downloads" /></a>
13
+ <a href="https://nodejs.org/"><img src="https://img.shields.io/node/v/adr-kit" alt="node" /></a>
14
+ <a href="LICENSE"><img src="https://img.shields.io/npm/l/adr-kit" alt="license" /></a>
15
+ </p>
16
+
17
+ <p align="center">
18
+ <a href="README.md">English</a> | <a href="README.zh.md">中文</a>
19
+ </p>
20
+
21
+ OpenADR turns architecture decisions into plain Markdown files with a
22
+ machine-checkable lifecycle: **proposed → accepted / rejected / superseded**. It borrows
23
+ the spec-driven spirit of [OpenSpec](https://github.com/Fission-AI/OpenSpec)
24
+ and the decision-record discipline of agent-native codebases: every record
25
+ must say what problem it solves, what it chose, and what it gave up.
26
+
27
+ ```text
28
+ → fluid not rigid
29
+ → plain Markdown, no front matter
30
+ → one decision, one file
31
+ → built for agents and humans alike
32
+ ```
33
+
34
+ ## Quick start
35
+
36
+ Requires Node.js 20.19 or later.
37
+
38
+ ```bash
39
+ npm install -g adr-kit
40
+ cd your-project
41
+ openadr init
42
+ openadr propose "Use SQLite for session storage"
43
+ ```
44
+
45
+ `openadr init` creates an `adr/` directory:
46
+
47
+ ```text
48
+ adr/
49
+ ├── config.yaml # project context and per-status rules
50
+ ├── README.md # repository conventions
51
+ ├── decisions/ # accepted decisions, numbered NNNN
52
+ ├── proposed/ # proposals waiting for a decision
53
+ └── rejected/ # rejected proposals, frozen
54
+ ```
55
+
56
+ Fill in the proposal, then:
57
+
58
+ ```bash
59
+ openadr validate
60
+ openadr accept "Use SQLite for session storage"
61
+ openadr list
62
+ ```
63
+
64
+ ## Commands
65
+
66
+ ```text
67
+ openadr init [path] Initialize an OpenADR repository
68
+ openadr propose <title> Create a proposed decision
69
+ openadr decide <title> Record an already-accepted decision
70
+ openadr accept <name> Accept a proposal (assigns NNNN)
71
+ openadr reject <name> --reason <text> Reject a proposal
72
+ openadr supersede <name> --by <name> Mark an accepted decision as superseded
73
+ openadr list [--json] List all records
74
+ openadr show <name> Show a record
75
+ openadr status [--json] Show lifecycle counts and validity
76
+ openadr instructions [--json] Print the next workflow step
77
+ openadr validate [name] [--all] [--json] Validate one record or the repository
78
+ openadr update [--tools <list>] Rewrite AI tool integrations
79
+ openadr config [--json] Print the current configuration
80
+ openadr completion <bash|zsh|fish> Print a shell completion script
81
+ openadr version Print the version
82
+ ```
83
+
84
+ `<name>` resolves by title, file name, or decision number (`0001`).
85
+
86
+ ## Docs
87
+
88
+ - [CLI reference](docs/cli.md)
89
+ - [Record format](docs/record-format.md)
90
+ - [Workflow](docs/workflow.md)
91
+ - [Agent skills](skills/README.md)
92
+
93
+ ## Record format
94
+
95
+ Every record is plain Markdown with a three-line header:
96
+
97
+ ```markdown
98
+ # ADR: Use SQLite for session storage
99
+
100
+ Status: proposed
101
+
102
+ ## Problem
103
+ ...
104
+ ```
105
+
106
+ - **Proposed** records require `Problem`, `Proposal`, `Alternatives
107
+ considered`, `Acceptance criteria`, and `Risks`.
108
+ - **Accepted** decisions require `Problem`, `Decision`, `Alternatives
109
+ considered`, and `Consequences`; proposal-era headings are rejected by
110
+ `validate`.
111
+ - **Rejected** proposals are frozen with the reason on the status line:
112
+ `Status: rejected — <reason>`.
113
+ - **Superseded** decisions stay in `adr/decisions/` as history, with the
114
+ replacing decision on the status line: `Status: superseded by NNNN`.
115
+ `openadr supersede <old> --by <new>` performs the rewrite; `validate`
116
+ checks that `NNNN` exists and is not itself superseded.
117
+
118
+ `openadr accept` performs the mechanical rewrite a lifecycle move always
119
+ owed: `## Proposal` becomes `## Decision`, and `Acceptance criteria` plus
120
+ `Risks` are folded into `## Consequences`.
121
+
122
+ ## Philosophy
123
+
124
+ - **The record is the source of truth.** Code comments rot, docs drift; an
125
+ ADR that says what was decided and what was given up stays useful.
126
+ - **Alternatives are mandatory.** A decision recorded without what it beat
127
+ invites re-litigation.
128
+ - **Lifecycle is mechanical, not editorial.** Moving a proposal to
129
+ accepted or rejected is a command, retiring an accepted decision via
130
+ supersede is a command, and `validate` enforces the resulting
131
+ shape.
132
+ - **Agents are first-class users.** The format is plain Markdown, paths are
133
+ predictable, and every command prints machine-readable output when asked.
134
+
135
+ ## Development
136
+
137
+ ```bash
138
+ npm install
139
+ npm run typecheck
140
+ npm test
141
+ npm run build
142
+ ```
143
+
144
+ ## Star History
145
+
146
+ [![Star History Chart](https://api.star-history.com/svg?repos=luochang212/OpenADR&type=Date)](https://www.star-history.com/#luochang212/OpenADR&Date)
147
+
148
+ ## License
149
+
150
+ [MIT](LICENSE)
package/README.zh.md ADDED
@@ -0,0 +1,131 @@
1
+ <p align="center">
2
+ <img src="assets/social-preview.png" alt="OpenADR — Open Architecture Decision Records" width="768" />
3
+ </p>
4
+
5
+ <p align="center">
6
+ <strong>Open Architecture Decision Records</strong> —— 面向人和 agent 的轻量级架构决策记录工作流。
7
+ </p>
8
+
9
+ <p align="center">
10
+ <a href="https://www.npmjs.com/package/adr-kit"><img src="https://img.shields.io/npm/v/adr-kit" alt="npm version" /></a>
11
+ <a href="https://github.com/luochang212/OpenADR/actions/workflows/ci.yml"><img src="https://github.com/luochang212/OpenADR/actions/workflows/ci.yml/badge.svg" alt="ci" /></a>
12
+ <a href="https://www.npmjs.com/package/adr-kit"><img src="https://img.shields.io/npm/dm/adr-kit" alt="npm downloads" /></a>
13
+ <a href="https://nodejs.org/"><img src="https://img.shields.io/node/v/adr-kit" alt="node" /></a>
14
+ <a href="LICENSE"><img src="https://img.shields.io/npm/l/adr-kit" alt="license" /></a>
15
+ </p>
16
+
17
+ <p align="center">
18
+ <a href="README.md">English</a> | <a href="README.zh.md">中文</a>
19
+ </p>
20
+
21
+ OpenADR 把架构决策变成纯 Markdown 文件,并带有机检的生命周期:
22
+ **proposed → accepted / rejected / superseded**。它借鉴了
23
+ [OpenSpec](https://github.com/Fission-AI/OpenSpec) 的 spec-driven 思路,以及
24
+ agent 原生代码库的决策记录纪律:每条记录都必须说明它解决什么问题、选择了什么、
25
+ 放弃了什么。
26
+
27
+ ```text
28
+ → 灵活而不僵化
29
+ → 纯 Markdown,无 front matter
30
+ → 一个决策一个文件
31
+ → 同时服务人类和 agent
32
+ ```
33
+
34
+ ## 快速开始
35
+
36
+ 需要 Node.js 20.19 或更高版本。
37
+
38
+ ```bash
39
+ npm install -g adr-kit
40
+ cd your-project
41
+ openadr init
42
+ openadr propose "使用 SQLite 存储会话"
43
+ ```
44
+
45
+ `openadr init` 会创建 `adr/` 目录:
46
+
47
+ ```text
48
+ adr/
49
+ ├── config.yaml # 项目上下文与分状态规则
50
+ ├── README.md # 仓库约定
51
+ ├── decisions/ # 已接受决策,按 NNNN 编号
52
+ ├── proposed/ # 待决策提案
53
+ └── rejected/ # 已拒绝提案,冻结保存
54
+ ```
55
+
56
+ 填写提案内容后:
57
+
58
+ ```bash
59
+ openadr validate
60
+ openadr accept "使用 SQLite 存储会话"
61
+ openadr list
62
+ ```
63
+
64
+ ## 命令
65
+
66
+ ```text
67
+ openadr init [path] 初始化 OpenADR 仓库
68
+ openadr propose <title> 创建提案
69
+ openadr decide <title> 直接记录已接受的决策
70
+ openadr accept <name> 接受提案(分配 NNNN 编号)
71
+ openadr reject <name> --reason <text> 拒绝提案
72
+ openadr supersede <name> --by <name> 标记已接受决策被新决策取代
73
+ openadr list [--json] 列出所有记录
74
+ openadr show <name> 查看记录
75
+ openadr status [--json] 查看生命周期计数与校验状态
76
+ openadr instructions [--json] 查看下一步该做什么
77
+ openadr validate [name] [--all] [--json] 校验单条记录或整个仓库
78
+ openadr update [--tools <list>] 重写 AI 工具集成文件
79
+ openadr config [--json] 查看当前配置
80
+ openadr completion <bash|zsh|fish> 打印 shell 补全脚本
81
+ openadr version 查看版本
82
+ ```
83
+
84
+ `<name>` 支持按标题、文件名或决策编号(`0001`)查找。
85
+
86
+ ## 记录格式
87
+
88
+ 每条记录都是纯 Markdown,头部固定三行:
89
+
90
+ ```markdown
91
+ # ADR: 使用 SQLite 存储会话
92
+
93
+ Status: proposed
94
+
95
+ ## Problem
96
+ ...
97
+ ```
98
+
99
+ - **Proposed** 需要 `Problem`、`Proposal`、`Alternatives considered`、
100
+ `Acceptance criteria`、`Risks`。
101
+ - **Accepted** 需要 `Problem`、`Decision`、`Alternatives considered`、
102
+ `Consequences`;`validate` 会拒绝提案时代的标题出现在已接受决策中。
103
+ - **Rejected** 冻结提案,拒绝原因写在状态行:`Status: rejected — <reason>`。
104
+ - **Superseded** 决策保留在 `adr/decisions/` 作为历史,状态行指向取代它的决策:
105
+ `Status: superseded by NNNN`。`openadr supersede <旧> --by <新>` 完成改写;
106
+ `validate` 校验 `NNNN` 存在且自身未被取代。
107
+
108
+ `openadr accept` 会自动完成生命周期迁移所要求的改写:`## Proposal` 改为
109
+ `## Decision`,`Acceptance criteria` 与 `Risks` 合并进 `## Consequences`。
110
+
111
+ ## 理念
112
+
113
+ - **记录是事实来源。** 代码注释会腐化,文档会漂移;一条写明了决定与代价的
114
+ ADR 会持续有用。
115
+ - **备选方案是强制项。** 没有记录被否决方案的决策,是在邀请未来的重复争论。
116
+ - **生命周期是机械操作,不是编辑操作。** 提案转接受或拒绝、已接受决策被取代,
117
+ 都是一条命令,`validate` 强制检查结果形态。
118
+ - **Agent 是一等用户。** 纯 Markdown、可预测的路径、需要时可输出 JSON。
119
+
120
+ ## 开发
121
+
122
+ ```bash
123
+ npm install
124
+ npm run typecheck
125
+ npm test
126
+ npm run build
127
+ ```
128
+
129
+ ## 许可证
130
+
131
+ [MIT](LICENSE)
package/bin/openadr.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import('../dist/cli.js').then(({ main }) => main(process.argv.slice(2))).catch((error) => {
3
+ console.error(error instanceof Error ? error.message : String(error));
4
+ process.exitCode = 1;
5
+ });
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function main(argv: string[]): void;
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AA0CA,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA8HzC"}
package/dist/cli.js ADDED
@@ -0,0 +1,176 @@
1
+ import { parseArgs } from 'node:util';
2
+ import { pathToFileURL } from 'node:url';
3
+ import { VERSION } from './version.js';
4
+ import { acceptCommand } from './commands/accept.js';
5
+ import { completionCommand } from './commands/completion.js';
6
+ import { configCommand } from './commands/config.js';
7
+ import { decideCommand } from './commands/decide.js';
8
+ import { initCommand } from './commands/init.js';
9
+ import { instructionsCommand } from './commands/instructions.js';
10
+ import { listCommand } from './commands/list.js';
11
+ import { proposeCommand } from './commands/propose.js';
12
+ import { rejectCommand } from './commands/reject.js';
13
+ import { showCommand } from './commands/show.js';
14
+ import { statusCommand } from './commands/status.js';
15
+ import { supersedeCommand } from './commands/supersede.js';
16
+ import { updateCommand } from './commands/update.js';
17
+ import { validateCommand } from './commands/validate.js';
18
+ const HELP = `openadr ${VERSION} — Open Architecture Decision Records
19
+
20
+ Usage:
21
+ openadr init [path] [--tools <list>] Initialize an OpenADR repository
22
+ openadr propose <title> Create a proposed decision
23
+ openadr decide <title> Create an accepted decision draft
24
+ openadr accept <name> Accept a proposal (assigns NNNN)
25
+ openadr reject <name> --reason <reason> Reject a proposal
26
+ openadr supersede <name> --by <name> Mark an accepted decision as superseded
27
+ openadr list [--json] List all decision records
28
+ openadr show <name> Show a decision record
29
+ openadr status [--json] Show lifecycle counts and validity
30
+ openadr instructions [--json] Print the next workflow step
31
+ openadr validate [name] [--all] [--json] Validate one record or the whole repo
32
+ openadr update [--tools <list>] Rewrite AI tool integrations
33
+ openadr config [--json] Print the current configuration
34
+ openadr completion <bash|zsh|fish> Print a shell completion script
35
+ openadr version Print the version
36
+ openadr -h, --help Print this help
37
+ openadr -V, --version Print the version
38
+
39
+ Run from anywhere inside the project; commands discover the nearest adr/ directory.
40
+ `;
41
+ export function main(argv) {
42
+ const { values, positionals } = parseArgs({
43
+ args: argv,
44
+ allowPositionals: true,
45
+ options: {
46
+ all: { type: 'boolean', default: false },
47
+ by: { type: 'string' },
48
+ json: { type: 'boolean', default: false },
49
+ reason: { type: 'string' },
50
+ tools: { type: 'string' },
51
+ help: { type: 'boolean', short: 'h', default: false },
52
+ version: { type: 'boolean', short: 'V', default: false },
53
+ },
54
+ });
55
+ if (values.version) {
56
+ console.log(VERSION);
57
+ return;
58
+ }
59
+ if (values.help) {
60
+ console.log(HELP);
61
+ return;
62
+ }
63
+ const command = positionals[0] ?? '';
64
+ const rest = positionals.slice(1);
65
+ try {
66
+ switch (command) {
67
+ case '': {
68
+ console.error(HELP);
69
+ process.exitCode = 1;
70
+ return;
71
+ }
72
+ case 'help': {
73
+ console.log(HELP);
74
+ return;
75
+ }
76
+ case 'version': {
77
+ console.log(VERSION);
78
+ return;
79
+ }
80
+ case 'init': {
81
+ const target = rest[0] ?? process.cwd();
82
+ console.log(initCommand(target, values.tools));
83
+ return;
84
+ }
85
+ case 'propose': {
86
+ requireTitle(rest, 'propose');
87
+ console.log(proposeCommand(rest[0], process.cwd()));
88
+ return;
89
+ }
90
+ case 'decide': {
91
+ requireTitle(rest, 'decide');
92
+ console.log(decideCommand(rest[0], process.cwd()));
93
+ return;
94
+ }
95
+ case 'accept': {
96
+ requireTitle(rest, 'accept');
97
+ console.log(acceptCommand(rest[0], process.cwd()));
98
+ return;
99
+ }
100
+ case 'reject': {
101
+ requireTitle(rest, 'reject');
102
+ const reason = values.reason;
103
+ if (reason === undefined) {
104
+ throw new Error('reject requires --reason <reason>');
105
+ }
106
+ console.log(rejectCommand(rest[0], reason, process.cwd()));
107
+ return;
108
+ }
109
+ case 'supersede': {
110
+ requireTitle(rest, 'supersede');
111
+ const by = values.by;
112
+ if (by === undefined) {
113
+ throw new Error('supersede requires --by <name>');
114
+ }
115
+ console.log(supersedeCommand(rest[0], by, process.cwd()));
116
+ return;
117
+ }
118
+ case 'list': {
119
+ console.log(listCommand(process.cwd(), values.json));
120
+ return;
121
+ }
122
+ case 'show': {
123
+ requireTitle(rest, 'show');
124
+ console.log(showCommand(rest[0], process.cwd()));
125
+ return;
126
+ }
127
+ case 'status': {
128
+ const result = statusCommand(process.cwd(), values.json);
129
+ console.log(result.output);
130
+ if (result.valid === false)
131
+ process.exitCode = 1;
132
+ return;
133
+ }
134
+ case 'instructions': {
135
+ console.log(instructionsCommand(process.cwd(), values.json));
136
+ return;
137
+ }
138
+ case 'update': {
139
+ console.log(updateCommand(process.cwd(), values.tools));
140
+ return;
141
+ }
142
+ case 'config': {
143
+ console.log(configCommand(process.cwd(), values.json));
144
+ return;
145
+ }
146
+ case 'completion': {
147
+ const shell = rest[0] ?? '';
148
+ console.log(completionCommand(shell));
149
+ return;
150
+ }
151
+ case 'validate': {
152
+ const result = validateCommand(process.cwd(), rest[0], values.json);
153
+ console.log(result.output);
154
+ if (result.valid === false)
155
+ process.exitCode = 1;
156
+ return;
157
+ }
158
+ default: {
159
+ throw new Error(`unknown command "${command}"\n\n${HELP}`);
160
+ }
161
+ }
162
+ }
163
+ catch (error) {
164
+ console.error(error instanceof Error ? error.message : String(error));
165
+ process.exitCode = 1;
166
+ }
167
+ }
168
+ function requireTitle(rest, command) {
169
+ if (rest.length === 0 || rest[0].trim().length === 0) {
170
+ throw new Error(`${command} requires a title or name`);
171
+ }
172
+ }
173
+ if (process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href) {
174
+ main(process.argv.slice(2));
175
+ }
176
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function acceptCommand(query: string, cwd: string): string;
2
+ //# sourceMappingURL=accept.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accept.d.ts","sourceRoot":"","sources":["../../src/commands/accept.ts"],"names":[],"mappings":"AAYA,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CA4BhE"}
@@ -0,0 +1,33 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { requireRoot } from '../core/config.js';
4
+ import { nextDecisionNumber, removeRecord, resolveRecord, writeRecord, } from '../core/repository.js';
5
+ import { proposalToDecision } from '../core/templates.js';
6
+ import { formatIssues, validateRecord } from '../core/validate.js';
7
+ export function acceptCommand(query, cwd) {
8
+ const root = requireRoot(cwd);
9
+ const record = resolveRecord(root, query);
10
+ if (record.folder !== 'proposed') {
11
+ throw new Error(`"${query}" is not a proposal (it is in ${record.folder})`);
12
+ }
13
+ if (/^\d{4}\s+/.test(record.title)) {
14
+ throw new Error('proposal title must not start with a four-digit number; OpenADR assigns decision numbers');
15
+ }
16
+ const issues = validateRecord(root, record);
17
+ if (issues.length > 0) {
18
+ throw new Error(`proposal is not valid; fix it before accepting:\n${formatIssues(issues)}`);
19
+ }
20
+ const number = nextDecisionNumber(root);
21
+ const padded = String(number).padStart(4, '0');
22
+ const slug = record.fileName.replace(/^\d{4}-\d{2}-\d{2}-/, '').replace(/\.md$/, '');
23
+ const fileName = `${padded}-${slug}.md`;
24
+ const path = join(root, 'adr', 'decisions', fileName);
25
+ if (existsSync(path)) {
26
+ throw new Error(`decision already exists: adr/decisions/${fileName}`);
27
+ }
28
+ const content = proposalToDecision(record, number);
29
+ writeRecord(root, 'decisions', fileName, content);
30
+ removeRecord(record);
31
+ return `accepted adr/proposed/${record.fileName} as adr/decisions/${fileName}`;
32
+ }
33
+ //# sourceMappingURL=accept.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accept.js","sourceRoot":"","sources":["../../src/commands/accept.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,WAAW,GACZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEnE,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,GAAW;IACtD,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,UAAU,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,iCAAiC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,0FAA0F,CAAC,CAAC;IAC9G,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,oDAAoD,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACrF,MAAM,QAAQ,GAAG,GAAG,MAAM,IAAI,IAAI,KAAK,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,0CAA0C,QAAQ,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClD,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,OAAO,yBAAyB,MAAM,CAAC,QAAQ,qBAAqB,QAAQ,EAAE,CAAC;AACjF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function completionCommand(shell: string): string;
2
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAmBA,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAoBvD"}
@@ -0,0 +1,40 @@
1
+ const COMMANDS = [
2
+ 'init',
3
+ 'propose',
4
+ 'decide',
5
+ 'accept',
6
+ 'reject',
7
+ 'supersede',
8
+ 'list',
9
+ 'show',
10
+ 'status',
11
+ 'instructions',
12
+ 'validate',
13
+ 'update',
14
+ 'config',
15
+ 'completion',
16
+ 'version',
17
+ 'help',
18
+ ];
19
+ export function completionCommand(shell) {
20
+ const words = COMMANDS.join(' ');
21
+ switch (shell) {
22
+ case 'bash':
23
+ return `_openadr_completion() {
24
+ local cur
25
+ cur="\${COMP_WORDS[COMP_CWORD]}"
26
+ COMPREPLY=( $(compgen -W "${words}" -- "$cur") )
27
+ }
28
+ complete -F _openadr_completion openadr
29
+ `;
30
+ case 'zsh':
31
+ return `#compdef openadr
32
+ _arguments '1:command:(${words})'
33
+ `;
34
+ case 'fish':
35
+ return COMMANDS.map((command) => `complete -c openadr -f -a "${command}"`).join('\n') + '\n';
36
+ default:
37
+ throw new Error(`unsupported shell "${shell}". Supported: bash, zsh, fish`);
38
+ }
39
+ }
40
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG;IACf,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,YAAY;IACZ,SAAS;IACT,MAAM;CACP,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM;YACT,OAAO;;;8BAGiB,KAAK;;;CAGlC,CAAC;QACE,KAAK,KAAK;YACR,OAAO;yBACY,KAAK;CAC7B,CAAC;QACE,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,8BAA8B,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAC/F;YACE,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,+BAA+B,CAAC,CAAC;IAChF,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function configCommand(cwd: string, asJson?: boolean): string;
2
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,MAAM,CAwBjE"}
@@ -0,0 +1,23 @@
1
+ import { configPath, readConfig, requireRoot } from '../core/config.js';
2
+ export function configCommand(cwd, asJson = false) {
3
+ const root = requireRoot(cwd);
4
+ const config = readConfig(root);
5
+ if (asJson) {
6
+ return JSON.stringify({
7
+ path: configPath(root),
8
+ context: config.context ?? '',
9
+ rules: config.rules ?? {},
10
+ tools: config.tools ?? [],
11
+ }, null, 2);
12
+ }
13
+ const lines = [`config: ${configPath(root)}`, ''];
14
+ if (config.context !== undefined && config.context.trim().length > 0) {
15
+ lines.push('context:', config.context.trim(), '');
16
+ }
17
+ if (config.tools !== undefined && config.tools.length > 0) {
18
+ lines.push(`tools: ${config.tools.join(', ')}`, '');
19
+ }
20
+ lines.push(`rules: ${JSON.stringify(config.rules ?? {})}`);
21
+ return lines.join('\n');
22
+ }
23
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAExE,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,MAAM,GAAG,KAAK;IACvD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,IAAI,CAAC,SAAS,CACnB;YACE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;YAC7B,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;SAC1B,EACD,IAAI,EACJ,CAAC,CACF,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,WAAW,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAClD,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrE,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function decideCommand(title: string, cwd: string): string;
2
+ //# sourceMappingURL=decide.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decide.d.ts","sourceRoot":"","sources":["../../src/commands/decide.ts"],"names":[],"mappings":"AAOA,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAmBhE"}