@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.
- package/dist/cli.js +97 -27
- package/dist/cli.js.map +1 -1
- package/docs/config-simplification.md +11 -8
- package/man/pipod-config.5 +5 -1
- package/man/pipod-config.5.md +4 -0
- package/man/pipod.1 +35 -15
- package/man/pipod.1.md +33 -14
- package/package.json +1 -1
- package/templates/user-config.jsonc +5 -1
|
@@ -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
|
|
118
|
-
local source (project `.pi-pod/`+`.pi/`, user `~/.pi-pod`+`~/.pi/agent`,
|
|
119
|
-
`~/.pi-pod/org/` or `--dir
|
|
120
|
-
|
|
121
|
-
-
|
|
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
|
package/man/pipod-config.5
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
.TH "PIPOD\-CONFIG" "5" "October 2026" "0.1.
|
|
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
|
package/man/pipod-config.5.md
CHANGED
|
@@ -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.
|
|
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:
|
|
94
|
-
upload with \fBpipod push\fP\|\. \fBpipod pull\fP writes the server's copy back, and
|
|
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
|
-
|
|
141
|
-
|
|
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\.
|
|
221
|
-
|
|
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
|
|
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>]
|
|
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
|
|
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
|
|
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:
|
|
93
|
-
upload with `pipod push`. `pipod pull` writes the server's copy back, and
|
|
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
|
-
|
|
143
|
-
|
|
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.
|
|
211
|
-
|
|
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
|
|
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>]
|
|
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
|
|
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
|
|
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
|
@@ -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
|
}
|