@groeponline/pi-wishcraft 1.14.0 → 1.15.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/AGENTS.md +1 -1
- package/CHANGELOG.md +6 -0
- package/README.md +14 -3
- package/build-stamp.json +1 -1
- package/package.json +4 -4
- package/src/working-vibes/provider.ts +6 -1
package/AGENTS.md
CHANGED
|
@@ -251,7 +251,7 @@ function createRuntimeState(hooks: {
|
|
|
251
251
|
| **Test runner** | Node built-in `node:test` with `--experimental-strip-types` type stripping |
|
|
252
252
|
| **Circular import check** | `madge --circular src index.ts bash-mode queue` (via `npm run circular`) |
|
|
253
253
|
| **Import style** | `.ts` extensions on all imports, `node:`-prefixed builtins |
|
|
254
|
-
| **Pi CLI** | Installed at `^0.
|
|
254
|
+
| **Pi CLI** | Installed at `^0.99.2` (`pi-coding-agent`, `pi-ai`, `pi-tui` move together — the agent depends on matching `pi-ai`/`pi-tui`, so bumping one alone splits the tree); wrapped to run under Node 24 via nvm |
|
|
255
255
|
| **Docker** | `fuse-overlayfs` storage driver for nested VM testing |
|
|
256
256
|
| **Compound Engineering** | `.compound-engineering/` overlay; portable skills via `~/.agents/skills/ce-*`; native Cursor plugin disabled |
|
|
257
257
|
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [1.15.0] - 2026-10-01
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
- **Pi SDK upgraded `0.84.3` -> `0.99.2`** (`@earendil-works/pi-coding-agent`, `pi-ai`, `pi-tui` moved together). These must be bumped as a set: the agent depends on matching `pi-ai`/`pi-tui`, so bumping it alone leaves a version-skewed tree — which is exactly what the queued Dependabot PR #118 does (its lockfile keeps top-level `pi-ai` at `0.84.3` under a `0.99.2` agent). On the coordinated bump npm still nests copies, but at identical versions, so nothing is skewed. One real API change: `Provider.stream()` now takes a branded `TranscriptContext` produced only by `normalizeContext()`, which folds `systemPrompt`/`tools` into a leading system message — `src/working-vibes/provider.ts` now calls it, and the working-vibes tests assert the prompt the way the SDK delivers it (as `messages[0]`) rather than through a `context.systemPrompt` field that no longer exists.
|
|
9
|
+
- Audit findings drop from 3 (1 moderate, 2 high) to 1 inherited high; the `undici` advisories are cleared. The remaining `brace-expansion` finding lives inside the peer package's own tree and has no fix available at any installable version.
|
|
10
|
+
|
|
5
11
|
## [1.14.0] - 2026-10-01
|
|
6
12
|
|
|
7
13
|
### Added
|
package/README.md
CHANGED
|
@@ -21,7 +21,9 @@
|
|
|
21
21
|
pi install npm:@groeponline/pi-wishcraft
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
Reload Pi, then press `alt+p` to open the Deck.
|
|
24
|
+
Reload Pi, then press `alt+p` to open the Deck. First run? `/wishcraft setup` asks four questions — language, status preset, motion level, welcome overlay — reviews them, and writes one `settings.json`.
|
|
25
|
+
|
|
26
|
+
Two flows make Wishcraft click fastest:
|
|
25
27
|
|
|
26
28
|
```text
|
|
27
29
|
# remember to benchmark the new provider path
|
|
@@ -30,6 +32,8 @@ Reload Pi, then press `alt+p` to open the Deck. Two flows make Wishcraft click f
|
|
|
30
32
|
|
|
31
33
|
The `#` line is captured as an idea instead of being sent as a prompt — your active run keeps going. Then `/skills` opens the picker: search, inspect and insert a skill without leaving the session.
|
|
32
34
|
|
|
35
|
+
> **Upgrading?** This project was published under the name `@groeponline/pi-powerline-footer`. That package name is deprecated on npm and no longer receives updates — install `@groeponline/pi-wishcraft` instead. Settings keys are unchanged, so an existing `settings.json` keeps working; drop the old entry from your Pi config when you switch.
|
|
36
|
+
|
|
33
37
|
## Why Wishcraft
|
|
34
38
|
|
|
35
39
|
Pi stays the engine. Wishcraft adds the operator layer around it: live status, overlays, idea capture, skill search, sticky Bash, hooks, policy controls and session UX.
|
|
@@ -52,6 +56,7 @@ Kongming lanterns started as battlefield signals and later carried wishes. Wishc
|
|
|
52
56
|
| Read hints | Appends a one-line continuation hint after a partial `read`, so the model knows the next offset. Opt-out: `wishcraft.readHints: false`. |
|
|
53
57
|
| Policy | In-process deny/inject rules in global settings. No spawn. Kill-switch: `wishcraft.policyEnabled`. |
|
|
54
58
|
| Working indicator | Four deterministic styles (`dots`, `pulse`, `bar`, `ascii`) with accessibility-aware static fallbacks. |
|
|
59
|
+
| Interface language | English (default) or Dutch, switchable live via `wishcraft.locale`. English is compiled into every call site, so a missing translation falls back instead of blanking a surface. |
|
|
55
60
|
| Welcome art | `lantern`, `balloon`, and `normal` opening artwork, each with a different silhouette and narrow-terminal fallback. |
|
|
56
61
|
|
|
57
62
|
Pi owns the footer chrome, feed scrolling, and input. Wishcraft supplies widgets, overlays, and the bash/stash/editor integrations. The bar is not clickable; actions are commands and overlays.
|
|
@@ -109,6 +114,14 @@ Keybinds (`powerlineShortcuts`, applied after `/reload`; `null` disables):
|
|
|
109
114
|
|
|
110
115
|
`chef` is muted colors, slash separators, live TPS in/out, and TCP port count. Built-in presets: `default`, `minimal`, `compact`, `full`, `nerd`, `ascii`, `chef`. For every setting at its default, see [`examples/settings.example.json`](examples/settings.example.json).
|
|
111
116
|
|
|
117
|
+
Interface language (`en` | `nl`) applies immediately, no restart:
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
{ "wishcraft": { "locale": "nl" } }
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Set `PI_WISHCRAFT_LOCALE` to pick a language before settings are read.
|
|
124
|
+
|
|
112
125
|
Daily token budget (never blocks a turn):
|
|
113
126
|
|
|
114
127
|
```json
|
|
@@ -128,8 +141,6 @@ Privacy/network boundary: ideas, settings, usage ledgers, and normal cockpit sta
|
|
|
128
141
|
- No mouse on the live footer. Pi core owns that surface.
|
|
129
142
|
- No second `alt+i` product. Ports stay on `alt+i`; other detail is `→` in the navigator.
|
|
130
143
|
- Compatibility status keys (`powerline.preset`, `powerline.tps`, `powerline.ports`) are available to peer extensions; normal Wishcraft use does not require them.
|
|
131
|
-
- The legacy `@groeponline/pi-powerline-footer` package is deprecated in favor of `@groeponline/pi-wishcraft`.
|
|
132
|
-
- Tags are not rewritten. 0.19.x through current stay on the timeline.
|
|
133
144
|
|
|
134
145
|
## vNext direction
|
|
135
146
|
|
package/build-stamp.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"source_sha":"
|
|
1
|
+
{"source_sha":"31d28fdadee020f3ee51b452deeab58c6ec9b439"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@groeponline/pi-wishcraft",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.15.0",
|
|
4
4
|
"description": "Pi coding agent extension: operator cockpit with a live powerline status bar, idea queue, skill search, sticky Bash, hooks, policy guardrails, and TUI session UX.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -73,9 +73,9 @@
|
|
|
73
73
|
"@earendil-works/pi-tui": "*"
|
|
74
74
|
},
|
|
75
75
|
"devDependencies": {
|
|
76
|
-
"@earendil-works/pi-ai": "^0.
|
|
77
|
-
"@earendil-works/pi-coding-agent": "^0.
|
|
78
|
-
"@earendil-works/pi-tui": "^0.
|
|
76
|
+
"@earendil-works/pi-ai": "^0.99.2",
|
|
77
|
+
"@earendil-works/pi-coding-agent": "^0.99.2",
|
|
78
|
+
"@earendil-works/pi-tui": "^0.99.2",
|
|
79
79
|
"@types/node": "24.13.3",
|
|
80
80
|
"madge": "^8.0.0",
|
|
81
81
|
"typescript": "5.9.3"
|
|
@@ -8,6 +8,7 @@ import type {
|
|
|
8
8
|
Model,
|
|
9
9
|
ProviderStreamOptions,
|
|
10
10
|
} from "@earendil-works/pi-ai";
|
|
11
|
+
import { normalizeContext } from "@earendil-works/pi-ai";
|
|
11
12
|
import { VIBE_SYSTEM_PROMPT, vibeState } from "./storage.ts";
|
|
12
13
|
|
|
13
14
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -37,7 +38,11 @@ export async function completeVibe(
|
|
|
37
38
|
|
|
38
39
|
const baseUrl = (await registry.getProviderAuth(providerId))?.auth.baseUrl;
|
|
39
40
|
const requestModel = baseUrl ? { ...model, baseUrl } : model;
|
|
40
|
-
|
|
41
|
+
// `Provider.stream()` now takes a branded `TranscriptContext`, which only
|
|
42
|
+
// `normalizeContext()` produces. It folds `systemPrompt` and `tools` into a
|
|
43
|
+
// leading system message; the brand exists so a raw `Context` cannot reach
|
|
44
|
+
// provider code unnormalized.
|
|
45
|
+
return provider.stream(requestModel, normalizeContext(context), options).result();
|
|
41
46
|
}
|
|
42
47
|
|
|
43
48
|
// ═══════════════════════════════════════════════════════════════════════════
|