wei-wuwei 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,14 @@ One section per published version, newest first. `wuwei update` prints the
4
4
  sections between the installed version and the new one before it asks;
5
5
  `wuwei check` fails when package.json's version has no section here.
6
6
 
7
+ ## 0.6.1
8
+
9
+ - fix(retro): review rounds — prose sweep, later-phase artifacts, escalation by section (#106)
10
+
11
+ ## 0.6.0
12
+
13
+ - feat(brief): wuwei brief — the personal dashboard (stream personal-dashboard) (#75)
14
+
7
15
  ## 0.5.0
8
16
 
9
17
  - feat(plan-check): a script is an e2e harness too (#69)
package/README.md CHANGED
@@ -56,7 +56,7 @@ wuwei update # newer version out? shows what it woul
56
56
  # from a clone:
57
57
  git clone git@github.com:jameshsiao/wuwei.git
58
58
  cd wuwei
59
- npm run check # lint frontmatter
59
+ npm run check # validate frontmatter, lint references and budgets
60
60
  npm run build # emit repo-local artifacts (.claude/, .agents/, AGENTS.md, CLAUDE.md)
61
61
  node bin/wuwei.js init <project> # repo scope: templates + .wuwei/ skeleton, then
62
62
  # offers the tools below (and, with Codex, an execute
@@ -67,6 +67,9 @@ node bin/wuwei.js status <project> # read-only: streams/claims from .wuwei, dr
67
67
  node bin/wuwei.js update # git pull if behind, diff against what install wrote, apply on yes
68
68
  node bin/wuwei.js review-prep <base> # wuwei-review's prep: dispatcher checks + scan bundle (or --pr <n>)
69
69
  node bin/wuwei.js claim [stream] [NN] # list eligible phases, or claim one: cut, claim, push
70
+ node bin/wuwei.js brief <path>… [--json | --html | --md] [--write] [--open] [--mark] [--if-due 08:45] [--since 7d] [--stale 72h] # your daily dashboard across repos: done, today,
71
+ # left, what waits on you, and the PRs — a page on a terminal; see docs/brief/README.md
72
+ node bin/wuwei.js brief <path>… --schedule [launchd|cron|claude-desktop] [--at 08:45] # print the daily routine to paste; installs nothing
70
73
  node bin/wuwei.js review-collect # each lens's transcript + report into the bundle, and what each one spent
71
74
  node bin/wuwei.js digest-check <f> # a review digest's arithmetic before it is published
72
75
  node bin/wuwei.js plan-check [stream] # plan-phases step 11's checkable half, before sign-off
@@ -75,9 +78,12 @@ node bin/wuwei.js mutate <f>:<n> --from … --to … --run … --in <wt> # one
75
78
  node bin/wuwei.js sites <pattern>… [--symbol <name>] # a set derived from the tree, graph and grep both; several names in one call
76
79
  node bin/wuwei.js claims-scan <doc>… # a document's paths, names, file:lines and commands checked against the tree in one call
77
80
  node bin/wuwei.js verify [page] [--phase NN] # every data-bearing page × 500/403/404/empty/pending/failed refetch; --phase: ACCEPTANCE's ## Verify; mobile: Maestro + mock server
78
- node bin/wuwei.js uninstall # removes exactly what install wrote, nothing else
81
+ node bin/wuwei.js uninstall # user scope: removes the stamped files install wrote, and wuwei's rules blocks
82
+ node bin/wuwei.js uninstall <path> # a project: removes the templates whose text names wuwei — a team file that says "wuwei" goes too
79
83
  ```
80
84
 
85
+ Every command, what it does and an example, is in [Commands](#commands) below.
86
+
81
87
  `update` is `install` with its eyes open. It first asks the channel this copy
82
88
  came from whether a newer version exists — git for a clone, npm for the
83
89
  package — and offers to move to it; the newer copy then runs the diff. Every
@@ -87,7 +93,8 @@ in `~/.wuwei/manifest.json`), `stale` (orphaned, would be removed) or
87
93
  `conflict` (a file at that path wuwei did not generate). Before that it prints
88
94
  `CHANGELOG.md`'s sections since the installed version. Nothing is written
89
95
  without a yes; `edited` and `conflict` files are copied to
90
- `~/.wuwei/local-patches/<time>/` first; `--dry` only reports.
96
+ `~/.wuwei/local-patches/<time>/` first; `--dry` only reports
97
+ (it still asks git or npm first).
91
98
 
92
99
  You don't have to remember to run it: once a day any `wuwei` command checks
93
100
  npm in the background, and when a newer version is out it says so on stderr
@@ -105,12 +112,64 @@ tests-only merge releases nothing; *Run workflow* (`workflow_dispatch`) with a
105
112
  bump releases now. A version already set in `package.json` that npm has not
106
113
  seen goes out as is.
107
114
 
115
+ ## Commands
116
+
117
+ Every command the CLI accepts, and what it does — each row written from the
118
+ command's own code. `wuwei` is also `ww` and `wei-wuwei`; from a clone, run
119
+ `node bin/wuwei.js` in its place. Bare `wuwei` is `wuwei build`.
120
+
121
+ | Command | What it does | Example |
122
+ |---|---|---|
123
+ | [`init [path]`](#tools-it-will-offer-you) | Bootstraps a project (default: the current directory): the PR template, `.wuwei/templates/` and a `.wuwei/STATE.md` skeleton. Then, only where they help, it offers a `.planning/` (GSD) import, codegraph, semgrep and osv-scanner, and — if Codex has run — an execute profile in `$CODEX_HOME/config.toml`; it ends by naming the next step | `wuwei init` |
124
+ | [`install [path]`](#quick-start) | With no path, once per machine: skills and agents into `~/.claude`, rules into `~/.claude/CLAUDE.md` and, if Codex has run, skills into `~/.agents/skills` and rules into `$CODEX_HOME/AGENTS.md`; what it wrote is recorded in `~/.wuwei/manifest.json`, and it offers `npm install -g`. With a path, only that project's templates and `.wuwei/STATE.md` | `npx wei-wuwei install` |
125
+ | [`update`](#quick-start) | Asks the channel this copy came from (git for a clone, npm for the package) whether a newer one exists and offers to move to it; then shows what `install` would change — `new`, `changed`, `edited`, `stale`, `conflict` — and applies it on a yes, copying your edits to `~/.wuwei/local-patches/` first. Off a terminal, or with `--dry`, it changes no file of yours — it still asks git (`git fetch`) or npm first. `--no-fetch` skips that question | `wuwei update` |
126
+ | [`uninstall [path]`](#tools-it-will-offer-you) | Without a path, takes back what `install` wrote: the skills and agents in `~/.claude` and the skills in `~/.agents/skills` that carry wuwei's `GENERATED BY wuwei` stamp, wuwei's block in `~/.claude/CLAUDE.md` and `$CODEX_HOME/AGENTS.md`, the Codex profile `init` added and `~/.wuwei/manifest.json`; then it offers to take back the global command, codegraph and the scanners (semgrep, osv-scanner), each only where it is still installed. With a path, the project's PR template and `.wuwei/templates/*.md` **whose text names wuwei** — those templates carry no stamp, so a team file at one of those paths that mentions wuwei is removed too; `.wuwei/STATE.md` and `streams/` are kept, and the one offer is codegraph's `uninit`, where `.codegraph/` is. It has no `--dry`: it removes | `wuwei uninstall` |
127
+ | `build` | Emits this checkout's repo-local artifacts from `skills/` and `agents/`, for the targets `wuwei.config.json` enables: `.claude/`, `CLAUDE.md`, `AGENTS.md` and `.agents/skills/`. What `wuwei` runs with no command | `npm run build` |
128
+ | `check` | Validates every skill's and agent's frontmatter, then lints them: a number that counts a list below it, a `wuwei-…` name or `§N` that no longer exists, word budgets, `modelRoles` against the agent files, and a `CHANGELOG.md` section for this version. Exit 1 with the list on a failure; CI runs it | `npm run check` |
129
+ | `list` | Prints the skills (marked `[always]` for a rule, `[local]` for one that stays in the repo), the agents and the templates this copy holds | `wuwei list` |
130
+ | `status [path]` | Read-only: the streams `.wuwei/STATE.md` lists against the directories under `.wuwei/streams/`, each mismatch it can prove flagged, and a warning when `.codegraph/` is tracked by git | `wuwei status ~/work/app` |
131
+ | `claim [stream] [phase]` | A stream's phases and where each stands (`ready`, `claimed`, `merged`, `waiting`, `blocked`), whether its stream branch is current, and the model each step dispatches. With a phase it cuts that phase's branch from the stream branch, writes `claimed-by` and `claimed-at` into the phase file, commits and pushes. It refuses a merged, waiting or claimed phase (`--take-over` records a takeover), a stale stream branch and a dirty checkout. `--by <who>` names the claimer; without it, a claim made from inside a Claude Code session (its `CLAUDE_CODE_SESSION_ID`, when that is a uuid) writes `claimed-by: <user>@<host> (session <uuid>)`, which `brief` reads to find the session; `--dry` stops before the branch is cut, so it changes no file of yours — `claim` always runs `git fetch origin` first | `wuwei claim my-stream 03` |
132
+ | [`brief <path>…`](docs/brief/README.md) | Across every wuwei repo under the paths: what got done since you last looked, what you can start today, what is left, what waits on you, and the PRs. On a terminal it writes the report as a web page to `~/.wuwei/brief/brief.html` and opens it; off one (a pipe, a file, an agent) it prints markdown. `--md` the markdown, `--json` the data, `--html` the page on stdout, `--write` the page whatever stdout holds, `--open` show the page it writes, `--mark` start the next window here, `--if-due 08:45` do nothing new when a routine has run since then (what every routine passes), `--since 7d` look further back, `--stale 48h` when a claim without commits is stale, `--lang zh-TW` the report's own words in 繁體中文 (or in a language you write: `--lang-template` prints the table to translate), `--schedule [launchd\|cron\|claude-desktop] [--at 08:45]` prints a daily routine to paste and installs nothing | `wuwei brief ~/work` |
133
+ | `plan-check [stream]` | wuwei-plan-phases step 11's checkable half, before sign-off: the `## Sign-off` fields, a stream branch ending `/base` and on origin, `depends-on` that resolves without a cycle (phases and tasks), the task diagram matching those fields, `## Verify` bound to phases, a harness named, and `STATE.md` agreeing with `phases/`. Exit 1 on any error | `wuwei plan-check my-stream` |
134
+ | `review-prep [base]` | wuwei-review's prep: fetches the base and writes the bundle `.wuwei-cache/review/<sha>/` — `INDEX.md`, `diff.patch` and `PREP.md` (merges cleanly, CI at HEAD, tool-maintained deletions, author paths) — plus semgrep's output and, for a changed lockfile, osv-scanner's, where they are installed. `--pr <n>` reads a PR and its thread, `--path <p>` reviews a path with no base, `--no-scan` skips the scanners | `wuwei review-prep main` |
135
+ | `review-collect` | Copies each lens's transcript and report from the newest Claude Code session here that dispatched a wuwei lens into the bundle's `reports/`, and prints what each one spent. `--session <id>` picks another session; `--sha <sha>` another bundle, by the 12-character sha `review-prep` named it by — used as the directory name, not resolved, so `--sha 3252957f2bcd`, not `--sha main` | `wuwei review-collect` |
136
+ | `verify [page]` | Walks each page of `.wuwei/verify.json` through a 500, 403, 404, empty, pending and a failed refetch — in Chromium (Playwright) against a mock of the API, or, for a mobile app, on a simulator with Maestro — and writes a matrix and screenshots under `.wuwei-cache/verify/<sha>/`. `--phase NN` runs the pages ACCEPTANCE.md binds to that phase, and with more than one stream under `.wuwei/streams/` it needs `--stream <name>` to say whose | `wuwei verify --phase 04 --stream my-stream` |
137
+ | `digest-check <digest.md>` | A review digest's arithmetic before it is published: raw = rows + merged + dropped, the numbering, reporter credits, every `file:line` and identifier against the reviewed tree, no HIGH that is PLAUSIBLE, no secret, the verdict's two axes, and whether HEAD moved. Exit 1 on an error | `wuwei digest-check digest.md` |
138
+ | `worktree <lens> [sha]` | A throwaway detached git worktree in the temp directory, named for the sha and the lens so no two lenses share one; prints its path and nothing else. `--prune [sha]` removes them | `cd "$(wuwei worktree defects HEAD)"` |
139
+ | `mutate <file>:<line>` | One mutation, inside a worktree `wuwei worktree` made: replaces `--from` (which must occur once on that line) with `--to`, runs `--run` before and after, puts the file back, and says `caught` or `survived` when it can read the runner's failure count, `green by exit code` or `red by exit code` when it cannot, and `did not land` when the file did not change; the run is recorded under `.wuwei-cache/review/<sha>/mutations/`. `--in <worktree>` names the tree, `--no-baseline` skips the first run. Exit 2 if the file could not be restored | `wuwei mutate src/pay.js:42 --from '>=' --to '>' --run 'npm test' --in "$WT"` |
140
+ | `sites <pattern>…` | A set derived from the tree: every site of each pattern by `git grep`, with the command printed beside the count. `--symbol <name>` also asks codegraph for its callers and says where graph and grep disagree; `--regex` reads each pattern as an extended regex (`-E`; the default is a fixed string, `-F`), `--sha <rev>` greps that revision instead of `HEAD`, `-- <pathspec>` only those paths | `wuwei sites parseFrontmatter signOffField` |
141
+ | `claims-scan <doc>…` | A document's code-span paths, `file:line`s, commands and names checked against the tree in one pass; counts and commands it cannot check are listed for judgment. `--sha <rev>` reads the tree there, `--all` lists what held too | `wuwei claims-scan README.md` |
142
+ | `--version`, `-v`, `version` | Prints this copy's version | `wuwei --version` |
143
+ | `--dry` | A flag, not a command: on `build`, `init`, `install`, `update` and `claim` it says what would be written and changes no file of yours; `claim` and `update` still fetch (`git fetch`, or npm's registry for the package). `uninstall` does not take it | `wuwei install --dry` |
144
+
145
+ ## `wuwei brief` — your daily dashboard
146
+
147
+ One command each morning, across every wuwei repo you work in: **what got done
148
+ since you last looked, what you can start today, what is left, and what waits
149
+ on you** — read from each stream at origin, with your pull requests added when
150
+ the GitHub CLI is logged in. On a terminal the report is a web page, written to
151
+ `~/.wuwei/brief/brief.html` and opened in your browser; off one it is markdown.
152
+
153
+ ```sh
154
+ wuwei brief ~/work
155
+ ```
156
+
157
+ <p align="center">
158
+ <img src="https://raw.githubusercontent.com/Jameshsiao/wuwei/main/docs/img/brief/desktop-light.png" alt="The wuwei brief page on a desktop: a headline of what needs you — 8 CI failing, 7 ready to merge, 3 reviews requested — then the Needs you list, grouped by what to do, beside the phases in motion and each stream's progress" height="420">
159
+ </p>
160
+
161
+ From the test fixture — fake repos and a fake `gh`. Every flag, the report as
162
+ markdown and JSON, the GitHub half, a daily routine and your own language are in
163
+ the full guide: [`docs/brief/README.md`](docs/brief/README.md).
164
+
108
165
  ## Daily use
109
166
 
110
- The CLI above only installs and inspects. The work itself is driven by the ten
111
- skills, invoked by name or triggered by what you say. A stream runs
112
- **grill → brainstorm → plan → execute**, with a human at exactly two points:
113
- sign-off before anything is built, and UAT at the end.
167
+ The CLI above installs wuwei, reads and checks the plan, and does the mechanical
168
+ halves of what the skills ask for — claiming a phase, a review's prep, one
169
+ mutation's run. The work itself is driven by the ten skills, invoked by name or
170
+ triggered by what you say. A stream runs **grill → brainstorm → plan →
171
+ execute**, with a human at exactly two points: sign-off before anything is
172
+ built, and UAT at the end.
114
173
 
115
174
  ```
116
175
  /wuwei-grill # interrogate the requirement — no solutions yet
@@ -190,26 +249,6 @@ changed and cannot show what depends on it, which is why the first row gates
190
249
  severity: "no call site left behind" is a claim a graph settles and reading
191
250
  harder never will.
192
251
 
193
- ## Repo layout
194
-
195
- ```
196
- wuwei/
197
- ├── skills/ # canonical skill definitions (source of truth)
198
- │ └── _template/
199
- ├── agents/ # canonical subagent definitions
200
- │ └── _template/
201
- ├── templates/ # PR / review templates, installed per-repo
202
- ├── bin/wuwei.js # CLI: build · check · list · init · install · update · status · review-prep · review-collect · claim · digest-check · plan-check · worktree · mutate · sites · claims-scan · verify · uninstall
203
- │ # the per-tool emitters live here too, not in adapters/
204
- ├── adapters/ # notes only — see bin/wuwei.js for the actual emitters
205
- ├── docs/
206
- │ ├── product.md # what wuwei is now (edited in place)
207
- │ ├── decisions.md # why it got here (append-only)
208
- │ ├── architecture.md
209
- │ └── authoring.md
210
- └── wuwei.config.json # sources + targets; `commands` is declared but not built yet
211
- ```
212
-
213
252
  ## Design principles
214
253
 
215
254
  1. **One source of truth.** A skill is defined once. Everything else is generated.
@@ -21,6 +21,11 @@ the phase context, the ladder (climb it before writing), and step 4's floor.
21
21
  `wuwei-tdd` governs the task; commit as `wuwei-commit-hygiene` says — one
22
22
  concern per commit, the why in the body.
23
23
 
24
+ **A task or a fix ends with the prose sweep** (step 2): grep every name,
25
+ path, number and fact your change removed, renamed or changed — `wuwei sites
26
+ <term>…` over docs, comments, SPEC, ACCEPTANCE and phase files — and fix each
27
+ hit in the same commit.
28
+
24
29
  ## Out of scope
25
30
 
26
31
  - Another task, or the phase's next step — hand back instead.
@@ -31,4 +36,5 @@ concern per commit, the why in the body.
31
36
  ## Output contract
32
37
 
33
38
  What landed (commit shas, one line each), the tests that ran and their
34
- result, and anything you stopped short of — with why.
39
+ result, the sweep's terms and any hit left unfixed, and anything you stopped
40
+ short of — with why.
@@ -169,6 +169,9 @@ to `review:claims`. Categories: `wrong-claim` | `unsupported` | `stale`.
169
169
  said, `PLAUSIBLE` when you reasoned it — or when you constructed it on your
170
170
  machine and the claim is about the author's or CI's. **Nothing PLAUSIBLE is
171
171
  rated HIGH.**
172
+ - **A failure that fires only once a later phase's artifact exists is LOW at
173
+ most**; its `Action` is a requirement for that phase's file, not more
174
+ procedure here.
172
175
 
173
176
  Quote the line, name what it contradicts, cite that. **And read past the line
174
177
  that confirms you** — a later section of the same file can reverse it, and
@@ -179,12 +182,14 @@ proposing how to correct a stale claim, grep the repo for how the same kind
179
182
  of staleness was resolved elsewhere — a sibling document's frontmatter field,
180
183
  a prior correction to the same kind of record. A repo with an existing
181
184
  convention for this already answered the question; inventing a new shape is
182
- itself an unsupported claim. **The anchor must survive the repo's merge
183
- settings**: a commit SHA dies under `allow_squash_merge` (`gh api
185
+ itself an unsupported claim. **The anchor must survive the merge**: a commit
186
+ SHA dies when this target is squash-merged — the merge method it records
187
+ (sign-off, PR body) before `allow_squash_merge` (`gh api
184
188
  repos/<owner>/<repo> --jq .allow_squash_merge`); anchor to a tracked path, a
185
189
  heading, or a symbol that still exists. **A record is corrected, not
186
190
  rewritten**: for a plan, a summary or a decision log, the fix is a dated
187
- correction beside the original sentence.
191
+ correction beside the original sentence; a self-declared snapshot (dated
192
+ banner, executed phase's summary, generated codebase map) is not stale.
188
193
 
189
194
  **The `Action` cell carries `wuwei-review` §7's bar** — a fix is a claim about
190
195
  a mechanism and is verified like one, or the cell says it is untested.
@@ -155,6 +155,9 @@ to `review:drift`. Categories: `stale` | `wrong-claim` | `contradiction`.
155
155
  two quotes that disagree without that is `PLAUSIBLE`, because "which is
156
156
  wrong" is the finding; so is a side observed on your machine when the
157
157
  claim is about the author's or CI's. **Nothing PLAUSIBLE is rated HIGH.**
158
+ - **A failure that fires only once a later phase's artifact exists is LOW at
159
+ most**; its `Action` is a requirement for that phase's file, not more
160
+ procedure here.
158
161
 
159
162
  **Read past the line that confirms you.** A quote from one section is not
160
163
  evidence until the rest of the file has been checked for the line that
@@ -167,11 +170,14 @@ corrected before — a sibling `REVIEW.md`'s convention for a status field, a
167
170
  prior fix to the same kind of stale record. Match that shape; do not invent
168
171
  one the repo has already answered differently. **A record is corrected, not
169
172
  rewritten**: for a plan, a summary or a decision log, the fix is a dated
170
- correction beside the original sentence — the record is also evidence of what
171
- was believed when.
172
-
173
- **The anchor must survive the repo's merge settings.** A commit SHA dies
174
- under `allow_squash_merge` (`gh api repos/<owner>/<repo> --jq
173
+ correction beside the original sentence. **A document that declares itself
174
+ a snapshot** — a dated banner, an executed phase's summary, a generated
175
+ codebase map — **is not stale**: one dated banner at most, never a row per
176
+ line.
177
+
178
+ **The anchor must survive the merge.** A commit SHA dies when this target is
179
+ squash-merged: the merge method it records (sign-off, PR body) before
180
+ `allow_squash_merge` (`gh api repos/<owner>/<repo> --jq
175
181
  .allow_squash_merge`); anchor to a tracked path, a heading, or a symbol that
176
182
  still exists.
177
183
 
@@ -82,6 +82,9 @@ to `review:structure`. Categories: `missing` | `unfindable` |
82
82
  following §8 stops at step 1 believing nothing can deploy" is.
83
83
  - **Ev** — `CONFIRMED` when you followed the document's own order and hit it,
84
84
  `PLAUSIBLE` when you inferred it. **Nothing PLAUSIBLE is rated HIGH.**
85
+ - **A failure that fires only once a later phase's artifact exists is LOW at
86
+ most**; its `Action` is a requirement for that phase's file, not more
87
+ procedure here.
85
88
 
86
89
  **Name the intended reader in the report's opening line, and where you got
87
90
  it** — what the document declares, what dispatch said, or that you asked. A