@groeponline/pi-wishcraft 1.1.0 → 1.3.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 (66) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +16 -7
  3. package/ROADMAP.md +144 -425
  4. package/docs/commands.md +6 -2
  5. package/docs/configuration.md +21 -0
  6. package/docs/design/accessibility.md +71 -0
  7. package/docs/design/deck-layout.md +69 -0
  8. package/docs/design/motion-gallery.md +80 -0
  9. package/docs/design/motion-system.md +119 -0
  10. package/docs/design/presets.md +196 -0
  11. package/docs/design/regression-testing.md +54 -0
  12. package/docs/design/responsive.md +53 -0
  13. package/docs/design/signal.md +71 -0
  14. package/docs/design/theme-contract.md +132 -0
  15. package/docs/design/vnext-overview.md +55 -0
  16. package/docs/design/vnext-release-plan.md +212 -0
  17. package/docs/index.md +19 -1
  18. package/docs/segments.md +1 -1
  19. package/package.json +2 -1
  20. package/src/config/appearance.ts +229 -0
  21. package/src/config/parse.ts +41 -0
  22. package/src/config/presets.ts +184 -0
  23. package/src/config/structural-presets.ts +555 -0
  24. package/src/config/tokens.ts +154 -0
  25. package/src/config/types.ts +210 -2
  26. package/src/extension/commands/commands.ts +36 -12
  27. package/src/extension/commands/powerline-completions.ts +4 -0
  28. package/src/extension/commands/queue-commands.ts +6 -0
  29. package/src/extension/core/segment-context.ts +27 -21
  30. package/src/extension/core/state.ts +16 -1
  31. package/src/extension/core/types.ts +11 -1
  32. package/src/extension/session/session-lifecycle.ts +29 -65
  33. package/src/extension/session/session-notifications.ts +91 -0
  34. package/src/extension/settings/appearance-write.ts +135 -0
  35. package/src/extension/settings/wishcraft-config-items.ts +119 -0
  36. package/src/extension/settings/wishcraft-config.ts +28 -114
  37. package/src/extension/skills/skill-manager.ts +5 -0
  38. package/src/extension/ui/deck/component.ts +371 -0
  39. package/src/extension/ui/deck/index.ts +34 -0
  40. package/src/extension/ui/deck/render.ts +260 -0
  41. package/src/extension/ui/deck/route-bodies.ts +209 -0
  42. package/src/extension/ui/deck/routes.ts +37 -0
  43. package/src/extension/ui/deck/session-snapshot.ts +122 -0
  44. package/src/extension/ui/deck/types.ts +97 -0
  45. package/src/extension/ui/powerline-menu-view.ts +19 -15
  46. package/src/extension/ui/signal-layout.ts +76 -0
  47. package/src/extension/ui/status-line-renderers.ts +20 -2
  48. package/src/motion/accessibility.ts +59 -0
  49. package/src/motion/catalog-extra.ts +429 -0
  50. package/src/motion/catalog.ts +336 -0
  51. package/src/motion/composer.ts +147 -0
  52. package/src/motion/frames.ts +84 -0
  53. package/src/motion/gallery.ts +77 -0
  54. package/src/motion/index.ts +78 -0
  55. package/src/motion/policy.ts +128 -0
  56. package/src/motion/scheduler.ts +159 -0
  57. package/src/motion/types.ts +132 -0
  58. package/src/render/timer.ts +1 -0
  59. package/src/signal/controller.ts +135 -0
  60. package/src/signal/integration.ts +46 -0
  61. package/src/signal/render.ts +178 -0
  62. package/src/theme/detect.ts +48 -0
  63. package/src/theme/tokens/index.ts +9 -0
  64. package/src/theme/tokens/mapping.ts +21 -0
  65. package/src/theme/tokens/types.ts +6 -0
  66. package/src/usage/token-budget.ts +23 -0
package/ROADMAP.md CHANGED
@@ -1,427 +1,146 @@
1
1
  # Roadmap — pi-wishcraft
2
2
 
3
- Herschreven 2026-08-18. Vijfde pass 2026-08-20: 0.19.0–0.19.2 staan
4
- op npm. CHE-40 (`/powerline` tab) is Done via #18. Overlay-submenus
5
- (CHE-42 / #19) starten 0.20. ROADMAP was achter op de code: hooks,
6
- repairs-subset en skills-manager v2 UI zitten al op `main`.
7
-
8
- Pi core is de engine. Wishcraft is de cockpit. Elke feature dient één van
9
- drie doelen: **grip** (skills, tokens, config), **prestatie** (repairs,
10
- hooks, read-hints), of **leven** (overlays, vibes, detail views).
11
-
12
- Elke release is één campagne met een done-criterium. P1 = deze release,
13
- P2 = volgende, P3 = richting 1.0. Wat in 0.19 staat, shipt. Wat later
14
- staat, start niet eerder.
15
-
16
- ---
17
-
18
- ## Waarom wij bestaan
19
-
20
- De pi-extensiewereld heeft statusbalken. Ze heeft geen cockpit.
21
-
22
- **Upstream `nicobailon/pi-powerline-footer`** is een goede balk: git,
23
- context, stash, compaction-queue, vibes, welcome, bash-mode. Wij zijn
24
- daaruit gegroeid. Wat zij niet hebben, en wat onze publieke identiteit
25
- is:
26
-
27
- | Wij | Zij / de rest |
28
- |---|---|
29
- | Skills als OS: `/skills`, inline `/$`, usage, later doctor | Geen skill-manager |
30
- | Idee → actie: `#`, `/idea`, `/ideas`, `/ideas issue` | Alleen compaction-hold queue |
31
- | Eerlijke TPS: 1s-venster over 5s-ring, in/out gescheiden | Session-average of helemaal niks |
32
- | Tab-token completion + git ahead/behind | Niet of later |
33
- | Harness-laag (0.20): hooks + tool-input repairs op stock pi | Nergens in het extensie-ecosysteem |
34
-
35
- **oh-my-pi** is een hele agent-fork (~80k regels Rust-core, eigen tools,
36
- LSP, DAP). Dat is een ander product. Wij forken Mario's pi niet. Alles
37
- wat we willen van oh-my-pi vertalen we naar een extensie of we laten het
38
- liggen. De weddenschap: de beste cockpit op stock pi wint van een
39
- tweede engine.
40
-
41
- **Command Code** is een commerciële harness (hooks, tool-call repairs,
42
- read-tool engineering). Hun inzicht klopt: open modellen falen op het
43
- contract, niet op "slimheid". Wij kopiëren hun product niet. We gieten
44
- dezelfde principes in wat Pi al native biedt:
45
-
46
- - `pi.on("tool_call")` — `event.input` is mutable; `block` + `reason` +
47
- `terminate` bestaan (`pi-coding-agent` 0.84.x
48
- `dist/core/extensions/types.d.ts`).
49
- - `pi.on("tool_result")` — resultaat muteren.
50
- - `pi.on("session_start" | "input" | "turn_end")`.
51
-
52
- Geen core-patch. Geen tweede agent. Iedereen die `pi` draait kan de
53
- cockpit + harness installeren.
54
-
55
- **ChefGroep** (ChefBar-statuskeys, fleet-ports) is een privé-bonus, niet
56
- de publieke pitch. De npm-pagina moet leesbaar zijn voor iemand die pi
57
- gisteren installeerde.
58
-
59
- Kort: **wij zijn de cockpit + harness voor stock pi.** Niet de balk.
60
- Niet de fork. Niet de SaaS-agent.
61
-
62
- ---
63
-
64
- ## Wat wij niet worden
65
-
66
- - Geen agent-fork. Geen oh-my-pi-lite.
67
- - Geen derde control surface naast ChefBar / Kater. Overlays blijven in
68
- deze extensie.
69
- - Geen muis op de live footer. Pi core bezit die; overlay-navigatie is
70
- het pad.
71
- - Geen eigen bulk-read tool. Core's verantwoordelijkheid; wij leveren
72
- repairs + hints eromheen.
73
- - Geen PostHog in de balk. Events alleen op expliciete Joep-opt-in.
74
- - Geen custom embed/component-registratie voor footer-segments.
75
- Segments zijn data; `customItems` + `command/env/static` dekken
76
- gebruikerscontent.
77
- - Geen skills-markt als identiteit vóór 1.0. Eerst discovery die klopt
78
- en een manager die zoekt.
79
- - Geen fleet-SSH `open_ports` zonder expliciete opt-in (`segmentOptions.openPorts.host`; sanitized, geen shell-injectie).
80
- - Geen versie-reset naar 1.0.0. We blijven op 0.19 → 0.20 → 1.0 wanneer
81
- de cockpit stabiel is.
82
-
83
- ---
84
-
85
- ## Mijlpalen
86
-
87
- - **0.19.0–0.19.2 — "Correctheid"** (geland). Bugs, hygiëne, catalogus,
88
- auto-release, `/powerline` tab. Hooks, repairs-subset en skills
89
- manager v2 UI gingen mee in #12, eerder dan deze sectie beloofde.
90
- Done = npm 0.19.2 live, `/skills` filtert, `$test` expandeert geen
91
- debris, verify-trio groen op de tag.
92
- - **0.20.0–0.22 — "Harness"** (0.20.0 + 0.21.0 op npm; leftovers in GRO-1414).
93
- Overlay-chrome + CHE-42 drill-down, Configure als SelectList, token-overlays,
94
- rest-repairs, README-hooks. Done = drie README-hookvoorbeelden, repair-teller,
95
- `alt+p` overlay-boom, `/tps` deelt de ring met het segment.
96
- - **1.0 — "Cockpit"**. Skills-doctor/install, declaratieve policy,
97
- preset-editor, idee-review, stabiele ChefGroep-statuskeys,
98
- documentatie die waar is. Done = README dekt alles wat we shipten,
99
- geen kapotte footer-belofte.
100
-
101
- ## Top-15 track: remaining maturity gaps
102
-
103
- Written 2026-08-20, rebaselined on 0.27.1 (code review, not this ROADMAP
104
- alone). Feature density is high; several original gaps closed in
105
- 0.23–0.27. What remains is the maturity layer that separates a top-15 pi
106
- extension from a feature-rich prototype.
107
-
108
- ### Already shipped (0.22.x–0.27.x)
109
- - **CHE-41 per-segment detail** — `→` in Navigate, snapshot on open (0.22.1).
110
- - **CHE-42 drill-down** — #19 + Configure in #13.
111
- - **Changelog roll** — version headers drive the what's-new panel.
112
- - **Per-segment fault isolation** — throwing custom segments show `!id`
113
- instead of blanking the footer (#34, 0.23.1).
114
- - **macOS open_ports** — netstat dot-address parsing (#34, 0.23.1).
115
- - **GitHub Release per npm tag** (#25, 0.23.2).
116
- - **CodeQL proto-pollution hardening** (#27, 0.23.3).
117
- - **setupHooks wired** (#26, 0.23.4).
118
- - **Policy engine** — declarative deny/inject, no spawn (GRO-1418, #29,
119
- 0.24.0).
120
- - **`/skills doctor`** — broken frontmatter, dupes, unused, budget
121
- (GRO-1416, #28, 0.24.0 / 0.25.0 tag).
122
- - **`/skills new` templates** — no marketplace (GRO-1417, #32, 0.26.0).
123
- - **`/ideas` review overlay** — status, tags, skill insert (GRO-1419, #31,
124
- 0.27.0).
125
- - **English operator UI** — overlays, skill manager, `/wishcraft` TUI
126
- (GRO-1422, #24, 0.27.1).
127
- - **`powerline.skills.count` + read hints + Status trim** (GRO-1420, 0.23.0).
128
- - **1.0.0 cockpit cut** — README lists doctor, templates, policy, and
129
- idea-review (GRO-1421). Semver leaves 0.x.
130
-
131
- ### Remaining open gaps (maturity)
132
- P1 — differentiation and quality:
133
- 1. **Settings contract to pi core.** No `contributes.settings`/schema;
134
- users hand-edit JSON. *Fix: typed settings schema + contributions.*
135
- 2. **Zero-config first run.** Install still expects JSON edits for the most
136
- useful features. *Fix: sensible defaults + first-run setup overlay.*
137
- 3. **Perf budget / low-power mode.** Status renders every ~33ms; heavy
138
- segments (bash-history, git) can hit the hot path. *Fix: configurable
139
- refresh + lite mode.*
140
- 4. **Accessibility (no-color / reduced-motion).** Truecolor + animations
141
- (vibes, rainbow think) break on terminals without truecolor. *Fix:
142
- `NO_COLOR`/8-color + reduced-motion respect.*
143
-
144
- P2 — full product, post-1.0:
145
- 5. **Preset editor in-menu** — custom JSON-only today.
146
- 6. **Skill install from repo/npm** — discovery + doctor exist; install and
147
- curate missing.
148
- 7. **Host-status integration** — `ctx.ui.setStatus` beside the footer so
149
- status also shows in host UI (`skills.count` is a start; full coverage
150
- remains).
151
-
152
- Linear tickets for open gaps are still to be filed (not invented in this
153
- ROADMAP).
154
-
155
- ---
156
-
157
- ## 0.19.0 — Correctheid
158
-
159
- Eén campagne, drie stacked PRs. Volgorde vast. Elke PR: `npm run
160
- typecheck && npm test && npx madge --circular src index.ts bash-mode
161
- queue` groen vóór review. Overlay-submenus (CHE-42) zitten in 0.20.
162
-
163
- ### PR A — runtime-bugs — ✅ geland in `feat/wishcraft-0.19` (samen met skills v2, hooks, lantern-welcome, `/wishcraft` config-TUI; supersedeert #10)
164
-
165
- Alle zes punten uit het oorspronkelijke plan zitten in de ene 0.19-branch:
166
- debris weg, filter werkend (v2: substring i.p.v. prefix), cache-invalide op
167
- `session_start` + TTL, woordgrens op inline-triggers, unclosed-fence EOF,
168
- bash-session tempdir + sentinel-colon, `permissions: contents: read`.
169
- `npm pack --dry-run` bevat geen debris (113 files, geen `ook.md`/`test.md`).
170
-
171
- ### PR B — config-afmakers — ✅ geland in `feat/wishcraft-0.19` / #12
172
-
173
- Bestanden: `src/config/`, `src/segments/`, `src/extension/ui/`.
174
-
175
- 1. `segmentLabels` toepassen in `renderSegment` voor **alle** segments
176
- (nu alleen tps/open_ports/subagents).
177
- 2. `segmentOptions.<seg>.template` wint van label
178
- (`"{value} tok/s"`).
179
- 3. `segmentOptions.tps.windowMs` (default 1000), `.mode`
180
- (`both | out | in | total`), `.hideIdle` (default true).
181
- 4. Visibility-toggle in het `alt+p`-menu schrijft live
182
- `powerline.disabledSegments`.
183
-
184
- Done: unit tests op label/template/windowMs-resolutie; handmatige
185
- check: label op `git` + `cost` zichtbaar, TPS hidden bij 0 wanneer
186
- `hideIdle`.
187
-
188
- ### PR C — release 0.19.0
189
-
190
- 1. Merge naar `main` triggert `release.yml`: `node scripts/release.mjs auto --push`.
191
- Commits sinds `v0.18.0` bevatten `feat:` → **0.19.0**. Handmatig blijft
192
- `npm run release minor` + tag-push mogelijk.
193
- 2. Tag-job publiceert met org-secret `NPM_TOKEN` (geen repo-override).
194
- 3. Verify: tag op origin, publish-job groen, `npm view @groeponline/pi-wishcraft version` = 0.19.0.
195
- Catalogus (hard): `npm run verify:package` groen in de release-job;
196
- `npm view @groeponline/pi-wishcraft keywords` bevat `pi-package`,
197
- `pi-extension`, `wishcraft`; `pi.image` is de banner-URL.
198
- Daarna:
199
- - https://pi.dev/packages/@groeponline/pi-wishcraft toont 0.19.0
200
- - https://pi.dev/packages?name=wishcraft toont de card
201
- - https://pi.dev/packages?name=groeponline toont wishcraft naast
202
- fff en orchestrator
203
- Detailpagina bestaat al voor 0.18.0; de zoekindex niet. Nieuwe
204
- publish + discovery-keywords is de refresh. Catalogus-lag tot
205
- een paar uur is oké; ontbreken na 24u = 0.19.1 met dezelfde
206
- metadata, geen stille "later wel".
207
- 4. README: skills-sectie zegt dat filter werkt; geen `ook`/`test`
208
- debris. ROADMAP sync (deze file).
209
- 5. `npm deprecate @groeponline/pi-powerline-footer` blijft een
210
- scope-owner actie buiten deze PR (`deprecate-old-name.yml`,
211
- workflow_dispatch). Blokkeert 0.19 niet.
212
-
213
- Hygiëne die al klaar is en niet opnieuw gepland wordt:
214
-
215
- - Fork-tags weg (51 upstream-tags, 2026-08-18). Eigen reeks vanaf
216
- `v0.10.0`.
217
- - `banner.png` blijft (README). `wishcraft-concept.png` gaat weg in
218
- PR A of een docs-PR, niet in de balk-runtime.
219
- - CHANGELOG inkorten (GRO-1060) doen we **niet** in 0.19. Erfgoed
220
- is history, geen cruft.
221
- - Versie blijft 0.19, geen reset naar 1.0.0.
222
-
223
- GRO-1061 (runner-queue) is ops, geen product-slice.
224
-
225
- ---
226
-
227
- ## 0.20.0 — Harness
228
-
229
- Vier stacked PRs. 0.20.0 (#19) en 0.21.0 (#13) staan op npm. CHE-42
230
- Configure-overlay, doctor/export, queue-archive en `docs/` zijn geland.
231
- GRO-1414 sluit README-hooks, rest-repairs, `/tps`+`/usage`, substring-filter.
232
-
233
- Overlay-chrome kit, één keer, daarna hergebruiken: box + ronde hoeken,
234
- accent-kop, dim metadata, rechts uitgelijnde counts, `→` detail /
235
- `←` terug / `esc` weg, consistente footer-hints. Eerste consument =
236
- skills v2; tweede = `/usage`; derde = queue/idea. Pure render-
237
- functies, geen `ctx.ui`-mock.
238
-
239
- ### PR E — hooks — ✅ geland in `feat/wishcraft-0.19`; README-voorbeelden in GRO-1414
240
-
241
- Settings: `wishcraft.hooks` met events
242
- `preToolUse | postToolUse | sessionStart | turnEnd`. Per hook
243
- `matcher` (toolName-regex) en `command` (JSON stdin/stdout, timeout
244
- 30s, max 600s). PreToolUse: `allow | deny` + reason die het model
245
- ziet. Exit 2 = deny, stderr-eerste-regel = reason. PostToolUse /
246
- SessionStart: `additionalContext`. Kill-switch
247
- `wishcraft.hooksEnabled: false`. PreToolUse sequentieel (eerste deny
248
- stopt); PostToolUse/turnEnd parallel.
249
-
250
- Done: `parseHookOutput` unit-testen. README met drie werkende
251
- voorbeelden: bash-guard (`rm -rf /` blokkeren), write-audit
252
- (append-only log), SessionStart git-status injectie.
253
-
254
- ### PR F — tool-input repairs — ✅ schema-loze subset in 0.19; rest (JSON-array, `{}`, bare-wrap, path aliases) in GRO-1414. Core tools blijven met rust.
255
-
256
- `tool_call`-handler repareert bekende malformaties vóór executie
257
- (mutable input). Volgorde vast: json-parse vóór bare-wrap.
258
-
259
- 1. `null` voor optioneel weglaten.
260
- 2. JSON-string-array → array.
261
- 3. `{}`-placeholder → array.
262
- 4. bare-string → array-wrap.
263
- 5. markdown-auto-link pads (`[x.md](http://x.md)` → `x.md`).
264
- 6. pad-alias `filePath` / `absolutePath` / `target_file` → `path`.
265
-
266
- Repair-teller per `(tool, repair)` als extension status.
267
- `wishcraft.repairsEnabled` default true. Scope: custom tools +
268
- extensie-tools. Pi core-tools laten we met rust — core valideert
269
- zijn eigen schema's.
270
-
271
- Done: pure `repairToolInput(tool, input)` + table-driven tests voor
272
- de zes gevallen + de parse-vóór-wrap invariant.
273
-
274
- ### PR G — overlay-submenus (CHE-42) — ✅ #19 + expansion (#13 reopen)
275
-
276
- The `alt+p` menu gets stacked `SelectList` overlays (arrows +
277
- descriptions) instead of flat `ctx.ui.select`. Maximum three top-level
278
- entries. #19 lands the top-level tree (Navigate / Configure /
279
- Status). Configure now uses `showSelectOverlay` (CHE-42 remainder). CHE-40
280
- is Done (#18). CHE-41 is Done: `→` in Navigate, snapshot on open, no second `alt+i` path.
281
-
282
- ### PR H — skills manager v2 UI + token-overlays
283
-
284
- Replaces `skill-manager.ts` (242 lines). The data layer builds on Pi
285
- core `loadSkills` / `loadSkillsFromDir` / `Skill` /
286
- `SkillFrontmatter` (publicly exported in
287
- `@earendil-works/pi-coding-agent`).
288
-
289
- UI, non-negotiable:
290
-
291
- - Working search: substring on name + description + path,
292
- case-insensitive; `ctrl+u` clears; empty match = row
293
- `no skills for '<q>'`.
294
- - Categories with headings (bundled / global / project / prompts);
295
- `tab` switches the filter; `s` sorts name ↔ usage.
296
- - `→` detail (frontmatter table, usage, path, body + scroll);
297
- `enter` inserts; `e` opens `$EDITOR` (default nvim) via external
298
- spawn like pi's `!`; `n` creates a new skill in
299
- `~/.pi/agent/skills/<name>/SKILL.md`; `d` delete + confirm.
300
- - Usage-ledger `~/.pi/agent/skill-usage.json` (name, timestamp,
301
- trigger type). Best-effort, never blocking on the input hot path.
302
- - Skill health: core-diagnostics as a warning icon; `?` explains it.
303
-
304
- Same chrome as the segment navigator. English, direct.
305
-
306
- At the same time, small additions:
307
-
308
- - `/tps` overlay: in/out, peak + average over the existing ring.
309
- No new sampler.
310
- - `/usage` overlay: today / this week / this session; per model;
311
- cache-hit %; ASCII sparkline. File
312
- `~/.pi/agent/wishcraft-usage.json` (append-only, compaction at
313
- threshold).
314
- - `wishcraft.tokenBudget.daily` colors the segment red and warns
315
- in the welcome at 80% / 100%. Never blocking.
316
-
317
- Done: substring filter tests; usage-ledger tests; `/tps` reads
318
- the same ring as the segment (no second source of truth).
319
-
320
- ---
321
-
322
- ## 1.0 — Cockpit
323
-
324
- Shipped. The 0.x train ends at this cut. Preset editor and skill
325
- install-from-repo stay post-1.0 (top-15 P2).
326
-
327
- - [x] `/skills doctor` — broken frontmatter, long descriptions, global/project
328
- duplicates, unused skills. Table, not an essay. (GRO-1416, #28)
329
- - [x] `/skills new` templates — standard, browser-workflow, CLI-workflow,
330
- review-checklist. No marketplace. (GRO-1417, #32)
331
- - [x] Policy engine — in-process deny/inject, no spawn. Command hooks remain
332
- for anything that needs a process. (GRO-1418, #29)
333
- - [x] Per-segment detail (CHE-41) — `→` in Navigate, snapshot on open.
334
- - [x] Idea review — `/ideas` overlay: idea / in-progress / done, tags,
335
- Run with skill X. Welcome widget shows next idea + `/ideas next`.
336
- (GRO-1419, #31)
337
- - [x] Status keys — `powerline.tps`, `powerline.ports`, `powerline.preset`,
338
- `powerline.skills.count` via `ctx.ui.setStatus`. Not the public pitch.
339
- (GRO-1420)
340
- - [x] Read-tool hints — continuation hint when core omits a range/offset
341
- summary. (GRO-1420)
342
- - [x] English operator UI. (GRO-1422, #24)
343
- - [x] README lists doctor, new, policy, and idea-review. `banner.png` only.
344
-
345
- ---
346
-
347
- ## Linear
348
-
349
- | Ticket | Actie |
350
- |---|---|
351
- | GRO-1060 fork cleanup | Done. Release-pad bewezen. CHANGELOG niet inkorten. Versie niet resetten. `banner.png` blijft. |
352
- | GRO-1061 CI queue | Ops, niet deze roadmap. |
353
- | CHE-40 `/powerline` tab | Done (#18 / 0.19.2). |
354
- | CHE-41 per-segment detail | Done. `→` in Navigate; snapshot on open; `alt+i` stays ports. |
355
- | CHE-42 drill-down | Done (#19 + Configure in #13). |
356
- | GRO-1414 0.20 leftovers | Done (#20 / 0.22.0). |
357
-
358
- Oude `pi-powerline-footer`-projecttickets niet laten staan alsof
359
- die package nog leeft.
360
-
361
- ---
362
-
363
- ## Kwaliteit (altijd)
364
-
365
- - Overlay logic is testable via pure functions. No headless `ctx.ui`.
366
- - **English UI:** operator overlays, notify strings, and `/wishcraft` copy are
367
- English. Do not add Dutch UI strings.
368
- - `prepublishOnly` = `tsc --noEmit`. Een slecht type ship't niet.
369
- - `madge --circular` blijft CI. Nieuwe map in `src/` → check mee.
370
- - Dependabot-vulns (devDep-transitief): waiven, track op GRO-603.
371
- Niet required in CI. Geen stille bump van TypeScript 7 of
372
- `@types/node` 26 in een bug-PR.
373
- - TPS-core blijft 1s sliding window over 5s-ring. Geen regressie
374
- naar session-average of per-render EMA (beide spikten:
375
- `tps:12775`).
376
-
377
- ---
378
-
379
- ## Residual risks
380
-
381
- - `SelectList.setFilter` matcht alleen prefix op `value`. Overlay-chrome
382
- filtert zelf op substring (GRO-1414). Skills-manager had dat al.
383
- - `npm deprecate` van de oude naam faalt tot de scope-owner het
384
- token verruimt. Gebruikers die `pi-powerline-footer` installeren
385
- blijven op 0.17.2.
386
- - Hooks spawnen processen. Default timeout 30s; kill-switch
387
- `wishcraft.hooksEnabled` bestaat al op `main`.
388
- - Repairs op core-tools raken we niet aan. Als DeepSeek-achtige
389
- modellen daar alsnog op stuklopen, is dat een gesprek met pi
390
- core, geen stille override.
391
- - `loadSkills` API-drift: we pinnen `@earendil-works/pi-coding-agent`
392
- `>=0.81.0 <0.85.0`. 0.20 neemt de publieke export over; bij
393
- breaking change blijven we op eigen scan tot de pin omhoog kan.
394
- - Usage-ledger corruptie: best-effort write, kapot JSON → leeg
395
- object, nooit throw op de input-path.
396
- - ChefGroep-keys in 1.0 mogen de publieke README niet gijzelen.
397
-
398
- ---
399
-
400
- ## Rollback
401
-
402
- - PR A–H: revert-commit op `main`. Geen force-push.
403
- - 0.19-tag te vroeg: laat de tag staan, ship `0.19.1` met de fix.
404
- Tags niet herschrijven.
405
- - Fork-tags (51 stuks) zijn weg. Recovery = upstream remote
406
- `nicobailon/pi-powerline-footer` opnieuw fetchen, niet onze
407
- `v0.10.0+` overschrijven.
408
- - DevDep-bumps (pi-* 0.84.2, TS 7) horen in een eigen PR met
409
- `npm ci` + de verify-trio. Revert = die PR revert + `npm ci`.
410
-
411
- ---
412
-
413
- ## Checklist (1:1 met 0.19)
414
-
415
- - [x] PR A gemerged: filter, debris, cache, triggers, bash-leaks,
416
- CodeQL. Verify-trio groen. (#12)
417
- - [x] `npm pack --dry-run` bevat geen `ook.md` / `test.md`.
418
- - [x] PR B gemerged: labels, template, TPS-opties, visibility.
419
- Verify-trio groen. (#12)
420
- - [x] Gallery-contract gemerged (`chore/pi-dev-gallery`): keywords,
421
- `publishConfig.access`, `pi.image`, `npm run verify:package`. (#11)
422
- - [x] PR C: merge to `main` tagged `v0.19.0` then `v0.19.1` then
423
- `v0.19.2` and published (`npm view` = `0.19.2`). Same-job bump
424
- publish via #16. CHE-40 tab-complete via #18.
425
- - [x] README skills-sectie waar; deze ROADMAP in sync met 0.19.2.
426
- - [x] CHE-40: `/powerline` subcommand-tab geland (#18). CHE-41/42
427
- hernoemd naar wishcraft.
3
+ Baseline: **v1.2.0**, published 2026-08-24.
4
+
5
+ Pi is the engine. Wishcraft is the operator experience layer: Signal, Deck, skills, ideas, shell UX, hooks, repairs and policy without forking Pi core.
6
+
7
+ Historical 0.x/1.0/vNext campaign detail belongs in `CHANGELOG.md` and `docs/design/`. This file describes only the current product contract and work that is still open.
8
+
9
+ ## Product boundary
10
+
11
+ Wishcraft may extend the Pi experience, but it does not become:
12
+
13
+ - a Pi fork or second agent engine;
14
+ - a fleet/orchestration control plane;
15
+ - a SaaS integrations bundle;
16
+ - a second plugin runtime competing with Pi extensions;
17
+ - a telemetry collector by default.
18
+
19
+ External systems should connect through small contribution/integration contracts. Vendor-specific control planes belong outside Wishcraft.
20
+
21
+ ## Release line
22
+
23
+ | Release | Theme | State | Done means |
24
+ | --- | --- | --- | --- |
25
+ | **1.2** | Operator Layer | shipped | Deck, universal Signal, structural appearance, motion gallery/composer, skill workbench and first-class motion accessibility |
26
+ | **1.3** | Hardening | current | release invariant, render-path performance, one token source of truth, explicit renderer/lifecycle contracts, regression coverage |
27
+ | **1.4** | Extension Contract | next | typed settings registry plus small contribution APIs; no new plugin runtime |
28
+ | **1.5** | Craft Ecosystem | later | curated skill/package workflows built on Pi-native distribution and the contribution contract |
29
+ | **2.0** | Stable Experience Platform | target | documented compatibility policy, migrations, performance budgets and stable public extension points |
30
+
31
+ ## 1.3 — Hardening
32
+
33
+ No feature dump. This release exists to make the v1.2 surface trustworthy.
34
+
35
+ ### P0 — release integrity
36
+
37
+ - One reusable `Verify` contract for PR verification and release gating.
38
+ - Verify includes whitespace, typecheck, unit tests, circular dependency check and Pi package contract.
39
+ - Release jobs depend on Verify and re-check the synchronized `origin/main` tree before tagging.
40
+ - `main` should require the Verify check in repository rules before merge.
41
+
42
+ ### P0 — render/runtime performance
43
+
44
+ - Deck paint must not run filesystem-backed skill discovery, skill doctor or settings parsing.
45
+ - Expensive Deck data is cached as static snapshot state and refreshed only on open, relevant navigation or mutation.
46
+ - Live model/Git/context/queue/Signal state remains cheap to repaint.
47
+ - Idle motion stays 0 FPS.
48
+
49
+ ### P0 — appearance consistency
50
+
51
+ - `src/config/types.ts` + `src/config/tokens.ts` are the canonical token contract.
52
+ - `src/theme/tokens/*` is compatibility-only; it may re-export but may not define a second palette or semantic mapping.
53
+ - One structural base must paint the same semantic roles regardless of the configuration path used to select it.
54
+
55
+ ### P0 — Signal contract
56
+
57
+ - Signal is the universal status renderer for legacy and structural presets.
58
+ - Legacy presets keep their existing segment/layout/color contract unless a structural appearance layer is explicitly selected.
59
+ - Terminal one-shots (`success`, `warning`, `error`) settle to `idle/ready` after their finite burst.
60
+ - Reduced/off/screen-reader modes communicate state without requiring animation.
61
+
62
+ ### P1 — verification matrix
63
+
64
+ Add/keep regression coverage for:
65
+
66
+ - widths around 40 / 80 / 120+ columns;
67
+ - ASCII, Nerd Font and `NO_COLOR` rendering;
68
+ - full / reduced / functional / off motion;
69
+ - Deck render hot-path invariants;
70
+ - legacy preset color compatibility;
71
+ - release-gate dependency order;
72
+ - Linux and macOS system-segment parsing.
73
+
74
+ ## 1.4 — Extension Contract
75
+
76
+ The next architecture step is **composability**, not more built-in routes.
77
+
78
+ ### Typed settings registry
79
+
80
+ One registry should drive:
81
+
82
+ ```text
83
+ settings definition
84
+ │
85
+ ├─ parsing + validation
86
+ ├─ defaults + migrations
87
+ ├─ /wishcraft settings
88
+ ├─ Pi settings contribution (where supported)
89
+ └─ generated documentation/examples
90
+ ```
91
+
92
+ This removes duplicate knowledge about settings and enables a real zero-config first run.
93
+
94
+ ### Small contribution API
95
+
96
+ Target capabilities, subject to Pi host APIs:
97
+
98
+ ```text
99
+ registerDeckRoute()
100
+ registerSignalSource()
101
+ registerMotion()
102
+ registerAppearanceContribution()
103
+ registerRecipeOrAction()
104
+ contributeSettings()
105
+ ```
106
+
107
+ Rules:
108
+
109
+ - Pi remains the package/extension runtime.
110
+ - Contributions are data/callback contracts, not arbitrary nested plugin loaders.
111
+ - Public contracts are versioned and capability-scoped.
112
+ - A failing contribution cannot take down Signal or the Deck.
113
+
114
+ ## 1.5 — Craft Ecosystem
115
+
116
+ After the contribution/settings contracts are stable:
117
+
118
+ - skill import/install workflows from explicit trusted sources;
119
+ - curated recipes/actions that compose existing Wishcraft/Pi capabilities;
120
+ - package discovery surfaced through Pi-native package distribution rather than a parallel Wishcraft marketplace;
121
+ - export/import of appearance and motion recipes with validation.
122
+
123
+ ## 2.0 — Stable Experience Platform
124
+
125
+ 2.0 is justified when the public contracts, not the feature count, are stable.
126
+
127
+ Required before 2.0:
128
+
129
+ - compatibility and deprecation policy;
130
+ - settings migrations with round-trip tests;
131
+ - measured render/performance budgets;
132
+ - stable contribution API with fault isolation;
133
+ - release provenance and required repository checks;
134
+ - docs generated from canonical contracts where practical;
135
+ - no known duplicate sources of truth for tokens, settings or release verification.
136
+
137
+ ## Always-on engineering rules
138
+
139
+ - English operator UI.
140
+ - No synchronous discovery work in paint/render loops.
141
+ - No background animation when nothing consumes it.
142
+ - Core Pi tools are not silently rewritten by Wishcraft repairs.
143
+ - Policies and hooks remain explicitly disableable.
144
+ - Security-sensitive paths fail closed.
145
+ - Package/release verification runs before npm publication.
146
+ - New features must fit the operator-layer boundary above.
package/docs/commands.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Usage
4
4
 
5
- Activates automatically. Toggle with `/powerline`, switch presets with `/powerline <name>`, and move the primary row with `/powerline placement above|below|toggle`.
5
+ Activates automatically. Toggle with `/signal` (alias `/powerline`). Switch layouts with `/signal <name>`. `/signal menu` opens Navigate / Configure / Status. `/wishcraft` opens the Deck; `/wishcraft settings` is the flat list. Move the primary row with `/signal placement above|below|toggle`.
6
6
 
7
7
  Use `/cd <path>` to continue the current conversation from another working directory. It supports relative paths, absolute paths, `~`, `~/...`, and directory completions. With no argument, `/cd` prints the current Pi session directory. The command switches into a cwd-updated session file so Pi tools and the footer path segment agree after the change.
8
8
 
@@ -101,8 +101,12 @@ Pi core renders the footer as static text, so live click is not possible; action
101
101
  - `/open-ports`: list listening ports and pick one
102
102
  - `/powerline doctor`: diagnostics overlay — settings file validity, unknown presets, Nerd Font detection, git polling, bash-mode status, and queue file health
103
103
  - `/powerline export`: export the current preset + effective layout + labels as a JSON snippet (Enter copies it to the clipboard)
104
- - `alt+p`: **powerline menu**: navigate the live segments (`↑`/`↓` + `enter`, `→`/`tab` opens a per-segment detail panel captured at open), configure (preset / TPS / UDP / segment visibility / labels / build custom preset), or open the full ports list
104
+ - `alt+p`: **Wishcraft Deck** — operator overlay (Home, Signal, Skills, Ideas, Guardrails, Appearance, …). `g` then a jump key (`h` home, `s` signal, `a` appearance). Escape closes. `/signal menu` still opens Navigate / Configure / Status.
105
105
  - `alt+i`: **powerline info**: full open-ports list
106
+ - `/wishcraft [route]`: open the Deck at a named route (`appearance`, `skills`, …)
107
+ - `/wishcraft settings`: flat settings TUI, including `powerline.appearance.base` and `powerline.motionLevel`
108
+ - Deck **Motion**: gallery + composer. `t` picks the event, Enter applies, `e` opens the composer
109
+ - Deck **Skills**: workbench list with health; Enter inserts the skill body
106
110
 
107
111
  Both `alt+p` and `alt+i` are rebindable (see Keybinds below); changes apply after `/reload`.
108
112
 
@@ -190,6 +190,27 @@ Make `open_ports` probe a named SSH host instead of the laptop:
190
190
 
191
191
  See [Segments & theming](./segments.md) for the probe's best-effort behavior and requirements.
192
192
 
193
+ ## Appearance
194
+
195
+ `powerline.appearance` is independent of the information layout (`powerline.preset`). The structural base paints Signal colors and motion. Layout presets (`default`, `minimal`, `compact`, `full`, `nerd`, `ascii`, `chef`) keep their segment lists until you change `preset`.
196
+
197
+ ```json
198
+ {
199
+ "powerline": {
200
+ "preset": "chef",
201
+ "appearance": {
202
+ "base": "lanternwake"
203
+ }
204
+ }
205
+ }
206
+ ```
207
+
208
+ Bases: `lanternwake`, `threadbound`, `scryglass`, `runebloom`, `moonwell`, `hexforge`, `vellum`, `wisp`, `starweave`, `crucible`. Apply from Deck → Appearance → Enter, `/wishcraft settings`, or `/signal hexforge` (a structural layout name also writes `appearance.base`). Optional mix keys: `palette`, `signalLayout`, `chrome`, `glyphs`, `deck`, `welcome`, `motion`.
209
+
210
+ Until `appearance` is set, Signal keeps the layout preset colors. If `preset` itself is a structural name and `appearance` is empty, that name is treated as the base.
211
+
212
+ `powerline.motionLevel` is `full`, `reduced`, `functional`, or `off`. Host flags still win: `NO_COLOR`, `WISHCRAFT_MOTION`, `WISHCRAFT_SCREEN_READER`, and `PREFER_REDUCED_MOTION`. Deck Motion → Enter writes `powerline.appearance.motion.<event>`.
213
+
193
214
  ## Status bridge for other extensions
194
215
 
195
216
  Powerline publishes its own state under a stable key set so ChefBar and other extensions can read it without depending on powerline internals: