@pipod/cli 0.1.9 → 0.1.11

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.
@@ -18,7 +18,7 @@
18
18
  Retired config keys fail closed in `validateConfig` (and in `planAccountLaunch`
19
19
  before resolve — covering nested `pi.hostConfig` lists and the machine layer
20
20
  `~/.pi-pod/config.json`, whose only ever-read keys are the template pin,
21
- `secretResolver`, and `pi.chords`/`pi.sessionNaming`) because silently ignoring a
21
+ `secretResolver`, and `pi.chords`/`pi.sessionNaming`/`pi.podExtensions`) because silently ignoring a
22
22
  custom script path would read the wrong file. Server-resident bundles carrying
23
23
  retired keys (old templates) are stripped with a warning on pull and
24
24
  launch-preview — `push` clears them; `diff` strips silently by design (it is
@@ -33,7 +33,7 @@ One deep boundary, `stripNonBundleKeys` (`toOutgoingBundleConfig` for raw files)
33
33
  drops everything a bundle payload must not contain: the rejected keys
34
34
  (`template` — the local pin, a template id travels instead; `reuse`;
35
35
  `envFile`/`initScript`/`bakeScript`; `pi.hostConfig.skills`/`extensions`) plus
36
- client-only metadata (`$schema`, `secretResolver`, `pi.chords`/`pi.sessionNaming`).
36
+ client-only metadata (`$schema`, `secretResolver`, `pi.chords`/`pi.sessionNaming`/`pi.podExtensions`).
37
37
  Covered paths: project/user/org-dir compilation, the launch bootstrap preview,
38
38
  `templates create/edit --config`, and `settings user|org edit|set` — the settings
39
39
  verbs validate the edited config locally first (types and retired keys fail
@@ -58,6 +58,7 @@ explicit `set reuse true` fails visibly rather than vanishing.
58
58
  server-side; `packages` is enforced on both sides (local sanitize/filter plus
59
59
  the server install gate).
60
60
  - `pi.chords` / `pi.sessionNaming` — client-only UI preferences, stripped before anything travels.
61
+ - `pi.podExtensions` — client-only: whether a pod's attested Pi extensions run on this machine without asking (`"ask"` or `"run"`). Read only from `~/.pi-pod/config.json`, so no server layer can choose to run code on someone's machine.
61
62
  - `secretResolver` / `$schema` — client-only op:// resolution config / schema hint; never travel.
62
63
 
63
64
  ## Retained: CLI surface (complete inventory)
@@ -114,15 +115,17 @@ ignored, except `--dry-run`/`--on`-with-fork which are usage errors.
114
115
  `--from-here`), `edit` (`--name/--description/--config/--init-script/--bake-script`;
115
116
  `--org` rejected — org-wide goes through `share`; whole-snapshot replace goes through `push`), `share` (one-way),
116
117
  `rm|delete [-y]`. A global `--yes` is honored (no false scope warning).
117
- - `push [template [<name>]|user|org]`: whole-bundle replace from the layer's
118
- local source (project `.pi-pod/`+`.pi/`, user `~/.pi-pod`+`~/.pi/agent`, org
119
- `~/.pi-pod/org/` or `--dir`), after a diff preview. `--with-secrets` uploads
120
- env values (else a prompt per bundle); `-y` applies without confirming.
121
- - `pull [layer]`: reverse of push (same sources; `--dir` for org; `-y`).
118
+ - `push [template [<name>]|user|org|policy]`: whole-bundle replace from the
119
+ layer's local source (project `.pi-pod/`+`.pi/`, user `~/.pi-pod`+`~/.pi/agent`,
120
+ org `~/.pi-pod/org/` or `--dir`, policy `policy.json` in that org directory),
121
+ after a diff preview. The policy is config only and validated by the server.
122
+ `--with-secrets` uploads env values (else a prompt per bundle); `-y` applies
123
+ without confirming.
124
+ - `pull [layer]`: reverse of push (same sources; `--dir` for org and policy; `-y`).
122
125
  Client-only keys, host-coupled settings, and model credential values survive;
123
126
  server scripts with no local file warn instead of writing.
124
127
  - `diff [layer]`: same sources, secrets by name only; exit 1 on drift (`--dir`
125
- for org; no `-y` — it never writes).
128
+ for org and policy; no `-y` — it never writes).
126
129
  - `settings <user|org> [show|edit|set <key> <json-value>]`: config-only
127
130
  compare-and-swap edits (scripts/Pi files untouched — that is `push`).
128
131
  `show` prints JSON; `edit` uses `$VISUAL`/`$EDITOR`; `set` takes a dotted key
@@ -1,4 +1,4 @@
1
- .TH "PIPOD\-CONFIG" "5" "October 2026" "0.1.9"
1
+ .TH "PIPOD\-CONFIG" "5" "October 2026" "0.1.11"
2
2
  .SH "NAME"
3
3
  \fBpipod-config\fR \- pi pod configuration files
4
4
  .SH SYNOPSIS
@@ -94,6 +94,10 @@ pi\.chords keystrokes for /pod commands while attached:
94
94
  "bindings": { "d": "detach", "a": "archive", "s": "status",
95
95
  "l": "list", "w": "switch" } }
96
96
  pi\.sessionNaming "auto" (default) names a session from its first prompt; "off"
97
+ pi\.podExtensions a pod's Pi extensions run on this machine, as you, to render in
98
+ the terminal: "ask" (default) confirms each new extension
99
+ version; "run" runs them without asking (read only from
100
+ ~/\.pi\-pod/config\.json)
97
101
  $schema ignored
98
102
  .fi
99
103
  .RE
@@ -91,6 +91,10 @@ pi.chords keystrokes for /pod commands while attached:
91
91
  "bindings": { "d": "detach", "a": "archive", "s": "status",
92
92
  "l": "list", "w": "switch" } }
93
93
  pi.sessionNaming "auto" (default) names a session from its first prompt; "off"
94
+ pi.podExtensions a pod's Pi extensions run on this machine, as you, to render in
95
+ the terminal: "ask" (default) confirms each new extension
96
+ version; "run" runs them without asking (read only from
97
+ ~/.pi-pod/config.json)
94
98
  $schema ignored
95
99
  ```
96
100
 
package/man/pipod.1 CHANGED
@@ -1,4 +1,4 @@
1
- .TH "PIPOD" "1" "October 2026" "0.1.9"
1
+ .TH "PIPOD" "1" "October 2026" "0.1.11"
2
2
  .SH "NAME"
3
3
  \fBpipod\fR \- run pi coding\-agent sessions in server\-managed pods
4
4
  .SH SYNOPSIS
@@ -90,9 +90,9 @@ bake script that is built into the pod image once, and Pi files\. Secrets are st
90
90
  the layers and reach pods as environment variables\. \fBpipod help layers\fP explains how they
91
91
  combine\.
92
92
  .P
93
- Every server layer has a local source of truth: a directory you edit with any editor, then
94
- upload with \fBpipod push\fP\|\. \fBpipod pull\fP writes the server's copy back, and \fBpipod diff\fP
95
- compares the two\.
93
+ Every server layer, organization policy included, has a local source of truth: files you edit
94
+ with any editor, then upload with \fBpipod push\fP\|\. \fBpipod pull\fP writes the server's copy back, and
95
+ \fBpipod diff\fP compares the two\.
96
96
  .SH SETUP
97
97
  .P
98
98
  Setting pi pod up for yourself or an organization, in order\. A person has to do the steps
@@ -137,8 +137,20 @@ pipod push org
137
137
  .RE
138
138
  .P
139
139
  Values for secrets the whole organization shares: \fBpipod secrets set org <NAME>\fP (person)\.
140
- Organization policy (limits rather than defaults) is set in the web dashboard,
141
- \fB<server>/dashboard/\fP\|\.
140
+ .P
141
+ Organization policy (limits rather than defaults) needs the policy:write permission\. Its source
142
+ is policy\.json beside the organization layer's files:
143
+ .RS 2
144
+ .nf
145
+ pipod pull policy # writes ~/\.pi\-pod/org/policy\.json
146
+ # edit it
147
+ pipod diff policy
148
+ pipod push policy
149
+ .fi
150
+ .RE
151
+ .P
152
+ To keep the organization's source in a repository instead, give each of these commands
153
+ \fB\-\-dir <path>\fP\|\.
142
154
  .SS 5\. Your own defaults
143
155
  .P
144
156
  Your model and thinking level, your Pi settings, personal setup such as a git identity:
@@ -217,8 +229,8 @@ and the server refuses a literal key\.
217
229
  .P
218
230
  Organization policy holds limits rather than defaults: maximum idle and archive times,
219
231
  allowed providers, a required template, network rules, concurrency\. It clamps the merged
220
- result, and \fBpipod doctor\fP and \fBpipod \-\-dry\-run\fP report every clamp\. It is set in the web
221
- dashboard by someone with the policy:write permission\.
232
+ result, and \fBpipod doctor\fP and \fBpipod \-\-dry\-run\fP report every clamp\. Someone with the
233
+ policy:write permission changes it with \fBpipod push policy\fP or in the web dashboard\.
222
234
  .P
223
235
  Where each layer's source lives, and the commands that change it:
224
236
  .RS 2
@@ -229,6 +241,8 @@ user ~/\.pi\-pod/config\.json and ~/\.pi/agent/
229
241
  pipod pull|diff|push user; pipod settings user set
230
242
  template a project: \.pi\-pod/config\.json, init\.sh, bake\.sh, env, and \.pi/
231
243
  pipod pull|diff|push [template [<name>]]; pipod templates
244
+ policy ~/\.pi\-pod/org/policy\.json
245
+ pipod pull|diff|push policy (policy:write)
232
246
  .fi
233
247
  .RE
234
248
  .P
@@ -459,7 +473,7 @@ A personal template sits above your user layer and an org\-wide one below it
459
473
  .SS pipod push
460
474
  .RS 2
461
475
  .nf
462
- Usage: pipod push [template [<name>] | user | org] [\-\-dir <path>]
476
+ Usage: pipod push [template [<name>] | user | org | policy] [\-\-dir <path>]
463
477
  [\-\-with\-secrets] [\-\-yes]
464
478
 
465
479
  Replace a server config bundle with its local source, whole\. The layer names
@@ -475,13 +489,16 @@ Layers and their local source:
475
489
  models\.json, mcporter\.json, subagents\.json, agents/)
476
490
  org ~/\.pi\-pod/org/: config\.json, init\.sh, bake\.sh, pi/…, and
477
491
  an optional env file whose values become org secrets
492
+ policy ~/\.pi\-pod/org/policy\.json: the organization policy, one
493
+ JSON object of limits, checked by the server
478
494
 
479
495
  Inside a project the layer defaults to template; elsewhere it is required\.
480
496
  Provider credentials, hooks, mcpServers, and model credential values never
481
497
  leave this machine\.
482
498
 
483
499
  Options:
484
- \-\-dir <path> org only: read the org source from <path> instead
500
+ \-\-dir <path> org and policy: read the org source directory from <path>
501
+ instead
485
502
  \-\-with\-secrets Also upload the layer's env values as secrets
486
503
  \-y, \-\-yes Apply the replacement without the confirmation prompt
487
504
  .fi
@@ -493,7 +510,8 @@ confirm on, push declines unless \fB\-\-yes\fP is given\.
493
510
  .SS pipod pull
494
511
  .RS 2
495
512
  .nf
496
- Usage: pipod pull [template [<name>] | user | org] [\-\-dir <path>] [\-\-yes]
513
+ Usage: pipod pull [template [<name>] | user | org | policy] [\-\-dir <path>]
514
+ [\-\-yes]
497
515
 
498
516
  Write a server config bundle into its local source files (see
499
517
  `pipod push \-\-help` for the layer → directory table)\. A diff preview
@@ -501,7 +519,7 @@ precedes the confirmation; nothing is written when the two already match\.
501
519
 
502
520
  What pull keeps from the local files:
503
521
  config\.json client\-only keys: $schema, template, secretResolver,
504
- pi\.chords, pi\.sessionNaming
522
+ pi\.chords, pi\.sessionNaming, pi\.podExtensions
505
523
  settings\.json hooks and mcpServers (and packages when hostConfig\.packages
506
524
  is off)
507
525
  models\.json credential values the push had dropped
@@ -511,21 +529,23 @@ Secrets stay on the server; their names are listed\. The user layer has no
511
529
  local script files, so user bundle scripts are shown but not written\.
512
530
 
513
531
  Options:
514
- \-\-dir <path> org only: write the org source to <path> instead
532
+ \-\-dir <path> org and policy: write the org source directory at <path>
533
+ instead
515
534
  \-y, \-\-yes Apply the local changes without the confirmation prompt
516
535
  .fi
517
536
  .RE
518
537
  .SS pipod diff
519
538
  .RS 2
520
539
  .nf
521
- Usage: pipod diff [template [<name>] | user | org] [\-\-dir <path>]
540
+ Usage: pipod diff [template [<name>] | user | org | policy] [\-\-dir <path>]
522
541
 
523
542
  Compare a config layer's local source with its server bundle (see
524
543
  `pipod push \-\-help` for the layer → directory table)\. Secrets compare by
525
544
  name only\. Exits 1 when they differ, 0 when they match\.
526
545
 
527
546
  Options:
528
- \-\-dir <path> org only: read the org source from <path> instead
547
+ \-\-dir <path> org and policy: read the org source directory from <path>
548
+ instead
529
549
  .fi
530
550
  .RE
531
551
  .SS pipod secrets
package/man/pipod.1.md CHANGED
@@ -89,9 +89,9 @@ bake script that is built into the pod image once, and Pi files. Secrets are sto
89
89
  the layers and reach pods as environment variables. `pipod help layers` explains how they
90
90
  combine.
91
91
 
92
- Every server layer has a local source of truth: a directory you edit with any editor, then
93
- upload with `pipod push`. `pipod pull` writes the server's copy back, and `pipod diff`
94
- compares the two.
92
+ Every server layer, organization policy included, has a local source of truth: files you edit
93
+ with any editor, then upload with `pipod push`. `pipod pull` writes the server's copy back, and
94
+ `pipod diff` compares the two.
95
95
 
96
96
  ## SETUP
97
97
 
@@ -139,8 +139,19 @@ pipod push org
139
139
  ```
140
140
 
141
141
  Values for secrets the whole organization shares: `pipod secrets set org <NAME>` (person).
142
- Organization policy (limits rather than defaults) is set in the web dashboard,
143
- `<server>/dashboard/`.
142
+
143
+ Organization policy (limits rather than defaults) needs the policy:write permission. Its source
144
+ is policy.json beside the organization layer's files:
145
+
146
+ ```
147
+ pipod pull policy # writes ~/.pi-pod/org/policy.json
148
+ # edit it
149
+ pipod diff policy
150
+ pipod push policy
151
+ ```
152
+
153
+ To keep the organization's source in a repository instead, give each of these commands
154
+ `--dir <path>`.
144
155
 
145
156
  ### 5. Your own defaults
146
157
 
@@ -207,8 +218,8 @@ project's .pi-pod/config.json. Within the layers:
207
218
 
208
219
  Organization policy holds limits rather than defaults: maximum idle and archive times,
209
220
  allowed providers, a required template, network rules, concurrency. It clamps the merged
210
- result, and `pipod doctor` and `pipod --dry-run` report every clamp. It is set in the web
211
- dashboard by someone with the policy:write permission.
221
+ result, and `pipod doctor` and `pipod --dry-run` report every clamp. Someone with the
222
+ policy:write permission changes it with `pipod push policy` or in the web dashboard.
212
223
 
213
224
  Where each layer's source lives, and the commands that change it:
214
225
 
@@ -219,6 +230,8 @@ user ~/.pi-pod/config.json and ~/.pi/agent/
219
230
  pipod pull|diff|push user; pipod settings user set
220
231
  template a project: .pi-pod/config.json, init.sh, bake.sh, env, and .pi/
221
232
  pipod pull|diff|push [template [<name>]]; pipod templates
233
+ policy ~/.pi-pod/org/policy.json
234
+ pipod pull|diff|push policy (policy:write)
222
235
  ```
223
236
 
224
237
  What belongs where: the organization layer holds what everyone needs (pod size, network
@@ -451,7 +464,7 @@ A personal template sits above your user layer and an org-wide one below it
451
464
  ### pipod push
452
465
 
453
466
  ```
454
- Usage: pipod push [template [<name>] | user | org] [--dir <path>]
467
+ Usage: pipod push [template [<name>] | user | org | policy] [--dir <path>]
455
468
  [--with-secrets] [--yes]
456
469
 
457
470
  Replace a server config bundle with its local source, whole. The layer names
@@ -467,13 +480,16 @@ Layers and their local source:
467
480
  models.json, mcporter.json, subagents.json, agents/)
468
481
  org ~/.pi-pod/org/: config.json, init.sh, bake.sh, pi/…, and
469
482
  an optional env file whose values become org secrets
483
+ policy ~/.pi-pod/org/policy.json: the organization policy, one
484
+ JSON object of limits, checked by the server
470
485
 
471
486
  Inside a project the layer defaults to template; elsewhere it is required.
472
487
  Provider credentials, hooks, mcpServers, and model credential values never
473
488
  leave this machine.
474
489
 
475
490
  Options:
476
- --dir <path> org only: read the org source from <path> instead
491
+ --dir <path> org and policy: read the org source directory from <path>
492
+ instead
477
493
  --with-secrets Also upload the layer's env values as secrets
478
494
  -y, --yes Apply the replacement without the confirmation prompt
479
495
  ```
@@ -485,7 +501,8 @@ confirm on, push declines unless `--yes` is given.
485
501
  ### pipod pull
486
502
 
487
503
  ```
488
- Usage: pipod pull [template [<name>] | user | org] [--dir <path>] [--yes]
504
+ Usage: pipod pull [template [<name>] | user | org | policy] [--dir <path>]
505
+ [--yes]
489
506
 
490
507
  Write a server config bundle into its local source files (see
491
508
  `pipod push --help` for the layer → directory table). A diff preview
@@ -493,7 +510,7 @@ precedes the confirmation; nothing is written when the two already match.
493
510
 
494
511
  What pull keeps from the local files:
495
512
  config.json client-only keys: $schema, template, secretResolver,
496
- pi.chords, pi.sessionNaming
513
+ pi.chords, pi.sessionNaming, pi.podExtensions
497
514
  settings.json hooks and mcpServers (and packages when hostConfig.packages
498
515
  is off)
499
516
  models.json credential values the push had dropped
@@ -503,21 +520,23 @@ Secrets stay on the server; their names are listed. The user layer has no
503
520
  local script files, so user bundle scripts are shown but not written.
504
521
 
505
522
  Options:
506
- --dir <path> org only: write the org source to <path> instead
523
+ --dir <path> org and policy: write the org source directory at <path>
524
+ instead
507
525
  -y, --yes Apply the local changes without the confirmation prompt
508
526
  ```
509
527
 
510
528
  ### pipod diff
511
529
 
512
530
  ```
513
- Usage: pipod diff [template [<name>] | user | org] [--dir <path>]
531
+ Usage: pipod diff [template [<name>] | user | org | policy] [--dir <path>]
514
532
 
515
533
  Compare a config layer's local source with its server bundle (see
516
534
  `pipod push --help` for the layer → directory table). Secrets compare by
517
535
  name only. Exits 1 when they differ, 0 when they match.
518
536
 
519
537
  Options:
520
- --dir <path> org only: read the org source from <path> instead
538
+ --dir <path> org and policy: read the org source directory from <path>
539
+ instead
521
540
  ```
522
541
 
523
542
  ### pipod secrets
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pipod/cli",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "description": "Run pi coding-agent sessions in server-managed pods",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0-only",
@@ -20,6 +20,10 @@
20
20
  "w": "switch"
21
21
  }
22
22
  },
23
- "sessionNaming": "auto"
23
+ "sessionNaming": "auto",
24
+
25
+ // A pod's Pi extensions run on this machine, as you, to render in your terminal. "ask"
26
+ // confirms each new extension version; "run" runs them all without asking.
27
+ "podExtensions": "ask"
24
28
  }
25
29
  }