jorgex-stack 1.9.42 → 1.9.44

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 (3) hide show
  1. package/README.md +5 -3
  2. package/dist/cli.js +53 -12
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -114,7 +114,7 @@ Programmatic mode does **not** provide:
114
114
 
115
115
  ### Pi runtime
116
116
 
117
- El canon de Stack y el paquete Pi adoptado mantienen una snapshot de 17 skills y 89 archivos. La identidad, procedencia e integridad del paquete adoptado son autoritativas en `src/lib/pi-runtime-pin.json`.
117
+ El canon de Stack y el paquete Pi adoptado mantienen una snapshot de 17 árboles de skills con 89 archivos de skill. La identidad, procedencia e integridad del paquete adoptado son autoritativas en `src/lib/pi-runtime-pin.json`.
118
118
 
119
119
  Pi combines the frozen **snapshot v2** package with a Stack-owned shared projection. The version references that follow describe historical Stack/Pi transitions, not the current pin. The current pin, package integrity and lifecycle are maintained in [docs/references/pi-runtime.md](docs/references/pi-runtime.md) and `src/lib/pi-runtime-pin.json`; this README does not imply a future release.
120
120
 
@@ -128,10 +128,12 @@ pnpm dlx jorgex-stack@1.9.7 sync --agents pi
128
128
  pnpm dlx jorgex-stack@1.9.7 uninstall --agents pi
129
129
  ```
130
130
 
131
- Stack downloads the frozen registry tarball, verifies its exact size plus SHA-256/SHA-512, backs up Pi's `settings.json`, and only then asks Pi to install that local file. The exact artifact and integrity values are authoritative in `src/lib/pi-runtime-pin.json`, while the lifecycle remains authoritative in `src/lib/pi-runtime.ts`. Pi's own package-manager invocation is the narrow runtime exception to the repository's pnpm-only rule; the Stack lifecycle never launches npm directly. After the package is healthy, Stack projects the shared resources into Pi: marked `jorgex:system-prompt` and `jorgex:engram-protocol` sections in `~/.pi/agent/AGENTS.md`, canonical skills under `~/.agents/skills`, and `~/.pi/agent/prompts/lean-audit.md`. Pi 0.8.20 registers Context7 through an isolated in-memory HTTP bridge during bootstrap; `available` means configuration permits registration and does not imply an HTTP handshake. A conflict preserves the existing MCP file and blocks managed activation. No MCP configuration or credentials are written. For the file runtimes, Context7, Playwright and DevTools use independent managed sections. The global Playwright package and Chromium cache are shared by the machine; `--playwright-runtimes` controls which runtime receives the guide. The adopted Pi package implements and tests `playwright-handoff-v1` through `PI_CODING_AGENT_DIR/jorgex-pi/playwright.v1.json`. Historical package entries do not describe the current pin. Filters are applied only after this projection exists, so the package does not duplicate shared resources. Package ownership is recorded separately in `~/.jorgex-stack/pi-receipt.json`; projection ownership is recorded in `~/.jorgex-stack/pi-projection-receipt.json`. Package receipts reject manual, duplicate, divergent, partial, corrupt, copied-to-another-scope, or unknown-history state. Projection cleanup requires an exact scope-bound ownership receipt; DevTools conflicts preserve the handoff for review.
131
+ Stack downloads the frozen registry tarball, verifies its exact size plus SHA-256/SHA-512, backs up Pi's `settings.json`, and only then asks Pi to install that local file. The exact artifact and integrity values are authoritative in `src/lib/pi-runtime-pin.json`, while the lifecycle remains authoritative in `src/lib/pi-runtime.ts`. Pi's own package-manager invocation is the narrow runtime exception to the repository's pnpm-only rule; the Stack lifecycle never launches npm directly. After the package is healthy, Stack projects the shared resources into Pi: marked `jorgex:system-prompt` and `jorgex:engram-protocol` sections in `~/.pi/agent/AGENTS.md`, canonical skills under `~/.agents/skills`, and `~/.pi/agent/prompts/lean-audit.md`. Pi 0.8.22 registers Context7 through an isolated in-memory HTTP bridge during bootstrap; `available` means configuration permits registration and does not imply an HTTP handshake. A conflict preserves the existing MCP file and blocks managed activation. No MCP configuration or credentials are written. For the file runtimes, Context7, Playwright and DevTools use independent managed sections. The global Playwright package and Chromium cache are shared by the machine; `--playwright-runtimes` controls which runtime receives the guide. The adopted Pi package implements and tests `playwright-handoff-v1` through `PI_CODING_AGENT_DIR/jorgex-pi/playwright.v1.json`. Historical package entries do not describe the current pin. Filters are applied only after this projection exists, so the package does not duplicate shared resources. Package ownership is recorded separately in `~/.jorgex-stack/pi-receipt.json`; projection ownership is recorded in `~/.jorgex-stack/pi-projection-receipt.json`. Package receipts reject manual, duplicate, divergent, partial, corrupt, copied-to-another-scope, or unknown-history state. Projection cleanup requires an exact scope-bound ownership receipt; DevTools conflicts preserve the handoff for review.
132
132
 
133
133
  The static `AGENTS.md` projected by Stack does not include Context7; Pi's native bootstrap adds that section after registering the isolated bridge. Pi never writes, owns or removes MCP files. In Claude Code, Codex and OpenCode, a compatible existing Context7 entry is preserved and removed only with explicit canonical Stack ownership.
134
134
 
135
+ Pi 0.8.22 also seeds `theme=JorgeX`, `quietStartup=true`, and `hideThinkingBlock=true` only for missing fields during first initialization. User changes and deletions are preserved without reseeding. `hideThinkingBlock` changes presentation only; `defaultThinkingLevel` and reasoning remain unchanged. Pi owns only the fields it creates and records in its lifecycle receipt; pre-existing user settings remain unowned. The JorgeX header preserves builtin and custom commands. `Ctrl+O` remains Pi's native tool presentation, with `NO_COLOR` and `JORGEX_PI_MOTION` behavior unchanged; Stack adds no renderer.
136
+
135
137
  Historically, the published Pi 0.8.0 direct-package snapshot added `work-audit`: the snapshot grew from **17 to 18 skill trees** (96 to 97 files), and the active runtime allowlist grew from **16 to 17 skills**. The historical Pi 0.8.5 snapshot reference records 18 skill trees and 98 files; it does not describe the adopted pin. Reference F2-A is included while the private F1 skills remain preserved. `playwright-cli` remains in the snapshot but inactive because browser automation is a separate opt-in integration.
136
138
 
137
139
  The historical published artifact has two separate provenance anchors. The local size/SHA-256/SHA-512 checks bind the downloaded bytes to Stack's accepted artifact; they are checks within that checkout, not independent trust roots. npm's external provenance/attestation is outside Stack runtime verification, and `provenance.commit` is informative unless that external attestation is independently verified.
@@ -192,7 +194,7 @@ Daily operation:
192
194
  - `doctor` reports the Playwright CLI state (`disabled`, `healthy`, `missing:package`, `missing:browser`, `unreadable`, `broken`, `outdated`) and, when the opt-in package and browser cache are present, verifies one local headless Chromium launch against `about:blank`; it does not open external sites or repair state. An `unreadable` browser cache includes its exact path and filesystem error code so permissions or another local cause can be investigated. If either preference file is corrupt, doctor prints the exact path and the remedy (`Corrige o borra ese archivo antes de reintentar`) before any other browser check; in that case `install`/`uninstall`/`update`/`update --check` will abort with exit 1 until the file is fixed, so the corruption cannot be reconciled destructively.
193
195
  - `update --check` only inspects Playwright CLI when its preference is `enabled` (a binary appearing in `PATH` is not consent). It compares the installed version against the approved pin `0.1.18` — it does not consult npm latest, and a Playwright CLI binary-only update does not require `sync` afterwards.
194
196
  - `uninstall` preserves the global `@playwright/cli` package and all browser data by default; `--remove-playwright` removes the package only (never the browser cache, profiles, cookies, storage state, traces, screenshots or videos). If `pnpm remove --global @playwright/cli` exits non-zero, `uninstall` reports the failure instead of a success outro. For DevTools MCP, ownership is released only after the corresponding unmerge is applied; if no unmerge action is written, the ownership marker is preserved for a later retry.
195
- - `install`/`sync` also inject (and `disable`/`uninstall` remove) managed capability sections in `AGENTS.md` (OpenCode, Codex) or `CLAUDE.md` (Claude Code). File runtimes keep `jorgex:playwright`, `jorgex:chrome-devtools` and `jorgex:context7` independent; Pi 0.8.20 projects the Context7 section after registering its isolated HTTP bridge and keeps the legacy `jorgex:browser` format for migration. User content outside managed markers is preserved. `--target-dir` never reads the real preferences, so by default no section is emitted in target-dir runs — but explicit flags like `--devtools` simulate the MCP entry (and its DevTools block) inside the temp target without touching the real global state, and `install --dry-run --playwright` projects the Playwright section into the plan preview without installing anything. If reconciliation detects a partial or ambiguous system-prompt state, the CLI exits non-zero and recommends repairing it with `sync` or a repeated install; no write is attempted before marker validation. See [docs/references/browser-automation.md](docs/references/browser-automation.md) §2.7 for the full lifecycle.
197
+ - `install`/`sync` also inject (and `disable`/`uninstall` remove) managed capability sections in `AGENTS.md` (OpenCode, Codex) or `CLAUDE.md` (Claude Code). File runtimes keep `jorgex:playwright`, `jorgex:chrome-devtools` and `jorgex:context7` independent; Pi 0.8.22 projects the Context7 section after registering its isolated HTTP bridge and keeps the legacy `jorgex:browser` format for migration. User content outside managed markers is preserved. `--target-dir` never reads the real preferences, so by default no section is emitted in target-dir runs — but explicit flags like `--devtools` simulate the MCP entry (and its DevTools block) inside the temp target without touching the real global state, and `install --dry-run --playwright` projects the Playwright section into the plan preview without installing anything. If reconciliation detects a partial or ambiguous system-prompt state, the CLI exits non-zero and recommends repairing it with `sync` or a repeated install; no write is attempted before marker validation. See [docs/references/browser-automation.md](docs/references/browser-automation.md) §2.7 for the full lifecycle.
196
198
 
197
199
  ### Update: Interactive Flow
198
200
 
package/dist/cli.js CHANGED
@@ -3476,22 +3476,37 @@ var ALLOWED_EXTERNAL_WRITES = /* @__PURE__ */ new Set([
3476
3476
  "models.json",
3477
3477
  "jorgex-pi/sol-lifecycle.v1.json"
3478
3478
  ]);
3479
+ var PERMISSIONS_EXTERNAL_WRITES = /* @__PURE__ */ new Set([
3480
+ ...ALLOWED_EXTERNAL_WRITES,
3481
+ "extensions/pi-permission-system/config.json",
3482
+ "jorgex-pi/permissions-lifecycle.v1.json",
3483
+ "jorgex-pi/permissions-backups"
3484
+ ]);
3485
+ var EXPERIENCE_EXTERNAL_WRITES = /* @__PURE__ */ new Set([
3486
+ ...PERMISSIONS_EXTERNAL_WRITES,
3487
+ "jorgex-pi/experience-lifecycle.v1.json"
3488
+ ]);
3479
3489
  function sameRecord(left, right) {
3480
3490
  return JSON.stringify(left) === JSON.stringify(right);
3481
3491
  }
3482
- function managedExternalWritesAreSafe(writes) {
3483
- if (writes.length !== ALLOWED_EXTERNAL_WRITES.size) return false;
3492
+ function managedExternalWritesAreSafe(writes, capabilities) {
3493
+ if (!Array.isArray(capabilities)) return false;
3494
+ const permissions = capabilities.includes("permissions-policy-v1");
3495
+ const experience = capabilities.includes("experience-defaults-v1");
3496
+ if (experience && !permissions) return false;
3497
+ const allowed = experience ? EXPERIENCE_EXTERNAL_WRITES : permissions ? PERMISSIONS_EXTERNAL_WRITES : ALLOWED_EXTERNAL_WRITES;
3498
+ if (writes.length !== allowed.size) return false;
3484
3499
  const seen = /* @__PURE__ */ new Set();
3485
3500
  for (const write of writes) {
3486
3501
  if (write === null || typeof write !== "object" || Array.isArray(write)) return false;
3487
3502
  if (Object.keys(write).sort().join(",") !== "owner,relativePath,root,semantics") return false;
3488
3503
  if (write.owner !== "jorgex-pi" || write.root !== "PI_CODING_AGENT_DIR") return false;
3489
- if (typeof write.relativePath !== "string" || !ALLOWED_EXTERNAL_WRITES.has(write.relativePath)) return false;
3504
+ if (typeof write.relativePath !== "string" || !allowed.has(write.relativePath)) return false;
3490
3505
  if (/^(?:[A-Za-z]:|[\\/])/.test(write.relativePath) || write.relativePath.split(/[\\/]/).includes("..")) return false;
3491
3506
  if (typeof write.semantics !== "string" || write.semantics.trim() === "" || seen.has(write.relativePath)) return false;
3492
3507
  seen.add(write.relativePath);
3493
3508
  }
3494
- return seen.size === ALLOWED_EXTERNAL_WRITES.size;
3509
+ return seen.size === allowed.size;
3495
3510
  }
3496
3511
  function ownership(receipt) {
3497
3512
  return { receipt, adapters: false, manifest: false, modelMap: false };
@@ -3612,7 +3627,7 @@ function parseReceipt(receiptJson, candidate, scope, engramBin) {
3612
3627
  return sameRecord(parsed, expected) ? expected : null;
3613
3628
  }
3614
3629
  function candidateIsValid(candidate, observed) {
3615
- return candidate.package.name === "jorgex-pi" && candidate.package.source === `npm:${candidate.package.name}@${candidate.package.version}` && candidate.contract.schemaVersion === 1 && candidate.contract.runner.schemaVersion === 1 && candidate.contract.runner.bin === "jorgex-pi" && candidate.contract.runner.maxStdoutBytes === 65536 && managedExternalWritesAreSafe(candidate.contract.managedExternalWrites) && [...REQUIRED_CAPABILITIES].every((capability) => candidate.contract.capabilities.includes(capability)) && sameRecord(candidate.tarball, observed);
3630
+ return candidate.package.name === "jorgex-pi" && candidate.package.source === `npm:${candidate.package.name}@${candidate.package.version}` && candidate.contract.schemaVersion === 1 && candidate.contract.runner.schemaVersion === 1 && candidate.contract.runner.bin === "jorgex-pi" && candidate.contract.runner.maxStdoutBytes === 65536 && managedExternalWritesAreSafe(candidate.contract.managedExternalWrites, candidate.contract.capabilities) && [...REQUIRED_CAPABILITIES].every((capability) => candidate.contract.capabilities.includes(capability)) && sameRecord(candidate.tarball, observed);
3616
3631
  }
3617
3632
  function planPiPackageLifecycle(input) {
3618
3633
  if (!candidateIsValid(input.candidate, input.observedTarball)) {
@@ -6131,16 +6146,16 @@ import { createHash as createHash2 } from "crypto";
6131
6146
  var pi_runtime_pin_default = {
6132
6147
  package: {
6133
6148
  name: "jorgex-pi",
6134
- version: "0.8.20",
6135
- source: "npm:jorgex-pi@0.8.20"
6149
+ version: "0.8.22",
6150
+ source: "npm:jorgex-pi@0.8.22"
6136
6151
  },
6137
6152
  provenance: {
6138
- commit: "c4d021382cd3b752eaa396044753ac7533b6645d"
6153
+ commit: "462de6f6f52dbc86b6808ed051dd441932974500"
6139
6154
  },
6140
6155
  tarball: {
6141
- bytes: 89127646,
6142
- sha256: "c7bbb0dc587b10e8e04174589cc519ad7576d2cbbceb5d2d20614d313e1ee884",
6143
- sha512: "189480a4d812048b65466156479d1d89f7fa7044471ff6a076b710c0014b0e50eaa0261d7a2a8381a5e71a598be61fe2ed714b6b1dacd5a5f955b59a412009c0"
6156
+ bytes: 89140502,
6157
+ sha256: "98fbcffe5ee81e9fd8754dfbb40d786ee7c10251ef7050d68e70808f8de4d1df",
6158
+ sha512: "ef415061fab27328cc1e43238653705bca089d32719034a3e6543da19069d42996d5b799b1f94eac8b2fccd64d97b2440dbf1ddcd1f3d22d9fc45ac0a805a7cd"
6144
6159
  }
6145
6160
  };
6146
6161
 
@@ -6164,6 +6179,8 @@ var PI_RUNTIME_CANDIDATE = {
6164
6179
  "mcp-adapter-v1",
6165
6180
  "engram-runtime-tools-v1",
6166
6181
  "context7-http-v1",
6182
+ "permissions-policy-v1",
6183
+ "experience-defaults-v1",
6167
6184
  "chrome-devtools-handoff-v1",
6168
6185
  "playwright-handoff-v1",
6169
6186
  "runner-json-v1",
@@ -6183,7 +6200,7 @@ var PI_RUNTIME_CANDIDATE = {
6183
6200
  owner: "jorgex-pi",
6184
6201
  root: "PI_CODING_AGENT_DIR",
6185
6202
  relativePath: "settings.json",
6186
- semantics: "merge a missing or matching partial defaultProvider=openai-codex and defaultModel=gpt-5.6-sol pair; preserve foreign halves; cleanup removes only receipt-owned exact values"
6203
+ semantics: "merge a missing or matching partial defaultProvider=openai-codex and defaultModel=gpt-5.6-sol pair plus first-visit theme=JorgeX, quietStartup=true, and hideThinkingBlock=true defaults; preserve foreign halves and existing experience values; cleanup removes only receipt-owned exact values"
6187
6204
  },
6188
6205
  {
6189
6206
  owner: "jorgex-pi",
@@ -6196,6 +6213,30 @@ var PI_RUNTIME_CANDIDATE = {
6196
6213
  root: "PI_CODING_AGENT_DIR",
6197
6214
  relativePath: "jorgex-pi/sol-lifecycle.v1.json",
6198
6215
  semantics: "record field, container, and file ownership; remove the receipt when empty"
6216
+ },
6217
+ {
6218
+ owner: "jorgex-pi",
6219
+ root: "PI_CODING_AGENT_DIR",
6220
+ relativePath: "extensions/pi-permission-system/config.json",
6221
+ semantics: "seed the generated permission policy only when absent; publish exclusively, preserve preexisting or invalid user state, and remove only an exact owned copy during cleanup"
6222
+ },
6223
+ {
6224
+ owner: "jorgex-pi",
6225
+ root: "PI_CODING_AGENT_DIR",
6226
+ relativePath: "jorgex-pi/permissions-lifecycle.v1.json",
6227
+ semantics: "record initialization and exact permission-config ownership without storing user configuration or credentials"
6228
+ },
6229
+ {
6230
+ owner: "jorgex-pi",
6231
+ root: "PI_CODING_AGENT_DIR",
6232
+ relativePath: "jorgex-pi/permissions-backups",
6233
+ semantics: "retain cleanup backups of exact owned permission policy bytes"
6234
+ },
6235
+ {
6236
+ owner: "jorgex-pi",
6237
+ root: "PI_CODING_AGENT_DIR",
6238
+ relativePath: "jorgex-pi/experience-lifecycle.v1.json",
6239
+ semantics: "record first initialization and exact ownership of missing theme, quietStartup, and hideThinkingBlock fields; preserve replacements and do not reseed after initialization"
6199
6240
  }
6200
6241
  ]
6201
6242
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jorgex-stack",
3
- "version": "1.9.42",
3
+ "version": "1.9.44",
4
4
  "description": "Harness multi-agente portable: instala la config JorgeX (agentes, skills, hooks, Engram, MCPs) en Claude Code, Codex CLI, OpenCode y Pi",
5
5
  "type": "module",
6
6
  "license": "MIT",