adr-kit 0.2.3 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +31 -7
- package/README.zh.md +29 -7
- package/dist/cli.js +1 -1
- package/dist/commands/propose.d.ts.map +1 -1
- package/dist/commands/propose.js +2 -1
- package/dist/commands/propose.js.map +1 -1
- package/dist/commands/reject.d.ts.map +1 -1
- package/dist/commands/reject.js +3 -3
- package/dist/commands/reject.js.map +1 -1
- package/dist/commands/supersede.d.ts.map +1 -1
- package/dist/commands/supersede.js +10 -6
- package/dist/commands/supersede.js.map +1 -1
- package/dist/core/adr.d.ts +29 -3
- package/dist/core/adr.d.ts.map +1 -1
- package/dist/core/adr.js +103 -32
- package/dist/core/adr.js.map +1 -1
- package/dist/core/repository.d.ts +0 -1
- package/dist/core/repository.d.ts.map +1 -1
- package/dist/core/repository.js +10 -10
- package/dist/core/repository.js.map +1 -1
- package/dist/core/templates.d.ts +19 -2
- package/dist/core/templates.d.ts.map +1 -1
- package/dist/core/templates.js +82 -12
- package/dist/core/templates.js.map +1 -1
- package/dist/core/tool-integrations.d.ts.map +1 -1
- package/dist/core/tool-integrations.js +6 -5
- package/dist/core/tool-integrations.js.map +1 -1
- package/dist/core/validate.d.ts +1 -1
- package/dist/core/validate.d.ts.map +1 -1
- package/dist/core/validate.js +21 -5
- package/dist/core/validate.js.map +1 -1
- package/package.json +3 -2
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
</p>
|
|
15
15
|
|
|
16
16
|
<p>
|
|
17
|
-
<img src="
|
|
17
|
+
<img src="./assets/readme-banner.png" alt="ADR Kit" width="100%" />
|
|
18
18
|
</p>
|
|
19
19
|
|
|
20
20
|
ADR Kit turns architecture decisions into plain Markdown files with a
|
|
@@ -24,7 +24,7 @@ and the decision-record discipline of agent-native codebases: every record
|
|
|
24
24
|
must say what problem it solves, what it chose, and what it gave up.
|
|
25
25
|
|
|
26
26
|
- fluid not rigid
|
|
27
|
-
- plain Markdown
|
|
27
|
+
- plain Markdown
|
|
28
28
|
- one decision, one file
|
|
29
29
|
- built for agents and humans alike
|
|
30
30
|
|
|
@@ -91,25 +91,34 @@ adrkit version Print the version
|
|
|
91
91
|
|
|
92
92
|
## Record format
|
|
93
93
|
|
|
94
|
-
Every record is
|
|
94
|
+
Every record is YAML front matter followed by a Markdown body:
|
|
95
95
|
|
|
96
96
|
```markdown
|
|
97
|
+
---
|
|
98
|
+
status: proposed
|
|
99
|
+
date: 2026-08-19
|
|
100
|
+
---
|
|
101
|
+
|
|
97
102
|
# ADR: Use SQLite for session storage
|
|
98
|
-
Status: proposed
|
|
99
103
|
|
|
100
104
|
## Problem
|
|
101
105
|
...
|
|
102
106
|
```
|
|
103
107
|
|
|
108
|
+
The `date` field records when the current status was reached; the CLI
|
|
109
|
+
stamps it at every lifecycle move (propose, decide, accept, reject,
|
|
110
|
+
supersede), so the record stays truthful without manual date entry.
|
|
111
|
+
|
|
104
112
|
- **Proposed** records require `Problem`, `Proposal`, `Alternatives
|
|
105
113
|
considered`, `Acceptance criteria`, and `Risks`.
|
|
106
114
|
- **Accepted** decisions require `Problem`, `Decision`, `Alternatives
|
|
107
115
|
considered`, and `Consequences`; proposal-era headings are rejected by
|
|
108
116
|
`validate`.
|
|
109
|
-
- **Rejected** proposals are frozen with the reason
|
|
110
|
-
`
|
|
117
|
+
- **Rejected** proposals are frozen with the reason in the front matter:
|
|
118
|
+
`status: rejected` plus `reason: <why>`.
|
|
111
119
|
- **Superseded** decisions stay in `adr/decisions/` as history, with the
|
|
112
|
-
replacing decision
|
|
120
|
+
replacing decision in the front matter: `status: superseded` plus
|
|
121
|
+
`superseded-by: N`.
|
|
113
122
|
`adrkit supersede <old> --by <new>` performs the rewrite; `validate`
|
|
114
123
|
checks that `N` exists and is not itself superseded.
|
|
115
124
|
|
|
@@ -117,6 +126,21 @@ Status: proposed
|
|
|
117
126
|
owed: `## Proposal` becomes `## Decision`, and `Acceptance criteria` plus
|
|
118
127
|
`Risks` are folded into `## Consequences`.
|
|
119
128
|
|
|
129
|
+
## Compatibility with other tools
|
|
130
|
+
|
|
131
|
+
ADR Kit owns one directory - `adr/` - and reads and validates only its own
|
|
132
|
+
files, so it can share a repository with any tool that does not collide
|
|
133
|
+
with that layout. Its agent skills are namespaced per tool (`adrkit-*`),
|
|
134
|
+
and `adrkit update` only rewrites its own integrations.
|
|
135
|
+
|
|
136
|
+
| Tool | Role | Relationship |
|
|
137
|
+
|---|---|---|
|
|
138
|
+
| [OpenSpec](https://github.com/Fission-AI/OpenSpec) | Forward-looking: specifies what to build | Complementary - specs vs records |
|
|
139
|
+
| [Changesets](https://changesets.dev) | Release tooling: versions and changelog | Orthogonal - cite the ADR number in the changeset body |
|
|
140
|
+
|
|
141
|
+
When a change makes an architectural decision that should outlive the
|
|
142
|
+
change, record it as an ADR.
|
|
143
|
+
|
|
120
144
|
## Sources of Inspiration
|
|
121
145
|
|
|
122
146
|
ADR Kit stands on two projects, in two different roles:
|
package/README.zh.md
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
</p>
|
|
15
15
|
|
|
16
16
|
<p>
|
|
17
|
-
<img src="
|
|
17
|
+
<img src="./assets/readme-banner.png" alt="ADR Kit" width="100%" />
|
|
18
18
|
</p>
|
|
19
19
|
|
|
20
20
|
ADR Kit 把架构决策变成纯 Markdown 文件,并带有机检的生命周期:
|
|
@@ -24,7 +24,7 @@ agent 原生代码库的决策记录纪律:每条记录都必须说明它解
|
|
|
24
24
|
放弃了什么。
|
|
25
25
|
|
|
26
26
|
- 灵活而不僵化
|
|
27
|
-
- 纯 Markdown
|
|
27
|
+
- 纯 Markdown
|
|
28
28
|
- 一个决策一个文件
|
|
29
29
|
- 同时服务人类和 agent
|
|
30
30
|
|
|
@@ -91,28 +91,50 @@ adrkit version 查看版本
|
|
|
91
91
|
|
|
92
92
|
## 记录格式
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
每条记录都是 YAML front matter 加 Markdown 正文:
|
|
95
95
|
|
|
96
96
|
```markdown
|
|
97
|
+
---
|
|
98
|
+
status: proposed
|
|
99
|
+
date: 2026-08-19
|
|
100
|
+
---
|
|
101
|
+
|
|
97
102
|
# ADR: 使用 SQLite 存储会话
|
|
98
|
-
Status: proposed
|
|
99
103
|
|
|
100
104
|
## Problem
|
|
101
105
|
...
|
|
102
106
|
```
|
|
103
107
|
|
|
108
|
+
`date` 字段记录当前状态达成的日期;CLI 在每次生命周期迁移时自动盖章
|
|
109
|
+
(propose、decide、accept、reject、supersede),无需手动填写日期。
|
|
110
|
+
|
|
104
111
|
- **Proposed** 需要 `Problem`、`Proposal`、`Alternatives considered`、
|
|
105
112
|
`Acceptance criteria`、`Risks`。
|
|
106
113
|
- **Accepted** 需要 `Problem`、`Decision`、`Alternatives considered`、
|
|
107
114
|
`Consequences`;`validate` 会拒绝提案时代的标题出现在已接受决策中。
|
|
108
|
-
- **Rejected**
|
|
109
|
-
|
|
110
|
-
|
|
115
|
+
- **Rejected** 冻结提案,拒绝原因写在 front matter:`status: rejected`
|
|
116
|
+
加 `reason: <原因>`。
|
|
117
|
+
- **Superseded** 决策保留在 `adr/decisions/` 作为历史,front matter 指向
|
|
118
|
+
取代它的决策:`status: superseded` 加 `superseded-by: N`。
|
|
119
|
+
`adrkit supersede <旧> --by <新>` 完成改写;
|
|
111
120
|
`validate` 校验 `N` 存在且自身未被取代。
|
|
112
121
|
|
|
113
122
|
`adrkit accept` 会自动完成生命周期迁移所要求的改写:`## Proposal` 改为
|
|
114
123
|
`## Decision`,`Acceptance criteria` 与 `Risks` 合并进 `## Consequences`。
|
|
115
124
|
|
|
125
|
+
## 工具兼容性
|
|
126
|
+
|
|
127
|
+
ADR Kit 只拥有一个目录——`adr/`——并且只读取和校验自己的文件,因此可以
|
|
128
|
+
与任何不占用该布局的工具共处于一个仓库。它的 agent skills 按工具命名空间
|
|
129
|
+
隔离(`adrkit-*`),`adrkit update` 只重写自己的集成文件。
|
|
130
|
+
|
|
131
|
+
| 工具 | 角色 | 与 ADR Kit 的关系 |
|
|
132
|
+
|---|---|---|
|
|
133
|
+
| [OpenSpec](https://github.com/Fission-AI/OpenSpec) | 前瞻:规定要构建什么 | 互补——规格与记录各司其职 |
|
|
134
|
+
| [Changesets](https://changesets.dev) | 发布:版本号与 changelog | 正交——changeset 正文引用 ADR 编号 |
|
|
135
|
+
|
|
136
|
+
当某个变更做出了应比变更本身更长命的架构决策时,把它记成一条 ADR。
|
|
137
|
+
|
|
116
138
|
## 灵感来源
|
|
117
139
|
|
|
118
140
|
ADR Kit 站在两个项目之上,两者角色不同:
|
package/dist/cli.js
CHANGED
|
@@ -15,7 +15,7 @@ import { statusCommand } from './commands/status.js';
|
|
|
15
15
|
import { supersedeCommand } from './commands/supersede.js';
|
|
16
16
|
import { updateCommand } from './commands/update.js';
|
|
17
17
|
import { validateCommand } from './commands/validate.js';
|
|
18
|
-
const HELP = `adrkit ${VERSION} -
|
|
18
|
+
const HELP = `adrkit ${VERSION} - A lightweight ADR workflow for humans and agents
|
|
19
19
|
|
|
20
20
|
Usage:
|
|
21
21
|
adrkit init [path] [--tools <list>] Initialize an ADR Kit repository
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propose.d.ts","sourceRoot":"","sources":["../../src/commands/propose.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"propose.d.ts","sourceRoot":"","sources":["../../src/commands/propose.ts"],"names":[],"mappings":"AAQA,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAkBjE"}
|
package/dist/commands/propose.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { readConfig, requireRoot } from '../core/config.js';
|
|
4
|
-
import { folderPath,
|
|
4
|
+
import { folderPath, writeRecord } from '../core/repository.js';
|
|
5
|
+
import { todayStamp } from '../core/adr.js';
|
|
5
6
|
import { proposalTemplate } from '../core/templates.js';
|
|
6
7
|
import { slugify } from '../core/slug.js';
|
|
7
8
|
export function proposeCommand(title, cwd) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propose.js","sourceRoot":"","sources":["../../src/commands/propose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"propose.js","sourceRoot":"","sources":["../../src/commands/propose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,GAAW;IACvD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,GAAG,UAAU,EAAE,IAAI,IAAI,KAAK,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC1D,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,yCAAyC,QAAQ,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;IACpE,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjD,OAAO,wBAAwB,QAAQ,4CAA4C,QAAQ,EAAE,CAAC;AAChG,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reject.d.ts","sourceRoot":"","sources":["../../src/commands/reject.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reject.d.ts","sourceRoot":"","sources":["../../src/commands/reject.ts"],"names":[],"mappings":"AAOA,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAyBhF"}
|
package/dist/commands/reject.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
+
import { todayStamp } from '../core/adr.js';
|
|
3
4
|
import { requireRoot } from '../core/config.js';
|
|
4
5
|
import { folderPath, readRecord, removeRecord, resolveRecord, writeRecord } from '../core/repository.js';
|
|
6
|
+
import { stampLifecycleMove } from '../core/templates.js';
|
|
5
7
|
export function rejectCommand(query, reason, cwd) {
|
|
6
8
|
const root = requireRoot(cwd);
|
|
7
9
|
const record = resolveRecord(root, query);
|
|
@@ -17,9 +19,7 @@ export function rejectCommand(query, reason, cwd) {
|
|
|
17
19
|
throw new Error(`rejected record already exists: adr/rejected/${record.fileName}`);
|
|
18
20
|
}
|
|
19
21
|
const original = readRecord(record);
|
|
20
|
-
|
|
21
|
-
lines[1] = `Status: rejected — ${trimmedReason}`;
|
|
22
|
-
writeRecord(root, 'rejected', record.fileName, lines.join('\n'));
|
|
22
|
+
writeRecord(root, 'rejected', record.fileName, stampLifecycleMove(original, { status: 'rejected', date: todayStamp(), reason: trimmedReason }));
|
|
23
23
|
removeRecord(record);
|
|
24
24
|
return `rejected adr/proposed/${record.fileName} as adr/rejected/${record.fileName}`;
|
|
25
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reject.js","sourceRoot":"","sources":["../../src/commands/reject.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,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"reject.js","sourceRoot":"","sources":["../../src/commands/reject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzG,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,MAAc,EAAE,GAAW;IACtE,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,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjE,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,gDAAgD,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACpC,WAAW,CACT,IAAI,EACJ,UAAU,EACV,MAAM,CAAC,QAAQ,EACf,kBAAkB,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAChG,CAAC;IACF,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,OAAO,yBAAyB,MAAM,CAAC,QAAQ,oBAAoB,MAAM,CAAC,QAAQ,EAAE,CAAC;AACvF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supersede.d.ts","sourceRoot":"","sources":["../../src/commands/supersede.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"supersede.d.ts","sourceRoot":"","sources":["../../src/commands/supersede.ts"],"names":[],"mappings":"AAKA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CA0CpF"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { todayStamp } from '../core/adr.js';
|
|
1
2
|
import { requireRoot } from '../core/config.js';
|
|
2
3
|
import { readRecord, resolveRecord, writeRecord } from '../core/repository.js';
|
|
4
|
+
import { stampLifecycleMove } from '../core/templates.js';
|
|
3
5
|
export function supersedeCommand(query, byQuery, cwd) {
|
|
4
6
|
const root = requireRoot(cwd);
|
|
5
7
|
const record = resolveRecord(root, query);
|
|
@@ -23,13 +25,15 @@ export function supersedeCommand(query, byQuery, cwd) {
|
|
|
23
25
|
if (replacement.number === undefined) {
|
|
24
26
|
throw new Error(`"--by ${byQuery}" has no decision number`);
|
|
25
27
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
if (lines[1] !== 'Status: accepted') {
|
|
29
|
-
throw new Error(`unexpected status line "${lines[1] ?? ''}" in ${record.fileName}`);
|
|
28
|
+
if (record.status !== 'accepted') {
|
|
29
|
+
throw new Error(`unexpected status "${record.status}" in ${record.fileName}`);
|
|
30
30
|
}
|
|
31
|
-
|
|
32
|
-
writeRecord(root, 'decisions', record.fileName,
|
|
31
|
+
const original = readRecord(record);
|
|
32
|
+
writeRecord(root, 'decisions', record.fileName, stampLifecycleMove(original, {
|
|
33
|
+
status: 'superseded',
|
|
34
|
+
date: todayStamp(),
|
|
35
|
+
'superseded-by': replacement.number,
|
|
36
|
+
}));
|
|
33
37
|
return `superseded adr/decisions/${record.fileName} by adr/decisions/${replacement.fileName}`;
|
|
34
38
|
}
|
|
35
39
|
//# sourceMappingURL=supersede.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supersede.js","sourceRoot":"","sources":["../../src/commands/supersede.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"supersede.js","sourceRoot":"","sources":["../../src/commands/supersede.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,OAAe,EAAE,GAAW;IAC1E,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,2CAA2C,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;QACzC,MAAM,IAAI,KAAK,CACb,IAAI,KAAK,8BAA8B,OAAO,yDAAyD,CACxG,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,IAAI,WAAW,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,2CAA2C,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,2EAA2E,CAAC,CAAC;IAC/G,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,0BAA0B,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,MAAM,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACpC,WAAW,CACT,IAAI,EACJ,WAAW,EACX,MAAM,CAAC,QAAQ,EACf,kBAAkB,CAAC,QAAQ,EAAE;QAC3B,MAAM,EAAE,YAAY;QACpB,IAAI,EAAE,UAAU,EAAE;QAClB,eAAe,EAAE,WAAW,CAAC,MAAM;KACpC,CAAC,CACH,CAAC;IACF,OAAO,4BAA4B,MAAM,CAAC,QAAQ,qBAAqB,WAAW,CAAC,QAAQ,EAAE,CAAC;AAChG,CAAC"}
|
package/dist/core/adr.d.ts
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
export type AdrStatus = 'proposed' | 'accepted' | 'rejected' | 'superseded';
|
|
2
2
|
export type AdrFolder = 'proposed' | 'decisions' | 'rejected';
|
|
3
|
+
/** Canonical front matter field order; only fields that exist are written. */
|
|
4
|
+
export declare const FRONT_MATTER_ORDER: readonly ["status", "date", "reason", "superseded-by"];
|
|
5
|
+
/** Sections that only make sense during the proposal era and must not appear in an accepted decision. */
|
|
6
|
+
export declare const PROPOSAL_ERA_HEADINGS: string[];
|
|
7
|
+
/** A `YYYY-MM-DD` date value. Shared by the parser (format) and validate (calendar validity). */
|
|
8
|
+
export declare const DATE_PATTERN: RegExp;
|
|
9
|
+
/**
|
|
10
|
+
* Today's date as `YYYY-MM-DD` in local time. The single source of the date:
|
|
11
|
+
* it feeds the `date` front matter field that every record carries and the
|
|
12
|
+
* `YYYY-MM-DD-` prefix of proposal file names, so the two always agree.
|
|
13
|
+
*/
|
|
14
|
+
export declare function todayStamp(): string;
|
|
3
15
|
export interface AdrSection {
|
|
4
16
|
heading: string;
|
|
5
17
|
body: string;
|
|
@@ -10,11 +22,15 @@ export interface AdrRecord {
|
|
|
10
22
|
fileName: string;
|
|
11
23
|
title: string;
|
|
12
24
|
status: AdrStatus;
|
|
25
|
+
/** Date the current status was recorded, `YYYY-MM-DD` in local time. */
|
|
26
|
+
date: string;
|
|
13
27
|
rejectionReason?: string;
|
|
14
28
|
/** For superseded decisions: the number of the decision that replaced this one. */
|
|
15
29
|
supersededBy?: number;
|
|
16
30
|
number?: number;
|
|
17
31
|
sections: AdrSection[];
|
|
32
|
+
/** Front matter keys outside the canonical set; validate reports them. */
|
|
33
|
+
frontMatterExtras?: string[];
|
|
18
34
|
}
|
|
19
35
|
export declare class AdrFormatError extends Error {
|
|
20
36
|
readonly path: string;
|
|
@@ -27,13 +43,23 @@ export declare function hasMeaningfulBody(body: string | undefined): boolean;
|
|
|
27
43
|
/**
|
|
28
44
|
* Parse a single ADR markdown file into its structured parts.
|
|
29
45
|
*
|
|
30
|
-
* The format is
|
|
46
|
+
* The format is YAML front matter followed by a Markdown body:
|
|
47
|
+
*
|
|
48
|
+
* ---
|
|
49
|
+
* status: proposed | accepted | rejected | superseded
|
|
50
|
+
* date: YYYY-MM-DD
|
|
51
|
+
* reason: <why> (rejected only)
|
|
52
|
+
* superseded-by: <N> (superseded only)
|
|
53
|
+
* ---
|
|
31
54
|
*
|
|
32
55
|
* # ADR: <title or "N Title">
|
|
33
|
-
*
|
|
34
|
-
* <blank line>
|
|
56
|
+
*
|
|
35
57
|
* ## Problem
|
|
36
58
|
* ...
|
|
59
|
+
*
|
|
60
|
+
* The `date` field records the date the current status was reached and is
|
|
61
|
+
* stamped by the CLI at every lifecycle move (propose, decide, accept,
|
|
62
|
+
* reject, supersede).
|
|
37
63
|
*/
|
|
38
64
|
export declare function parseAdrFile(filePath: string): AdrRecord;
|
|
39
65
|
//# sourceMappingURL=adr.d.ts.map
|
package/dist/core/adr.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adr.d.ts","sourceRoot":"","sources":["../../src/core/adr.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"adr.d.ts","sourceRoot":"","sources":["../../src/core/adr.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;AAC5E,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,CAAC;AAE9D,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,wDAAyD,CAAC;AAEzF,yGAAyG;AACzG,eAAO,MAAM,qBAAqB,UAAyE,CAAC;AAE5G,iGAAiG;AACjG,eAAO,MAAM,YAAY,QAA8B,CAAC;AAExD;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAMnC;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,CAAC;IAClB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mFAAmF;IACnF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,qBAAa,cAAe,SAAQ,KAAK;aAGrB,IAAI,EAAE,MAAM;gBAD5B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM;CAK/B;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAS5D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAU5D;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE9E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAInE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAoIxD"}
|
package/dist/core/adr.js
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
2
|
import { basename } from 'node:path';
|
|
3
|
+
import { parse } from 'yaml';
|
|
4
|
+
/** Canonical front matter field order; only fields that exist are written. */
|
|
5
|
+
export const FRONT_MATTER_ORDER = ['status', 'date', 'reason', 'superseded-by'];
|
|
6
|
+
/** Sections that only make sense during the proposal era and must not appear in an accepted decision. */
|
|
7
|
+
export const PROPOSAL_ERA_HEADINGS = ['Proposal', 'Acceptance criteria', 'Risks', 'Plan', 'Migration plan'];
|
|
8
|
+
/** A `YYYY-MM-DD` date value. Shared by the parser (format) and validate (calendar validity). */
|
|
9
|
+
export const DATE_PATTERN = /^(\d{4})-(\d{2})-(\d{2})$/;
|
|
10
|
+
/**
|
|
11
|
+
* Today's date as `YYYY-MM-DD` in local time. The single source of the date:
|
|
12
|
+
* it feeds the `date` front matter field that every record carries and the
|
|
13
|
+
* `YYYY-MM-DD-` prefix of proposal file names, so the two always agree.
|
|
14
|
+
*/
|
|
15
|
+
export function todayStamp() {
|
|
16
|
+
const now = new Date();
|
|
17
|
+
const year = now.getFullYear();
|
|
18
|
+
const month = String(now.getMonth() + 1).padStart(2, '0');
|
|
19
|
+
const day = String(now.getDate()).padStart(2, '0');
|
|
20
|
+
return `${year}-${month}-${day}`;
|
|
21
|
+
}
|
|
3
22
|
export class AdrFormatError extends Error {
|
|
4
23
|
path;
|
|
5
24
|
constructor(message, path) {
|
|
@@ -41,59 +60,108 @@ export function hasMeaningfulBody(body) {
|
|
|
41
60
|
/**
|
|
42
61
|
* Parse a single ADR markdown file into its structured parts.
|
|
43
62
|
*
|
|
44
|
-
* The format is
|
|
63
|
+
* The format is YAML front matter followed by a Markdown body:
|
|
64
|
+
*
|
|
65
|
+
* ---
|
|
66
|
+
* status: proposed | accepted | rejected | superseded
|
|
67
|
+
* date: YYYY-MM-DD
|
|
68
|
+
* reason: <why> (rejected only)
|
|
69
|
+
* superseded-by: <N> (superseded only)
|
|
70
|
+
* ---
|
|
45
71
|
*
|
|
46
72
|
* # ADR: <title or "N Title">
|
|
47
|
-
*
|
|
48
|
-
* <blank line>
|
|
73
|
+
*
|
|
49
74
|
* ## Problem
|
|
50
75
|
* ...
|
|
76
|
+
*
|
|
77
|
+
* The `date` field records the date the current status was reached and is
|
|
78
|
+
* stamped by the CLI at every lifecycle move (propose, decide, accept,
|
|
79
|
+
* reject, supersede).
|
|
51
80
|
*/
|
|
52
81
|
export function parseAdrFile(filePath) {
|
|
53
82
|
const text = readFileSync(filePath, 'utf8');
|
|
54
83
|
const lines = text.split(/\r?\n/);
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
throw new AdrFormatError('first line must be "# ADR: <title>"', filePath);
|
|
84
|
+
if (lines[0] !== '---') {
|
|
85
|
+
throw new AdrFormatError('file must start with a YAML front matter block ("---")', filePath);
|
|
58
86
|
}
|
|
59
|
-
const
|
|
60
|
-
if (
|
|
61
|
-
throw new AdrFormatError('
|
|
87
|
+
const closing = lines.indexOf('---', 1);
|
|
88
|
+
if (closing === -1) {
|
|
89
|
+
throw new AdrFormatError('front matter block is not closed ("---" missing)', filePath);
|
|
90
|
+
}
|
|
91
|
+
let frontMatter;
|
|
92
|
+
try {
|
|
93
|
+
frontMatter = parse(lines.slice(1, closing).join('\n'));
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
97
|
+
throw new AdrFormatError(`front matter is not valid YAML: ${detail}`, filePath);
|
|
98
|
+
}
|
|
99
|
+
if (typeof frontMatter !== 'object' || frontMatter === null || Array.isArray(frontMatter)) {
|
|
100
|
+
throw new AdrFormatError('front matter must be a YAML mapping', filePath);
|
|
62
101
|
}
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
102
|
+
const fields = frontMatter;
|
|
103
|
+
const extras = Object.keys(fields).filter((key) => !FRONT_MATTER_ORDER.includes(key));
|
|
104
|
+
const statusText = fields['status'];
|
|
105
|
+
if (statusText === undefined) {
|
|
106
|
+
throw new AdrFormatError('front matter must include "status"', filePath);
|
|
66
107
|
}
|
|
67
|
-
|
|
68
|
-
|
|
108
|
+
if (statusText !== 'proposed' &&
|
|
109
|
+
statusText !== 'accepted' &&
|
|
110
|
+
statusText !== 'rejected' &&
|
|
111
|
+
statusText !== 'superseded') {
|
|
112
|
+
throw new AdrFormatError('status must be "proposed", "accepted", "rejected", or "superseded"', filePath);
|
|
113
|
+
}
|
|
114
|
+
const status = statusText;
|
|
115
|
+
const dateText = fields['date'];
|
|
116
|
+
if (dateText === undefined) {
|
|
117
|
+
throw new AdrFormatError('front matter must include "date"', filePath);
|
|
118
|
+
}
|
|
119
|
+
if (typeof dateText !== 'string' || !DATE_PATTERN.test(dateText)) {
|
|
120
|
+
throw new AdrFormatError('date must be a "YYYY-MM-DD" string', filePath);
|
|
121
|
+
}
|
|
122
|
+
const date = dateText;
|
|
69
123
|
let rejectionReason;
|
|
70
|
-
|
|
71
|
-
if (
|
|
72
|
-
|
|
124
|
+
const reason = fields['reason'];
|
|
125
|
+
if (status === 'rejected') {
|
|
126
|
+
if (typeof reason !== 'string' || reason.trim().length === 0) {
|
|
127
|
+
throw new AdrFormatError('rejected status requires a non-empty "reason"', filePath);
|
|
128
|
+
}
|
|
129
|
+
rejectionReason = reason;
|
|
73
130
|
}
|
|
74
|
-
else if (
|
|
75
|
-
status
|
|
131
|
+
else if (reason !== undefined) {
|
|
132
|
+
throw new AdrFormatError('"reason" is only allowed when status is "rejected"', filePath);
|
|
76
133
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
if (
|
|
81
|
-
|
|
134
|
+
let supersededBy;
|
|
135
|
+
const supersededByField = fields['superseded-by'];
|
|
136
|
+
if (status === 'superseded') {
|
|
137
|
+
if (typeof supersededByField !== 'number' ||
|
|
138
|
+
!Number.isInteger(supersededByField) ||
|
|
139
|
+
supersededByField < 1) {
|
|
140
|
+
throw new AdrFormatError('superseded status requires a positive integer "superseded-by"', filePath);
|
|
82
141
|
}
|
|
142
|
+
supersededBy = supersededByField;
|
|
83
143
|
}
|
|
84
|
-
else if (
|
|
85
|
-
|
|
86
|
-
supersededBy = Number(statusText.slice('superseded by '.length));
|
|
144
|
+
else if (supersededByField !== undefined) {
|
|
145
|
+
throw new AdrFormatError('"superseded-by" is only allowed when status is "superseded"', filePath);
|
|
87
146
|
}
|
|
88
|
-
|
|
89
|
-
|
|
147
|
+
const body = lines.slice(closing + 1);
|
|
148
|
+
if ((body[0] ?? '') !== '') {
|
|
149
|
+
throw new AdrFormatError('front matter must be followed by a blank line', filePath);
|
|
150
|
+
}
|
|
151
|
+
const titleLine = body[1] ?? '';
|
|
152
|
+
if (!titleLine.startsWith('# ADR: ')) {
|
|
153
|
+
throw new AdrFormatError('title line must be "# ADR: <title>"', filePath);
|
|
154
|
+
}
|
|
155
|
+
const title = titleLine.slice('# ADR: '.length).trim();
|
|
156
|
+
if (title.length === 0) {
|
|
157
|
+
throw new AdrFormatError('ADR title must not be empty', filePath);
|
|
90
158
|
}
|
|
91
|
-
if ((
|
|
92
|
-
throw new AdrFormatError('
|
|
159
|
+
if ((body[2] ?? '') !== '') {
|
|
160
|
+
throw new AdrFormatError('the title must be followed by a blank line', filePath);
|
|
93
161
|
}
|
|
94
162
|
const sections = [];
|
|
95
163
|
let current = null;
|
|
96
|
-
for (const line of
|
|
164
|
+
for (const line of body.slice(3)) {
|
|
97
165
|
if (line.startsWith('## ')) {
|
|
98
166
|
if (current !== null)
|
|
99
167
|
sections.push(current);
|
|
@@ -116,12 +184,15 @@ export function parseAdrFile(filePath) {
|
|
|
116
184
|
fileName: basename(filePath),
|
|
117
185
|
title,
|
|
118
186
|
status,
|
|
187
|
+
date,
|
|
119
188
|
sections,
|
|
120
189
|
};
|
|
121
190
|
if (rejectionReason !== undefined)
|
|
122
191
|
parsed.rejectionReason = rejectionReason;
|
|
123
192
|
if (supersededBy !== undefined)
|
|
124
193
|
parsed.supersededBy = supersededBy;
|
|
194
|
+
if (extras.length > 0)
|
|
195
|
+
parsed.frontMatterExtras = extras;
|
|
125
196
|
if (numberMatch !== null) {
|
|
126
197
|
parsed.number = Number(numberMatch[1]);
|
|
127
198
|
}
|
package/dist/core/adr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adr.js","sourceRoot":"","sources":["../../src/core/adr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"adr.js","sourceRoot":"","sources":["../../src/core/adr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAK7B,8EAA8E;AAC9E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,CAAU,CAAC;AAEzF,yGAAyG;AACzG,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,UAAU,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAE5G,iGAAiG;AACjG,MAAM,CAAC,MAAM,YAAY,GAAG,2BAA2B,CAAC;AAExD;;;;GAIG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACnD,OAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;AACnC,CAAC;AAwBD,MAAM,OAAO,cAAe,SAAQ,KAAK;IAGrB;IAFlB,YACE,OAAe,EACC,IAAY;QAE5B,KAAK,CAAC,GAAG,OAAO,KAAK,IAAI,GAAG,CAAC,CAAC;QAFd,SAAI,GAAJ,IAAI,CAAQ;QAG5B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,WAAW;YACd,OAAO,UAAU,CAAC;QACpB,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;QACpB,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;IACtB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU,CAAC;QAChB,KAAK,YAAY;YACf,OAAO,WAAW,CAAC;QACrB,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;QACpB,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;IACtB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,MAAiB,EAAE,OAAe;IACxD,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAwB;IACxD,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAC7D,OAAO,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAElC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;QACvB,MAAM,IAAI,cAAc,CAAC,wDAAwD,EAAE,QAAQ,CAAC,CAAC;IAC/F,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACxC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,cAAc,CAAC,kDAAkD,EAAE,QAAQ,CAAC,CAAC;IACzF,CAAC;IAED,IAAI,WAAoB,CAAC;IACzB,IAAI,CAAC;QACH,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,IAAI,cAAc,CAAC,mCAAmC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1F,MAAM,IAAI,cAAc,CAAC,qCAAqC,EAAE,QAAQ,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,MAAM,GAAG,WAAsC,CAAC;IAEtD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CACvC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAE,kBAAwC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAClE,CAAC;IAEF,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,cAAc,CAAC,oCAAoC,EAAE,QAAQ,CAAC,CAAC;IAC3E,CAAC;IACD,IACE,UAAU,KAAK,UAAU;QACzB,UAAU,KAAK,UAAU;QACzB,UAAU,KAAK,UAAU;QACzB,UAAU,KAAK,YAAY,EAC3B,CAAC;QACD,MAAM,IAAI,cAAc,CACtB,oEAAoE,EACpE,QAAQ,CACT,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAc,UAAU,CAAC;IAErC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,cAAc,CAAC,kCAAkC,EAAE,QAAQ,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,cAAc,CAAC,oCAAoC,EAAE,QAAQ,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC;IAEtB,IAAI,eAAmC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,cAAc,CAAC,+CAA+C,EAAE,QAAQ,CAAC,CAAC;QACtF,CAAC;QACD,eAAe,GAAG,MAAM,CAAC;IAC3B,CAAC;SAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,cAAc,CAAC,oDAAoD,EAAE,QAAQ,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,YAAgC,CAAC;IACrC,MAAM,iBAAiB,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;IAClD,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC5B,IACE,OAAO,iBAAiB,KAAK,QAAQ;YACrC,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC;YACpC,iBAAiB,GAAG,CAAC,EACrB,CAAC;YACD,MAAM,IAAI,cAAc,CACtB,+DAA+D,EAC/D,QAAQ,CACT,CAAC;QACJ,CAAC;QACD,YAAY,GAAG,iBAAiB,CAAC;IACnC,CAAC;SAAM,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,IAAI,cAAc,CAAC,6DAA6D,EAAE,QAAQ,CAAC,CAAC;IACpG,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;QAC3B,MAAM,IAAI,cAAc,CAAC,+CAA+C,EAAE,QAAQ,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,cAAc,CAAC,qCAAqC,EAAE,QAAQ,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,cAAc,CAAC,6BAA6B,EAAE,QAAQ,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;QAC3B,MAAM,IAAI,cAAc,CAAC,4CAA4C,EAAE,QAAQ,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAClC,IAAI,OAAO,GAAsB,IAAI,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,OAAO,KAAK,IAAI;gBAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACrC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,cAAc,CAAC,mCAAmC,EAAE,QAAQ,CAAC,CAAC;YAC1E,CAAC;YACD,OAAO,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAClC,CAAC;aAAM,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,IAAI,OAAO,KAAK,IAAI;QAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE7C,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACvD,MAAM,MAAM,GAAc;QACxB,MAAM,EAAE,UAAU;QAClB,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC;QAC5B,KAAK;QACL,MAAM;QACN,IAAI;QACJ,QAAQ;KACT,CAAC;IACF,IAAI,eAAe,KAAK,SAAS;QAAE,MAAM,CAAC,eAAe,GAAG,eAAe,CAAC;IAC5E,IAAI,YAAY,KAAK,SAAS;QAAE,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;IACnE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC;IACzD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -10,7 +10,6 @@ export declare function folderPath(root: string, folder: AdrFolder): string;
|
|
|
10
10
|
export declare function listRecords(root: string): AdrRecord[];
|
|
11
11
|
export declare function resolveRecord(root: string, query: string): AdrRecord;
|
|
12
12
|
export declare function nextDecisionNumber(root: string): number;
|
|
13
|
-
export declare function todayStamp(): string;
|
|
14
13
|
export declare function writeRecord(root: string, folder: AdrFolder, fileName: string, content: string): string;
|
|
15
14
|
export declare function removeRecord(record: AdrRecord): void;
|
|
16
15
|
export declare function readRecord(record: AdrRecord): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/core/repository.ts"],"names":[],"mappings":"AAUA,OAAO,EAAgB,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAExE,eAAO,MAAM,OAAO,EAAE,SAAS,EAA0C,CAAC;AAE1E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/core/repository.ts"],"names":[],"mappings":"AAUA,OAAO,EAAgB,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAExE,eAAO,MAAM,OAAO,EAAE,SAAS,EAA0C,CAAC;AAE1E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA8DD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,UAAU,CA0BlF;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,MAAM,CAElE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CA0BrD;AA0CD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAiCpE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAItG;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAEpD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAEpD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAMrD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAEtD"}
|
package/dist/core/repository.js
CHANGED
|
@@ -40,14 +40,21 @@ machine-checkable header and lifecycle folders.
|
|
|
40
40
|
|
|
41
41
|
## Record format
|
|
42
42
|
|
|
43
|
-
Every record starts with
|
|
43
|
+
Every record starts with a YAML front matter block:
|
|
44
44
|
|
|
45
45
|
\`\`\`markdown
|
|
46
|
+
---
|
|
47
|
+
status: proposed | accepted | rejected | superseded
|
|
48
|
+
date: YYYY-MM-DD
|
|
49
|
+
---
|
|
50
|
+
|
|
46
51
|
# ADR: <title>
|
|
47
|
-
Status: proposed | accepted | rejected — <reason>
|
|
48
52
|
\`\`\`
|
|
49
53
|
|
|
50
|
-
|
|
54
|
+
Rejected records add \`reason: <why>\`; superseded decisions add
|
|
55
|
+
\`superseded-by: N\`. The \`date\` field records when the current status was
|
|
56
|
+
reached; the CLI stamps it at every lifecycle move. Accepted decisions use
|
|
57
|
+
\`# ADR: N <title>\` and require
|
|
51
58
|
\`Problem\`, \`Decision\`, \`Alternatives considered\`, and \`Consequences\`.
|
|
52
59
|
Proposals require \`Problem\`, \`Proposal\`, \`Alternatives considered\`,
|
|
53
60
|
\`Acceptance criteria\`, and \`Risks\`.
|
|
@@ -199,13 +206,6 @@ export function nextDecisionNumber(root) {
|
|
|
199
206
|
}
|
|
200
207
|
return max + 1;
|
|
201
208
|
}
|
|
202
|
-
export function todayStamp() {
|
|
203
|
-
const now = new Date();
|
|
204
|
-
const year = now.getFullYear();
|
|
205
|
-
const month = String(now.getMonth() + 1).padStart(2, '0');
|
|
206
|
-
const day = String(now.getDate()).padStart(2, '0');
|
|
207
|
-
return `${year}-${month}-${day}`;
|
|
208
|
-
}
|
|
209
209
|
export function writeRecord(root, folder, fileName, content) {
|
|
210
210
|
const path = join(folderPath(root, folder), fileName);
|
|
211
211
|
writeFileSync(path, content);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/core/repository.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,MAAM,EACN,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAkC,MAAM,UAAU,CAAC;AAExE,MAAM,CAAC,MAAM,OAAO,GAAgB,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAO1E,SAAS,UAAU,CAAC,KAAe;IACjC,sCAAsC;IACtC,+DAA+D;IAC/D,MAAM,SAAS,GAAG,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACnD,OAAO;;;;;;;;EAQP,SAAS;;;;;;;;CAQV,CAAC;AACF,CAAC;AAED,MAAM,WAAW,GAAG
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/core/repository.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,MAAM,EACN,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAkC,MAAM,UAAU,CAAC;AAExE,MAAM,CAAC,MAAM,OAAO,GAAgB,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAO1E,SAAS,UAAU,CAAC,KAAe;IACjC,sCAAsC;IACtC,+DAA+D;IAC/D,MAAM,SAAS,GAAG,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACnD,OAAO;;;;;;;;EAQP,SAAS;;;;;;;;CAQV,CAAC;AACF,CAAC;AAED,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCnB,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,QAAkB,EAAE;IACpE,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,2CAA2C,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACnC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,IAAI,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,IAAI,WAAW,EAAE,CAAC,CAAC;IAE1C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC1C,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,YAAY,CAAC,CAAC;IAErC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,MAAiB;IACxD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC/B,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpB,MAAM,WAAW,GAAG,CAAC,MAAiB,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAClE,IAAI,WAAW,KAAK,CAAC;YAAE,OAAO,WAAW,CAAC;QAC1C,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW;YAAE,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAgB,EAAE,MAAc;IAC5D,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC9E,OAAO,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,CAAC;AACvE,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,IAAY,EAAE,MAAc;IACzD,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC/B,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC5C,MAAM,WAAW,GAAG,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC9E,MAAM,QAAQ,GACZ,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC;oBACnC,CAAC,WAAW,KAAK,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;gBACtD,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACvE,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;gBACzE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,KAAa;IACvD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;QAC3C,IAAI,oBAAoB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/D,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,IAAI,UAAU,MAAM,CAAC,KAAK,EAAE,KAAK,MAAM,EAAE,CAAC;YACnE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;gBAC1C,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,GAAG,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjF,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,4BAA4B,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,GAAG,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;YAChE,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,GAAG,GAAG,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAAiB,EAAE,QAAgB,EAAE,OAAe;IAC5F,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtD,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC5C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAiB;IAC1C,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAiB;IAC3C,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACrE,MAAM,kBAAkB,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/D,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,kBAAkB,EAAE,CAAC;IACpD,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC5C,OAAO,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7D,CAAC"}
|
package/dist/core/templates.d.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { type AdrRecord } from './adr.js';
|
|
2
|
+
/**
|
|
3
|
+
* Render a YAML front matter block. Fields are written in the canonical
|
|
4
|
+
* order (status, date, reason, superseded-by); only the fields present in
|
|
5
|
+
* `fields` are emitted.
|
|
6
|
+
*/
|
|
7
|
+
export declare function frontMatter(fields: Record<string, string | number>): string;
|
|
2
8
|
export declare function proposalTemplate(title: string, context?: string): string;
|
|
3
9
|
export declare function decisionTemplate(number: number, title: string, context?: string): string;
|
|
4
10
|
export declare function rejectedTemplate(title: string, reason: string): string;
|
|
@@ -10,8 +16,19 @@ export declare function rejectedTemplate(title: string, reason: string): string;
|
|
|
10
16
|
export declare function proposalToDecision(proposal: AdrRecord, number: number): string;
|
|
11
17
|
/**
|
|
12
18
|
* Proposal sections that have no place in an accepted decision and would be
|
|
13
|
-
* silently discarded by `proposalToDecision`.
|
|
14
|
-
*
|
|
19
|
+
* silently discarded by `proposalToDecision`. Only proposal-era leftovers
|
|
20
|
+
* (for example `Plan`, `Migration plan`) qualify; every other extra section
|
|
21
|
+
* is carried through the rewrite. Callers should surface these so a
|
|
22
|
+
* mechanical lifecycle move never loses content without warning.
|
|
15
23
|
*/
|
|
16
24
|
export declare function droppedSections(proposal: AdrRecord): string[];
|
|
25
|
+
/**
|
|
26
|
+
* Rewrite a record's front matter for a lifecycle move: parse the existing
|
|
27
|
+
* block, merge `patch` over it, and re-emit the fields in canonical order.
|
|
28
|
+
* Every non-creating move (accept, reject, supersede) must stamp the date so
|
|
29
|
+
* the front matter always reflects the current status; the Markdown body is
|
|
30
|
+
* left untouched. Unknown keys are preserved after the canonical ones so a
|
|
31
|
+
* mechanical rewrite never loses data silently (validate flags them).
|
|
32
|
+
*/
|
|
33
|
+
export declare function stampLifecycleMove(content: string, patch: Record<string, string | number>): string;
|
|
17
34
|
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,UAAU,CAAC;AAoClB;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAO3E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAyBxE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAqBxF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAgBtE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAmD9E;AAMD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,SAAS,GAAG,MAAM,EAAE,CAI7D;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAyBlG"}
|
package/dist/core/templates.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { parse, stringify } from 'yaml';
|
|
2
|
+
import { FRONT_MATTER_ORDER, PROPOSAL_ERA_HEADINGS, section, todayStamp, } from './adr.js';
|
|
2
3
|
/** Proposal sections that survive the mechanical accept rewrite. */
|
|
3
4
|
const PRESERVED_SECTIONS = [
|
|
4
5
|
'Problem',
|
|
@@ -7,6 +8,13 @@ const PRESERVED_SECTIONS = [
|
|
|
7
8
|
'Acceptance criteria',
|
|
8
9
|
'Risks',
|
|
9
10
|
];
|
|
11
|
+
/**
|
|
12
|
+
* Proposal-era leftovers the accept rewrite cannot fold anywhere. The full
|
|
13
|
+
* PROPOSAL_ERA_HEADINGS set is wider (it also names Proposal/Acceptance
|
|
14
|
+
* criteria/Risks, which the rewrite folds into Decision/Consequences); only
|
|
15
|
+
* these headings are genuinely dropped, with a warning.
|
|
16
|
+
*/
|
|
17
|
+
const DROPPED_SECTION_HEADINGS = PROPOSAL_ERA_HEADINGS.filter((heading) => !PRESERVED_SECTIONS.includes(heading));
|
|
10
18
|
/**
|
|
11
19
|
* 把 config.yaml 的 context 注入模板:放在标题块之后、第一个 section 之前。
|
|
12
20
|
* 解析器忽略游离文本(current 为 null 时不收集),accept 的机械改写也会
|
|
@@ -22,9 +30,23 @@ ${text}
|
|
|
22
30
|
-->
|
|
23
31
|
`;
|
|
24
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Render a YAML front matter block. Fields are written in the canonical
|
|
35
|
+
* order (status, date, reason, superseded-by); only the fields present in
|
|
36
|
+
* `fields` are emitted.
|
|
37
|
+
*/
|
|
38
|
+
export function frontMatter(fields) {
|
|
39
|
+
const ordered = {};
|
|
40
|
+
for (const key of FRONT_MATTER_ORDER) {
|
|
41
|
+
const value = fields[key];
|
|
42
|
+
if (value !== undefined)
|
|
43
|
+
ordered[key] = value;
|
|
44
|
+
}
|
|
45
|
+
return `---\n${stringify(ordered)}---\n`;
|
|
46
|
+
}
|
|
25
47
|
export function proposalTemplate(title, context) {
|
|
26
|
-
return
|
|
27
|
-
|
|
48
|
+
return `${frontMatter({ status: 'proposed', date: todayStamp() })}
|
|
49
|
+
# ADR: ${title}
|
|
28
50
|
|
|
29
51
|
${contextBlock(context)}## Problem
|
|
30
52
|
|
|
@@ -49,8 +71,8 @@ ${contextBlock(context)}## Problem
|
|
|
49
71
|
`;
|
|
50
72
|
}
|
|
51
73
|
export function decisionTemplate(number, title, context) {
|
|
52
|
-
return
|
|
53
|
-
|
|
74
|
+
return `${frontMatter({ status: 'accepted', date: todayStamp() })}
|
|
75
|
+
# ADR: ${number} ${title}
|
|
54
76
|
|
|
55
77
|
${contextBlock(context)}## Problem
|
|
56
78
|
|
|
@@ -71,8 +93,8 @@ ${contextBlock(context)}## Problem
|
|
|
71
93
|
`;
|
|
72
94
|
}
|
|
73
95
|
export function rejectedTemplate(title, reason) {
|
|
74
|
-
return
|
|
75
|
-
|
|
96
|
+
return `${frontMatter({ status: 'rejected', date: todayStamp(), reason })}
|
|
97
|
+
# ADR: ${title}
|
|
76
98
|
|
|
77
99
|
## Problem
|
|
78
100
|
|
|
@@ -108,8 +130,14 @@ export function proposalToDecision(proposal, number) {
|
|
|
108
130
|
if (consequences.length === 0) {
|
|
109
131
|
consequences.push('_No consequences recorded._', '');
|
|
110
132
|
}
|
|
111
|
-
|
|
112
|
-
|
|
133
|
+
// Extra sections (for example `## Implementation`) are neither canonical
|
|
134
|
+
// decision sections nor proposal-era leftovers, so they are carried through
|
|
135
|
+
// the rewrite verbatim (appended after the canonical sections) instead of
|
|
136
|
+
// being dropped: a lifecycle move must never lose written content silently.
|
|
137
|
+
const passthrough = proposal.sections.filter((candidate) => !PRESERVED_SECTIONS.includes(candidate.heading) &&
|
|
138
|
+
!DROPPED_SECTION_HEADINGS.includes(candidate.heading));
|
|
139
|
+
let output = `${frontMatter({ status: 'accepted', date: todayStamp() })}
|
|
140
|
+
# ADR: ${number} ${proposal.title}
|
|
113
141
|
|
|
114
142
|
## Problem
|
|
115
143
|
|
|
@@ -126,18 +154,60 @@ ${alternatives.trim() || '_No alternatives recorded._'}
|
|
|
126
154
|
## Consequences
|
|
127
155
|
|
|
128
156
|
${consequences.join('\n')}\n`;
|
|
157
|
+
for (const extra of passthrough) {
|
|
158
|
+
const body = extra.body.trim();
|
|
159
|
+
output += body.length > 0 ? `\n## ${extra.heading}\n\n${body}\n` : `\n## ${extra.heading}\n`;
|
|
160
|
+
}
|
|
161
|
+
return output;
|
|
129
162
|
}
|
|
130
163
|
function sectionBody(record, heading) {
|
|
131
164
|
return section(record, heading)?.trim() ?? '';
|
|
132
165
|
}
|
|
133
166
|
/**
|
|
134
167
|
* Proposal sections that have no place in an accepted decision and would be
|
|
135
|
-
* silently discarded by `proposalToDecision`.
|
|
136
|
-
*
|
|
168
|
+
* silently discarded by `proposalToDecision`. Only proposal-era leftovers
|
|
169
|
+
* (for example `Plan`, `Migration plan`) qualify; every other extra section
|
|
170
|
+
* is carried through the rewrite. Callers should surface these so a
|
|
171
|
+
* mechanical lifecycle move never loses content without warning.
|
|
137
172
|
*/
|
|
138
173
|
export function droppedSections(proposal) {
|
|
139
174
|
return proposal.sections
|
|
140
175
|
.map((candidate) => candidate.heading)
|
|
141
|
-
.filter((heading) =>
|
|
176
|
+
.filter((heading) => DROPPED_SECTION_HEADINGS.includes(heading));
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Rewrite a record's front matter for a lifecycle move: parse the existing
|
|
180
|
+
* block, merge `patch` over it, and re-emit the fields in canonical order.
|
|
181
|
+
* Every non-creating move (accept, reject, supersede) must stamp the date so
|
|
182
|
+
* the front matter always reflects the current status; the Markdown body is
|
|
183
|
+
* left untouched. Unknown keys are preserved after the canonical ones so a
|
|
184
|
+
* mechanical rewrite never loses data silently (validate flags them).
|
|
185
|
+
*/
|
|
186
|
+
export function stampLifecycleMove(content, patch) {
|
|
187
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
188
|
+
if (match === null) {
|
|
189
|
+
throw new Error('record has no YAML front matter block');
|
|
190
|
+
}
|
|
191
|
+
const existing = parse(match[1] ?? '');
|
|
192
|
+
const merged = {};
|
|
193
|
+
for (const key of FRONT_MATTER_ORDER) {
|
|
194
|
+
const patched = patch[key];
|
|
195
|
+
if (patched !== undefined) {
|
|
196
|
+
merged[key] = patched;
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
const kept = existing[key];
|
|
200
|
+
if (typeof kept === 'string' || typeof kept === 'number') {
|
|
201
|
+
merged[key] = kept;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
for (const [key, value] of Object.entries(existing)) {
|
|
205
|
+
if (FRONT_MATTER_ORDER.includes(key))
|
|
206
|
+
continue;
|
|
207
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
208
|
+
merged[key] = value;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return `---\n${stringify(merged)}---${content.slice(match[0].length)}`;
|
|
142
212
|
}
|
|
143
213
|
//# sourceMappingURL=templates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-integrations.d.ts","sourceRoot":"","sources":["../../src/core/tool-integrations.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,eAAe,oEAAqE,CAAC;AAClG,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAsBtD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAID,eAAO,MAAM,SAAS,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"tool-integrations.d.ts","sourceRoot":"","sources":["../../src/core/tool-integrations.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,eAAe,oEAAqE,CAAC;AAClG,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAsBtD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAID,eAAO,MAAM,SAAS,EAAE,QAAQ,EAwM/B,CAAC;AAEF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAwB9D;AAaD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CA8BtF;AAcD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAuB1E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAErF"}
|
|
@@ -76,7 +76,7 @@ adrkit propose "<title>"
|
|
|
76
76
|
|
|
77
77
|
- Do not skip \`## Alternatives considered\`. A proposal without alternatives
|
|
78
78
|
is invalid by design.
|
|
79
|
-
- Keep the
|
|
79
|
+
- Keep the front matter exactly \`status: proposed\`.
|
|
80
80
|
- Before proposing, run \`adrkit list\` and check whether this decision
|
|
81
81
|
supersedes or overlaps an existing one; mention that in the record. Re-run
|
|
82
82
|
it even if you ran it earlier in this conversation: session memory can be
|
|
@@ -175,7 +175,7 @@ adrkit accept "<name>"
|
|
|
175
175
|
## Overview
|
|
176
176
|
|
|
177
177
|
Reject a proposal. The CLI moves the file from \`adr/proposed/\` to
|
|
178
|
-
\`adr/rejected/\` and
|
|
178
|
+
\`adr/rejected/\` and records the reason in the front matter.
|
|
179
179
|
|
|
180
180
|
## Steps
|
|
181
181
|
|
|
@@ -195,9 +195,10 @@ adrkit reject "<name>" --reason "<why it was rejected>"
|
|
|
195
195
|
|
|
196
196
|
## Overview
|
|
197
197
|
|
|
198
|
-
Mark an accepted decision as superseded. The CLI rewrites
|
|
199
|
-
|
|
200
|
-
\`adr/decisions/\` as frozen
|
|
198
|
+
Mark an accepted decision as superseded. The CLI rewrites its front matter
|
|
199
|
+
to \`status: superseded\` with \`superseded-by: N\`, stamps the supersede date
|
|
200
|
+
on the \`date\` field, and leaves the record in \`adr/decisions/\` as frozen
|
|
201
|
+
history.
|
|
201
202
|
|
|
202
203
|
## Steps
|
|
203
204
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-integrations.js","sourceRoot":"","sources":["../../src/core/tool-integrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAOpD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,CAAU,CAAC;AAGlG,MAAM,gBAAgB,GAA2B;IAC/C,MAAM,EAAE,kBAAkB;IAC1B,KAAK,EAAE,iBAAiB;IACxB,MAAM,EAAE,kBAAkB;IAC1B,gBAAgB,EAAE,iBAAiB;IACnC,MAAM,EAAE,kBAAkB;CAC3B,CAAC;AAEF;;;;GAIG;AACH,MAAM,cAAc,GAAoC;IACtD,MAAM,EAAE,gBAAgB;IACxB,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,gBAAgB;CACzB,CAAC;AAQF,mEAAmE;AACnE,gDAAgD;AAChD,MAAM,CAAC,MAAM,SAAS,GAAe;IACnC;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,gGAAgG;QAC7G,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;uEAsB6D;KACpE;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,8FAA8F;QAC3G,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;wCA4B8B;KACrC;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,4FAA4F;QACzG,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;uEAuB6D;KACpE;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,sHAAsH;QACnI,IAAI,EAAE;;;;;;;;;;;;;;;;;;;wEAmB8D;KACrE;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,2FAA2F;QACxG,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBA4Ba;KACpB;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,6EAA6E;QAC1F,IAAI,EAAE;;;;;;;;;;;;;;;;kEAgBwD;KAC/D;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,sHAAsH;QACnI,IAAI,EAAE
|
|
1
|
+
{"version":3,"file":"tool-integrations.js","sourceRoot":"","sources":["../../src/core/tool-integrations.ts"],"names":[],"mappings":"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"}
|
package/dist/core/validate.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export interface ValidationIssue {
|
|
|
6
6
|
export declare function validateRecord(root: string, record: AdrRecord): ValidationIssue[];
|
|
7
7
|
export declare function validateRepository(root: string): ValidationIssue[];
|
|
8
8
|
/**
|
|
9
|
-
* Repository-level checks for a single record: a
|
|
9
|
+
* Repository-level checks for a single record: a `superseded-by: N` reference
|
|
10
10
|
* must point at an existing decision that is not itself superseded.
|
|
11
11
|
* validateRecord only sees one file; this adds the cross-record half so
|
|
12
12
|
* `adrkit validate <name>` keeps the same promise as a full validate.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,UAAU,CAAC;AAIlB,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,eAAe,EAAE,CA+HjF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAqDlE;AA0BD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,SAAS,EAAE,GACnB,eAAe,EAAE,CAQnB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAI9D"}
|
package/dist/core/validate.js
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { join, relative } from 'node:path';
|
|
3
|
-
import { hasMeaningfulBody, statusForFolder } from './adr.js';
|
|
3
|
+
import { DATE_PATTERN, hasMeaningfulBody, PROPOSAL_ERA_HEADINGS, statusForFolder, } from './adr.js';
|
|
4
4
|
import { ADR_DIR, CONFIG_FILE, readConfig } from './config.js';
|
|
5
5
|
import { FOLDERS, listRecords } from './repository.js';
|
|
6
6
|
const DECISION_REQUIRED = ['Problem', 'Decision', 'Alternatives considered', 'Consequences'];
|
|
7
7
|
const PROPOSED_REQUIRED = ['Problem', 'Proposal', 'Alternatives considered', 'Acceptance criteria', 'Risks'];
|
|
8
8
|
const REJECTED_REQUIRED = ['Problem', 'Proposal', 'Alternatives considered'];
|
|
9
|
-
const PROPOSAL_ERA_HEADINGS = ['Proposal', 'Acceptance criteria', 'Risks', 'Plan', 'Migration plan'];
|
|
10
9
|
export function validateRecord(root, record) {
|
|
11
10
|
const issues = [];
|
|
12
11
|
const path = relative(root, record.path);
|
|
12
|
+
for (const key of record.frontMatterExtras ?? []) {
|
|
13
|
+
issues.push({ path, message: `unknown front matter field "${key}"` });
|
|
14
|
+
}
|
|
13
15
|
const statusMatchesFolder = record.folder === 'decisions'
|
|
14
16
|
? record.status === 'accepted' || record.status === 'superseded'
|
|
15
17
|
: record.status === statusForFolder(record.folder);
|
|
@@ -27,6 +29,20 @@ export function validateRecord(root, record) {
|
|
|
27
29
|
issues.push({ path, message: 'a decision cannot supersede itself' });
|
|
28
30
|
}
|
|
29
31
|
}
|
|
32
|
+
// The parser already enforces the YYYY-MM-DD format, so this only checks
|
|
33
|
+
// calendar validity; the match is never null for a parsed record.
|
|
34
|
+
const dateMatch = record.date.match(DATE_PATTERN);
|
|
35
|
+
if (dateMatch !== null) {
|
|
36
|
+
const year = Number(dateMatch[1]);
|
|
37
|
+
const month = Number(dateMatch[2]);
|
|
38
|
+
const day = Number(dateMatch[3]);
|
|
39
|
+
const date = new Date(year, month - 1, day);
|
|
40
|
+
if (date.getFullYear() !== year ||
|
|
41
|
+
date.getMonth() !== month - 1 ||
|
|
42
|
+
date.getDate() !== day) {
|
|
43
|
+
issues.push({ path, message: 'front matter date contains an invalid calendar date' });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
30
46
|
if (record.folder === 'decisions') {
|
|
31
47
|
if (!/^[1-9]\d*-[a-z0-9\u4e00-\u9fff-]+\.md$/.test(record.fileName)) {
|
|
32
48
|
issues.push({ path, message: 'decision file name must be "N-slug.md"' });
|
|
@@ -164,21 +180,21 @@ function supersedeReferenceIssues(root, record, decisions) {
|
|
|
164
180
|
const target = decisions.get(record.supersededBy);
|
|
165
181
|
if (target === undefined) {
|
|
166
182
|
return [
|
|
167
|
-
{ path, message: `"superseded
|
|
183
|
+
{ path, message: `"superseded-by: ${record.supersededBy}" references a missing decision` },
|
|
168
184
|
];
|
|
169
185
|
}
|
|
170
186
|
if (target.status === 'superseded') {
|
|
171
187
|
return [
|
|
172
188
|
{
|
|
173
189
|
path,
|
|
174
|
-
message: `"superseded
|
|
190
|
+
message: `"superseded-by: ${record.supersededBy}" references a superseded decision; supersede that decision instead`,
|
|
175
191
|
},
|
|
176
192
|
];
|
|
177
193
|
}
|
|
178
194
|
return [];
|
|
179
195
|
}
|
|
180
196
|
/**
|
|
181
|
-
* Repository-level checks for a single record: a
|
|
197
|
+
* Repository-level checks for a single record: a `superseded-by: N` reference
|
|
182
198
|
* must point at an existing decision that is not itself superseded.
|
|
183
199
|
* validateRecord only sees one file; this adds the cross-record half so
|
|
184
200
|
* `adrkit validate <name>` keeps the same promise as a full validate.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,GAEhB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAOvD,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,yBAAyB,EAAE,cAAc,CAAC,CAAC;AAC7F,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,OAAO,CAAC,CAAC;AAC7G,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,yBAAyB,CAAC,CAAC;AAE7E,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,MAAiB;IAC5D,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAEzC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,iBAAiB,IAAI,EAAE,EAAE,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,+BAA+B,GAAG,GAAG,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,KAAK,WAAW;QACvD,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY;QAChE,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI;YACJ,OAAO,EAAE,WAAW,MAAM,CAAC,MAAM,4BAA4B,MAAM,CAAC,MAAM,GAAG;SAC9E,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACnC,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,oDAAoD,EAAE,CAAC,CAAC;QACvF,CAAC;aAAM,IAAI,MAAM,CAAC,YAAY,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,oCAAoC,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,kEAAkE;IAClE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAClD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QAC5C,IACE,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI;YAC3B,IAAI,CAAC,QAAQ,EAAE,KAAK,KAAK,GAAG,CAAC;YAC7B,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,EACtB,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,qDAAqD,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,IAAI,CAAC,wCAAwC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,oDAAoD,EAAE,CAAC,CAAC;QACvF,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,4CAA4C,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAG,uDAAuD,CAAC;QAC5E,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACjD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;YAC5C,IACE,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI;gBAC3B,IAAI,CAAC,QAAQ,EAAE,KAAK,KAAK,GAAG,CAAC;gBAC7B,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,EACtB,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,6CAA6C,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,KAAK,WAAW;QAC5C,CAAC,CAAC,iBAAiB;QACnB,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU;YAC5B,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,iBAAiB,CAAC;IAExB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5E,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,gCAAgC,OAAO,GAAG,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,KAAK,WAAW;QACtD,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC;QACzB,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC5B,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC;QAClF,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI;gBACJ,OAAO,EAAE,eAAe,OAAO,gCAAgC;aAChE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,yBAAyB,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,KAAK,MAAM,OAAO,IAAI,qBAAqB,EAAE,CAAC;YAC5C,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI;oBACJ,OAAO,EAAE,+DAA+D,OAAO,GAAG;iBACnF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,KAAK,yBAAyB,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;QAC/G,MAAM,CAAC,IAAI,CAAC;YACV,IAAI;YACJ,OAAO,EAAE,oFAAoF;SAC9F,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,OAAO,IAAI,WAAW,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;IACrF,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,GAAG,OAAO,IAAI,WAAW,EAAE;gBACjC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAChE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,OAAO,IAAI,MAAM,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAChE,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,GAAG,EAAqB,CAAC;IACrD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjE,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;oBACjC,OAAO,EAAE,6BAA6B,MAAM,CAAC,MAAM,EAAE;iBACtD,CAAC,CAAC;YACL,CAAC;YACD,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,GAAG,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,wBAAwB,CAC/B,IAAY,EACZ,MAAiB,EACjB,SAAiC;IAEjC,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAClD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO;YACL,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,MAAM,CAAC,YAAY,iCAAiC,EAAE;SAC3F,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACnC,OAAO;YACL;gBACE,IAAI;gBACJ,OAAO,EAAE,mBAAmB,MAAM,CAAC,YAAY,qEAAqE;aACrH;SACF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,IAAY,EACZ,MAAiB,EACjB,OAAoB;IAEpB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC/C,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;QAChC,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACvE,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAyB;IACpD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACzE,OAAO,SAAS,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC/F,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "adr-kit",
|
|
3
|
-
"version": "0.2.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.2.5",
|
|
4
|
+
"description": "Architecture Decision Records (ADRs) for AI coding assistants.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
|
+
"author": "Chang Luo <luochang212@gmail.com>",
|
|
7
8
|
"repository": {
|
|
8
9
|
"type": "git",
|
|
9
10
|
"url": "git+https://github.com/luochang212/adr-kit.git"
|