dld-kit 1.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +420 -0
- package/dist/dld.mjs +10379 -0
- package/package.json +64 -0
- package/skills/dld-adjust/SKILL.md +142 -0
- package/skills/dld-audit/SKILL.md +162 -0
- package/skills/dld-audit-auto/SKILL.md +172 -0
- package/skills/dld-common/SKILL.md +14 -0
- package/skills/dld-common/scripts/dld.mjs +10379 -0
- package/skills/dld-decide/SKILL.md +119 -0
- package/skills/dld-implement/SKILL.md +216 -0
- package/skills/dld-init/SKILL.md +133 -0
- package/skills/dld-lookup/SKILL.md +76 -0
- package/skills/dld-plan/SKILL.md +135 -0
- package/skills/dld-reindex/SKILL.md +173 -0
- package/skills/dld-retrofit/SKILL.md +181 -0
- package/skills/dld-snapshot/SKILL.md +284 -0
- package/skills/dld-status/SKILL.md +127 -0
- package/templates/rules/dld-workflow.md +22 -0
- package/templates/skills/dld-adjust/SKILL.md +139 -0
- package/templates/skills/dld-audit/SKILL.md +159 -0
- package/templates/skills/dld-audit-auto/SKILL.md +169 -0
- package/templates/skills/dld-common/SKILL.md +12 -0
- package/templates/skills/dld-decide/SKILL.md +116 -0
- package/templates/skills/dld-implement/SKILL.md +213 -0
- package/templates/skills/dld-init/SKILL.md +130 -0
- package/templates/skills/dld-lookup/SKILL.md +73 -0
- package/templates/skills/dld-plan/SKILL.md +132 -0
- package/templates/skills/dld-reindex/SKILL.md +170 -0
- package/templates/skills/dld-retrofit/SKILL.md +178 -0
- package/templates/skills/dld-snapshot/SKILL.md +281 -0
- package/templates/skills/dld-status/SKILL.md +124 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Jimmy Utterström
|
|
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,420 @@
|
|
|
1
|
+
# DLD Kit — Decision-Linked Development
|
|
2
|
+
|
|
3
|
+
Stop AI agents from breaking code they don't understand.
|
|
4
|
+
|
|
5
|
+
> [!NOTE]
|
|
6
|
+
> Early development — APIs, file formats, and skill interfaces may change.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
AI agents write code confidently. They just don't know *why* your code looks the way it does. That retry logic tuned for a specific API's rate limiting? That validation step catching a production-only edge case? Those decisions live in Jira tickets, Slack threads, and departed engineers' heads. DLD aims to fix this with an **append-only decision log** and `@decision(DL-XXX)` annotations that link code directly to the reasoning behind it. When an agent encounters an annotation, it reads the decision *before* modifying anything. DLDs primary focus is to connect context to code in a highly visible and directly accessible way, avoiding guesswork & git or JIRA archeology to retrieve core business context. Ensuring absolute, immediate, correctness of the produced software is however *not* within the core scope of DLD; for that you will need to combine it with sound general test & validation practices.
|
|
11
|
+
|
|
12
|
+
## Install
|
|
13
|
+
|
|
14
|
+
Requirements: Node.js 20+ and git. `gh` is optional; `/dld-reindex` uses it to check open PRs.
|
|
15
|
+
|
|
16
|
+
Each channel below installs the same skills. They differ in which agents they reach, how the always-on rule gets into the agent's context, and how you update.
|
|
17
|
+
|
|
18
|
+
| Channel | Agents | Installs into | Always-on rule | Update with |
|
|
19
|
+
|---|---|---|---|---|
|
|
20
|
+
| [`npx dld-kit init`](#npx-dld-kit-init) | Claude Code, Antigravity, Codex, Cursor, OpenCode, Pi | The project, committed | Written by `init` | `npx dld-kit@latest update` |
|
|
21
|
+
| [Claude Code plugin](#claude-code-plugin) | Claude Code | Your user profile | SessionStart hook | `claude plugin marketplace update dld-kit`, then `claude plugin update dld@dld-kit` |
|
|
22
|
+
| [Codex and Copilot CLI plugins](#codex-and-copilot-cli-plugins) | Codex, Copilot CLI | Your user profile | dld-init skill | Codex's plugin manager; `copilot plugin update` |
|
|
23
|
+
| [Pi package](#pi-package) | Pi | Your user profile, or the project with `-l` | dld-init skill | `pi update npm:dld-kit` |
|
|
24
|
+
| [`npx skills` / `gh skill`](#npx-skills-or-gh-skill) | Any agent those tools support | The project, or your user profile with `-g` | dld-init skill | `npx skills update` / `gh skill update` |
|
|
25
|
+
| [Manual copy](#manual-copy) | Any Agent Skills harness | Wherever you copy them | dld-init skill | Copy again |
|
|
26
|
+
|
|
27
|
+
### `npx dld-kit init`
|
|
28
|
+
|
|
29
|
+
Run in the root of a git repository:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npx dld-kit init
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
This writes:
|
|
36
|
+
|
|
37
|
+
- `dld.config.yaml`, `decisions/records/` and `decisions/INDEX.md`
|
|
38
|
+
- the `dld-*` skills for each selected agent: `.claude/skills/` for Claude Code, `.agents/skills/` for the others
|
|
39
|
+
- the always-on rule: `.claude/rules/dld-workflow.md` for Claude Code, `.agents/rules/dld-workflow.md` for Antigravity, and a block between `<!-- dld-kit:start -->` and `<!-- dld-kit:end -->` in `AGENTS.md` (or `CLAUDE.md`) for Codex, Cursor, OpenCode and Pi
|
|
40
|
+
|
|
41
|
+
`init` detects the agents from files in the project (`.claude/`, `.codex/`, `.cursor/`, `opencode.json`, `.pi/`, `AGENTS.md` and so on) and asks you to confirm the list. Options:
|
|
42
|
+
|
|
43
|
+
- `--agent claude,codex`: add agents to the detected ones
|
|
44
|
+
- `--namespaces billing,auth`: one decision directory per namespace (for monorepos)
|
|
45
|
+
- `--yes`: skip the question and use the detected agents plus `--agent`
|
|
46
|
+
|
|
47
|
+
Commit the files. Teammates then need nothing installed.
|
|
48
|
+
|
|
49
|
+
To upgrade, run `npx dld-kit@latest update`. It rewrites the `dld-*` skills and the rule for the agents already installed, and never touches decision records or `dld.config.yaml`. Add `--agent <name>` to install for another agent.
|
|
50
|
+
|
|
51
|
+
### Claude Code plugin
|
|
52
|
+
|
|
53
|
+
In Claude Code:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
/plugin marketplace add jimutt/dld-kit
|
|
57
|
+
/plugin install dld@dld-kit
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Then run `/dld-init` in each project. The plugin's SessionStart hook adds the always-on rule to each session in projects that have `dld.config.yaml` and do not already load the rule. `/dld-init` also installs `.claude/rules/dld-workflow.md`, so teammates without the plugin get the rule too.
|
|
61
|
+
|
|
62
|
+
Skills run as `/dld-plan`, or as `/dld:dld-plan` if another skill has the same name. Third-party marketplaces do not auto-update by default. To update:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
claude plugin marketplace update dld-kit
|
|
66
|
+
claude plugin update dld@dld-kit
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Codex and Copilot CLI plugins
|
|
70
|
+
|
|
71
|
+
Both install the portable skills from the repository root, with no hook.
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
codex plugin marketplace add jimutt/dld-kit # then install dld from /plugins in Codex
|
|
75
|
+
copilot plugin marketplace add jimutt/dld-kit
|
|
76
|
+
copilot plugin install dld@dld-kit
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Then run the dld-init skill in each project for the config and the rule. For Copilot CLI it installs the rule as for Codex.
|
|
80
|
+
|
|
81
|
+
### Pi package
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
pi install npm:dld-kit # for your user
|
|
85
|
+
pi install -l npm:dld-kit # for this project (.pi/settings.json)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Run `/skill:dld-init` in each project for the config and the rule. Update with `pi update npm:dld-kit`.
|
|
89
|
+
|
|
90
|
+
### `npx skills` or `gh skill`
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
npx skills add jimutt/dld-kit
|
|
94
|
+
gh skill install jimutt/dld-kit --all
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Install all the skills. If you pick some with `--skill`, include `dld-common`: it holds the `dld` CLI the other skills run. Then run the dld-init skill in each project for the config and the rule. Update with `npx skills update` or `gh skill update`.
|
|
98
|
+
|
|
99
|
+
`npx skills` puts the files in `.agents/skills/` and links them from `.claude/skills/` for Claude Code. `dld update` refuses to write through those links; keep updating with `npx skills update`.
|
|
100
|
+
|
|
101
|
+
### Manual copy
|
|
102
|
+
|
|
103
|
+
Copy the `dld-*` directories from [`skills/`](skills/) into your agent's skills directory, or from [`.claude/skills/`](.claude/skills/) into a project's `.claude/skills/` for Claude Code. Include `dld-common`. Then run the dld-init skill for the config and the rule.
|
|
104
|
+
|
|
105
|
+
### Combining channels
|
|
106
|
+
|
|
107
|
+
Channels can be combined. These combinations need care:
|
|
108
|
+
|
|
109
|
+
- **A user-level plugin or package, plus skills committed in the project for the same agent.** The agent sees each skill twice, possibly at different versions. In Claude Code, run the plugin's copy as `/dld:dld-plan`.
|
|
110
|
+
- **Skills for Claude Code and for an `.agents/skills/` agent in one project.** OpenCode and Cursor read both `.claude/skills/` and `.agents/skills/`. OpenCode 2.x loads the `.agents/skills/` copy; OpenCode 1.x and Cursor may load either. Both copies work.
|
|
111
|
+
- **`dld update` and `npx skills` on the same skills.** `dld update` refuses symlinked skills and warns when `skills-lock.json` lists `dld-*` skills. Update those skills with one tool.
|
|
112
|
+
|
|
113
|
+
### Agents
|
|
114
|
+
|
|
115
|
+
| Agent | Skills (`dld init`) | Always-on rule (`dld init`, `/dld-init`) | Run a skill |
|
|
116
|
+
|---|---|---|---|
|
|
117
|
+
| Claude Code | `.claude/skills/` | `.claude/rules/dld-workflow.md` | `/dld-plan` |
|
|
118
|
+
| Antigravity | `.agents/skills/` | `.agents/rules/dld-workflow.md` | Ask for the dld-plan skill |
|
|
119
|
+
| Codex | `.agents/skills/` | Block in `AGENTS.md` | Ask for the dld-plan skill |
|
|
120
|
+
| Cursor | `.agents/skills/` | Block in `AGENTS.md` | Ask for the dld-plan skill |
|
|
121
|
+
| OpenCode | `.agents/skills/` | Block in `AGENTS.md`, or `CLAUDE.md` if there is no `AGENTS.md` | Ask for the dld-plan skill |
|
|
122
|
+
| Pi | `.agents/skills/` | Block in `AGENTS.md`, or `CLAUDE.md` if there is no `AGENTS.md` | `/skill:dld-plan` |
|
|
123
|
+
| Copilot CLI | Plugin only | Block in `AGENTS.md` (installed as for Codex) | Ask for the dld-plan skill |
|
|
124
|
+
|
|
125
|
+
A new block goes into `AGENTS.md` if it exists, else into `CLAUDE.md` if that exists, else into a new `AGENTS.md`. Codex and Cursor read only `AGENTS.md`: when the block ends up in `CLAUDE.md`, `dld install-rule` warns and says how to move it.
|
|
126
|
+
|
|
127
|
+
The examples below use Claude Code's `/dld-plan` form. In other agents, name the skill instead, e.g. "use the dld-plan skill to plan the retry feature".
|
|
128
|
+
|
|
129
|
+
## Get started
|
|
130
|
+
|
|
131
|
+
### New feature or change
|
|
132
|
+
|
|
133
|
+
Use `/dld-plan` to break it down into decisions, then implement:
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
/dld-init # Bootstrap DLD in your repo (run once)
|
|
137
|
+
/dld-plan # Break it down into decisions interactively
|
|
138
|
+
/dld-adjust DL-001 # Refine decisions if details change before implementing
|
|
139
|
+
/dld-implement DL-001 # Implement each decision (or batch related ones)
|
|
140
|
+
/dld-snapshot # Generate overview docs from the decision log
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
For a small, isolated change (a bug fix, a single design choice), `/dld-decide` records one decision directly without the planning step.
|
|
144
|
+
|
|
145
|
+
### Existing codebase
|
|
146
|
+
|
|
147
|
+
Use `/dld-retrofit` to generate decisions from code that already exists:
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
/dld-init # Bootstrap DLD in your repo (run once)
|
|
151
|
+
/dld-retrofit # Analyze code, generate decisions and annotations
|
|
152
|
+
/dld-snapshot # Generate overview docs from the decision log
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
This works as a standalone "document this codebase" action. You get structured decision records, code annotations, and a generated system overview. From there you can adopt the full workflow, or just re-run `/dld-audit-auto` and `/dld-snapshot` on a schedule to keep documentation in sync.
|
|
156
|
+
|
|
157
|
+
### Working in a team
|
|
158
|
+
|
|
159
|
+
When multiple developers draft decisions in parallel, two of them can end up picking the same `DL-NNN` ID. Once one of those PRs lands on the base branch, the other can't rebase cleanly — the colliding decision file path appears in both histories.
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
/dld-reindex # Renames the local draft(s) to the next free ID,
|
|
163
|
+
# rewrites @decision annotations and cross-references,
|
|
164
|
+
# squashes the branch into a single rebase-clean commit
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Run this before rebasing onto an updated base. The skill resolves the ID against the base branch and, when `gh` is installed and authenticated, also against open PRs so the new IDs don't collide with someone else's in-flight work.
|
|
168
|
+
|
|
169
|
+
## How it works
|
|
170
|
+
|
|
171
|
+
DLD is implemented as a set of AI agent skills following the [Agent Skills](https://agentskills.io) open standard.
|
|
172
|
+
|
|
173
|
+
### The decision record
|
|
174
|
+
|
|
175
|
+
Each decision is a markdown file with YAML frontmatter:
|
|
176
|
+
|
|
177
|
+
```markdown
|
|
178
|
+
---
|
|
179
|
+
id: DL-008
|
|
180
|
+
title: "Use exponential backoff for payment gateway retries"
|
|
181
|
+
timestamp: 2026-02-15T09:20:00Z
|
|
182
|
+
status: accepted
|
|
183
|
+
supersedes: [DL-002]
|
|
184
|
+
amends: []
|
|
185
|
+
tags: [payments, resilience]
|
|
186
|
+
references:
|
|
187
|
+
- path: src/payments/gateway.ts
|
|
188
|
+
symbol: retryWithBackoff
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Context
|
|
192
|
+
The payment gateway occasionally returns 503s under load. Our initial
|
|
193
|
+
fixed-interval retry (DL-002) caused retry storms that made things worse.
|
|
194
|
+
|
|
195
|
+
## Decision
|
|
196
|
+
Use exponential backoff with jitter, capped at 30 seconds, max 5 attempts.
|
|
197
|
+
|
|
198
|
+
## Rationale
|
|
199
|
+
Exponential backoff prevents retry storms. Jitter avoids thundering herd
|
|
200
|
+
when multiple requests fail simultaneously...
|
|
201
|
+
|
|
202
|
+
## Consequences
|
|
203
|
+
Failed payments take longer to resolve (up to ~60s worst case)...
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### The code annotation
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
// @decision(DL-008)
|
|
210
|
+
function retryWithBackoff(fn: () => Promise<Response>): Promise<Response> {
|
|
211
|
+
// ...
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
When an AI agent encounters this annotation, it reads the decision before modifying the code. If the planned change conflicts with the decision, it tells you and suggests recording a new decision.
|
|
216
|
+
|
|
217
|
+
## How DLD compares to spec-driven development
|
|
218
|
+
|
|
219
|
+
There are great spec-driven tools out there ([Spec Kit](https://github.blog/ai-and-ml/generative-ai/spec-driven-development-with-ai-get-started-with-a-new-open-source-toolkit/), [OpenSpec](https://openspec.dev/), [Kiro](https://kiro.dev/)) and they work well for many teams, especially for structured greenfield development. If they fit your workflow, use them.
|
|
220
|
+
|
|
221
|
+
DLD is a different approach for teams that find spec documents hard to maintain over time, or that want decision context embedded closer to the code. It borrows from **event sourcing**:
|
|
222
|
+
|
|
223
|
+
- **Decisions are append-only events** — once accepted, a decision's content is immutable. Metadata (`status`, `references`) can be updated mechanically (e.g., after refactors), but the reasoning is never rewritten. Decisions can be superseded but never edited or deleted. This creates a complete timeline of how the system evolved.
|
|
224
|
+
- **The spec is a derived projection** — generated from the decision log, never manually maintained. Like a read model built from an event stream.
|
|
225
|
+
- **Tight code coupling** — `@decision` annotations in code act as mechanical triggers for AI agents. The decision context lives *where the code is* rather than in a separate document.
|
|
226
|
+
|
|
227
|
+
DLD is designed for long-lived codebases where decisions accumulate, original authors move on, and AI agents need to safely modify code they didn't write. If that sounds like your situation, give it a try.
|
|
228
|
+
|
|
229
|
+
## Skills
|
|
230
|
+
|
|
231
|
+
The table uses Claude Code's slash form; in Pi use `/skill:<name>`, and in other agents ask for the skill by name.
|
|
232
|
+
|
|
233
|
+
| Skill | Purpose |
|
|
234
|
+
|-------|---------|
|
|
235
|
+
| `/dld-init` | Bootstrap DLD in a repository (run once) |
|
|
236
|
+
| `/dld-decide` | Record a single decision interactively |
|
|
237
|
+
| `/dld-plan` | Break down a feature into multiple grouped decisions |
|
|
238
|
+
| `/dld-implement` | Implement proposed decisions — writes code, adds annotations, updates status |
|
|
239
|
+
| `/dld-adjust` | Adjust or update existing decisions — handles permission gating and correct intent interpretation |
|
|
240
|
+
| `/dld-lookup` | Query decisions by ID, tag, code path, or keyword |
|
|
241
|
+
| `/dld-status` | Overview of the decision log — counts, recent decisions, run tracking |
|
|
242
|
+
| `/dld-audit` | Scan for drift between decisions and code |
|
|
243
|
+
| `/dld-audit-auto` | Autonomous audit — detects drift, fixes issues, opens a PR (for scheduled/CI use) |
|
|
244
|
+
| `/dld-snapshot` | Generate SNAPSHOT.md (detailed reference) and OVERVIEW.md (narrative synthesis with diagrams) |
|
|
245
|
+
| `/dld-retrofit` | Bootstrap decisions from an existing codebase (broad or detailed mode) |
|
|
246
|
+
| `/dld-reindex` | Resolve decision ID collisions with the base branch (and open PRs) before rebasing — renames colliding local drafts, rewrites annotations and cross-references, squashes branch commits into a rebase-clean reindex commit |
|
|
247
|
+
|
|
248
|
+
### Active workflow
|
|
249
|
+
|
|
250
|
+
The core DLD loop: record decisions via `/dld-decide` or `/dld-plan`, implement them with `/dld-implement`, and the framework maintains tight coupling between the decision log and code through `@decision` annotations. `/dld-audit` periodically checks for drift, and `/dld-snapshot` regenerates the derived specification.
|
|
251
|
+
|
|
252
|
+
<img width="3180" height="2100" alt="DLD high-level workflow overview showing the decision log, code annotations, generated specification, and drift detection" src="https://github.com/user-attachments/assets/fc8b7804-10ce-439b-ba0c-1f431a26a46e" />
|
|
253
|
+
|
|
254
|
+
### Passive mode
|
|
255
|
+
|
|
256
|
+
For teams that want living documentation without changing how they work. Run `/dld-init` and `/dld-retrofit` once to bootstrap, then schedule `/dld-audit-auto` and `/dld-snapshot` to run automatically (e.g. nightly via CI). The audit detects unreferenced code changes, infers new decisions, and back-annotates the code — all without developers invoking any DLD commands during their normal workflow.
|
|
257
|
+
|
|
258
|
+
<img width="2880" height="2760" alt="DLD passive mode showing scheduled automation that keeps decisions and docs in sync without workflow changes" src="https://github.com/user-attachments/assets/36bba4e1-e8eb-4390-a484-f18f54638fa1" />
|
|
259
|
+
|
|
260
|
+
> [!NOTE]
|
|
261
|
+
> DLD doesn't include a scheduler. How you trigger the automated runs is up to you — [Claude Code's built-in cron support](https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md#2171), a CI pipeline step, or any other external scheduler all work.
|
|
262
|
+
|
|
263
|
+
## Project structure
|
|
264
|
+
|
|
265
|
+
### Flat mode (default)
|
|
266
|
+
|
|
267
|
+
```
|
|
268
|
+
dld.config.yaml
|
|
269
|
+
decisions/
|
|
270
|
+
INDEX.md # Auto-generated decision index
|
|
271
|
+
SNAPSHOT.md # Detailed per-decision reference
|
|
272
|
+
OVERVIEW.md # Narrative synthesis with Mermaid diagrams
|
|
273
|
+
PRACTICES.md # Development practices manifest (optional)
|
|
274
|
+
.dld-state.yaml # Last audit and snapshot runs
|
|
275
|
+
records/
|
|
276
|
+
DL-001.md
|
|
277
|
+
DL-002.md
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Namespaced mode (monorepos)
|
|
281
|
+
|
|
282
|
+
```
|
|
283
|
+
dld.config.yaml
|
|
284
|
+
decisions/
|
|
285
|
+
INDEX.md
|
|
286
|
+
SNAPSHOT.md
|
|
287
|
+
OVERVIEW.md
|
|
288
|
+
PRACTICES.md
|
|
289
|
+
records/
|
|
290
|
+
billing/
|
|
291
|
+
DL-001.md
|
|
292
|
+
DL-004.md
|
|
293
|
+
PRACTICES.md # Namespace-specific practices (optional)
|
|
294
|
+
auth/
|
|
295
|
+
DL-002.md
|
|
296
|
+
DL-005.md
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
IDs are globally sequential across namespaces, so `@decision(DL-012)` is unambiguous regardless of which namespace it belongs to.
|
|
300
|
+
|
|
301
|
+
## Status lifecycle
|
|
302
|
+
|
|
303
|
+
```
|
|
304
|
+
proposed --> accepted --> deprecated
|
|
305
|
+
--> superseded (by a newer decision)
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
- **proposed** — recorded but not yet implemented (mutable — can be refined during implementation)
|
|
309
|
+
- **accepted** — implemented, code references this decision via annotations (content immutable, metadata like `status` and `references` can be updated)
|
|
310
|
+
- **deprecated** — no longer relevant, no replacement
|
|
311
|
+
- **superseded** — replaced by a newer decision
|
|
312
|
+
|
|
313
|
+
## Concepts
|
|
314
|
+
|
|
315
|
+
### Practices manifest
|
|
316
|
+
|
|
317
|
+
An optional `decisions/PRACTICES.md` captures project development conventions (testing approach, code style, architecture patterns). The AI agent reads this when making and implementing decisions — it's most useful during `/dld-implement` where it directly influences how code is written.
|
|
318
|
+
|
|
319
|
+
### Spec as projection
|
|
320
|
+
|
|
321
|
+
The snapshot and overview documents are **generated, not maintained**. Like event sourcing read models, they're derived from the decision log and can be regenerated at any time. You maintain individual decisions; the framework derives the consolidated view.
|
|
322
|
+
|
|
323
|
+
### Drift detection
|
|
324
|
+
|
|
325
|
+
`/dld-audit` detects when code and decisions have drifted apart — orphaned annotations, stale references, modified annotated files that may need decision updates.
|
|
326
|
+
|
|
327
|
+
## Advanced configuration
|
|
328
|
+
|
|
329
|
+
### Custom snapshot artifacts
|
|
330
|
+
|
|
331
|
+
By default, `/dld-snapshot` generates `SNAPSHOT.md` and `OVERVIEW.md`. You can define additional documentation artifacts in `dld.config.yaml` — each one synthesized from the decision log using a prompt you provide:
|
|
332
|
+
|
|
333
|
+
```yaml
|
|
334
|
+
snapshot_artifacts:
|
|
335
|
+
- title: ONBOARDING.md
|
|
336
|
+
prompt: >
|
|
337
|
+
Generate a developer onboarding guide that explains the system
|
|
338
|
+
from scratch, assuming no prior context. Focus on what a new
|
|
339
|
+
contributor needs to know to start working.
|
|
340
|
+
- title: API-CONTRACTS.md
|
|
341
|
+
prompt: >
|
|
342
|
+
Summarize all API-related decisions into a single API contract
|
|
343
|
+
reference. Include endpoints, payload shapes, and auth requirements.
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
Custom artifacts are written to `decisions/` alongside the built-in files and regenerated every time `/dld-snapshot` runs. The `title` serves as both the filename and the document heading. See [project configuration](docs/framework/project-configuration.md#snapshot-artifacts) for details.
|
|
347
|
+
|
|
348
|
+
### Implementation review
|
|
349
|
+
|
|
350
|
+
`/dld-implement` includes a built-in review step that launches a subagent to check all code changes before finalizing. The reviewer scans for correctness, security issues, type safety problems, and consistency with existing patterns — then reports findings grouped by severity (critical, moderate, minor).
|
|
351
|
+
|
|
352
|
+
This is enabled by default. To disable it, set `implement_review` to `false` in `dld.config.yaml`:
|
|
353
|
+
|
|
354
|
+
```yaml
|
|
355
|
+
implement_review: false
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
The review subagent operates with limited context and may flag false positives. The implementing agent uses its own judgment and asks for user input when uncertain about a finding.
|
|
359
|
+
|
|
360
|
+
## CLI
|
|
361
|
+
|
|
362
|
+
The `dld` command comes with the npm package (`npx dld-kit <command>`, or `npm install --global dld-kit`). The skills carry their own copy in `dld-common/scripts/dld.mjs`, so they never need a global install.
|
|
363
|
+
|
|
364
|
+
| Command | What it does |
|
|
365
|
+
|---|---|
|
|
366
|
+
| `dld init` | Creates `dld.config.yaml`, `decisions/` and `INDEX.md`, then installs the skills and the rule (see [above](#npx-dld-kit-init)) |
|
|
367
|
+
| `dld update` | Rewrites the installed skills and rule with this version; `--agent` adds agents |
|
|
368
|
+
| `dld install-rule --agent <names>` | Installs or refreshes only the always-on rule |
|
|
369
|
+
| `dld session-context --agent <name>` | Prints the rule for a session hook, unless the agent loads it already (used by the Claude Code plugin) |
|
|
370
|
+
| `dld --help` | Lists every command; the rest are the operations the skills run |
|
|
371
|
+
|
|
372
|
+
`init` and `update` refuse to overwrite files from a newer dld-kit unless given `--force`.
|
|
373
|
+
|
|
374
|
+
## Development
|
|
375
|
+
|
|
376
|
+
```bash
|
|
377
|
+
bun install # dev dependencies (Bun is a dev tool; the CLI runs on Node 20+)
|
|
378
|
+
npm run lint && npm run typecheck && npm test
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
Skills and plugin manifests are generated: edit `templates/`, then run `npm run generate` to rebuild `skills/`, `.claude/skills/`, `claude-plugin/` and the manifests. See `CLAUDE.md` for the full set of commands, `docs/releasing.md` for releases, and `docs/plan/v1.md` for the 1.0 plan.
|
|
382
|
+
|
|
383
|
+
## Further reading
|
|
384
|
+
|
|
385
|
+
- [Concept paper](docs/concept/dld-concept.md) — full rationale and design philosophy
|
|
386
|
+
- [TL;DR](docs/concept/dld-tldr.md) — one-page summary
|
|
387
|
+
- [FAQ](docs/concept/dld-faq.md) — anticipated questions
|
|
388
|
+
- [Decision record format](docs/framework/decision-record-format.md) — schema and field reference
|
|
389
|
+
- [Project configuration](docs/framework/project-configuration.md) — config file and directory layout
|
|
390
|
+
- [Skill design plan](docs/plan/skill-design.md) — detailed skill specifications
|
|
391
|
+
|
|
392
|
+
## Acknowledgements
|
|
393
|
+
|
|
394
|
+
DLD builds on ideas from several projects and people:
|
|
395
|
+
|
|
396
|
+
- **[Architecture Decision Records (ADRs)](https://www.cognitect.com/blog/2011/11/15/documenting-architecture-decisions)** — Michael Nygard's foundational concept (2011) of recording architectural decisions as structured documents. DLD extends ADRs to cover all decision types and adds code-level coupling.
|
|
397
|
+
- **[Embedded ADRs (e-adr)](https://github.com/adr/e-adr)** — Pioneered `@ADR` annotations in Java code, linking decisions to classes and methods. DLD generalizes this to be language-agnostic and AI-agent-aware.
|
|
398
|
+
- **[Vibe ADR](https://medium.com/devops-ai/vibe-adr-building-with-intention-in-the-age-of-ai-d01e93f36696)** — Owen Zanzal's concept of decision records as "living nodes of intent" for both humans and AI.
|
|
399
|
+
- **[OpenSpec](https://openspec.dev/)** — A change-based specification framework with a delta model and archive workflow. Its brownfield-first philosophy and incremental approach validated key assumptions behind DLD.
|
|
400
|
+
- **[Spec Kit](https://github.blog/ai-and-ml/generative-ai/spec-driven-development-with-ai-get-started-with-a-new-open-source-toolkit/)** — GitHub's spec-driven development toolkit. DLD shares the goal of giving AI agents better context but inverts the relationship — the spec is derived from decisions rather than being the primary artifact.
|
|
401
|
+
- **[IIC Kit (Intent Integrity Kit)](https://github.com/docsforadobe/intent-integrity-for-claude-code)** — A constitution-driven framework for Claude Code that influenced DLD's skill organization and practices manifest approach.
|
|
402
|
+
- **[Kiro](https://kiro.dev/)** — AWS's spec-driven development IDE, part of the broader SDD movement that motivated DLD's alternative approach.
|
|
403
|
+
- **Event Sourcing / CQRS** — The architectural pattern behind DLD's core model: decisions as an append-only event stream, specs as derived projections.
|
|
404
|
+
- **[ADR community resources](https://adr.github.io)** — The comprehensive collection of ADR tools, templates, and guidance that provided a foundation for DLD's record format.
|
|
405
|
+
|
|
406
|
+
See the [concept paper](docs/concept/dld-concept.md) for a detailed discussion of how DLD relates to these approaches.
|
|
407
|
+
|
|
408
|
+
## Roadmap
|
|
409
|
+
|
|
410
|
+
DLD is under active development. Feature requests and ideas are welcome — [open an issue](https://github.com/jimutt/dld-kit/issues).
|
|
411
|
+
|
|
412
|
+
## Manual rule setup
|
|
413
|
+
|
|
414
|
+
The always-on rule tells the agent to read a decision before changing code annotated with it. `/dld-init` installs it with `dld install-rule --agent <harness>`, which picks the file the harness loads: `.claude/rules/dld-workflow.md` for Claude Code, `.agents/rules/dld-workflow.md` for Antigravity, or a marked block in `AGENTS.md` (or `CLAUDE.md`) for Codex, Cursor, OpenCode and Pi.
|
|
415
|
+
|
|
416
|
+
To add it by hand instead, copy [`templates/rules/dld-workflow.md`](templates/rules/dld-workflow.md) into one of those files.
|
|
417
|
+
|
|
418
|
+
## License
|
|
419
|
+
|
|
420
|
+
[MIT](LICENSE)
|