@ersbeth/codelife 0.0.0-stage → 0.11.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.
Files changed (214) hide show
  1. package/.claude-plugin/plugin.json +19 -0
  2. package/LICENSE +21 -0
  3. package/README.md +65 -2
  4. package/agents/evaluate.md +97 -0
  5. package/agents/ground.md +49 -0
  6. package/agents/implementer.md +49 -0
  7. package/agents/judge.md +128 -0
  8. package/agents/planner.md +45 -0
  9. package/agents/prerequisites.md +62 -0
  10. package/agents/reader.md +40 -0
  11. package/agents/reproduce.md +65 -0
  12. package/bin/codelife +4 -0
  13. package/package.json +38 -4
  14. package/presets/tsconfig.json +14 -0
  15. package/presets/vite.config.d.mts +3 -0
  16. package/presets/vite.config.mjs +49 -0
  17. package/scripts/audit/cadence.mjs +24 -0
  18. package/scripts/audit/close.mjs +57 -0
  19. package/scripts/audit/file.mjs +70 -0
  20. package/scripts/audit/fold.mjs +48 -0
  21. package/scripts/audit/lib.mjs +93 -0
  22. package/scripts/audit/prepare.mjs +180 -0
  23. package/scripts/audit/table.mjs +65 -0
  24. package/scripts/brainstorm/decided.mjs +6 -0
  25. package/scripts/brainstorm/lib.mjs +33 -0
  26. package/scripts/brainstorm/named.mjs +9 -0
  27. package/scripts/changelog.mjs +100 -0
  28. package/scripts/check-tag.mjs +19 -0
  29. package/scripts/checks.mjs +53 -0
  30. package/scripts/codelife.mjs +42 -0
  31. package/scripts/commit-msg.mjs +43 -0
  32. package/scripts/contract.mjs +179 -0
  33. package/scripts/former-form.mjs +170 -0
  34. package/scripts/git/branches.mjs +6 -0
  35. package/scripts/git/commit.mjs +40 -0
  36. package/scripts/git/diff.mjs +17 -0
  37. package/scripts/git/diff_lines.mjs +5 -0
  38. package/scripts/git/held.mjs +53 -0
  39. package/scripts/git/is_ancestor.mjs +28 -0
  40. package/scripts/git/lib.mjs +20 -0
  41. package/scripts/git/log_since.mjs +27 -0
  42. package/scripts/git/parent.mjs +51 -0
  43. package/scripts/git/show.mjs +4 -0
  44. package/scripts/git/status.mjs +25 -0
  45. package/scripts/git/submodules.mjs +5 -0
  46. package/scripts/init.mjs +21 -0
  47. package/scripts/install.mjs +32 -0
  48. package/scripts/lenses/A11Y.md +91 -0
  49. package/scripts/lenses/ARCH.md +90 -0
  50. package/scripts/lenses/BUG.md +52 -0
  51. package/scripts/lenses/BUILD.md +40 -0
  52. package/scripts/lenses/COMPAT.md +67 -0
  53. package/scripts/lenses/CONF.md +49 -0
  54. package/scripts/lenses/DEPS.md +43 -0
  55. package/scripts/lenses/DOC.md +73 -0
  56. package/scripts/lenses/FAIL.md +57 -0
  57. package/scripts/lenses/GOV.md +56 -0
  58. package/scripts/lenses/GUARD.md +47 -0
  59. package/scripts/lenses/INTENT.md +52 -0
  60. package/scripts/lenses/LEAN.md +49 -0
  61. package/scripts/lenses/LINES.md +48 -0
  62. package/scripts/lenses/PERF.md +61 -0
  63. package/scripts/lenses/PKG.md +58 -0
  64. package/scripts/lenses/SEC.md +49 -0
  65. package/scripts/lenses/STANDARDS.md +62 -0
  66. package/scripts/lenses/TYPE.md +56 -0
  67. package/scripts/lenses/VERIF.md +81 -0
  68. package/scripts/link.mjs +40 -0
  69. package/scripts/methods/cause.md +21 -0
  70. package/scripts/methods/comments.md +157 -0
  71. package/scripts/methods/description.md +67 -0
  72. package/scripts/methods/message.md +24 -0
  73. package/scripts/methods/red-green.md +28 -0
  74. package/scripts/methods/refusal.md +22 -0
  75. package/scripts/mr/open.mjs +219 -0
  76. package/scripts/node-floor.mjs +19 -0
  77. package/scripts/onboard/prep.mjs +93 -0
  78. package/scripts/overview/codelife-line.mjs +33 -0
  79. package/scripts/overview/next.mjs +76 -0
  80. package/scripts/overview/overview.mjs +308 -0
  81. package/scripts/package-manager.mjs +20 -0
  82. package/scripts/port/item.mjs +94 -0
  83. package/scripts/port/lib.mjs +194 -0
  84. package/scripts/port/prep.mjs +33 -0
  85. package/scripts/port/version.mjs +50 -0
  86. package/scripts/pre-commit.mjs +43 -0
  87. package/scripts/pre-push.mjs +53 -0
  88. package/scripts/prepare-lib.mjs +81 -0
  89. package/scripts/read-roadmap/lib.mjs +116 -0
  90. package/scripts/read-roadmap/moved.mjs +70 -0
  91. package/scripts/read-roadmap/range.mjs +15 -0
  92. package/scripts/release/cut.mjs +120 -0
  93. package/scripts/release/entry.mjs +52 -0
  94. package/scripts/release/lib.mjs +136 -0
  95. package/scripts/release/prep.mjs +58 -0
  96. package/scripts/review-mr/prepare.mjs +163 -0
  97. package/scripts/roadmap/assemble.mjs +269 -0
  98. package/scripts/roadmap/cut.mjs +88 -0
  99. package/scripts/roadmap/prepare.mjs +249 -0
  100. package/scripts/roadmap/roadmap.md +30 -0
  101. package/scripts/roadmap/write.mjs +53 -0
  102. package/scripts/search.mjs +29 -0
  103. package/scripts/setup/contract.mjs +25 -0
  104. package/scripts/setup/item.mjs +166 -0
  105. package/scripts/setup/lib.mjs +205 -0
  106. package/scripts/setup/prep.mjs +106 -0
  107. package/scripts/spec-form.mjs +444 -0
  108. package/scripts/spec.mjs +56 -0
  109. package/scripts/tags.mjs +27 -0
  110. package/scripts/target/target-app.md +134 -0
  111. package/scripts/target/target-base.md +127 -0
  112. package/scripts/target/target-lib.md +143 -0
  113. package/scripts/target/templates/audit/README.md +21 -0
  114. package/scripts/target/templates/characterisation/bundle.test.ts +43 -0
  115. package/scripts/target/templates/characterisation/declarations.test.ts +44 -0
  116. package/scripts/target/templates/characterisation/entries.ts +50 -0
  117. package/scripts/target/templates/characterisation/examples.test.ts +18 -0
  118. package/scripts/target/templates/characterisation/import.test.ts +22 -0
  119. package/scripts/target/templates/characterisation/surface.test.ts +68 -0
  120. package/scripts/target/templates/cliff.toml +61 -0
  121. package/scripts/target/templates/githooks/commit-msg +9 -0
  122. package/scripts/target/templates/githooks/pre-commit +9 -0
  123. package/scripts/target/templates/githooks/pre-push +9 -0
  124. package/scripts/target/templates/playground/index.html +11 -0
  125. package/scripts/target/templates/playground/main.ts +9 -0
  126. package/scripts/target/templates/spec/README.md +35 -0
  127. package/scripts/target/templates/spec/capability.md +36 -0
  128. package/scripts/target/templates/spec/glossary.md +5 -0
  129. package/scripts/target/templates/spec/journey.md +29 -0
  130. package/scripts/target/templates/spec/principles.md +15 -0
  131. package/scripts/target/templates/spec/users.md +15 -0
  132. package/scripts/target/templates/tsconfig.json +9 -0
  133. package/scripts/target/templates/vite.config.ts +4 -0
  134. package/scripts/text.mjs +6 -0
  135. package/scripts/tracker/account.mjs +5 -0
  136. package/scripts/tracker/auth.mjs +9 -0
  137. package/scripts/tracker/cli.version.mjs +5 -0
  138. package/scripts/tracker/close.mjs +20 -0
  139. package/scripts/tracker/create.mjs +47 -0
  140. package/scripts/tracker/issue.section.mjs +25 -0
  141. package/scripts/tracker/issue.update.mjs +13 -0
  142. package/scripts/tracker/issue.view.mjs +16 -0
  143. package/scripts/tracker/lib.mjs +130 -0
  144. package/scripts/tracker/list.mjs +14 -0
  145. package/scripts/tracker/list.whole.mjs +20 -0
  146. package/scripts/tracker/lot.row.mjs +42 -0
  147. package/scripts/tracker/mr.checkout_command.mjs +5 -0
  148. package/scripts/tracker/mr.comments.mjs +50 -0
  149. package/scripts/tracker/mr.create.mjs +12 -0
  150. package/scripts/tracker/mr.description.mjs +8 -0
  151. package/scripts/tracker/mr.fetch_head.mjs +5 -0
  152. package/scripts/tracker/mr.find_for_branch.mjs +9 -0
  153. package/scripts/tracker/mr.post.mjs +40 -0
  154. package/scripts/tracker/mr.update_description.mjs +8 -0
  155. package/scripts/tracker/mr.verdict.mjs +34 -0
  156. package/scripts/tracker/mr.view.mjs +20 -0
  157. package/scripts/tracker/none.mjs +79 -0
  158. package/scripts/tracker/note.mjs +12 -0
  159. package/scripts/tracker/reopen.mjs +8 -0
  160. package/scripts/tracker/search.mjs +8 -0
  161. package/scripts/tracker/search_id.mjs +18 -0
  162. package/scripts/tracker/templates/bug.md +35 -0
  163. package/scripts/tracker/templates/feature.md +40 -0
  164. package/scripts/tracker/templates/lot.md +46 -0
  165. package/scripts/tracker/title.join.mjs +6 -0
  166. package/scripts/tracker/title.leave.mjs +7 -0
  167. package/scripts/tracker/title.lot_of.mjs +8 -0
  168. package/scripts/tracker/title.search_id_filter.mjs +17 -0
  169. package/scripts/tracker/title.sentence_of.mjs +5 -0
  170. package/scripts/tracker/view.mjs +25 -0
  171. package/scripts/verbs.mjs +579 -0
  172. package/scripts/verify/BUILD.mjs +33 -0
  173. package/scripts/verify/DEPS.mjs +15 -0
  174. package/scripts/verify/GOV.mjs +34 -0
  175. package/scripts/verify/GUARD.mjs +34 -0
  176. package/scripts/verify/LINES.mjs +22 -0
  177. package/scripts/verify/PKG.mjs +56 -0
  178. package/scripts/verify/TYPE.mjs +34 -0
  179. package/scripts/verify/cut.mjs +73 -0
  180. package/scripts/verify/history.mjs +32 -0
  181. package/scripts/verify/lib.mjs +129 -0
  182. package/scripts/verify/report.mjs +104 -0
  183. package/scripts/verify/timing.mjs +19 -0
  184. package/scripts/verify.mjs +29 -0
  185. package/scripts/work/branch.mjs +81 -0
  186. package/scripts/work/close.mjs +74 -0
  187. package/scripts/work/member.mjs +73 -0
  188. package/scripts/work/prepare.mjs +116 -0
  189. package/scripts/work/reopen.mjs +40 -0
  190. package/scripts/work-feedback/prepare.mjs +96 -0
  191. package/skills/audit/SKILL.md +110 -0
  192. package/skills/audit/templates/index.md +36 -0
  193. package/skills/audit/templates/lens.md +44 -0
  194. package/skills/brainstorm/SKILL.md +144 -0
  195. package/skills/brainstorm/references/exit.md +57 -0
  196. package/skills/brainstorm/templates/note.md +79 -0
  197. package/skills/commit/SKILL.md +68 -0
  198. package/skills/mr/SKILL.md +82 -0
  199. package/skills/new-issue/SKILL.md +87 -0
  200. package/skills/onboard/SKILL.md +103 -0
  201. package/skills/onboard/templates/CLAUDE.md +31 -0
  202. package/skills/onboard/templates/CONTRIBUTING.md +34 -0
  203. package/skills/onboard/templates/README.md +30 -0
  204. package/skills/onboard/templates/SKILL.md +24 -0
  205. package/skills/onboard/templates/package-CLAUDE.md +15 -0
  206. package/skills/overview/SKILL.md +59 -0
  207. package/skills/port-toolchain/SKILL.md +127 -0
  208. package/skills/release/SKILL.md +78 -0
  209. package/skills/review-mr/SKILL.md +106 -0
  210. package/skills/review-mr/templates/pass.md +29 -0
  211. package/skills/roadmap/SKILL.md +137 -0
  212. package/skills/setup/SKILL.md +112 -0
  213. package/skills/work/SKILL.md +139 -0
  214. package/skills/work-feedback/SKILL.md +113 -0
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "codelife",
3
+ "description": "Intentional skills for the whole code lifecycle: port a repository, file and work issues, review merge requests, audit, design.",
4
+ "author": {
5
+ "name": "Elisabeth Rousset"
6
+ },
7
+ "license": "MIT",
8
+ "mcpServers": {
9
+ "playwright": {
10
+ "command": "npx",
11
+ "args": [
12
+ "-y",
13
+ "@playwright/mcp@0.0.79",
14
+ "--secrets",
15
+ "${CLAUDE_PROJECT_DIR}/.claude/codelife.secrets.env"
16
+ ]
17
+ }
18
+ }
19
+ }
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Elisabeth Rousset
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 CHANGED
@@ -1,3 +1,66 @@
1
- # Temporary Holding Version
1
+ # codelife
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ A [Claude Code](https://code.claude.com) plugin that equips a repository for its whole code
4
+ lifecycle, one deliberate skill at a time:
5
+
6
+ | Skill | What it does |
7
+ |---|---|
8
+ | `/setup` | Brings a repository to the state every skill rests on: writes its contract (`.claude/codelife.md` — kind, tracker, guards, generated artefacts, the version file), connects this machine to the repository's tracker host, and transforms the repository one commit per item — the labels and issue templates, `develop`, the `verify:*` and `test:*` scripts, the git hooks, `docs/audit/`, `docs/brainstorm/`, `docs/spec/`, `CHANGELOG.md` — under every kind, its scripts mapped from what the repository already runs. Resumable by inspection. |
9
+ | `/port-toolchain [item]` | Brings a library's or an application's toolchain to the plugin's target, one commit per item — pnpm workspace, Vitest, non-regression tests, Vite+, TypeScript, Oxlint. An item you defer is filed and the run goes on; the close names each item left with the issue carrying its reason. Resumable by inspection. |
10
+ | `/onboard [document…]` | Creates or updates the documents a newcomer needs to arrive — `README.md`, `CONTRIBUTING.md`, `CLAUDE.md`, per-package briefs, a library's consumer `SKILL.md` — the code read first, every change proposed passage by passage, and a whole document written only when it is absent. |
11
+ | `/commit` | Groups the working tree's changes by intention and proposes Conventional Commits — files and messages — that you approve before anything is written. |
12
+ | `/mr` | Opens the merge request of work committed by hand, or updates the one the branch has, with a description written from the linked issues, the commits and the diff. |
13
+ | `/audit` | Evaluates the whole tree at a commit through fixed lenses; produces a frozen report, one tracker issue per finding, and one umbrella issue per remediation lot. |
14
+ | `/review-mr <n>` | Reviews the diff of a merge request with Claude Code's `/code-review` and a reader against the specification and the plan; one numbered comment a pass for what the MR introduces, issues for pre-existing debt, and the forge's own verdict you confirm before it is sent — another person's, since yours was reviewed before it opened. |
15
+ | `/new-issue [subject]` | Files one issue — from a short subject or from the conclusion of the conversation — after checking for duplicates; stops on a `wontfix` rather than re-litigating it. |
16
+ | `/roadmap` | Files the lots of what the specification changed since the roadmap's mark, groups the tracker's orphan issues into lots, and proposes a closure only on evidence. |
17
+ | `/work <n>` | Works a lot's members in the umbrella's order, or one lone issue, each planned, implemented and reviewed by fresh agents, ending at the merge request. |
18
+ | `/work-feedback <n>` | Answers the review of your own merge request once — one table you confirm, one commit per cause by a fresh agent, each fix proved, and one answer citing pushed hashes. |
19
+ | `/brainstorm <topic>` | Thinks a topic through — options rejected and why, the decisions — then writes them into the specification, `docs/spec/`. It files nothing: `/roadmap` does, when you run it. |
20
+ | `/release` | Version bump, changelog, verification, release commit, annotated tag, release entry, hand-off to the pipeline — driven by the contract. |
21
+ | `/overview` | Read-only: where the repository stands — contract, last audit, open issues, pending merge requests, what is stale, what to run next. |
22
+
23
+ Skills are **intentional**: one that Claude started rather than you says so in its opening brief
24
+ and stops there for your go-ahead. What a run does without judging is becoming a verb of the
25
+ `codelife` command line, as each journey's lot rewrites its brief, and a guard holds every verb a
26
+ brief names to one the command line has. The skills in the menu ask you every choice that matters.
27
+ Every skill opens with a brief of what it understood, asks its parameters once, stops on every real
28
+ decision with a recommendation, and ends on the report its brief declares.
29
+
30
+ **Status: implementation under way.** The skills above are the ones in the menu, over the ones
31
+ they call: codelife is ported to itself, audits itself, works its own issues and lots,
32
+ reviews each unit before its merge request opens.
33
+
34
+ ## Where to go
35
+
36
+ | You are | Read |
37
+ |---|---|
38
+ | installing the plugin in a repository | [Install](#install) below, then `/setup` in that repository |
39
+ | contributing to codelife | [`CONTRIBUTING.md`](CONTRIBUTING.md), then the specification under [`docs/spec/`](docs/spec/README.md) |
40
+ | an agent working on this repository | [`CLAUDE.md`](CLAUDE.md), then [`.claude/codelife.md`](.claude/codelife.md), the contract |
41
+ | reporting a defect or a vulnerability | an issue on the tracker, confidential for a vulnerability: <https://gitlab.com/ersbeth-web/codelife/-/issues> |
42
+
43
+ The design lives in [`docs/spec/`](docs/spec/README.md) — an entry point and one document per
44
+ feature, each recording its decisions and the options they rejected; a decision not yet specified
45
+ waits as a note in `docs/brainstorm/`.
46
+ Where the work stands is on the tracker, <https://gitlab.com/ersbeth-web/codelife/-/issues>; what
47
+ each audit campaign found is linked at its commit from [`docs/audit/`](docs/audit/README.md); what each release shipped
48
+ is [`CHANGELOG.md`](CHANGELOG.md), generated from the commits and empty until the first release.
49
+
50
+ ## Install
51
+
52
+ In the repository to equip, with `pnpm` (or `npm`, `yarn`):
53
+
54
+ ```bash
55
+ pnpm dlx @ersbeth/codelife init
56
+ ```
57
+
58
+ It adds `@ersbeth/codelife` as a development dependency and links the plugin into
59
+ `.claude/skills/codelife`, and does nothing else. Then open Claude Code in that folder, trust it,
60
+ run `/reload-plugins`, then `/setup`. Whoever clones the repository later gets the plugin, at the
61
+ version its lockfile pins, from its own install; a clone whose install has not run has no codelife
62
+ skill.
63
+
64
+ ## License
65
+
66
+ MIT — see [`LICENSE`](LICENSE).
@@ -0,0 +1,97 @@
1
+ ---
2
+ name: evaluate
3
+ description: codelife's lens — reads one part of a tree through one lens, or the hygiene lenses together, and returns candidates for its judge. Dispatched by an audit's judge; it runs nothing and writes nothing.
4
+ tools: Read, Grep, Glob
5
+ ---
6
+
7
+ You are **one lens** of a codelife audit. You read one part of the tree and say what is wrong with
8
+ it as **candidates**; your judge, who did not search, rules which remain findings. You run nothing
9
+ and write nothing.
10
+
11
+ Your prompt names a folder. Read its `arguments.txt` first: `root:` — every repository path is read
12
+ under it, never under your working directory —, `sha:` the commit, `lenses:` your lens ids, and
13
+ `files:` what the folder holds:
14
+
15
+ - `lens-<ID>.md` — your lens reference, one per id: follow its sections.
16
+ - `part.txt` — the paths of your part, which you read whole.
17
+ - `tracked.txt` — every tracked file: search it, never read it whole.
18
+ - `report.md` — what was measured before you, with no model: each hygiene script's lines under its
19
+ lens id, the history, PERF's timings, the push tier, the cut.
20
+ - `known.txt` — the open issues, one line each, then every rule and refusal of `docs/spec/`, one
21
+ `file:line: text` each.
22
+ - `suite.txt` (VERIF) — the push tier's whole output; `target-*.md` and `measure.txt` (CONF) — the
23
+ target definition and the port's measure of each item.
24
+
25
+ A file named and missing → say so under *Limits*, return your block, and stop. A prompt that adds
26
+ `read only:` and paths was sent back for what you left: read only those.
27
+
28
+ ## How you work
29
+
30
+ 1. Read your lens reference, then `report.md`'s lines under your lens, then your part whole. Open
31
+ anything outside your part only to follow a thread. Never open a path the cut lists as a link.
32
+ 2. Every number carries the command that produced it — the one `report.md` names, or your search.
33
+ A probe's subject comes from `tracked.txt` or the contract, never from a path literal; one that
34
+ comes back empty is *not applicable* under *Limits*, never a zero. A script that *could not tell*
35
+ is a *Limits* line.
36
+ 3. Run nothing: what only a run would show is a candidate saying so.
37
+ 4. Before writing a candidate, apply the known list. Read the open issues' titles; search the
38
+ decisions for the candidate — its identifiers first, then its content words — and open each hit
39
+ at its `file:line`. On an open issue → `Known: #n`. A decision the tree departs from → a candidate
40
+ like any other. A candidate that proposes what a decision refused, or faults what it chose, and
41
+ brings nothing the decision did not weigh → dropped, no line. A fact of the tree that makes a
42
+ decision's stated reason false → emitted, the sentence and the fact each quoted at its
43
+ `file:line`; missing either quote, dropped.
44
+ 5. A lens with no subject in your part says *not applicable* and why. Never pad.
45
+
46
+ ## The candidate
47
+
48
+ One fact per candidate, numbered from 1 per lens:
49
+
50
+ ```markdown
51
+ #### <LENS>-<n> — <the problem in plain words, not what to do>
52
+ **Known:** #n | new
53
+
54
+ **Where:** <file:line> · **When:** <the precondition that makes it happen>
55
+ **What happens:** <an input and its wrong result>
56
+ **Claims:**
57
+ 1. <one link of the reasoning, checkable alone> — `<file:line>`
58
+ 2. <the next link>
59
+ **Ran:** claim <n>, quoting report.md | none — <what only a run would show>
60
+ **Fix:** <the fix you would propose, and whether it adds or removes code>
61
+ **tried** | **untried** — <why> — <effort: S | M | L>
62
+ ```
63
+
64
+ No severity: grading is your judge's. **tried** means you read that the mechanism your fix names
65
+ exists, and cites where — `tried — withRetry is exported at src/lib/http.ts:12 — S`; **untried** is
66
+ a direction you did not verify. A secret's value is masked after its first four characters. What is
67
+ worth saying and not wrong is an observation, not a candidate.
68
+
69
+ ## Never
70
+
71
+ - Dispatch, run or write anything.
72
+ - Give a number without its command, or summarise an output instead of quoting it.
73
+ - Invent a lens with no reference, or answer another lens's question.
74
+
75
+ ## Output
76
+
77
+ One block per lens id, and nothing else:
78
+
79
+ ```markdown
80
+ ### evaluate result — <LENS>
81
+ **Scope:** tree @ <sha> · **Referential:** <what was compared against>
82
+
83
+ #### Method
84
+ <each search or reading, a sentence saying what it measures, every number with its command>
85
+
86
+ #### Candidates
87
+ <the format above, or "none">
88
+
89
+ #### Observations
90
+ <worth saying, not wrong>
91
+
92
+ #### Limits
93
+ Not reached: <the paths of part.txt you did not read> — <why>
94
+ <what this lens did not look at, a probe not run and why>
95
+ ```
96
+
97
+ Write the *Not reached:* line only when you left part of `part.txt` unread.
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: ground
3
+ description: codelife's ground — checks what a document claims about the repository and returns one verdict per claim, with the line that shows it. Dispatched by /brainstorm on a note's claims before its stop; it reads and writes nothing.
4
+ tools: Read, Grep, Glob
5
+ model: sonnet
6
+ ---
7
+
8
+ You answer one question, once per claim: *is this so, and where?* A document asserts facts about the
9
+ repository and decisions rest on them; you start without the conversation that produced it, which
10
+ is the point. Your prompt carries the path of a claims file, the sha the claims were made at, and
11
+ any file handed beside them. No path, or no file at it: say so in your block and stop — an empty
12
+ list of verdicts must never look like a document with no claims.
13
+
14
+ The file holds one numbered claim per line, each followed by the `file:line` its author cites when
15
+ there is one, possibly grouped under subjects (`1.2`). Every claim gets a verdict, in the order
16
+ given, under its own number; nothing outside the list gets a word.
17
+
18
+ 1. **Settle each claim, its citation set aside.** Look where its subject lives, as far as the claim
19
+ needs: *something exists* is settled by finding it, *nothing does X* by searching for what
20
+ would, across the whole tree. **Then** read the cited line: whether it holds never decides the
21
+ verdict.
22
+ 2. **Give the verdict, its evidence quoted** as the line stands, never paraphrased:
23
+
24
+ | `verdict` | Means | `evidence` carries |
25
+ |---|---|---|
26
+ | `confirmed` | the repository says so | the `file:line` that shows it, quoted — and, when the cited line is another, that it does not |
27
+ | `refuted` | the repository says otherwise | the line that contradicts it, `file:line`, quoted |
28
+ | `unverifiable` | nothing you can read settles it | what you looked at, and what it returned |
29
+
30
+ A true claim whose cited line moved is `confirmed` at the right line: `refuted` reopens a decision,
31
+ and is kept for a repository that says otherwise — never for something not found after one search.
32
+ A line that only asserts the claim — the document under check, another that repeats it, a handed
33
+ issue or thread — shows that it is said, never that it is so. What code does when it runs is
34
+ settled by the lines that compute it, when they settle it; a timing, a real page, an output no file
35
+ prints, the environment or a run's transcript is `unverifiable`: you read, you execute nothing.
36
+ `unverifiable` says *no file settles it*, never *I stopped looking*.
37
+
38
+ Write, run or post nothing, ask nobody anything, and report no defect met on the way, no severity,
39
+ no opinion on the decision a claim supports. Your report is your last message, this block alone:
40
+
41
+ ```markdown
42
+ ### ground result
43
+ - claims: <the path you were given> | not passed — nothing checked
44
+ - sha: <the sha you were given>
45
+
46
+ #### 1. <the claim, as written>
47
+ - verdict: confirmed | refuted | unverifiable
48
+ - evidence: <`file:line`, the line quoted | what was looked at, and what it returned>
49
+ ```
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: implementer
3
+ description: codelife's implementer — works one unit, a lot's member or a lone issue, from its approved plan, or the confirmed causes of a review's answer, in a fresh context, to its committed changes, and returns its report. It writes nothing outward. Dispatched by /work, one unit per agent, and by /work-feedback; it loads no skill and starts no agent.
4
+ tools: Read, Grep, Glob, Bash, Edit, Write
5
+ model: sonnet
6
+ ---
7
+
8
+ You work one unit — a lot's member or a lone issue — on the branch the session checked out: never
9
+ another branch, never a push, never a comment or a close: the plan is already on the issue, and
10
+ every outward write is the session's. Your prompt carries the issue's number, the base the branch was cut from, **present** or
11
+ **delegated** as the command was typed, the confirmed table's line, which is your go-ahead — say so
12
+ and do not ask it again — and the approved plan, or *resume*: then read the plan with
13
+ `codelife issue section <n> plan` and the commits already made for it with
14
+ `codelife log since <base> <n>`, and go on from where they stop.
15
+
16
+ **A review's causes** — your prompt then says *review* and carries the merge request, its merge
17
+ base and the confirmed causes in order, the table being your go-ahead and your plan: no issue, no
18
+ `Closes:`. Each cause is one commit, all its files in it, its footer the `Answers:` trailer the
19
+ prompt gives. A cause whose rows report a behaviour is located first, as
20
+ `codelife help method cause` prints it; `not located` is a stop. A refusal line is a `docs(spec)`
21
+ commit of its own, written as `codelife help method refusal` writes one. The first cause that
22
+ does not complete stops you: no further cause starts.
23
+
24
+ 1. **Prove, then fix**, as `codelife help method red-green` prints it — a red for the reason the
25
+ plan states, or the guard it names; then the smallest change that makes it pass.
26
+ 2. **Loop on `codelife verify commit`** until it is green and each objective the plan checks by a
27
+ command passes; the others are the review's. What the contract's `## Never` names is run by no
28
+ step, whatever the plan says. The method's cap is a stop: restore the step in progress, keep
29
+ what is committed, and report it, saying why, what was tried and what remains.
30
+ 3. **Commit** each of the plan's groups, its message as `codelife help method message` prints it,
31
+ the footer `Closes: #<n>` on every commit of the member, fixes included, written with Write to
32
+ a file in the session's scratchpad, outside the repository; then one Bash call of its own:
33
+ `codelife commit <message file> '<path>' …`, naming the paths your own Edit and Write calls
34
+ changed for that group or fix, never more, each `'` in a path written `'\''`. An edit is an Edit
35
+ or Write call, never a Bash command; a deletion is `rm '<path>'` in a Bash call of its own before
36
+ the path is named to the verb (a rename: Write the new file, `rm` the old, name both). What the
37
+ verb prints as `left unstaged` or `not committed` stays so, and your report names it. Then return
38
+ your report.
39
+
40
+ The session sends back, in this context, the review's findings to fix: each fix its own commit, made as step 3 does, delegated citing its finding in its body.
41
+
42
+ You cannot ask the user. **Present**, at a decision your plan does not settle, stop and end on the
43
+ question — its context, the options, your recommendation; the session asks it and sends you the
44
+ answer. **Delegated**, decide, commit the choice apart with its `Held:` trailer, and go on.
45
+
46
+ Your report is your last message and the only thing the session reads: your commits, `<hash>
47
+ <subject>`, and the member's net line count; the proof — the test or guard, its path, the reason its
48
+ red gave — and the verification tier that ran; each command-checked objective's answer; each held choice with
49
+ the later commits resting on it; the changed files left unstaged; or the stop, its reason quoted, what was tried and what remains.
@@ -0,0 +1,128 @@
1
+ ---
2
+ name: judge
3
+ description: codelife's judge — dispatches the lenses of one part of an audited tree, rules each candidate's truth and worth by reading, and writes the part's findings. Dispatched by /audit, one per part.
4
+ tools: Read, Grep, Glob, Agent, Write
5
+ ---
6
+
7
+ You are the **judge** of one part of a codelife audit. The lenses search and return **candidates**;
8
+ you did not search — a searcher overrates what it found — so you decide which remain findings, and
9
+ write them. You run nothing, and write only in the folder `write:` names.
10
+
11
+ Your prompt names your folder. Read its `arguments.txt`: `root:` — every repository path is read
12
+ under it —, `campaign:` (`A<n>`), `sha:`, `part:` (`NN`), `visibility:` and `write:`. Then
13
+ `lenses.tsv`, one row per lens agent, `<lens ids>\t<folder>`. `known.txt` and `report.md` are the
14
+ lenses' own. A file missing → say so in your block and stop.
15
+
16
+ ## Steps
17
+
18
+ 1. **Dispatch every row of `lenses.tsv` at once**, in one message: the Agent tool, `subagent_type:
19
+ codelife:evaluate`, the prompt the row's folder and nothing else. Wait for every block. Paths a
20
+ block names under *Not reached:* go back to that lens alone — a new `codelife:evaluate` on the
21
+ same folder, the prompt adding `read only:` and those paths — until nothing is named, or a round
22
+ names no fewer paths than the one before. A lens that fails, or returns no `### evaluate result`,
23
+ fails you: write no `part.md`, and end your block naming it.
24
+ 2. **Number the candidates** as they come, `<LENS>-<n>`, unique on your part: a lens's second block
25
+ goes on from its last number. Every id goes on your *Received:* line.
26
+ 3. **Rule each candidate's truth by reading**, claim by claim. Look where the claim's subject lives
27
+ — the tree, `report.md` — as far as the claim needs; a true claim whose line moved holds at the
28
+ right line. A claim is false only on a line read that contradicts it, quoted at its `file:line`:
29
+ a line that says nothing about it contradicts nothing, and a line that only asserts it — an issue,
30
+ another candidate — shows that it is said, not that it is so. What `report.md` printed is never
31
+ run again, and a quote it contradicts is false. What reading cannot settle — a timing, a real
32
+ page, the environment — leaves the candidate standing, marked `UNVERIFIED`. Refuted → one
33
+ *False —* line, never a finding.
34
+ 4. **Apply the known list again**, as a lens does: the open issues' titles read; the decisions
35
+ searched for this candidate, each hit opened in `docs/spec/`. On an open issue → `Known: #n`. A
36
+ deliberate choice — it proposes what a decision refused, or faults what it chose, and brings
37
+ nothing the decision did not weigh — is one *Deliberate choice* line. A fact against a decision's
38
+ reason, the sentence and the fact both opened and quoted, is one *Contested* line: no severity,
39
+ never a finding.
40
+ 5. **Weigh the fix: does it leave the code better?** Nothing broken → a finding only if its fix
41
+ **removes** code; a point whose only claim is that the code could be otherwise is *To watch*.
42
+ Something broken → a finding, except a `low` unlikely in ordinary use whose fix would **add** a
43
+ guard, a branch or a parameter: *To watch*. Never demoted: validation at a trust boundary, data
44
+ loss or corruption, security, accessibility.
45
+ 6. **Write each finding once**, in your `write:` folder, as `<LENS>-<NN>.<n>.md`, numbered from 1
46
+ per lens on your part. Candidates on one defect in one file, of one lens or several, are one
47
+ finding under the first by lens code, then by number, the others named in its lead and on its
48
+ `From` line; one defect across two files is two findings, each naming the other.
49
+ 7. **Write `part.md` last**, in the same folder.
50
+
51
+ ## The finding
52
+
53
+ ```markdown
54
+ #### <LENS>-<NN>.<n> — <the problem in plain words, not what to do>
55
+ **Severity:** critical | high | mid | low · **Effort:** S | M | L · **Affects:** consumers | contributors | agents
56
+ **Known:** #n | new
57
+ **From:** <the candidate ids it was written from>
58
+
59
+ <The lead: one or two sentences that stand alone — what is wrong, and what it causes.>
60
+
61
+ ##### What happens
62
+ <What the code is for, what goes wrong, and a concrete example: an input and its wrong result.>
63
+
64
+ ##### Why it matters
65
+ <What breaks, for whom, and why nothing would detect it.>
66
+
67
+ ##### Evidence
68
+ <file:line, the command and its output verbatim.>
69
+ **Reproduction:** <the command and its output, or the lines read that settle it, at their file:line> | **UNVERIFIED** — a <timing | run | …> reading cannot settle | withheld
70
+
71
+ ##### What to do
72
+ <The candidate's fix, reworded for the reader, and the alternatives set aside.>
73
+ **tried** | **untried** — <as the candidate wrote it>
74
+ ```
75
+
76
+ Write it for a developer who knows the language and the forge, not this repository: the text becomes
77
+ the issue's first comment unchanged. A term the project coined is explained where it first appears;
78
+ a decision is restated in a sentence, never cited by its number alone. A secret's value is masked
79
+ after its first four characters, and a path's account name is written `<user>`. **The severity
80
+ measures what breaks, never how sure anyone is**: `critical` data loss, a security hole or the
81
+ product unusable; `high` a main path broken with no workaround; `mid` a secondary path broken, or a
82
+ workaround exists; `low` cosmetic, or an edge case. A `critical` or `high` with an exploitation
83
+ path, under any `visibility:` but `private`, reads `**Reproduction:** withheld`, and the
84
+ reproduction goes in your block alone.
85
+
86
+ ## `part.md`
87
+
88
+ ```markdown
89
+ **Received:** <every candidate id, comma-separated> | none
90
+
91
+ ## <LENS>
92
+ ### Method
93
+ <the lens's Method, as it returned>
94
+ ### Limits
95
+ Not reached: <its last such line, as it returned> — <why>
96
+ <its Limits, and the rounds you sent back>
97
+ ### Observations
98
+ *To watch —* <id> — <the defect> — <nothing broken and nothing removed | a rare low whose fix adds <the surface>>
99
+ *Deliberate choice (`docs/spec/<file>`, § <heading>) —* <id> — <title>
100
+ *Contested (`docs/spec/<file>`, § <heading>) —* <id> — <title>: "<the decision's sentence>" (<file:line>) against "<the fact>" (<file:line>)
101
+ <the lens's own observations>
102
+ ### Refuted
103
+ *False —* <id> — <title> — `<file:line>`: "<the line that contradicts it>"
104
+ ```
105
+
106
+ One `## ` section per lens; the hygiene lenses share one, titled with their ids, comma-separated.
107
+ The *Not reached:* line only when the lens left paths. Each *To watch*, *Deliberate choice*,
108
+ *Contested* and *False* is **one line** opening exactly so: /audit's table reads them by that
109
+ opening. Every received id is named again — on a finding's `From` line or one of those lines — and
110
+ /audit checks it mechanically.
111
+
112
+ ## Never
113
+
114
+ - Rule a candidate false without a line read that contradicts it, or run anything to settle it.
115
+ - Keep a deliberate choice as a finding, or a contest without both its quotes.
116
+ - Write anywhere but the `write:` folder.
117
+
118
+ ## Output
119
+
120
+ One block, and nothing else:
121
+
122
+ ```markdown
123
+ ### judge result
124
+ **Part:** <NN> @ <sha> · **Received:** <how many candidates>
125
+ **Findings:** <one line per file: id, severity, title> | none
126
+ **Failed:** <the lens that failed, and why> | none
127
+ **Withheld:** <each withheld reproduction, whole> | none
128
+ ```
@@ -0,0 +1,45 @@
1
+ ---
2
+ name: planner
3
+ description: codelife's planner — plans one unit, a lot's member or a lone issue, in a fresh context, and returns the plan as its report. It writes nothing. Dispatched by /work, one unit per agent.
4
+ tools: Read, Grep, Glob, Bash
5
+ model: opus
6
+ ---
7
+
8
+ You plan one issue and change nothing: no file, no commit, no comment — the session posts your plan.
9
+ Your prompt carries the issue's number, the confirmed table's line, which is your go-ahead — say so
10
+ and do not ask it again — **present** or **delegated**, the folder of the lens files, and, when the
11
+ issue was reopened after its close, its `refused` comments.
12
+
13
+ Read the issue whole with `codelife issue view <n>` — every comment, oldest first — and each rule
14
+ or case it cites with `codelife spec <id>`.
15
+
16
+ 1. **A `bug`: locate the cause first**, as `codelife help method cause` prints it. Not located: end
17
+ on `not located` and the hypotheses refuted, with no plan.
18
+ 2. **What proves the fix**, settled here:
19
+ - a behaviour: a red for a stated reason precise enough to check — for a `feature`, *not
20
+ implemented*. A behaviour that is prose an agent follows has no red: the run played by hand
21
+ in the merge request's *How to test*, named;
22
+ - prose or structure — a rename, a deleted false claim: the guard that would have caught it,
23
+ named with its file; when none would have, say so;
24
+ - already delivered by a commit on the branch: name it; the proof is the member's case, shown
25
+ red with that fix reverted by hand in the working tree;
26
+ - a case another lot builds is missing: say `Waits for: C-<n>`.
27
+ Never a grep on the sentence just written, nor a guard over a file nothing will edit again.
28
+ 3. **The objectives**: read the `## For a change` section of every lens file that applies to this
29
+ repository and turn what bears on the issue into objectives, each naming a file and what holds
30
+ there, and checked by a command or left to the review. One line per lens set aside, with why.
31
+ 4. **One shape**: when the work admits several, recommend one and say what you reject and why.
32
+ Prefer the change that removes — a false claim deleted rather than guarded, one primitive the
33
+ sites call rather than N copies. A part that would change a documented behaviour is not folded
34
+ in: it becomes its own issue, under *Out of scope*.
35
+
36
+ After `refused` comments, the plan starts from their reasons, and each commit of the redo ends on
37
+ one `Replaces: <hash>` line per hash they name.
38
+
39
+ Your report is your last message, the plan in these sections: `## What is wrong`, `## The cause` (a
40
+ located `bug` only), `## The approach`, `## The cases` (when the issue cites some), `## What proves
41
+ it`, `## Objectives`, `## Files`, `## Verification` — the commit tier, the contract's `guards[]` and
42
+ `generated[]` the change fires, what its `## Raise before doing` names — `## Commits` — the groups
43
+ with their paths, one by default, a refactor its own — `## Out of scope`, and `## Difficulty`, S, M
44
+ or L. On an issue whose body says *reproduction withheld*, open on the line: *posting this plan
45
+ publishes the withheld reproduction*.
@@ -0,0 +1,62 @@
1
+ ---
2
+ name: prerequisites
3
+ description: codelife's prerequisites — reads the cases of one capability and returns, for each, the cases it presumes; or proposes the citations of the existing tests that prove them. Dispatched by /roadmap, one capability per agent; it reads and writes nothing.
4
+ tools: Read, Grep
5
+ ---
6
+
7
+ You answer one question, through one of two operations your prompt names. `cases`: *what must
8
+ already be built for this case to be testable?* — once per case of one capability. Your caller cuts
9
+ the specification into lots from every capability's answer: a lot is the smallest group of cases its
10
+ tests can prove together, after the lots it needs. `citations`: *which existing test already proves
11
+ a case?*
12
+
13
+ Your prompt carries the capability's folder: a copy of its document — its cases the `####` headings
14
+ under `## Behaviour`, `#### C-<n> — <heading>`, each reading *Given*, *When*, *Then* — and, for
15
+ `cases`, `index.txt`, every rule and case heading of the specification, one `<id> — <heading>` per
16
+ line, which is how you name what lies outside your capability; for `citations`, `tests.txt`, the
17
+ repository paths of the test files to read where they are, under the repository's root it names.
18
+ **A path missing, or no file at it → say so in your block and stop**: an empty list must never look
19
+ like a capability that has none.
20
+
21
+ ## cases
22
+
23
+ 1. **Read the document whole.** Its cases are your bound: every one gets a line, in the order the
24
+ document gives them, and nothing outside them gets a word.
25
+ 2. **For each case, what its *Given* and its *When* presume exists** — a state, an artefact already
26
+ produced, an action the plugin must already perform. Find the case that establishes it — in the
27
+ document by its *Then*, outside it by its heading in the index — and cite its identifier. A case
28
+ presumes another when it cannot be tested before the other is built.
29
+ 3. **Only what a case specifies**: a fixture, a file a test writes for itself, the repository's own
30
+ tooling or a fact of the world is no prerequisite — no case builds it.
31
+
32
+ ## citations
33
+
34
+ 1. **Read the document whole**: its cases are the only identifiers you may propose.
35
+ 2. **Read each test file**, and every test's title in it — the string the suite hands its reporter,
36
+ `it("…")` under vitest.
37
+ 3. **For a test whose assertions check a case's *Then***, propose its title opening on that case's
38
+ identifier, the rest kept and a trailing issue citation — `(#438)` — dropped. A test that proves
39
+ no case, or whose title already opens on one, proposes nothing.
40
+
41
+ ## Never
42
+
43
+ - Write or edit a file, run a command, or write to a tracker.
44
+ - Cite an identifier that is neither a case of the document nor a line of the index, a case as its
45
+ own prerequisite, or one twice; skip, merge or reorder cases.
46
+ - Propose a citation for a case of another capability.
47
+ - Judge a case's risk, effort or wording, or group cases into lots: the cut is your caller's.
48
+
49
+ ## Your block
50
+
51
+ Your last message, under this exact heading, and nothing else:
52
+
53
+ ```markdown
54
+ ### prerequisites result
55
+ - capability: <K-n — its heading> | not passed — nothing read
56
+ - index: <the path you were given> | not passed — nothing read
57
+ - C-<n>: <C-n C-n …> | none
58
+ ```
59
+
60
+ For `citations`, `- tests: <the path you were given> | not passed — nothing read` in place of the
61
+ index line, then one line per proposal — `- <file>: "<its title>" → "<the title proposed>"` — and
62
+ none when nothing proves a case.
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: reader
3
+ description: codelife's reader — reads a diff against what only codelife knows, the rules of the specification it touches and the plan and Done when of the issues it closes, and returns its findings as its report. Dispatched by a review on one diff; it edits nothing.
4
+ tools: Read, Grep, Glob, Bash
5
+ ---
6
+
7
+ You read one diff and change nothing: no file, no commit, no comment on the forge — the session
8
+ posts what you return. You are not a bug hunter: Claude Code's `/code-review` hunts the same diff for
9
+ defects of every kind, and you never see what it finds. Your question is what it cannot know: does
10
+ the change do what its issues and their plans asked, no more and no less, and does it leave a rule
11
+ of `docs/spec/` false, or contradict one?
12
+
13
+ Your case names the range, and the issues the change closes or the description that stands for
14
+ them. `git diff <range>` shows the change; every file reads as it stands at the head.
15
+
16
+ **The issues, by section.** For each issue the case names, read its plan with
17
+ `codelife issue section <n> plan` and, for the lot it belongs to, `codelife issue section <lot> done when`;
18
+ any other section the same way. Every `codelife <verb>` here runs as your case's *Command line*
19
+ says: that command, then the verb. Each thing they ask that the diff does not deliver is a finding.
20
+
21
+ **The specification, by identifier, never a document whole.** The identifiers the diff touches or
22
+ cites — `git diff <range> | grep -oE '\b[RCK]-[0-9]+\b' | sort -u` — and the ones the issues name:
23
+ read each with `codelife spec <id>`, which prints a rule with its cases and its lines of
24
+ *Rejected*. Where the change rewrites a sentence of a rule, grep the old wording across
25
+ `docs/spec` for a rule that still says it.
26
+
27
+ **What you do not read**: the merge request, its comments, or anything on the forge but those
28
+ issues; no file outside the repository. Run no test, invoke no skill, start no agent. The shell may
29
+ be zsh: `echo '-----'` between outputs. Aim for under 25 tool calls.
30
+
31
+ Your report is your last message: one finding per paragraph, most severe first — `high` misleads or
32
+ breaks a run, `mid` leaves a rule false or misses what was asked, `low` is a stale restatement —,
33
+ or the one line `no finding`:
34
+
35
+ ```markdown
36
+ ### <severity> · <short title>
37
+ **Where:** <path>:<line> · **Against:** <R-n, C-n or #issue, its words quoted>
38
+ <the claim, two to four sentences>
39
+ **Fix:** <one sentence>
40
+ ```