geneseed 4.9.4 → 4.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +106 -0
- package/README.md +16 -2
- package/SHIPPED.md +1 -1
- package/docs/README.md +1 -1
- package/docs/concepts/collaboration.md +1 -1
- package/docs/concepts/enforcement-table.md +1 -1
- package/docs/concepts/foreman-mode.md +1 -1
- package/docs/concepts/kits.md +91 -0
- package/docs/concepts/loop-branch.md +1 -1
- package/docs/concepts/loop-bricks.md +1 -1
- package/docs/concepts/loop-contracts.md +1 -1
- package/docs/concepts/loop-gates.md +1 -1
- package/docs/concepts/loop-notes.md +1 -1
- package/docs/concepts/loop-risk.md +1 -1
- package/docs/concepts/loop-templates.md +1 -1
- package/docs/concepts/loops.md +1 -1
- package/docs/concepts/lsp.md +1 -1
- package/docs/concepts/skills.md +1 -1
- package/docs/extending.md +107 -4
- package/docs/guides/install-scripted.md +1 -1
- package/docs/guides/run-anywhere.md +2 -2
- package/docs/guides/upgrade.md +2 -2
- package/docs/reference/glossary.md +1 -0
- package/docs/reference/troubleshoot-install.md +1 -1
- package/docs/web-ui.md +9 -0
- package/harness.config.json +1 -1
- package/js/build/args.mjs +27 -6
- package/js/build/driver.mjs +29 -8
- package/js/build/emit-claude.mjs +3 -1
- package/js/build/generate.mjs +10 -5
- package/js/build/render.mjs +94 -11
- package/js/build/source.mjs +117 -4
- package/js/cli-table.json +15 -0
- package/js/hosts/installs.mjs +35 -2
- package/js/hosts/link.mjs +88 -1
- package/js/hosts/native.mjs +14 -4
- package/js/inspect/checks-authoring.mjs +6 -3
- package/js/inspect/checks-build.mjs +15 -3
- package/js/inspect/checks-counts.mjs +153 -6
- package/js/inspect/checks-repo.mjs +95 -20
- package/js/inspect/cost.mjs +1 -1
- package/js/inspect/diff.mjs +56 -8
- package/js/inspect/inventory.mjs +2 -0
- package/js/inspect/status.mjs +44 -3
- package/js/inspect/validate.mjs +3 -3
- package/js/lib/prompt.mjs +19 -2
- package/js/maintain/setup.mjs +111 -23
- package/js/maintain/update.mjs +3 -3
- package/js/web/actions.mjs +38 -6
- package/js/web/api.mjs +76 -17
- package/js/web/catalog.mjs +17 -2
- package/js/web/handler.mjs +1 -0
- package/js/web/routes.mjs +2 -1
- package/js/web/server.mjs +11 -5
- package/js/web/state.mjs +38 -3
- package/package.json +1 -1
- package/registry.json +91 -0
- package/src/AGENT.md.tmpl +7 -7
- package/src/agents/_self-improvement.md +11 -0
- package/src/agents/_template.md +1 -8
- package/src/agents/advocate.md +1 -8
- package/src/agents/architect.md +1 -8
- package/src/agents/developer.md +1 -8
- package/src/agents/devops-engineer.md +37 -0
- package/src/agents/docker-expert.md +37 -0
- package/src/agents/docs.md +1 -8
- package/src/agents/empiricist.md +1 -8
- package/src/agents/explorer.md +1 -8
- package/src/agents/framer.md +1 -8
- package/src/agents/historian.md +1 -8
- package/src/agents/kubernetes-specialist.md +37 -0
- package/src/agents/memory-curator.md +1 -8
- package/src/agents/operator.md +1 -8
- package/src/agents/performance.md +1 -8
- package/src/agents/pragmatist.md +1 -8
- package/src/agents/react-engineer.md +38 -0
- package/src/agents/react-reviewer.md +42 -0
- package/src/agents/researcher.md +5 -10
- package/src/agents/reviewer.md +3 -8
- package/src/agents/security.md +1 -8
- package/src/agents/skeptic.md +1 -8
- package/src/agents/spring-boot-engineer.md +40 -0
- package/src/agents/spring-reviewer.md +41 -0
- package/src/agents/spring-security.md +42 -0
- package/src/agents/steward.md +1 -8
- package/src/agents/tester.md +1 -8
- package/src/agents/user-advocate.md +1 -8
- package/src/agents/visionary.md +1 -8
- package/src/kits/react/rules.md +13 -0
- package/src/kits/react.json +18 -0
- package/src/kits/spring-boot/rules.md +10 -0
- package/src/kits/spring-boot.json +23 -0
- package/src/licenses/everything-claude-code.txt +21 -0
- package/src/licenses/mattpocock-skills.txt +21 -0
- package/src/licenses/piomin-spring-boot.txt +190 -0
- package/src/licenses/superpowers.txt +21 -0
- package/src/licenses/vibe-wise.txt +21 -0
- package/src/skills/_self-improvement.md +22 -5
- package/src/skills/brainstorm/builder-check.md +2 -0
- package/src/skills/brainstorm.md +11 -2
- package/src/skills/codebase-design.md +10 -2
- package/src/skills/daydream/VENDOR.md +7 -7
- package/src/skills/debug.md +6 -2
- package/src/skills/develop.md +6 -2
- package/src/skills/geneseed-code-review.md +6 -2
- package/src/skills/git-history.md +2 -0
- package/src/skills/handoff.md +3 -1
- package/src/skills/learn-mode.md +3 -2
- package/src/skills/parallel-agents.md +5 -1
- package/src/skills/pipeline.md +2 -0
- package/src/skills/plan.md +9 -2
- package/src/skills/prototype.md +6 -2
- package/src/skills/react/a11y.md +33 -0
- package/src/skills/react/vite.md +35 -0
- package/src/skills/react/webpack.md +40 -0
- package/src/skills/react-testing.md +68 -0
- package/src/skills/react-view-transitions/AGENTS.md +646 -221
- package/src/skills/react-view-transitions/SKILL.md +28 -16
- package/src/skills/react-view-transitions/VENDOR.md +10 -8
- package/src/skills/react-view-transitions/references/css-recipes.md +72 -2
- package/src/skills/react-view-transitions/references/implementation.md +14 -26
- package/src/skills/react-view-transitions/references/nextjs.md +94 -37
- package/src/skills/react-view-transitions/references/patterns.md +60 -48
- package/src/skills/react-view-transitions/references/troubleshooting.md +47 -0
- package/src/skills/react.md +63 -0
- package/src/skills/research.md +6 -2
- package/src/skills/review-response.md +2 -0
- package/src/skills/rule.md +6 -2
- package/src/skills/ship.md +8 -4
- package/src/skills/skill-forge.md +11 -5
- package/src/skills/spring-boot/cloud.md +103 -0
- package/src/skills/spring-boot/java-modern.md +71 -0
- package/src/skills/spring-boot/logging.md +89 -0
- package/src/skills/spring-boot/security.md +112 -0
- package/src/skills/spring-boot/web.md +112 -0
- package/src/skills/spring-boot.md +57 -0
- package/src/skills/spring-data-jpa/patterns.md +68 -0
- package/src/skills/spring-data-jpa.md +81 -0
- package/src/skills/spring-testing.md +93 -0
- package/src/skills/wayfinder.md +8 -2
- package/src/skills/wiki.md +18 -5
- package/src/upstreams.json +66 -0
- package/themes/_TEMPLATE.json +13 -0
- package/themes/biker.json +13 -0
- package/themes/commentator.json +13 -0
- package/themes/cyberpunk.json +13 -0
- package/themes/gamer.json +13 -0
- package/themes/imperial.json +13 -0
- package/themes/joker.json +13 -0
- package/themes/marvin.json +13 -0
- package/themes/mean.json +13 -0
- package/themes/military.json +13 -0
- package/themes/neutral.json +13 -0
- package/themes/pirate.json +13 -0
- package/themes/sports.json +13 -0
- package/themes/verstappen.json +13 -0
- package/themes/wizard.json +13 -0
- package/web/dist/assets/Activity-44rbWUQI.js +1 -0
- package/web/dist/assets/ActivityDetail-Dk9k893a.js +1 -0
- package/web/dist/assets/Dashboard-DCoUN60W.js +2 -0
- package/web/dist/assets/{Docs-tDW7i7mo.js → Docs-C_je2lRG.js} +3 -3
- package/web/dist/assets/FilterInput-CZREvrjX.js +1 -0
- package/web/dist/assets/GreenhouseView-BXAOIznW.js +2 -0
- package/web/dist/assets/Installs-DAXF403D.js +3 -0
- package/web/dist/assets/JournalView-DZ184wKB.js +1 -0
- package/web/dist/assets/KitApply-pjhvGha0.js +1 -0
- package/web/dist/assets/Kits-BCCKjSIY.js +1 -0
- package/web/dist/assets/{Laws-BA3CzUf5.js → Laws-BgBUpRkE.js} +1 -1
- package/web/dist/assets/Library-CW0Zl6RF.js +1 -0
- package/web/dist/assets/Loops-BvFOzjEw.js +2 -0
- package/web/dist/assets/{Markdown-iHvBrpRN.js → Markdown-zaXXXHz9.js} +13 -13
- package/web/dist/assets/OperatorHudView-Bs4unPNi.js +2 -0
- package/web/dist/assets/Personal-C23XaT-a.js +1 -0
- package/web/dist/assets/Tabs-b2XFu4OS.js +1 -0
- package/web/dist/assets/activity-Jw8XcPiP.js +1 -0
- package/web/dist/assets/api-BfpZmUMI.js +1 -0
- package/web/dist/assets/{drawable-CyLe1gtW.js → drawable-BERkKhx_.js} +1 -1
- package/web/dist/assets/index-C9R_bRw_.js +2 -0
- package/web/dist/assets/{index-BCJz4_8C.css → index-jYlWihN-.css} +1 -1
- package/web/dist/assets/{react-BOF6yL40.js → react-DlYQp10C.js} +1 -1
- package/web/dist/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/web/dist/assets/sections-ChwaobfW.js +1 -0
- package/web/dist/assets/usePoll-bDFN-Hr6.js +1 -0
- package/web/dist/index.html +6 -5
- package/web/dist/assets/Activity-C8sZVIUU.js +0 -1
- package/web/dist/assets/ActivityDetail-Cc6vWUS4.js +0 -1
- package/web/dist/assets/Dashboard-C5ATa3ow.js +0 -2
- package/web/dist/assets/FilterInput-zLFXoSt6.js +0 -1
- package/web/dist/assets/GreenhouseView-zk2Uzc3A.js +0 -2
- package/web/dist/assets/Installs-CB_rvbBP.js +0 -3
- package/web/dist/assets/JournalView-Bfj27XHC.js +0 -1
- package/web/dist/assets/Library-BWwiy9Vb.js +0 -1
- package/web/dist/assets/Loops-DaPk-ckL.js +0 -2
- package/web/dist/assets/OperatorHudView-CyiGhiHk.js +0 -2
- package/web/dist/assets/Personal-Bwd27CmT.js +0 -1
- package/web/dist/assets/Tabs-BOD7Kaz1.js +0 -1
- package/web/dist/assets/activity-DvPxoS4Y.js +0 -1
- package/web/dist/assets/api-CiXlkbe0.js +0 -1
- package/web/dist/assets/index-DQXG_mqo.js +0 -2
- package/web/dist/assets/sections-BET3c1WT.js +0 -1
- package/web/dist/assets/usePoll-NSTzLOF4.js +0 -1
package/js/web/state.mjs
CHANGED
|
@@ -8,10 +8,10 @@
|
|
|
8
8
|
import { existsSync } from 'node:fs';
|
|
9
9
|
import path from 'node:path';
|
|
10
10
|
|
|
11
|
-
import { opencodeConfigDir } from '../hosts/hosts.mjs';
|
|
11
|
+
import { CLAUDE_STYLE, GLOBAL_MANIFEST, HOSTS, opencodeConfigDir } from '../hosts/hosts.mjs';
|
|
12
12
|
import {
|
|
13
|
-
EMIT_HOST_SCOPE, footprintOfDir,
|
|
14
|
-
trustOfDir,
|
|
13
|
+
EMIT_HOST_SCOPE, footprintOfDir, installState, installTargets, installedDefaults, modeOfDir,
|
|
14
|
+
postureOfDir, themeOfDir, trustOfDir,
|
|
15
15
|
} from '../hosts/installs.mjs';
|
|
16
16
|
import { doctorCollect } from '../inspect/doctor.mjs';
|
|
17
17
|
import { DEFAULT_PRESET } from '../loop/score.mjs';
|
|
@@ -19,6 +19,36 @@ import { readText, isFile } from '../lib/fs.mjs';
|
|
|
19
19
|
import { stripWhitespace } from '../lib/text.mjs';
|
|
20
20
|
import { inventoryFor } from './catalog.mjs';
|
|
21
21
|
|
|
22
|
+
/**
|
|
23
|
+
* The data dir an install's inventory/memory/diff is read from. Host-driven, so a new
|
|
24
|
+
* nested-marker host cannot silently read the bare root.
|
|
25
|
+
*/
|
|
26
|
+
export function viewCfg(host, scope, root) {
|
|
27
|
+
if (scope === 'project' && CLAUDE_STYLE.includes(host)) {
|
|
28
|
+
return path.join(root, HOSTS.find((h) => h.host === host).projectMarker);
|
|
29
|
+
}
|
|
30
|
+
return root;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* `[target, root]` for the install the console should show when nothing picked one, or null
|
|
35
|
+
* when the current target is already deployed or nothing is.
|
|
36
|
+
*
|
|
37
|
+
* The console used to open on the OpenCode global dir unconditionally. On a machine with only
|
|
38
|
+
* IBM Bob (reported 2026-10) nothing is deployed there, so Overview showed the onboarding form
|
|
39
|
+
* over a perfectly good `~/.bob`, and the selector that could re-point it hides itself below two
|
|
40
|
+
* installs. So when `current` holds no manifest, the first ACTIVE install `installTargets`
|
|
41
|
+
* finds is shown instead — a global before a project, in its host order.
|
|
42
|
+
*/
|
|
43
|
+
export function fallbackView(current, targets = installTargets()) {
|
|
44
|
+
if (existsSync(path.join(current, GLOBAL_MANIFEST))) return null;
|
|
45
|
+
const active = targets.filter(([host, scope, root]) => {
|
|
46
|
+
try { return installState(root, host, scope) === 'active'; } catch { return false; }
|
|
47
|
+
});
|
|
48
|
+
const pick = active.find(([, scope]) => scope === 'global') || active[0];
|
|
49
|
+
return pick ? [viewCfg(...pick), pick[2]] : null;
|
|
50
|
+
}
|
|
51
|
+
|
|
22
52
|
/**
|
|
23
53
|
* `YYYY-MM-DD HH:MM`, LOCAL time — `toISOString` would be UTC, which reads wrong in every
|
|
24
54
|
* timezone but one for a user-facing timestamp.
|
|
@@ -154,6 +184,11 @@ export function webState(theme = null, target = null) {
|
|
|
154
184
|
st._doctor = null;
|
|
155
185
|
};
|
|
156
186
|
st.refresh = ({ doctor = true } = {}) => {
|
|
187
|
+
// A job may have deployed the first install while the view still points at an empty
|
|
188
|
+
// default (the onboarding Build), or removed the one in view: follow it to one that exists.
|
|
189
|
+
// Only on a full refresh: `{ doctor: false }` marks a mutation that cannot change installs.
|
|
190
|
+
const fallback = doctor ? fallbackView(st.target) : null;
|
|
191
|
+
if (fallback) { st.selectView(...fallback); return; }
|
|
157
192
|
st._inv = null;
|
|
158
193
|
if (doctor) st._doctor = null;
|
|
159
194
|
st.emit = st.detectEmit() || st.emit;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"//": "Every field here is argued and gated in tests/unit/package_manifest.test.mjs. `files`, `bin` and `engines` each have a test that fails when reality drifts from this file; `version` mirrors harness.config.json and is gated too. Read that docblock before editing this one.",
|
|
3
3
|
"name": "geneseed",
|
|
4
|
-
"version": "4.
|
|
4
|
+
"version": "4.14.0",
|
|
5
5
|
"description": "A portable, theme-able harness you implant once and use everywhere to grow a disciplined AI coding agent.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"ai",
|
package/registry.json
CHANGED
|
@@ -22,6 +22,20 @@
|
|
|
22
22
|
"added": "2026-07-13",
|
|
23
23
|
"last_verified": ""
|
|
24
24
|
},
|
|
25
|
+
"agents/devops-engineer": {
|
|
26
|
+
"status": "experimental",
|
|
27
|
+
"version": "1.0.0",
|
|
28
|
+
"owner": "Guillaume Lemer",
|
|
29
|
+
"added": "2026-10-20",
|
|
30
|
+
"last_verified": ""
|
|
31
|
+
},
|
|
32
|
+
"agents/docker-expert": {
|
|
33
|
+
"status": "experimental",
|
|
34
|
+
"version": "1.0.0",
|
|
35
|
+
"owner": "Guillaume Lemer",
|
|
36
|
+
"added": "2026-10-20",
|
|
37
|
+
"last_verified": ""
|
|
38
|
+
},
|
|
25
39
|
"agents/docs": {
|
|
26
40
|
"status": "approved",
|
|
27
41
|
"version": "1.0.0",
|
|
@@ -57,6 +71,13 @@
|
|
|
57
71
|
"added": "2026-06-08",
|
|
58
72
|
"last_verified": ""
|
|
59
73
|
},
|
|
74
|
+
"agents/kubernetes-specialist": {
|
|
75
|
+
"status": "experimental",
|
|
76
|
+
"version": "1.0.0",
|
|
77
|
+
"owner": "Guillaume Lemer",
|
|
78
|
+
"added": "2026-10-20",
|
|
79
|
+
"last_verified": ""
|
|
80
|
+
},
|
|
60
81
|
"agents/memory-curator": {
|
|
61
82
|
"status": "experimental",
|
|
62
83
|
"version": "1.0.0",
|
|
@@ -78,6 +99,20 @@
|
|
|
78
99
|
"added": "2026-06-08",
|
|
79
100
|
"last_verified": ""
|
|
80
101
|
},
|
|
102
|
+
"agents/react-engineer": {
|
|
103
|
+
"status": "experimental",
|
|
104
|
+
"version": "1.0.0",
|
|
105
|
+
"owner": "Guillaume Lemer",
|
|
106
|
+
"added": "2026-10-21",
|
|
107
|
+
"last_verified": ""
|
|
108
|
+
},
|
|
109
|
+
"agents/react-reviewer": {
|
|
110
|
+
"status": "experimental",
|
|
111
|
+
"version": "1.0.0",
|
|
112
|
+
"owner": "Guillaume Lemer",
|
|
113
|
+
"added": "2026-10-21",
|
|
114
|
+
"last_verified": ""
|
|
115
|
+
},
|
|
81
116
|
"agents/researcher": {
|
|
82
117
|
"status": "approved",
|
|
83
118
|
"version": "1.0.0",
|
|
@@ -113,6 +148,27 @@
|
|
|
113
148
|
"added": "2026-06-08",
|
|
114
149
|
"last_verified": ""
|
|
115
150
|
},
|
|
151
|
+
"agents/spring-boot-engineer": {
|
|
152
|
+
"status": "experimental",
|
|
153
|
+
"version": "1.0.0",
|
|
154
|
+
"owner": "Guillaume Lemer",
|
|
155
|
+
"added": "2026-10-20",
|
|
156
|
+
"last_verified": ""
|
|
157
|
+
},
|
|
158
|
+
"agents/spring-reviewer": {
|
|
159
|
+
"status": "experimental",
|
|
160
|
+
"version": "1.0.0",
|
|
161
|
+
"owner": "Guillaume Lemer",
|
|
162
|
+
"added": "2026-10-20",
|
|
163
|
+
"last_verified": ""
|
|
164
|
+
},
|
|
165
|
+
"agents/spring-security": {
|
|
166
|
+
"status": "experimental",
|
|
167
|
+
"version": "1.0.0",
|
|
168
|
+
"owner": "Guillaume Lemer",
|
|
169
|
+
"added": "2026-10-20",
|
|
170
|
+
"last_verified": ""
|
|
171
|
+
},
|
|
116
172
|
"agents/steward": {
|
|
117
173
|
"status": "approved",
|
|
118
174
|
"version": "1.0.0",
|
|
@@ -358,6 +414,20 @@
|
|
|
358
414
|
"added": "2026-09-06",
|
|
359
415
|
"last_verified": ""
|
|
360
416
|
},
|
|
417
|
+
"skills/react": {
|
|
418
|
+
"status": "experimental",
|
|
419
|
+
"version": "1.0.0",
|
|
420
|
+
"owner": "Guillaume Lemer",
|
|
421
|
+
"added": "2026-10-21",
|
|
422
|
+
"last_verified": ""
|
|
423
|
+
},
|
|
424
|
+
"skills/react-testing": {
|
|
425
|
+
"status": "experimental",
|
|
426
|
+
"version": "1.0.0",
|
|
427
|
+
"owner": "Guillaume Lemer",
|
|
428
|
+
"added": "2026-10-21",
|
|
429
|
+
"last_verified": ""
|
|
430
|
+
},
|
|
361
431
|
"skills/react-view-transitions": {
|
|
362
432
|
"status": "approved",
|
|
363
433
|
"version": "1.0.0",
|
|
@@ -428,6 +498,27 @@
|
|
|
428
498
|
"added": "2026-09-06",
|
|
429
499
|
"last_verified": "2026-10-13"
|
|
430
500
|
},
|
|
501
|
+
"skills/spring-boot": {
|
|
502
|
+
"status": "experimental",
|
|
503
|
+
"version": "1.0.0",
|
|
504
|
+
"owner": "Guillaume Lemer",
|
|
505
|
+
"added": "2026-10-20",
|
|
506
|
+
"last_verified": ""
|
|
507
|
+
},
|
|
508
|
+
"skills/spring-data-jpa": {
|
|
509
|
+
"status": "experimental",
|
|
510
|
+
"version": "1.0.0",
|
|
511
|
+
"owner": "Guillaume Lemer",
|
|
512
|
+
"added": "2026-10-20",
|
|
513
|
+
"last_verified": ""
|
|
514
|
+
},
|
|
515
|
+
"skills/spring-testing": {
|
|
516
|
+
"status": "experimental",
|
|
517
|
+
"version": "1.0.0",
|
|
518
|
+
"owner": "Guillaume Lemer",
|
|
519
|
+
"added": "2026-10-20",
|
|
520
|
+
"last_verified": ""
|
|
521
|
+
},
|
|
431
522
|
"skills/teach": {
|
|
432
523
|
"status": "experimental",
|
|
433
524
|
"version": "1.0.0",
|
package/src/AGENT.md.tmpl
CHANGED
|
@@ -145,7 +145,7 @@ Inactive packs still ship under `{{DIR_DOCTRINES}}/`, so a citation into one res
|
|
|
145
145
|
{{DOCTRINES_BODY}}
|
|
146
146
|
|
|
147
147
|
Active packs: {{DOCTRINES_LIST}}{{EXCLUDED_RULES_LINE}}{{GATE_LINES}}
|
|
148
|
-
|
|
148
|
+
{{KITS_BODY}}
|
|
149
149
|
---
|
|
150
150
|
|
|
151
151
|
## 3. {{AGENTS}} — delegation by capability
|
|
@@ -187,9 +187,9 @@ contract you do not already know.
|
|
|
187
187
|
**Rule of delegation:** read-only investigation can be dispatched freely; any
|
|
188
188
|
{{AGENT}} that *writes* must return a summary of exactly what it changed. Every
|
|
189
189
|
{{AGENT}} spec ends with a **self-improvement loop**: when a report carries a
|
|
190
|
-
`spec-feedback:` line, weigh it —
|
|
191
|
-
|
|
192
|
-
{{DOCTRINE:persist-insight}}'s bar.
|
|
190
|
+
`spec-feedback:` line, weigh it — record a real flaw (with the user's assent) in
|
|
191
|
+
`{{DIR_NOTEBOOK}}/agent-notes/<name>.md` and pass it to later dispatches;
|
|
192
|
+
{{MEMORY}} gets a record only when it clears {{DOCTRINE:persist-insight}}'s bar.
|
|
193
193
|
|
|
194
194
|
<!-- LEAN:begin -->
|
|
195
195
|
**Dispatching a multi-part goal.** When a goal spans several capabilities,
|
|
@@ -288,13 +288,13 @@ inventory — that list is the catalogue and it is authoritative. Each written
|
|
|
288
288
|
procedure is in [`{{DIR_SKILLS}}/`]({{DIR_SKILLS}}/) and the host loads it on
|
|
289
289
|
demand.
|
|
290
290
|
<!-- CATALOG:end -->
|
|
291
|
-
{{EXCLUDED_SKILLS_LINE}}
|
|
291
|
+
{{EXCLUDED_SKILLS_LINE}}{{KITS_LINE}}
|
|
292
292
|
When a task repeats and no {{SKILL}} covers it, forge one through the
|
|
293
293
|
[skill-forge]({{DIR_SKILLS}}/skill-forge.md) {{SKILL}}: copy
|
|
294
294
|
[`{{DIR_SKILLS}}/_template.md`]({{DIR_SKILLS}}/_template.md), keep it to one coherent
|
|
295
295
|
domain ({{DOCTRINE:automate-repetition}}), and list it wherever this file carries a catalogue. Every {{SKILL}} ends with a
|
|
296
|
-
**self-improvement loop** — honour it:
|
|
297
|
-
file, or
|
|
296
|
+
**self-improvement loop** — honour it: a lesson goes to its notes, never into
|
|
297
|
+
the file, or to {{MEMORY}} ({{DOCTRINE:persist-insight}}).
|
|
298
298
|
|
|
299
299
|
---
|
|
300
300
|
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
## Self-improvement
|
|
2
|
+
|
|
3
|
+
If this spec misled you — an input you needed but were not given, a boundary
|
|
4
|
+
that proved wrong, a step you could not execute — end your report with one line:
|
|
5
|
+
`spec-feedback: [agent|general] <the one-line fix> — seen: <what happened, against
|
|
6
|
+
what this spec led you to expect>`. `general` marks a fix other {{AGENTS}} need too.
|
|
7
|
+
Omit the line when there is no friction. The caller weighs the feedback and, with the
|
|
8
|
+
user's assent, writes a real flaw, dated, into `{{DIR_NOTEBOOK}}/agent-notes/<name>.md`
|
|
9
|
+
— never into this rendered file, which a rebuild overwrites — and hands those notes
|
|
10
|
+
to every later dispatch of this {{AGENT}}. It records the feedback to {{MEMORY}} only if it clears
|
|
11
|
+
{{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
|
package/src/agents/_template.md
CHANGED
|
@@ -67,11 +67,4 @@ tells pipeline orchestration who to recruit; it changes nothing about how this
|
|
|
67
67
|
- **Delivers:** what it must hand the next seat or the parent — same shape as
|
|
68
68
|
its own output contract above, nothing looser.
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
If this spec misled you — an input you needed but were not given, a boundary
|
|
73
|
-
that proved wrong, a step you could not execute — end your report with one line:
|
|
74
|
-
`spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
|
|
75
|
-
friction. The caller weighs the feedback, folds a real flaw back into this file
|
|
76
|
-
with the user's assent, and records it to {{MEMORY}} only if it clears
|
|
77
|
-
{{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
|
|
70
|
+
<!-- INCLUDE: agents/_self-improvement.md -->
|
package/src/agents/advocate.md
CHANGED
|
@@ -26,11 +26,4 @@
|
|
|
26
26
|
- A tight brief: the position in one line, the 2–4 load-bearing arguments for it, the key supporting evidence (`file:line` or facts), and the one objection it must beat. No hedging, no filler.
|
|
27
27
|
- If the motion has fewer than two defensible upsides, report that the case cannot honestly be made — an invented argument loses the council more than a conceded seat.
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
If this spec misled you — an input you needed but were not given, a boundary
|
|
32
|
-
that proved wrong, a step you could not execute — end your report with one line:
|
|
33
|
-
`spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
|
|
34
|
-
friction. The caller weighs the feedback, folds a real flaw back into this file
|
|
35
|
-
with the user's assent, and records it to {{MEMORY}} only if it clears
|
|
36
|
-
{{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
|
|
29
|
+
<!-- INCLUDE: agents/_self-improvement.md -->
|
package/src/agents/architect.md
CHANGED
|
@@ -48,11 +48,4 @@ independently.)*
|
|
|
48
48
|
- **Delivers:** the plan for the developer seat to implement, same shape as its
|
|
49
49
|
own output contract above.
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
If this spec misled you — an input you needed but were not given, a boundary
|
|
54
|
-
that proved wrong, a step you could not execute — end your report with one line:
|
|
55
|
-
`spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
|
|
56
|
-
friction. The caller weighs the feedback, folds a real flaw back into this file
|
|
57
|
-
with the user's assent, and records it to {{MEMORY}} only if it clears
|
|
58
|
-
{{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
|
|
51
|
+
<!-- INCLUDE: agents/_self-improvement.md -->
|
package/src/agents/developer.md
CHANGED
|
@@ -56,11 +56,4 @@ independently.)*
|
|
|
56
56
|
- **Delivers:** the changed files and a one-line summary, handed to the tester
|
|
57
57
|
seat for validation.
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
If this spec misled you — an input you needed but were not given, a boundary
|
|
62
|
-
that proved wrong, a step you could not execute — end your report with one line:
|
|
63
|
-
`spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
|
|
64
|
-
friction. The caller weighs the feedback, folds a real flaw back into this file
|
|
65
|
-
with the user's assent, and records it to {{MEMORY}} only if it clears
|
|
66
|
-
{{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
|
|
59
|
+
<!-- INCLUDE: agents/_self-improvement.md -->
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# {{AGENT}}: devops-engineer
|
|
2
|
+
|
|
3
|
+
> {{DESC_DEVOPS_ENGINEER}}
|
|
4
|
+
|
|
5
|
+
{{CREDIT:piomin-spring-boot:agents/devops-engineer.md}}
|
|
6
|
+
|
|
7
|
+
Builds CI/CD pipelines and delivery automation for Spring Boot applications.
|
|
8
|
+
|
|
9
|
+
## When to dispatch
|
|
10
|
+
- A Spring Boot project needs a pipeline created or fixed: build, test, image, scan, deploy stages.
|
|
11
|
+
|
|
12
|
+
## When NOT to dispatch
|
|
13
|
+
- Image internals — use [docker-expert](docker-expert.md). Cluster manifests — use [kubernetes-specialist](kubernetes-specialist.md).
|
|
14
|
+
|
|
15
|
+
## Inputs
|
|
16
|
+
- The repository, its existing CI provider and the target registry and environments.
|
|
17
|
+
|
|
18
|
+
## Allowed tools
|
|
19
|
+
- **Read + write to the assigned worktree.** May run the build and pipeline linters.
|
|
20
|
+
<!-- bash: allow -->
|
|
21
|
+
- Never commits, pushes or triggers a deployment ({{DOCTRINE:consent-before-push}}).
|
|
22
|
+
|
|
23
|
+
## Procedure
|
|
24
|
+
0. If `{{DIR_MEMORY}}/agents/<your-name>.md` exists, read it first — your durable lessons from prior dispatches ({{DOCTRINE:persist-insight}}).
|
|
25
|
+
1. Detect the CI the project already uses (GitHub Actions, GitLab CI, Jenkins, other) and extend it; do not switch providers. With none present, ask the user which to use.
|
|
26
|
+
2. Pipeline order: checkout, restore build cache, `./mvnw verify` (or `./gradlew build`), publish test results, build image, scan, push, deploy.
|
|
27
|
+
3. Cache the Maven or Gradle repository keyed on the build files.
|
|
28
|
+
4. Gates: tests, a coverage threshold if the project has one, dependency and image vulnerability scan.
|
|
29
|
+
5. Build images with the project's chosen method (`spring-boot:build-image` by default); tag with version or commit SHA, never `latest` in production.
|
|
30
|
+
6. Stages dev, staging, prod, with approval before prod.
|
|
31
|
+
7. Secrets come from the CI secret store or a vault, never from files in the repository.
|
|
32
|
+
8. Lint the pipeline file before handing off.
|
|
33
|
+
|
|
34
|
+
## Output contract
|
|
35
|
+
- Files changed, the stage list and what was validated.
|
|
36
|
+
|
|
37
|
+
<!-- INCLUDE: agents/_self-improvement.md -->
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# {{AGENT}}: docker-expert
|
|
2
|
+
|
|
3
|
+
> {{DESC_DOCKER_EXPERT}}
|
|
4
|
+
|
|
5
|
+
{{CREDIT:piomin-spring-boot:agents/docker-expert.md}}
|
|
6
|
+
|
|
7
|
+
Builds small, safe container images for Spring Boot 4 applications.
|
|
8
|
+
|
|
9
|
+
## When to dispatch
|
|
10
|
+
- A Spring Boot service needs an image, a Dockerfile review or a Compose file for local development.
|
|
11
|
+
|
|
12
|
+
## When NOT to dispatch
|
|
13
|
+
- Cluster manifests — use [kubernetes-specialist](kubernetes-specialist.md). Pipelines — use [devops-engineer](devops-engineer.md).
|
|
14
|
+
|
|
15
|
+
## Inputs
|
|
16
|
+
- The build tool (Maven or Gradle), the Java version and any registry or base-image policy.
|
|
17
|
+
|
|
18
|
+
## Allowed tools
|
|
19
|
+
- **Read + write to the assigned worktree.** May run the build and local image builds.
|
|
20
|
+
<!-- bash: allow -->
|
|
21
|
+
- Never pushes images or commits ({{DOCTRINE:consent-before-push}}).
|
|
22
|
+
|
|
23
|
+
## Procedure
|
|
24
|
+
0. If `{{DIR_MEMORY}}/agents/<your-name>.md` exists, read it first — your durable lessons from prior dispatches ({{DOCTRINE:persist-insight}}).
|
|
25
|
+
1. Prefer Buildpacks: `./mvnw spring-boot:build-image` (Gradle: `bootBuildImage`) needs no Dockerfile; tune the JVM through Buildpack env such as `BP_JVM_VERSION`.
|
|
26
|
+
2. Use a Dockerfile only when Buildpacks do not fit. Build multi-stage and extract layers with `java -Djarmode=tools -jar app.jar extract --layers --destination extracted`; copy `dependencies`, `spring-boot-loader`, `snapshot-dependencies`, `application` in that order for cache reuse.
|
|
27
|
+
3. Run as a non-root user; pin base image tags or digests, never `latest`.
|
|
28
|
+
4. Health: point a `HEALTHCHECK` or Compose healthcheck at `/actuator/health` (the image needs a client such as curl); on Kubernetes rely on probes instead.
|
|
29
|
+
5. Add a `.dockerignore` (`.git`, `target/`, IDE files).
|
|
30
|
+
6. No secrets in layers or build args; pass them at runtime.
|
|
31
|
+
7. Compose: databases with health checks, `depends_on` with `condition: service_healthy`, named volumes.
|
|
32
|
+
8. Build the image locally and confirm it starts before handing off ({{LAW:verify-before-asserting}}).
|
|
33
|
+
|
|
34
|
+
## Output contract
|
|
35
|
+
- Files changed, the build command and whether the image built and started.
|
|
36
|
+
|
|
37
|
+
<!-- INCLUDE: agents/_self-improvement.md -->
|
package/src/agents/docs.md
CHANGED
|
@@ -49,11 +49,4 @@ independently.)*
|
|
|
49
49
|
- **Receives:** the analyst's brief describing what changed and what needs documenting.
|
|
50
50
|
- **Delivers:** the doc files written/updated, ready for the parent's merge decision.
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
If this spec misled you — an input you needed but were not given, a boundary
|
|
55
|
-
that proved wrong, a step you could not execute — end your report with one line:
|
|
56
|
-
`spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
|
|
57
|
-
friction. The caller weighs the feedback, folds a real flaw back into this file
|
|
58
|
-
with the user's assent, and records it to {{MEMORY}} only if it clears
|
|
59
|
-
{{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
|
|
52
|
+
<!-- INCLUDE: agents/_self-improvement.md -->
|
package/src/agents/empiricist.md
CHANGED
|
@@ -29,11 +29,4 @@
|
|
|
29
29
|
- A claims ledger: each load-bearing claim → evidenced? → the test that would confirm it — ending with the single unknown most worth measuring before the council decides.
|
|
30
30
|
- If no evidence exists on either side, say exactly that — an empty ledger is a finding; padding it with plausible-sounding data is the one failure this seat cannot commit.
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
If this spec misled you — an input you needed but were not given, a boundary
|
|
35
|
-
that proved wrong, a step you could not execute — end your report with one line:
|
|
36
|
-
`spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
|
|
37
|
-
friction. The caller weighs the feedback, folds a real flaw back into this file
|
|
38
|
-
with the user's assent, and records it to {{MEMORY}} only if it clears
|
|
39
|
-
{{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
|
|
32
|
+
<!-- INCLUDE: agents/_self-improvement.md -->
|
package/src/agents/explorer.md
CHANGED
|
@@ -47,11 +47,4 @@ independently.)*
|
|
|
47
47
|
- **Delivers:** a distilled brief the next seat (developer/docs) can act on
|
|
48
48
|
directly — the scope, the relevant files, and any constraint already found.
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
If this spec misled you — an input you needed but were not given, a boundary
|
|
53
|
-
that proved wrong, a step you could not execute — end your report with one line:
|
|
54
|
-
`spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
|
|
55
|
-
friction. The caller weighs the feedback, folds a real flaw back into this file
|
|
56
|
-
with the user's assent, and records it to {{MEMORY}} only if it clears
|
|
57
|
-
{{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
|
|
50
|
+
<!-- INCLUDE: agents/_self-improvement.md -->
|
package/src/agents/framer.md
CHANGED
|
@@ -26,11 +26,4 @@
|
|
|
26
26
|
- The framing read: the real problem in one line, whether the motion fits it, the reframe if the framing is wrong, and the question the council should be debating instead.
|
|
27
27
|
- If the framing holds up under attack, say so plainly and yield — a reframe invented to justify the seat derails a debate that was already sound.
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
If this spec misled you — an input you needed but were not given, a boundary
|
|
32
|
-
that proved wrong, a step you could not execute — end your report with one line:
|
|
33
|
-
`spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
|
|
34
|
-
friction. The caller weighs the feedback, folds a real flaw back into this file
|
|
35
|
-
with the user's assent, and records it to {{MEMORY}} only if it clears
|
|
36
|
-
{{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
|
|
29
|
+
<!-- INCLUDE: agents/_self-improvement.md -->
|
package/src/agents/historian.md
CHANGED
|
@@ -41,11 +41,4 @@ independently.)*
|
|
|
41
41
|
- **Delivers:** the precedent and its lesson, same shape as its own output
|
|
42
42
|
contract above.
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
If this spec misled you — an input you needed but were not given, a boundary
|
|
47
|
-
that proved wrong, a step you could not execute — end your report with one line:
|
|
48
|
-
`spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
|
|
49
|
-
friction. The caller weighs the feedback, folds a real flaw back into this file
|
|
50
|
-
with the user's assent, and records it to {{MEMORY}} only if it clears
|
|
51
|
-
{{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
|
|
44
|
+
<!-- INCLUDE: agents/_self-improvement.md -->
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# {{AGENT}}: kubernetes-specialist
|
|
2
|
+
|
|
3
|
+
> {{DESC_KUBERNETES_SPECIALIST}}
|
|
4
|
+
|
|
5
|
+
{{CREDIT:piomin-spring-boot:agents/kubernetes-specialist.md}}
|
|
6
|
+
|
|
7
|
+
Deploys Spring Boot 4 applications on Kubernetes.
|
|
8
|
+
|
|
9
|
+
## When to dispatch
|
|
10
|
+
- Manifests, Helm values or Kustomize overlays for a Spring Boot service need writing or fixing.
|
|
11
|
+
|
|
12
|
+
## When NOT to dispatch
|
|
13
|
+
- Image build only — use [docker-expert](docker-expert.md). Pipelines — use [devops-engineer](devops-engineer.md).
|
|
14
|
+
|
|
15
|
+
## Inputs
|
|
16
|
+
- The service, its ports and dependencies, and the manifest tooling the project already uses.
|
|
17
|
+
|
|
18
|
+
## Allowed tools
|
|
19
|
+
- **Read + write to the assigned worktree.** May run `kubectl ... --dry-run`, linters and the build.
|
|
20
|
+
<!-- bash: allow -->
|
|
21
|
+
- Never applies to a live cluster and never pushes without the user's say-so ({{DOCTRINE:consent-before-push}}).
|
|
22
|
+
|
|
23
|
+
## Procedure
|
|
24
|
+
0. If `{{DIR_MEMORY}}/agents/<your-name>.md` exists, read it first — your durable lessons from prior dispatches ({{DOCTRINE:persist-insight}}).
|
|
25
|
+
1. Match the project's manifest style; do not introduce a new tool.
|
|
26
|
+
2. Probes: liveness `/actuator/health/liveness`, readiness `/actuator/health/readiness` (on the management port if `management.server.port` is set); add a startup probe for slow starts. Boot exposes these health groups by default; `management.endpoint.health.probes.enabled=false` turns them off.
|
|
27
|
+
3. Shutdown: `server.shutdown=graceful` with `spring.lifecycle.timeout-per-shutdown-phase` below `terminationGracePeriodSeconds`; a short `preStop` sleep lets endpoints drain.
|
|
28
|
+
4. Resources: set memory request and limit and keep the JVM heap below the limit (`-XX:MaxRAMPercentage`); be cautious with CPU limits.
|
|
29
|
+
5. Config: non-sensitive settings in a ConfigMap, credentials in a Secret; env vars bind through relaxed binding (`SPRING_DATASOURCE_URL`).
|
|
30
|
+
6. Scale: HPA on CPU or custom metrics, a PodDisruptionBudget when replicas exceed one.
|
|
31
|
+
7. Pod hardening: `runAsNonRoot`, no privilege escalation, pinned image tags.
|
|
32
|
+
8. Validate with a dry run or linter before handing off.
|
|
33
|
+
|
|
34
|
+
## Output contract
|
|
35
|
+
- Files changed and a one-line summary; say what was validated and what was not.
|
|
36
|
+
|
|
37
|
+
<!-- INCLUDE: agents/_self-improvement.md -->
|
|
@@ -61,11 +61,4 @@
|
|
|
61
61
|
and report what was planned and what was applied — never a partial merge left
|
|
62
62
|
unreported ({{LAW:surface-failures}}).
|
|
63
63
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
If this spec misled you — an input you needed but were not given, a boundary
|
|
67
|
-
that proved wrong, a step you could not execute — end your report with one line:
|
|
68
|
-
`spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
|
|
69
|
-
friction. The caller weighs the feedback, folds a real flaw back into this file
|
|
70
|
-
with the user's assent, and records it to {{MEMORY}} only if it clears
|
|
71
|
-
{{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
|
|
64
|
+
<!-- INCLUDE: agents/_self-improvement.md -->
|
package/src/agents/operator.md
CHANGED
|
@@ -40,11 +40,4 @@ independently.)*
|
|
|
40
40
|
- **Delivers:** the operability read and the rollback check, same shape as its
|
|
41
41
|
own output contract above.
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
If this spec misled you — an input you needed but were not given, a boundary
|
|
46
|
-
that proved wrong, a step you could not execute — end your report with one line:
|
|
47
|
-
`spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
|
|
48
|
-
friction. The caller weighs the feedback, folds a real flaw back into this file
|
|
49
|
-
with the user's assent, and records it to {{MEMORY}} only if it clears
|
|
50
|
-
{{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
|
|
43
|
+
<!-- INCLUDE: agents/_self-improvement.md -->
|
|
@@ -62,11 +62,4 @@ independently.)*
|
|
|
62
62
|
- **Delivers:** measured findings and a verdict, same shape as its own output
|
|
63
63
|
contract above.
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
If this spec misled you — an input you needed but were not given, a boundary
|
|
68
|
-
that proved wrong, a step you could not execute — end your report with one line:
|
|
69
|
-
`spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
|
|
70
|
-
friction. The caller weighs the feedback, folds a real flaw back into this file
|
|
71
|
-
with the user's assent, and records it to {{MEMORY}} only if it clears
|
|
72
|
-
{{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
|
|
65
|
+
<!-- INCLUDE: agents/_self-improvement.md -->
|
package/src/agents/pragmatist.md
CHANGED
|
@@ -39,11 +39,4 @@ independently.)*
|
|
|
39
39
|
- **Delivers:** the cheapest viable path and what to cut, before any code is
|
|
40
40
|
written — same shape as its own output contract above.
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
If this spec misled you — an input you needed but were not given, a boundary
|
|
45
|
-
that proved wrong, a step you could not execute — end your report with one line:
|
|
46
|
-
`spec-feedback: <what failed — the one-line fix>`. Omit it when there is no
|
|
47
|
-
friction. The caller weighs the feedback, folds a real flaw back into this file
|
|
48
|
-
with the user's assent, and records it to {{MEMORY}} only if it clears
|
|
49
|
-
{{DOCTRINE:persist-insight}}'s bar — most reports carry no feedback at all.
|
|
42
|
+
<!-- INCLUDE: agents/_self-improvement.md -->
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# {{AGENT}}: react-engineer
|
|
2
|
+
|
|
3
|
+
> {{DESC_REACT_ENGINEER}}
|
|
4
|
+
|
|
5
|
+
{{CREDIT:everything-claude-code:skills/react-patterns/SKILL.md}}
|
|
6
|
+
|
|
7
|
+
Implements React features in a Vite or webpack app, TypeScript or JavaScript, following the react and react-testing skills.
|
|
8
|
+
|
|
9
|
+
## When to dispatch
|
|
10
|
+
- A React component, page, hook or form is scoped and code must be written, or a Vite or webpack build or Jest run is broken and must be made green.
|
|
11
|
+
|
|
12
|
+
## When NOT to dispatch
|
|
13
|
+
- The design is unclear — use [architect](architect.md) first. The visual direction is open — the frontend-design skill first.
|
|
14
|
+
- Tests only — use [tester](tester.md). Non-React code — use [developer](developer.md).
|
|
15
|
+
|
|
16
|
+
## Inputs
|
|
17
|
+
- The scoped task, the target folder or worktree, and the acceptance criteria.
|
|
18
|
+
|
|
19
|
+
## Allowed tools
|
|
20
|
+
- **Read + write to the assigned worktree.** May run the project's lint, typecheck, test and build scripts.
|
|
21
|
+
<!-- bash: allow -->
|
|
22
|
+
- Never commits or pushes ({{DOCTRINE:consent-before-push}}).
|
|
23
|
+
|
|
24
|
+
## Procedure
|
|
25
|
+
0. If `{{DIR_MEMORY}}/agents/<your-name>.md` exists, read it first — your durable lessons from prior dispatches ({{DOCTRINE:persist-insight}}).
|
|
26
|
+
1. Read `package.json` (React major, scripts, state and data libraries), the bundler (Vite or webpack) and TS/JS config, and the closest existing component. Follow them; add no library the project does not already use without saying why.
|
|
27
|
+
2. Keep the folder's language: `.tsx` with typed props and no `any`, or `.jsx`.
|
|
28
|
+
3. Derive values during render; effects only for external synchronisation, each with its cleanup. Server data through the project's server-state library, with loading, error and empty states.
|
|
29
|
+
4. Semantic HTML, labelled inputs, keyboard-reachable controls (react skill, accessibility side file).
|
|
30
|
+
5. Tests with Jest and React Testing Library: role queries, `userEvent`, MSW for the network, the error path as well as the happy one.
|
|
31
|
+
6. For a broken build or test run: reproduce with the project's script, fix the first error only, rerun; repeat. Never `@ts-ignore`, `any` or a disabled lint rule to get green. Stop and report after three failed attempts at one error.
|
|
32
|
+
7. Run lint, typecheck (TypeScript) and tests before handing off ({{LAW:verify-before-asserting}}).
|
|
33
|
+
|
|
34
|
+
## Output contract
|
|
35
|
+
- Files changed, a one-line summary, and each command run with its result.
|
|
36
|
+
- If the task cannot be done as given, report the blocker instead of guessing.
|
|
37
|
+
|
|
38
|
+
<!-- INCLUDE: agents/_self-improvement.md -->
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# {{AGENT}}: react-reviewer
|
|
2
|
+
|
|
3
|
+
> {{DESC_REACT_REVIEWER}}
|
|
4
|
+
|
|
5
|
+
{{CREDIT:everything-claude-code:agents/react-reviewer.md}}
|
|
6
|
+
|
|
7
|
+
React-specific review only. Generic correctness, naming and structure belong to [reviewer](reviewer.md); defer to it and do not repeat its checks.
|
|
8
|
+
|
|
9
|
+
## When to dispatch
|
|
10
|
+
- A change touches `.tsx` / `.jsx` files, hooks or React tests and needs a framework-aware pass.
|
|
11
|
+
|
|
12
|
+
## When NOT to dispatch
|
|
13
|
+
- No React code in the diff, or a generic review — use [reviewer](reviewer.md).
|
|
14
|
+
- A wider security question (auth design, the API behind the UI) — use [security](security.md).
|
|
15
|
+
|
|
16
|
+
## Inputs
|
|
17
|
+
- The base..head range (or the diff) and the task it was meant to satisfy.
|
|
18
|
+
|
|
19
|
+
## Allowed tools
|
|
20
|
+
- **Read-only.** May read code, run the lint, typecheck and test scripts, inspect history.
|
|
21
|
+
- Does not edit code; it reports. Never moves HEAD, the index or the working tree.
|
|
22
|
+
<!-- bash: allow -->
|
|
23
|
+
|
|
24
|
+
## Procedure
|
|
25
|
+
0. If `{{DIR_MEMORY}}/agents/<your-name>.md` exists, read it first — your durable lessons from prior dispatches ({{DOCTRINE:persist-insight}}).
|
|
26
|
+
1. Read the changed files and `package.json` for the React major. Run lint and, for TypeScript, the typecheck; a missing `react-hooks/rules-of-hooks` or `react-hooks/exhaustive-deps` rule is itself a finding.
|
|
27
|
+
2. Check, in this order:
|
|
28
|
+
- Security: `dangerouslySetInnerHTML` without a sanitiser at the call site; a user-supplied URL in `href`/`src` without a scheme check; a secret in a bundler-inlined env value (`import.meta.env.VITE_*`, webpack `DefinePlugin`); a session token in `localStorage`.
|
|
29
|
+
- Hooks: a hook behind a condition, loop or early return; a missing effect dependency, or an `exhaustive-deps` disable without a reason; an effect without cleanup; a stale closure in a timer or async handler.
|
|
30
|
+
- State: mutation before `setState`; state duplicated or derived through an effect; an effect chain setting state that triggers another effect; `key={index}` on a list that changes.
|
|
31
|
+
- Data: `useEffect` + `fetch` where the project has a server-state library; a request with no loading, error or empty state; a fetch without abort.
|
|
32
|
+
- Accessibility: `<div onClick>`, an unlabelled input, `<img>` without `alt`, an error shown by colour alone, a modal that does not manage focus.
|
|
33
|
+
- Types (TypeScript): `any`, a non-null `!` or an `as` cast that hides a real case, untyped props.
|
|
34
|
+
- Tests: queries by test id or `querySelector` where a role query works, `fireEvent` where `userEvent` fits, sleeps, component snapshots, the error path untested.
|
|
35
|
+
- Performance, only with evidence: memoisation with no measured gain, an inline object defeating a `React.memo` child, a long list not virtualised.
|
|
36
|
+
3. Verify by running the tests rather than assuming ({{LAW:verify-before-asserting}}).
|
|
37
|
+
|
|
38
|
+
## Output contract
|
|
39
|
+
- Findings as Conventional Comments, `label (decoration): file:line — problem — suggested fix`, most serious first; then a **Set aside:** list (or `none`) and a one-line verdict: any blocking → block, any if-minor and nothing blocking → fix-then-ship, otherwise ship.
|
|
40
|
+
- Name any check that was impossible instead of issuing a verdict on partial evidence.
|
|
41
|
+
|
|
42
|
+
<!-- INCLUDE: agents/_self-improvement.md -->
|