From 3b5a11c815a5269c7813c9ca7f141ba193d44c37 Mon Sep 17 00:00:00 2001 From: JB Date: Tue, 1 Sep 2026 18:02:16 -0400 Subject: [PATCH] chore: deploy published Pi extension packages --- README.md | 49 +++++++++++++++++++++------------------ config/pi-links.json | 6 +---- docs/npm-packages.md | 14 +++++------ scripts/pi-links.test.mjs | 7 ++++-- 4 files changed, 39 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 3314383..b63dbb9 100644 --- a/README.md +++ b/README.md @@ -9,12 +9,9 @@ Personal [Pi](https://github.com/earendil-works/pi-mono) extensions, skills, glo - global agent instructions for Pi, Codex, and Claude; - 34 shared skills under `~/.agents/skills/`; - the `manage-pi-links` and `nono-profiles` project-only skills under `.pi/skills/`; -- three global Pi extensions under `~/.pi/agent/extensions/`: - - **dictate**: local Linux voice dictation; - - **effort-controls**: `/effort` reasoning selection and `/fast` priority mode; - - **prompt-snippets**: per-message prompt rule toggles. +- no global Pi extension symlinks. Active extensions are installed separately as pinned Gitea npm packages. -The repository also contains `copy-all`, `file-search`, `interactive-subagents`, `lm-studio`, `native-hooks`, `subagents`, `todo-herdr`, `update`, and the private `workflow` extension, but the normal manifest does not install them globally. The `pptx`, `stop-slop`, `subagents`, and `xlsx` skills are also intentionally excluded. Archived resources under `__archived/` are never installed. Update `config/pi-links.json` deliberately if that policy changes. +The repository contains `copy-all`, `dictate`, `effort-controls`, `file-search`, `interactive-subagents`, `lm-studio`, `native-hooks`, `prompt-snippets`, `subagents`, `todo-herdr`, `update`, and the private `workflow` extension. The link manifest does not install any of them globally. The `pptx`, `stop-slop`, `subagents`, and `xlsx` skills are also intentionally excluded. Archived resources under `__archived/` are never installed. Update `config/pi-links.json` deliberately if that policy changes. ## Fresh-machine setup @@ -79,7 +76,7 @@ Dictate currently targets `/run/user/1000/pi-dictate.sock` in both the extension ### 3. Install repository dependencies -The linked TypeScript extensions resolve runtime dependencies from this checkout, so `node_modules` is required even though the extensions have no build step: +The monorepo's typechecking, tests, packaging, and extension development require its Bun dependencies even though extensions ship as TypeScript source: ```bash cd /srv/data/code/harness-tools @@ -89,7 +86,7 @@ bun run typecheck Use `bun install --frozen-lockfile` after pulling a lockfile change and plain `bun install` only when intentionally updating [`bun.lock`](bun.lock). Node.js and Bun must satisfy the versions in [`package.json`](package.json). -### 4. Install instructions, skills, and extensions +### 4. Install instructions and skills Preview the exact changes first, then apply them: @@ -100,7 +97,7 @@ cd /srv/data/code/harness-tools ./scripts/pi-links.mjs check ``` -A successful check currently reports 44 links and zero local package entries. The manager: +A successful check currently reports 41 links and zero local package entries. The manager: - preserves unrelated global resources; - refuses to overwrite regular files, directories, or links owned outside this repository; @@ -108,10 +105,12 @@ A successful check currently reports 44 links and zero local package entries. Th Resolve any reported collision manually instead of deleting it blindly. Run `/reload` in an active Pi session, or restart Pi, after the sync. -The repository root is a private Bun workspace and is not installable as a Pi package. Use the curated `config/pi-links.json` policy for live development, or install one independently published `@jbcode/pi-*` package. See [Bun workspace packages and Gitea npm publishing](docs/npm-packages.md). +The repository root is a private Bun workspace and is not installable as a Pi package. The curated `config/pi-links.json` policy manages instructions and skills but deliberately exposes no extension symlinks. Install published `@jbcode/pi-*` packages for normal use; use explicit local paths only for temporary development. See [Bun workspace packages and Gitea npm publishing](docs/npm-packages.md). ### 5. Verify Pi +Install the desired pinned packages from [Optional Pi packages from Gitea](#optional-pi-packages-from-gitea), then start Pi: + ```bash pi ``` @@ -125,13 +124,15 @@ Inside Pi: ## Optional Pi packages from Gitea -The monorepo contains three optional packages that are not enabled by the curated link policy: +The currently published and deployed extension set is: -- `@jbcode/pi-interactive-subagents`; -- `@jbcode/pi-native-hooks`; -- `@jbcode/pi-todo-herdr`. +- `@jbcode/pi-dictate@0.1.0`; +- `@jbcode/pi-effort-controls@0.1.0`; +- `@jbcode/pi-prompt-snippets@0.1.0`; +- `@jbcode/pi-interactive-subagents@3.7.2`; +- `@jbcode/pi-todo-herdr@0.2.5`. -After publishing them, configure the scoped Gitea npm registry and install only the packages you want. Keep the token in the user environment or user-level npm configuration; never commit it: +Configure the scoped Gitea npm registry and install only the packages you want. Keep the token in the user environment or user-level npm configuration; never commit it: ```ini @jbcode:registry=https://git.jb.codes/api/packages/jb/npm/ @@ -139,9 +140,11 @@ After publishing them, configure the scoped Gitea npm registry and install only ``` ```bash -pi install npm:@jbcode/pi-interactive-subagents -pi install npm:@jbcode/pi-native-hooks -pi install npm:@jbcode/pi-todo-herdr +pi install npm:@jbcode/pi-dictate@0.1.0 +pi install npm:@jbcode/pi-effort-controls@0.1.0 +pi install npm:@jbcode/pi-prompt-snippets@0.1.0 +pi install npm:@jbcode/pi-interactive-subagents@3.7.2 +pi install npm:@jbcode/pi-todo-herdr@0.2.5 pi list ``` @@ -222,17 +225,17 @@ herdr status client ### Update or remove the Gitea packages -```bash -pi update npm:@jbcode/pi-interactive-subagents -pi update npm:@jbcode/pi-native-hooks -pi update npm:@jbcode/pi-todo-herdr +These installations are version-pinned. After publishing a new version, install that exact spec to replace the prior pin. Remove packages by npm identity: +```bash +pi remove npm:@jbcode/pi-dictate +pi remove npm:@jbcode/pi-effort-controls +pi remove npm:@jbcode/pi-prompt-snippets pi remove npm:@jbcode/pi-interactive-subagents -pi remove npm:@jbcode/pi-native-hooks pi remove npm:@jbcode/pi-todo-herdr ``` -Run `/reload` after an update or removal. +Run `/reload` after a version change or removal. ### Imported source provenance diff --git a/config/pi-links.json b/config/pi-links.json index 766dd98..55c8327 100644 --- a/config/pi-links.json +++ b/config/pi-links.json @@ -21,11 +21,7 @@ } }, "extensions": { - "globalSymlinks": { - "dictate": "extensions/dictate", - "effort-controls": "extensions/effort-controls", - "prompt-snippets": "extensions/prompt-snippets" - }, + "globalSymlinks": {}, "globalLocalPackages": {} } } diff --git a/docs/npm-packages.md b/docs/npm-packages.md index 53f3bbe..487237c 100644 --- a/docs/npm-packages.md +++ b/docs/npm-packages.md @@ -46,14 +46,14 @@ Publish `@jbcode/pi-shared` before a new version of any extension that depends o ## Install with Pi -After configuring the same scope and token in the npm configuration visible to Pi: +After configuring the same scope and token in the npm configuration visible to Pi, install the currently deployed release set with exact version pins: ```bash -pi install npm:@jbcode/pi-dictate -pi install npm:@jbcode/pi-file-search -pi install npm:@jbcode/pi-interactive-subagents -pi install npm:@jbcode/pi-native-hooks -pi install npm:@jbcode/pi-todo-herdr +pi install npm:@jbcode/pi-dictate@0.1.0 +pi install npm:@jbcode/pi-effort-controls@0.1.0 +pi install npm:@jbcode/pi-prompt-snippets@0.1.0 +pi install npm:@jbcode/pi-interactive-subagents@3.7.2 +pi install npm:@jbcode/pi-todo-herdr@0.2.5 ``` -Pi installs runtime dependencies from the same scoped registry. The repository's symlink-based development exposure remains controlled separately by `config/pi-links.json`. +Pi installs runtime dependencies from the same scoped registry. `config/pi-links.json` deliberately exposes no extension symlinks, preventing duplicate local and published copies. diff --git a/scripts/pi-links.test.mjs b/scripts/pi-links.test.mjs index 4735129..9a660a7 100644 --- a/scripts/pi-links.test.mjs +++ b/scripts/pi-links.test.mjs @@ -245,8 +245,11 @@ test("normal exposure and package evidence retain the Slice 0 security boundary" const links = JSON.parse( await readFile(path.join(repositoryRoot, "config", "pi-links.json"), "utf8"), ); - assert.equal(links.extensions.globalSymlinks.update, undefined); - assert.equal(links.extensions.globalSymlinks["workflow"], undefined); + assert.deepEqual( + links.extensions.globalSymlinks, + {}, + "published extensions must not be re-exposed as development symlinks", + ); const lock = JSON.parse( await readFile(