@groeponline/pi-wishcraft 0.17.3 → 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.
Files changed (62) hide show
  1. package/AGENTS.md +14 -10
  2. package/CHANGELOG.md +26 -0
  3. package/README.md +42 -11
  4. package/RELEASE.md +46 -21
  5. package/ROADMAP.md +362 -37
  6. package/bash-mode/completion.ts +39 -6
  7. package/bash-mode/editor.ts +43 -2
  8. package/bash-mode/history.ts +3 -3
  9. package/bash-mode/shell-session.ts +14 -3
  10. package/index.ts +3 -3
  11. package/package.json +19 -6
  12. package/src/config/presets.ts +101 -19
  13. package/src/config/segment-options.ts +47 -0
  14. package/src/config/types.ts +22 -0
  15. package/src/core/frontmatter.ts +43 -0
  16. package/src/extension/{bash-mode-actions.ts → commands/bash-mode-actions.ts} +4 -4
  17. package/src/extension/{commands.ts → commands/commands.ts} +34 -11
  18. package/src/extension/{queue-commands.ts → commands/queue-commands.ts} +4 -4
  19. package/src/extension/{vibe-command.ts → commands/vibe-command.ts} +2 -3
  20. package/src/extension/{constants.ts → core/constants.ts} +2 -5
  21. package/src/extension/{segment-context.ts → core/segment-context.ts} +8 -11
  22. package/src/extension/{state.ts → core/state.ts} +14 -14
  23. package/src/extension/{types.ts → core/types.ts} +9 -9
  24. package/src/extension/{prompt-history.ts → history/prompt-history.ts} +3 -3
  25. package/src/extension/{stash-history.ts → history/stash-history.ts} +6 -6
  26. package/src/extension/hooks/hooks-config.ts +124 -0
  27. package/src/extension/hooks/hooks-runner.ts +149 -0
  28. package/src/extension/hooks/index.ts +191 -0
  29. package/src/extension/hooks/repairs.ts +79 -0
  30. package/src/extension/{queue-context.ts → queue/queue-context.ts} +1 -1
  31. package/src/extension/{queue-integration.ts → queue/queue-integration.ts} +12 -9
  32. package/src/extension/{activate.ts → session/activate.ts} +9 -7
  33. package/src/extension/{git-invalidation.ts → session/git-invalidation.ts} +3 -3
  34. package/src/extension/{session-lifecycle.ts → session/session-lifecycle.ts} +25 -22
  35. package/src/extension/{settings-io.ts → settings/settings-io.ts} +38 -17
  36. package/src/extension/settings/wishcraft-config.ts +410 -0
  37. package/src/extension/{shortcuts-config.ts → shortcuts/shortcuts-config.ts} +8 -8
  38. package/src/extension/{shortcuts-router.ts → shortcuts/shortcuts-router.ts} +10 -13
  39. package/src/extension/skills/inline-invocation.ts +138 -145
  40. package/src/extension/skills/skill-manager.ts +490 -0
  41. package/src/extension/skills/skill-registry.ts +342 -0
  42. package/src/extension/{custom-editor.ts → ui/custom-editor.ts} +15 -16
  43. package/src/extension/{layout.ts → ui/layout.ts} +10 -10
  44. package/src/extension/{menu-views.ts → ui/menu-views.ts} +51 -7
  45. package/src/extension/{powerline-widgets.ts → ui/powerline-widgets.ts} +6 -3
  46. package/src/extension/{status-line-renderers.ts → ui/status-line-renderers.ts} +13 -10
  47. package/src/extension/{welcome-control.ts → welcome/welcome-control.ts} +1 -1
  48. package/src/extension/{welcome-integration.ts → welcome/welcome-integration.ts} +19 -8
  49. package/src/git/status.ts +75 -7
  50. package/src/segments/core.ts +31 -2
  51. package/src/segments/custom.ts +7 -1
  52. package/src/segments/registry.ts +34 -3
  53. package/src/segments/system.ts +67 -32
  54. package/src/shell/cd-command.ts +2 -2
  55. package/src/welcome/banner.ts +1 -0
  56. package/src/welcome/lantern-art.ts +37 -0
  57. package/src/welcome/lantern.ts +86 -0
  58. package/src/welcome/renderer.ts +6 -39
  59. package/src/welcome/types.ts +2 -0
  60. package/src/extension/skills/ook.md +0 -6
  61. package/src/extension/skills/test.md +0 -6
  62. /package/src/extension/{stale-context.ts → session/stale-context.ts} +0 -0
package/AGENTS.md CHANGED
@@ -16,15 +16,19 @@ user customization.
16
16
  `parseBashModeSettings`, `PowerlineShortcuts`). Keep it a barrel; no
17
17
  implementation lives here.
18
18
  - `src/` — the proxy-free extension runtime, organized by domain:
19
- - `src/extension/` — activation, command handlers, session lifecycle,
20
- custom editor wiring, shortcut routing, settings IO, queue and menu views.
21
- Leaf modules (`types.ts`, `constants.ts`, `queue-context.ts`,
22
- `welcome-control.ts`, `settings-io.ts`, `prompt-history.ts`,
23
- `stash-history.ts`, `shortcuts-config.ts`) keep the dependency graph
24
- acyclic: shared types and constants live in leaves, queue/welcome
25
- callbacks are wired through leaves or `RuntimeState`, and `state.ts` is
26
- the hub that only has inbound edges. Verify with `npx madge --circular
27
- src index.ts bash-mode queue`.
19
+ - `src/extension/` — the extension runtime, organized into domain subfolders:
20
+ `core/` (constants, types, `state.ts` hub, segment-context), `commands/`
21
+ (slash commands, queue commands, bash-mode actions, vibe command),
22
+ `session/` (activation, session lifecycle, git invalidation, stale-context),
23
+ `ui/` (custom editor, layout, menu views, powerline widgets, status-line
24
+ renderers), `history/` (prompt + stash history), `queue/` (queue context +
25
+ integration), `settings/` (settings IO), `shortcuts/` (shortcut config +
26
+ router), `welcome/` (welcome control + integration), `skills/` (inline
27
+ invocation). Leaf modules keep the dependency graph acyclic: shared types
28
+ and constants live in `core/`, queue/welcome callbacks are wired through
29
+ leaves or `RuntimeState`, and `core/state.ts` is the hub that only has
30
+ inbound edges. Verify with `npx madge --circular src index.ts bash-mode
31
+ queue`.
28
32
  - `src/config/` — powerline config parsing, presets, types, segment ids/options.
29
33
  - `src/segments/` — segment registry and the segment renderers.
30
34
  - `src/theme/` — colors, icons, separators, theme loading.
@@ -48,7 +52,7 @@ user customization.
48
52
  boundaries (e.g. command handlers out of `commands.ts`, git invalidation
49
53
  out of `session-lifecycle.ts`). Prefer many cohesive small modules.
50
54
  - **No circular imports.** Domain modules must not import back into
51
- `src/extension/state.ts` for callbacks; move the callback into a leaf module
55
+ `src/extension/core/state.ts` for callbacks; move the callback into a leaf module
52
56
  (e.g. `welcome-control.ts`) or wire it through `RuntimeState`.
53
57
  - **Bun/Node-native TS:** `import` paths carry `.ts` extensions
54
58
  (`allowImportingTsExtensions`), `node:`-prefixed builtins, `node --test`
package/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.19.0] - 2026-08-20
4
+
5
+ ### Added
6
+ - Every merge to `main` cuts an npm release: CI chooses patch/minor/major from commits since the last `v*` tag, pushes `vX.Y.Z`, and publishes with the GroepOnline org secret `NPM_TOKEN`. `[skip release]` opts out.
7
+
8
+ ### Changed
9
+ - Pi catalog contract: `pi-extension` / `wishcraft` keywords, public `publishConfig`, and a `pi.image` banner so the next npm publish lands on [pi.dev/packages](https://pi.dev/packages?name=groeponline) next to the other GroepOnline packages.
10
+
11
+ ## [0.18.0] - 2026-08-16
12
+
13
+ Wishcraft v2 (#7).
14
+
15
+ ### Added
16
+ - **Tab token completion** — bash-mode tab completion for stored tokens/shortcuts.
17
+ - **Preset rework** — own-property preset handling plus reworked presets.
18
+ - **Git commit/ahead-behind extras** — commit count and ahead/behind in the git segment; ANSI/control chars in git commit metadata sanitized.
19
+ - **TPS in/out** — separate tokens-in/tokens-out throughput.
20
+ - **Interactive skill-manager TUI** (`/skills`) — browse, inspect, and manage discovered skills.
21
+ - **Full git polling for compact extras** — reliable commit/ahead-behind data.
22
+
23
+ ### Changed
24
+ - **Extension refactor** — `src/extension` split into domain subfolders (core, commands, session, ui, history, queue, settings, shortcuts, welcome).
25
+
26
+ ### Fixed
27
+ - **Ghost suggestions revalidated after partial completion** — and scheduleGhostUpdate stubbed in tab token-step tests.
28
+
3
29
  ## [0.17.3] - 2026-08-10
4
30
 
5
31
  ### Added
package/README.md CHANGED
@@ -13,7 +13,7 @@ This extension translates that philosophy to the [pi](https://github.com/badlogi
13
13
  4. **Stash & Pivot (Alt+S)**: Park a prompt draft, ask a quick question, pop it back automatically.
14
14
  5. **Sticky Shell (`!cmd`)**: A persistent bash runtime under your fingertips.
15
15
 
16
- Inspired by [Powerlevel10k](https://github.com/romkatv/powerlevel10k) and [oh-my-pi](https://github.com/can1357/oh-my-pi).
16
+ Inspired by [Powerlevel10k](https://github.com/romkatv/powerlevel10k) and [oh-my-pi](https://github.com/can1357/oh-my-pi). Forked from [`nicobailon/pi-powerline-footer`](https://github.com/nicobailon/pi-powerline-footer), maintained by [GroepOnline](https://github.com/GroepOnline).
17
17
 
18
18
  <img width="1261" height="817" alt="Example powerline UI" src="https://github.com/user-attachments/assets/4cc43320-3fb8-4503-b857-69dffa7028f2" />
19
19
 
@@ -54,6 +54,8 @@ Inspired by [Powerlevel10k](https://github.com/romkatv/powerlevel10k) and [oh-my
54
54
  pi install npm:@groeponline/pi-wishcraft
55
55
  ```
56
56
 
57
+ Listed on the [Pi package catalog](https://pi.dev/packages?name=wishcraft) as `@groeponline/pi-wishcraft` next to the other GroepOnline pi packages.
58
+
57
59
  ### Method 2: One-Liner / Cloud Agent Startup Script (Cursor Cloud, Freebuff, Devcontainers, CI)
58
60
 
59
61
  For ephemeral VMs, cloud agents, or dev environments without manual intervention:
@@ -125,13 +127,13 @@ You can also set it in the agent settings file (`~/.pi/agent/settings.json` by d
125
127
 
126
128
  | Preset | Description |
127
129
  |--------|-------------|
128
- | `default` | Model, thinking, path (basename), git, context, tokens, cost |
129
- | `minimal` | Just path (basename), git, context |
130
- | `compact` | Model, git, cost, context |
131
- | `full` | Everything including hostname, time, abbreviated path |
132
- | `nerd` | Maximum detail for Nerd Font users |
133
- | `ascii` | Safe for any terminal |
134
- | `chef` | Fork default: muted colors, slash separators, TPS + open-ports segments |
130
+ | `default` | Balanced daily driver: model, thinking, path (basename), git (branch + dirty + latest commit + ↑/↓ ahead-behind + host icon), session, queue, subagent cost, tokens in/out, cache-hit%, cost, context |
131
+ | `minimal` | Just path (basename), git branch and context% (branch-only polling, no indicators/commit) |
132
+ | `compact` | Model, git (short commit + ahead/behind), queue, cost, context%, session id |
133
+ | `full` | Everything: hostname, model, path (abbreviated), full git incl commit + ↑/↓, totals, context total, elapsed + clock |
134
+ | `nerd` | Maximum detail for Nerd Font users: qualified model, full tokens + cache, commit, totals, seconds clock |
135
+ | `ascii` | Safe for any terminal: branch + short commit + ↑/↓, tokens, cost, context% (no Nerd glyphs) |
136
+ | `chef` | Fork default: muted colors, slash separators, live TPS in/out + open-ports + subagent-cost segments |
135
137
 
136
138
  **Environment:** `POWERLINE_NERD_FONTS=1` to force Nerd Fonts, `=0` for ASCII.
137
139
 
@@ -238,7 +240,7 @@ Define your own preset in settings; it merges over built-ins and is selectable v
238
240
 
239
241
  `preset: "chef"` is the GroepOnline fork's default look: muted colors (no rainbow), slash separators, and two extra right-side segments:
240
242
 
241
- - `tps`: live tokens/sec, rolling 1-second window (EMA-free, no spikes); a rocket/bolt icon lights up while generating (override with env `POWERLINE_TPS`)
243
+ - `tps`: live tokens/sec over a rolling 1-second window (EMA-free, no spikes), now reporting **output and input** rates separately (`⇡out ⇣in`) so you can see generation speed and incoming prompt tokens at a glance. A rocket/bolt icon lights up while streaming (override with env `POWERLINE_TPS`).
242
244
  - `open_ports`: count of unique **TCP** listening ports (`ss` → `netstat` → `/proc/net` fallback, dedupes IPv4/IPv6). Set `segmentOptions.openPorts.includeUdp: true` to include noisy UDP (mDNS/DHCP/ephemeral).
243
245
 
244
246
  Interactivity (Pi core renders the footer as static text, so live click is not possible; actions live in commands and a navigable overlay):
@@ -378,7 +380,7 @@ While bash mode is active:
378
380
 
379
381
  - Enter runs the current shell command
380
382
  - Right Arrow accepts ghost text into the editor without running it
381
- - Tab accepts the current ghost suggestion when one exists; otherwise it does nothing
383
+ - Tab completes the ghost suggestion one token/segment at a time (repeat Tab to step through each further token); once the full suggestion is inserted it clears, otherwise Tab does nothing
382
384
  - Up and Down browse matching shell history
383
385
  - `escape` exits bash mode and returns to normal prompt mode
384
386
  - `ctrl+c` interrupts the active shell job before falling back to normal pi behavior
@@ -462,6 +464,14 @@ After changing bindings, run `/reload`. Invalid bindings, reserved key conflicts
462
464
 
463
465
  Powerline wraps Pi's autocomplete provider so bash mode can add shell-aware suggestions. When another editor extension was already installed, powerline now passes Pi's provider through that previous editor's `setAutocompleteProvider()` first and then wraps the resulting provider. This preserves prior autocomplete-provider wrappers where possible, but it is not full render/input composition between custom editors.
464
466
 
467
+ ## Skill manager
468
+
469
+ Browse and insert your installed skills (`SKILL.md` files and `*.md`/`*.txt` prompts) from an interactive TUI overlay:
470
+
471
+ - **`/skills`** — open the skill manager. Filter with plain typing, `↑↓` to move, `enter` to open a skill's detail body, `↑↓` in the detail to scroll, `enter`/`tab` to insert the skill content into your prompt, `esc` to go back/close.
472
+
473
+ The manager reuses the same skill discovery as inline `/command`/`$skill` triggers, so anything you can inline you can also browse and insert manually.
474
+
465
475
  ## Working Vibes
466
476
 
467
477
  Transform boring "Working..." messages into themed phrases that match your style:
@@ -583,9 +593,27 @@ Set `git.hostIcon` to replace the branch icon with the origin remote's host logo
583
593
 
584
594
  The origin remote is detected (SSH or HTTPS) and mapped to an icon: GitHub (`nf-fa-github`), GitLab (`nf-fa-gitlab`), Bitbucket (`nf-fa-bitbucket`), or a generic git logo (`nf-fa-git`) for any other remote (self-hosted, Gitea, Codeberg, …). Repositories without an origin remote keep the plain branch icon (`nf-fa-code_fork`), as do ASCII (non–Nerd Font) setups. The remote is read once and cached, so this adds no per-render cost. Default is `false` (branch icon unchanged).
585
595
 
596
+ ## Git status extras (commits, ahead/behind)
597
+
598
+ The git segment can also show the last commit on `HEAD` (short hash + subject) and the upstream ahead/behind counts — handy for a quick "where am I relative to main" GitHub signal:
599
+
600
+ - `git.showCommit` (`true` by default) — appends `#<hash> <subject>` for the latest commit.
601
+ - `git.maxCommitSubjectLength` (`24`) — truncates the commit subject shown.
602
+ - `git.showAheadBehind` (`true` by default) — appends `↑<n> ↓<n>` for commits ahead/behind the configured upstream (hidden when there is no upstream).
603
+
604
+ ```json
605
+ {
606
+ "powerline": {
607
+ "git": { "showCommit": true, "showAheadBehind": true, "maxCommitSubjectLength": 24 }
608
+ }
609
+ }
610
+ ```
611
+
612
+ The `minimal` and `compact` presets keep these off to stay lean; set `showCommit: true`/`showAheadBehind: true` to enable them.
613
+
586
614
  ## Segments
587
615
 
588
- `model` · `thinking` · `shell_mode` · `path` · `git` · `subagents` · `token_in` · `token_out` · `token_total` · `cost` · `context_pct` · `context_total` · `time_spent` · `time` · `session` · `hostname` · `cache_read` · `cache_write` · `extension_statuses`
616
+ `model` · `shell_mode` · `path` · `git` · `subagents` · `queue` · `token_in` · `token_out` · `token_total` · `cost` · `context_pct` · `context_total` · `time_spent` · `time` · `session` · `hostname` · `cache_read` · `cache_write` · `thinking` · `tps` · `open_ports` · `extension_statuses`
589
617
 
590
618
  ## Separators
591
619
 
@@ -613,6 +641,9 @@ Colors are configurable via pi's theme system. Each preset defines its own color
613
641
  | `contextError` | `error` | Context usage >90% |
614
642
  | `cost` | `text` | Cost display |
615
643
  | `tokens` | `muted` | Token counts |
644
+ | `queue` | `accent` | Queue / ideas / blocked counts |
645
+ | `separator` | `dim` | Segment separators and ahead/behind counts |
646
+ | `border` | `borderMuted` | Panel/border chrome |
616
647
 
617
648
  ### Custom Theme Override
618
649
 
package/RELEASE.md CHANGED
@@ -1,28 +1,42 @@
1
1
  # Releasing `@groeponline/pi-wishcraft`
2
2
 
3
- This is the GroepOnline fork of `pi-powerline-footer`. It ships to npm as the
4
- scoped package `@groeponline/pi-wishcraft` and installs locally from the
5
- repo path. This doc records the end-to-end release flow and how to verify it.
3
+ `@groeponline/pi-wishcraft` is GroepOnline's powerline status bar and
4
+ interaction layer for the pi coding agent (forked from
5
+ `nicobailon/pi-powerline-footer`, now independently maintained). It ships to
6
+ npm as the scoped package `@groeponline/pi-wishcraft` and installs locally
7
+ from the repo path. This doc records the end-to-end release flow and how to
8
+ verify it.
6
9
 
7
10
  ## Identity
8
11
 
9
- - **GitHub repo:** `GroepOnline/pi-wishcraft` (fork of `nicobailon/pi-powerline-footer`)
12
+ - **GitHub repo:** `GroepOnline/pi-wishcraft` (forked from `nicobailon/pi-powerline-footer`, independently maintained)
10
13
  - **npm package:** `@groeponline/pi-wishcraft` (scoped, `--access public`)
11
14
  - **Default branch:** `main`
12
- - **Local checkout:** `/home/joep/pi-wishcraft`
13
- - **Pi settings (`~/.pi/agent/settings.json`):** packages entry `/home/joep/pi-wishcraft` (local path, not the npm name) and `"powerline": "chef"`. Local edits are picked up on `/reload` — no reinstall needed.
15
+ - **Local checkout:** `~/Documents/Github/GroepOnline/pi-wishcraft`
16
+ - **Pi settings (`~/.pi/agent/settings.json`):** packages entry `npm:@groeponline/pi-wishcraft` and `"powerline": "chef"`. For active development, temporarily swap the entry to the local checkout path so edits are picked up on `/reload` — no reinstall needed; switch back to the npm name for the installed release.
14
17
 
15
18
  ## The release flow
16
19
 
17
- A release is: bump version roll CHANGELOG → commit → tag → push. The tag
18
- triggers CI which tests and publishes to npm.
20
+ **Default:** every merge to `main` is a release. `.github/workflows/release.yml`
21
+ runs `node scripts/release.mjs auto --push` on `main`, then publishes when
22
+ the `v*` tag lands. `auto` reads commit subjects since the last `v*` tag:
23
+ `feat:` → minor, `feat!:` / `BREAKING CHANGE` → major, otherwise patch.
24
+
25
+ The first merge after `v0.18.0` therefore becomes **0.19.0** (the 0.19
26
+ `feat:` commits are already on `main`). Later docs/fix merges become
27
+ `0.19.1`, `0.19.2`, …
28
+
29
+ Put `[skip release]` in the merge-commit subject to opt out. The follow-up
30
+ `chore: release X.Y.Z` commit does not tag again.
31
+
32
+ Manual still works when you want an explicit version before pushing tags:
19
33
 
20
34
  ```bash
21
35
  # 1. Make sure the working tree is clean and tests/typecheck pass (see Verification)
22
36
  npm run typecheck # tsc --noEmit
23
37
  npm test # node --experimental-strip-types --test tests/**/*.test.ts
24
38
 
25
- # 2. Release (patch | minor | major | explicit 1.2.3)
39
+ # 2. Release (patch | minor | major | auto | explicit 1.2.3)
26
40
  npm run release minor # = node scripts/release.mjs minor
27
41
  ```
28
42
 
@@ -34,12 +48,12 @@ npm run release minor # = node scripts/release.mjs minor
34
48
  4. `git commit -m "chore: release <version>"`
35
49
  5. `git tag -a v<version> -m "Release <version>"`
36
50
 
37
- It does **not** push it prints the push command. Push with the GroepOnline SSH
38
- identity (the laptop default `ssh`/OnlineChef key is denied for this org):
51
+ Locally it does **not** push unless you pass `--push` (CI does). Manual push
52
+ uses the GroepOnline SSH identity (the laptop default SSH key is denied):
39
53
 
40
54
  ```bash
41
55
  GIT_SSH_COMMAND='ssh -F ~/.ssh/config-groeponline -o IdentityFile=~/.ssh/sheesh' \
42
- git push origin HEAD --tags
56
+ git push origin HEAD refs/tags/vX.Y.Z
43
57
  ```
44
58
 
45
59
  - SSH host alias: `github.com-groeponline` (defined in `~/.ssh/config-groeponline` with `IdentityFile ~/.ssh/sheesh`, `IdentitiesOnly yes`).
@@ -54,12 +68,15 @@ GIT_SSH_COMMAND='ssh -F ~/.ssh/config-groeponline -o IdentityFile=~/.ssh/sheesh'
54
68
  3. `npm ci --ignore-scripts` (installs devDependencies incl. `typescript`)
55
69
  4. `npm run typecheck` (tsc)
56
70
  5. `npm test` (node test runner)
57
- 6. `npm publish --access public` with `NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}`
71
+ 6. `npm run verify:package` (catalog contract gate see `scripts/verify-package.mjs`)
72
+ 7. `npm publish --access public` with `NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}`
73
+ 8. Echoes the Pi catalog URLs (npm, pi.dev detail page, `?name=wishcraft`, `?name=groeponline`) for post-publish confirmation
58
74
 
59
- `NPM_TOKEN` is a GitHub Actions secret on the repo (publish rights to the
60
- `@groeponline` scope). It is **not** readable after being set; verify it works by
61
- checking that the publish step on a real release succeeds and `npm view` resolves
62
- the new version (see below).
75
+ `NPM_TOKEN` is the GroepOnline **org** Actions secret (publish rights to the
76
+ `@groeponline` scope). This repo has no override; Actions inherits the org
77
+ value. It is **not** readable after being set; verify it works by checking
78
+ that the publish step on a real release succeeds and `npm view` resolves the
79
+ new version (see below). The publish step fails closed if the secret is empty.
63
80
 
64
81
  The package has no build step — `*.ts` files are shipped directly (`pi.extensions:
65
82
  ["./index.ts"]`), and Pi loads them with TypeScript stripping at runtime.
@@ -97,8 +114,8 @@ A release is "done" when all four hold: local green, tag on origin, CI
97
114
  publish succeeded. The CI log line `+ @groeponline/pi-wishcraft@<v>`
98
115
  and HTTP `200` from `https://registry.npmjs.org/@groeponline%2fpi-wishcraft`
99
116
  are the real success signals; retry `npm view` if you see an early 404.
100
- - **Wrong SSH key = `Permission denied (publickey)` / `denied to OnlineChef`.**
101
- Always push with `GIT_SSH_COMMAND='ssh -F ~/.ssh/config-groeponline -o IdentityFile=~/.ssh/sheesh'`.
117
+ - **Wrong SSH key = `Permission denied (publickey)`.**
118
+ Always push with `GIT_SSH_COMMAND='ssh -F ~/.ssh/config-groeponline -o IdentityFile=~/.ssh/sheesh'` (chefadmin-netizen / `~/.ssh/sheesh`).
102
119
  - **TPS used to show absurd values** (e.g. `tps:12775`) because `sessionStartTime`
103
120
  resets on extension reload while output is cumulative. Fixed in 0.15.0 with a
104
121
  rolling token-rate. If TPS ever looks wrong again, check that `tpsSegment` still
@@ -112,6 +129,14 @@ A release is "done" when all four hold: local green, tag on origin, CI
112
129
 
113
130
  ## Versioning
114
131
 
115
- - **patch** (`0.15.0 0.15.1`): bug fixes, doc only.
116
- - **minor** (`0.15.x → 0.16.0`): new segments/presets, features, additive changes.
132
+ Feature PRs **do not bump** `package.json`. They stay on the last published npm
133
+ version (today: `0.18.0`) and append under `## [Unreleased]` in `CHANGELOG.md`.
134
+ The bump happens on `main` in the release workflow, not in the feature PR.
135
+
136
+ Never bump in the same PR as the feature work. Never tag from a stacked
137
+ feature branch. `0.19.0` exists only after `main` auto-tags (or a manual
138
+ `npm run release` on `main`).
139
+
140
+ - **patch** (`0.18.0 → 0.18.1`): bug fixes, doc only; escape hatch if 0.19 slips.
141
+ - **minor** (`0.18.x → 0.19.0`): new segments/presets, features, additive changes.
117
142
  - **major**: breaking changes to settings shape or exported API.