@arnilo/prism 0.0.19 → 0.0.22

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.
@@ -0,0 +1,127 @@
1
+ # Ponytail behavior integration
2
+
3
+ ## What it does
4
+
5
+ `@arnilo/prism-ponytail` is an optional package that wires [DietrichGebert/ponytail](https://github.com/DietrichGebert/ponytail) into Prism contribution contracts.
6
+
7
+ It registers upstream skills and commands, injects active mode instructions via upstream `getPonytailInstructions` / `filterSkillBodyForMode`, and persists mode as session custom `ponytail-mode` entries. Import is inert; missing upstream fails closed at `setup` with a bounded redacted error.
8
+
9
+ ## When to use it
10
+
11
+ Use it when a host wants lazy-minimalism coding behavior (`lite`, `full`, `ultra`) with upstream Ponytail skills (`ponytail-audit`, `ponytail-debt`, `ponytail-gain`, `ponytail-help`, `ponytail-review`) in a Prism extension kernel.
12
+
13
+ Install optional peer `@dietrichgebert/ponytail@^4.8.4` **or** pass `upstreamPath` to a checkout with `skills/` and `hooks/`.
14
+
15
+ Pair with progressive disclosure: mode slices on the `ponytail-mode` injector; full skill bodies via `load_skill` only.
16
+
17
+ ## Inputs / request
18
+
19
+ `createPonytailExtension(options)`:
20
+
21
+ | Field | Type | Required | Purpose |
22
+ | --- | --- | --- | --- |
23
+ | `upstreamPath` | `string` | no | Override path to Ponytail root; default resolves optional peer package. |
24
+ | `defaultMode` | `PonytailMode` | no | Initial mode when no session entry exists (default `full`). |
25
+ | `quietStartup` | `boolean` | no | Suppress startup status events. |
26
+ | `appendEntry` | `(entry, opts?) => Promise<void>` | yes | Host session append (OM `attach` pattern). |
27
+ | `getEntries` | `() => readonly SessionEntry[] \| Promise<...>` | yes | Current branch entries for mode restore. |
28
+ | `configPath` | `string` | no | Bounded local config for `defaultMode` / `quietStartup` / `hideStatus`. |
29
+
30
+ `PonytailMode`: `off` \| `lite` \| `full` \| `ultra`.
31
+
32
+ Session custom entry shape:
33
+
34
+ ```json
35
+ { "kind": "custom", "data": { "type": "ponytail-mode", "mode": "full" } }
36
+ ```
37
+
38
+ Registered skills: `ponytail`, `ponytail-audit`, `ponytail-debt`, `ponytail-gain`, `ponytail-help`, `ponytail-review`.
39
+
40
+ Registered commands: `ponytail`, `ponytail-review`, `ponytail-audit`, `ponytail-gain`, `ponytail-debt`, `ponytail-help`.
41
+
42
+ `ponytail` command actions: `lite|full|ultra|off`, `status`, `default <mode>`.
43
+
44
+ ## Outputs / response / events
45
+
46
+ | Export | Purpose |
47
+ | --- | --- |
48
+ | `createPonytailExtension(options)` | Returns an inert `Extension` until `kernel.load([...])`. |
49
+ | `ponytail-mode` injector | `InstructionInjector` calling upstream `getPonytailInstructions(mode)`. |
50
+ | `ponytail` command | Set mode, report status, or persist default mode to config file. |
51
+ | Alias commands | Dispatch `{ skill, dispatch: "load_skill" }` for companion skills. |
52
+ | `ponytail:status` / `ponytail:loaded` events | Optional host metadata (no statusline shell scripts). |
53
+
54
+ Deactivation: exact phrases `stop ponytail` and `normal mode`.
55
+
56
+ ## Request/response example
57
+
58
+ ```json
59
+ { "command": "ponytail", "args": { "mode": "lite" }, "sessionId": "s1" }
60
+ ```
61
+
62
+ ```json
63
+ { "kind": "custom", "data": { "type": "ponytail-mode", "mode": "lite" } }
64
+ ```
65
+
66
+ ## Implementation example
67
+
68
+ ```ts
69
+ import { createPonytailExtension } from "@arnilo/prism-ponytail";
70
+ import {
71
+ createExtensionKernel,
72
+ createLoadSkillTool,
73
+ createLoadedSkillSet,
74
+ createMemorySessionStore,
75
+ createSkillRegistry,
76
+ } from "@arnilo/prism";
77
+
78
+ const store = createMemorySessionStore();
79
+ const callbacks = {
80
+ appendEntry: async (entry, options) => store.append(entry, options),
81
+ getEntries: async () => store.list("s1"),
82
+ };
83
+
84
+ const kernel = createExtensionKernel({ errorPolicy: "throw" });
85
+ await kernel.load([
86
+ createPonytailExtension({
87
+ upstreamPath: undefined, // optional peer @dietrichgebert/ponytail
88
+ defaultMode: "full",
89
+ quietStartup: true,
90
+ ...callbacks,
91
+ }),
92
+ ]);
93
+
94
+ const registry = createSkillRegistry(kernel.registries.skills.list());
95
+ const loaded = createLoadedSkillSet();
96
+ const loadSkill = createLoadSkillTool({ registry, loaded });
97
+
98
+ await kernel.registries.commands.get("ponytail")!.execute({ mode: "lite" }, { sessionId: "s1" });
99
+ // Select instructionInjectors: ["ponytail-mode"] on runs that should receive mode slices.
100
+ ```
101
+
102
+ See `examples/caveman-ponytail.ts` for combined Caveman + Ponytail progressive disclosure demo (network-free fixtures).
103
+
104
+ ## Extension and configuration notes
105
+
106
+ - Import alone registers nothing (`sideEffects: false`); no timers, watchers, network, or shell scripts.
107
+ - Upstream hook modules load via `createRequire` from resolved root — instruction strings are not forked in Prism.
108
+ - Mode restore scans `getEntries()` for latest `data.type === "ponytail-mode"` (OM attach pattern).
109
+ - `ponytail-subagent` hook is not wired; nested-agent behavior is host responsibility.
110
+ - No TUI statusline scripts; use `ponytail status` command or extension events.
111
+ - Not included in `@arnilo/prism-code` or `@arnilo/prism-sdk` profiles — opt-in install only.
112
+
113
+ ## Security and performance notes
114
+
115
+ - Upstream text is untrusted; reads bounded (`MAX_SKILL_FILE_BYTES` 256 KiB, `MAX_INJECTED_INSTRUCTION_BYTES` 32 KiB).
116
+ - Config writes only to host `configPath` with size cap (`MAX_CONFIG_FILE_BYTES` 16 KiB).
117
+ - Errors redact absolute paths and home directories.
118
+ - O(skills) setup scan; O(1) mode tracking per turn; no background workers.
119
+
120
+ ## Related APIs
121
+
122
+ - [Caveman behavior integration](caveman.md): complementary terse-communication mode package.
123
+ - [Extension kernel and event bus](extensions.md): explicit `kernel.load`.
124
+ - [Context and skills](context-and-skills.md): progressive catalog + `load_skill`.
125
+ - [Instruction injection](instruction-injection.md): `ponytail-mode` injector.
126
+ - [Observational memory compaction package](compaction-observational-memory.md): session callback attach pattern.
127
+ - [Migration guide](migration.md): `0.0.21 → 0.0.22` notes.
@@ -2,13 +2,13 @@
2
2
 
3
3
  ## What it does
4
4
 
5
- Prism is published as one core package, thirty-seven first-party capability packages, and six pure-manifest family/profile packages (**44** publishable manifests total). This page describes how they are packed, what each tarball contains, how to install them, the required `@arnilo/prism` peer dependency, the release workflow, and the offline test budget. The measurable 1.0 readiness gates (command-per-gate) live in [`0.1.0-readiness.md`](./0.1.0-readiness.md).
5
+ Prism is published as one core package, thirty-nine first-party capability packages, and six pure-manifest family/profile packages (**46** publishable manifests total). This page describes how they are packed, what each tarball contains, how to install them, the required `@arnilo/prism` peer dependency, the release workflow, and the offline test budget. The measurable 1.0 readiness gates (command-per-gate) live in [`0.1.0-readiness.md`](./0.1.0-readiness.md).
6
6
 
7
7
  Core package:
8
8
 
9
9
  - `@arnilo/prism` — the runtime, contracts, registries, streaming events, CLI (including `prism init`), and the `/docs` hub. `files`: `dist` (with `!dist/__tests__` and `!dist/**/*.map` negations), `docs`, `templates`, `CHANGELOG.md`. `bin`: `prism` -> `dist/cli.js`. `sideEffects`: `["dist/cli.js"]`.
10
10
 
11
- First-party workspace packages (each has non-optional `@arnilo/prism@0.0.19` peer and `sideEffects: false`; RAG also peers on memory, and server also peers on workflows):
11
+ First-party workspace packages (each has non-optional `@arnilo/prism@0.0.22` peer and `sideEffects: false`; RAG also peers on memory, and server also peers on workflows):
12
12
 
13
13
  - `@arnilo/prism-provider-anthropic`, `@arnilo/prism-provider-google`, `@arnilo/prism-provider-openai`, `@arnilo/prism-provider-openrouter`, `@arnilo/prism-provider-kimi`, `@arnilo/prism-provider-zai`, `@arnilo/prism-provider-opencode-go`, `@arnilo/prism-provider-neuralwatt` — provider adapters.
14
14
  - `@arnilo/prism-provider-azure`, `@arnilo/prism-provider-bedrock`, `@arnilo/prism-provider-vertex` — optional enterprise-cloud adapters (Entra/IAM/ADC; separate from consumer Anthropic/Google).
@@ -33,10 +33,12 @@ First-party workspace packages (each has non-optional `@arnilo/prism@0.0.19` pee
33
33
  - `@arnilo/prism-web-tools` — optional bounded host-selected Brave/Exa search and Firecrawl Markdown/schema extraction; native fetch, no vendor SDK/browser.
34
34
  - `@arnilo/prism-browser` — optional host-supplied Playwright browser tools (`browser_open`/`browser_snapshot`/`browser_act`/`browser_close`); import launches nothing; `playwright-core@1.61.0` optional peer.
35
35
  - `@arnilo/prism-ag-ui` — optional bounded AG-UI mapper/authorized Web handler/replay plus stable `./acp` sibling; root and ACP imports are inert.
36
+ - `@arnilo/prism-caveman` — optional upstream Caveman behavior integration (`upstreamPath` required; not in code/sdk/all profiles).
37
+ - `@arnilo/prism-ponytail` — optional upstream Ponytail behavior integration (peer `@dietrichgebert/ponytail` or `upstreamPath`; not in code/sdk/all profiles).
36
38
 
37
39
  ### 0.0.12 AG-UI package boundary
38
40
 
39
- `@arnilo/prism-ag-ui` is a publishable optional code package with root AG-UI exports and stable `./acp` sibling, peer `@arnilo/prism@0.0.19`, pinned `@ag-ui/core@0.0.57` / `@agentclientprotocol/sdk@1.3.0`, and no import-time network/listener/run. It is included by `@arnilo/prism-all` only—not `@arnilo/prism-code` or `@arnilo/prism-sdk`—so coding and SDK profiles stay free of UI protocol dependencies.
41
+ `@arnilo/prism-ag-ui` is a publishable optional code package with root AG-UI exports and stable `./acp` sibling, peer `@arnilo/prism@0.0.22`, pinned `@ag-ui/core@0.0.57` / `@agentclientprotocol/sdk@1.3.0`, and no import-time network/listener/run. It is included by `@arnilo/prism-all` only—not `@arnilo/prism-code` or `@arnilo/prism-sdk`—so coding and SDK profiles stay free of UI protocol dependencies.
40
42
 
41
43
  Family/profile packages (pure manifests, no code or `dist`; ship `README.md` and `CHANGELOG.md`; use exact hard `dependencies`):
42
44
 
@@ -78,9 +80,9 @@ Consumers install the core package for the runtime and add first-party packages
78
80
  | Run the default (network-free) test suite | `npm test` |
79
81
  | Dry-run pack core + every package | `npm run pack:dry-run` |
80
82
  | Local mirror of the release verify gate | `npm run release:dry-run` |
81
- | Validate clean tag/version/ranges and reject registry collisions | `npm run release:check -- --version 0.0.19` |
82
- | Preview deterministic publish order | `npm run release:publish -- --version 0.0.19 --dry-run --allow-dirty --allow-untagged` |
83
- | Resume interrupted tagged publication | `npm run release:publish -- --version 0.0.19 --resume --report release-artifacts/publish-report.json` |
83
+ | Validate clean tag/version/ranges and reject registry collisions | `npm run release:check -- --version 0.0.22` |
84
+ | Preview deterministic publish order | `npm run release:publish -- --version 0.0.22 --dry-run --allow-dirty --allow-untagged` |
85
+ | Resume interrupted tagged publication | `npm run release:publish -- --version 0.0.22 --resume --report release-artifacts/publish-report.json` |
84
86
  | Full SDK readiness gate (typecheck + offline tests + pack) | `npm run sdk:ready` |
85
87
 
86
88
  Public core import specifiers (from the root `exports` map):
@@ -117,7 +119,7 @@ A packed tarball contains only public compiled output and release files:
117
119
  - Code packages ship `README.md`, `LICENSE`, and `CHANGELOG.md`; family/profile packages ship `README.md` and `CHANGELOG.md`.
118
120
  - The core tarball additionally ships the full `docs/` directory (the docs hub) and `templates/init/` used by `prism init`.
119
121
  - `dist/cli.js` and the `bin` link in core.
120
- - **Tarball filenames.** npm strips the `@scope/` prefix, so the core package `@arnilo/prism` produces a tarball named `arnilo-prism-0.0.19.tgz`; first-party packages produce `arnilo-prism-provider-<name>-0.0.19.tgz` / `arnilo-prism-compaction-<name>-0.0.19.tgz` / `arnilo-prism-coding-agent-0.0.19.tgz`; family/profile packages produce `arnilo-prism-{providers,compaction,base,code,sdk,all}-0.0.19.tgz`. The CLI bin name `prism` is unaffected by the package name (`npx prism` still works; npm allows the bin field to differ from the package name).
122
+ - **Tarball filenames.** npm strips the `@scope/` prefix, so the core package `@arnilo/prism` produces a tarball named `arnilo-prism-0.0.22.tgz`; first-party packages produce `arnilo-prism-provider-<name>-0.0.22.tgz` / `arnilo-prism-compaction-<name>-0.0.22.tgz` / `arnilo-prism-coding-agent-0.0.22.tgz`; family/profile packages produce `arnilo-prism-{providers,compaction,base,code,sdk,all}-0.0.22.tgz`. The CLI bin name `prism` is unaffected by the package name (`npx prism` still works; npm allows the bin field to differ from the package name).
121
123
 
122
124
  Excluded from every tarball by `files` negation:
123
125
 
@@ -136,9 +138,9 @@ Excluded from every tarball by `files` negation:
136
138
  "name": "host-app",
137
139
  "type": "module",
138
140
  "dependencies": {
139
- "@arnilo/prism": "0.0.19",
140
- "@arnilo/prism-provider-openai": "0.0.19",
141
- "@arnilo/prism-compaction-observational-memory": "0.0.19"
141
+ "@arnilo/prism": "0.0.22",
142
+ "@arnilo/prism-provider-openai": "0.0.22",
143
+ "@arnilo/prism-compaction-observational-memory": "0.0.22"
142
144
  }
143
145
  }
144
146
  ```
@@ -181,11 +183,11 @@ For SDK readiness, run the same one-command gate directly. It composes existing
181
183
  npm run sdk:ready
182
184
  ```
183
185
 
184
- Release publication derives all **44** manifests from the workspace once, validates exact `0.0.19` manifest/lockfile/internal ranges, then uses deterministic dependency order. `release:check` requires a clean commit tagged `v0.0.19` and rejects any existing registry version. `release:publish --resume` skips only registry versions whose internal dependency fingerprint matches the local manifest; conflicting versions fail closed. Each attempted package is written immediately to the JSON report, so a failed job can rerun safely. `--dry-run` performs registry availability checks and invokes `npm publish --dry-run` with explicit public access, provenance, and `latest` tag, but does not publish.
186
+ Release publication derives all **46** manifests from the workspace once, validates exact `0.0.22` manifest/lockfile/internal ranges, then uses deterministic dependency order. `release:check` requires a clean commit tagged `v0.0.22` and rejects any existing registry version. `release:publish --resume` skips only registry versions whose internal dependency fingerprint matches the local manifest; conflicting versions fail closed. Each attempted package is written immediately to the JSON report, so a failed job can rerun safely. `--dry-run` performs registry availability checks and invokes `npm publish --dry-run` with explicit public access, provenance, and `latest` tag, but does not publish.
185
187
 
186
188
  ```bash
187
- npm run release:check -- --version 0.0.19
188
- npm run release:publish -- --version 0.0.19 --dry-run --allow-dirty --allow-untagged
189
+ npm run release:check -- --version 0.0.22
190
+ npm run release:publish -- --version 0.0.22 --dry-run --allow-dirty --allow-untagged
189
191
  ```
190
192
 
191
193
  `--allow-dirty` and `--allow-untagged` exist only for local preview; real publication and CI never pass them. npm registry calls occur only in these release preflight/publication commands, never build/test/package discovery.
@@ -196,6 +198,67 @@ Optional live smoke tests stay separate from SDK readiness because they require
196
198
  PRISM_LIVE_PROVIDER_TESTS=1 npm run test --workspaces --if-present
197
199
  ```
198
200
 
201
+ ### 0.0.22 publish handoff
202
+
203
+ **Decision: GO after protected operator prerequisites below.** Release **0.0.22** (Phase 5 third-party behavior integrations, plan 005) ships `@arnilo/prism-caveman` and `@arnilo/prism-ponytail` as opt-in behavior packages (upstream Caveman/Ponytail wiring, session mode persistence, progressive disclosure + injector split). Core `@arnilo/prism` runtime is unchanged. The publish graph is **46 manifests** (+2). No intentional pre-1.0 breaks for hosts that do not install the new packages — see [migration](migration.md) under `0.0.21 → 0.0.22 third-party behavior integrations`.
204
+
205
+ ```bash
206
+ git diff --check
207
+ npm ci
208
+ npm run sdk:ready
209
+ node --test scripts/budget-gate.test.mjs
210
+ node scripts/scan-secrets.mjs && node scripts/verify-sbom.mjs
211
+ npm audit --audit-level=moderate
212
+ npm run release:gate
213
+ npm run release:check -- --version 0.0.22 --allow-dirty --allow-untagged --report /tmp/prism-0.0.22-preflight.json
214
+ npm run release:publish -- --version 0.0.22 --dry-run --allow-dirty --allow-untagged --report /tmp/prism-0.0.22-dry-run.json
215
+ git tag -s v0.0.22 -m "Prism 0.0.22"
216
+ git verify-tag v0.0.22
217
+ git push origin v0.0.22
218
+ ```
219
+
220
+ ### 0.0.21 publish handoff
221
+
222
+ **Decision: GO after protected operator prerequisites below.** Release **0.0.21** (Phase 4 coding-tool capability gaps, plan 004) ships `repo_search` `outputMode`, bounded `glob`, optional session-scoped read-before-write, bounded `delete`/`move`, and coding-security approval/sandbox wiring. The exact graph stays **44 publishable manifests**; no package added or retired. Intentional pre-1.0 breaks are documented in [migration](migration.md) under `0.0.20 → 0.0.21 coding-tool capability gaps`.
223
+
224
+ ```bash
225
+ git diff --check
226
+ npm ci
227
+ npm run sdk:ready
228
+ node --test scripts/budget-gate.test.mjs
229
+ node scripts/scan-secrets.mjs && node scripts/verify-sbom.mjs
230
+ npm audit --audit-level=moderate
231
+ npm run release:gate
232
+ npm run release:check -- --version 0.0.21 --allow-dirty --allow-untagged --report /tmp/prism-0.0.21-preflight.json
233
+ npm run release:publish -- --version 0.0.21 --dry-run --allow-dirty --allow-untagged --report /tmp/prism-0.0.21-dry-run.json
234
+ git tag -s v0.0.21 -m "Prism 0.0.21"
235
+ git verify-tag v0.0.21
236
+ git push origin v0.0.21
237
+ ```
238
+
239
+ The dry-run checks every registry collision and executes npm's non-publishing tarball validation for each dependency-ordered manifest. The protected tag workflow alone publishes through `npm run release:publish -- --version "${GITHUB_REF_NAME#v}" --resume --report release-artifacts/publish-report.json`; re-run a failed job for the same tag. `npm audit signatures --json --include-attestations` and artifact checksums remain post-publish checks.
240
+
241
+ ### 0.0.20 publish handoff
242
+
243
+ **Decision: GO after protected operator prerequisites below.** Release **0.0.20** (Phase 3 skills and context progressive disclosure, plan 003) ships progressive skill catalog assembly (`skillsDisclosure`), session `load_skill`, empty `SkillRegistry` default with `activateAllSkills` migration opt-in, priority-aware context budget demotion, and optional `toolResultFold`. The exact graph stays **44 publishable manifests**; no package added or retired. Intentional pre-1.0 breaks are documented in [migration](migration.md) under `0.0.19 → 0.0.20 skills and context progressive disclosure`.
244
+
245
+ ```bash
246
+ git diff --check
247
+ npm ci
248
+ npm run sdk:ready
249
+ node --test scripts/budget-gate.test.mjs
250
+ node scripts/scan-secrets.mjs && node scripts/verify-sbom.mjs
251
+ npm audit --audit-level=moderate
252
+ npm run release:gate
253
+ npm run release:check -- --version 0.0.20 --allow-dirty --allow-untagged --report /tmp/prism-0.0.20-preflight.json
254
+ npm run release:publish -- --version 0.0.20 --dry-run --allow-dirty --allow-untagged --report /tmp/prism-0.0.20-dry-run.json
255
+ git tag -s v0.0.20 -m "Prism 0.0.20"
256
+ git verify-tag v0.0.20
257
+ git push origin v0.0.20
258
+ ```
259
+
260
+ The dry-run checks every registry collision and executes npm's non-publishing tarball validation for each dependency-ordered manifest. The protected tag workflow alone publishes through `npm run release:publish -- --version "${GITHUB_REF_NAME#v}" --resume --report release-artifacts/publish-report.json`; re-run a failed job for the same tag. `npm audit signatures --json --include-attestations` and artifact checksums remain post-publish checks.
261
+
199
262
  ### 0.0.19 publish handoff
200
263
 
201
264
  **Decision: GO after protected operator prerequisites below.** Release **0.0.19** (Phase 2 observational memory lifecycle, plan 002) ships `@arnilo/prism-compaction-observational-memory` attach lifecycle, four-layer provider context, nested settings with legacy map, source-faithful recall/paging, and hard fold/render caps. Core `@arnilo/prism` runtime is unchanged. The exact graph stays **44 publishable manifests**; no package added or retired. Intentional pre-1.0 breaks are documented in [migration](migration.md) under `0.0.18 → 0.0.19 observational memory lifecycle`.
@@ -814,8 +877,8 @@ npm publication is not transactional and published versions are immutable. Parti
814
877
 
815
878
  ## Extension and configuration notes
816
879
 
817
- - **Required `@arnilo/prism` peer.** Every first-party code package declares a non-optional `@arnilo/prism@0.0.19` peer (`peerDependenciesMeta` must not mark `@arnilo/prism` optional; other peers such as `playwright-core` may be optional). The range stays pinned to `0.0.19` for the current 0.x release and will widen to `^1.0.0` at the 1.x stable release. Inside the workspace each package also declares `"@arnilo/prism": "file:../.."` in `devDependencies` so `npm install` resolves the peer locally; that devDependency is stripped from consumer installs and is not a runtime dependency.
818
- - **Public access.** All 43 manifests (37 code packages + 6 family/profile packages) declare `"publishConfig": { "access": "public" }`; the publisher also passes `--access public` explicitly because scoped packages otherwise default to restricted on first publish.
880
+ - **Required `@arnilo/prism` peer.** Every first-party code package declares a non-optional `@arnilo/prism@0.0.22` peer (`peerDependenciesMeta` must not mark `@arnilo/prism` optional; other peers such as `playwright-core` may be optional). The range stays pinned to `0.0.22` for the current 0.x release and will widen to `^1.0.0` at the 1.x stable release. Inside the workspace each package also declares `"@arnilo/prism": "file:../.."` in `devDependencies` so `npm install` resolves the peer locally; that devDependency is stripped from consumer installs and is not a runtime dependency.
881
+ - **Public access.** All 46 manifests (40 code packages + 6 family/profile packages) declare `"publishConfig": { "access": "public" }`; the publisher also passes `--access public` explicitly because scoped packages otherwise default to restricted on first publish.
819
882
  - **Map retention knob.** Source maps are emitted locally but stripped from tarballs by `!dist/**/*.map`. Removing that `files` negation ships maps in releases (larger tarballs, better consumer stack traces).
820
883
  - **Release workflow.** `.github/workflows/release.yml` has six jobs. `verify` runs network-free SDK readiness on Node 24; `node20-compat` builds/imports every public root `exports` default target on Node 20 for declared `engines.node >=20` (docs examples need Node >=22.6 native TypeScript stripping); `postgres-integration` uses `pgvector/pgvector:pg16`; `supply-chain` runs high-severity audit, SPDX/license policy, and tracked-source secret scanning; and tag-only `codeql-release` runs SAST. Tag-only `publish` needs all five gates, preserves clean exact-tag/version/topological publication, and alone receives `NPM_TOKEN`, `id-token: write`, and `attestations: write`. Before npm publish it packs all current tarballs, generates checksums plus SPDX, scans unpacked public artifacts, creates GitHub attestations for tarballs and SBOM, then retains artifacts for 30 days. Registry state remains the resumable journal. Local `npm run release:dry-run` remains network-free SDK readiness; local PostgreSQL coverage is `PRISM_TEST_POSTGRES_URL=... npm run test:postgres`.
821
884
  - **Adding a package.** New workspace packages are picked up automatically by `npm run build --workspaces`, `npm test --workspaces`, `npm run pack:dry-run`, the packaging guard (`src/__tests__/packaging.test.ts`), and the install-smoke test (`src/__tests__/install-smoke.test.ts`) via the workspace glob; add the package to both tests' config arrays for explicit per-package assertions.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arnilo/prism",
3
- "version": "0.0.19",
3
+ "version": "0.0.22",
4
4
  "description": "Agent harness for AI providers, agents, sessions, and tools.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",