@gavin-hu/my-pi-agent 0.20.0 → 0.22.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.
Files changed (298) hide show
  1. package/README.md +46 -30
  2. package/README.zh-CN.md +40 -25
  3. package/assets/screens/board.png +0 -0
  4. package/assets/screens/chrome.png +0 -0
  5. package/assets/screens/file-browse.png +0 -0
  6. package/assets/screens/plan-review.png +0 -0
  7. package/assets/screens/plan.png +0 -0
  8. package/docs/extensions/README.md +22 -23
  9. package/docs/extensions/board.md +397 -168
  10. package/docs/extensions/bytefly.md +234 -197
  11. package/docs/extensions/check.md +15 -17
  12. package/docs/extensions/context.md +35 -15
  13. package/docs/extensions/file-browse.md +57 -63
  14. package/docs/extensions/file-open.md +9 -11
  15. package/docs/extensions/file-read.md +12 -14
  16. package/docs/extensions/goal.md +15 -17
  17. package/docs/extensions/job.md +54 -42
  18. package/docs/extensions/memory.md +17 -19
  19. package/docs/extensions/plan.md +197 -140
  20. package/docs/extensions/question.md +16 -18
  21. package/docs/extensions/rewind.md +17 -19
  22. package/docs/extensions/serve.md +145 -0
  23. package/docs/extensions/session-bus.md +38 -16
  24. package/docs/extensions/subagent.md +23 -25
  25. package/docs/extensions/team.md +83 -44
  26. package/docs/extensions/todo.md +18 -18
  27. package/docs/extensions/watch.md +31 -31
  28. package/docs/extensions/web-access.md +2 -4
  29. package/docs/extensions/wechat.md +34 -35
  30. package/docs/extensions/worktree.md +56 -50
  31. package/extensions/board/commands.ts +79 -25
  32. package/extensions/board/format.ts +43 -24
  33. package/extensions/board/index.ts +17 -4
  34. package/extensions/board/input.ts +4 -9
  35. package/extensions/board/join.ts +5 -20
  36. package/extensions/board/lazy-page.ts +40 -0
  37. package/extensions/board/page.ts +65 -93
  38. package/extensions/board/result.ts +30 -39
  39. package/extensions/board/rows.ts +62 -25
  40. package/extensions/board/schema.ts +49 -11
  41. package/extensions/board/snapshot.ts +8 -6
  42. package/extensions/board/tone.ts +22 -0
  43. package/extensions/board/tools.ts +154 -55
  44. package/extensions/board/transport/router.ts +3 -5
  45. package/extensions/board/transport/server.ts +59 -28
  46. package/extensions/board/types.ts +36 -42
  47. package/extensions/board/view/card.ts +229 -0
  48. package/extensions/board/view/client.ts +35 -16
  49. package/extensions/board/view/dialog.ts +169 -6
  50. package/extensions/board/view/empty.ts +47 -0
  51. package/extensions/board/view/keys.ts +13 -2
  52. package/extensions/board/view/live.ts +90 -28
  53. package/extensions/board/view/names.ts +13 -4
  54. package/extensions/board/view/page.ts +38 -13
  55. package/extensions/board/view/render.ts +219 -277
  56. package/extensions/board/view/styles.ts +130 -32
  57. package/extensions/board/view/team.ts +297 -76
  58. package/extensions/bytefly/block/fallback.ts +1 -1
  59. package/extensions/bytefly/doctor/runtime.ts +5 -2
  60. package/extensions/bytefly/footer/collect/label.ts +60 -0
  61. package/extensions/bytefly/footer/collect/snapshot.ts +8 -1
  62. package/extensions/bytefly/footer/config.ts +7 -8
  63. package/extensions/bytefly/footer/register.ts +33 -4
  64. package/extensions/bytefly/footer/render/footer.ts +18 -4
  65. package/extensions/bytefly/footer/render/key.ts +46 -0
  66. package/extensions/bytefly/footer/render/layout.ts +13 -3
  67. package/extensions/bytefly/footer/render/lines.ts +10 -7
  68. package/extensions/bytefly/footer/render/segments.ts +41 -38
  69. package/extensions/bytefly/footer/render/status.ts +0 -11
  70. package/extensions/bytefly/footer/types.ts +7 -0
  71. package/extensions/bytefly/header/component.ts +4 -20
  72. package/extensions/bytefly/header/config.ts +1 -1
  73. package/extensions/bytefly/index.ts +32 -6
  74. package/extensions/bytefly/mode/editor.ts +115 -0
  75. package/extensions/bytefly/panel/commands.ts +210 -120
  76. package/extensions/bytefly/panel/format.ts +4 -4
  77. package/extensions/bytefly/panel/settings.ts +73 -6
  78. package/extensions/bytefly/panel/tui/keys.ts +2 -6
  79. package/extensions/bytefly/update/cache.ts +1 -1
  80. package/extensions/bytefly/update/register.ts +4 -4
  81. package/extensions/bytefly/working/config.ts +5 -7
  82. package/extensions/bytefly/working/format.ts +10 -13
  83. package/extensions/bytefly/working/register.ts +22 -27
  84. package/extensions/check/commands.ts +3 -2
  85. package/extensions/check/render.ts +10 -1
  86. package/extensions/check/{tui.ts → view/check-screens.ts} +14 -19
  87. package/extensions/context/commands.ts +2 -2
  88. package/extensions/context/{tui.ts → view/context-report.ts} +51 -19
  89. package/extensions/file-browse/config/config.ts +4 -19
  90. package/extensions/file-browse/index.ts +89 -79
  91. package/extensions/file-browse/live/live.ts +1 -1
  92. package/extensions/file-browse/transport/router.ts +12 -4
  93. package/extensions/file-browse/transport/server.ts +61 -28
  94. package/extensions/file-browse/view/chrome.ts +4 -4
  95. package/extensions/file-browse/view/client.ts +3 -1
  96. package/extensions/file-browse/view/html.ts +73 -40
  97. package/extensions/file-browse/view/live-client.ts +2 -2
  98. package/extensions/file-browse/view/markdown.ts +13 -14
  99. package/extensions/file-browse/view/palette.ts +2 -2
  100. package/extensions/file-browse/view/raw-html.ts +9 -9
  101. package/extensions/file-browse/view/tree.ts +1 -1
  102. package/extensions/file-browse/view/urls.ts +20 -6
  103. package/extensions/file-read/render.ts +4 -4
  104. package/extensions/goal/plan-route.ts +2 -2
  105. package/extensions/goal/tui.ts +12 -2
  106. package/extensions/job/child.ts +527 -0
  107. package/extensions/job/clock.ts +142 -0
  108. package/extensions/job/commands.ts +4 -2
  109. package/extensions/job/config.ts +8 -1
  110. package/extensions/job/format.ts +22 -1
  111. package/extensions/job/log-writer.ts +13 -2
  112. package/extensions/job/registry.ts +63 -7
  113. package/extensions/job/render.ts +34 -0
  114. package/extensions/job/runtime.ts +296 -655
  115. package/extensions/job/session.ts +132 -19
  116. package/extensions/job/store.ts +7 -7
  117. package/extensions/job/tools.ts +21 -9
  118. package/extensions/job/types.ts +47 -0
  119. package/extensions/job/{tui.ts → view/jobs-screen.ts} +19 -99
  120. package/extensions/job/waiters.ts +44 -1
  121. package/extensions/memory/commands.ts +4 -2
  122. package/extensions/memory/{tui.ts → view/memory-picker.ts} +12 -12
  123. package/extensions/plan/commands.ts +12 -9
  124. package/extensions/plan/feedback.ts +62 -16
  125. package/extensions/plan/format.ts +8 -2
  126. package/extensions/plan/git-bash.ts +115 -16
  127. package/extensions/plan/index.ts +58 -51
  128. package/extensions/plan/plan-index.ts +4 -2
  129. package/extensions/plan/plan-text.ts +114 -0
  130. package/extensions/plan/plans.ts +5 -54
  131. package/extensions/plan/policy.ts +8 -10
  132. package/extensions/plan/review-lazy.ts +85 -0
  133. package/extensions/plan/review.ts +2 -2
  134. package/extensions/plan/runtime.ts +61 -41
  135. package/extensions/plan/sections.ts +1 -1
  136. package/extensions/plan/steps.ts +3 -3
  137. package/extensions/plan/todos.ts +1 -1
  138. package/extensions/plan/tools/cancel.ts +27 -62
  139. package/extensions/plan/tools/enter.ts +55 -81
  140. package/extensions/plan/tools/exit.ts +221 -238
  141. package/extensions/plan/tools/refusal.ts +18 -0
  142. package/extensions/plan/tools/steps.ts +75 -92
  143. package/extensions/plan/tools/write.ts +77 -120
  144. package/extensions/plan/tools.ts +188 -30
  145. package/extensions/plan/tui.ts +5 -5
  146. package/extensions/plan/types.ts +48 -5
  147. package/extensions/plan/web-blocks.ts +76 -5
  148. package/extensions/plan/web-chrome.ts +4 -0
  149. package/extensions/plan/web-client.ts +102 -2
  150. package/extensions/plan/web-collab.ts +4 -4
  151. package/extensions/plan/web-comments.ts +39 -8
  152. package/extensions/plan/web-composer.ts +14 -3
  153. package/extensions/plan/web-keys.ts +149 -25
  154. package/extensions/plan/web-lazy.ts +53 -0
  155. package/extensions/plan/web-markdown.ts +10 -68
  156. package/extensions/plan/web-outline.ts +22 -2
  157. package/extensions/plan/web-page.ts +56 -86
  158. package/extensions/plan/web-payload.ts +188 -0
  159. package/extensions/plan/web-plan.ts +23 -13
  160. package/extensions/plan/web-router.ts +18 -9
  161. package/extensions/plan/web-settle.ts +14 -7
  162. package/extensions/plan/web-share-session.ts +24 -55
  163. package/extensions/plan/web-share.ts +19 -37
  164. package/extensions/plan/web-write.ts +112 -0
  165. package/extensions/plan/web.ts +67 -131
  166. package/extensions/question/tools.ts +6 -2
  167. package/extensions/question/{tui.ts → view/question-screen.ts} +11 -11
  168. package/extensions/rewind/commands/commands.ts +6 -3
  169. package/extensions/rewind/state/runtime.ts +1 -1
  170. package/extensions/rewind/{view/status.ts → status.ts} +4 -4
  171. package/extensions/rewind/view/review-tui.ts +4 -4
  172. package/extensions/serve/config.ts +39 -0
  173. package/extensions/serve/index.ts +85 -0
  174. package/extensions/serve/registry.ts +260 -0
  175. package/extensions/session-bus/commands.ts +11 -6
  176. package/extensions/session-bus/join-request.ts +17 -9
  177. package/extensions/session-bus/mail-watch.ts +26 -17
  178. package/extensions/session-bus/protocol.ts +15 -3
  179. package/extensions/session-bus/resolve.ts +5 -7
  180. package/extensions/session-bus/result.ts +1 -27
  181. package/extensions/session-bus/runtime.ts +40 -12
  182. package/extensions/session-bus/store.ts +101 -19
  183. package/extensions/session-bus/tools.ts +5 -4
  184. package/extensions/session-bus/types.ts +19 -0
  185. package/extensions/session-bus/{tui.ts → view/session-list.ts} +16 -16
  186. package/extensions/subagent/agents.ts +1 -1
  187. package/extensions/subagent/commands.ts +4 -2
  188. package/extensions/subagent/format.ts +15 -15
  189. package/extensions/subagent/index.ts +1 -1
  190. package/extensions/subagent/render.ts +3 -3
  191. package/extensions/subagent/{background-tui.ts → view/agents-board.ts} +11 -11
  192. package/extensions/team/commands.ts +24 -5
  193. package/extensions/team/dispatch.ts +18 -4
  194. package/extensions/team/format.ts +17 -2
  195. package/extensions/team/index.ts +9 -8
  196. package/extensions/team/schema.ts +6 -5
  197. package/extensions/team/tools.ts +107 -45
  198. package/extensions/team/types.ts +3 -2
  199. package/extensions/todo/commands.ts +4 -2
  200. package/extensions/todo/format.ts +11 -0
  201. package/extensions/todo/render.ts +57 -0
  202. package/extensions/todo/runtime.ts +1 -1
  203. package/extensions/todo/tools.ts +1 -1
  204. package/extensions/todo/{tui.ts → view/todo-screen.ts} +18 -90
  205. package/extensions/todo/widget.ts +47 -0
  206. package/extensions/watch/commands.ts +4 -2
  207. package/extensions/watch/format.ts +36 -7
  208. package/extensions/watch/render.ts +57 -0
  209. package/extensions/watch/runtime.ts +27 -22
  210. package/extensions/watch/tools.ts +4 -4
  211. package/extensions/watch/{tui.ts → view/watch-screen.ts} +18 -80
  212. package/extensions/web-access/fetch/tool.ts +12 -4
  213. package/extensions/wechat/commands/commands.ts +18 -14
  214. package/extensions/wechat/index.ts +72 -37
  215. package/extensions/wechat/state/credentials.ts +1 -1
  216. package/extensions/wechat/state/state.ts +1 -1
  217. package/extensions/wechat/text/status.ts +112 -0
  218. package/extensions/wechat/types.ts +2 -2
  219. package/extensions/wechat/view/status-screen.ts +4 -103
  220. package/extensions/worktree/commands.ts +11 -9
  221. package/extensions/worktree/enter.ts +2 -2
  222. package/extensions/worktree/exit.ts +2 -2
  223. package/extensions/worktree/index.ts +5 -5
  224. package/extensions/worktree/screen.ts +3 -3
  225. package/extensions/worktree/status.ts +2 -2
  226. package/extensions/worktree/tools.ts +113 -116
  227. package/lib/README.md +28 -13
  228. package/lib/board/actions.ts +111 -0
  229. package/lib/board/artifact.ts +149 -0
  230. package/lib/board/card.ts +163 -52
  231. package/lib/board/config.ts +58 -0
  232. package/lib/board/contract.ts +113 -0
  233. package/lib/board/join.ts +38 -0
  234. package/lib/board/lanes.ts +182 -0
  235. package/lib/board/lead.ts +130 -0
  236. package/lib/board/limits.ts +78 -0
  237. package/lib/board/links.ts +31 -10
  238. package/lib/board/page-pointer.ts +30 -5
  239. package/lib/board/read.ts +83 -0
  240. package/lib/board/reason.ts +102 -0
  241. package/lib/board/round-text.ts +68 -6
  242. package/lib/board/round.ts +31 -15
  243. package/lib/board/rules.ts +151 -307
  244. package/lib/board/seat.ts +35 -0
  245. package/lib/board/session.ts +199 -51
  246. package/lib/board/skipped.ts +22 -0
  247. package/lib/board/steps.ts +487 -0
  248. package/lib/board/store.ts +119 -36
  249. package/lib/board/tone.ts +92 -0
  250. package/lib/board/view.ts +81 -63
  251. package/lib/bus-request.ts +83 -0
  252. package/{extensions/watch → lib}/child.ts +40 -21
  253. package/lib/env.ts +65 -7
  254. package/lib/format.ts +13 -0
  255. package/lib/http/index.ts +17 -11
  256. package/lib/http/mount.ts +142 -0
  257. package/lib/http/port.ts +30 -0
  258. package/lib/http/serve.ts +170 -46
  259. package/lib/http/server.ts +3 -3
  260. package/lib/lazy.ts +45 -0
  261. package/lib/plan-entry.ts +46 -21
  262. package/lib/plans/paths.ts +82 -0
  263. package/lib/policy.ts +9 -6
  264. package/lib/report.ts +3 -2
  265. package/lib/requirements.ts +10 -10
  266. package/lib/session-label.ts +129 -7
  267. package/lib/session-roster.ts +43 -1
  268. package/lib/session-tool.ts +39 -22
  269. package/lib/stray-fields.ts +7 -2
  270. package/lib/tool-names.ts +5 -10
  271. package/lib/tui/README.md +29 -11
  272. package/lib/tui/chrome.ts +16 -15
  273. package/lib/tui/cursor.ts +18 -3
  274. package/lib/tui/glyphs.ts +11 -11
  275. package/lib/tui/render-cache.ts +29 -0
  276. package/lib/tui/tokens.ts +33 -2
  277. package/lib/tui/tool.ts +33 -4
  278. package/lib/web/README.md +21 -0
  279. package/lib/web/client-runtime.ts +27 -1
  280. package/lib/web/components.ts +5 -1
  281. package/lib/web/index.ts +1 -0
  282. package/lib/web/markdown.ts +83 -0
  283. package/lib/web/markup.ts +20 -2
  284. package/lib/web/runtime.ts +9 -10
  285. package/package.json +8 -2
  286. package/skills/init/SKILL.md +5 -5
  287. package/skills/next/SKILL.md +3 -5
  288. package/extensions/board/config.ts +0 -36
  289. package/extensions/board/seat.ts +0 -28
  290. package/lib/tui/index.ts +0 -34
  291. package/skills/project-docs/SKILL.md +0 -133
  292. package/skills/project-docs/references/audit.md +0 -131
  293. package/skills/project-docs/references/changelog.md +0 -105
  294. package/skills/project-docs/references/discovery.md +0 -127
  295. package/skills/project-docs/references/readme.md +0 -80
  296. package/skills/project-docs/references/release.md +0 -84
  297. package/skills/project-docs/references/roadmap.md +0 -93
  298. package/skills/project-docs/scripts/state.ts +0 -316
@@ -1,28 +0,0 @@
1
- /**
2
- * The seat: the name the page serves as, and the actor it is shown as.
3
- *
4
- * A page outlives the session that opened it — a `/resume`, a rename, or a fresh
5
- * session taking the page over would otherwise change who the page says it is. So the
6
- * page is a *seat* rather than a session: one fixed name, one fixed id derived from it,
7
- * and the same identity however many sessions have served it.
8
- *
9
- * The page writes nothing, so the id decides no ownership: it is what the page's own
10
- * roster and the `you` chip are read against, and it keeps a page's reads the same
11
- * across a handover. The board's tools write as the session — which is why the label is
12
- * shared with the session serving the page and the ids are not.
13
- */
14
-
15
- import type { Actor } from "../../lib/board/rules.ts";
16
- import { normalizeLabel } from "../../lib/session-label.ts";
17
-
18
- /** The name a repository's page always serves under, so the lead is a role and not a session. */
19
- export const DEFAULT_SEAT = "team-lead";
20
-
21
- /** The prefix of a page's actor id, so one is never mistaken for a session id. */
22
- export const SEAT_ID_PREFIX = "board:";
23
-
24
- /** The actor a page reads as: the seat, and an id derived from it. */
25
- export function pageActor(label: string = DEFAULT_SEAT): Actor {
26
- const seat = normalizeLabel(label, DEFAULT_SEAT);
27
- return { id: `${SEAT_ID_PREFIX}${seat.toLowerCase()}`, label: seat };
28
- }
package/lib/tui/index.ts DELETED
@@ -1,34 +0,0 @@
1
- /**
2
- * The Bytefly terminal design system: one kit for every interactive surface.
3
- *
4
- * Import from `lib/tui/index.ts` rather than a leaf module so the surface reads
5
- * as one system. The leaves: `tokens.ts` (semantic role -> theme token),
6
- * `glyphs.ts` (the shared glyph, separator, and status-key vocabulary),
7
- * `chrome.ts` (screen frame, hints, viewport, overlay), `cursor.ts` (list
8
- * scroll and navigation), `columns.ts` (width math), `rules.ts` (the rule
9
- * grammar), `rows.ts` (list rows, checkboxes, chips, empty states), `gauge.ts`
10
- * (the context gauge), `indent.ts` (the transcript block indent), and
11
- * `line-pane.ts` (the scrollable log/match pane), and
12
- * (the shared tool-transcript kit: call title, width-safe call line,
13
- * sanitized error, and the running timer), and `render-cache.ts` (the
14
- * per-instance line memo a derived component renders through).
15
- *
16
- * Value-only, like every `lib/` module: pure functions, constants, and classes,
17
- * with no module-level state.
18
- */
19
-
20
- export * from "./chrome.ts";
21
- export * from "./columns.ts";
22
- export * from "./confirm.ts";
23
- export * from "./cursor.ts";
24
- export * from "./dock-screen.ts";
25
- export * from "./gauge.ts";
26
- export * from "./glyphs.ts";
27
- export * from "./line-pane.ts";
28
- export * from "./indent.ts";
29
- export * from "./render-cache.ts";
30
- export * from "./rows.ts";
31
- export * from "./rules.ts";
32
- export * from "./status-controller.ts";
33
- export * from "./tokens.ts";
34
- export * from "./tool.ts";
@@ -1,133 +0,0 @@
1
- ---
2
- name: project-docs
3
- description: "Keep a project's documents true to its tree: a read-only audit of the front door, the roadmap, the contributor path, and the changelog against the code and against each other, then one mode per act that writes — record a changelog bullet in the same commit as the change, curate a release section from the project's own rules, delete a shipped roadmap item and renumber, and sync the README front door. Use when a doc claim looks stale, before a release, or when a change lands owing an entry; prioritisation stays with `next` and structure with `refactor`."
4
- compatibility: "Bun for scripts/state.ts; git for the roadmap and the audit."
5
- ---
6
-
7
- # Keep the docs true to the tree
8
-
9
- Goal: the documents a reader trusts — the front door, the plan of record, the record
10
- of what shipped, and the contributor path — so a claim the tree no longer meets is
11
- found, and each act that needs writing has one owner. This is a procedure, not a
12
- second policy: the project's instructions and release document win, and where they
13
- are silent this file says ask.
14
-
15
- A bare `/skill:project-docs` reads and reports. Nothing is written until a mode is
16
- named.
17
-
18
- ## Pick the mode
19
-
20
- | The words after `/skill:project-docs` | Mode | Owns | Writes | Follow |
21
- |---|---|---|---|---|
22
- | nothing | audit | every document, read-only | no | [`references/audit.md`](./references/audit.md) |
23
- | `changelog` | changelog | the unreleased window of the changelog | yes | [`references/changelog.md`](./references/changelog.md) |
24
- | `release <version>` | release | one version's section and link refs | yes | [`references/release.md`](./references/release.md) |
25
- | `roadmap` | roadmap | items, ids, and buckets | yes | [`references/roadmap.md`](./references/roadmap.md) |
26
- | `readme` | readme | the front door and its mirror | yes | [`references/readme.md`](./references/readme.md) |
27
- | anything else | refuse, and name the five | — | no | — |
28
-
29
- Audit is the default because the skill spans four documents: a bare invocation that
30
- writes would edit a document nobody asked about.
31
-
32
- ## Start here
33
-
34
- Read [`references/discovery.md`](./references/discovery.md) first, in every mode. It
35
- finds the project's documents, the version's single source, the changelog's local
36
- conventions, the roadmap's rules, the check command, and the guards by name. State
37
- that profile in one paragraph before writing anything; it is how a misread is caught
38
- in a line instead of in a diff.
39
-
40
- For the changelog's mechanical half, run the state script, resolved against this
41
- skill's own directory:
42
-
43
- ```bash
44
- bun <skill>/scripts/state.ts <project-root>
45
- ```
46
-
47
- It prints the changelog file it found, the last tag and the commits since it, the
48
- `[Unreleased]` categories with counts and line numbers, the empty and duplicate
49
- headings, the scope prefixes in use, and the link refs. That is the state; read the
50
- diffs for judgement, not for counting. When it finds no changelog, no repository, or no
51
- Bun to run it with, say so and fall back to discovery by hand. The git commands these
52
- references give are git's; use the project's VCS where it differs.
53
-
54
- ## Non-negotiables
55
-
56
- 1. **Discover, don't impose.** The project's document set, category spelling, scope
57
- prefix, bullet shape, item ids, bucket caps, and release procedure are the rules.
58
- State the profile in one paragraph, and ask when two sources disagree.
59
- 2. **One bullet per user-visible outcome**, in the same commit as the change. A
60
- feature and the bug it fixed before release are one bullet; two observable
61
- changes are two.
62
- 3. **A shipped item is deleted here, with its reason, never ticked.** A roadmap that
63
- keeps what already landed describes a tree that no longer exists.
64
- 4. **One id per thing, across every document.** A README row, a roadmap item, and a
65
- changelog entry that name the same feature use the same name. A mismatch is
66
- reported, never renamed.
67
- 5. **A judgement is not a finding.** Positioning, priority, dates, non-goals, and
68
- contribution policy are the maintainer's: list them and ask.
69
- 6. **One owner per artefact.** The changelog belongs here; what to do next belongs to
70
- the `next` skill; structure belongs to `refactor`.
71
-
72
- ## Modes
73
-
74
- - **Audit** — read-only, five faces: the tree against the docs, the docs against each
75
- other, the changelog's commit window, the roadmap's own ids and caps, and the front
76
- door's examples. Every finding names the mode that fixes it.
77
- - **Changelog** — one bullet under the project's category for one user-visible
78
- outcome, re-reading the file first. It never decides whether something has already
79
- shipped.
80
- - **Release** — only for a version the user named, and only after the project's
81
- release document has been read; everything after moving the entries follows it.
82
- - **Roadmap** — re-derived from the commits since the last tag rather than from the
83
- last tag: shipped items deleted, ids renumbered, every citation and link fixed.
84
- - **Readme** — the front door's catalog rows, counts, examples, and mirror, kept equal
85
- to the tree; deep detail stays in the project's own guides.
86
-
87
- ## Handover
88
-
89
- - **A changelog entry, an audit, or a release** is this skill: do not look for
90
- another one.
91
- - **What to do next** is `next`, where it is installed: it triages loose work and
92
- broken promises across the project, and its candidates are not a doc audit's findings.
93
- - **A structural change to the docs or the code** is `refactor`, where it is installed.
94
- - **Who may contribute, and how** is a decision for the maintainer: ask, and edit
95
- nothing until it is answered.
96
-
97
- ## Report
98
-
99
- Open with the profile in one paragraph, then:
100
-
101
- - **Stale** — the claim, `path:line`, the evidence in the tree, and the mode that
102
- fixes it.
103
- - **Missing** — a document, a row, an entry, or an item the project's own rules call
104
- for and the tree does not have.
105
- - **Suggested edit** — the diff or the exact replacement, for the mechanical items
106
- only, and never applied until the user says so.
107
- - **Needs a decision** — one line each: the question, and what it changes.
108
-
109
- Nothing found is a valid result, and the whole report may be empty. Say what was
110
- checked and stop; an audit that invents four entries to look thorough is worse than
111
- one that finds nothing.
112
-
113
- ## Quality gate
114
-
115
- - The project's own check passes, including any guard on the release window, the
116
- documentation's parity, or the roadmap's ids.
117
- - Every edit names the document and the line, and every bullet names a scope in the
118
- project's spelling and a user outcome.
119
- - No judgement is smuggled into a diff, and the changelog entry is in the change's
120
- own commit.
121
-
122
- ## Stop conditions
123
-
124
- - The project has only a README, no roadmap, and no changelog: say so. Whether to
125
- adopt one is the maintainer's decision, not an edit.
126
- - The changelog is generated — by `semantic-release`, `changesets`, `git-cliff`, or a
127
- step in the release workflow: the entry lands upstream, in the commit message, a
128
- changeset fragment, or the generator's config. Never hand-edit the file.
129
- - Two sources disagree — two changelogs, a version in two places, a roadmap item the
130
- changelog contradicts: ask instead of averaging them.
131
- - The change would reverse a documented non-goal: it is a decision, and the item is
132
- listed rather than written.
133
- - The request is really triage or a refactor: name the sibling skill and stop.
@@ -1,131 +0,0 @@
1
- # Audit
2
-
3
- Read-only. The audit answers one question per claim: is this still true, and if not,
4
- which mode fixes it? It never edits — not even a typo, not even "while we are here".
5
- If the user asks for the fixes, finish the report first, then enter the mode it names.
6
-
7
- Read [`discovery.md`](./discovery.md) first and open the report with the profile. The
8
- five faces below are a reading order, not a checklist: a face with no evidence
9
- produces no findings.
10
-
11
- ## 1. The tree against the docs
12
-
13
- The claims a reader acts on: a catalog row, a limit stated in a package README, a
14
- default in a configuration table, a roadmap item, a non-goal, a "supported format"
15
- list. For each, find the code that does it — the registration, the branch, the config
16
- default — and name where it disagrees.
17
-
18
- | Where the claim lives | What falsifies it |
19
- |---|---|
20
- | A catalog row or feature bullet | The tool, command, flag, or route no longer registers |
21
- | A limitations section | The gap was closed, or widened, and the text did not move |
22
- | A configuration default | The loader's default differs from the table |
23
- | A roadmap item | The tree already does it (see face 4) |
24
- | A non-goal | The changelog records the thing being shipped anyway |
25
-
26
- ## 2. The docs against each other
27
-
28
- - **Counts** — a number a doc states about the code (modules, tools, extensions,
29
- screens) belongs to the tree. A project that derives it in a test has the count; one
30
- that does not is a finding, and the fix is a guard, not a number.
31
- - **Catalog rows** — every row names a thing that exists; every existing thing the
32
- catalog claims to cover has a row. Both directions.
33
- - **Cross-reference ids** — the same feature named in a front-door row, a roadmap item,
34
- and a changelog entry. Report a mismatch; never rename one side to match.
35
- - **The version** — the source of truth, the newest dated changelog heading, the tag,
36
- and any badge, badge-adjacent prose, or install instruction that repeats it.
37
- - **The mirror** — a translated README carries the original's sections, table rows, and
38
- links. A row that exists in one and not the other is a finding even when the prose is
39
- deliberately translated.
40
- - **The contributor path** — the commands `CONTRIBUTING.md` tells a newcomer to run,
41
- against the manifest's `scripts` and the CI workflow's steps. A command the docs promise
42
- and the manifest does not define is the one stale claim a new contributor hits first,
43
- and a step CI runs that the docs never mention is the one they skip.
44
-
45
- ## 3. The changelog's commit window
46
-
47
- Run `scripts/state.ts` (see the skill's *Start here*). It gives the file, the last tag,
48
- the commits since it, the `[Unreleased]` categories, and the scopes in use.
49
-
50
- When discovery says a tool generates the file, the window's entries live in that tool's
51
- input — the changeset queue, the commit-message convention — so audit those, and report
52
- a missing fragment rather than a missing bullet.
53
-
54
- Read every commit it lists: `git show <sha>` for the diff, or the pull request when the
55
- repository squashes. A subject line is not enough — `fix bug` and `wip` hide
56
- user-visible changes, and `feat: rewrite the config loader` is often invisible to users.
57
- For each commit, decide whether a user can observe it, which bullet covers it, whether
58
- that bullet's scope is right, and whether a reader of the bullet alone would know what
59
- changed for them.
60
-
61
- | Commit | User-visible | Evidence | Existing entry | Action |
62
- |---|---|---|---|---|
63
- | `3f19a02` | yes | `src/load.ts:42` now rejects an unknown key | — | add |
64
- | `b81c4de` | no | test-only | — | leave |
65
- | `0ad9f12` | yes | retry limit 3 → 5 | `Changed`: "`api`: retries are now bounded" | update: the bullet never names the limit |
66
- | `77e0a1e` | unclear | touches the public `--json` shape | — | ask |
67
-
68
- `Action` is one of **add** (user-visible, no bullet), **update** (a bullet exists and is
69
- wrong, unscopeable, or too vague to act on), **leave** (covered, internal, or recorded
70
- under an older release), or **ask** (the outcome depends on intent the diff cannot show).
71
-
72
- Report separately:
73
-
74
- - Duplicate `##` or `###` headings — some tools render the second as its own section,
75
- and a reader sees half the entries.
76
- - An empty category heading, or a heading a release guard rejects.
77
- - An `[Unreleased]` section that is missing or empty while the window contains
78
- user-visible changes.
79
- - An entry for something already shipped under a dated heading: the same outcome twice,
80
- which reads as a second change.
81
- - A stale link reference pointing at an older tag than the newest dated heading — where
82
- the file uses link references at all. A generated or non-Keep-a-Changelog file may have
83
- none, and the state script reports that absence as a missing reference without it being
84
- a defect.
85
-
86
- ## 4. The roadmap's own ids and caps
87
-
88
- Re-derive the window before judging an item: `git log --oneline <last-tag>..HEAD` plus
89
- the changelog's newest dated heading. A roadmap describes the tree, so work that landed
90
- but has not shipped is already part of what it should describe.
91
-
92
- - An item the tree already does is a deletion, with its reason recorded where the item
93
- was.
94
- - An id used twice, skipped in a sequence, or cited from nowhere the file defines.
95
- - A bucket over the cap the file states; a bucket that keeps growing stops being a
96
- priority.
97
- - A ledger row whose items all closed, or an open item with no ledger row.
98
- - A relative link or a `path:line` citation that no longer resolves.
99
-
100
- ## 5. The front door's examples
101
-
102
- - The quickstart command, run as written. A command that no longer exists is a stale
103
- promise, and it is the most expensive one because it is the reader's first step.
104
- - An example that imports, configures, or calls something the code no longer accepts.
105
- - A screenshot or a recording that shows a surface that has since changed.
106
- - A link to a guide that moved, a section anchor that was renamed, or a badge whose
107
- target is gone.
108
-
109
- ## Report
110
-
111
- Open with the profile, then the four sections from the skill: **Stale**, **Missing**,
112
- **Suggested edit**, **Needs a decision**. Every stale finding carries the document,
113
- `path:line`, the evidence in the tree, and the mode that fixes it. Group by the mode
114
- when there are more than a handful, so the user can act one mode at a time.
115
-
116
- Nothing found is a valid result for the whole audit or for any face. Say what was
117
- checked — the files read, the commands run, the commits examined — and stop. An audit
118
- that invents findings to look thorough is worse than one that reports none.
119
-
120
- ## What the audit cannot see
121
-
122
- Name these in a closing line instead of guessing:
123
-
124
- - Whether a change is user-visible to someone the diff does not show — a default that
125
- only matters on one platform, a behavior the docs promised and the tests never
126
- covered.
127
- - Whether a commit message describes what the code does; only the diff does.
128
- - Whether an item shipped: a merged change to a document is not a release, and only the
129
- maintainer knows whether the front door's promise is meant to hold today or next
130
- version.
131
- - Whether a roadmap priority is still right, and whether a non-goal still stands.
@@ -1,105 +0,0 @@
1
- # Record one bullet
2
-
3
- This mode writes one thing: a bullet in the changelog for a change that just landed.
4
- It does not decide whether something shipped, and it does not curate a release — that
5
- is the `release` mode, and only for a version the user named.
6
-
7
- Read [`discovery.md`](./discovery.md) first for the file, the categories, their order,
8
- the scope spelling, and whether the entry ships with the change. Where a tool owns the
9
- file — `semantic-release`, `changesets`, `git-cliff`, or a step in the release workflow —
10
- this mode does not write it: the entry belongs upstream, in the commit message's
11
- convention, a changeset fragment, or the generator's config.
12
-
13
- ## Where the bullet goes
14
-
15
- - Re-read the changelog before editing: another session, another contributor, or the
16
- user may have written since the state script ran.
17
- - Under `[Unreleased]`, in the category the project uses for this kind of change, in
18
- the file's own order and spelling. Never create a second heading for a category that
19
- already exists in the section.
20
- - When the file keeps no `[Unreleased]` section, ask where the change is recorded — the
21
- preamble decides, and a project that writes entries only at release has a different
22
- procedure.
23
- - Insert without disturbing any other bullet, keep the file's wrap column, and write it
24
- in the same commit as the change it describes.
25
-
26
- ## Does it qualify
27
-
28
- It qualifies when a user can observe it: behavior, a CLI or tool or command surface, a
29
- config default, packaging and dependencies a user installs, security, or a documented
30
- promise that is now true or false.
31
-
32
- It does not qualify when only the implementation moved: an internal refactor, a rename
33
- with no behavior change, a test, formatting, a comment, a dependency bump with no
34
- behavior change, or a typo fixed in the changelog itself.
35
-
36
- When a change is both — a refactor that also fixes a rounding bug — the bullet is the
37
- rounding bug, and the refactor is not mentioned.
38
-
39
- ## One outcome, one bullet
40
-
41
- - A feature and the bug it fixed before release are one bullet: users never saw the
42
- broken version.
43
- - Two observable changes are two bullets, even in one commit.
44
- - Two commits that produce one outcome are one bullet, written where the outcome became
45
- true.
46
- - A breaking change is its own bullet with the required action; do not bury it in a
47
- feature's sentence.
48
-
49
- When the outcome is unclear, ask. Reading the diff tells you what changed; only the
50
- author knows what a user will notice.
51
-
52
- ## The shape
53
-
54
- Follow the file's newest released section. Where the project states nothing, the shape
55
- is one bullet that leads with the scope in backticks, a colon, then what the user can
56
- now do:
57
-
58
- ```text
59
- - `billing`: invoices show tax as a separate line. Amounts that used to be bundled
60
- into `total` are summed on the printed total, so an invoice stored by an older
61
- release still reconciles.
62
- - `cli`: `--legacy-auth` is no longer read; run `mytool migrate auth` first.
63
- ```
64
-
65
- - **Scope**: the area a user would name — an extension, package, module, or subsystem,
66
- in the project's own spelling. Never a file path, a function, or a ticket number. A
67
- bullet with no scope is a defect where the project uses scopes, and noise where it
68
- does not.
69
- - **Outcome first**: what is different for the user, then the mechanism if it matters,
70
- then any action they must take.
71
- - **Length**: a bullet may run to several sentences when the outcome needs them — what
72
- the user sees, what it replaced, what to do about it. Brevity is not the goal;
73
- vagueness is the defect.
74
- - **Voice**: match the file. Most changelogs are present tense and third person; do not
75
- switch to marketing, and do not add praise for the change.
76
- - **Wrap**: match the file's column, usually near 80, and let one bullet be one
77
- paragraph.
78
-
79
- ## What does not belong
80
-
81
- File names and paths, internal helper names, test counts and coverage, commit hashes
82
- and pull-request numbers as the subject (a link at the end is fine where the file does
83
- it), and empty words such as "various", "improvements", "cleanup", "refactor", "misc".
84
- A reader who cannot tell from the bullet whether the change affects them has been told
85
- nothing.
86
-
87
- ## The two failure modes
88
-
89
- ```text
90
- - `billing`: refactored invoice rendering and added tests.
91
- - `misc`: improvements.
92
- ```
93
-
94
- The first names no outcome and reports the implementation. The second names no scope,
95
- no outcome, and would fit any release.
96
-
97
- ```text
98
- - `api`: `POST /v2/charge` now refuses an amount with more than two decimals
99
- instead of truncating it, so a client that relied on the old rounding sees a
100
- `422` with `code: "amount_precision"`. Truncation moved to `POST /v2/charge/draft`,
101
- which is what the old behavior should have been.
102
- ```
103
-
104
- Three sentences, one outcome, one scope, and the migration named. Long is fine when
105
- each sentence tells the reader something they must know.
@@ -1,127 +0,0 @@
1
- # Discover the project's documents
2
-
3
- A document is a convention before it is a file: which documents exist, what each one
4
- promises, how a version is spelled, and when an entry is written are all things a
5
- project chose. Read what it chose. Do not import a template where the project says
6
- something else, and do not average two sources — when they disagree, ask.
7
-
8
- Find these five things, in this order. The first one locates the rest.
9
-
10
- ## 1. The document set
11
-
12
- The documents this skill looks for, in the order it looks, and where a project keeps
13
- them. A project that has only some of them is normal: the skill maintains what exists,
14
- and whether to adopt a missing one is the maintainer's decision rather than an edit.
15
-
16
- - **The front door** — `README.md` first, then `README.rst`, `README`, or `docs/README.md`.
17
- A mirror (`README.zh-CN.md`, `README.ja.md`) is part of the front door, not a
18
- separate document: it carries the same sections, table rows, and links.
19
- - **The plan of record** — `ROADMAP.md`, then `ROADMAP`, `docs/roadmap.md`, a
20
- `ROADMAP` section in the front door, or an issue tracker label the project's docs
21
- name. A project with none is maintained from the changelog and the tree alone; say so.
22
- - **The record of what shipped** — `CHANGELOG.md`, then `CHANGELOG`, `CHANGES.md`,
23
- `HISTORY.md`, `NEWS.md`, `docs/CHANGELOG.md`, `docs/changelog.md`. The bundled script
24
- takes the first name in that order. Several changelogs belonging to several packages
25
- are a scope question, not a choice: ask which package is in scope, and never treat one
26
- package's file as a copy of another's.
27
- - **The contributor path** — `CONTRIBUTING.md`, then `.github/CONTRIBUTING.md`,
28
- `docs/contributing.md`, and the instruction file the project's agent reads
29
- (`AGENTS.md`, `CLAUDE.md`), which usually states the rules the other three obey.
30
-
31
- Deep guides (`docs/`, `documentation/`) are where detail belongs. Their existence is
32
- the reason the front door can stay short: it summarizes and links, and the skill must
33
- not move a guide's content up into it, or copy the front door's catalog down.
34
-
35
- These rules are written in Markdown's vocabulary because most projects write their docs
36
- in it. Read the format the project actually uses — reStructuredText, AsciiDoc, plain
37
- text — and fix it in that format: a heading anchor, a link reference, and a fenced
38
- example are spelled differently in each, and converting a document is not this skill's
39
- job.
40
-
41
- ## 2. The version's single source
42
-
43
- One file decides the version: `package.json`, `pyproject.toml`, `Cargo.toml`, a
44
- `VERSION` file, or a `version` module. Everything else repeats it — the newest dated
45
- changelog heading, a tag, a badge, a lockfile. Read the source and the repeats
46
- together; a version that disagrees in one place is the most common stale claim a
47
- release leaves behind.
48
-
49
- ## 3. The changelog's local conventions
50
-
51
- - **Who writes the file** — a preamble that says "generated", a `.changeset/` or
52
- `.changes/` directory, a release workflow step that writes the changelog, or a
53
- generator named in the manifest or its config: `semantic-release`, `release-please`,
54
- `changesets`, `git-cliff`, `goreleaser`, `cargo-release`, `standard-version`. Where a
55
- tool owns the file, the entry is written upstream — in the commit message's
56
- convention, in a changeset fragment, or in the generator's config — and never by hand.
57
- - **The preamble** — whether it names Keep a Changelog, Semantic Versioning, a
58
- different convention, and whether unreleased entries are kept in the file at all.
59
- - **The category names and their order** — Keep a Changelog's set is `Added`,
60
- `Changed`, `Deprecated`, `Removed`, `Fixed`, `Security`, in that order, and a
61
- project may use a subset, add its own, or reorder them. Copy the spelling exactly:
62
- `Fix` is not `Fixed`.
63
- - **The bullet's shape** — read the newest *released* section, not the first one. Note
64
- the scope prefix (`- \`core\`: …`, `- [core] …`, or none), whether a bullet may run
65
- several sentences, the wrap column, and whether backticks or bold carry the scope.
66
- - **Whether the entry ships with the change** — `CONTRIBUTING.md`, the instruction
67
- file, and a pull-request template say it in one line. Silence is not permission to
68
- defer: ask, because a changelog maintained per release is a different procedure.
69
- - **The release procedure** — a release document outranks everything here:
70
- `docs/release.md`, `RELEASING.md`, `CONTRIBUTING.md`'s release section, a
71
- `publish.yml` job, or a `release` script in the manifest. Read it for the link-ref
72
- update, the tag format, and the push and publish order.
73
-
74
- ## 4. The roadmap's rules
75
-
76
- - **The item form** — how an item is written and whether it carries an id: `**P1 — …**`,
77
- `- [ ] …`, `R1: …`, a bare heading. Ids are what a citation elsewhere points at.
78
- - **The buckets and their caps** — horizon names (`Now` / `Next` / `Later`, or
79
- quarters), and any limit the file states on how many items a bucket holds.
80
- - **The ledger, if there is one** — the table tying a promise in the front door to the
81
- items that keep it; a row is open while any of its items are.
82
- - **What happens to a shipped item** — the stated rule, usually one line: delete it and
83
- record the reason, or renumber the rest. Never tick it and leave it, unless the file
84
- says to.
85
- - **The non-goals** — the "deliberately left thin" or "won't do" list, with the reason
86
- each carries. Reversing one is a decision, not an edit.
87
-
88
- ## 5. The check and the guards
89
-
90
- The project's check command (`bun run check`, `npm test`, `make check`, a CI workflow)
91
- is the finish line for any edit. Find the guards on these documents by name, because a
92
- guard states the rule better than a summary of it: `release.test.ts`,
93
- `changelog.test.ts`, `docs-parity.test.ts`, `roadmap.test.ts`, a link checker, or a CI
94
- step that compares a count in the docs with the tree.
95
-
96
- Quote a guard's name and what it holds; do not restate its rule. Run the guard
97
- directly while iterating — a failing guard names the rule you just broke.
98
-
99
- ## State the profile
100
-
101
- Before editing, write one short paragraph: the documents found, the version's source,
102
- the changelog's categories and scope spelling, the roadmap's item form and caps, the
103
- check command, and the guards. It is how the user catches a misread in one line
104
- instead of in a diff. Do not invent a rule the project never stated; ask instead.
105
-
106
- ## A worked example
107
-
108
- When you are in this repository, the answers are already written down:
109
-
110
- - `README.md` and `README.zh-CN.md` — the front door and its mirror; `test/docs-parity.test.ts`
111
- holds the two to the same headings, table rows, and links.
112
- - `CHANGELOG.md` — Keep a Changelog preamble, categories in the standard order,
113
- `[Unreleased]` kept in the file, scope in backticks followed by a colon.
114
- - `ROADMAP.md` — items as `**P1 — …**`, `Now` and `Next` capped at ten, a promise
115
- ledger, and the rule that a shipped item is deleted with its reason;
116
- `test/roadmap.test.ts` pins the ids, links, and caps, and cannot see that an item
117
- has shipped.
118
- - `CONTRIBUTING.md` and `AGENTS.md` — the entry lands in the same commit as the
119
- change, and a behavior change also updates the catalog table in both entry READMEs
120
- and the relevant guide.
121
- - `docs/development.md` — the normative release procedure.
122
- - `test/release.test.ts` — the guard on subsection names, order, emptiness, and the
123
- version pin against the newest tag.
124
- - `bun run check` — the finish line; `bun test test/roadmap.test.ts` for one guard alone.
125
-
126
- The paths are named, not linked: a skill is installed into projects that do not
127
- contain them, so a link would point nowhere from the place it is read.
@@ -1,80 +0,0 @@
1
- # Readme
2
-
3
- The front door is the only document a reader is guaranteed to see, so it carries two
4
- burdens at once: it must be *enough* on its own, and it must not become the manual. This
5
- mode keeps it true to the tree without letting it grow.
6
-
7
- Read [`discovery.md`](./discovery.md) first for the file, its mirror, and the guides it
8
- links to.
9
-
10
- ## What belongs on the front door
11
-
12
- - What the thing is, in one or two sentences a stranger can act on.
13
- - Install, and the first command that proves the install worked.
14
- - The catalog: one row per capability, grouped by what the reader is trying to do.
15
- - Configuration that a reader must choose before the first run, and where the rest
16
- lives.
17
- - Links onward to the guides, and the license.
18
-
19
- What does not belong: a tool's parameter table, an exhaustive options list, an internal
20
- architecture, or a tutorial. When a row needs three sentences of mechanism, the
21
- mechanism belongs in a guide and the row links to it — do not copy the guide up, and do
22
- not let the row become a summary of a summary.
23
-
24
- ## Rows and counts belong to the tree
25
-
26
- Where the project has a catalog of capabilities, each row follows the tree:
27
- - Every row names something that exists and is spelled the way the code spells it: the
28
- tool, the command, the flag, the file. A renamed tool with an unchanged row is a
29
- broken promise to the reader who types it.
30
- - Every count the page states — extensions, tools, skills, themes, formats — is read
31
- from the tree. A project with a guard that derives it has the number already: change
32
- the tree, or the guard, never the number in the prose.
33
- - A capability with no row is invisible; a row with no capability is a lie. Both
34
- directions, in the same pass.
35
-
36
- ## Examples must run
37
-
38
- Run the quickstart as written, in a clean directory, before editing anything else on the
39
- page. The first command is the most expensive promise on the page: a broken one costs
40
- the reader the whole document. Then check the worked example — an import, a
41
- configuration snippet, a call — against the current surface, and prefer the shortest
42
- form that still runs.
43
-
44
- ## The mirror, where the project has one
45
-
46
- A translated front door is the same document in another language: the same sections,
47
- the same table rows in the same order, the same relative links. Prose is translated;
48
- structure is not. A project with one language has no mirror to check, and adding one is
49
- not this mode's job. A row added to one and not the other is a finding, and the count on
50
- both sides is the tree's.
51
-
52
- ## Screenshots and assets
53
-
54
- An image is a claim about a surface. Recapture it when the surface changed — and only
55
- then, because a stale frame is worse than no frame and a fresh frame is expensive to
56
- produce. Check that the alt text describes what the frame now shows, that the image is
57
- referenced by a relative path, and that an image whose feature was removed is deleted
58
- rather than left unreferenced.
59
-
60
- ## Report
61
-
62
- Say which rows, counts, examples, and images moved, and which claims you could not check
63
- without running the product. A front door that matches the tree already is a valid
64
- result; say what you verified — the command you ran, the counts you derived — and stop.
65
-
66
- ## In this repository
67
-
68
- - `README.md` is the front door and `README.zh-CN.md` mirrors it section for section;
69
- `test/docs-parity.test.ts` holds the two to the same headings, table rows, and links,
70
- and derives the catalog's counts from the tree.
71
- - `test/extension-load.test.ts` pins every count the pages state — extensions, tools,
72
- skills, themes — against what actually loads and ships, and requires a row in both
73
- entry READMEs for every packaged skill.
74
- - `assets/` holds the frames the pages show; `bun run screenshots` recaptures one, and a
75
- frame is only recaptured when its surface changed.
76
- - Deep detail lives in `docs/extensions/<name>.md`, `lib/README.md`, and `docs/`; the
77
- front door links there and does not restate them.
78
-
79
- The paths are named, not linked: a skill is installed into projects that do not
80
- contain them, so a link would point nowhere from the place it is read.