fix: use Gitea-compatible package scope

This commit is contained in:
jb
2026-09-01 17:53:50 -04:00
parent 118b5bee06
commit 72a1645fdb
51 changed files with 142 additions and 142 deletions
+1 -1
View File
@@ -1 +1 @@
@_jb:registry=https://git.jb.codes/api/packages/jb/npm/
@jbcode:registry=https://git.jb.codes/api/packages/jb/npm/
+17 -17
View File
@@ -108,7 +108,7 @@ 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 `@_jb/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. 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).
### 5. Verify Pi
@@ -127,21 +127,21 @@ Inside Pi:
The monorepo contains three optional packages that are not enabled by the curated link policy:
- `@_jb/pi-interactive-subagents`;
- `@_jb/pi-native-hooks`;
- `@_jb/pi-todo-herdr`.
- `@jbcode/pi-interactive-subagents`;
- `@jbcode/pi-native-hooks`;
- `@jbcode/pi-todo-herdr`.
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:
```ini
@_jb:registry=https://git.jb.codes/api/packages/jb/npm/
@jbcode:registry=https://git.jb.codes/api/packages/jb/npm/
//git.jb.codes/api/packages/jb/npm/:_authToken=${GITEA_NPM_TOKEN}
```
```bash
pi install npm:@_jb/pi-interactive-subagents
pi install npm:@_jb/pi-native-hooks
pi install npm:@_jb/pi-todo-herdr
pi install npm:@jbcode/pi-interactive-subagents
pi install npm:@jbcode/pi-native-hooks
pi install npm:@jbcode/pi-todo-herdr
pi list
```
@@ -151,7 +151,7 @@ Do not globally enable `harness-tools/extensions/subagents` at the same time as
### Configure interactive subagents
[`@_jb/pi-interactive-subagents`](extensions/interactive-subagents) creates asynchronous child Pi sessions in Herdr tabs or tmux panes. It requires one terminal backend:
[`@jbcode/pi-interactive-subagents`](extensions/interactive-subagents) creates asynchronous child Pi sessions in Herdr tabs or tmux panes. It requires one terminal backend:
- **Herdr:** install its Pi integration, then launch Pi inside a Herdr-managed pane;
- **tmux:** launch Pi inside tmux when Herdr is unavailable.
@@ -186,11 +186,11 @@ The status widget is enabled by the package's example configuration when no loca
### Configure Native Hooks
[`@_jb/pi-native-hooks`](extensions/native-hooks) coordinates trusted personal diagnostic and verification policies after workspace mutations. Review its [trust model and initialization workflow](extensions/native-hooks/README.md) before use. Preview with `/hooks-init --dry-run`; do not run `/hooks-init --apply` until every destination and executable policy has been reviewed.
[`@jbcode/pi-native-hooks`](extensions/native-hooks) coordinates trusted personal diagnostic and verification policies after workspace mutations. Review its [trust model and initialization workflow](extensions/native-hooks/README.md) before use. Preview with `/hooks-init --dry-run`; do not run `/hooks-init --apply` until every destination and executable policy has been reviewed.
### Configure Pi Todo Herdr
[`@_jb/pi-todo-herdr`](extensions/todo-herdr) provides the `set_tasks`, `patch_tasks`, `rm_task`, `list_task`, and `get_task` tools plus a session-local Pi task widget. Herdr is optional for the tools and widget.
[`@jbcode/pi-todo-herdr`](extensions/todo-herdr) provides the `set_tasks`, `patch_tasks`, `rm_task`, `list_task`, and `get_task` tools plus a session-local Pi task widget. Herdr is optional for the tools and widget.
Inside Pi after `/reload`:
@@ -223,13 +223,13 @@ herdr status client
### Update or remove the Gitea packages
```bash
pi update npm:@_jb/pi-interactive-subagents
pi update npm:@_jb/pi-native-hooks
pi update npm:@_jb/pi-todo-herdr
pi update npm:@jbcode/pi-interactive-subagents
pi update npm:@jbcode/pi-native-hooks
pi update npm:@jbcode/pi-todo-herdr
pi remove npm:@_jb/pi-interactive-subagents
pi remove npm:@_jb/pi-native-hooks
pi remove npm:@_jb/pi-todo-herdr
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.
+41 -41
View File
@@ -19,28 +19,28 @@
},
},
"extensions/copy-all": {
"name": "@_jb/pi-copy-all",
"name": "@jbcode/pi-copy-all",
"version": "0.1.0",
"peerDependencies": {
"@earendil-works/pi-coding-agent": "catalog:pi-peer",
},
},
"extensions/dictate": {
"name": "@_jb/pi-dictate",
"name": "@jbcode/pi-dictate",
"version": "0.1.0",
"peerDependencies": {
"@earendil-works/pi-coding-agent": "catalog:pi-peer",
},
},
"extensions/effort-controls": {
"name": "@_jb/pi-effort-controls",
"name": "@jbcode/pi-effort-controls",
"version": "0.1.0",
"peerDependencies": {
"@earendil-works/pi-coding-agent": "catalog:pi-peer",
},
},
"extensions/file-search": {
"name": "@_jb/pi-file-search",
"name": "@jbcode/pi-file-search",
"version": "0.1.0",
"dependencies": {
"@effect/platform-node": "catalog:",
@@ -55,7 +55,7 @@
},
},
"extensions/interactive-subagents": {
"name": "@_jb/pi-interactive-subagents",
"name": "@jbcode/pi-interactive-subagents",
"version": "3.7.2",
"devDependencies": {
"@earendil-works/pi-coding-agent": "catalog:",
@@ -71,14 +71,14 @@
},
},
"extensions/lm-studio": {
"name": "@_jb/pi-lm-studio",
"name": "@jbcode/pi-lm-studio",
"version": "0.1.0",
"peerDependencies": {
"@earendil-works/pi-coding-agent": "catalog:pi-peer",
},
},
"extensions/native-hooks": {
"name": "@_jb/pi-native-hooks",
"name": "@jbcode/pi-native-hooks",
"version": "0.1.0",
"devDependencies": {
"@earendil-works/pi-coding-agent": "catalog:",
@@ -93,7 +93,7 @@
},
},
"extensions/prompt-snippets": {
"name": "@_jb/pi-prompt-snippets",
"name": "@jbcode/pi-prompt-snippets",
"version": "0.1.0",
"peerDependencies": {
"@earendil-works/pi-coding-agent": "catalog:pi-peer",
@@ -101,7 +101,7 @@
},
},
"extensions/shared": {
"name": "@_jb/pi-shared",
"name": "@jbcode/pi-shared",
"version": "0.1.0",
"peerDependencies": {
"@earendil-works/pi-coding-agent": "catalog:pi-peer",
@@ -109,11 +109,11 @@
},
},
"extensions/subagents": {
"name": "@_jb/pi-subagents",
"name": "@jbcode/pi-subagents",
"version": "0.1.0",
"dependencies": {
"@_jb/pi-shared": "workspace:^",
"@anthropic-ai/claude-agent-sdk": "catalog:",
"@jbcode/pi-shared": "workspace:^",
"effect": "catalog:",
},
"peerDependencies": {
@@ -124,7 +124,7 @@
},
},
"extensions/todo-herdr": {
"name": "@_jb/pi-todo-herdr",
"name": "@jbcode/pi-todo-herdr",
"version": "0.2.5",
"devDependencies": {
"@earendil-works/pi-ai": "catalog:",
@@ -141,17 +141,17 @@
},
},
"extensions/update": {
"name": "@_jb/pi-update",
"name": "@jbcode/pi-update",
"version": "0.1.0",
"peerDependencies": {
"@earendil-works/pi-coding-agent": "catalog:pi-peer",
},
},
"extensions/workflow": {
"name": "@_jb/pi-workflow",
"name": "@jbcode/pi-workflow",
"version": "0.1.0",
"dependencies": {
"@_jb/pi-shared": "workspace:^",
"@jbcode/pi-shared": "workspace:^",
},
"peerDependencies": {
"@earendil-works/pi-ai": "catalog:pi-peer",
@@ -190,32 +190,6 @@
},
},
"packages": {
"@_jb/pi-copy-all": ["@_jb/pi-copy-all@workspace:extensions/copy-all"],
"@_jb/pi-dictate": ["@_jb/pi-dictate@workspace:extensions/dictate"],
"@_jb/pi-effort-controls": ["@_jb/pi-effort-controls@workspace:extensions/effort-controls"],
"@_jb/pi-file-search": ["@_jb/pi-file-search@workspace:extensions/file-search"],
"@_jb/pi-interactive-subagents": ["@_jb/pi-interactive-subagents@workspace:extensions/interactive-subagents"],
"@_jb/pi-lm-studio": ["@_jb/pi-lm-studio@workspace:extensions/lm-studio"],
"@_jb/pi-native-hooks": ["@_jb/pi-native-hooks@workspace:extensions/native-hooks"],
"@_jb/pi-prompt-snippets": ["@_jb/pi-prompt-snippets@workspace:extensions/prompt-snippets"],
"@_jb/pi-shared": ["@_jb/pi-shared@workspace:extensions/shared"],
"@_jb/pi-subagents": ["@_jb/pi-subagents@workspace:extensions/subagents"],
"@_jb/pi-todo-herdr": ["@_jb/pi-todo-herdr@workspace:extensions/todo-herdr"],
"@_jb/pi-update": ["@_jb/pi-update@workspace:extensions/update"],
"@_jb/pi-workflow": ["@_jb/pi-workflow@workspace:extensions/workflow"],
"@anthropic-ai/claude-agent-sdk": ["@anthropic-ai/claude-agent-sdk@0.3.218", "", { "optionalDependencies": { "@anthropic-ai/claude-agent-sdk-darwin-arm64": "0.3.218", "@anthropic-ai/claude-agent-sdk-darwin-x64": "0.3.218", "@anthropic-ai/claude-agent-sdk-linux-arm64": "0.3.218", "@anthropic-ai/claude-agent-sdk-linux-arm64-musl": "0.3.218", "@anthropic-ai/claude-agent-sdk-linux-x64": "0.3.218", "@anthropic-ai/claude-agent-sdk-linux-x64-musl": "0.3.218", "@anthropic-ai/claude-agent-sdk-win32-arm64": "0.3.218", "@anthropic-ai/claude-agent-sdk-win32-x64": "0.3.218" }, "peerDependencies": { "@anthropic-ai/sdk": ">=0.93.0", "@modelcontextprotocol/sdk": "^1.29.0", "zod": "^4.0.0" } }, "sha512-lbVOmgdzjBdSUCTbxElpoTxxP/u9jY8gpG/3cr5l1jSSvSY5FrANdRcze/z6gM330xo32SHH6WPGFd4+K0fMoQ=="],
"@anthropic-ai/claude-agent-sdk-darwin-arm64": ["@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.218", "", { "os": "darwin", "cpu": "arm64" }, "sha512-foTI71ua2r5lJo7sfcw/3UafBCJYjxPmOXZ98wOz1UWIJxaP/Oq9Xp4sUavBd1efFVRxPnAcRnrZ5yrmXK1xUw=="],
@@ -380,6 +354,32 @@
"@ioredis/commands": ["@ioredis/commands@1.10.0", "", {}, "sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q=="],
"@jbcode/pi-copy-all": ["@jbcode/pi-copy-all@workspace:extensions/copy-all"],
"@jbcode/pi-dictate": ["@jbcode/pi-dictate@workspace:extensions/dictate"],
"@jbcode/pi-effort-controls": ["@jbcode/pi-effort-controls@workspace:extensions/effort-controls"],
"@jbcode/pi-file-search": ["@jbcode/pi-file-search@workspace:extensions/file-search"],
"@jbcode/pi-interactive-subagents": ["@jbcode/pi-interactive-subagents@workspace:extensions/interactive-subagents"],
"@jbcode/pi-lm-studio": ["@jbcode/pi-lm-studio@workspace:extensions/lm-studio"],
"@jbcode/pi-native-hooks": ["@jbcode/pi-native-hooks@workspace:extensions/native-hooks"],
"@jbcode/pi-prompt-snippets": ["@jbcode/pi-prompt-snippets@workspace:extensions/prompt-snippets"],
"@jbcode/pi-shared": ["@jbcode/pi-shared@workspace:extensions/shared"],
"@jbcode/pi-subagents": ["@jbcode/pi-subagents@workspace:extensions/subagents"],
"@jbcode/pi-todo-herdr": ["@jbcode/pi-todo-herdr@workspace:extensions/todo-herdr"],
"@jbcode/pi-update": ["@jbcode/pi-update@workspace:extensions/update"],
"@jbcode/pi-workflow": ["@jbcode/pi-workflow@workspace:extensions/workflow"],
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.6.0", "", {}, "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw=="],
"@mariozechner/clipboard": ["@mariozechner/clipboard@0.3.9", "", { "optionalDependencies": { "@mariozechner/clipboard-darwin-arm64": "0.3.9", "@mariozechner/clipboard-darwin-universal": "0.3.9", "@mariozechner/clipboard-darwin-x64": "0.3.9", "@mariozechner/clipboard-linux-arm64-gnu": "0.3.9", "@mariozechner/clipboard-linux-arm64-musl": "0.3.9", "@mariozechner/clipboard-linux-riscv64-gnu": "0.3.9", "@mariozechner/clipboard-linux-x64-gnu": "0.3.9", "@mariozechner/clipboard-linux-x64-musl": "0.3.9", "@mariozechner/clipboard-win32-arm64-msvc": "0.3.9", "@mariozechner/clipboard-win32-x64-msvc": "0.3.9" } }, "sha512-ABnA53mdfkGZwOFUdZNv2S0CWGO/EIuPj8Vv9xmBFmSYg/qFc7ihO6q5FcQjvoE67kZpWkEc4AhD6B/os04yuA=="],
@@ -2,13 +2,13 @@
## Decision
Keep extension sources under `extensions/*` and make each maintained extension directory a Bun workspace with its own package manifest. Use the `@_jb/pi-*` namespace, a root Bun catalog for external dependency versions, and `workspace:^` for repository-owned libraries. The repository root is private and is no longer itself a Pi package.
Keep extension sources under `extensions/*` and make each maintained extension directory a Bun workspace with its own package manifest. Use the `@jbcode/pi-*` namespace, a root Bun catalog for external dependency versions, and `workspace:^` for repository-owned libraries. The repository root is private and is no longer itself a Pi package.
Publish packages to the `jb` owner endpoint of the Gitea npm registry. Repository configuration maps `@_jb` to `https://git.jb.codes/api/packages/jb/npm/`; credentials remain in the user environment or user-level npm configuration and are never committed.
Publish packages to the `jb` owner endpoint of the Gitea npm registry. Repository configuration maps `@jbcode` to `https://git.jb.codes/api/packages/jb/npm/`; credentials remain in the user environment or user-level npm configuration and are never committed. Gitea rejected the initially proposed underscore-prefixed scope as an invalid package name, so the valid `@jbcode` scope is part of the registry contract.
`extensions/shared` is the publishable `@_jb/pi-shared` library. Extensions that import it declare a normal runtime dependency so Pi's production package installation receives the required code.
`extensions/shared` is the publishable `@jbcode/pi-shared` library. Extensions that import it declare a normal runtime dependency so Pi's production package installation receives the required code.
`extensions/_workflows` is reference code, not a package or publishable extension. `@_jb/pi-workflow` remains a private workspace until the required reference runtime is merged under `extensions/workflow`; this prevents publishing two workflow packages or publishing an incomplete package.
`extensions/_workflows` is reference code, not a package or publishable extension. `@jbcode/pi-workflow` remains a private workspace until the required reference runtime is merged under `extensions/workflow`; this prevents publishing two workflow packages or publishing an incomplete package.
The existing `config/pi-links.json` policy remains the authority for live-development exposure. Package boundaries and publication do not automatically enable extensions globally.
@@ -6,15 +6,15 @@ Import the tracked files from the `main` branch of these repositories into Bun w
| Source | Imported commit | Workspace | Package |
| --- | --- | --- | --- |
| `jb/pi-interactive-subagents` | `a3cd328edef59ad491d4f35f9fbadf8ec80cadc4` | `extensions/interactive-subagents` | `@_jb/pi-interactive-subagents` |
| `jb/pi-native-hooks` | `73fa3299bf30fd6da5abfc74a0ee7a36e0a07f0a` | `extensions/native-hooks` | `@_jb/pi-native-hooks` |
| `jb/pi-todo-herdr` | `d9e1ffec51e25238e0baec48ce1303893f13849f` | `extensions/todo-herdr` | `@_jb/pi-todo-herdr` |
| `jb/pi-interactive-subagents` | `a3cd328edef59ad491d4f35f9fbadf8ec80cadc4` | `extensions/interactive-subagents` | `@jbcode/pi-interactive-subagents` |
| `jb/pi-native-hooks` | `73fa3299bf30fd6da5abfc74a0ee7a36e0a07f0a` | `extensions/native-hooks` | `@jbcode/pi-native-hooks` |
| `jb/pi-todo-herdr` | `d9e1ffec51e25238e0baec48ce1303893f13849f` | `extensions/todo-herdr` | `@jbcode/pi-todo-herdr` |
Carry snapshots rather than submodules, subtrees, or unrelated Git histories. The monorepo owns package manifests, dependency normalization, compatibility changes, tests, and releases after import. Preserve source attribution in each package.
Record source URLs, branches, and commits in `config/imported-packages.json`. `bun run imports:check` compares those commits with current remote `main` heads. The staging command in `scripts/import-package-snapshots.mjs` clones fresh snapshots outside the repository for explicit review; it never overwrites the maintained workspaces.
Rename the private `pi-workflow` extension identity to `workflow`. Its workspace is `extensions/workflow`, its tool and user-facing runtime identifiers use `workflow`, and its configuration/state paths use the same name. The npm package remains `@_jb/pi-workflow` under the repository's `@_jb/pi-<name>` convention.
Rename the private `pi-workflow` extension identity to `workflow`. Its workspace is `extensions/workflow`, its tool and user-facing runtime identifiers use `workflow`, and its configuration/state paths use the same name. The npm package remains `@jbcode/pi-workflow` under the repository's `@jbcode/pi-<name>` convention.
## Consequences
+9 -9
View File
@@ -2,7 +2,7 @@
The repository uses Bun workspaces under `extensions/*`. External dependency versions live in the root `package.json` catalog; repository-owned dependencies use `workspace:^`.
Publishable packages include the repository-native extensions plus the imported `@_jb/pi-interactive-subagents`, `@_jb/pi-native-hooks`, and `@_jb/pi-todo-herdr` snapshots. `config/imported-packages.json` records their source `main` commits; use `bun run imports:check` to detect upstream movement.
Publishable packages include the repository-native extensions plus the imported `@jbcode/pi-interactive-subagents`, `@jbcode/pi-native-hooks`, and `@jbcode/pi-todo-herdr` snapshots. `config/imported-packages.json` records their source `main` commits; use `bun run imports:check` to detect upstream movement.
## Install and verify
@@ -16,10 +16,10 @@ Use plain `bun install` when intentionally updating `bun.lock`.
## Registry configuration
The tracked `.npmrc` routes only the `@_jb` scope:
The tracked `.npmrc` routes only the `@jbcode` scope:
```ini
@_jb:registry=https://git.jb.codes/api/packages/jb/npm/
@jbcode:registry=https://git.jb.codes/api/packages/jb/npm/
```
Configure a Gitea personal access token with package permissions outside the repository:
@@ -40,7 +40,7 @@ bun pm pack --destination ../../dist
bun publish
```
Publish `@_jb/pi-shared` before a new version of any extension that depends on it. Gitea rejects republishing an existing name/version, so bump the changed package version first.
Publish `@jbcode/pi-shared` before a new version of any extension that depends on it. Gitea rejects republishing an existing name/version, so bump the changed package version first.
`extensions/workflow` is intentionally private until the `_workflows` reference dependencies are merged into that package. `extensions/_workflows` must not be published.
@@ -49,11 +49,11 @@ Publish `@_jb/pi-shared` before a new version of any extension that depends on i
After configuring the same scope and token in the npm configuration visible to Pi:
```bash
pi install npm:@_jb/pi-dictate
pi install npm:@_jb/pi-file-search
pi install npm:@_jb/pi-interactive-subagents
pi install npm:@_jb/pi-native-hooks
pi install npm:@_jb/pi-todo-herdr
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 installs runtime dependencies from the same scoped registry. The repository's symlink-based development exposure remains controlled separately by `config/pi-links.json`.
+1 -1
View File
@@ -2,7 +2,7 @@
## Merge `_workflows` reference runtime into `workflow`
`extensions/_workflows` was retained only as a reference while `extensions/workflow` was developed, but `workflow` still imports its runner, model, prompt, and serialization modules. Move the required code under `extensions/workflow`, remove obsolete model-authored workflow surfaces, update tests and documentation, and then delete the reference directory. Until that work is complete, `@_jb/pi-workflow` must remain a private Bun workspace and `extensions/_workflows` must remain excluded from workspaces and publication. Acceptance requires `bun pm pack` for `workflow` to contain every runtime import without reaching outside the package root, followed by an isolated Pi package smoke test.
`extensions/_workflows` was retained only as a reference while `extensions/workflow` was developed, but `workflow` still imports its runner, model, prompt, and serialization modules. Move the required code under `extensions/workflow`, remove obsolete model-authored workflow surfaces, update tests and documentation, and then delete the reference directory. Until that work is complete, `@jbcode/pi-workflow` must remain a private Bun workspace and `extensions/_workflows` must remain excluded from workspaces and publication. Acceptance requires `bun pm pack` for `workflow` to contain every runtime import without reaching outside the package root, followed by an isolated Pi package smoke test.
## Make `pi-links` checks work from linked worktrees
+2 -2
View File
@@ -1,7 +1,7 @@
# @_jb/pi-copy-all
# @jbcode/pi-copy-all
Pi extension that adds `/copy-all` for copying the current conversation as Markdown.
```bash
pi install npm:@_jb/pi-copy-all
pi install npm:@jbcode/pi-copy-all
```
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "@_jb/pi-copy-all",
"name": "@jbcode/pi-copy-all",
"version": "0.1.0",
"description": "Pi command for copying the current conversation as Markdown.",
"type": "module",
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "@_jb/pi-dictate",
"name": "@jbcode/pi-dictate",
"version": "0.1.0",
"description": "Pi extension for local Linux voice dictation through a Unix socket service.",
"type": "module",
+2 -2
View File
@@ -1,7 +1,7 @@
# @_jb/pi-effort-controls
# @jbcode/pi-effort-controls
Pi extension that adds `/effort` reasoning selection and `/fast` priority-mode controls.
```bash
pi install npm:@_jb/pi-effort-controls
pi install npm:@jbcode/pi-effort-controls
```
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "@_jb/pi-effort-controls",
"name": "@jbcode/pi-effort-controls",
"version": "0.1.0",
"description": "Pi commands for reasoning effort and priority-mode controls.",
"type": "module",
+2 -2
View File
@@ -1,7 +1,7 @@
# @_jb/pi-file-search
# @jbcode/pi-file-search
Pi extension providing structured `fd` file search and `rg` text search tools.
```bash
pi install npm:@_jb/pi-file-search
pi install npm:@jbcode/pi-file-search
```
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "@_jb/pi-file-search",
"name": "@jbcode/pi-file-search",
"version": "0.1.0",
"description": "Pi file and text search tools backed by fd and ripgrep.",
"type": "module",
+1 -1
View File
@@ -197,7 +197,7 @@ Status display is configured via `config.json` in the extension directory (copy
## Install
```bash
pi install npm:@_jb/pi-interactive-subagents
pi install npm:@jbcode/pi-interactive-subagents
```
## Requirements
@@ -1,5 +1,5 @@
{
"name": "@_jb/pi-interactive-subagents",
"name": "@jbcode/pi-interactive-subagents",
"version": "3.7.2",
"description": "Interactive subagents for Pi — spawn, orchestrate, and manage sub-agent sessions in Orca, Herdr or tmux.",
"type": "module",
+2 -2
View File
@@ -1,7 +1,7 @@
# @_jb/pi-lm-studio
# @jbcode/pi-lm-studio
Pi provider extension for a local LM Studio server at `http://127.0.0.1:1234/v1`.
```bash
pi install npm:@_jb/pi-lm-studio
pi install npm:@jbcode/pi-lm-studio
```
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "@_jb/pi-lm-studio",
"name": "@jbcode/pi-lm-studio",
"version": "0.1.0",
"description": "Pi provider registration for a local LM Studio server.",
"type": "module",
+1 -1
View File
@@ -13,7 +13,7 @@ A native Pi extension that coordinates trusted personal policies after workspace
Installation is a separate, user-level mutation and is **not** performed by this repository's tests:
```bash
pi install npm:@_jb/pi-native-hooks
pi install npm:@jbcode/pi-native-hooks
```
For monorepo development, use the curated link policy or load `extensions/native-hooks/extensions/pi-native-hooks/index.ts` directly.
@@ -113,7 +113,7 @@ The loader must:
7. isolate a throwing/invalid module so other policies still load, while surfacing the exact file and error; and
8. reload policies only when Pi recreates the extension on `/reload` or session replacement.
The package exposes `@_jb/pi-native-hooks/policy` type declarations. An authorized initializer writes a personal `tsconfig.json` with a path mapping to the installed package so policies can use `import type` plus `satisfies` without a runtime package import. Runtime validation remains authoritative because type checking can be skipped or stale.
The package exposes `@jbcode/pi-native-hooks/policy` type declarations. An authorized initializer writes a personal `tsconfig.json` with a path mapping to the installed package so policies can use `import type` plus `satisfies` without a runtime package import. Runtime validation remains authoritative because type checking can be skipped or stale.
Suggested personal layout:
@@ -1,4 +1,4 @@
import type { VerificationPolicy } from "@_jb/pi-native-hooks/policy";
import type { VerificationPolicy } from "@jbcode/pi-native-hooks/policy";
const manifests = new Set(["package.json", "bun.lock", "tsconfig.json"]);
const behavior = (path: string) => /^(extensions|scripts|services|skills|config)\//.test(path) || manifests.has(path);
const types = (path: string) => /\.tsx?$/.test(path) || manifests.has(path);
@@ -1,8 +1,8 @@
import type { VerificationPolicy } from "@_jb/pi-native-hooks/policy";
import type { VerificationPolicy } from "@jbcode/pi-native-hooks/policy";
const manifests = new Set(["package.json", "bun.lock", "tsconfig.json"]);
const behavior = (path: string) => /^(extensions|src|tests|examples|skills)\//.test(path) || manifests.has(path);
const types = (path: string) => /\.tsx?$/.test(path) || manifests.has(path);
export default { kind: "verification", id: "pi-native-hooks-verification", project: { matches: (project) => project.packageName === "@_jb/pi-native-hooks" }, requirements: [
export default { kind: "verification", id: "pi-native-hooks-verification", project: { matches: (project) => project.packageName === "@jbcode/pi-native-hooks" }, requirements: [
{ id: "tests", command: "bun run test", cwd: "project-root", affects: behavior },
{ id: "typecheck", command: "bun run typecheck", cwd: "project-root", affects: types },
] } satisfies VerificationPolicy;
@@ -1,4 +1,4 @@
import type { DiagnosticPolicy } from "@_jb/pi-native-hooks/policy";
import type { DiagnosticPolicy } from "@jbcode/pi-native-hooks/policy";
const ruleIds = new Set(["typescript-no-dynamic-import-ts", "typescript-no-dynamic-import-tsx"]);
export default {
kind: "diagnostic", id: "typescript-no-dynamic-import", analyzerKeys: ["ast-grep:personal"],
@@ -1,4 +1,4 @@
import type { DiagnosticPolicy } from "@_jb/pi-native-hooks/policy";
import type { DiagnosticPolicy } from "@jbcode/pi-native-hooks/policy";
const ruleIds = new Set(["typescript-no-non-null-assertion-ts", "typescript-no-non-null-assertion-tsx"]);
export default {
kind: "diagnostic", id: "typescript-no-non-null-assertion", analyzerKeys: ["ast-grep:personal"],
@@ -5,7 +5,7 @@
"module": "NodeNext",
"moduleResolution": "NodeNext",
"allowImportingTsExtensions": true,
"paths": { "@_jb/pi-native-hooks/policy": ["__PI_NATIVE_HOOKS_PACKAGE_ROOT__/src/policy.ts"] }
"paths": { "@jbcode/pi-native-hooks/policy": ["__PI_NATIVE_HOOKS_PACKAGE_ROOT__/src/policy.ts"] }
},
"include": ["policies/*.ts"]
}
@@ -1,4 +1,4 @@
import type { VerificationPolicy } from "@_jb/pi-native-hooks/policy";
import type { VerificationPolicy } from "@jbcode/pi-native-hooks/policy";
const manifests = new Set(["package.json", "bun.lock", "tsconfig.json"]);
const behavior = (path: string) => /^(extensions|scripts|services|skills|config)\//.test(path) || manifests.has(path);
const types = (path: string) => /\.tsx?$/.test(path) || manifests.has(path);
@@ -1,8 +1,8 @@
import type { VerificationPolicy } from "@_jb/pi-native-hooks/policy";
import type { VerificationPolicy } from "@jbcode/pi-native-hooks/policy";
const manifests = new Set(["package.json", "bun.lock", "tsconfig.json"]);
const behavior = (path: string) => /^(extensions|src|tests|examples|skills)\//.test(path) || manifests.has(path);
const types = (path: string) => /\.tsx?$/.test(path) || manifests.has(path);
export default { kind: "verification", id: "pi-native-hooks-verification", project: { matches: (project) => project.packageName === "@_jb/pi-native-hooks" }, requirements: [
export default { kind: "verification", id: "pi-native-hooks-verification", project: { matches: (project) => project.packageName === "@jbcode/pi-native-hooks" }, requirements: [
{ id: "tests", command: "bun run test", cwd: "project-root", affects: behavior },
{ id: "typecheck", command: "bun run typecheck", cwd: "project-root", affects: types },
] } satisfies VerificationPolicy;
@@ -1,4 +1,4 @@
import type { DiagnosticPolicy } from "@_jb/pi-native-hooks/policy";
import type { DiagnosticPolicy } from "@jbcode/pi-native-hooks/policy";
const ruleIds = new Set(["typescript-no-dynamic-import-ts", "typescript-no-dynamic-import-tsx"]);
export default {
kind: "diagnostic", id: "typescript-no-dynamic-import", analyzerKeys: ["ast-grep:personal"],
@@ -1,4 +1,4 @@
import type { DiagnosticPolicy } from "@_jb/pi-native-hooks/policy";
import type { DiagnosticPolicy } from "@jbcode/pi-native-hooks/policy";
const ruleIds = new Set(["typescript-no-non-null-assertion-ts", "typescript-no-non-null-assertion-tsx"]);
export default {
kind: "diagnostic", id: "typescript-no-non-null-assertion", analyzerKeys: ["ast-grep:personal"],
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "@_jb/pi-native-hooks",
"name": "@jbcode/pi-native-hooks",
"version": "0.1.0",
"description": "Native Pi hooks runtime for shared diagnostics and verification gates.",
"type": "module",
@@ -1,6 +1,6 @@
# Policy contracts
The authoritative declarations are exported by `@_jb/pi-native-hooks/policy` from `src/policy.ts`. Do not copy them into personal config.
The authoritative declarations are exported by `@jbcode/pi-native-hooks/policy` from `src/policy.ts`. Do not copy them into personal config.
A diagnostic policy declares `kind`, a unique `id`, analyzer keys, `appliesTo`, and a pure `evaluate`. `evaluate` receives readonly normalized snapshots and a process-free policy context. Filter findings by exact rule ID and return bounded guidance plus the supported suppression form.
@@ -9,7 +9,7 @@ A verification policy declares a project matcher and exact requirements. Each re
Use:
```ts
import type { DiagnosticPolicy } from "@_jb/pi-native-hooks/policy";
import type { DiagnosticPolicy } from "@jbcode/pi-native-hooks/policy";
export default { /* ... */ } satisfies DiagnosticPolicy;
```
@@ -1,4 +1,4 @@
import type { VerificationPolicy } from "@_jb/pi-native-hooks/policy";
import type { VerificationPolicy } from "@jbcode/pi-native-hooks/policy";
const manifests = new Set(["package.json", "bun.lock", "tsconfig.json"]);
const behavior = (path: string) => /^(extensions|scripts|services|skills|config)\//.test(path) || manifests.has(path);
const types = (path: string) => /\.tsx?$/.test(path) || manifests.has(path);
@@ -1,8 +1,8 @@
import type { VerificationPolicy } from "@_jb/pi-native-hooks/policy";
import type { VerificationPolicy } from "@jbcode/pi-native-hooks/policy";
const manifests = new Set(["package.json", "bun.lock", "tsconfig.json"]);
const behavior = (path: string) => /^(extensions|src|tests|examples|skills)\//.test(path) || manifests.has(path);
const types = (path: string) => /\.tsx?$/.test(path) || manifests.has(path);
export default { kind: "verification", id: "pi-native-hooks-verification", project: { matches: (project) => project.packageName === "@_jb/pi-native-hooks" }, requirements: [
export default { kind: "verification", id: "pi-native-hooks-verification", project: { matches: (project) => project.packageName === "@jbcode/pi-native-hooks" }, requirements: [
{ id: "tests", command: "bun run test", cwd: "project-root", affects: behavior },
{ id: "typecheck", command: "bun run typecheck", cwd: "project-root", affects: types },
] } satisfies VerificationPolicy;
@@ -1,4 +1,4 @@
import type { DiagnosticPolicy } from "@_jb/pi-native-hooks/policy";
import type { DiagnosticPolicy } from "@jbcode/pi-native-hooks/policy";
const ruleIds = new Set(["typescript-no-dynamic-import-ts", "typescript-no-dynamic-import-tsx"]);
export default {
kind: "diagnostic", id: "typescript-no-dynamic-import", analyzerKeys: ["ast-grep:personal"],
@@ -1,4 +1,4 @@
import type { DiagnosticPolicy } from "@_jb/pi-native-hooks/policy";
import type { DiagnosticPolicy } from "@jbcode/pi-native-hooks/policy";
const ruleIds = new Set(["typescript-no-non-null-assertion-ts", "typescript-no-non-null-assertion-tsx"]);
export default {
kind: "diagnostic", id: "typescript-no-non-null-assertion", analyzerKeys: ["ast-grep:personal"],
@@ -5,7 +5,7 @@
"module": "NodeNext",
"moduleResolution": "NodeNext",
"allowImportingTsExtensions": true,
"paths": { "@_jb/pi-native-hooks/policy": ["__PI_NATIVE_HOOKS_PACKAGE_ROOT__/src/policy.ts"] }
"paths": { "@jbcode/pi-native-hooks/policy": ["__PI_NATIVE_HOOKS_PACKAGE_ROOT__/src/policy.ts"] }
},
"include": ["policies/*.ts"]
}
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "@_jb/pi-prompt-snippets",
"name": "@jbcode/pi-prompt-snippets",
"version": "0.1.0",
"description": "Pi extension for toggling reusable per-message prompt snippets.",
"type": "module",
+2 -2
View File
@@ -1,3 +1,3 @@
# @_jb/pi-shared
# @jbcode/pi-shared
Shared runtime utilities used by the `@_jb` Pi extension packages. This is a library package and does not register a Pi extension by itself.
Shared runtime utilities used by the `@jbcode` Pi extension packages. This is a library package and does not register a Pi extension by itself.
+2 -2
View File
@@ -1,7 +1,7 @@
{
"name": "@_jb/pi-shared",
"name": "@jbcode/pi-shared",
"version": "0.1.0",
"description": "Shared runtime utilities for @_jb Pi extensions.",
"description": "Shared runtime utilities for @jbcode Pi extensions.",
"type": "module",
"license": "MIT",
"engines": { "node": ">=22.19.0" },
+2 -2
View File
@@ -1,9 +1,9 @@
# @_jb/pi-subagents
# @jbcode/pi-subagents
Pi extension for background subagents using Pi, Claude Code, and Codex backends.
```bash
pi install npm:@_jb/pi-subagents
pi install npm:@jbcode/pi-subagents
```
Do not enable it alongside another extension that registers the same subagent tools.
+2 -2
View File
@@ -1,5 +1,5 @@
{
"name": "@_jb/pi-subagents",
"name": "@jbcode/pi-subagents",
"version": "0.1.0",
"description": "Pi extension for background subagents across Pi, Claude Code, and Codex backends.",
"type": "module",
@@ -9,7 +9,7 @@
"files": ["index.ts", "src", "docs", "README.md", "LICENSE", "!**/*.test.ts"],
"pi": { "extensions": ["./index.ts"] },
"dependencies": {
"@_jb/pi-shared": "workspace:^",
"@jbcode/pi-shared": "workspace:^",
"@anthropic-ai/claude-agent-sdk": "catalog:",
"effect": "catalog:"
},
+2 -2
View File
@@ -37,8 +37,8 @@ import {
createChildResources,
shutdownAndDisposeChildSession,
waitForChildOperation,
} from "@_jb/pi-shared/child-session";
import { createToolCallTimeoutGuard } from "@_jb/pi-shared/tool-call-timeout";
} from "@jbcode/pi-shared/child-session";
import { createToolCallTimeoutGuard } from "@jbcode/pi-shared/tool-call-timeout";
// --- Model + effort resolution -----------------------------------------------
+6 -6
View File
@@ -31,7 +31,7 @@ Hierarchical, session-local task tracking for [Pi](https://pi.dev), with atomic
Install the latest version from npm:
```bash
pi install npm:@_jb/pi-todo-herdr
pi install npm:@jbcode/pi-todo-herdr
```
Then start Pi. If Pi is already running, use `/reload` to load the extension.
@@ -39,14 +39,14 @@ Then start Pi. If Pi is already running, use `/reload` to load the extension.
To try the package for one run without installing it:
```bash
pi -e npm:@_jb/pi-todo-herdr
pi -e npm:@jbcode/pi-todo-herdr
```
Update or remove it with Pi's package commands:
```bash
pi update npm:@_jb/pi-todo-herdr
pi remove npm:@_jb/pi-todo-herdr
pi update npm:@jbcode/pi-todo-herdr
pi remove npm:@jbcode/pi-todo-herdr
```
## Usage
@@ -138,8 +138,8 @@ Development uses the monorepo's pinned Bun toolchain and shared catalog.
```bash
bun install --frozen-lockfile
bun run --filter '@_jb/pi-todo-herdr' typecheck
bun run --filter '@_jb/pi-todo-herdr' test
bun run --filter '@jbcode/pi-todo-herdr' typecheck
bun run --filter '@jbcode/pi-todo-herdr' test
(cd extensions/todo-herdr && bun pm pack --destination ../../dist)
```
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "@_jb/pi-todo-herdr",
"name": "@jbcode/pi-todo-herdr",
"version": "0.2.5",
"description": "Hierarchical task tools for Pi with a live widget and Herdr sidebar integration.",
"type": "module",
+2 -2
View File
@@ -1,7 +1,7 @@
# @_jb/pi-update
# @jbcode/pi-update
Pi extension providing controlled Pi and package update commands.
```bash
pi install npm:@_jb/pi-update
pi install npm:@jbcode/pi-update
```
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "@_jb/pi-update",
"name": "@jbcode/pi-update",
"version": "0.1.0",
"description": "Pi extension for controlled Pi and package updates.",
"type": "module",
+1 -1
View File
@@ -1,5 +1,5 @@
# workflow
Persisted, gated feature workflows for Pi. The private Bun workspace retains the npm package name `@_jb/pi-workflow` under the repository's scoped package convention.
Persisted, gated feature workflows for Pi. The private Bun workspace retains the npm package name `@jbcode/pi-workflow` under the repository's scoped package convention.
This workspace is currently private and must not be published. Its remaining runtime dependencies on the `_workflows` reference implementation must first be merged into this directory; see `docs/todos.md` at the repository root.
+1 -1
View File
@@ -16,7 +16,7 @@ import { Type } from "typebox";
import {
createChildResources,
resolveStandaloneChildProjectTrust,
} from "@_jb/pi-shared/child-session";
} from "@jbcode/pi-shared/child-session";
import {
runAgent,
type AgentOutcome,
+2 -2
View File
@@ -1,5 +1,5 @@
{
"name": "@_jb/pi-workflow",
"name": "@jbcode/pi-workflow",
"version": "0.1.0",
"private": true,
"description": "Private workspace for the deferred Pi workflow extension migration.",
@@ -9,7 +9,7 @@
"keywords": ["pi-package", "pi-extension", "workflow"],
"pi": { "extensions": ["./index.ts"] },
"dependencies": {
"@_jb/pi-shared": "workspace:^"
"@jbcode/pi-shared": "workspace:^"
},
"peerDependencies": {
"@earendil-works/pi-ai": "catalog:pi-peer",
+1 -1
View File
@@ -50,7 +50,7 @@
"test:dictate-service": "PYTHONPATH=services/dictate/src python -m unittest discover -s services/dictate/tests -p 'test_*.py'",
"test:links": "node --test scripts/pi-links.test.mjs",
"test:packages": "node --test scripts/package-workspaces.test.mjs",
"test:imported": "bun run --filter '@_jb/pi-interactive-subagents' test && bun run --filter '@_jb/pi-native-hooks' test && bun run --filter '@_jb/pi-todo-herdr' test",
"test:imported": "bun run --filter '@jbcode/pi-interactive-subagents' test && bun run --filter '@jbcode/pi-native-hooks' test && bun run --filter '@jbcode/pi-todo-herdr' test",
"test:node": "node --test --experimental-strip-types extensions/dictate/index.test.ts extensions/lm-studio/index.test.ts extensions/shared/*.test.ts extensions/subagents/by-the-way.test.ts extensions/subagents/context-usage.test.ts extensions/subagents/manager.test.ts extensions/subagents/result-delivery.test.ts extensions/subagents/takeover.test.ts extensions/_workflows/*.test.ts extensions/workflow/*.test.ts",
"test:file-search": "vitest run extensions/file-search/index.spec.ts --exclude '.worktrees/**'",
"test:live": "node --test --experimental-strip-types extensions/subagents/claude.test.ts extensions/subagents/codex.test.ts"
+2 -2
View File
@@ -95,7 +95,7 @@ test("imported package snapshots retain explicit main-branch provenance", () =>
assert.match(entry.source, /^ssh:\/\/git@git\.jb\.codes:7722\/jb\//);
assert.match(
readJson(path.join(root, entry.target, "package.json")).name,
/^@_jb\/pi-/,
/^@jbcode\/pi-/,
);
}
});
@@ -106,7 +106,7 @@ test("publishable workspaces have Gitea-safe package contracts", () => {
const manifest = workspaceManifest(directory);
if (manifest.private) continue;
assert.match(manifest.name, /^@_jb\/pi-[a-z0-9-]+$/);
assert.match(manifest.name, /^@jbcode\/pi-[a-z0-9-]+$/);
assert.equal(manifest.publishConfig?.registry, registry);
assert.equal(manifest.engines?.node, ">=22.19.0");
assert.equal(readFileSync(path.join(packageRoot, "LICENSE"), "utf8").length > 0, true);