@gavin-hu/my-pi-agent 0.18.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -44
- package/README.zh-CN.md +46 -41
- package/docs/extensions/README.md +34 -0
- package/docs/extensions/board.md +344 -0
- package/{extensions/bytefly/README.md → docs/extensions/bytefly.md} +446 -404
- package/{extensions/check/README.md → docs/extensions/check.md} +83 -68
- package/{extensions/context/README.md → docs/extensions/context.md} +40 -23
- package/docs/extensions/file-browse.md +554 -0
- package/{extensions/file-open/README.md → docs/extensions/file-open.md} +31 -23
- package/{extensions/file-read/README.md → docs/extensions/file-read.md} +47 -55
- package/{extensions/goal/README.md → docs/extensions/goal.md} +115 -131
- package/{extensions/job/README.md → docs/extensions/job.md} +61 -50
- package/{extensions/memory/README.md → docs/extensions/memory.md} +71 -60
- package/{extensions/plan/README.md → docs/extensions/plan.md} +390 -317
- package/{extensions/question/README.md → docs/extensions/question.md} +54 -31
- package/{extensions/rewind/README.md → docs/extensions/rewind.md} +115 -122
- package/docs/extensions/session-bus.md +285 -0
- package/{extensions/subagent/README.md → docs/extensions/subagent.md} +165 -118
- package/docs/extensions/team.md +226 -0
- package/{extensions/todo/README.md → docs/extensions/todo.md} +85 -88
- package/{extensions/watch/README.md → docs/extensions/watch.md} +54 -36
- package/{extensions/web-access/README.md → docs/extensions/web-access.md} +93 -50
- package/{extensions/wechat/README.md → docs/extensions/wechat.md} +258 -162
- package/{extensions/worktree/README.md → docs/extensions/worktree.md} +115 -72
- package/extensions/board/commands.ts +87 -0
- package/extensions/board/config.ts +36 -0
- package/extensions/board/format.ts +72 -0
- package/extensions/board/index.ts +40 -0
- package/extensions/board/input.ts +54 -0
- package/extensions/board/join.ts +42 -0
- package/extensions/board/page.ts +312 -0
- package/extensions/board/result.ts +99 -0
- package/extensions/board/rows.ts +48 -0
- package/extensions/board/schema.ts +75 -0
- package/extensions/board/seat.ts +29 -0
- package/extensions/board/snapshot.ts +41 -0
- package/extensions/board/tools.ts +279 -0
- package/extensions/board/transport/router.ts +172 -0
- package/extensions/board/transport/server.ts +149 -0
- package/extensions/board/types.ts +54 -0
- package/extensions/board/view/actions.ts +306 -0
- package/extensions/board/view/client.ts +41 -0
- package/extensions/board/view/keys.ts +121 -0
- package/extensions/board/view/live.ts +397 -0
- package/extensions/board/view/page.ts +158 -0
- package/extensions/board/view/render.ts +496 -0
- package/extensions/board/view/styles.ts +211 -0
- package/extensions/board/view/team.ts +305 -0
- package/extensions/board/writes.ts +99 -0
- package/extensions/bytefly/panel/commands.ts +40 -7
- package/extensions/bytefly/panel/settings-runtime.ts +0 -6
- package/extensions/bytefly/panel/settings.ts +3 -20
- package/extensions/bytefly/panel/tui/settings-view.ts +1 -1
- package/extensions/bytefly/picker/discovery.ts +0 -2
- package/extensions/bytefly/picker/types.ts +0 -2
- package/extensions/bytefly/update/check.ts +39 -0
- package/extensions/bytefly/update/format.ts +15 -0
- package/extensions/bytefly/update/register.ts +73 -34
- package/extensions/bytefly/update/state.ts +6 -3
- package/extensions/context/tui.ts +1 -1
- package/extensions/file-browse/{config.ts → config/config.ts} +1 -1
- package/extensions/file-browse/{files.ts → files/files.ts} +1 -14
- package/extensions/file-browse/{paths.ts → files/paths.ts} +1 -1
- package/extensions/file-browse/{git.ts → git/git.ts} +10 -3
- package/extensions/file-browse/index.ts +4 -4
- package/extensions/file-browse/{live.ts → live/live.ts} +20 -69
- package/extensions/file-browse/{router.ts → transport/router.ts} +21 -15
- package/extensions/file-browse/transport/server.ts +110 -0
- package/extensions/file-browse/{chrome.ts → view/chrome.ts} +4 -4
- package/extensions/file-browse/{client.ts → view/client.ts} +1 -1
- package/extensions/file-browse/{diff-html.ts → view/diff-html.ts} +3 -3
- package/extensions/file-browse/{html.ts → view/html.ts} +14 -12
- package/extensions/file-browse/{icons.ts → view/icons.ts} +1 -1
- package/extensions/file-browse/{markdown.ts → view/markdown.ts} +7 -7
- package/extensions/file-browse/{raw-html.ts → view/raw-html.ts} +1 -1
- package/extensions/file-browse/{styles.ts → view/styles.ts} +29 -5
- package/extensions/file-browse/{tree.ts → view/tree.ts} +1 -1
- package/extensions/file-browse/{urls.ts → view/urls.ts} +1 -1
- package/extensions/file-read/schema.ts +2 -1
- package/extensions/memory/store.ts +12 -5
- package/extensions/plan/blocks.ts +23 -2
- package/extensions/plan/commands.ts +21 -16
- package/extensions/plan/feedback.ts +147 -38
- package/extensions/plan/index.ts +6 -4
- package/extensions/plan/plan-index.ts +43 -9
- package/extensions/plan/plan-text.ts +33 -23
- package/extensions/plan/plans.ts +8 -11
- package/extensions/plan/policy.ts +20 -12
- package/extensions/plan/review.ts +3 -27
- package/extensions/plan/runtime.ts +21 -9
- package/extensions/plan/sections.ts +112 -0
- package/extensions/plan/steps.ts +3 -22
- package/extensions/plan/tools/exit.ts +11 -95
- package/extensions/plan/tui.ts +5 -34
- package/extensions/plan/types.ts +0 -8
- package/extensions/plan/web-client.ts +1 -1
- package/extensions/plan/web-page.ts +0 -7
- package/extensions/plan/web-router.ts +3 -57
- package/extensions/plan/web-share-session.ts +24 -30
- package/extensions/plan/web-streams.ts +14 -14
- package/extensions/plan/web-tokens.ts +2 -2
- package/extensions/plan/web.ts +66 -120
- package/extensions/rewind/{commands.ts → commands/commands.ts} +5 -5
- package/extensions/rewind/{review.ts → commands/review.ts} +13 -13
- package/extensions/rewind/{rewind.ts → commands/rewind.ts} +6 -6
- package/extensions/rewind/{config.ts → config/config.ts} +1 -1
- package/extensions/rewind/index.ts +3 -3
- package/extensions/rewind/{policy.ts → state/policy.ts} +4 -4
- package/extensions/rewind/{runtime.ts → state/runtime.ts} +11 -11
- package/extensions/rewind/{snapshot-run.ts → state/snapshot-run.ts} +1 -1
- package/extensions/rewind/{timeline.ts → state/timeline.ts} +2 -2
- package/extensions/rewind/{format.ts → text/format.ts} +3 -3
- package/extensions/rewind/{git.ts → transport/git.ts} +2 -2
- package/extensions/rewind/{restore.ts → transport/restore.ts} +2 -2
- package/extensions/rewind/{snapshot.ts → transport/snapshot.ts} +1 -1
- package/extensions/rewind/{store.ts → transport/store.ts} +1 -1
- package/extensions/rewind/{checklist.ts → view/checklist.ts} +6 -6
- package/extensions/rewind/{hunk-picker.ts → view/hunk-picker.ts} +8 -8
- package/extensions/rewind/{path-picker.ts → view/path-picker.ts} +7 -7
- package/extensions/rewind/{review-tui.ts → view/review-tui.ts} +11 -11
- package/extensions/rewind/{rewind-tui.ts → view/rewind-tui.ts} +17 -11
- package/extensions/rewind/{status.ts → view/status.ts} +4 -4
- package/extensions/session-bus/commands.ts +17 -69
- package/extensions/session-bus/format.ts +22 -45
- package/extensions/session-bus/index.ts +13 -7
- package/extensions/session-bus/join-request.ts +40 -0
- package/extensions/session-bus/mail-watch.ts +134 -0
- package/extensions/session-bus/notice.ts +32 -4
- package/{lib/claims → extensions/session-bus}/overlap.ts +11 -18
- package/extensions/session-bus/protocol.ts +19 -49
- package/extensions/session-bus/resolve.ts +67 -0
- package/extensions/session-bus/result.ts +16 -51
- package/extensions/session-bus/rows.ts +4 -2
- package/extensions/session-bus/runtime.ts +129 -238
- package/extensions/session-bus/store.ts +42 -6
- package/extensions/session-bus/tools.ts +31 -66
- package/extensions/session-bus/tui.ts +4 -4
- package/extensions/session-bus/types.ts +13 -13
- package/extensions/subagent/agents.ts +9 -8
- package/extensions/subagent/invocation.ts +4 -2
- package/extensions/team/commands.ts +112 -0
- package/extensions/team/dispatch.ts +133 -0
- package/extensions/team/format.ts +105 -0
- package/extensions/team/index.ts +33 -0
- package/extensions/team/schema.ts +29 -0
- package/extensions/team/tools.ts +246 -0
- package/extensions/team/types.ts +48 -0
- package/extensions/web-access/fetch/page.ts +4 -1
- package/extensions/web-access/fetch/structured.ts +447 -0
- package/extensions/web-access/fetch/tool.ts +2 -1
- package/extensions/web-access/search/tool.ts +2 -1
- package/extensions/wechat/bridge.ts +76 -92
- package/extensions/wechat/{commands.ts → commands/commands.ts} +26 -18
- package/extensions/wechat/{doctor.ts → commands/doctor.ts} +5 -5
- package/extensions/wechat/{history.ts → commands/history.ts} +1 -1
- package/extensions/wechat/{login.ts → commands/login.ts} +3 -3
- package/extensions/wechat/{slash.ts → commands/slash.ts} +38 -2
- package/extensions/wechat/dialog/channels.ts +136 -0
- package/extensions/wechat/{interaction.ts → dialog/interaction.ts} +37 -37
- package/extensions/wechat/{prompt.ts → dialog/prompt.ts} +2 -2
- package/extensions/wechat/{remote-ui.ts → dialog/remote-ui.ts} +1 -1
- package/extensions/wechat/index.ts +10 -10
- package/extensions/wechat/{admission.ts → peer/admission.ts} +2 -2
- package/extensions/wechat/{peer-session.ts → peer/peer-session.ts} +2 -2
- package/extensions/wechat/{peer-worker.ts → peer/peer-worker.ts} +100 -22
- package/extensions/wechat/{presence.ts → peer/presence.ts} +8 -7
- package/extensions/wechat/{reply-pipeline.ts → peer/reply-pipeline.ts} +1 -1
- package/extensions/wechat/{credentials.ts → state/credentials.ts} +2 -2
- package/extensions/wechat/{state.ts → state/state.ts} +14 -2
- package/extensions/wechat/{format.ts → text/format.ts} +3 -3
- package/extensions/wechat/{notices.ts → text/notices.ts} +8 -0
- package/extensions/wechat/tools.ts +29 -12
- package/extensions/wechat/{client.ts → transport/client.ts} +26 -2
- package/extensions/wechat/{deliver.ts → transport/deliver.ts} +72 -28
- package/extensions/wechat/{inbound.ts → transport/inbound.ts} +5 -5
- package/extensions/wechat/{media.ts → transport/media.ts} +11 -5
- package/extensions/wechat/transport/outbound.ts +142 -0
- package/extensions/wechat/{poll.ts → transport/poll.ts} +3 -3
- package/extensions/wechat/types.ts +10 -1
- package/extensions/wechat/{login-screen.ts → view/login-screen.ts} +4 -4
- package/extensions/wechat/{status-screen.ts → view/status-screen.ts} +31 -26
- package/extensions/worktree/guard.ts +3 -5
- package/lib/README.md +8 -6
- package/lib/board/card.ts +290 -0
- package/lib/board/links.ts +117 -0
- package/lib/board/page-pointer.ts +256 -0
- package/lib/board/round-text.ts +72 -0
- package/lib/board/round.ts +89 -0
- package/lib/board/rules.ts +304 -0
- package/lib/board/session.ts +105 -0
- package/lib/board/store.ts +310 -0
- package/lib/board/view.ts +150 -0
- package/lib/errors.ts +12 -4
- package/lib/format.ts +13 -0
- package/lib/http/guard.ts +112 -0
- package/lib/http/index.ts +16 -5
- package/lib/http/serve.ts +234 -0
- package/lib/http/server.ts +12 -10
- package/lib/http/sink.ts +110 -0
- package/lib/http/token.ts +38 -0
- package/lib/policy.ts +12 -2
- package/lib/requirements.ts +6 -7
- package/lib/session-label.ts +64 -0
- package/lib/session-roster.ts +130 -0
- package/lib/session-tool.ts +184 -0
- package/lib/tool-names.ts +25 -2
- package/lib/tui/glyphs.ts +2 -0
- package/lib/web/README.md +5 -2
- package/lib/web/components.ts +5 -0
- package/lib/web/runtime.ts +7 -1
- package/lib/web/tokens.ts +25 -2
- package/package.json +26 -14
- package/skills/next/SKILL.md +4 -3
- package/skills/project-docs/SKILL.md +133 -0
- package/skills/project-docs/references/audit.md +131 -0
- package/skills/project-docs/references/changelog.md +105 -0
- package/skills/project-docs/references/discovery.md +127 -0
- package/skills/project-docs/references/readme.md +80 -0
- package/skills/project-docs/references/release.md +84 -0
- package/skills/project-docs/references/roadmap.md +93 -0
- package/skills/project-docs/scripts/state.ts +316 -0
- package/skills/refactor/SKILL.md +100 -125
- package/skills/refactor/references/handoff.md +35 -0
- package/skills/refactor/references/signals.md +54 -0
- package/skills/refactor/scripts/inventory.ts +587 -0
- package/extensions/file-browse/README.md +0 -506
- package/extensions/file-browse/server.ts +0 -141
- package/extensions/plan/split.ts +0 -87
- package/extensions/session-bus/README.md +0 -247
- package/extensions/session-bus/team.ts +0 -102
- package/extensions/wechat/outbound.ts +0 -100
- package/lib/plans/sections.ts +0 -172
- package/lib/plans/setting.ts +0 -52
- package/lib/plans/split.ts +0 -215
- package/lib/plans/store.ts +0 -19
- package/lib/plans/team.ts +0 -151
- package/skills/changelog/SKILL.md +0 -148
- package/skills/parallel-dev/SKILL.md +0 -150
- /package/extensions/file-browse/{rev.ts → live/rev.ts} +0 -0
- /package/extensions/file-browse/{diff.ts → text/diff.ts} +0 -0
- /package/extensions/file-browse/{fuzzy.ts → text/fuzzy.ts} +0 -0
- /package/extensions/file-browse/{live-client.ts → view/live-client.ts} +0 -0
- /package/extensions/file-browse/{palette.ts → view/palette.ts} +0 -0
- /package/extensions/rewind/{patch.ts → text/patch.ts} +0 -0
- /package/extensions/rewind/{paths.ts → text/paths.ts} +0 -0
- /package/extensions/rewind/{queue.ts → transport/queue.ts} +0 -0
- /package/extensions/rewind/{temp-index.ts → transport/temp-index.ts} +0 -0
- /package/extensions/wechat/{lock.ts → state/lock.ts} +0 -0
- /package/extensions/wechat/{channel.ts → text/channel.ts} +0 -0
|
@@ -0,0 +1,131 @@
|
|
|
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.
|
|
@@ -0,0 +1,105 @@
|
|
|
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.
|
|
@@ -0,0 +1,127 @@
|
|
|
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.
|
|
@@ -0,0 +1,80 @@
|
|
|
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.
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Release
|
|
2
|
+
|
|
3
|
+
Only when the user asked for a specific version. A release is a promise: a tag, a
|
|
4
|
+
published artifact, and a section of the changelog that says what is in it. The
|
|
5
|
+
project's release document owns the whole procedure; this file adds the changelog
|
|
6
|
+
steps and the order they fit into, not a competing one.
|
|
7
|
+
|
|
8
|
+
## Before touching the file
|
|
9
|
+
|
|
10
|
+
1. Read the project's release document — `docs/release.md`, `RELEASING.md`,
|
|
11
|
+
`CONTRIBUTING.md`'s release section, `.github/workflows/publish.yml`. It decides
|
|
12
|
+
the files to bump, the tag format, and the push and publish order.
|
|
13
|
+
2. Confirm the version and the reason with the user. Say the reason in SemVer's
|
|
14
|
+
terms: a fix with no surface change is a patch, an additive surface is a minor, a
|
|
15
|
+
breaking change is a major — and ask when a project in `0.x` treats minors as the
|
|
16
|
+
breaking channel, because many do. Never infer a version from the size of the
|
|
17
|
+
diff and never raise the version in the release without the user's word for it.
|
|
18
|
+
|
|
19
|
+
## Move the entries
|
|
20
|
+
|
|
21
|
+
A project that keeps no changelog file — only GitHub or GitLab releases, or release
|
|
22
|
+
notes a tool generates — has nothing to move: say so and stop, and do not create the
|
|
23
|
+
file as part of a release. The rest of this section assumes one exists.
|
|
24
|
+
|
|
25
|
+
A file a tool generates is moved by that tool, not here: `changeset version`,
|
|
26
|
+
`git-cliff --tag`, `release-please`, `semantic-release`, or whatever the project's
|
|
27
|
+
release document names. In that case this mode's job is to check the result — the
|
|
28
|
+
version, the dated heading, the category order, the link refs — and to report the step
|
|
29
|
+
that is still owed, never to edit the generated file.
|
|
30
|
+
|
|
31
|
+
- Read `[Unreleased]` and check it is what the release contains: everything since
|
|
32
|
+
the last tag, nothing that already shipped.
|
|
33
|
+
- Move every entry under `## [X.Y.Z] - YYYY-MM-DD`, categories in the file's own
|
|
34
|
+
order and spelling, creating only the categories that hold an entry. Keep each
|
|
35
|
+
bullet's text; a release is a move, not a rewrite.
|
|
36
|
+
- Leave `[Unreleased]` present and empty, unless the file's preamble says it is
|
|
37
|
+
removed between releases. An empty heading is how the next change knows where to
|
|
38
|
+
land.
|
|
39
|
+
- Update the link references: `[Unreleased]` now compares from the new tag, and the
|
|
40
|
+
new version gets a reference in the file's existing style (`compare/vOLD...vNEW`
|
|
41
|
+
or `releases/tag/vNEW`).
|
|
42
|
+
- Bump the version where the project keeps it — usually one manifest, sometimes a
|
|
43
|
+
lockfile, a version file, and an install pin. The build manifest and the newest
|
|
44
|
+
dated heading must agree, or a consistency guard fails.
|
|
45
|
+
- The release commit holds the changelog move, the version bump, and the link refs.
|
|
46
|
+
No behavior, no new entries, no unrelated docs: a release commit that also changes
|
|
47
|
+
code cannot be diffed as a release.
|
|
48
|
+
|
|
49
|
+
## Finish
|
|
50
|
+
|
|
51
|
+
- Run the project's release guard (often `release.test.ts` or a `changelog` check),
|
|
52
|
+
then the project's full check. The guard is the one test that names a version, so
|
|
53
|
+
run it directly while iterating.
|
|
54
|
+
- Then, in the project's order and only with explicit approval for that push: commit,
|
|
55
|
+
tag (`vX.Y.Z`, annotated where the project does that), push the tag together with
|
|
56
|
+
the branch — a branch push that lands before its tag races the checkout that
|
|
57
|
+
asserts they agree — and publish through the project's pipeline, not a local
|
|
58
|
+
publish.
|
|
59
|
+
- The release body is that section verbatim, heading included. Do not add a summary,
|
|
60
|
+
a thank-you, or a rewrite of the bullets a reader already has.
|
|
61
|
+
|
|
62
|
+
## Verify a release you did not cut
|
|
63
|
+
|
|
64
|
+
A release is a chain of steps, and the last one can sit for hours waiting on a
|
|
65
|
+
pipeline's approval, so checking a tagged version is its own job. It touches no file:
|
|
66
|
+
open the tag, read each of these, and report the line.
|
|
67
|
+
|
|
68
|
+
- The tag's own manifest — `git show vX.Y.Z:package.json`, or the equivalent — because
|
|
69
|
+
the publish job proves that before it publishes, not the branch's.
|
|
70
|
+
- The newest dated heading, and the project's release guard where it has one.
|
|
71
|
+
- The link refs: `[Unreleased]` compares from the new tag, and `X.Y.Z` points at it.
|
|
72
|
+
- Whatever the release document bumps in the same commit — an install pin, a version
|
|
73
|
+
stamped in a guide, a captured image.
|
|
74
|
+
- The release body against the section the project's own tooling prints, never against
|
|
75
|
+
memory.
|
|
76
|
+
- The publish run itself: a workflow that checks out `vX.Y.Z` publishes the tagged tree
|
|
77
|
+
whatever ref the dispatch named, so what remains is its environment approval and the
|
|
78
|
+
registry version after it.
|
|
79
|
+
|
|
80
|
+
## After
|
|
81
|
+
|
|
82
|
+
If a shipped change turns out to have no bullet, do not edit the released section.
|
|
83
|
+
Record the gap to the user and add a bullet to `[Unreleased]` for the next release,
|
|
84
|
+
naming the fix; a released section is a record of what was published, not a draft.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Roadmap
|
|
2
|
+
|
|
3
|
+
The roadmap is the one document that describes the tree rather than the last release,
|
|
4
|
+
so it goes stale two ways: it keeps what already shipped, and it promises what the
|
|
5
|
+
tree already does differently. This mode re-derives it and deletes what is done. It
|
|
6
|
+
never decides what matters.
|
|
7
|
+
|
|
8
|
+
Read [`discovery.md`](./discovery.md) first for the file, the item form, the buckets
|
|
9
|
+
and their caps, the ledger, and the stated rule for a shipped item. A file with no ids
|
|
10
|
+
and no buckets is not a defect to fix: it gets the deletion pass below, and no invented
|
|
11
|
+
id scheme.
|
|
12
|
+
|
|
13
|
+
## Re-derive before editing
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
git log --oneline <last-tag>..HEAD
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Use `HEAD`, or the branch the project documents as its default — a project's branch is
|
|
20
|
+
not always `main`. Read the changelog's newest dated heading beside it: the window is
|
|
21
|
+
everything that landed, and the release is what a reader has. A project with no tags has
|
|
22
|
+
no window at all: re-derive from the newest dated heading and the tree instead, and say
|
|
23
|
+
that is what you did. An item is not "shipped" because a branch merged — the tree
|
|
24
|
+
decides whether the promise is met, the maintainer decides whether it shipped.
|
|
25
|
+
|
|
26
|
+
Then, for every item in the file, open the code it names. Three outcomes:
|
|
27
|
+
|
|
28
|
+
- **The tree does it.** Delete the item, and record the reason where it was — one line
|
|
29
|
+
is enough, and it is what stops the same item being re-added next review. A file with
|
|
30
|
+
its own history or "previous `Now`" section gets the note there instead.
|
|
31
|
+
- **The tree does part of it.** Rewrite the item down to the part still missing. A
|
|
32
|
+
condensed item is a finding; a deleted one that was not done is a lost promise.
|
|
33
|
+
- **The tree contradicts it** — the approach changed, or the problem was solved another
|
|
34
|
+
way. Delete it with that reason. Parking it as "still available" describes a tree
|
|
35
|
+
that no longer exists.
|
|
36
|
+
|
|
37
|
+
Never tick an item and leave it. A checklist with finished rows is a changelog written
|
|
38
|
+
in the wrong file, and it is what the project's own rule usually forbids.
|
|
39
|
+
|
|
40
|
+
## Renumber and fix every citation
|
|
41
|
+
|
|
42
|
+
After a deletion, ids break in four places, and all four move in the same edit:
|
|
43
|
+
|
|
44
|
+
- The item headings, so a prefix's numbers stay contiguous.
|
|
45
|
+
- Every reference elsewhere in the file — a ledger row, a "if only two things ship"
|
|
46
|
+
list, a `P1–P3` range whose endpoints both still resolve.
|
|
47
|
+
- Every mention in the guides, the front door, and the instruction file, which is what
|
|
48
|
+
a stale id breaks first because nothing validates it.
|
|
49
|
+
- The relative links and `path:line` citations the items carry.
|
|
50
|
+
|
|
51
|
+
Change an id only when a deletion forces it. Renumbering for tidiness loses the
|
|
52
|
+
citations the file's readers already have.
|
|
53
|
+
|
|
54
|
+
## Keep the buckets honest
|
|
55
|
+
|
|
56
|
+
- A bucket over the cap the file states is a priority list that stopped being one:
|
|
57
|
+
demote an item rather than widening the cap.
|
|
58
|
+
- A horizon whose exit condition has been met gets rewritten, not left as decoration.
|
|
59
|
+
- A ledger row whose items have all closed is closed; an open item with no ledger row
|
|
60
|
+
gets one, or it is not part of a promise.
|
|
61
|
+
|
|
62
|
+
## Numbers belong to the tree
|
|
63
|
+
|
|
64
|
+
Any count the file states about the code — modules, extensions, tools, screens — is
|
|
65
|
+
read from the tree, not adjusted by hand. A project that derives it in a guard has the
|
|
66
|
+
count already: run the guard, and change the tree or the guard, never the number. A
|
|
67
|
+
project that does not is a finding for the audit, and the fix is a guard.
|
|
68
|
+
|
|
69
|
+
## Non-goals are decisions
|
|
70
|
+
|
|
71
|
+
The non-goal list carries a reason per entry. When the changelog, a discussion, or the
|
|
72
|
+
audit contradicts one, that is a decision for the maintainer: list it, with the
|
|
73
|
+
evidence, and ask. Reversing a documented non-goal is not a roadmap edit, and an item
|
|
74
|
+
that needs one reversed says so in the item.
|
|
75
|
+
|
|
76
|
+
## Report
|
|
77
|
+
|
|
78
|
+
Every edit named by the item it touched: deleted, rewritten, renumbered, or cited.
|
|
79
|
+
Then the items that need a decision, one line each. A roadmap whose window changed and
|
|
80
|
+
whose items are all still true is a valid result — say so instead of finding work to
|
|
81
|
+
look thorough.
|
|
82
|
+
|
|
83
|
+
## In this repository
|
|
84
|
+
|
|
85
|
+
- `ROADMAP.md` states its own rules under *How items are ordered*: an item is deleted
|
|
86
|
+
when it ships, never ticked, and `Now` and `Next` hold at most ten.
|
|
87
|
+
- `test/roadmap.test.ts` pins the mechanical half — id uniqueness and contiguity, the
|
|
88
|
+
links, the citations, and the caps — and cannot tell that an item has shipped, which
|
|
89
|
+
is why the file states that rule in prose.
|
|
90
|
+
- `AGENTS.md` requires the deletion or renumbering in the same commit as the change.
|
|
91
|
+
|
|
92
|
+
The paths are named, not linked: a skill is installed into projects that do not
|
|
93
|
+
contain them, so a link would point nowhere from the place it is read.
|