@qodeca/xezar 0.13.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -15
- package/dist/agent-config/account-identity.d.ts +2 -8
- package/dist/agent-config/account-identity.js +54 -10
- package/dist/agent-config/account-identity.js.map +1 -1
- package/dist/agent-config/catalog.d.ts +49 -7
- package/dist/agent-config/catalog.js +107 -0
- package/dist/agent-config/catalog.js.map +1 -1
- package/dist/agent-config/model-settings/pi.d.ts +12 -6
- package/dist/agent-config/model-settings/pi.js +12 -6
- package/dist/agent-config/model-settings/pi.js.map +1 -1
- package/dist/agent-config/seed.js +10 -0
- package/dist/agent-config/seed.js.map +1 -1
- package/dist/contract/github.d.ts +15 -0
- package/dist/contract/index.d.ts +9 -0
- package/dist/contract/index.js +1527 -895
- package/dist/contract/mcp-api-reference.d.ts +174 -0
- package/dist/contract/mcp-audit.d.ts +103 -0
- package/dist/contract/mcp-discovery.d.ts +257 -0
- package/dist/contract/mcp-event-catalog.d.ts +121 -0
- package/dist/contract/mcp-event-catalog.test.d.ts +1 -0
- package/dist/contract/mcp-idempotency.d.ts +200 -0
- package/dist/contract/mcp-journal.d.ts +268 -0
- package/dist/contract/mcp-leader.d.ts +88 -0
- package/dist/contract/mcp-ownership.d.ts +78 -0
- package/dist/contract/mcp-versioning.d.ts +139 -0
- package/dist/contract/runs.d.ts +81 -0
- package/dist/core/agent-profiles.d.ts +15 -4
- package/dist/core/agent-profiles.js +22 -8
- package/dist/core/agent-profiles.js.map +1 -1
- package/dist/core/opencode-server-runner.js +71 -11
- package/dist/core/opencode-server-runner.js.map +1 -1
- package/dist/core/secret-redaction.d.ts +7 -1
- package/dist/core/secret-redaction.js +44 -10
- package/dist/core/secret-redaction.js.map +1 -1
- package/dist/index.js +138 -27
- package/dist/index.js.map +1 -1
- package/dist/machine-identity.d.ts +66 -0
- package/dist/machine-identity.js +96 -0
- package/dist/machine-identity.js.map +1 -0
- package/dist/mcp/adapters/claude-code.d.ts +41 -0
- package/dist/mcp/adapters/claude-code.js +40 -0
- package/dist/mcp/adapters/claude-code.js.map +1 -0
- package/dist/mcp/adapters/codex.d.ts +140 -0
- package/dist/mcp/adapters/codex.js +323 -0
- package/dist/mcp/adapters/codex.js.map +1 -0
- package/dist/mcp/adapters/opencode.d.ts +148 -0
- package/dist/mcp/adapters/opencode.js +528 -0
- package/dist/mcp/adapters/opencode.js.map +1 -0
- package/dist/mcp/adapters/pi-link.d.ts +102 -0
- package/dist/mcp/adapters/pi-link.js +235 -0
- package/dist/mcp/adapters/pi-link.js.map +1 -0
- package/dist/mcp/adapters/pi.d.ts +188 -0
- package/dist/mcp/adapters/pi.js +418 -0
- package/dist/mcp/adapters/pi.js.map +1 -0
- package/dist/mcp/api-reference.d.ts +26 -0
- package/dist/mcp/api-reference.js +133 -0
- package/dist/mcp/api-reference.js.map +1 -0
- package/dist/mcp/audit-trail.d.ts +162 -0
- package/dist/mcp/audit-trail.js +306 -0
- package/dist/mcp/audit-trail.js.map +1 -0
- package/dist/mcp/bridge.d.ts +81 -0
- package/dist/mcp/bridge.js +407 -0
- package/dist/mcp/bridge.js.map +1 -0
- package/dist/mcp/connection-file.d.ts +49 -0
- package/dist/mcp/connection-file.js +63 -0
- package/dist/mcp/connection-file.js.map +1 -0
- package/dist/mcp/echo-guard.d.ts +94 -0
- package/dist/mcp/echo-guard.js +160 -0
- package/dist/mcp/echo-guard.js.map +1 -0
- package/dist/mcp/event-catalog.d.ts +120 -0
- package/dist/mcp/event-catalog.js +306 -0
- package/dist/mcp/event-catalog.js.map +1 -0
- package/dist/mcp/event-controller.d.ts +230 -0
- package/dist/mcp/event-controller.js +596 -0
- package/dist/mcp/event-controller.js.map +1 -0
- package/dist/mcp/event-journal.d.ts +57 -0
- package/dist/mcp/event-journal.js +423 -0
- package/dist/mcp/event-journal.js.map +1 -0
- package/dist/mcp/index.d.ts +63 -0
- package/dist/mcp/index.js +386 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/ipc.d.ts +202 -0
- package/dist/mcp/ipc.js +206 -0
- package/dist/mcp/ipc.js.map +1 -0
- package/dist/mcp/leader-delivery.d.ts +119 -0
- package/dist/mcp/leader-delivery.js +450 -0
- package/dist/mcp/leader-delivery.js.map +1 -0
- package/dist/mcp/operation-receipts.d.ts +210 -0
- package/dist/mcp/operation-receipts.js +723 -0
- package/dist/mcp/operation-receipts.js.map +1 -0
- package/dist/mcp/project-catalogs.d.ts +23 -0
- package/dist/mcp/project-catalogs.js +25 -0
- package/dist/mcp/project-catalogs.js.map +1 -0
- package/dist/mcp/project-leaders.d.ts +26 -0
- package/dist/mcp/project-leaders.js +17 -0
- package/dist/mcp/project-leaders.js.map +1 -0
- package/dist/mcp/protocol.d.ts +50 -0
- package/dist/mcp/protocol.js +47 -0
- package/dist/mcp/protocol.js.map +1 -0
- package/dist/mcp/reconnect.d.ts +297 -0
- package/dist/mcp/reconnect.js +465 -0
- package/dist/mcp/reconnect.js.map +1 -0
- package/dist/mcp/resource-ownership.d.ts +228 -0
- package/dist/mcp/resource-ownership.js +390 -0
- package/dist/mcp/resource-ownership.js.map +1 -0
- package/dist/mcp/service-adapter.d.ts +16488 -0
- package/dist/mcp/service-adapter.js +148 -0
- package/dist/mcp/service-adapter.js.map +1 -0
- package/dist/mcp/service.d.ts +83 -0
- package/dist/mcp/service.js +233 -0
- package/dist/mcp/service.js.map +1 -0
- package/dist/mcp/session-binding.d.ts +105 -0
- package/dist/mcp/session-binding.js +163 -0
- package/dist/mcp/session-binding.js.map +1 -0
- package/dist/mcp/stale-write.d.ts +145 -0
- package/dist/mcp/stale-write.js +219 -0
- package/dist/mcp/stale-write.js.map +1 -0
- package/dist/mcp/tool.d.ts +48 -0
- package/dist/mcp/tool.js +24 -0
- package/dist/mcp/tool.js.map +1 -0
- package/dist/mcp/tools/discovery.d.ts +40 -0
- package/dist/mcp/tools/discovery.js +232 -0
- package/dist/mcp/tools/discovery.js.map +1 -0
- package/dist/mcp/tools/execution-control.d.ts +171 -0
- package/dist/mcp/tools/execution-control.js +513 -0
- package/dist/mcp/tools/execution-control.js.map +1 -0
- package/dist/mcp/tools/handoff-git.d.ts +26 -0
- package/dist/mcp/tools/handoff-git.js +544 -0
- package/dist/mcp/tools/handoff-git.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +2 -0
- package/dist/mcp/tools/index.js +23 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/leader-events.d.ts +46 -0
- package/dist/mcp/tools/leader-events.js +126 -0
- package/dist/mcp/tools/leader-events.js.map +1 -0
- package/dist/mcp/tools/local-handoff.d.ts +102 -0
- package/dist/mcp/tools/local-handoff.js +306 -0
- package/dist/mcp/tools/local-handoff.js.map +1 -0
- package/dist/mcp/tools/project-config.d.ts +340 -0
- package/dist/mcp/tools/project-config.js +1075 -0
- package/dist/mcp/tools/project-config.js.map +1 -0
- package/dist/mcp/tools/results-evidence.d.ts +112 -0
- package/dist/mcp/tools/results-evidence.js +1045 -0
- package/dist/mcp/tools/results-evidence.js.map +1 -0
- package/dist/mcp/tools/task-create.d.ts +70 -0
- package/dist/mcp/tools/task-create.js +473 -0
- package/dist/mcp/tools/task-create.js.map +1 -0
- package/dist/mcp/tools/task-reads.d.ts +102 -0
- package/dist/mcp/tools/task-reads.js +689 -0
- package/dist/mcp/tools/task-reads.js.map +1 -0
- package/dist/mcp/tools/work-organisation.d.ts +2 -0
- package/dist/mcp/tools/work-organisation.js +502 -0
- package/dist/mcp/tools/work-organisation.js.map +1 -0
- package/dist/paths.d.ts +17 -7
- package/dist/paths.js +18 -8
- package/dist/paths.js.map +1 -1
- package/dist/runs/project-writer.js +76 -11
- package/dist/runs/project-writer.js.map +1 -1
- package/dist/runs/retention.d.ts +24 -1
- package/dist/runs/retention.js +62 -1
- package/dist/runs/retention.js.map +1 -1
- package/dist/server/forge/github.js +44 -0
- package/dist/server/forge/github.js.map +1 -1
- package/dist/server/forge/types.d.ts +16 -0
- package/dist/server/project-context.d.ts +81 -8
- package/dist/server/project-context.js +143 -35
- package/dist/server/project-context.js.map +1 -1
- package/dist/server/server.d.ts +1050 -53
- package/dist/server/server.js +326 -120
- package/dist/server/server.js.map +1 -1
- package/dist/server/validators.d.ts +26 -6
- package/dist/server/validators.js +17 -0
- package/dist/server/validators.js.map +1 -1
- package/dist/skills-remote.js +64 -6
- package/dist/skills-remote.js.map +1 -1
- package/dist/workflows/run.d.ts +277 -12
- package/dist/workflows/run.js +554 -59
- package/dist/workflows/run.js.map +1 -1
- package/dist/workspace/agent-profiles.d.ts +30 -3
- package/dist/workspace/agent-profiles.js +39 -4
- package/dist/workspace/agent-profiles.js.map +1 -1
- package/dist/workspace/config.js +25 -4
- package/dist/workspace/config.js.map +1 -1
- package/dist/workspace/project-owner.d.ts +210 -0
- package/dist/workspace/project-owner.js +518 -0
- package/dist/workspace/project-owner.js.map +1 -0
- package/package.json +5 -3
- package/scripts/pi-leader-extension.ts +420 -0
- package/scripts/sync-readme.mjs +83 -2
- package/web/dist/assets/{alert-dialog-BVsVcbFy.js → alert-dialog-D6rP6d39.js} +1 -1
- package/web/dist/assets/arrow-down-DMOfFIzW.js +1 -0
- package/web/dist/assets/arrow-left-C4Ec2BUg.js +1 -0
- package/web/dist/assets/{centered-state-Djgly6Ni.js → centered-state-B0ZqrPaa.js} +12 -12
- package/web/dist/assets/chevron-right-mHJ-crvn.js +1 -0
- package/web/dist/assets/{collapsible-DZ4D-DHG.js → collapsible-DchEHgUM.js} +1 -1
- package/web/dist/assets/{commit-list-B-z1JL9G.js → commit-list-BpMim1Rv.js} +1 -1
- package/web/dist/assets/{compare-variants-D62m4j3B.js → compare-variants-D5ItQbAq.js} +1 -1
- package/web/dist/assets/{diff-BKew9rQX.js → diff-HqqZ_WDR.js} +2 -2
- package/web/dist/assets/{diff-stat-D0mc5V6Z.js → diff-stat-NsU-3ecr.js} +1 -1
- package/web/dist/assets/{diff-view-xpIcuLIC.js → diff-view-B7c11Xux.js} +1 -1
- package/web/dist/assets/{dropdown-menu-CEQziH7X.js → dropdown-menu-CtTpnyod.js} +1 -1
- package/web/dist/assets/{editable-title-BCX3T2BY.js → editable-title-BXtuGQry.js} +1 -1
- package/web/dist/assets/{ellipsis-vertical-ByVdDc4z.js → ellipsis-vertical-MHtGZSH6.js} +1 -1
- package/web/dist/assets/{file-xBSB5hXO.js → file-DKLw5SOb.js} +1 -1
- package/web/dist/assets/{folder-CldgbZ5A.js → folder-Drw6-ufH.js} +1 -1
- package/web/dist/assets/{git-toolbar-DJANqg7Y.js → git-toolbar-BQH8bORV.js} +1 -1
- package/web/dist/assets/github-ynnpKFCJ.js +1 -0
- package/web/dist/assets/{image-preview-Cv5mZr0n.js → image-preview-DLhMN_R9.js} +1 -1
- package/web/dist/assets/index-BEsrNdXt.js +29 -0
- package/web/dist/assets/index-Da8DOBau.css +2 -0
- package/web/dist/assets/{markdown-CgEEE2ND.js → markdown-q365eN6Y.js} +1 -1
- package/web/dist/assets/{new-task-form-1r2bgsdD.js → new-task-form-CW-hNIWQ.js} +1 -1
- package/web/dist/assets/{pill-q-x22_ej.js → pill-B_TFulXa.js} +1 -1
- package/web/dist/assets/{project-router-VDN4jQM8.js → project-router-CLPc-ImZ.js} +1 -1
- package/web/dist/assets/{prompt-templates-BmZtCe-L.js → prompt-templates-CLc4RxyO.js} +1 -1
- package/web/dist/assets/{repo-git-btG0sdbO.js → repo-git-Is7R6-Tj.js} +1 -1
- package/web/dist/assets/{run-diff-vguEMJzh.js → run-diff-DHMvDlVo.js} +2 -2
- package/web/dist/assets/run-header-DvZJbQ8I.js +1 -0
- package/web/dist/assets/{search-x-QmhaAbg5.js → search-x-Ce2MMetu.js} +1 -1
- package/web/dist/assets/{skill-empty-hint-BrzUwByZ.js → skill-empty-hint-C_xCSvzB.js} +1 -1
- package/web/dist/assets/skills-CivqD4si.js +1 -0
- package/web/dist/assets/{sparkles-CP8QDOgX.js → sparkles-BCqPoj5g.js} +1 -1
- package/web/dist/assets/{square-terminal-CGypshSD.js → square-terminal-ikj5g-oK.js} +1 -1
- package/web/dist/assets/{tab-link-D4lFzzI1.js → tab-link-VsEjFV1Y.js} +1 -1
- package/web/dist/assets/{task-changes-BtZId14z.js → task-changes-CH-E81-_.js} +1 -1
- package/web/dist/assets/{task-commits-BoeyJXrv.js → task-commits-DqfkMFxp.js} +1 -1
- package/web/dist/assets/{task-files-DIy2oUnj.js → task-files-D_nkHZ_a.js} +2 -2
- package/web/dist/assets/task-thread-bxQompxJ.js +9 -0
- package/web/dist/assets/{textarea-CyBCyKIk.js → textarea-xajuW1L_.js} +1 -1
- package/web/dist/assets/{thread-loading-Cuq2jchC.js → thread-loading-C3JQZbIE.js} +1 -1
- package/web/dist/assets/{trash-2-B6Dp3ZNs.js → trash-2-hJrBhpUD.js} +1 -1
- package/web/dist/assets/{triangle-alert-xBya8FUp.js → triangle-alert-D1u82y1a.js} +1 -1
- package/web/dist/assets/{upload-D6MXEB9p.js → upload-Bn6FBZ59.js} +1 -1
- package/web/dist/assets/{use-desktop-CPBwzQ7M.js → use-desktop-DOIMfHfY.js} +1 -1
- package/web/dist/assets/{use-submit-shortcut-JTpNzU-u.js → use-submit-shortcut-Dj4DHTdE.js} +1 -1
- package/web/dist/assets/utils-YwBpOoRN.js +64 -0
- package/web/dist/assets/{workflows-DG115scU.js → workflows-CTaAKz2m.js} +3 -3
- package/web/dist/assets/{zoomable-image-GTYwLtkS.js → zoomable-image-C1-6P3tg.js} +1 -1
- package/web/dist/index.html +23 -23
- package/web/dist/assets/arrow-down-CYgAlZtW.js +0 -1
- package/web/dist/assets/arrow-left-BOqE0a3k.js +0 -1
- package/web/dist/assets/chevron-right-Cc9BWnbN.js +0 -1
- package/web/dist/assets/github-D6vK0jFn.js +0 -1
- package/web/dist/assets/index-CkmR6h7s.css +0 -2
- package/web/dist/assets/index-DVDqF4bM.js +0 -9
- package/web/dist/assets/refresh-cw-DcNCj2nu.js +0 -1
- package/web/dist/assets/run-header-DM7MiKj9.js +0 -1
- package/web/dist/assets/skills-DMfxQtrD.js +0 -1
- package/web/dist/assets/task-thread-CbMPmrWq.js +0 -9
- package/web/dist/assets/utils--z9hRtl3.js +0 -64
package/README.md
CHANGED
|
@@ -19,8 +19,9 @@ your phone, working your backlog while you're away.
|
|
|
19
19
|
|
|
20
20
|
[A look inside](#a-look-inside) · [What xezar does best](#what-xezar-does-best) · [What it solves](#what-it-solves) · [Who it's for](#who-its-for) · [Quick start](#quick-start) · [How it works](#how-it-works) · [Core concepts](#core-concepts) · [Cockpit tour](#cockpit-tour) · [Agent backends](#coding-agent-backends) · [Remote access](#remote-access-host-xezar-on-a-server)
|
|
21
21
|
|
|
22
|
+
[](https://github.com/qodeca/xezar/actions/workflows/ci.yml)
|
|
22
23
|
[](https://www.npmjs.com/package/@qodeca/xezar)
|
|
23
|
-
[](LICENSE)
|
|
24
|
+
[](https://github.com/qodeca/xezar/blob/main/LICENSE)
|
|
24
25
|

|
|
25
26
|

|
|
26
27
|

|
|
@@ -28,6 +29,10 @@ your phone, working your backlog while you're away.
|
|
|
28
29
|
|
|
29
30
|
</div>
|
|
30
31
|
|
|
32
|
+
> **Project status: early.** xezar is 0.x and moves fast. This repository opened on 2026-09-07; the
|
|
33
|
+
> code is older and shipped before under the name Cezar. Expect rough edges, and expect breaking
|
|
34
|
+
> changes in minor releases – each one is called out in the [CHANGELOG](https://github.com/qodeca/xezar/blob/main/CHANGELOG.md).
|
|
35
|
+
|
|
31
36
|
---
|
|
32
37
|
|
|
33
38
|
```bash
|
|
@@ -46,10 +51,10 @@ Click any thumbnail for the full-size screenshot.
|
|
|
46
51
|
|
|
47
52
|
| Orchestrate parallel agents | Watch a run live | Parallel variants |
|
|
48
53
|
|:--:|:--:|:--:|
|
|
49
|
-
| [](docs/screenshots/task-view.png) | [](docs/screenshots/live-run.png) | [](docs/screenshots/variants-compare.png) |
|
|
54
|
+
| [](https://raw.githubusercontent.com/qodeca/xezar/main/docs/screenshots/task-view.png) | [](https://raw.githubusercontent.com/qodeca/xezar/main/docs/screenshots/live-run.png) | [](https://raw.githubusercontent.com/qodeca/xezar/main/docs/screenshots/variants-compare.png) |
|
|
50
55
|
| *Run and queue many tasks at once — each in its own worktree — with live status, cost and peak memory per run.* | *Every step, tool call, token and screenshot — streamed as it happens.* | *Run a task ×2/×3 in isolated worktrees, compare the diffs, keep one.* |
|
|
51
56
|
| **Workflow builder** | **GitHub, one click away** | **Skills + fire-and-forget** |
|
|
52
|
-
| [](docs/screenshots/workflow-builder.png) | [](docs/screenshots/github-issues.png) | [](docs/screenshots/skills-autonomous.png) |
|
|
57
|
+
| [](https://raw.githubusercontent.com/qodeca/xezar/main/docs/screenshots/workflow-builder.png) | [](https://raw.githubusercontent.com/qodeca/xezar/main/docs/screenshots/github-issues.png) | [](https://raw.githubusercontent.com/qodeca/xezar/main/docs/screenshots/skills-autonomous.png) |
|
|
53
58
|
| *Stitch skills and shell checks into a reusable YAML chain, no code.* | *Open issues and PRs via your `gh` — run the agent straight on an issue.* | *Pick a Markdown skill and flip **Autonomous** — the run never stops to ask, so you can walk away.* |
|
|
54
59
|
|
|
55
60
|
---
|
|
@@ -455,7 +460,7 @@ segment.
|
|
|
455
460
|
|
|
456
461
|
## Workflow format
|
|
457
462
|
|
|
458
|
-
See [project layout and legacy migration](docs/project-layout.md) for directory precedence and the offline migration command.
|
|
463
|
+
See [project layout and legacy migration](https://github.com/qodeca/xezar/blob/main/docs/project-layout.md) for directory precedence and the offline migration command.
|
|
459
464
|
|
|
460
465
|
A workflow is a small YAML file in `.xezar/workflows/`:
|
|
461
466
|
|
|
@@ -548,9 +553,10 @@ Useful environment variables:
|
|
|
548
553
|
| `XEZ_AUTOSAVE=1` | Re-enable the periodic (90 s) autosave commit in task worktrees. Off by default (#471) — turn-end and pre-PR flushes always run, so branches still end complete. Every autosave names its trigger in the commit subject (`xezar autosave (periodic)` vs `(turn end)` / `(run finalize)` / `(pre-PR)`), so the flushes you keep are distinguishable from the timer you disabled. |
|
|
549
554
|
| `XEZ_CLAUDE_BIN=/path/to/claude` | Override which `claude` binary is used. |
|
|
550
555
|
| `XEZ_CODEX_BIN=/path/to/codex` | Override which `codex` binary is used. |
|
|
556
|
+
| `XEZ_CODEX_REASONING=concise` | The reasoning summary Codex is asked for on each turn: `auto` (the default, so the reasoning thread is visible), `concise`, `detailed`, or `none` to opt out. An unrecognised value falls back to `auto`. |
|
|
551
557
|
| `XEZ_OPENCODE_BIN=/path/to/opencode` | Override which `opencode` binary is used. |
|
|
552
558
|
| `XEZ_PI_BIN=/path/to/pi` | Override which `pi` binary is used. |
|
|
553
|
-
| `CLAUDE_CONFIG_DIR`, `CODEX_HOME` | The agents' **own** variables, honoured where the vendor documents one. Setting one moves that agent's **default account** — the config folder xezar discovers, credentials included. A *second* login of the same CLI is deliberately not an environment setting, since one process-wide value cannot differ per project: add it under **Settings → Agent accounts** and pick it per project. |
|
|
559
|
+
| `CLAUDE_CONFIG_DIR`, `CODEX_HOME`, `PI_CODING_AGENT_DIR` | The agents' **own** variables, honoured where the vendor documents one. Setting one moves that agent's **default account** — the config folder xezar discovers, credentials included. pi's variable moves its whole `~/.pi/agent` (settings, models **and** `auth.json`), which is why pi can carry accounts and OpenCode cannot; re-verified against pi 0.85.1 on 2026-09-12. A *second* login of the same CLI is deliberately not an environment setting, since one process-wide value cannot differ per project: add it under **Settings → Agent accounts** and pick it per project. |
|
|
554
560
|
| `OPENCODE_CONFIG_DIR` | Where xezar looks for OpenCode's config, ahead of `$XDG_CONFIG_HOME/opencode` (default `~/.config/opencode`). Config **only** — OpenCode keeps credentials in `~/.local/share/opencode`, so this moves settings without moving the account, which is why OpenCode cannot carry Agent accounts. |
|
|
555
561
|
| `XEZ_BROWSE_ROOT=~/` | Default root for **Add project → Open local folder…**. The picker cannot navigate above it; a saved workspace value overrides the environment default and must name an existing folder. |
|
|
556
562
|
| `XEZ_PROJECTS_DIR=~/xezar/projects` | Default destination for **Clone from GitHub**. Saved workspace settings override it, and missing directories are created recursively. |
|
|
@@ -570,7 +576,7 @@ Useful environment variables:
|
|
|
570
576
|
| `XEZ_TITLE_UPDATES=0` | Turn off the live task-title refresh (namer re-runs on each turn end). The Settings → Agents toggle overrides this default. |
|
|
571
577
|
| `XEZ_AUTONAME=0` | Disable ALL LLM task naming (creation + live) — titles stay heuristic (`437: /om-auto-review-pr`). Under `XEZ_DRY_RUN=1` naming is already off unless forced with `XEZ_AUTONAME=1`. |
|
|
572
578
|
| `XEZ_REVIEW_GATE=1` | Turn ON the optional diff-first review gate (#489): a successful, non-autonomous run with changes parks at `review` (Accept / Send back / Draft PR) instead of finishing. Off by default — changed runs settle to `done` with the diff left in the worktree. Only `1` enables. The Settings → Agents toggle overrides this; autonomous runs always skip it. |
|
|
573
|
-
| `XEZ_NO_BANNER=1` | Skip the `open-mercato/skills` banner on `xezar serve` startup. (The cockpit no longer shows a banner — its skills now live on the Skills page's Manage panel — so this env var is the terminal banner's only switch.) |
|
|
579
|
+
| `XEZ_NO_BANNER=1` | Skip the `open-mercato/skills` banner on `xezar serve` startup. That is the default team skills repository — a separate, maintained repository, not a leftover of the rename from Cezar. (The cockpit no longer shows a banner — its skills now live on the Skills page's Manage panel — so this env var is the terminal banner's only switch.) |
|
|
574
580
|
| `VITE_XEZ_API_BASE=http://localhost:4321` | **Build time only**, and only when the cockpit bundle is deployed apart from the service it talks to. Empty (the default) means "the origin that served this page", which is right for both normal cases: the CLI serves the bundle itself, and `npm run dev` proxies `/api` to the local service. A deployment that must be configured without a rebuild can put `<meta name="xez-api-base" content="…">` in the served HTML instead, which wins over this. |
|
|
575
581
|
|
|
576
582
|
### Troubleshooting: the agent's shell returns nothing
|
|
@@ -628,7 +634,8 @@ the backends it found — install any one of the four and you're operational.
|
|
|
628
634
|
vendor releases that goes stale between xezar versions. For each backend xezar
|
|
629
635
|
reads what *your host* currently offers — Claude Code's `list_models` control
|
|
630
636
|
request, the Codex app-server's `model/list`, `opencode models`, and for pi its
|
|
631
|
-
own
|
|
637
|
+
own `models.json` and `settings.json` (in `~/.pi/agent`, or wherever
|
|
638
|
+
`PI_CODING_AGENT_DIR` points) — and shows exactly that, in
|
|
632
639
|
that order, so a model your account gained yesterday is selectable today with no
|
|
633
640
|
xezar release, and one your provider retired stops being offered. Discovery is
|
|
634
641
|
read-only, costs no tokens, and is cached briefly in memory. If a CLI is
|
|
@@ -728,15 +735,15 @@ xezar server-install --platform ubuntu-vps \
|
|
|
728
735
|
`--bind-host` is only needed when the proxy runs in a **container** (Traefik
|
|
729
736
|
can't reach the host's loopback); a host-installed proxy uses the `127.0.0.1`
|
|
730
737
|
default. In this mode **your proxy must enforce authentication** — xezar has
|
|
731
|
-
none of its own. [Details →](docs/server-install/ubuntu-vps.md#the-box-already-has-a-reverse-proxy-dokploy-coolify-caddy)
|
|
738
|
+
none of its own. [Details →](https://github.com/qodeca/xezar/blob/main/docs/server-install/ubuntu-vps.md#the-box-already-has-a-reverse-proxy-dokploy-coolify-caddy)
|
|
732
739
|
|
|
733
740
|
| Provider | `--platform` | Public front | Guide |
|
|
734
741
|
|----------|--------------|--------------|-------|
|
|
735
|
-
| Ubuntu / Debian VPS | `ubuntu-vps` | nginx + Let's Encrypt HTTPS, htpasswd login, systemd | [Step-by-step →](docs/server-install/ubuntu-vps.md) |
|
|
736
|
-
| Ubuntu + existing proxy | `ubuntu-vps --external-proxy` | your Dokploy/Traefik/Caddy front; xezar ships the service only | [Step-by-step →](docs/server-install/ubuntu-vps.md#the-box-already-has-a-reverse-proxy-dokploy-coolify-caddy) |
|
|
737
|
-
| macOS + ngrok | `macosx-ngrok` | ngrok tunnel + `--basic-auth`, launchd | [Step-by-step →](docs/server-install/macosx-ngrok.md) |
|
|
742
|
+
| Ubuntu / Debian VPS | `ubuntu-vps` | nginx + Let's Encrypt HTTPS, htpasswd login, systemd | [Step-by-step →](https://github.com/qodeca/xezar/blob/main/docs/server-install/ubuntu-vps.md) |
|
|
743
|
+
| Ubuntu + existing proxy | `ubuntu-vps --external-proxy` | your Dokploy/Traefik/Caddy front; xezar ships the service only | [Step-by-step →](https://github.com/qodeca/xezar/blob/main/docs/server-install/ubuntu-vps.md#the-box-already-has-a-reverse-proxy-dokploy-coolify-caddy) |
|
|
744
|
+
| macOS + ngrok | `macosx-ngrok` | ngrok tunnel + `--basic-auth`, launchd | [Step-by-step →](https://github.com/qodeca/xezar/blob/main/docs/server-install/macosx-ngrok.md) |
|
|
738
745
|
|
|
739
|
-
See the **[Remote access overview](docs/server-install/README.md)** for how it
|
|
746
|
+
See the **[Remote access overview](https://github.com/qodeca/xezar/blob/main/docs/server-install/README.md)** for how it
|
|
740
747
|
works and how to redeploy new versions.
|
|
741
748
|
|
|
742
749
|
---
|
|
@@ -750,6 +757,7 @@ never blocks startup):
|
|
|
750
757
|
```jsonc
|
|
751
758
|
{
|
|
752
759
|
"skillsRepos": [{ "repo": "open-mercato/skills", "ref": "main" }], // team skills; [] disables
|
|
760
|
+
// open-mercato/skills is a separate, maintained skills repository, not a leftover of the Cezar rename.
|
|
753
761
|
// Team-skill repos are code-trusted: a skill body becomes an agent system prompt.
|
|
754
762
|
// Only owner/name, https/ssh URLs, or local paths (`/abs`, `./rel`, `~/dir`,
|
|
755
763
|
// `C:\dir`) are accepted — no ext::/fd:: transport helpers. Write a relative
|
|
@@ -797,7 +805,7 @@ the workspace ceiling for runs in that repo.
|
|
|
797
805
|
### Editing the agents' own config (Settings → Agent config)
|
|
798
806
|
|
|
799
807
|
xezar picks *which* agent runs; **Settings → Agent config** lets you edit *how* it
|
|
800
|
-
behaves — the raw config files Claude, Codex and
|
|
808
|
+
behaves — the raw config files Claude, Codex, OpenCode and pi read for settings,
|
|
801
809
|
MCP, and memory. In the multi-project cockpit the section is project-scoped:
|
|
802
810
|
repo-relative files resolve from the selected project's root, while user-scope
|
|
803
811
|
files continue to resolve from the agent's home.
|
|
@@ -807,6 +815,13 @@ files reach task worktrees after commit; Claude's gitignored personal layer is
|
|
|
807
815
|
seeded into each run's worktree. Editing is a local-machine capability, so a
|
|
808
816
|
hosted cockpit (`XEZ_REMOTE=1`) is read-only and never serves home-file contents.
|
|
809
817
|
|
|
818
|
+
Only files whose whole contents are safe to hand back are listed. pi keeps its
|
|
819
|
+
credentials (`auth.json`) and its custom-provider catalogue with the API keys in
|
|
820
|
+
it (`models.json`) in the same folder as its settings, and neither is editable
|
|
821
|
+
here or anywhere else in the cockpit. pi's MCP files are listed because the
|
|
822
|
+
`pi-mcp-adapter` extension reads them — pi itself reads no MCP config, which is
|
|
823
|
+
what **Settings → MCP connection** walks you through installing.
|
|
824
|
+
|
|
810
825
|
---
|
|
811
826
|
|
|
812
827
|
## Local development
|
|
@@ -892,7 +907,10 @@ npm run test:e2e # real-browser cockpit suite (agent-browser)
|
|
|
892
907
|
Coverage is measured separately, and is not part of the validation gate:
|
|
893
908
|
`npm run test:coverage` runs the vitest suites under the v8 provider and writes line and branch
|
|
894
909
|
numbers to `.local/coverage/`. The behaviour-led gap analysis built from it lives in
|
|
895
|
-
[docs/testing/coverage-gaps.md](docs/testing/coverage-gaps.md).
|
|
910
|
+
[docs/testing/coverage-gaps.md](https://github.com/qodeca/xezar/blob/main/docs/testing/coverage-gaps.md).
|
|
911
|
+
The MCP server is the one scope held to a floor: `npm run test:coverage:mcp` measures it alone
|
|
912
|
+
and fails any file under 80 % lines or branches – see
|
|
913
|
+
[SDLC.md § The MCP test floor](https://github.com/qodeca/xezar/blob/main/SDLC.md#the-mcp-test-floor).
|
|
896
914
|
|
|
897
915
|
The stack is deliberately small: **TypeScript** (strict, ESM), **Hono** + SSE for
|
|
898
916
|
the server, **Zod** at every boundary, **YAML** for workflows, and a **React 19 +
|
|
@@ -900,8 +918,20 @@ Vite + Tailwind v4 + shadcn/ui** cockpit shipped pre-built in `packages/xezar/we
|
|
|
900
918
|
published package carries the built app, so `npx` users never run a bundler.
|
|
901
919
|
Every module is meant to be read in one sitting.
|
|
902
920
|
|
|
921
|
+
What lives where under `docs/`, and who each part is for, is mapped in
|
|
922
|
+
[docs/README.md](https://github.com/qodeca/xezar/blob/main/docs/README.md). `docs/features/` is the internal engineering and decision
|
|
923
|
+
record, not a user guide.
|
|
924
|
+
|
|
925
|
+
---
|
|
926
|
+
|
|
927
|
+
## Contributing
|
|
928
|
+
|
|
929
|
+
Bug reports, ideas and pull requests are welcome. [CONTRIBUTING.md](https://github.com/qodeca/xezar/blob/main/CONTRIBUTING.md) is the short path
|
|
930
|
+
from a change to a merged pull request. Report security problems privately, as described in
|
|
931
|
+
[SECURITY.md](https://github.com/qodeca/xezar/blob/main/SECURITY.md).
|
|
932
|
+
|
|
903
933
|
---
|
|
904
934
|
|
|
905
935
|
## License
|
|
906
936
|
|
|
907
|
-
**MIT** © Patryk Lewczuk — full text in [LICENSE](LICENSE).
|
|
937
|
+
**MIT** © Patryk Lewczuk — full text in [LICENSE](https://github.com/qodeca/xezar/blob/main/LICENSE).
|
|
@@ -6,7 +6,8 @@ import type { ProviderId } from '../core/provider-auth.ts';
|
|
|
6
6
|
* This is the second place vendor knowledge lives about an agent's home, beside
|
|
7
7
|
* `catalog.ts` (which config FILES exist) and `core/agent-profiles.ts` (which env var relocates
|
|
8
8
|
* the home). This one knows where each agent writes its own identity. Facts verified against the
|
|
9
|
-
* files on disk 2026-07-29; re-verify
|
|
9
|
+
* files on disk 2026-07-29, and the pi row against pi 0.85.1 on 2026-09-12 (#329); re-verify
|
|
10
|
+
* before changing them.
|
|
10
11
|
*
|
|
11
12
|
* ## Two rules that are not negotiable
|
|
12
13
|
*
|
|
@@ -34,11 +35,4 @@ export interface AccountIdentity {
|
|
|
34
35
|
reason?: string;
|
|
35
36
|
fields: AccountIdentityField[];
|
|
36
37
|
}
|
|
37
|
-
/**
|
|
38
|
-
* What this account is logged in as, or an honest reason there is nothing to show.
|
|
39
|
-
*
|
|
40
|
-
* Never throws. OpenCode answers "unsupported": its credentials live in a SQLite DB outside the
|
|
41
|
-
* config dir (see `core/agent-profiles.ts`), so there is nothing in a config folder to read — and
|
|
42
|
-
* guessing from the default login would attribute one account's identity to another.
|
|
43
|
-
*/
|
|
44
38
|
export declare function readAccountIdentity(provider: ProviderId, configDir: string): Promise<AccountIdentity>;
|
|
@@ -94,6 +94,41 @@ async function readCodexIdentity(configDir) {
|
|
|
94
94
|
? { available: true, fields }
|
|
95
95
|
: { available: false, reason: NOT_SIGNED_IN, fields: [] };
|
|
96
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* pi keeps its login in `auth.json` INSIDE the agent dir — that is the fact #329 is about, and it
|
|
99
|
+
* is why pi can carry an account at all. But the file holds no account identity: it is
|
|
100
|
+
* `Record<providerId, Credential>`, and a `Credential` is `{type: 'api_key', key?, env?}` or
|
|
101
|
+
* `{type: 'oauth', refresh, access, expires}` — no email, no name, no plan anywhere in it
|
|
102
|
+
* (pi 0.85.1, `dist/core/auth-storage.d.ts` plus `@earendil-works/pi-ai` `dist/auth/types.d.ts`,
|
|
103
|
+
* read on 2026-09-12).
|
|
104
|
+
*
|
|
105
|
+
* What the file DOES carry is what pi-ai itself labels "non-secret credential metadata for
|
|
106
|
+
* account/status enumeration": which model providers this account is logged in to, and by which
|
|
107
|
+
* method. That is the thing that tells two pi accounts apart, so that is what this shows — the
|
|
108
|
+
* map's KEYS and each entry's `type`, both by name. `key`, `access`, `refresh` and `env` are
|
|
109
|
+
* never read, and the value is rebuilt from scratch rather than forwarded.
|
|
110
|
+
*
|
|
111
|
+
* A fresh pi writes `auth.json` as `{}` before any login (observed, #329), so an empty map is the
|
|
112
|
+
* ordinary not-signed-in case and not a parse failure.
|
|
113
|
+
*/
|
|
114
|
+
async function readPiIdentity(configDir) {
|
|
115
|
+
const auth = await readJsonCapped(join(configDir, 'auth.json'));
|
|
116
|
+
if (auth === null)
|
|
117
|
+
return { available: false, reason: NOT_SIGNED_IN, fields: [] };
|
|
118
|
+
const logins = [];
|
|
119
|
+
for (const [providerId, credential] of Object.entries(auth)) {
|
|
120
|
+
const name = text(providerId);
|
|
121
|
+
if (name === undefined || !credential || typeof credential !== 'object')
|
|
122
|
+
continue;
|
|
123
|
+
const type = credential.type;
|
|
124
|
+
const method = type === 'oauth' ? 'OAuth' : type === 'api_key' ? 'API key' : undefined;
|
|
125
|
+
logins.push(method === undefined ? name : `${name} (${method})`);
|
|
126
|
+
}
|
|
127
|
+
logins.sort();
|
|
128
|
+
return logins.length > 0
|
|
129
|
+
? { available: true, fields: [{ label: 'Signed in to', value: logins.join(', ') }] }
|
|
130
|
+
: { available: false, reason: NOT_SIGNED_IN, fields: [] };
|
|
131
|
+
}
|
|
97
132
|
/** A JWT's payload claims, or null when it is not a readable three-part token. */
|
|
98
133
|
function decodeJwtClaims(token) {
|
|
99
134
|
const parts = token.split('.');
|
|
@@ -110,19 +145,28 @@ function decodeJwtClaims(token) {
|
|
|
110
145
|
/**
|
|
111
146
|
* What this account is logged in as, or an honest reason there is nothing to show.
|
|
112
147
|
*
|
|
113
|
-
* Never throws.
|
|
114
|
-
*
|
|
115
|
-
*
|
|
148
|
+
* Never throws. An exhaustive `Record<ProviderId, …>` rather than a chain of `if`s, and that is
|
|
149
|
+
* the fix rather than the style: the chain this replaced fell through to OpenCode's refusal for
|
|
150
|
+
* ANY provider it did not name, so a pi account's "Show details" answered with a sentence about
|
|
151
|
+
* OpenCode — a provider the user had not asked about, and a claim that is false of pi, whose
|
|
152
|
+
* login really is inside its config folder (#329, 2026-09-12). Each provider now answers in its
|
|
153
|
+
* own words, and a fifth provider is a compile error instead of a borrowed refusal.
|
|
154
|
+
*
|
|
155
|
+
* Only OpenCode is genuinely unreadable: its credentials live outside the config dir (see
|
|
156
|
+
* `core/agent-profiles.ts`), so there is nothing in a config folder to read — and guessing from
|
|
157
|
+
* the default login would attribute one account's identity to another.
|
|
116
158
|
*/
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
return {
|
|
159
|
+
const READ_IDENTITY = {
|
|
160
|
+
claude: readClaudeIdentity,
|
|
161
|
+
codex: readCodexIdentity,
|
|
162
|
+
pi: readPiIdentity,
|
|
163
|
+
opencode: async () => ({
|
|
123
164
|
available: false,
|
|
124
165
|
reason: 'OpenCode keeps its login outside its config folder, so xezar cannot read it.',
|
|
125
166
|
fields: [],
|
|
126
|
-
}
|
|
167
|
+
}),
|
|
168
|
+
};
|
|
169
|
+
export async function readAccountIdentity(provider, configDir) {
|
|
170
|
+
return READ_IDENTITY[provider](configDir);
|
|
127
171
|
}
|
|
128
172
|
//# sourceMappingURL=account-identity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-identity.js","sourceRoot":"","sources":["../../src/agent-config/account-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"account-identity.js","sourceRoot":"","sources":["../../src/agent-config/account-identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,44 @@ import type { RunnerId } from '../core/agent-runner.ts';
|
|
|
9
9
|
* and what the docs say; an unknown file is not shown rather than guessed at.
|
|
10
10
|
* A raw editor cannot drift on a vendor's *schema*; it can drift on *paths and
|
|
11
11
|
* precedence strings*, so every entry carries a `docsUrl` and this table is the
|
|
12
|
-
* single maintenance surface. Facts verified against primary docs 2026-07-16
|
|
12
|
+
* single maintenance surface. Facts verified against primary docs 2026-07-16;
|
|
13
|
+
* the pi block against the docs shipped with pi 0.85.1 on 2026-09-12 (#330 WP4).
|
|
14
|
+
*
|
|
15
|
+
* WHAT MAY GO IN THIS TABLE AT ALL. An entry is a file the API hands to a caller
|
|
16
|
+
* verbatim and writes back verbatim, so a file that can hold a credential is not
|
|
17
|
+
* eligible however useful editing it would be (F-15: no secret in a tool
|
|
18
|
+
* response). Two files in pi's home are excluded for exactly that reason and
|
|
19
|
+
* must stay excluded:
|
|
20
|
+
*
|
|
21
|
+
* - `auth.json` — pi's stored provider credentials.
|
|
22
|
+
* - `models.json` — pi's custom-provider catalogue. `apiKey` is OPTIONAL on a
|
|
23
|
+
* provider entry (`apiKey?: string`, `custom-provider.md`) and its value may
|
|
24
|
+
* be an `$ENV_VAR` reference or a `!command` rather than a literal, so "this
|
|
25
|
+
* file always holds a secret" would be too strong a claim. The exclusion does
|
|
26
|
+
* not rest on that claim: on a real 0.85.1 home here, a provider entry carries
|
|
27
|
+
* a literal `apiKey` (`providers.<id>.apiKey`, mode `0600`, checked
|
|
28
|
+
* 2026-09-12), so the file is credential-BEARING in practice, and a catalog
|
|
29
|
+
* entry hands a file over WHOLE. #152's model discovery reads the same file
|
|
30
|
+
* and deliberately touches only `name`, `models[].id` and `models[].name`
|
|
31
|
+
* (`core/pi-model-catalog.ts`); that is the shape a reader of this file needs.
|
|
32
|
+
* Wanting a model editor is not a reason to catalog it.
|
|
33
|
+
*
|
|
34
|
+
* The same directory holds more than those two, and none of the rest may become
|
|
35
|
+
* an entry either. On a real 0.85.1 home, checked 2026-09-12: pi's own rotation
|
|
36
|
+
* copies `models.json.bak-<timestamp>` (mode `0600`, carrying the same literal
|
|
37
|
+
* `apiKey` as the file they copy) and `settings.json.bak-*` (mode `0644`, no
|
|
38
|
+
* `apiKey` observed), plus `models-store.json` (mode `0600`). They are
|
|
39
|
+
* unreachable today for a structural reason worth keeping: every `resolve` below
|
|
40
|
+
* is a fixed `join` of known segments, so the catalog never globs and never lists
|
|
41
|
+
* a directory, and a file becomes reachable only by being written into this table
|
|
42
|
+
* by hand. Rotation copies are the trap that makes this worth stating — excluding
|
|
43
|
+
* `models.json` by name would not exclude `models.json.bak-20260910-114604`.
|
|
44
|
+
*
|
|
45
|
+
* `mcp.json` IS eligible on the same terms as the three MCP files already here:
|
|
46
|
+
* an MCP server definition can carry a token in `env`/`headers`, and Claude's
|
|
47
|
+
* `.mcp.json`, Codex's `[mcp_servers]` and OpenCode's `"mcp"` key have always
|
|
48
|
+
* been in this table with that property. A user typing a secret into a config
|
|
49
|
+
* file is not the same risk as xezar cataloging a file whose PURPOSE is secrets.
|
|
13
50
|
*/
|
|
14
51
|
export type ConfigFormat = 'json' | 'jsonc' | 'toml' | 'markdown';
|
|
15
52
|
export type ConfigScope = 'user' | 'project' | 'local';
|
|
@@ -29,13 +66,18 @@ export interface AgentHomePaths {
|
|
|
29
66
|
/** `$XDG_CONFIG_HOME/opencode` or `~/.config/opencode` */
|
|
30
67
|
opencodeConfig: string;
|
|
31
68
|
/**
|
|
32
|
-
* `~/.pi/agent` — pi's whole per-user directory (`models.json`,
|
|
33
|
-
* `
|
|
34
|
-
*
|
|
69
|
+
* `$PI_CODING_AGENT_DIR` or `~/.pi/agent` — pi's whole per-user directory (`models.json`,
|
|
70
|
+
* `settings.json`, and `auth.json`, which `account-identity.ts` reads for its non-secret
|
|
71
|
+
* credential metadata and nothing else). The variable IS documented and the binary does read
|
|
72
|
+
* it (re-verified against pi 0.85.1, 2026-09-12, #329); the note that used to sit here denying
|
|
73
|
+
* it was wrong, and dated 2026-09-10.
|
|
35
74
|
*
|
|
36
|
-
* `CONFIG_FILES`
|
|
37
|
-
*
|
|
38
|
-
*
|
|
75
|
+
* `CONFIG_FILES` resolves `pi.user.settings`, `pi.user.mcp` and `pi.user.memory` through this
|
|
76
|
+
* slot (#330 WP4), which is also what makes a pi ACCOUNT's files resolve inside the account's
|
|
77
|
+
* folder: `accountFiles` in `server/server.ts` patches this slot via `accountHomePatch`. Model
|
|
78
|
+
* discovery (#152) reads the same slot. It lives here so pi's home is derived in the one place
|
|
79
|
+
* every other agent's is. `auth.json` and `models.json` sit in this dir and are deliberately
|
|
80
|
+
* NOT catalog entries — see the file header.
|
|
39
81
|
*/
|
|
40
82
|
pi: string;
|
|
41
83
|
}
|
|
@@ -6,6 +6,35 @@ const CODEX_CONFIG_DOCS = 'https://developers.openai.com/codex/config-reference'
|
|
|
6
6
|
const CODEX_AGENTS_DOCS = 'https://developers.openai.com/codex/guides/agents-md';
|
|
7
7
|
const OPENCODE_CONFIG_DOCS = 'https://opencode.ai/docs/config/';
|
|
8
8
|
const OPENCODE_RULES_DOCS = 'https://opencode.ai/docs/rules/';
|
|
9
|
+
/**
|
|
10
|
+
* pi ships its docs INSIDE the npm package (`docs/` in `@earendil-works/pi-coding-agent`) AND
|
|
11
|
+
* serves them at `pi.dev`. An earlier note here said it served no docs site, on the strength of
|
|
12
|
+
* `https://pi.dev/docs/settings` → 404; that URL shape was simply wrong. What is true, checked
|
|
13
|
+
* 2026-09-12: `https://pi.dev/docs` → 302 → `/docs/latest`, and `/docs/latest/settings` and
|
|
14
|
+
* `/docs/latest/usage` both answer 200 and contain the sentences quoted below, verbatim.
|
|
15
|
+
*
|
|
16
|
+
* These point at the vendor's own pages rather than at `github.com/.../blob/main/...`, which
|
|
17
|
+
* tracked a moving branch. `latest` moves too — pi publishes no version-pinned path
|
|
18
|
+
* (`/docs/0.85.1/settings` → 404, checked) — so the guard against silent drift is the date, not
|
|
19
|
+
* the URL: every quote below was taken from the docs shipped with pi **0.85.1** on 2026-09-12,
|
|
20
|
+
* and each was re-read in the npm package AND on the page above.
|
|
21
|
+
*/
|
|
22
|
+
const PI_SETTINGS_DOCS = 'https://pi.dev/docs/latest/settings';
|
|
23
|
+
const PI_USAGE_DOCS = 'https://pi.dev/docs/latest/usage';
|
|
24
|
+
/**
|
|
25
|
+
* pi core reads NO MCP config: MCP arrives through the third-party `pi-mcp-adapter` extension
|
|
26
|
+
* (#341/#343 shipped the cockpit's setup card for it), so the adapter's README is the vendor doc
|
|
27
|
+
* for these two files and pi's own docs never mention `mcp.json`. Verified against
|
|
28
|
+
* `pi-mcp-adapter@2.32.1` on 2026-09-12.
|
|
29
|
+
*/
|
|
30
|
+
const PI_MCP_DOCS = 'https://github.com/nicobailon/pi-mcp-adapter';
|
|
31
|
+
/**
|
|
32
|
+
* The adapter's own ordering sentence and list, quoted rather than restated because the two pi MCP
|
|
33
|
+
* entries have to agree about it and a paraphrase in one of them would be the drift this table
|
|
34
|
+
* exists to prevent. It is also the sentence WP3's setup card (#343) built its “yours wins” claim
|
|
35
|
+
* on, so the two surfaces now quote one string.
|
|
36
|
+
*/
|
|
37
|
+
const PI_MCP_PRECEDENCE = '“Precedence is (later entries win): 1. ~/.config/mcp/mcp.json 2. ~/.agents/mcp.json 3. ~/.agents/mcp/mcp.json 4. <Pi agent dir>/mcp.json 5. .mcp.json 6. .pi/mcp.json”.';
|
|
9
38
|
/**
|
|
10
39
|
* The table. Order is presentation order: per runner, then user → project →
|
|
11
40
|
* local so each scope ladder reads top (broad) to bottom (specific).
|
|
@@ -198,6 +227,84 @@ export const CONFIG_FILES = [
|
|
|
198
227
|
precedence: 'Global rules. First match wins across scopes: if a project AGENTS.md exists, this global file is not read at all.',
|
|
199
228
|
docsUrl: OPENCODE_RULES_DOCS,
|
|
200
229
|
},
|
|
230
|
+
// ---- pi (#330 WP4) ----
|
|
231
|
+
// Two files pi itself reads (settings, context) and two the `pi-mcp-adapter` extension reads.
|
|
232
|
+
// Nothing else in `~/.pi/agent` is listed: `auth.json` and `models.json` both hold credentials
|
|
233
|
+
// (file header), and `models-store.json`, `mcp-cache.json`, `trust.json` and `sessions/` are
|
|
234
|
+
// pi's own runtime state rather than config a person edits.
|
|
235
|
+
//
|
|
236
|
+
// No pi entry carries `modelKey`/`modelPriority`, so `readNativeSettingsFiles('pi', …)` still
|
|
237
|
+
// finds nothing and `piModelSettingsStrategy` still reports "no native default". That is
|
|
238
|
+
// deliberate and is NOT an oversight to fix by adding the key: pi's model ids are
|
|
239
|
+
// `provider/model` composites (`core/pi-model-catalog.ts`, and `pi --model` is handed one),
|
|
240
|
+
// while its settings split the halves across `defaultProvider` and `defaultModel`, so
|
|
241
|
+
// `modelKey: 'defaultModel'` alone would report a bare half that `pi --model` does not name.
|
|
242
|
+
// And `.pi/settings.json` only applies in a folder pi has TRUSTED, a decision recorded in
|
|
243
|
+
// `~/.pi/agent/trust.json` that xezar does not read, so a project-scope model default would be
|
|
244
|
+
// a claim xezar cannot check. Wiring pi's native default is its own change: compose the two
|
|
245
|
+
// halves the way `model-settings/codex.ts` already does, and settle the trust question first.
|
|
246
|
+
{
|
|
247
|
+
id: 'pi.user.settings',
|
|
248
|
+
runners: ['pi'],
|
|
249
|
+
kind: 'settings',
|
|
250
|
+
scope: 'user',
|
|
251
|
+
resolve: (_repo, home) => join(home.pi, 'settings.json'),
|
|
252
|
+
label: '~/.pi/agent/settings.json',
|
|
253
|
+
format: 'json',
|
|
254
|
+
tracked: 'outside-repo',
|
|
255
|
+
precedence: 'Global (all projects). “Pi uses JSON settings files with project settings overriding global settings.” A project’s .pi/settings.json overrides this, but only in a folder pi has trusted; defaultProjectTrust and httpProxy are marked “Global setting only” and cannot be overridden at project scope.',
|
|
256
|
+
docsUrl: PI_SETTINGS_DOCS,
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
id: 'pi.project.settings',
|
|
260
|
+
runners: ['pi'],
|
|
261
|
+
kind: 'settings',
|
|
262
|
+
scope: 'project',
|
|
263
|
+
resolve: (repo) => join(repo, '.pi', 'settings.json'),
|
|
264
|
+
label: '.pi/settings.json',
|
|
265
|
+
format: 'json',
|
|
266
|
+
tracked: 'tracked',
|
|
267
|
+
precedence: 'Project (current directory), overriding the global file key by key. Read ONLY in a folder pi has trusted, and trust grants more than reading: “Trusting a project allows pi to load .pi/settings.json and .pi resources, install missing project packages, and execute project extensions.” Non-interactive runs (-p, --mode json, --mode rpc) never prompt, but they are not a blanket refusal: “Without an applicable saved trust decision, they use defaultProjectTrust from global settings: ask (default) and never ignore those project resources, while always trusts them.” So this file DOES apply in such a run when a saved decision in ~/.pi/agent/trust.json covers the folder or a parent, when defaultProjectTrust is “always”, or when the run passes --approve/-a (“Pass --approve/-a or --no-approve/-na to override project trust for one run.”). Runs read the committed copy.',
|
|
268
|
+
docsUrl: PI_SETTINGS_DOCS,
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
id: 'pi.user.mcp',
|
|
272
|
+
runners: ['pi'],
|
|
273
|
+
kind: 'mcp',
|
|
274
|
+
scope: 'user',
|
|
275
|
+
resolve: (_repo, home) => join(home.pi, 'mcp.json'),
|
|
276
|
+
label: '~/.pi/agent/mcp.json',
|
|
277
|
+
format: 'json',
|
|
278
|
+
tracked: 'outside-repo',
|
|
279
|
+
holdsMcp: true,
|
|
280
|
+
precedence: `Pi global override — 4th of six sources, so both project files beat it. ${PI_MCP_PRECEDENCE} Read by the pi-mcp-adapter extension, not by pi itself: with the extension not installed pi reads no MCP config at all.`,
|
|
281
|
+
docsUrl: PI_MCP_DOCS,
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
id: 'pi.project.mcp',
|
|
285
|
+
runners: ['pi'],
|
|
286
|
+
kind: 'mcp',
|
|
287
|
+
scope: 'project',
|
|
288
|
+
resolve: (repo) => join(repo, '.pi', 'mcp.json'),
|
|
289
|
+
label: '.pi/mcp.json',
|
|
290
|
+
format: 'json',
|
|
291
|
+
tracked: 'tracked',
|
|
292
|
+
holdsMcp: true,
|
|
293
|
+
precedence: `Pi project override — the HIGHEST of the six sources. ${PI_MCP_PRECEDENCE} Read by the pi-mcp-adapter extension, not by pi itself. Runs read the committed copy.`,
|
|
294
|
+
docsUrl: PI_MCP_DOCS,
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
id: 'pi.user.memory',
|
|
298
|
+
runners: ['pi'],
|
|
299
|
+
kind: 'memory',
|
|
300
|
+
scope: 'user',
|
|
301
|
+
resolve: (_repo, home) => join(home.pi, 'AGENTS.md'),
|
|
302
|
+
label: '~/.pi/agent/AGENTS.md',
|
|
303
|
+
format: 'markdown',
|
|
304
|
+
tracked: 'outside-repo',
|
|
305
|
+
precedence: 'Global instructions, loaded first and not replaced by a project file. pi’s docs give the sources as a list, so they are quoted as one — “Pi loads AGENTS.md or CLAUDE.md at startup from:” (1) “~/.pi/agent/AGENTS.md for global instructions”, (2) “parent directories, walking up from the current working directory”, (3) “the current directory”. Two qualifiers from the same page: a per-directory override — “If a directory contains AGENTS.override.md, Pi loads it instead of AGENTS.md or CLAUDE.md from that directory. Context files from other directories still layer normally.”, which is why a project’s override does not displace THIS file (an AGENTS.override.md in pi’s own home would) — and an off switch, “Disable loading with --no-context-files or -nc”, which skips every source including this one. xezar catalogs no AGENTS.override.md at any scope. pi therefore also reads this repo’s AGENTS.md and CLAUDE.md; those entries stay listed under the vendors whose precedence rules they carry.',
|
|
306
|
+
docsUrl: PI_USAGE_DOCS,
|
|
307
|
+
},
|
|
201
308
|
// ---- Shared: <repo>/AGENTS.md is read by BOTH Codex and OpenCode ----
|
|
202
309
|
{
|
|
203
310
|
id: 'project.agents',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/agent-config/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/agent-config/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,17 @@ import type { AgentModelSettingsStrategy } from './types.ts';
|
|
|
2
2
|
/**
|
|
3
3
|
* pi's native-settings policy, expressed the same way every other runner's is.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* `readNativeSettingsFiles`
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
5
|
+
* The catalog names pi's settings files as of #330 WP4, but neither carries `modelKey` or
|
|
6
|
+
* `modelPriority`, so `readNativeSettingsFiles` still selects none and this still reports "no
|
|
7
|
+
* native default" — the cockpit falls back to xezar's own preset for pi, as it does for a runner
|
|
8
|
+
* whose config file the user has never written.
|
|
9
|
+
*
|
|
10
|
+
* That is a deliberate hold, not a leftover. Adding `modelKey: 'defaultModel'` would make this
|
|
11
|
+
* report the BARE half of a pi model id: pi's ids are `provider/model` composites
|
|
12
|
+
* (`core/pi-model-catalog.ts` builds them, and `pi --model` is handed one), while `settings.json`
|
|
13
|
+
* splits them across `defaultProvider` and `defaultModel`. Honoring pi's native default means
|
|
14
|
+
* composing the two halves the way `codex.ts` already does — plus settling what a PROJECT-scope
|
|
15
|
+
* default means when pi only loads `.pi/settings.json` in a folder it has trusted, a decision in
|
|
16
|
+
* `~/.pi/agent/trust.json` that xezar does not read. `catalog.ts`'s pi block carries the same note.
|
|
11
17
|
*/
|
|
12
18
|
export declare const piModelSettingsStrategy: AgentModelSettingsStrategy;
|
|
@@ -2,12 +2,18 @@ import { firstConfiguredModel, readNativeSettingsFiles } from './shared.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* pi's native-settings policy, expressed the same way every other runner's is.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* `readNativeSettingsFiles`
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
5
|
+
* The catalog names pi's settings files as of #330 WP4, but neither carries `modelKey` or
|
|
6
|
+
* `modelPriority`, so `readNativeSettingsFiles` still selects none and this still reports "no
|
|
7
|
+
* native default" — the cockpit falls back to xezar's own preset for pi, as it does for a runner
|
|
8
|
+
* whose config file the user has never written.
|
|
9
|
+
*
|
|
10
|
+
* That is a deliberate hold, not a leftover. Adding `modelKey: 'defaultModel'` would make this
|
|
11
|
+
* report the BARE half of a pi model id: pi's ids are `provider/model` composites
|
|
12
|
+
* (`core/pi-model-catalog.ts` builds them, and `pi --model` is handed one), while `settings.json`
|
|
13
|
+
* splits them across `defaultProvider` and `defaultModel`. Honoring pi's native default means
|
|
14
|
+
* composing the two halves the way `codex.ts` already does — plus settling what a PROJECT-scope
|
|
15
|
+
* default means when pi only loads `.pi/settings.json` in a folder it has trusted, a decision in
|
|
16
|
+
* `~/.pi/agent/trust.json` that xezar does not read. `catalog.ts`'s pi block carries the same note.
|
|
11
17
|
*/
|
|
12
18
|
export const piModelSettingsStrategy = {
|
|
13
19
|
runner: 'pi',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi.js","sourceRoot":"","sources":["../../../src/agent-config/model-settings/pi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAG5E
|
|
1
|
+
{"version":3,"file":"pi.js","sourceRoot":"","sources":["../../../src/agent-config/model-settings/pi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAG5E;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAA+B;IACjE,MAAM,EAAE,IAAI;IACZ,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG;QACtB,OAAO,EAAE,KAAK,EAAE,oBAAoB,CAAC,MAAM,uBAAuB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;IAC7F,CAAC;CACF,CAAC"}
|
|
@@ -14,6 +14,16 @@ import { CONFIG_FILES } from './catalog.js';
|
|
|
14
14
|
* Only Claude's gitignored layer is seeded (the only vendor with a documented
|
|
15
15
|
* untracked personal file). Tracked files keep honest "applies after commit"
|
|
16
16
|
* semantics and are never touched here.
|
|
17
|
+
*
|
|
18
|
+
* pi (#330 WP4) is NOT seeded, and that was checked rather than skipped. Its two
|
|
19
|
+
* project files, `.pi/settings.json` and `.pi/mcp.json`, are `tracked`: pi
|
|
20
|
+
* documents no untracked personal counterpart, and the adapter's own advice is to
|
|
21
|
+
* commit `.pi/mcp.json` because it holds no secret. Seeding a TRACKED file would
|
|
22
|
+
* copy a repo-root edit into the worktree and quietly change what "applies after
|
|
23
|
+
* commit" means for it — the guarantee this loop is careful not to break for
|
|
24
|
+
* Codex's and OpenCode's project files either. If pi ever documents a personal
|
|
25
|
+
* layer, marking it `seeded` in the catalog is the whole change; this function
|
|
26
|
+
* needs none.
|
|
17
27
|
*/
|
|
18
28
|
function git(cwd, args) {
|
|
19
29
|
return new Promise((resolve) => {
|