@pipod/cli 0.1.11 → 0.1.13
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 +95 -80
- package/dist/cli.js.map +1 -1
- package/docs/config-simplification.md +6 -6
- package/docs/workspace-seeding.md +16 -11
- package/man/pipod-config.5 +42 -3
- package/man/pipod-config.5.md +40 -2
- package/man/pipod.1 +33 -20
- package/man/pipod.1.md +32 -19
- package/package.json +1 -1
|
@@ -35,7 +35,7 @@ drops everything a bundle payload must not contain: the rejected keys
|
|
|
35
35
|
`envFile`/`initScript`/`bakeScript`; `pi.hostConfig.skills`/`extensions`) plus
|
|
36
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
|
-
`templates create/edit --config`, and `settings user|org edit|set` — the settings
|
|
38
|
+
`templates create/edit --config`, and `settings user|org|template edit|set` — the settings
|
|
39
39
|
verbs validate the edited config locally first (types and retired keys fail
|
|
40
40
|
before any write request) and throw on non-bundle keys with the fix, so an
|
|
41
41
|
explicit `set reuse true` fails visibly rather than vanishing.
|
|
@@ -126,11 +126,11 @@ ignored, except `--dry-run`/`--on`-with-fork which are usage errors.
|
|
|
126
126
|
server scripts with no local file warn instead of writing.
|
|
127
127
|
- `diff [layer]`: same sources, secrets by name only; exit 1 on drift (`--dir`
|
|
128
128
|
for org and policy; no `-y` — it never writes).
|
|
129
|
-
- `settings
|
|
130
|
-
compare-and-swap edits
|
|
131
|
-
`show` prints JSON; `edit` uses
|
|
132
|
-
|
|
133
|
-
|
|
129
|
+
- `settings [user|org|policy|template [<name>]] [show|edit|set <key> <json-value>|unset <key>]`:
|
|
130
|
+
config-only compare-and-swap edits of the layers `push` replaces whole
|
|
131
|
+
(scripts/Pi files untouched — that is `push`). `show` prints JSON; `edit` uses
|
|
132
|
+
`$VISUAL`/`$EDITOR`; `set` takes a dotted key plus a JSON value. `template`
|
|
133
|
+
without a name is the project's pin. The policy is checked by the server only.
|
|
134
134
|
- `login`: Zitadel PKCE in the browser; where none can open (SSH, headless), the
|
|
135
135
|
device flow with a code finished on another device. `--server`, `--issuer`
|
|
136
136
|
(self-hosted), `--org` (domain pin), `--device` (force the code), `--token`
|
|
@@ -23,20 +23,23 @@ from a subdirectory seeds the whole repository and prints the subdirectory so it
|
|
|
23
23
|
|
|
24
24
|
## Clone or archive
|
|
25
25
|
|
|
26
|
-
A clone is
|
|
27
|
-
|
|
26
|
+
A clone is preferred when the pod can fetch the host's exact **committed HEAD**. Local
|
|
27
|
+
staged, unstaged, and untracked changes do not prevent cloning and are **not copied** by a
|
|
28
|
+
successful clone. The local checkout is left untouched. Every check below fails closed into
|
|
29
|
+
an archive with a human-readable reason (`pipod --dry-run` prints it):
|
|
28
30
|
|
|
29
31
|
1. inside a git work tree
|
|
30
32
|
2. `origin` exists and rewrites to an `https://` URL (`git@host:x/y.git` and `ssh://` are rewritten; local paths cannot be cloned by a pod)
|
|
31
33
|
3. HEAD is on a branch
|
|
32
|
-
4.
|
|
33
|
-
5.
|
|
34
|
-
6.
|
|
35
|
-
7.
|
|
36
|
-
8. a live `git ls-remote` shows the remote branch at exactly the local HEAD commit
|
|
34
|
+
4. the branch has an upstream with no unpushed commits
|
|
35
|
+
5. no initialized submodules, no Git LFS attributes
|
|
36
|
+
6. the pod's egress policy admits the remote host
|
|
37
|
+
7. a live `git ls-remote` shows the remote branch at exactly the local HEAD commit
|
|
37
38
|
|
|
38
39
|
The server clones that exact commit into the empty workdir. If the clone fails for any
|
|
39
|
-
reason, the launch automatically falls back to an archive of the local tree
|
|
40
|
+
reason, the launch automatically falls back to an archive of the local working tree,
|
|
41
|
+
**including uncommitted changes**. The committed-only behavior applies to successful clones,
|
|
42
|
+
not archive or configured-project copy transports.
|
|
40
43
|
|
|
41
44
|
An **archive** is a gzip-compressed POSIX tar stream written to a temporary file and streamed
|
|
42
45
|
to `PUT /v1/pods/:id/workspace/archive`. It contains tracked and untracked non-ignored files,
|
|
@@ -91,10 +94,12 @@ on the sandbox backend:
|
|
|
91
94
|
the forwarding prompt; approve; `!git remote -v` inside the pod shows the https URL with no
|
|
92
95
|
token, and `!cat .git/config` holds no token.
|
|
93
96
|
3. **Declined forwarding** — answer `n`; expect an archive, and the pod still holds the tree.
|
|
94
|
-
4. **Dirty repository
|
|
95
|
-
|
|
97
|
+
4. **Dirty repository clone** — in a pushed, cloneable repository, stage a change, edit it
|
|
98
|
+
again, and add an untracked file. Launch; expect `will clone … (local uncommitted changes
|
|
99
|
+
are not copied)`. Inside the pod, `!git status` is clean, tracked content matches HEAD,
|
|
100
|
+
and the untracked file is absent. The host's staged, unstaged and untracked changes remain.
|
|
96
101
|
5. **Non-git archive** — a plain directory of files; expect the files without a `.git`.
|
|
97
|
-
6. **100+ MiB streaming archive** — a repository with a large untracked binary; watch the
|
|
102
|
+
6. **100+ MiB streaming archive** — a repository without `origin`, with a large untracked binary; watch the
|
|
98
103
|
`upload 25% …` lines; verify the file's checksum in the pod.
|
|
99
104
|
7. **Interrupted upload** — Ctrl-C during upload; expect the pod deleted and no
|
|
100
105
|
`pi-pod-seed-*.tar.gz` left in the temp directory.
|
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.13"
|
|
2
2
|
.SH "NAME"
|
|
3
3
|
\fBpipod-config\fR \- pi pod configuration files
|
|
4
4
|
.SH SYNOPSIS
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
\|\.pi\-pod/config\.json a project: the source of its template
|
|
8
8
|
~/\.pi\-pod/config\.json this machine's preferences, and your user layer
|
|
9
9
|
~/\.pi\-pod/org/config\.json the organization layer
|
|
10
|
+
~/\.pi\-pod/org/policy\.json the organization policy (POLICY KEYS)
|
|
10
11
|
.fi
|
|
11
12
|
.RE
|
|
12
13
|
.SH DESCRIPTION
|
|
@@ -14,8 +15,8 @@
|
|
|
14
15
|
Each file is one settings layer's config, written as JSON with comments allowed\. The server
|
|
15
16
|
merges the layers for each launch (\fBpipod help layers\fP), so a file names only what its layer
|
|
16
17
|
must decide; anything left out comes from the layers below it\. The keys are the same in every
|
|
17
|
-
file
|
|
18
|
-
one key on the server\.
|
|
18
|
+
file but policy\.json, which holds limits on the merged result instead\. \fBpipod push\fP uploads a
|
|
19
|
+
file and \fBpipod settings <layer> set <key> <value>\fP changes one key on the server\.
|
|
19
20
|
.P
|
|
20
21
|
A key of the wrong type fails the command that reads it, naming the key\. An unknown key is
|
|
21
22
|
ignored with a warning\.
|
|
@@ -101,6 +102,36 @@ pi\.podExtensions a pod's Pi extensions run on this machine, as you, to
|
|
|
101
102
|
$schema ignored
|
|
102
103
|
.fi
|
|
103
104
|
.RE
|
|
105
|
+
.SH POLICY KEYS
|
|
106
|
+
.P
|
|
107
|
+
policy\.json holds the organization's policy: limits the server applies after every other
|
|
108
|
+
layer, whatever a person's settings, template, or launch ask for\. Every key is optional, and
|
|
109
|
+
one left out sets no limit\. The server checks every change to it and names any key or value it
|
|
110
|
+
refuses\.
|
|
111
|
+
.RS 2
|
|
112
|
+
.nf
|
|
113
|
+
maxIdleTimeoutMinutes the longest idleTimeoutMinutes a pod gets; a longer one,
|
|
114
|
+
or 0, becomes this
|
|
115
|
+
maxArchiveAfterMinutes the same for archiveAfterMinutes
|
|
116
|
+
maxConcurrentPods pods the whole organization may have awake at once; the
|
|
117
|
+
server's own limit per person still applies
|
|
118
|
+
allowedProviders the providers a launch may use; others are refused
|
|
119
|
+
requireTemplate true: every launch must use a template
|
|
120
|
+
requireEgressMode "allowlist": a pod set to "open" gets "allowlist" instead
|
|
121
|
+
forbiddenEgressHosts hosts removed from every egress\.allow
|
|
122
|
+
nestedPods\.enabled false: pods may not launch pods or schedule jobs
|
|
123
|
+
(default true)
|
|
124
|
+
nestedPods\.maxDepth how deep pods may launch pods, 0 to 8 (default 2)
|
|
125
|
+
nestedPods\.maxChildrenPerPod awake child pods per pod, 0 to 100 (default 5)
|
|
126
|
+
nestedPods\.maxPodsPerLineage awake pods in one family of pods, 1 to 500 (default 10)
|
|
127
|
+
nestedPods\.allowFileSend false: pods may not send files to other pods (default true)
|
|
128
|
+
nestedPods\.allowFileReceive false: pods may not copy files out of other pods
|
|
129
|
+
(default true)
|
|
130
|
+
notifications\.redacted true: push notifications leave out pod names and summaries
|
|
131
|
+
.fi
|
|
132
|
+
.RE
|
|
133
|
+
.P
|
|
134
|
+
Each clamp a launch gets is reported by \fBpipod doctor\fP and \fBpipod \-\-dry\-run\fP\|\.
|
|
104
135
|
.SH SCRIPTS
|
|
105
136
|
.P
|
|
106
137
|
A layer's two scripts sit beside its config: \.pi\-pod/init\.sh and \.pi\-pod/bake\.sh in a
|
|
@@ -143,6 +174,14 @@ pipod settings org set resources\.memoryGB 8
|
|
|
143
174
|
pipod settings org set idleTimeoutMinutes 30
|
|
144
175
|
.fi
|
|
145
176
|
.RE
|
|
177
|
+
.P
|
|
178
|
+
An organization policy that caps idle time and keeps pods from launching pods:
|
|
179
|
+
.RS 2
|
|
180
|
+
.nf
|
|
181
|
+
pipod settings policy set maxIdleTimeoutMinutes 60
|
|
182
|
+
pipod settings policy set nestedPods\.enabled false
|
|
183
|
+
.fi
|
|
184
|
+
.RE
|
|
146
185
|
.SH RETIRED KEYS
|
|
147
186
|
.P
|
|
148
187
|
\fBenvFile\fP, \fBinitScript\fP, \fBbakeScript\fP, and \fBreuse\fP fail with a message saying what replaced
|
package/man/pipod-config.5.md
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
.pi-pod/config.json a project: the source of its template
|
|
7
7
|
~/.pi-pod/config.json this machine's preferences, and your user layer
|
|
8
8
|
~/.pi-pod/org/config.json the organization layer
|
|
9
|
+
~/.pi-pod/org/policy.json the organization policy (POLICY KEYS)
|
|
9
10
|
```
|
|
10
11
|
|
|
11
12
|
## DESCRIPTION
|
|
@@ -13,8 +14,8 @@
|
|
|
13
14
|
Each file is one settings layer's config, written as JSON with comments allowed. The server
|
|
14
15
|
merges the layers for each launch (`pipod help layers`), so a file names only what its layer
|
|
15
16
|
must decide; anything left out comes from the layers below it. The keys are the same in every
|
|
16
|
-
file.
|
|
17
|
-
one key on the server.
|
|
17
|
+
file but policy.json, which holds limits on the merged result instead. `pipod push` uploads a
|
|
18
|
+
file and `pipod settings <layer> set <key> <value>` changes one key on the server.
|
|
18
19
|
|
|
19
20
|
A key of the wrong type fails the command that reads it, naming the key. An unknown key is
|
|
20
21
|
ignored with a warning.
|
|
@@ -98,6 +99,36 @@ pi.podExtensions a pod's Pi extensions run on this machine, as you, to r
|
|
|
98
99
|
$schema ignored
|
|
99
100
|
```
|
|
100
101
|
|
|
102
|
+
## POLICY KEYS
|
|
103
|
+
|
|
104
|
+
policy.json holds the organization's policy: limits the server applies after every other
|
|
105
|
+
layer, whatever a person's settings, template, or launch ask for. Every key is optional, and
|
|
106
|
+
one left out sets no limit. The server checks every change to it and names any key or value it
|
|
107
|
+
refuses.
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
maxIdleTimeoutMinutes the longest idleTimeoutMinutes a pod gets; a longer one,
|
|
111
|
+
or 0, becomes this
|
|
112
|
+
maxArchiveAfterMinutes the same for archiveAfterMinutes
|
|
113
|
+
maxConcurrentPods pods the whole organization may have awake at once; the
|
|
114
|
+
server's own limit per person still applies
|
|
115
|
+
allowedProviders the providers a launch may use; others are refused
|
|
116
|
+
requireTemplate true: every launch must use a template
|
|
117
|
+
requireEgressMode "allowlist": a pod set to "open" gets "allowlist" instead
|
|
118
|
+
forbiddenEgressHosts hosts removed from every egress.allow
|
|
119
|
+
nestedPods.enabled false: pods may not launch pods or schedule jobs
|
|
120
|
+
(default true)
|
|
121
|
+
nestedPods.maxDepth how deep pods may launch pods, 0 to 8 (default 2)
|
|
122
|
+
nestedPods.maxChildrenPerPod awake child pods per pod, 0 to 100 (default 5)
|
|
123
|
+
nestedPods.maxPodsPerLineage awake pods in one family of pods, 1 to 500 (default 10)
|
|
124
|
+
nestedPods.allowFileSend false: pods may not send files to other pods (default true)
|
|
125
|
+
nestedPods.allowFileReceive false: pods may not copy files out of other pods
|
|
126
|
+
(default true)
|
|
127
|
+
notifications.redacted true: push notifications leave out pod names and summaries
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Each clamp a launch gets is reported by `pipod doctor` and `pipod --dry-run`.
|
|
131
|
+
|
|
101
132
|
## SCRIPTS
|
|
102
133
|
|
|
103
134
|
A layer's two scripts sit beside its config: .pi-pod/init.sh and .pi-pod/bake.sh in a
|
|
@@ -140,6 +171,13 @@ pipod settings org set resources.memoryGB 8
|
|
|
140
171
|
pipod settings org set idleTimeoutMinutes 30
|
|
141
172
|
```
|
|
142
173
|
|
|
174
|
+
An organization policy that caps idle time and keeps pods from launching pods:
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
pipod settings policy set maxIdleTimeoutMinutes 60
|
|
178
|
+
pipod settings policy set nestedPods.enabled false
|
|
179
|
+
```
|
|
180
|
+
|
|
143
181
|
## RETIRED KEYS
|
|
144
182
|
|
|
145
183
|
`envFile`, `initScript`, `bakeScript`, and `reuse` fail with a message saying what replaced
|
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.13"
|
|
2
2
|
.SH "NAME"
|
|
3
3
|
\fBpipod\fR \- run pi coding\-agent sessions in server\-managed pods
|
|
4
4
|
.SH SYNOPSIS
|
|
@@ -138,8 +138,9 @@ pipod push org
|
|
|
138
138
|
.P
|
|
139
139
|
Values for secrets the whole organization shares: \fBpipod secrets set org <NAME>\fP (person)\.
|
|
140
140
|
.P
|
|
141
|
-
Organization policy (limits rather than defaults) needs the policy:write permission\.
|
|
142
|
-
|
|
141
|
+
Organization policy (limits rather than defaults) needs the policy:write permission\. Change
|
|
142
|
+
one limit with \fBpipod settings policy set <key> <value>\fP (its keys are in pipod\-config(5)), or
|
|
143
|
+
the whole policy from its source, policy\.json beside the organization layer's files:
|
|
143
144
|
.RS 2
|
|
144
145
|
.nf
|
|
145
146
|
pipod pull policy # writes ~/\.pi\-pod/org/policy\.json
|
|
@@ -240,9 +241,10 @@ org ~/\.pi\-pod/org/: config\.json, init\.sh, bake\.sh, pi/, env
|
|
|
240
241
|
user ~/\.pi\-pod/config\.json and ~/\.pi/agent/
|
|
241
242
|
pipod pull|diff|push user; pipod settings user set
|
|
242
243
|
template a project: \.pi\-pod/config\.json, init\.sh, bake\.sh, env, and \.pi/
|
|
243
|
-
pipod pull|diff|push [template [<name>]]; pipod
|
|
244
|
+
pipod pull|diff|push [template [<name>]]; pipod settings template set;
|
|
245
|
+
pipod templates
|
|
244
246
|
policy ~/\.pi\-pod/org/policy\.json
|
|
245
|
-
pipod pull|diff|push policy
|
|
247
|
+
pipod pull|diff|push policy; pipod settings policy set (policy:write)
|
|
246
248
|
.fi
|
|
247
249
|
.RE
|
|
248
250
|
.P
|
|
@@ -265,10 +267,13 @@ The launch uses the template named by \fB\-\-template\fP, or else the one pinned
|
|
|
265
267
|
first launch offers to create a template from the project and pin it\.
|
|
266
268
|
.P
|
|
267
269
|
Workspace seeding: launching from a directory with no \.pi\-pod/config\.json seeds the new pod
|
|
268
|
-
from that directory (its git repository root when inside one)\. A
|
|
269
|
-
remote tip matches HEAD is cloned at that exact
|
|
270
|
-
|
|
271
|
-
|
|
270
|
+
from that directory (its git repository root when inside one)\. A pushed checkout whose
|
|
271
|
+
remote tip matches HEAD is cloned at that exact committed HEAD, even with local uncommitted
|
|
272
|
+
changes\. A successful clone does not copy staged, unstaged, or untracked changes and leaves
|
|
273
|
+
the local checkout untouched\. When cloning is unavailable or fails (unpushed commits, private
|
|
274
|
+
remotes without usable credentials, plain directories), the local working tree, including
|
|
275
|
+
uncommitted changes, is streamed in as a tar archive, without git\-ignored paths, node_modules,
|
|
276
|
+
or \.pi\-pod/env\. Private\-remote
|
|
272
277
|
credentials are forwarded only after a prompt (\fB\-\-yes\fP approves it) and are never stored\.
|
|
273
278
|
\fB\-\-dry\-run\fP prints the decision without prompting or creating a pod\. Forks, reused pods,
|
|
274
279
|
\fB\-\-on\fP co\-location, and \fB\-\-no\-seed\fP never seed\. A project with a \.pi\-pod/config\.json gets its
|
|
@@ -586,17 +591,23 @@ or \fBsync\fP reads a dotenv file kept at mode 600\. op:// references resolve th
|
|
|
586
591
|
.SS pipod settings
|
|
587
592
|
.RS 2
|
|
588
593
|
.nf
|
|
589
|
-
Usage: pipod settings
|
|
594
|
+
Usage: pipod settings [user | org | policy | template [<name>]]
|
|
595
|
+
[show | edit | set <key> <value> | unset <key>]
|
|
590
596
|
|
|
591
|
-
Show or edit
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
+
Show or edit one server layer's config directly, the same layers `pipod push`
|
|
598
|
+
replaces whole:
|
|
599
|
+
user Your own settings (the default)
|
|
600
|
+
org The organization's defaults (needs org:manage)
|
|
601
|
+
policy The organization's policy (needs policy:write)
|
|
602
|
+
template [<name>] A template; without <name>, the one this project pins
|
|
603
|
+
|
|
604
|
+
Edits change only the config; scripts and Pi files stay as they are — replace
|
|
605
|
+
a whole layer from local files with `pipod push`\. Edits use compare\-and\-swap
|
|
606
|
+
on the layer's version, so concurrent changes fail cleanly instead of
|
|
607
|
+
overwriting each other\.
|
|
597
608
|
|
|
598
609
|
Actions:
|
|
599
|
-
show Print the
|
|
610
|
+
show Print the layer as JSON (default)
|
|
600
611
|
edit Edit the config in $VISUAL/$EDITOR, then save
|
|
601
612
|
set <key> <value> Set one dotted key to a JSON value, or to the text as
|
|
602
613
|
a string: pipod settings user set pi\.model provider/model
|
|
@@ -604,9 +615,11 @@ Actions:
|
|
|
604
615
|
.fi
|
|
605
616
|
.RE
|
|
606
617
|
.P
|
|
607
|
-
Keys are those of pipod\-config(5)
|
|
608
|
-
|
|
609
|
-
|
|
618
|
+
Keys are those of pipod\-config(5): its pod keys for user, org, and template, and its policy
|
|
619
|
+
keys for policy, which the server checks\. \fBset\fP changes the server only: a later \fBpipod push\fP
|
|
620
|
+
of the same layer replaces it with the local source, so after a \fBset\fP, run \fBpipod pull\fP before
|
|
621
|
+
editing that source\. A template named like an action (show, edit, set, unset) is named by its
|
|
622
|
+
id instead\.
|
|
610
623
|
.SS pipod jobs
|
|
611
624
|
.RS 2
|
|
612
625
|
.nf
|
package/man/pipod.1.md
CHANGED
|
@@ -140,8 +140,9 @@ pipod push org
|
|
|
140
140
|
|
|
141
141
|
Values for secrets the whole organization shares: `pipod secrets set org <NAME>` (person).
|
|
142
142
|
|
|
143
|
-
Organization policy (limits rather than defaults) needs the policy:write permission.
|
|
144
|
-
|
|
143
|
+
Organization policy (limits rather than defaults) needs the policy:write permission. Change
|
|
144
|
+
one limit with `pipod settings policy set <key> <value>` (its keys are in pipod-config(5)), or
|
|
145
|
+
the whole policy from its source, policy.json beside the organization layer's files:
|
|
145
146
|
|
|
146
147
|
```
|
|
147
148
|
pipod pull policy # writes ~/.pi-pod/org/policy.json
|
|
@@ -229,9 +230,10 @@ org ~/.pi-pod/org/: config.json, init.sh, bake.sh, pi/, env
|
|
|
229
230
|
user ~/.pi-pod/config.json and ~/.pi/agent/
|
|
230
231
|
pipod pull|diff|push user; pipod settings user set
|
|
231
232
|
template a project: .pi-pod/config.json, init.sh, bake.sh, env, and .pi/
|
|
232
|
-
pipod pull|diff|push [template [<name>]]; pipod
|
|
233
|
+
pipod pull|diff|push [template [<name>]]; pipod settings template set;
|
|
234
|
+
pipod templates
|
|
233
235
|
policy ~/.pi-pod/org/policy.json
|
|
234
|
-
pipod pull|diff|push policy
|
|
236
|
+
pipod pull|diff|push policy; pipod settings policy set (policy:write)
|
|
235
237
|
```
|
|
236
238
|
|
|
237
239
|
What belongs where: the organization layer holds what everyone needs (pod size, network
|
|
@@ -254,10 +256,13 @@ The launch uses the template named by `--template`, or else the one pinned in th
|
|
|
254
256
|
first launch offers to create a template from the project and pin it.
|
|
255
257
|
|
|
256
258
|
Workspace seeding: launching from a directory with no .pi-pod/config.json seeds the new pod
|
|
257
|
-
from that directory (its git repository root when inside one). A
|
|
258
|
-
remote tip matches HEAD is cloned at that exact
|
|
259
|
-
|
|
260
|
-
|
|
259
|
+
from that directory (its git repository root when inside one). A pushed checkout whose
|
|
260
|
+
remote tip matches HEAD is cloned at that exact committed HEAD, even with local uncommitted
|
|
261
|
+
changes. A successful clone does not copy staged, unstaged, or untracked changes and leaves
|
|
262
|
+
the local checkout untouched. When cloning is unavailable or fails (unpushed commits, private
|
|
263
|
+
remotes without usable credentials, plain directories), the local working tree, including
|
|
264
|
+
uncommitted changes, is streamed in as a tar archive, without git-ignored paths, node_modules,
|
|
265
|
+
or .pi-pod/env. Private-remote
|
|
261
266
|
credentials are forwarded only after a prompt (`--yes` approves it) and are never stored.
|
|
262
267
|
`--dry-run` prints the decision without prompting or creating a pod. Forks, reused pods,
|
|
263
268
|
`--on` co-location, and `--no-seed` never seed. A project with a .pi-pod/config.json gets its
|
|
@@ -577,26 +582,34 @@ or `sync` reads a dotenv file kept at mode 600. op:// references resolve through
|
|
|
577
582
|
### pipod settings
|
|
578
583
|
|
|
579
584
|
```
|
|
580
|
-
Usage: pipod settings
|
|
585
|
+
Usage: pipod settings [user | org | policy | template [<name>]]
|
|
586
|
+
[show | edit | set <key> <value> | unset <key>]
|
|
581
587
|
|
|
582
|
-
Show or edit
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
+
Show or edit one server layer's config directly, the same layers `pipod push`
|
|
589
|
+
replaces whole:
|
|
590
|
+
user Your own settings (the default)
|
|
591
|
+
org The organization's defaults (needs org:manage)
|
|
592
|
+
policy The organization's policy (needs policy:write)
|
|
593
|
+
template [<name>] A template; without <name>, the one this project pins
|
|
594
|
+
|
|
595
|
+
Edits change only the config; scripts and Pi files stay as they are — replace
|
|
596
|
+
a whole layer from local files with `pipod push`. Edits use compare-and-swap
|
|
597
|
+
on the layer's version, so concurrent changes fail cleanly instead of
|
|
598
|
+
overwriting each other.
|
|
588
599
|
|
|
589
600
|
Actions:
|
|
590
|
-
show Print the
|
|
601
|
+
show Print the layer as JSON (default)
|
|
591
602
|
edit Edit the config in $VISUAL/$EDITOR, then save
|
|
592
603
|
set <key> <value> Set one dotted key to a JSON value, or to the text as
|
|
593
604
|
a string: pipod settings user set pi.model provider/model
|
|
594
605
|
unset <key> Remove one dotted key, so the layers below decide it
|
|
595
606
|
```
|
|
596
607
|
|
|
597
|
-
Keys are those of pipod-config(5)
|
|
598
|
-
|
|
599
|
-
|
|
608
|
+
Keys are those of pipod-config(5): its pod keys for user, org, and template, and its policy
|
|
609
|
+
keys for policy, which the server checks. `set` changes the server only: a later `pipod push`
|
|
610
|
+
of the same layer replaces it with the local source, so after a `set`, run `pipod pull` before
|
|
611
|
+
editing that source. A template named like an action (show, edit, set, unset) is named by its
|
|
612
|
+
id instead.
|
|
600
613
|
|
|
601
614
|
### pipod jobs
|
|
602
615
|
|