@evertonferreira96/agents 0.1.4 → 0.1.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/.claude/rules/adr.md +42 -0
- package/.claude/skills/grill-with-docs/SKILL.md +1 -1
- package/.claude/skills/orchestrate/SKILL.md +2 -2
- package/.claude/skills/project-docs/SKILL.md +1 -14
- package/.claude/skills/wayfinder/SKILL.md +1 -1
- package/README.md +3 -4
- package/VERSION +1 -1
- package/package.json +1 -2
- package/scripts/bootstrap.mjs +14 -7
- package/skills-lock.json +1 -1
- package/templates/CLAUDE.project.md +1 -1
- package/docs/adr/README.md +0 -33
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths: ["docs/adr/**", "**/docs/adr/**"]
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# ADRs
|
|
6
|
+
|
|
7
|
+
A project's ADRs are its own. The config never ships, overwrites or deletes anything under `docs/adr/`, not even a README (`PROJECT_OWNED` in `scripts/bootstrap.mjs`). This rule is the template and the lifecycle; skills and agents point here.
|
|
8
|
+
|
|
9
|
+
## Where
|
|
10
|
+
|
|
11
|
+
- One file per decision: `docs/adr/NNNN-<slug>.md`. Create `docs/adr/` with the first ADR.
|
|
12
|
+
- Multi-context repo (`GLOSSARY-MAP.md` at the root): context decisions live in `<context>/docs/adr/` with their own numbering; system-wide ones in `docs/adr/`.
|
|
13
|
+
|
|
14
|
+
## Numbering
|
|
15
|
+
|
|
16
|
+
- `NNNN` is 4 digits, zero-padded, next after the highest existing number (`0001`, `0002`, ...). Never reuse a number.
|
|
17
|
+
- `<slug>` is lowercase kebab-case of the title.
|
|
18
|
+
- ADRs are immutable once Accepted. To change a decision, write a new ADR and set the old one to `Superseded by NNNN`.
|
|
19
|
+
|
|
20
|
+
## When and how
|
|
21
|
+
|
|
22
|
+
- Skill `domain-modeling` decides whether a decision earns an ADR (hard to reverse, surprising without context, the result of a real trade-off). This rule decides how it looks and lives, and wins over that skill's `ADR-FORMAT.md`.
|
|
23
|
+
- `/architect` returns an ADR proposal, the orchestrator copies it into `docs/plans/<task>.md`, and at DoD creates the ADR file in the same diff as the change.
|
|
24
|
+
- `Proposed` while grilling or charting a wayfinder map; `Accepted` only with the change that implements it. An Accepted ADR changes only in its Status line; a new ADR supersedes it.
|
|
25
|
+
|
|
26
|
+
## Template
|
|
27
|
+
|
|
28
|
+
```markdown
|
|
29
|
+
# NNNN - <title>
|
|
30
|
+
|
|
31
|
+
Status: Proposed | Accepted | Partly superseded by NNNN (<which part>) | Superseded by NNNN | Deprecated
|
|
32
|
+
Date: YYYY-MM-DD
|
|
33
|
+
|
|
34
|
+
## Context
|
|
35
|
+
<forces, constraints, the problem; link the plan>
|
|
36
|
+
|
|
37
|
+
## Decision
|
|
38
|
+
<what we do, in present tense>
|
|
39
|
+
|
|
40
|
+
## Consequences
|
|
41
|
+
<what gets easier, what gets harder, rejected alternatives and why>
|
|
42
|
+
```
|
|
@@ -25,7 +25,7 @@ After each round, append the answers to the plan's `## Grill record` (format in
|
|
|
25
25
|
### Glossary and ADRs
|
|
26
26
|
|
|
27
27
|
- `GLOSSARY.md` (or the context glossaries a `GLOSSARY-MAP.md` lists): written by `domain-modeling` the moment a term settles, in its `GLOSSARY-FORMAT.md`. A term goes in only when the user confirms its meaning; flag where the code currently uses another name.
|
|
28
|
-
- ADRs: `domain-modeling` decides **whether** a decision earns one (hard to reverse, surprising without context, the result of a real trade-off). `
|
|
28
|
+
- ADRs: `domain-modeling` decides **whether** a decision earns one (hard to reverse, surprising without context, the result of a real trade-off). Rule `adr` (`.claude/rules/adr.md`) decides **how** it looks and lives, and wins over the skill's `ADR-FORMAT.md`: `NNNN-<slug>.md` with Status, Date, Context, Decision, Consequences; `Proposed` while grilling; `Accepted` only with the change that implements it; never edited once Accepted (a new one supersedes it).
|
|
29
29
|
- If the decision meets an `/architect` trigger, say so: the orchestrator runs `/architect` on the proposal before it is accepted.
|
|
30
30
|
|
|
31
31
|
## Close
|
|
@@ -58,7 +58,7 @@ One task worktree per affected repo, inside that repo, never `git checkout` in t
|
|
|
58
58
|
|
|
59
59
|
- L: always. M: when two competent implementers could build different things from the request. S: never.
|
|
60
60
|
- Call the Skill tool with "grilling". Rounds over the design tree, every question with a recommended answer; facts come from the code or a sub-agent, decisions from the user.
|
|
61
|
-
- Call the Skill tool with "domain-modeling" too, and write what `grill-with-docs` writes while the rounds run: settled terms into `GLOSSARY.md` in that skill's format, decisions that pass its three ADR tests as `Proposed` ADRs in `docs/adr/` (template and lifecycle in `
|
|
61
|
+
- Call the Skill tool with "domain-modeling" too, and write what `grill-with-docs` writes while the rounds run: settled terms into `GLOSSARY.md` in that skill's format, decisions that pass its three ADR tests as `Proposed` ADRs in `docs/adr/` (template and lifecycle in rule `adr`, `.claude/rules/adr.md`, which wins over the skill's `ADR-FORMAT.md`). The user may start the same thing with `/grill-with-docs`.
|
|
62
62
|
- After each round, before asking the next one, append the answers to `## Grill record` in `docs/plans/<task>.md`: the decision, the reason in the user's own words when they add nuance, the alternatives rejected and why, and any constraint said in passing. It is the only place the grill's reasoning survives outside your window; the decisions block is its summary, not a substitute.
|
|
63
63
|
- Close with the decisions block (Decisions / Deferred / Out of scope / Plan changes) and apply it to the plan. Decisions that meet an architecture trigger go to `/architect`, not silently into the plan.
|
|
64
64
|
|
|
@@ -137,7 +137,7 @@ After every parallel batch, before any verifier or next ticket.
|
|
|
137
137
|
## 11. ADR (L with an architecture decision)
|
|
138
138
|
|
|
139
139
|
- After the first `/architect` pass, write its ADR proposal into `docs/plans/<task>.md` under Decisions.
|
|
140
|
-
- At DoD, create `docs/adr/NNNN-<slug>.md` from that proposal (template in `
|
|
140
|
+
- At DoD, create `docs/adr/NNNN-<slug>.md` from that proposal (template in rule `adr`) in the same diff. Grill ADRs already written as `Proposed` become `Accepted` here. This is a docs write and is yours.
|
|
141
141
|
|
|
142
142
|
## 12. Commit
|
|
143
143
|
|
|
@@ -278,20 +278,7 @@ Only if you actually operate this (VPS, homelab, side-project prod). Commands th
|
|
|
278
278
|
|
|
279
279
|
### ADR (`docs/adr/0001-<slug>.md`)
|
|
280
280
|
|
|
281
|
-
Use when you chose one option and rejected others. The architecture page stays present-tense; the ADR may narrate the choice.
|
|
282
|
-
|
|
283
|
-
```markdown
|
|
284
|
-
# ADR 0001 - <Title>
|
|
285
|
-
|
|
286
|
-
- **Status:** accepted
|
|
287
|
-
- **Date:** YYYY-MM-DD
|
|
288
|
-
|
|
289
|
-
## Context
|
|
290
|
-
|
|
291
|
-
## Decision
|
|
292
|
-
|
|
293
|
-
## Consequences
|
|
294
|
-
```
|
|
281
|
+
Use when you chose one option and rejected others. The architecture page stays present-tense; the ADR may narrate the choice. Template, numbering and lifecycle: rule `adr` (`.claude/rules/adr.md`), the one every skill and agent uses.
|
|
295
282
|
|
|
296
283
|
## Freshness (personal scale)
|
|
297
284
|
|
|
@@ -91,7 +91,7 @@ Every ticket is either **HITL** (human in the loop, worked _with_ a human who sp
|
|
|
91
91
|
- **Grilling** (HITL): Conversation. The default case. Always call the Skill tool twice, for "grilling" and "domain-modeling".
|
|
92
92
|
- **Task** (HITL or AFK): Manual work that must happen before a _decision_ can be made: nothing to decide, prototype, or research, but the discussion is blocked until it's done. Signing up for a service so its API can be judged, provisioning access, moving data so its shape can be seen. This is the one type that _does_ rather than decides, and it earns its place by unblocking a decision, not by delivering the destination. Work that touches code or infrastructure goes to the owning agent with a spike brief (AFK); anything else, or anything needing the human's credentials or accounts, is a precise checklist for the human (HITL). Resolved when the work is done; the answer records what was done and any resulting facts (credentials location, new URLs, row counts) later tickets depend on. Never write a secret into the ticket: point at where it lives.
|
|
93
93
|
|
|
94
|
-
A decision that is hard to reverse, surprising without context and the result of a real trade-off also becomes a `Proposed` ADR in `docs/adr/` (skill `domain-modeling` decides whether, `
|
|
94
|
+
A decision that is hard to reverse, surprising without context and the result of a real trade-off also becomes a `Proposed` ADR in `docs/adr/` (skill `domain-modeling` decides whether, rule `adr` how). The ticket links it; it becomes `Accepted` with the change that implements it.
|
|
95
95
|
|
|
96
96
|
## Fog of war
|
|
97
97
|
|
package/README.md
CHANGED
|
@@ -40,7 +40,7 @@ A complete working setup for Claude Code, kept in one repo and shipped as the np
|
|
|
40
40
|
|---|---|
|
|
41
41
|
| **Agents** (10) | An orchestrator flow plus specialists: `quick`, `product`, `architect`, `api`, `web`, `app`, `infra`, `ui`, `verifier`, `security` |
|
|
42
42
|
| **Skills** (39) | Workflow (orchestrate, triage, brief, review, grilling, domain-modeling, wayfinder, handoff, retro), architecture (`arch-api`, `arch-web`, `arch-app`, `arch-db`), quality (tdd, diagnosing-bugs, ponytail), design and motion |
|
|
43
|
-
| **Rules** (
|
|
43
|
+
| **Rules** (10) | Loaded always or by path glob: git, tickets, api, web, mobile, db, ui, graphify, adr, delivery diagram |
|
|
44
44
|
| **Hooks** (8) | Deterministic guards that block what rules can only ask for: `git push`, `git add -A`, staging `.env`, the orchestrator editing code, lint and unit tests on Stop |
|
|
45
45
|
| **AGENTS.md** | The shared base that Cursor and Codex read too |
|
|
46
46
|
| **Updates** | A manifest of every installed file, so updates refresh what you did not touch and never overwrite what you changed |
|
|
@@ -183,7 +183,7 @@ flowchart TD
|
|
|
183
183
|
|
|
184
184
|
**Never touched, not even with `--force`:** `CLAUDE.md`, `.claude/settings.local.json` and `.claude/agent-memory/**`.
|
|
185
185
|
|
|
186
|
-
**Never shipped, so never touched either:** what the project
|
|
186
|
+
**Never shipped, so never touched either:** what belongs to the project and its work: its `README.md`, everything under `docs/adr/` (no README either: the ADR template is rule `.claude/rules/adr.md`), `docs/plans/**` except the plan template `docs/plans/README.md`, `GLOSSARY.md`, `GLOSSARY-MAP.md` and context glossaries, `.claude/handoffs/**`. A `docs/adr/README.md` left by an older version is removed on update when untouched, and kept as yours when edited. An update cannot overwrite or delete them even if a manifest lists them, and `check-catalog.mjs` fails if the config ever tries to ship one.
|
|
187
187
|
|
|
188
188
|
| Situation | Result |
|
|
189
189
|
|---|---|
|
|
@@ -257,13 +257,12 @@ your-project/
|
|
|
257
257
|
├── skills-lock.json origin and hash of every vendored skill
|
|
258
258
|
├── docs/
|
|
259
259
|
│ ├── plans/README.md plan template, one plan per task
|
|
260
|
-
│ ├── adr/README.md ADR template
|
|
261
260
|
│ └── brief-template.md
|
|
262
261
|
├── scripts/ bootstrap, check-catalog, skills-update
|
|
263
262
|
└── .claude/
|
|
264
263
|
├── agents/ 10 agents
|
|
265
264
|
├── skills/ 39 skills
|
|
266
|
-
├── rules/
|
|
265
|
+
├── rules/ 10 rules (rule adr is the ADR template)
|
|
267
266
|
├── hooks/ 8 hooks
|
|
268
267
|
├── settings.json hook wiring, worktree base, context limits
|
|
269
268
|
├── config-manifest.json hash of every installed file (commit it)
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.1.
|
|
1
|
+
0.1.5
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@evertonferreira96/agents",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Personal agents, rules, hooks and skills for Claude Code (portable to Cursor and Codex through AGENTS.md), installable into any project.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
"AGENTS.md",
|
|
21
21
|
".worktreeinclude",
|
|
22
22
|
"docs/plans/README.md",
|
|
23
|
-
"docs/adr/README.md",
|
|
24
23
|
"docs/brief-template.md",
|
|
25
24
|
"scripts/bootstrap.mjs",
|
|
26
25
|
"scripts/check-catalog.mjs",
|
package/scripts/bootstrap.mjs
CHANGED
|
@@ -7,8 +7,9 @@
|
|
|
7
7
|
// node scripts/bootstrap.mjs <target> --force update --force: also overwrite files edited in the project
|
|
8
8
|
// node scripts/bootstrap.mjs --sync inside a project bootstrapped from a local clone: pull it, then update
|
|
9
9
|
// Protected (never written over): CLAUDE.md, .claude/settings.local.json, .claude/agent-memory/**
|
|
10
|
-
// Project-owned (never shipped, written over or deleted, even with --force): GLOSSARY.md and GLOSSARY-MAP.md,
|
|
11
|
-
//
|
|
10
|
+
// Project-owned (never shipped, written over or deleted, even with --force): the project's README.md, GLOSSARY.md and GLOSSARY-MAP.md,
|
|
11
|
+
// docs/adr/** (no README either: the ADR template is rule .claude/rules/adr.md), docs/plans/** except its README.md template,
|
|
12
|
+
// .claude/agent-memory/**, .claude/handoffs/**. check-catalog.mjs fails if SYNC would ship one.
|
|
12
13
|
// .claude/config-manifest.json records the hash of every file the config installed. `update` uses it to tell a file that is
|
|
13
14
|
// only outdated (overwritten) from one edited in the project (kept unless --force), and deletes files that left the config
|
|
14
15
|
// only when the project copy is untouched.
|
|
@@ -19,11 +20,15 @@ import { dirname, join, relative, resolve, sep } from "node:path";
|
|
|
19
20
|
import { fileURLToPath } from "node:url";
|
|
20
21
|
|
|
21
22
|
export const SYNC = [".claude/agents", ".claude/hooks", ".claude/rules", ".claude/skills", ".claude/settings.json", "AGENTS.md", ".worktreeinclude",
|
|
22
|
-
"docs/plans/README.md", "docs/
|
|
23
|
+
"docs/plans/README.md", "docs/brief-template.md", "scripts/skills-update.mjs", "scripts/check-catalog.mjs", "scripts/bootstrap.mjs", "skills-lock.json"];
|
|
23
24
|
export const SKIP = /(^|\/)(scripts\/bin|__pycache__|node_modules|\.context-band)(\/|$)|\.pyc$/;
|
|
24
25
|
export const PROTECTED = /^(CLAUDE\.md|\.claude\/settings\.local\.json|\.claude\/agent-memory\/.*)$/;
|
|
25
|
-
// What the project
|
|
26
|
-
|
|
26
|
+
// What belongs to the project and its work: its README, plans, wayfinder maps, ADRs, glossaries, agent memory, handoffs.
|
|
27
|
+
// The config ships only the plan template (docs/plans/README.md).
|
|
28
|
+
export const PROJECT_OWNED = /^(README\.md|(?!\.claude\/)(.+\/)?GLOSSARY\.md|GLOSSARY-MAP\.md|docs\/plans\/(?!README\.md$).+|((?!\.claude\/).+\/)?docs\/adr\/.+|\.claude\/agent-memory\/.+|\.claude\/handoffs\/.+)$/;
|
|
29
|
+
// Files older versions shipped into a project-owned folder: update removes them when untouched, like any file that left the config,
|
|
30
|
+
// and otherwise stops tracking them. docs/adr/README.md was the ADR template before it became rule adr (ADR 0013).
|
|
31
|
+
export const RETIRED = new Set(["docs/adr/README.md"]);
|
|
27
32
|
const isProtected = (rel) => PROTECTED.test(rel) || PROJECT_OWNED.test(rel);
|
|
28
33
|
export const GITIGNORE = [".claude/worktrees/", ".claude/handoffs/", ".claude/.context-band", ".claude/.stop-verify-ran", ".claude/settings.local.json",
|
|
29
34
|
".claude/agent-memory-local/", "graphify-out/", ".claude/skills/impeccable/scripts/bin/", "__pycache__/", "*.pyc"];
|
|
@@ -202,17 +207,19 @@ export function install({ src = DEFAULT_SRC, target, mode = "init", force = fals
|
|
|
202
207
|
|
|
203
208
|
for (const [rel, hash] of Object.entries(installed ?? {})) {
|
|
204
209
|
if (files.has(rel)) continue;
|
|
205
|
-
|
|
210
|
+
const retired = RETIRED.has(rel);
|
|
211
|
+
if (PROJECT_OWNED.test(rel) && !retired) continue; // an older config shipped it: it is the project's now, so stop tracking it, never delete it
|
|
206
212
|
const dst = join(target, rel);
|
|
207
213
|
if (!existsSync(dst)) continue;
|
|
208
214
|
const untouched = sha(dst) === hash;
|
|
209
215
|
if (mode === "check") { r.obsolete.push(rel); continue; }
|
|
210
|
-
if (mode === "update" && untouched && !isProtected(rel)) {
|
|
216
|
+
if (mode === "update" && untouched && (retired || !isProtected(rel))) {
|
|
211
217
|
if (write) { rmSync(dst); removeEmptyParents(target, rel); }
|
|
212
218
|
r.removed.push(rel);
|
|
213
219
|
continue;
|
|
214
220
|
}
|
|
215
221
|
if (mode === "update") r.obsoleteKept.push(rel);
|
|
222
|
+
if (retired && mode === "update") continue; // edited here: it is the project's file now
|
|
216
223
|
next[rel] = hash; // keep tracking it so a later update can still remove it
|
|
217
224
|
}
|
|
218
225
|
|
package/skills-lock.json
CHANGED
|
@@ -114,7 +114,7 @@
|
|
|
114
114
|
"sourceType": "github",
|
|
115
115
|
"sourceCommit": "49dd158",
|
|
116
116
|
"skillPath": "skills/engineering/grill-with-docs/SKILL.md",
|
|
117
|
-
"note": "adapted: calls grilling + domain-modeling like upstream; adds docs/plans read-first, graphify, the Grill record, the ADR template and lifecycle of
|
|
117
|
+
"note": "adapted: calls grilling + domain-modeling like upstream; adds docs/plans read-first, graphify, the Grill record, the ADR template and lifecycle of rule adr (.claude/rules/adr.md) (which wins over domain-modeling's ADR-FORMAT.md) and the decisions block for the orchestrator",
|
|
118
118
|
"adapted": true,
|
|
119
119
|
"sha256": "7de372c13488f1ee96cc11cd8907b56b6809cc93eef776eeddd37de6b6cbe3fe"
|
|
120
120
|
},
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
- Skills: `.claude/skills/` (catalog and wiring: docs/skills.md)
|
|
28
28
|
- Architecture skills: arch-api (NestJS), arch-web (Next.js), arch-app (Expo), arch-db (Postgres/MySQL; loaded by rule db.md)
|
|
29
29
|
- Plans: `docs/plans/` (template in docs/plans/README.md)
|
|
30
|
-
- ADRs: `docs/adr/` (template and numbering in
|
|
30
|
+
- ADRs: `docs/adr/` (template and numbering in rule `.claude/rules/adr.md`; the folder is yours, the config never writes to it)
|
|
31
31
|
- Brief template: skill `brief` (`docs/brief-template.md` points there)
|
|
32
32
|
- Vendored skills: origins in `skills-lock.json`; check upstream with `node scripts/skills-update.mjs`
|
|
33
33
|
- Decisions about this repo: `docs/adr/`; changes: `CHANGELOG.md`
|
package/docs/adr/README.md
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# ADRs
|
|
2
|
-
|
|
3
|
-
One file per architecture decision: `docs/adr/NNNN-<slug>.md`.
|
|
4
|
-
|
|
5
|
-
## Numbering
|
|
6
|
-
|
|
7
|
-
- `NNNN` is 4 digits, zero-padded, next after the highest existing number (`0001`, `0002`, ...). Never reuse a number.
|
|
8
|
-
- `<slug>` is lowercase kebab-case of the title.
|
|
9
|
-
- ADRs are immutable once Accepted. To change a decision, write a new ADR and set the old one to `Superseded by NNNN`.
|
|
10
|
-
|
|
11
|
-
## Flow
|
|
12
|
-
|
|
13
|
-
`/architect` returns an ADR proposal, the orchestrator copies it into `docs/plans/<task>.md`, and at DoD creates the ADR file in the same diff as the change.
|
|
14
|
-
|
|
15
|
-
Skill `domain-modeling` decides whether a decision earns an ADR (hard to reverse, surprising without context, the result of a real trade-off); this file decides how it looks and lives, and wins over the skill's `ADR-FORMAT.md`. In a multi-context repo (`GLOSSARY-MAP.md` at the root), context decisions live in `<context>/docs/adr/` with their own numbering and system-wide ones here.
|
|
16
|
-
|
|
17
|
-
## Template
|
|
18
|
-
|
|
19
|
-
```markdown
|
|
20
|
-
# NNNN - <title>
|
|
21
|
-
|
|
22
|
-
Status: Proposed | Accepted | Partly superseded by NNNN (<which part>) | Superseded by NNNN | Deprecated
|
|
23
|
-
Date: YYYY-MM-DD
|
|
24
|
-
|
|
25
|
-
## Context
|
|
26
|
-
<forces, constraints, the problem; link the plan>
|
|
27
|
-
|
|
28
|
-
## Decision
|
|
29
|
-
<what we do, in present tense>
|
|
30
|
-
|
|
31
|
-
## Consequences
|
|
32
|
-
<what gets easier, what gets harder, rejected alternatives and why>
|
|
33
|
-
```
|