@msdavid/pi-distro 0.2.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.
Files changed (35) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/LICENSE +21 -0
  3. package/README.md +394 -0
  4. package/docs/authoring.md +238 -0
  5. package/docs/preview.png +0 -0
  6. package/docs/preview.svg +58 -0
  7. package/extensions/catalogue.ts +221 -0
  8. package/extensions/deploy.ts +141 -0
  9. package/extensions/frontmatter.ts +158 -0
  10. package/extensions/github.ts +110 -0
  11. package/extensions/index.ts +86 -0
  12. package/extensions/info.ts +133 -0
  13. package/extensions/pick.ts +132 -0
  14. package/extensions/resolve.ts +70 -0
  15. package/extensions/save.ts +217 -0
  16. package/extensions/show.ts +96 -0
  17. package/extensions/undeploy.ts +124 -0
  18. package/extensions/update.ts +109 -0
  19. package/extensions/util.ts +44 -0
  20. package/harnesses/minimal/README.md +21 -0
  21. package/harnesses/minimal/files/AGENTS.md +20 -0
  22. package/harnesses/minimal/files/settings.json +4 -0
  23. package/harnesses/minimal/harness.md +24 -0
  24. package/harnesses/pi-distro-one/README.md +50 -0
  25. package/harnesses/pi-distro-one/files/.pi/extensions/claude-statusline.ts +220 -0
  26. package/harnesses/pi-distro-one/files/AGENTS.md +166 -0
  27. package/harnesses/pi-distro-one/files/settings.json +9 -0
  28. package/harnesses/pi-distro-one/harness.md +79 -0
  29. package/harnesses/web-fullstack/README.md +25 -0
  30. package/harnesses/web-fullstack/files/.pi/prompts/review.md +12 -0
  31. package/harnesses/web-fullstack/files/AGENTS.md +37 -0
  32. package/harnesses/web-fullstack/files/settings.json +11 -0
  33. package/harnesses/web-fullstack/harness.md +40 -0
  34. package/package.json +65 -0
  35. package/skills/pi-distro/SKILL.md +359 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,54 @@
1
+ # Changelog
2
+
3
+ ## 0.2.0 - 2026-07-08
4
+
5
+ - **`/pi-distro undeploy`**: the reverse of `deploy` — removes an applied distro from the
6
+ current project. Agent-driven: reads the distro's directives from provenance, compares
7
+ against the current project state (since the user may have customized things after
8
+ deploy), and walks the user through removal category by category (packages, files,
9
+ AGENTS.md section, extensions) — asking per component, showing files before deleting,
10
+ never silently removing anything. Provenance removed last. Only works for full deploys.
11
+ - **`/pi-distro pick` (partial deploy)**: select which components to apply from a distro —
12
+ packages, bundled files, settings, context — so users can combine pieces from different
13
+ distros to build their own. Agent-driven: walks the user through each category, surfaces
14
+ cross-component dependencies, applies only the selected components. No provenance written
15
+ (it's a custom config) — suggests `/pi-distro save` to capture the result.
16
+ - **User-in-the-loop principle** (governing rule): the agent now has an explicit, top-level
17
+ rule — never make a state-changing decision for the user. Before overwriting, installing,
18
+ skipping, substituting, or resolving any conflict, the agent must surface the decision,
19
+ present options, and wait for explicit confirmation. Stated once in the deploy kickoff, at
20
+ the top of SKILL.md, and as a feature promise in the README.
21
+ - **`/pi-distro update` command**: reads the applied distro from provenance, fetches the
22
+ current version (re-clones for GitHub sources), compares versions, and if a newer version
23
+ exists — shows a preview and asks the user to confirm before re-deploying. Never silently
24
+ applies. `/pi-distro status` now shows whether an update is available (applied vs. latest
25
+ version comparison).
26
+ - **GitHub distro pull**: `/pi-distro show owner/repo` and `/pi-distro deploy owner/repo`
27
+ fetch distros from any GitHub repo via shallow clone. Deploy requires explicit
28
+ confirmation (trust gate) with a security warning.
29
+ - **Version-aware deploy**: deploy now compares the incoming distro version against the
30
+ project's existing provenance and reports upgrade / downgrade / same-version / distro-switch
31
+ / first-deploy, with appropriate agent guidance (downgrade and same-version require user
32
+ confirmation).
33
+ - **Version bumping on save-update**: updating an existing distro now requires bumping the
34
+ `version` field (patch / minor / major) — never left unchanged.
35
+ - **Semantic redundancy check**: the package-conflict check now evaluates semantic overlap
36
+ (different tool names, similar function), not just exact name collisions. Offers
37
+ skip / replace / keep both / cancel.
38
+ - **Auto-expand tool outputs**: pi-distro-one's status-line extension now auto-expands
39
+ tool output on session start (the Ctrl+O effect), while keeping thinking blocks hidden.
40
+ - **Per-distro README.md**: saved distros now include a `README.md` with an extended
41
+ human-readable description. All seed distros ship one too.
42
+ - **Deploy selector polish**: distro names are now bold in the interactive selector,
43
+ and the redundant title field is dropped for clarity.
44
+ - **Post-deploy restart hint**: the deploy kickoff now instructs the agent to tell the
45
+ user to restart pi after deploying (packages/extensions load at startup).
46
+ - **Documentation overhaul**: README rewritten in neovim-distro style (LazyVim/AstroNvim/
47
+ NvChad tone), with project-level philosophy, workflows, non-coding use cases, and a
48
+ clear experimental/security disclaimer.
49
+ - Snapshot enumerator now captures `.crew/{agents,teams,workflows}/` (pi-crew config)
50
+ while skipping runtime state subdirs.
51
+
52
+ ## 0.1.0 - 2026-07-07
53
+
54
+ - Initial release.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 msdavid
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,394 @@
1
+ # pi-distro
2
+
3
+ [![version](https://img.shields.io/github/package-json/v/msdavid/pi-distro.svg)](https://github.com/msdavid/pi-distro/blob/main/package.json)
4
+ [![License: MIT](https://img.shields.io/github/license/msdavid/pi-distro.svg)](https://github.com/msdavid/pi-distro/blob/main/LICENSE)
5
+ [![pi-package](https://img.shields.io/badge/pi--package-%E2%9C%93-7c9eff.svg)](https://pi.dev/packages)
6
+
7
+ Distributions for [pi](https://github.com/earendil-works/pi-coding-agent) — the coding
8
+ agent. Inspired by Neovim distributions like [LazyVim](https://lazyvim.org),
9
+ [AstroNvim](https://astronvim.com), and [NvChad](https://nvchad.com), but for your AI
10
+ coding agent instead of your editor.
11
+
12
+ A **distro** is a named, reusable, composable configuration: skills, extensions, context,
13
+ settings, themes, and package install directives bundled together. Deploy one into any
14
+ project with a single command, and the agent collaborates with you to merge it into your
15
+ existing setup — nothing is silently overwritten.
16
+
17
+ ## Prerequisites
18
+
19
+ - [pi](https://pi.dev/) installed (the coding agent this package extends).
20
+ - Node.js **>= 22.19.0** (pi's own requirement).
21
+ - An npm-scoped install of this package (see below).
22
+
23
+ ## Get a fully-configured coder in 60 seconds
24
+
25
+ ```bash
26
+ # 1. Install the package
27
+ pi install npm:@msdavid/pi-distro
28
+
29
+ # 2. Deploy a distro (pi-distro-one = a Claude Code-style multi-agent coder)
30
+ /pi-distro deploy pi-distro-one
31
+
32
+ # 3. Restart pi — done.
33
+ ```
34
+
35
+ That's it. You now have a multi-agent coding setup with web research, browser automation,
36
+ live shell, model routing, task management, a Claude-style status line, and an
37
+ explore-before-acting methodology — all configured and ready to go.
38
+
39
+ ## ✨ Features
40
+
41
+ - 🚀 **One command to a full setup** — deploy a distro, restart, and you're coding
42
+ - 🧩 **Composable** — distros merge into your existing config, they don't clobber it. Use
43
+ `/pi-distro pick` to select individual packages/configs from a distro and combine pieces
44
+ from different distros into your own
45
+ - 👤 **You're in the loop for every decision** — the agent never silently overwrites, skips,
46
+ substitutes, or chooses. Every state-changing decision (file merge, package install, tool
47
+ conflict, upgrade) is surfaced with options, and the agent waits for your explicit choice
48
+ - 📦 **Project-local by default** — each project gets its own isolated configuration, so
49
+ different projects can use different harnesses (coding, research, automation, trading…)
50
+ - 🔄 **Round-trip** — snapshot your live config back into a reusable distro with `/pi-distro save`
51
+ - 🐙 **GitHub distros** — deploy distros straight from any GitHub repo, so your personal
52
+ config follows you to any machine (`/pi-distro deploy owner/repo`)
53
+ - 🎨 **System prompt overrides & overlays** — distros can ship `SYSTEM.md`, `APPEND_SYSTEM.md`,
54
+ custom skills, prompts, and extensions — making them great for non-coding agent projects too
55
+
56
+ ## What is a distro?
57
+
58
+ A distro is a directory with a `harness.md` file (frontmatter + agent directives) and an
59
+ optional `files/` directory (bundled config files). Think of it as a "starter template" for
60
+ your pi agent — but instead of a static config, it's a set of instructions that the agent
61
+ collaborates with you to apply.
62
+
63
+ ```
64
+ my-distro/
65
+ ├── harness.md # frontmatter (name, description, version) + directives
66
+ ├── README.md # extended human-readable description
67
+ └── files/ # bundled files deployed into the target project
68
+ ├── AGENTS.md
69
+ ├── settings.json # → .pi/settings.json (merged, not overwritten)
70
+ └── .pi/
71
+ ├── extensions/
72
+ ├── skills/
73
+ └── prompts/
74
+ ```
75
+
76
+ When you deploy a distro, the agent reads the directives, places the bundled files
77
+ (asking before overwriting anything), installs the listed packages (with conflict
78
+ detection), and writes a provenance file. You stay in control the entire time.
79
+
80
+ ## Why project-level, not global?
81
+
82
+ Most agent tools configure themselves globally — one config for all projects. pi-distro
83
+ takes a different approach: **each project gets its own configuration, scoped to that
84
+ project's `.pi/` directory.**
85
+
86
+ The biggest reason is this: **not every project needs the same harness.** A coding
87
+ project, a research project, an automation project, and a trading project each want a
88
+ fundamentally different agent — different tools, different skills, different system
89
+ prompt, different workflow. One global config trying to be everything ends up being
90
+ nothing well. Project-level distros let each project get exactly the harness it needs.
91
+
92
+ This matters beyond coding, too. Pi's flexibility — system prompt overrides (`SYSTEM.md`,
93
+ `APPEND_SYSTEM.md`), custom skills, prompts, and extensions — means the same agent
94
+ framework serves a huge range of use cases, and project-level distros are what make that
95
+ practical: the coding agent in one repo, the information-gathering agent in another, the
96
+ implementation/automation agent in a third — each isolated, each reproducible.
97
+
98
+ Other advantages:
99
+
100
+ - **Reproducibility** — anyone who deploys the same distro gets the same setup. No
101
+ "it works on my machine" because of a global config difference.
102
+ - **Isolation** — your React project doesn't need the same tools as your Python API, and
103
+ neither needs the tools your trading bot uses. Project-level configs keep them separate.
104
+ - **Portability** — the config travels with the project (`.pi/` is part of the repo).
105
+ Clone the repo, deploy the distro, and you're set up.
106
+ - **Experimentation** — try a distro in a throwaway project without touching your
107
+ global setup. Don't like it? Just delete the `.pi/` directory.
108
+ - **Composability** — different distros for different projects, without conflicts.
109
+
110
+ You can still use global packages and settings alongside project-level ones — pi merges
111
+ them. But the distro itself lives at the project level.
112
+
113
+ ## Workflows
114
+
115
+ ### Global setup (install once, use everywhere)
116
+
117
+ ```bash
118
+ # Install pi-distro globally — makes /pi-distro available in every session
119
+ pi install npm:@msdavid/pi-distro
120
+ ```
121
+
122
+ ### Per-project setup (deploy a distro into a project)
123
+
124
+ ```bash
125
+ # In your project directory:
126
+ /pi-distro deploy # interactive selector
127
+ /pi-distro deploy minimal # deploy by name
128
+ /pi-distro deploy owner/repo # deploy from GitHub
129
+ ```
130
+
131
+ ### Make it yours, then save it
132
+
133
+ ```bash
134
+ # After customizing your project's config:
135
+ /pi-distro save # snapshots your live config as a reusable distro
136
+
137
+ # Now deploy it into other projects:
138
+ /pi-distro deploy my-distro
139
+ ```
140
+
141
+ ### Pick pieces from a distro (partial deploy)
142
+
143
+ You don't have to take a whole distro. `/pi-distro pick` lets you select which components
144
+ to apply — just the packages you want, or a single extension, or a subset of the settings.
145
+ This is how you combine pieces from different distros to build your own:
146
+
147
+ ```bash
148
+ /pi-distro pick pi-distro-one # pick, say, just pi-subagents + the statusline
149
+ /pi-distro pick web-fullstack # then add web research from another distro
150
+ /pi-distro save # snapshot the combination as your own distro
151
+ ```
152
+
153
+ Run `/pi-distro pick` with no argument to choose from the interactive selector (same as
154
+ `/pi-distro deploy`). You can also pick from a GitHub distro:
155
+ `/pi-distro pick owner/repo`.
156
+
157
+ The agent walks you through each category (packages, bundled files, settings, context) one
158
+ at a time, lets you pick any subset, and **surfaces dependencies** — e.g. if you pick the
159
+ statusline extension but skip the package that provides its theme, the agent warns you and
160
+ asks how to proceed. Nothing is applied without your explicit choice. A partial deploy
161
+ doesn't write provenance (it's a custom config, not an applied distro) — run
162
+ `/pi-distro save` to capture the result as a clean, reusable distro.
163
+
164
+ ### Check what's applied
165
+
166
+ ```bash
167
+ /pi-distro status # shows the applied distro + live config
168
+ /pi-distro list # lists all available distros
169
+ /pi-distro show pi-distro-one # dry-run preview of what a distro would do
170
+ ```
171
+
172
+ ### Bring your config to any machine
173
+
174
+ A common pattern when you work across multiple machines (laptop, desktop, server, a
175
+ fresh box) is to **maintain your personal distro in a GitHub repo** and deploy it to any
176
+ new machine in seconds. Your configuration follows you everywhere, identical on each
177
+ machine.
178
+
179
+ ```bash
180
+ # One-time setup, on any machine:
181
+ pi install npm:@msdavid/pi-distro
182
+
183
+ # Then, on any new machine:
184
+ pi install npm:@msdavid/pi-distro # install pi-distro
185
+ cd your-project
186
+ /pi-distro deploy owner/your-distro-repo # your full config, applied
187
+ # restart pi — done.
188
+ ```
189
+
190
+ To create your own: build up a project config you like, run `/pi-distro save` to snapshot
191
+ it, then push the resulting `~/.pi/harnesses/<name>/` directory to a GitHub repo. Now that
192
+ repo *is* a distro — deployable from anywhere. Update the repo, and every machine can pull
193
+ the latest with `/pi-distro deploy owner/repo` again (it merges with whatever's already
194
+ there).
195
+
196
+ ### Community distros
197
+
198
+ GitHub distros also enable **community collaboration**. Anyone can publish a distro to a
199
+ GitHub repo and share it — a workflow setup, a specialized research agent, a team's
200
+ coding conventions, a niche toolchain — and anyone else can deploy it with a single
201
+ command:
202
+
203
+ ```bash
204
+ /pi-distro show someone/their-distro # preview before deploying
205
+ /pi-distro deploy someone/their-distro # apply it to your project
206
+ ```
207
+
208
+ Found a distro that fits your workflow? Deploy it. Tweaked it to better suit your needs?
209
+ Run `/pi-distro save` and publish your own. This is how a shared library of pi
210
+ configurations grows — each distro a reusable starting point that others can fork, adapt,
211
+ and re-share. (Always review a community distro before deploying it — see the
212
+ [security note](#-experimental--please-read) below.)
213
+
214
+ ## Command reference
215
+
216
+ All interaction happens through a single slash command — there is no standalone CLI.
217
+
218
+ | Command | Description |
219
+ |---------|-------------|
220
+ | `/pi-distro` | Print help |
221
+ | `/pi-distro deploy [name\|gh-repo]` | Deploy a distro (interactive selector if no arg) |
222
+ | `/pi-distro undeploy` | Remove an applied distro from the current project |
223
+ | `/pi-distro pick [name\|gh-repo]` | Partial deploy: pick which packages/configs to apply |
224
+ | `/pi-distro update` | Update the applied distro if a newer version exists |
225
+ | `/pi-distro save` | Snapshot your live config as a new distro |
226
+ | `/pi-distro list` | List all distros in the catalogue |
227
+ | `/pi-distro show <name\|gh-repo>` | Dry-run preview of a distro |
228
+ | `/pi-distro status` | Show the current project's distro status |
229
+ | `/pi-distro remove <name>` | Delete a user-saved distro |
230
+
231
+ **GitHub addresses** for `show` and `deploy` use the format `owner/repo[/subpath]`:
232
+ ```
233
+ /pi-distro show owner/repo
234
+ /pi-distro deploy owner/repo/my-distro
235
+ /pi-distro deploy https://github.com/owner/repo
236
+ ```
237
+
238
+ ## The catalogue
239
+
240
+ The effective catalogue is the union of:
241
+
242
+ - **Package seeds** — shipped with `@msdavid/pi-distro` under `harnesses/`. Read straight
243
+ from the installed package at runtime. Currently:
244
+ - **minimal** — clean starting point: basic `AGENTS.md` + `.pi/settings.json`.
245
+ - **web-fullstack** — React/Node project with web research, review skills, restricted tools.
246
+ - **pi-distro-one** — a Claude Code–style multi-agent coder (see below).
247
+ - **User distros** — saved by you to `~/.pi/harnesses/<name>/` via `/pi-distro save`.
248
+ - **GitHub distros** — fetched on-demand from any GitHub repo.
249
+ - **Partial/combined configs** — built from `/pi-distro pick` across multiple distros, then
250
+ saved as a user distro.
251
+
252
+ On a name collision, the **user distro takes precedence** — save a distro with the same
253
+ name as a seed to override it.
254
+
255
+ ### pi-distro-one
256
+
257
+ `pi-distro-one` is the author's draft shot at using the most popular pi coding packages to
258
+ closely resemble the capabilities of Claude Code. It's opinionated — spawning and
259
+ coordinating autonomous sub-agents is the primary capability, with web research, browser
260
+ automation, live shell, model routing, and task management integrated in support. It
261
+ includes a Claude-style status line and an explore-before-acting methodology.
262
+
263
+ It's a great starting point: deploy it, customize it, then `/pi-distro save` it as your own.
264
+
265
+ ## Beyond coding
266
+
267
+ Distros aren't just for coding. Not every project is a coding project — some are about
268
+ **information gathering**, some are about **implementation or automation**, some are
269
+ **research**, some are **analysis**. Because distros can ship `SYSTEM.md` (system prompt
270
+ overrides), `APPEND_SYSTEM.md`, custom skills, prompts, and extensions, they configure
271
+ the agent for *any* kind of agentic work, not just writing code:
272
+
273
+ - **Market research & trading** — the author's team uses a targeted distro for
274
+ market research and trading: an agent configured for market intelligence, data
275
+ analysis, and execution across research, analysis, and trading sub-agents.
276
+ - **Information gathering** — distros that configure web research + data extraction
277
+ workflows for market intelligence, competitor analysis, or due diligence.
278
+ - **Research pipelines** — distros that set up structured research + synthesis agents.
279
+ - **DevOps / automation** — distros that configure shell-heavy agents for
280
+ infrastructure tasks and implementation work.
281
+
282
+ This is where project-level configuration really shines: the coding distro in your app
283
+ repo, the research distro in your intelligence repo, the targeted trading distro your
284
+ team uses for market research — each project gets the right harness for its job. If your
285
+ agent project benefits from a reproducible, shareable configuration, a distro works for
286
+ it.
287
+
288
+ ## Creating & updating distros
289
+
290
+ ### Save your live config as a distro
291
+
292
+ ```bash
293
+ /pi-distro save
294
+ ```
295
+
296
+ The extension captures a full snapshot of your project's configuration — tools, skills,
297
+ context files, and every config file under `.pi/`, `.crew/{agents,teams,workflows}/`, and
298
+ `.agents/skills/`. The agent drafts a `harness.md` that reproduces it, you confirm, and
299
+ it's saved to `~/.pi/harnesses/<name>/` with a `README.md` describing the distro.
300
+
301
+ ### Author a distro by hand
302
+
303
+ Create a directory under `~/.pi/harnesses/<name>/` (or contribute a seed to the package)
304
+ with a `harness.md` and optional `files/`. See
305
+ [docs/authoring.md](docs/authoring.md) for the complete format reference — frontmatter
306
+ fields, bundled file conventions, directive sections, and merge-don't-clobber
307
+ expectations.
308
+
309
+ ### Update an existing distro
310
+
311
+ Run `/pi-distro save` again — it offers to update an existing distro (backing up the old
312
+ version to `~/.pi/harnesses/.trash/` before overwriting, and bumping the version — see
313
+ below).
314
+
315
+ ### Update an applied distro
316
+
317
+ When a distro you've applied to a project gets a new version (the author bumped it in the
318
+ catalogue or pushed a new commit to the GitHub repo), `/pi-distro update` brings your
319
+ project up to date:
320
+
321
+ ```bash
322
+ /pi-distro status # shows applied version + whether an update is available
323
+ /pi-distro update # fetches the latest, shows what changed, asks before applying
324
+ ```
325
+
326
+ The update command reads the applied distro from provenance, fetches the current version
327
+ from the catalogue (or re-clones the GitHub repo), compares versions, and — if a newer
328
+ version exists — shows you a preview and **asks you to confirm** before re-deploying. It
329
+ never silently applies anything. If you're already up to date, it says so and does
330
+ nothing. Downgrades are flagged as warnings (updates are for moving to a newer version).
331
+
332
+ ### Remove an applied distro
333
+
334
+ `/pi-distro undeploy` is the reverse of `deploy` — it removes a distro's components from
335
+ the current project:
336
+
337
+ ```bash
338
+ /pi-distro undeploy # walks you through removing the applied distro
339
+ ```
340
+
341
+ The agent reads the applied distro's directives from provenance, compares them against
342
+ your project's *current* state (since you may have customized things after deploy), and
343
+ walks you through removal category by category — packages, bundled files, the `AGENTS.md`
344
+ delimited section, extensions. **It asks before removing anything** — you may have
345
+ customized a file or decided to keep a package, so you choose what to remove and what to
346
+ keep per component. Provenance is removed last, after you confirm the rest. Restart pi
347
+ afterward so removed packages/extensions fully unload.
348
+
349
+ > **Note:** `/pi-distro undeploy` works for full deploys (which write provenance). A
350
+ > partial deploy via `/pi-distro pick` doesn't write provenance — there's nothing to
351
+ > undeploy as a unit; just remove the individual components you picked.
352
+
353
+ ### Versioning
354
+
355
+ Every distro has a `version` (semver). It's tracked in two places:
356
+
357
+ - **On deploy**, pi-distro compares the incoming version against the project's existing
358
+ provenance and tells the agent what kind of deploy it is: an **upgrade** (proceed
359
+ normally), a **downgrade** (asks you to confirm — may regress features), the **same
360
+ version** (asks whether to skip or force re-deploy), or a **different distro** (treated
361
+ as a distro switch). Run `/pi-distro status` to see which version is applied.
362
+ - **On save-update**, the agent bumps the version using semver: **patch** for small
363
+ tweaks, **minor** for new capabilities, **major** for breaking changes. The version
364
+ always reflects that something changed.
365
+
366
+ This means re-deploying a distro you've updated is safe and intentional — you'll always
367
+ know whether you're upgrading, downgrading, or re-applying the same version.
368
+
369
+ ## ⚠️ Experimental — please read
370
+
371
+ This project is **experimental** and was **fully coded with AI**. It has only been tested
372
+ by its author — there are no guarantees it will work for you. Things may break, and the
373
+ format may change between versions.
374
+
375
+ **Installing unknown distros is dangerous.** A distro can install arbitrary npm packages,
376
+ write extensions that execute code, inject agent instructions, and modify your project
377
+ configuration. Before deploying any distro — especially one fetched from GitHub — review
378
+ its `harness.md`, package list, and bundled files carefully. Use `/pi-distro show` to
379
+ preview what a distro would do before deploying it.
380
+
381
+ Everything is provided **as-is**, without warranty of any kind. Security is **your
382
+ responsibility** — review what you install, trust only sources you control, and deploy in
383
+ projects you can afford to break.
384
+
385
+ If you find bugs, have suggestions, or want to contribute fixes, please
386
+ [open an issue](https://github.com/msdavid/pi-distro/issues) or submit a pull request.
387
+ This is an open project and contributions are welcome.
388
+
389
+ ## License
390
+
391
+ MIT — see [LICENSE](./LICENSE). Copyright (c) 2026 [msdavid](https://github.com/msdavid).
392
+
393
+ This project is experimental and was fully written with AI assistance; it is provided
394
+ as-is without warranty. See the notice above before installing unknown distros.