@evertonferreira96/agents 0.1.3 → 0.1.4
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/agents/api.md +2 -3
- package/.claude/agents/app.md +2 -2
- package/.claude/agents/product.md +18 -7
- package/.claude/agents/quick.md +1 -1
- package/.claude/agents/ui.md +1 -1
- package/.claude/agents/verifier.md +8 -4
- package/.claude/agents/web.md +2 -2
- package/.claude/hooks/orchestrator-guard.sh +3 -1
- package/.claude/hooks/post-compact.sh +20 -4
- package/.claude/hooks/stop-verify.sh +8 -3
- package/.claude/skills/arch-api/references/review.md +17 -0
- package/.claude/skills/arch-app/references/review.md +15 -0
- package/.claude/skills/arch-db/references/review.md +2 -0
- package/.claude/skills/arch-web/references/tests.md +15 -0
- package/.claude/skills/brief/SKILL.md +32 -3
- package/.claude/skills/domain-modeling/ADR-FORMAT.md +47 -0
- package/.claude/skills/domain-modeling/GLOSSARY-FORMAT.md +60 -0
- package/.claude/skills/domain-modeling/SKILL.md +74 -0
- package/.claude/skills/domain-modeling/agents/openai.yaml +3 -0
- package/.claude/skills/grill-with-docs/SKILL.md +10 -16
- package/.claude/skills/orchestrate/SKILL.md +19 -12
- package/.claude/skills/review/SKILL.md +3 -3
- package/.claude/skills/wayfinder/SKILL.md +146 -0
- package/.claude/skills/wayfinder/agents/openai.yaml +5 -0
- package/README.md +16 -11
- package/VERSION +1 -1
- package/docs/adr/README.md +3 -1
- package/docs/plans/README.md +38 -7
- package/package.json +1 -1
- package/scripts/bootstrap.mjs +11 -4
- package/scripts/check-catalog.mjs +4 -1
- package/skills-lock.json +18 -3
package/scripts/bootstrap.mjs
CHANGED
|
@@ -7,6 +7,8 @@
|
|
|
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, docs/plans/** and docs/adr/**
|
|
11
|
+
// except their README.md templates, .claude/agent-memory/**, .claude/handoffs/**. check-catalog.mjs fails if SYNC would ship one.
|
|
10
12
|
// .claude/config-manifest.json records the hash of every file the config installed. `update` uses it to tell a file that is
|
|
11
13
|
// only outdated (overwritten) from one edited in the project (kept unless --force), and deletes files that left the config
|
|
12
14
|
// only when the project copy is untouched.
|
|
@@ -20,6 +22,9 @@ export const SYNC = [".claude/agents", ".claude/hooks", ".claude/rules", ".claud
|
|
|
20
22
|
"docs/plans/README.md", "docs/adr/README.md", "docs/brief-template.md", "scripts/skills-update.mjs", "scripts/check-catalog.mjs", "scripts/bootstrap.mjs", "skills-lock.json"];
|
|
21
23
|
export const SKIP = /(^|\/)(scripts\/bin|__pycache__|node_modules|\.context-band)(\/|$)|\.pyc$/;
|
|
22
24
|
export const PROTECTED = /^(CLAUDE\.md|\.claude\/settings\.local\.json|\.claude\/agent-memory\/.*)$/;
|
|
25
|
+
// What the project's work produces: plans, wayfinder maps, ADRs, glossaries, agent memory, handoffs. The config only ships the two READMEs.
|
|
26
|
+
export const PROJECT_OWNED = /^((?!\.claude\/)(.+\/)?GLOSSARY\.md|GLOSSARY-MAP\.md|docs\/plans\/(?!README\.md$).+|((?!\.claude\/).+\/)?docs\/adr\/(?!README\.md$).+|\.claude\/agent-memory\/.+|\.claude\/handoffs\/.+)$/;
|
|
27
|
+
const isProtected = (rel) => PROTECTED.test(rel) || PROJECT_OWNED.test(rel);
|
|
23
28
|
export const GITIGNORE = [".claude/worktrees/", ".claude/handoffs/", ".claude/.context-band", ".claude/.stop-verify-ran", ".claude/settings.local.json",
|
|
24
29
|
".claude/agent-memory-local/", "graphify-out/", ".claude/skills/impeccable/scripts/bin/", "__pycache__/", "*.pyc"];
|
|
25
30
|
export const MANIFEST = ".claude/config-manifest.json";
|
|
@@ -45,14 +50,15 @@ export function readPackage(src = DEFAULT_SRC) {
|
|
|
45
50
|
}
|
|
46
51
|
|
|
47
52
|
// Every file the config installs, keyed by its path relative to the config root (forward slashes).
|
|
48
|
-
|
|
53
|
+
// Project-owned paths are never installed; `includeProjectOwned` lists them anyway, for check-catalog.mjs.
|
|
54
|
+
export function configFiles(src = DEFAULT_SRC, { includeProjectOwned = false } = {}) {
|
|
49
55
|
const files = new Map();
|
|
50
56
|
for (const entry of SYNC) {
|
|
51
57
|
const abs = join(src, entry);
|
|
52
58
|
if (!existsSync(abs)) continue;
|
|
53
59
|
for (const f of walk(abs)) {
|
|
54
60
|
const rel = relative(src, f).split(sep).join("/");
|
|
55
|
-
if (!SKIP.test(rel)) files.set(rel, f);
|
|
61
|
+
if (!SKIP.test(rel) && (includeProjectOwned || !PROJECT_OWNED.test(rel))) files.set(rel, f);
|
|
56
62
|
}
|
|
57
63
|
}
|
|
58
64
|
return files;
|
|
@@ -184,7 +190,7 @@ export function install({ src = DEFAULT_SRC, target, mode = "init", force = fals
|
|
|
184
190
|
}
|
|
185
191
|
const untouched = installed?.[rel] === have;
|
|
186
192
|
if (mode === "check") { (untouched ? r.outdated : r.edited).push(rel); continue; }
|
|
187
|
-
if (mode === "update" && (untouched || force) && !
|
|
193
|
+
if (mode === "update" && (untouched || force) && !isProtected(rel)) {
|
|
188
194
|
if (write) copyFileSync(abs, dst);
|
|
189
195
|
r.updated.push(rel); next[rel] = want;
|
|
190
196
|
continue;
|
|
@@ -196,11 +202,12 @@ export function install({ src = DEFAULT_SRC, target, mode = "init", force = fals
|
|
|
196
202
|
|
|
197
203
|
for (const [rel, hash] of Object.entries(installed ?? {})) {
|
|
198
204
|
if (files.has(rel)) continue;
|
|
205
|
+
if (PROJECT_OWNED.test(rel)) continue; // an older config shipped it: it is the project's now, so stop tracking it, never delete it
|
|
199
206
|
const dst = join(target, rel);
|
|
200
207
|
if (!existsSync(dst)) continue;
|
|
201
208
|
const untouched = sha(dst) === hash;
|
|
202
209
|
if (mode === "check") { r.obsolete.push(rel); continue; }
|
|
203
|
-
if (mode === "update" && untouched && !
|
|
210
|
+
if (mode === "update" && untouched && !isProtected(rel)) {
|
|
204
211
|
if (write) { rmSync(dst); removeEmptyParents(target, rel); }
|
|
205
212
|
r.removed.push(rel);
|
|
206
213
|
continue;
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// Drift checks: skills on disk vs docs/skills.md vs frontmatter vs skills-lock.json vs agents' skills: vs settings hooks
|
|
2
|
+
// Drift checks: skills on disk vs docs/skills.md vs frontmatter vs skills-lock.json vs agents' skills: vs settings hooks,
|
|
3
|
+
// and no project-owned path (plans, ADRs, glossary, agent memory, handoffs) among the files the config ships.
|
|
3
4
|
// Exit 1 on any error. Warnings do not fail.
|
|
4
5
|
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
6
|
+
import { configFiles, PROJECT_OWNED } from "./bootstrap.mjs";
|
|
5
7
|
const errors = [], warnings = [];
|
|
6
8
|
const read = (p) => readFileSync(p, "utf8");
|
|
7
9
|
const fm = (p) => read(p).split("---")[1] ?? "";
|
|
@@ -37,6 +39,7 @@ for (const list of Object.values(settings.hooks ?? {})) for (const e of list) fo
|
|
|
37
39
|
const m = /\$CLAUDE_PROJECT_DIR\/(\.claude\/hooks\/[^" ]+)/.exec(h.command ?? "");
|
|
38
40
|
if (m && !existsSync(m[1])) errors.push(`settings.json: hook file ${m[1]} does not exist`);
|
|
39
41
|
}
|
|
42
|
+
for (const rel of configFiles(undefined, { includeProjectOwned: true }).keys()) if (PROJECT_OWNED.test(rel)) errors.push(`${rel}: project-owned path shipped by the config (scripts/bootstrap.mjs SYNC)`);
|
|
40
43
|
for (const w of warnings) console.log(`warn ${w}`);
|
|
41
44
|
for (const e of errors) console.log(`ERROR ${e}`);
|
|
42
45
|
console.log(`${skills.length} skills, ${rows.size} catalog rows, ${Object.keys(lock).length} lock entries: ${errors.length} error(s), ${warnings.length} warning(s)`);
|
package/skills-lock.json
CHANGED
|
@@ -69,6 +69,13 @@
|
|
|
69
69
|
"skillPath": "skills/engineering/diagnosing-bugs/SKILL.md",
|
|
70
70
|
"sha256": "849198df88cdb65fd0d97236604c1fca7ff2f22d2f705f9724a800d0266b118d"
|
|
71
71
|
},
|
|
72
|
+
"domain-modeling": {
|
|
73
|
+
"source": "mattpocock/skills",
|
|
74
|
+
"sourceType": "github",
|
|
75
|
+
"sourceCommit": "49dd158",
|
|
76
|
+
"skillPath": "skills/engineering/domain-modeling/SKILL.md",
|
|
77
|
+
"sha256": "7b925d7b1e341a2eeae33ad68a8a8c0ab889a38ddd22a7598e4c240e5a7556a3"
|
|
78
|
+
},
|
|
72
79
|
"emil-design-eng": {
|
|
73
80
|
"source": "emilkowalski/skills",
|
|
74
81
|
"sourceType": "github",
|
|
@@ -107,10 +114,9 @@
|
|
|
107
114
|
"sourceType": "github",
|
|
108
115
|
"sourceCommit": "49dd158",
|
|
109
116
|
"skillPath": "skills/engineering/grill-with-docs/SKILL.md",
|
|
110
|
-
"note": "adapted:
|
|
117
|
+
"note": "adapted: calls grilling + domain-modeling like upstream; adds docs/plans read-first, graphify, the Grill record, the ADR template and lifecycle of docs/adr/README.md (which wins over domain-modeling's ADR-FORMAT.md) and the decisions block for the orchestrator",
|
|
111
118
|
"adapted": true,
|
|
112
|
-
"sha256": "
|
|
113
|
-
"sha256Note": "baseline taken from the local file on 2026-10-17; replaced by the upstream hash on the next `skills-update.mjs --lock`"
|
|
119
|
+
"sha256": "7de372c13488f1ee96cc11cd8907b56b6809cc93eef776eeddd37de6b6cbe3fe"
|
|
114
120
|
},
|
|
115
121
|
"grilling": {
|
|
116
122
|
"source": "mattpocock/skills",
|
|
@@ -253,6 +259,15 @@
|
|
|
253
259
|
"adapted": true,
|
|
254
260
|
"adaptedNote": "frontmatter only: disable-model-invocation: true (preloaded by the agents that use it)"
|
|
255
261
|
},
|
|
262
|
+
"wayfinder": {
|
|
263
|
+
"source": "mattpocock/skills",
|
|
264
|
+
"sourceType": "github",
|
|
265
|
+
"sourceCommit": "49dd158",
|
|
266
|
+
"skillPath": "skills/engineering/wayfinder/SKILL.md",
|
|
267
|
+
"sha256": "9be7b478c389605a24517d27752f278933588da97a1b5921b165f455edf4c5b7",
|
|
268
|
+
"adapted": true,
|
|
269
|
+
"adaptedNote": "no issue tracker: the map is docs/plans/<effort>/map.md (with a Status line for the post-compact hook) and tickets are docs/plans/<effort>/decisions/NN-<slug>.md with Type, Status and Blocked by lines (upstream's local-markdown layout, moved under docs/plans); research tickets run as a read-only subagent with a brief instead of skill research (not vendored); prototype tickets go to /ui (skill prototype, emilkowalski) or the owning implementer in a spike worktree, never merged or pushed, since this repo's prototype is a different skill; sessions end with /clear; adds the hand-off to an L task in orchestrate when the way is clear (ADR 0012)"
|
|
270
|
+
},
|
|
256
271
|
"writing-for-agents": {
|
|
257
272
|
"source": "mattpocock/skills",
|
|
258
273
|
"sourceType": "github",
|