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.
- package/LICENSE +21 -0
- package/README.md +150 -0
- package/README.zh.md +131 -0
- package/bin/openadr.js +5 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +176 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/accept.d.ts +2 -0
- package/dist/commands/accept.d.ts.map +1 -0
- package/dist/commands/accept.js +33 -0
- package/dist/commands/accept.js.map +1 -0
- package/dist/commands/completion.d.ts +2 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +40 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +23 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/decide.d.ts +2 -0
- package/dist/commands/decide.d.ts.map +1 -0
- package/dist/commands/decide.js +27 -0
- package/dist/commands/decide.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +18 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/instructions.d.ts +2 -0
- package/dist/commands/instructions.d.ts.map +1 -0
- package/dist/commands/instructions.js +60 -0
- package/dist/commands/instructions.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +43 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/propose.d.ts +2 -0
- package/dist/commands/propose.d.ts.map +1 -0
- package/dist/commands/propose.js +26 -0
- package/dist/commands/propose.js.map +1 -0
- package/dist/commands/reject.d.ts +2 -0
- package/dist/commands/reject.d.ts.map +1 -0
- package/dist/commands/reject.js +26 -0
- package/dist/commands/reject.js.map +1 -0
- package/dist/commands/show.d.ts +2 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +11 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +46 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/supersede.d.ts +2 -0
- package/dist/commands/supersede.d.ts.map +1 -0
- package/dist/commands/supersede.js +36 -0
- package/dist/commands/supersede.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +13 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/validate.d.ts +6 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +38 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/core/adr.d.ts +44 -0
- package/dist/core/adr.d.ts.map +1 -0
- package/dist/core/adr.js +143 -0
- package/dist/core/adr.js.map +1 -0
- package/dist/core/config.d.ts +22 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +63 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/repository.d.ts +19 -0
- package/dist/core/repository.d.ts.map +1 -0
- package/dist/core/repository.js +190 -0
- package/dist/core/repository.js.map +1 -0
- package/dist/core/slug.d.ts +10 -0
- package/dist/core/slug.d.ts.map +1 -0
- package/dist/core/slug.js +19 -0
- package/dist/core/slug.js.map +1 -0
- package/dist/core/templates.d.ts +11 -0
- package/dist/core/templates.d.ts.map +1 -0
- package/dist/core/templates.js +126 -0
- package/dist/core/templates.js.map +1 -0
- package/dist/core/tool-integrations.d.ts +16 -0
- package/dist/core/tool-integrations.d.ts.map +1 -0
- package/dist/core/tool-integrations.js +256 -0
- package/dist/core/tool-integrations.js.map +1 -0
- package/dist/core/validate.d.ts +9 -0
- package/dist/core/validate.d.ts.map +1 -0
- package/dist/core/validate.js +183 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- 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
|
+
[](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
package/dist/cli.d.ts
ADDED
|
@@ -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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|