@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.
- package/CHANGELOG.md +15 -0
- package/README.md +16 -7
- package/ROADMAP.md +144 -425
- package/docs/commands.md +6 -2
- package/docs/configuration.md +21 -0
- package/docs/design/accessibility.md +71 -0
- package/docs/design/deck-layout.md +69 -0
- package/docs/design/motion-gallery.md +80 -0
- package/docs/design/motion-system.md +119 -0
- package/docs/design/presets.md +196 -0
- package/docs/design/regression-testing.md +54 -0
- package/docs/design/responsive.md +53 -0
- package/docs/design/signal.md +71 -0
- package/docs/design/theme-contract.md +132 -0
- package/docs/design/vnext-overview.md +55 -0
- package/docs/design/vnext-release-plan.md +212 -0
- package/docs/index.md +19 -1
- package/docs/segments.md +1 -1
- package/package.json +2 -1
- package/src/config/appearance.ts +229 -0
- package/src/config/parse.ts +41 -0
- package/src/config/presets.ts +184 -0
- package/src/config/structural-presets.ts +555 -0
- package/src/config/tokens.ts +154 -0
- package/src/config/types.ts +210 -2
- package/src/extension/commands/commands.ts +36 -12
- package/src/extension/commands/powerline-completions.ts +4 -0
- package/src/extension/commands/queue-commands.ts +6 -0
- package/src/extension/core/segment-context.ts +27 -21
- package/src/extension/core/state.ts +16 -1
- package/src/extension/core/types.ts +11 -1
- package/src/extension/session/session-lifecycle.ts +29 -65
- package/src/extension/session/session-notifications.ts +91 -0
- package/src/extension/settings/appearance-write.ts +135 -0
- package/src/extension/settings/wishcraft-config-items.ts +119 -0
- package/src/extension/settings/wishcraft-config.ts +28 -114
- package/src/extension/skills/skill-manager.ts +5 -0
- package/src/extension/ui/deck/component.ts +371 -0
- package/src/extension/ui/deck/index.ts +34 -0
- package/src/extension/ui/deck/render.ts +260 -0
- package/src/extension/ui/deck/route-bodies.ts +209 -0
- package/src/extension/ui/deck/routes.ts +37 -0
- package/src/extension/ui/deck/session-snapshot.ts +122 -0
- package/src/extension/ui/deck/types.ts +97 -0
- package/src/extension/ui/powerline-menu-view.ts +19 -15
- package/src/extension/ui/signal-layout.ts +76 -0
- package/src/extension/ui/status-line-renderers.ts +20 -2
- package/src/motion/accessibility.ts +59 -0
- package/src/motion/catalog-extra.ts +429 -0
- package/src/motion/catalog.ts +336 -0
- package/src/motion/composer.ts +147 -0
- package/src/motion/frames.ts +84 -0
- package/src/motion/gallery.ts +77 -0
- package/src/motion/index.ts +78 -0
- package/src/motion/policy.ts +128 -0
- package/src/motion/scheduler.ts +159 -0
- package/src/motion/types.ts +132 -0
- package/src/render/timer.ts +1 -0
- package/src/signal/controller.ts +135 -0
- package/src/signal/integration.ts +46 -0
- package/src/signal/render.ts +178 -0
- package/src/theme/detect.ts +48 -0
- package/src/theme/tokens/index.ts +9 -0
- package/src/theme/tokens/mapping.ts +21 -0
- package/src/theme/tokens/types.ts +6 -0
- package/src/usage/token-budget.ts +23 -0
package/ROADMAP.md
CHANGED
|
@@ -1,427 +1,146 @@
|
|
|
1
1
|
# Roadmap — pi-wishcraft
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
|
28
|
-
|
|
29
|
-
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
-
|
|
67
|
-
-
|
|
68
|
-
|
|
69
|
-
-
|
|
70
|
-
|
|
71
|
-
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
-
|
|
110
|
-
-
|
|
111
|
-
-
|
|
112
|
-
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
-
|
|
119
|
-
|
|
120
|
-
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
|
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`: **
|
|
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
|
|
package/docs/configuration.md
CHANGED
|
@@ -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:
|