From 2b2d04fa13117ed0cb1ce8aaa541ebffde277547 Mon Sep 17 00:00:00 2001 From: Ed Heltzel <402910+edheltzel@users.noreply.github.com> Date: Wed, 16 Sep 2026 14:55:14 -0400 Subject: [PATCH 1/4] docs: teach GitHub omp marketplace and Pi install Operators install from GitHub. plugin-link stays checkout and live RPC. --- AGENTS.md | 19 +++++++++++----- README.md | 32 +++++++++++++++++---------- docs/AGENTS.md | 8 +++---- docs/guide/01-setup.md | 21 ++++++++++++------ docs/guide/README.md | 2 +- e2e/AGENTS.md | 2 +- e2e/README.md | 2 +- e2e/run.py | 14 ++++++++---- e2e/unit/product-capabilities.test.ts | 8 ++++++- 9 files changed, 72 insertions(+), 36 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 435c682..189ec41 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -68,13 +68,22 @@ GitButler (`but`) is the VCS. The main checkout is the `gitbutler/workspace` bra ## Native omp -Tell operators plugin-link only: +Tell operators GitHub marketplace: - Install host via https://omp.sh/install if needed. -- From this package root: `omp plugin link ./` +- `omp plugin marketplace add edheltzel/pstack-for-omp` then `omp plugin install pstack@pstack` +- This checkout / live RPC: `omp plugin link ./` - Later sessions, any cwd: type `/` (`/skill:do-…`, sticky `/poteto-mode`) -- Do not marketplace. Do not copy `pstack.ts` into `~/.omp/agent/extensions/`. -- Do not keep a repo `.omp/skills` symlink. Sibling `skills/` is what plugin-link discovers. +- Do not copy `pstack.ts` into `~/.omp/agent/extensions/`. +- Do not keep a repo `.omp/skills` symlink. Sibling `skills/` is what the plugin discovers. + +## Native Pi + +Tell operators git install: + +- `pi install git:github.com/edheltzel/pstack-for-omp` +- This checkout: `pi install ./` +- Do not use `pi -e` as the install path. ## Native Claude Code @@ -101,7 +110,7 @@ npm test | [extensions/AGENTS.md](extensions/AGENTS.md) | Factory `pstack.ts`; per-session poteto-mode | | [e2e/AGENTS.md](e2e/AGENTS.md) | Static doctor/lint + Vitest; live RPC local-only via plugin-link | | [skills/AGENTS.md](skills/AGENTS.md) | Skill tree; SKILL.md frontmatter `name` + `description` | -| [docs/AGENTS.md](docs/AGENTS.md) | original numbered `guide/`; first-run lives on README (omp plugin link + Claude plugin install) | +| [docs/AGENTS.md](docs/AGENTS.md) | original numbered `guide/`; first-run lives on README (omp marketplace, pi git install, Claude plugin install) | | [automations/AGENTS.md](automations/AGENTS.md) | Dormant Benny pack; not slash skills | | [scripts/AGENTS.md](scripts/AGENTS.md) | `pstack sync`: vendor official skills from cursor/plugins into `skills/do-*` | diff --git a/README.md b/README.md index 90c5ae6..dd6f318 100644 --- a/README.md +++ b/README.md @@ -38,23 +38,30 @@ Setup starts at [`automations/benny/FOR_AGENTS.md`](./automations/benny/FOR_AGEN ## Load this plugin -Clone https://github.com/edheltzel/pstack-for-omp, then pick the host. +GitHub install. No clone required. -### omp / Pi - -Install omp from https://omp.sh if needed (`curl -fsSL https://omp.sh/install | sh`). From the package root, one-time: +### omp ``` -git clone https://github.com/edheltzel/pstack-for-omp.git -cd pstack-for-omp -omp plugin link ./ +omp plugin marketplace add edheltzel/pstack-for-omp +omp plugin install pstack@pstack ``` -Later sessions (any cwd): start `omp`, type `/` (`/skill:do-…`, sticky `/poteto-mode`). Sibling `skills/` at the package root is what omp auto-discovers after link. Confirm with `omp plugin list`. Prove the link with `omp plugin doctor`. Update official skills with `pstack sync` (below). +This checkout: `omp plugin link ./`. Confirm with `omp plugin list`. Prove with `omp plugin doctor`. + +Do not copy only `pstack.ts` into `~/.omp/agent/extensions/`. Catalog is `.claude-plugin/marketplace.json` (omp reads that fallback). Do not add `.omp-plugin/`. + +omp docs: https://omp.sh/docs/plugins + +### Pi + +``` +pi install git:github.com/edheltzel/pstack-for-omp +``` -Do not copy only `pstack.ts` into `~/.omp/agent/extensions/`. Do not marketplace-install this package on omp; local-link is the install path. +This checkout: `pi install ./`. List with `pi list`. Docs: https://pi.dev/docs/latest/packages#install-and-manage -omp docs: https://omp.sh/docs/plugins and https://omp.sh/docs/extension-authoring. +Do not use `pi -e` as the install path. ### Claude Code @@ -81,7 +88,7 @@ Claude plugin docs: https://code.claude.com/docs/en/plugins. ## First steps -1. Install the host (omp from https://omp.sh, or Claude Code). +1. Install the host (omp from https://omp.sh, Pi, or Claude Code). 2. Load this plugin (see Load this plugin). 3. On omp: `/poteto-mode` — enable sticky Poteto Mode for this conversation. Optional task arguments are passed through; this also sends `/skill:do-poteto-mode`. On Claude: `/pstack:do-poteto-mode`. 4. Work as usual. On omp, resume an on conversation and it stays on. `/new` starts off. @@ -126,7 +133,8 @@ That pulls `pstack/skills/` from `cursor/plugins` into the existing `skill Files under `skills/` are markdown prompts. They are not live omp functions or CLIs. -- omp, after `omp plugin link ./`: `/skill:do-` +- omp, after marketplace install or `omp plugin link ./`: `/skill:do-` +- Pi, after `pi install`: skills from `skills/` - Claude Code, after plugin install: `/pstack:do-` Examples: `/skill:do-create-verification-skill` (Claude: `/pstack:do-create-verification-skill`), `/skill:do-swarm`, `/skill:do-principle-build-the-lever`. Feature Map is a section in `do-create-verification-skill`, not a runner. Do not treat Feature Map, swarm, or Build the Lever as functions or CLIs. diff --git a/docs/AGENTS.md b/docs/AGENTS.md index 2153910..8956c0c 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -2,7 +2,7 @@ ## Purpose -Human docs for this plugin. First-run is the README (`omp plugin link ./` and Claude `claude plugin install pstack@pstack`). The numbered guide is the original pstack product tutorial. This file must not teach a second omp mount story (`omp -e`) or a fake installer. +Human docs for this plugin. First-run is the README (omp marketplace `pstack@pstack`, `pi install git:github.com/edheltzel/pstack-for-omp`, Claude `claude plugin install pstack@pstack`). The numbered guide is the original pstack product tutorial. This file must not teach a second omp mount story (`omp -e`) or a fake installer. ## Ownership @@ -10,15 +10,15 @@ Human docs for this plugin. First-run is the README (`omp plugin link ./` and Cl ## Local Contracts -- README owns first-run for both hosts: `omp plugin link ./` and Claude plugin install (`marketplace add` + `pstack@pstack`, or `claude --plugin-dir ./`). Do not add `docs/getting-started.md` or teach `omp -e` as an install path. +- README owns first-run: omp `marketplace add edheltzel/pstack-for-omp` + `install pstack@pstack`, Pi `pi install git:github.com/edheltzel/pstack-for-omp`, Claude plugin install (`marketplace add` + `pstack@pstack`, or `claude --plugin-dir ./`). Checkout path is `omp plugin link ./` / `pi install ./`. Do not add `docs/getting-started.md` or teach `omp -e` / `pi -e` as an install path. - README may link the numbered guide. - Guide on-disk skill links use `skills/do-*` so they resolve in this tree. Slash names in guide prose may still say `/how`; the live omp surface is `/skill:do-how`, Claude is `/pstack:do-how`. `/poteto-mode` stays unprefixed on omp. - Setup guide (`01-setup.md`) matches `do-setup-pstack`: `/model` Roles and `/agents` only. Do not teach `pstack-models.mdc`. -- Operator install matches the root rail Native omp and Native Claude Code contracts. +- Operator install matches the root rail Native omp, Native Pi, and Native Claude Code contracts. ## Work Guidance -Port guide pages and images from upstream. Remap `../../skills//` to `../../skills/do-/`. Agents tell operators plugin-link (omp) or plugin install (Claude). +Port guide pages and images from upstream. Remap `../../skills//` to `../../skills/do-/`. Agents tell operators GitHub install (omp marketplace, `pi install git:…`, Claude plugin install). ## Verification diff --git a/docs/guide/01-setup.md b/docs/guide/01-setup.md index 7f4094f..57f34e6 100644 --- a/docs/guide/01-setup.md +++ b/docs/guide/01-setup.md @@ -4,19 +4,26 @@ In this page you install the plugin, pick which models pstack uses, and run your ## Install the plugin -This package is the plugin root for both hosts. Pick one. +This package is the plugin root for both hosts. Pick one. GitHub install; no clone required. -### omp / Pi - -From the package root: +### omp ```text -omp plugin link ./ +omp plugin marketplace add edheltzel/pstack-for-omp +omp plugin install pstack@pstack ``` -Confirm with `omp plugin list`. Prove with `omp plugin doctor`. +This checkout: `omp plugin link ./`. Confirm with `omp plugin list`. Prove with `omp plugin doctor`. + +The Cursor product used `/add-plugin pstack`. That is history. omp catalog is `.claude-plugin/marketplace.json`. + +### Pi + +```text +pi install git:github.com/edheltzel/pstack-for-omp +``` -The Cursor product used `/add-plugin pstack`. That is history, not how you install this package. omp marketplaces are catalogs you add (a git repo with `marketplace.json`); this package is local-link only on omp, not listed in an omp catalog. +This checkout: `pi install ./`. List with `pi list`. ### Claude Code diff --git a/docs/guide/README.md b/docs/guide/README.md index 0285a9a..97ad2b5 100644 --- a/docs/guide/README.md +++ b/docs/guide/README.md @@ -1,6 +1,6 @@ # The pstack guide -> This numbered guide is the original pstack product tutorial. On this fork, first-run is the [README](../../README.md) (`omp plugin link ./` or Claude `claude plugin install pstack@pstack`). Slash skills are `/skill:do-…` on omp and `/pstack:do-*` on Claude (on-disk `skills/do-*`). `/poteto-mode` stays unprefixed on omp. +> This numbered guide is the original pstack product tutorial. On this fork, first-run is the [README](../../README.md) (omp `pstack@pstack`, `pi install git:github.com/edheltzel/pstack-for-omp`, or Claude `claude plugin install pstack@pstack`). Slash skills are `/skill:do-…` on omp and `/pstack:do-*` on Claude (on-disk `skills/do-*`). `/poteto-mode` stays unprefixed on omp. pstack works best when you stop micromanaging the agent. You describe what you want and how you'll know it's done. `/poteto-mode` picks the playbook, runs the other skills as the steps need them, and shows you the evidence. This guide teaches that habit with realistic prompts. diff --git a/e2e/AGENTS.md b/e2e/AGENTS.md index 1745b31..5347bf4 100644 --- a/e2e/AGENTS.md +++ b/e2e/AGENTS.md @@ -16,7 +16,7 @@ Prove the plugin without chat-only guesses. Static doctor/lint + Vitest on every - CI and local static gate: `python3 e2e/run.py --skip-rpc` and `npm test`. - No `omp --mode rpc` on GitHub runners. No `claude` / `omp` install on CI. - Do not install or run live omp / the plugin extension as a test harness on CI. -- Live RPC, when omp is present, must `omp plugin link ./` before starting. Do not pass `-e`. +- Live RPC, when omp is present, must `omp plugin link ./` this checkout before starting. Do not pass `-e`. Operator first-run is GitHub marketplace, not clone-and-link. - Do not keep a TypeScript copy of `ci_static.py` (no `unit/static-checks.ts`, no homemade brace parser). - Do not keep a repo `.omp/skills` symlink. `static_install_docs` and `unit/product-capabilities.test.ts` assert filesystem absence, not only README text. - Claude components stay at plugin root. `.claude-plugin/` may hold `plugin.json` and `marketplace.json` only — not `skills/`. diff --git a/e2e/README.md b/e2e/README.md index f4fe9ff..da30caf 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -31,7 +31,7 @@ claude plugin validate . | Case | What it proves | | --- | --- | -| `install_plugin_link` | README/AGENTS teach `omp plugin link ./` and Claude plugin install; competing stories gone | +| `install_plugin_link` | README/AGENTS teach omp marketplace, pi git install, Claude plugin install; competing stories gone | | `pstack sync` | `e2e/unit/sync-skills.test.ts` — official skills SoT is `cursor/plugins`; writes into `skills/do-*` only | | `poteto_on` | `/poteto-mode` injects the needle and writes `pstack-mode` on this session | | `second_turn_sticky` | Next turn still has the needle | diff --git a/e2e/run.py b/e2e/run.py index 8680f06..4464f2f 100755 --- a/e2e/run.py +++ b/e2e/run.py @@ -7,7 +7,7 @@ poteto_off /poteto-mode off removes the needle new_session_starts_off same-process new_session: new sid, no entry, next turn off resume_stays_on switch_session back to the on-session: needle on - install_plugin_link README/AGENTS teach omp plugin link ./ and Claude plugin install; competing stories gone + install_plugin_link README/AGENTS teach omp marketplace, pi git install, Claude plugin install; competing stories gone worktree_cleanup_omp playbook uses ~/.omp/wt and worktree.base Usage (from repo root): @@ -248,7 +248,12 @@ def static_install_docs(): agents = (ROOT / "AGENTS.md").read_text() setup = (ROOT / "docs/guide/01-setup.md").read_text() ok = ( - "omp plugin link ./" in readme + "omp plugin marketplace add edheltzel/pstack-for-omp" in readme + and "omp plugin install pstack@pstack" in readme + and "omp plugin marketplace add edheltzel/pstack-for-omp" in agents + and "pi install git:github.com/edheltzel/pstack-for-omp" in readme + and "pi install git:github.com/edheltzel/pstack-for-omp" in agents + and "omp plugin link ./" in readme and "omp plugin link ./" in agents and "claude plugin marketplace add" in readme and "claude plugin install pstack@pstack" in readme @@ -257,6 +262,8 @@ def static_install_docs(): and "claude plugin validate" in readme and "omp plugin link ./" in setup and "claude plugin marketplace add" in setup + and "omp plugin marketplace add edheltzel/pstack-for-omp" in setup + and "pi install git:github.com/edheltzel/pstack-for-omp" in setup and "omp -e" not in readme and "/add-plugin" not in readme and ".omp/skills" not in readme @@ -275,10 +282,9 @@ def static_install_docs(): return check( "install_plugin_link", ok, - "canonical installs are omp plugin link ./ and Claude plugin install; competing stories gone", + "canonical installs are GitHub omp marketplace, pi git install, and Claude plugin install; competing stories gone", ) - def rpc_suite(): results = [] work = Path(tempfile.mkdtemp(prefix="pstack-e2e-")) diff --git a/e2e/unit/product-capabilities.test.ts b/e2e/unit/product-capabilities.test.ts index 4b70b5b..758fc4f 100644 --- a/e2e/unit/product-capabilities.test.ts +++ b/e2e/unit/product-capabilities.test.ts @@ -97,9 +97,14 @@ describe("original product pack", () => { expect(hits.length, "README.md must link to ./docs/guide/README.md").toBeGreaterThan(0); }); - it("README teaches omp plugin link ./ and Claude plugin install; competing stories gone", () => { + it("README teaches GitHub omp/Pi install and Claude plugin install; competing stories gone", () => { const readme = readFileSync(join(root, "README.md"), "utf8"); const agents = readFileSync(join(root, "AGENTS.md"), "utf8"); + expect(readme).toContain("omp plugin marketplace add edheltzel/pstack-for-omp"); + expect(readme).toContain("omp plugin install pstack@pstack"); + expect(agents).toContain("omp plugin marketplace add edheltzel/pstack-for-omp"); + expect(readme).toContain("pi install git:github.com/edheltzel/pstack-for-omp"); + expect(agents).toContain("pi install git:github.com/edheltzel/pstack-for-omp"); expect(readme).toContain("omp plugin link ./"); expect(agents).toContain("omp plugin link ./"); expect(readme).toContain("claude plugin marketplace add"); @@ -107,6 +112,7 @@ describe("original product pack", () => { expect(agents).toContain("claude plugin install pstack@pstack"); expect(readme).toContain("claude --plugin-dir ./"); expect(readme).toContain("/pstack:do-"); + expect(readme).not.toMatch(/omp -e /); expect(readme).not.toContain("/add-plugin"); expect(readme).not.toContain(".omp/skills"); From c243f40ee176180886a7f470b178a26687d120d2 Mon Sep 17 00:00:00 2001 From: Ed Heltzel <402910+edheltzel@users.noreply.github.com> Date: Wed, 16 Sep 2026 14:59:39 -0400 Subject: [PATCH 2/4] docs: point GitHub install at edheltzel/Do-Pstack Origin remote is git@github.com:edheltzel/Do-Pstack.git. --- .claude-plugin/plugin.json | 4 ++-- AGENTS.md | 6 +++--- README.md | 8 ++++---- docs/AGENTS.md | 4 ++-- docs/guide/01-setup.md | 4 ++-- docs/guide/README.md | 2 +- e2e/run.py | 12 ++++++------ e2e/unit/product-capabilities.test.ts | 8 ++++---- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 4ac81dd..bd0b4e7 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -7,8 +7,8 @@ "name": "Ed Heltzel", "url": "https://github.com/edheltzel" }, - "homepage": "https://github.com/edheltzel/pstack-for-omp", - "repository": "https://github.com/edheltzel/pstack-for-omp", + "homepage": "https://github.com/edheltzel/Do-Pstack", + "repository": "https://github.com/edheltzel/Do-Pstack", "license": "MIT", "keywords": ["pstack", "poteto-mode", "skills", "omp"] } diff --git a/AGENTS.md b/AGENTS.md index 189ec41..3e85a7d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -71,7 +71,7 @@ GitButler (`but`) is the VCS. The main checkout is the `gitbutler/workspace` bra Tell operators GitHub marketplace: - Install host via https://omp.sh/install if needed. -- `omp plugin marketplace add edheltzel/pstack-for-omp` then `omp plugin install pstack@pstack` +- `omp plugin marketplace add edheltzel/Do-Pstack` then `omp plugin install pstack@pstack` - This checkout / live RPC: `omp plugin link ./` - Later sessions, any cwd: type `/` (`/skill:do-…`, sticky `/poteto-mode`) - Do not copy `pstack.ts` into `~/.omp/agent/extensions/`. @@ -81,7 +81,7 @@ Tell operators GitHub marketplace: Tell operators git install: -- `pi install git:github.com/edheltzel/pstack-for-omp` +- `pi install git:github.com/edheltzel/Do-Pstack` - This checkout: `pi install ./` - Do not use `pi -e` as the install path. @@ -90,7 +90,7 @@ Tell operators git install: Tell operators plugin-first only: - Manifest: `.claude-plugin/plugin.json`. Catalog: `.claude-plugin/marketplace.json`. Skills stay at plugin-root `skills/`, not inside `.claude-plugin/`. -- Install: `claude plugin marketplace add ` then `claude plugin install pstack@pstack`. +- Install: `claude plugin marketplace add ` then `claude plugin install pstack@pstack`. - This session only: `claude --plugin-dir ./` - Slash skills: `/pstack:do-*`. Do not rename the `do-` skill set. - Validate on a host with Claude Code: `claude plugin validate .` diff --git a/README.md b/README.md index dd6f318..2f078b2 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ GitHub install. No clone required. ### omp ``` -omp plugin marketplace add edheltzel/pstack-for-omp +omp plugin marketplace add edheltzel/Do-Pstack omp plugin install pstack@pstack ``` @@ -56,7 +56,7 @@ omp docs: https://omp.sh/docs/plugins ### Pi ``` -pi install git:github.com/edheltzel/pstack-for-omp +pi install git:github.com/edheltzel/Do-Pstack ``` This checkout: `pi install ./`. List with `pi list`. Docs: https://pi.dev/docs/latest/packages#install-and-manage @@ -70,11 +70,11 @@ This checkout is the plugin root: `.claude-plugin/plugin.json` plus `skills/` an From the package root, add this repo as a marketplace and install: ``` -claude plugin marketplace add /absolute/path/to/pstack-for-omp +claude plugin marketplace add /absolute/path/to/Do-Pstack claude plugin install pstack@pstack ``` -From GitHub: `claude plugin marketplace add edheltzel/pstack-for-omp` then `claude plugin install pstack@pstack`. +From GitHub: `claude plugin marketplace add edheltzel/Do-Pstack` then `claude plugin install pstack@pstack`. This session only (no install record): diff --git a/docs/AGENTS.md b/docs/AGENTS.md index 8956c0c..52467b6 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -2,7 +2,7 @@ ## Purpose -Human docs for this plugin. First-run is the README (omp marketplace `pstack@pstack`, `pi install git:github.com/edheltzel/pstack-for-omp`, Claude `claude plugin install pstack@pstack`). The numbered guide is the original pstack product tutorial. This file must not teach a second omp mount story (`omp -e`) or a fake installer. +Human docs for this plugin. First-run is the README (omp marketplace `pstack@pstack`, `pi install git:github.com/edheltzel/Do-Pstack`, Claude `claude plugin install pstack@pstack`). The numbered guide is the original pstack product tutorial. This file must not teach a second omp mount story (`omp -e`) or a fake installer. ## Ownership @@ -10,7 +10,7 @@ Human docs for this plugin. First-run is the README (omp marketplace `pstack@pst ## Local Contracts -- README owns first-run: omp `marketplace add edheltzel/pstack-for-omp` + `install pstack@pstack`, Pi `pi install git:github.com/edheltzel/pstack-for-omp`, Claude plugin install (`marketplace add` + `pstack@pstack`, or `claude --plugin-dir ./`). Checkout path is `omp plugin link ./` / `pi install ./`. Do not add `docs/getting-started.md` or teach `omp -e` / `pi -e` as an install path. +- README owns first-run: omp `marketplace add edheltzel/Do-Pstack` + `install pstack@pstack`, Pi `pi install git:github.com/edheltzel/Do-Pstack`, Claude plugin install (`marketplace add` + `pstack@pstack`, or `claude --plugin-dir ./`). Checkout path is `omp plugin link ./` / `pi install ./`. Do not add `docs/getting-started.md` or teach `omp -e` / `pi -e` as an install path. - README may link the numbered guide. - Guide on-disk skill links use `skills/do-*` so they resolve in this tree. Slash names in guide prose may still say `/how`; the live omp surface is `/skill:do-how`, Claude is `/pstack:do-how`. `/poteto-mode` stays unprefixed on omp. - Setup guide (`01-setup.md`) matches `do-setup-pstack`: `/model` Roles and `/agents` only. Do not teach `pstack-models.mdc`. diff --git a/docs/guide/01-setup.md b/docs/guide/01-setup.md index 57f34e6..fbeee7c 100644 --- a/docs/guide/01-setup.md +++ b/docs/guide/01-setup.md @@ -9,7 +9,7 @@ This package is the plugin root for both hosts. Pick one. GitHub install; no clo ### omp ```text -omp plugin marketplace add edheltzel/pstack-for-omp +omp plugin marketplace add edheltzel/Do-Pstack omp plugin install pstack@pstack ``` @@ -20,7 +20,7 @@ The Cursor product used `/add-plugin pstack`. That is history. omp catalog is `. ### Pi ```text -pi install git:github.com/edheltzel/pstack-for-omp +pi install git:github.com/edheltzel/Do-Pstack ``` This checkout: `pi install ./`. List with `pi list`. diff --git a/docs/guide/README.md b/docs/guide/README.md index 97ad2b5..814f369 100644 --- a/docs/guide/README.md +++ b/docs/guide/README.md @@ -1,6 +1,6 @@ # The pstack guide -> This numbered guide is the original pstack product tutorial. On this fork, first-run is the [README](../../README.md) (omp `pstack@pstack`, `pi install git:github.com/edheltzel/pstack-for-omp`, or Claude `claude plugin install pstack@pstack`). Slash skills are `/skill:do-…` on omp and `/pstack:do-*` on Claude (on-disk `skills/do-*`). `/poteto-mode` stays unprefixed on omp. +> This numbered guide is the original pstack product tutorial. On this fork, first-run is the [README](../../README.md) (omp `pstack@pstack`, `pi install git:github.com/edheltzel/Do-Pstack`, or Claude `claude plugin install pstack@pstack`). Slash skills are `/skill:do-…` on omp and `/pstack:do-*` on Claude (on-disk `skills/do-*`). `/poteto-mode` stays unprefixed on omp. pstack works best when you stop micromanaging the agent. You describe what you want and how you'll know it's done. `/poteto-mode` picks the playbook, runs the other skills as the steps need them, and shows you the evidence. This guide teaches that habit with realistic prompts. diff --git a/e2e/run.py b/e2e/run.py index 4464f2f..7a7c9f8 100755 --- a/e2e/run.py +++ b/e2e/run.py @@ -248,11 +248,11 @@ def static_install_docs(): agents = (ROOT / "AGENTS.md").read_text() setup = (ROOT / "docs/guide/01-setup.md").read_text() ok = ( - "omp plugin marketplace add edheltzel/pstack-for-omp" in readme + "omp plugin marketplace add edheltzel/Do-Pstack" in readme and "omp plugin install pstack@pstack" in readme - and "omp plugin marketplace add edheltzel/pstack-for-omp" in agents - and "pi install git:github.com/edheltzel/pstack-for-omp" in readme - and "pi install git:github.com/edheltzel/pstack-for-omp" in agents + and "omp plugin marketplace add edheltzel/Do-Pstack" in agents + and "pi install git:github.com/edheltzel/Do-Pstack" in readme + and "pi install git:github.com/edheltzel/Do-Pstack" in agents and "omp plugin link ./" in readme and "omp plugin link ./" in agents and "claude plugin marketplace add" in readme @@ -262,8 +262,8 @@ def static_install_docs(): and "claude plugin validate" in readme and "omp plugin link ./" in setup and "claude plugin marketplace add" in setup - and "omp plugin marketplace add edheltzel/pstack-for-omp" in setup - and "pi install git:github.com/edheltzel/pstack-for-omp" in setup + and "omp plugin marketplace add edheltzel/Do-Pstack" in setup + and "pi install git:github.com/edheltzel/Do-Pstack" in setup and "omp -e" not in readme and "/add-plugin" not in readme and ".omp/skills" not in readme diff --git a/e2e/unit/product-capabilities.test.ts b/e2e/unit/product-capabilities.test.ts index 758fc4f..04b3bf7 100644 --- a/e2e/unit/product-capabilities.test.ts +++ b/e2e/unit/product-capabilities.test.ts @@ -100,11 +100,11 @@ describe("original product pack", () => { it("README teaches GitHub omp/Pi install and Claude plugin install; competing stories gone", () => { const readme = readFileSync(join(root, "README.md"), "utf8"); const agents = readFileSync(join(root, "AGENTS.md"), "utf8"); - expect(readme).toContain("omp plugin marketplace add edheltzel/pstack-for-omp"); + expect(readme).toContain("omp plugin marketplace add edheltzel/Do-Pstack"); expect(readme).toContain("omp plugin install pstack@pstack"); - expect(agents).toContain("omp plugin marketplace add edheltzel/pstack-for-omp"); - expect(readme).toContain("pi install git:github.com/edheltzel/pstack-for-omp"); - expect(agents).toContain("pi install git:github.com/edheltzel/pstack-for-omp"); + expect(agents).toContain("omp plugin marketplace add edheltzel/Do-Pstack"); + expect(readme).toContain("pi install git:github.com/edheltzel/Do-Pstack"); + expect(agents).toContain("pi install git:github.com/edheltzel/Do-Pstack"); expect(readme).toContain("omp plugin link ./"); expect(agents).toContain("omp plugin link ./"); expect(readme).toContain("claude plugin marketplace add"); From 012577d04cdd92e6eeada28b4c1ed1225cc47225 Mon Sep 17 00:00:00 2001 From: Ed Heltzel <402910+edheltzel@users.noreply.github.com> Date: Wed, 16 Sep 2026 15:43:29 -0400 Subject: [PATCH 3/4] docs: rewrite numbered guide as omp walkthrough Unslop and tutorial-docs pass. Independent-run gate was not done. --- AGENTS.md | 2 +- README.md | 90 +++++++++------------------ docs/AGENTS.md | 6 +- docs/guide/01-setup.md | 81 ++++++++++++++---------- docs/guide/02-poteto-mode.md | 16 ++--- docs/guide/03-understand.md | 10 +-- docs/guide/04-design.md | 4 +- docs/guide/05-build-and-clean.md | 10 +-- docs/guide/06-verify-and-ship.md | 4 +- docs/guide/07-overnight.md | 6 +- docs/guide/09-make-it-yours.md | 6 +- docs/guide/10-recipes-and-pitfalls.md | 20 +++--- docs/guide/README.md | 20 +++--- 13 files changed, 130 insertions(+), 145 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 3e85a7d..e586a3a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -110,7 +110,7 @@ npm test | [extensions/AGENTS.md](extensions/AGENTS.md) | Factory `pstack.ts`; per-session poteto-mode | | [e2e/AGENTS.md](e2e/AGENTS.md) | Static doctor/lint + Vitest; live RPC local-only via plugin-link | | [skills/AGENTS.md](skills/AGENTS.md) | Skill tree; SKILL.md frontmatter `name` + `description` | -| [docs/AGENTS.md](docs/AGENTS.md) | original numbered `guide/`; first-run lives on README (omp marketplace, pi git install, Claude plugin install) | +| [docs/AGENTS.md](docs/AGENTS.md) | original numbered `guide/` as an omp walkthrough; first-run lives on README (omp marketplace, pi git install, Claude plugin install) | | [automations/AGENTS.md](automations/AGENTS.md) | Dormant Benny pack; not slash skills | | [scripts/AGENTS.md](scripts/AGENTS.md) | `pstack sync`: vendor official skills from cursor/plugins into `skills/do-*` | diff --git a/README.md b/README.md index 2f078b2..3774742 100644 --- a/README.md +++ b/README.md @@ -7,28 +7,21 @@ ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝ ``` -# pstack +# Do Pstack -> [!NOTE] -> EdHeltzel's pstack for omp +This is a native plugin for Oh-My-Pi but has support for Pi and Claude Code. -This package is an installable **plugin** for omp/Pi and Claude Code. Skills stay `do-*` on disk. omp exposes them as `/skill:do-…`. Claude Code exposes them as `/pstack:do-*`. Sticky `/poteto-mode` is the omp factory command. - -It is not the Cursor plugin and not an official Cursor port. +All skills follow the `do-*` namespace, from my [Do-Skills repo](https://github.com/edheltzel/Do-Skills). You might hate it 😬. ## What pstack is -pstack is a Cursor-verified plugin of Lauren Tan ([@poteto](https://x.com/poteto)) skills. - -- Source (a folder in `cursor/plugins`, not a standalone repo): https://github.com/cursor/plugins/tree/main/pstack -- Product README: https://github.com/cursor/plugins/blob/main/pstack/README.md -- User guide: https://github.com/cursor/plugins/blob/main/pstack/docs/guide/README.md - -Those pages are the Cursor product. This README does not retell them. +pstack is a Cursor plugin by Lauren Tan ([@poteto](https://x.com/poteto)). See [Curor's repo](https://github.com/cursor/plugins/tree/main/pstack) for more info. ## Docs -- [The pstack guide](./docs/guide/README.md) — original numbered product tutorial (setup through recipes, plus images). On-disk skill links use `skills/do-*`. omp slash skills are `/skill:do-…`. Claude slash skills are `/pstack:do-*`. `/poteto-mode` stays unprefixed on omp. +- [The pstack guide](./docs/guide/README.md) — original numbered product tutorial (setup through recipes, plus images). + +**pi** skill use `skills/do-*`. **omp** skills are `/skill:do-…`. **claude** skills are `/pstack:do-*`. `/poteto-mode` stays unprefixed on omp, becuase it is a native plugin. ## Automations @@ -47,11 +40,7 @@ omp plugin marketplace add edheltzel/Do-Pstack omp plugin install pstack@pstack ``` -This checkout: `omp plugin link ./`. Confirm with `omp plugin list`. Prove with `omp plugin doctor`. - -Do not copy only `pstack.ts` into `~/.omp/agent/extensions/`. Catalog is `.claude-plugin/marketplace.json` (omp reads that fallback). Do not add `.omp-plugin/`. - -omp docs: https://omp.sh/docs/plugins +This checkout: `omp plugin link ./` ### Pi @@ -59,51 +48,43 @@ omp docs: https://omp.sh/docs/plugins pi install git:github.com/edheltzel/Do-Pstack ``` -This checkout: `pi install ./`. List with `pi list`. Docs: https://pi.dev/docs/latest/packages#install-and-manage - -Do not use `pi -e` as the install path. +This checkout: `pi install ./` ### Claude Code -This checkout is the plugin root: `.claude-plugin/plugin.json` plus `skills/` and `agents/` beside it (not inside `.claude-plugin/`). - -From the package root, add this repo as a marketplace and install: - ``` claude plugin marketplace add /absolute/path/to/Do-Pstack claude plugin install pstack@pstack ``` -From GitHub: `claude plugin marketplace add edheltzel/Do-Pstack` then `claude plugin install pstack@pstack`. - -This session only (no install record): - ``` -claude --plugin-dir ./ +claude plugin marketplace add edheltzel/Do-Pstack +claude plugin install pstack@pstack ``` +This session only: `claude --plugin-dir ./` + Claude slash skills are namespaced: `/pstack:do-how`, `/pstack:do-poteto-mode`. Validate the layout with `claude plugin validate .`. Sticky `/poteto-mode` is omp-only; on Claude run `/pstack:do-poteto-mode`. -Claude plugin docs: https://code.claude.com/docs/en/plugins. +## Usage + +1. On omp: `/poteto-mode` — enable sticky Poteto Mode for this conversation. Optional task arguments are passed through; this also sends `/skill:do-poteto-mode`. +2. Do your thing as usual. Just with pstack's flow and skills -## First steps +- `/poteto-mode` is persistent in omp with you execute `/new` or when you resume a conversation. -1. Install the host (omp from https://omp.sh, Pi, or Claude Code). -2. Load this plugin (see Load this plugin). -3. On omp: `/poteto-mode` — enable sticky Poteto Mode for this conversation. Optional task arguments are passed through; this also sends `/skill:do-poteto-mode`. On Claude: `/pstack:do-poteto-mode`. -4. Work as usual. On omp, resume an on conversation and it stays on. `/new` starts off. -5. `/poteto-mode off` (aliases: `disable`, `stop`) — disable this omp conversation. +3. `/poteto-mode off` (aliases: `disable`, `stop`) -If Poteto Mode was never turned on in this omp conversation, it is off. Mode is per conversation, not process-wide. +`/poteto-mode` is off by default -The TUI status reads `pstack: poteto mode` when on. Other omp surfaces may not show it. +please note: omp's TUI shows `pstack: poteto mode` when enabled. ## Commands -| Command | What it does | -|---|---| -| `/poteto-mode` | omp factory: enable sticky Poteto Mode for this conversation. Also sends `/skill:do-poteto-mode`. | -| `/poteto-mode off` | Disable this omp conversation. Aliases: `disable`, `stop`. | +| Command | What it does | +| ------------------ | ------------------------------------------------------------------------------------------------- | +| `/poteto-mode` | omp factory: enable sticky Poteto Mode for this conversation. Also sends `/skill:do-poteto-mode`. | +| `/poteto-mode off` | Disable this omp conversation. Aliases: `disable`, `stop`. | That is the live omp extension command. It stays unprefixed. There is no worktree command. No `hooks/` tree. No `src/` tree. No Cursor marketplace APIs. Do not ship `commands/poteto-mode.md`. @@ -115,30 +96,21 @@ That is the live omp extension command. It stays unprefixed. There is no worktre - When on, a prompt needle prepends “Pstack Poteto Mode is on…” - The TUI status reads `pstack: poteto mode` when on. - Off aliases: `off`, `disable`, `stop`. -- No Cursor marketplace APIs. No `models.json` writer. No `hooks/` or `src/` tree. ## Update official skills -Official skills come from the Cursor pstack folder in [cursor/plugins](https://github.com/cursor/plugins/tree/main/pstack), not from `backnotprop/pstack` and not from skills.sh. From this package root: +Official skills come from the Cursor pstack folder in [cursor/plugins](https://github.com/cursor/plugins/tree/main/pstack): ``` npm run sync ``` -Same command: `node scripts/pstack.mjs sync`. Dry-run: `npm run sync -- --dry-run`. - -That pulls `pstack/skills/` from `cursor/plugins` into the existing `skills/do-*` tree (YAML `name` gets the `do-` prefix). It does not create a second skill tree or install into agent skill directories. Diverged local omp forks stay unless you pass `--force`. This fork keeps `playbooks/shipping.md` deleted. - -## Skills - -Files under `skills/` are markdown prompts. They are not live omp functions or CLIs. - -- omp, after marketplace install or `omp plugin link ./`: `/skill:do-` -- Pi, after `pi install`: skills from `skills/` -- Claude Code, after plugin install: `/pstack:do-` +Same command: `node scripts/pstack.mjs sync`. +Dry-run: `npm run sync -- --dry-run`. -Examples: `/skill:do-create-verification-skill` (Claude: `/pstack:do-create-verification-skill`), `/skill:do-swarm`, `/skill:do-principle-build-the-lever`. Feature Map is a section in `do-create-verification-skill`, not a runner. Do not treat Feature Map, swarm, or Build the Lever as functions or CLIs. +That pulls `pstack/skills/` from `cursor/plugins` into the existing `skills/do-*` tree (YAML `name` gets the `do-` prefix). It does not create a second skill tree or install into agent skill directories. ## License -MIT. omp is also MIT ([license](https://github.com/can1357/oh-my-pi/blob/main/LICENSE)). +I just follow omp's license but i think I need to do that? +omp is also MIT ([license](https://github.com/can1357/oh-my-pi/blob/main/LICENSE)). diff --git a/docs/AGENTS.md b/docs/AGENTS.md index 52467b6..06dcf06 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -2,11 +2,11 @@ ## Purpose -Human docs for this plugin. First-run is the README (omp marketplace `pstack@pstack`, `pi install git:github.com/edheltzel/Do-Pstack`, Claude `claude plugin install pstack@pstack`). The numbered guide is the original pstack product tutorial. This file must not teach a second omp mount story (`omp -e`) or a fake installer. +Human docs for this plugin. First-run is the README (omp marketplace `pstack@pstack`, `pi install git:github.com/edheltzel/Do-Pstack`, Claude `claude plugin install pstack@pstack`). The numbered guide is an omp walkthrough of the original pstack product tutorial. This file must not teach a second omp mount story (`omp -e`) or a fake installer. ## Ownership -- `guide/` — original numbered tutorial (01–10 plus images), ported from `cursor/plugins` `pstack/docs/guide/`. +- `guide/` — numbered walkthrough (01–10 plus images). Images still come from `cursor/plugins` `pstack/docs/guide/`. ## Local Contracts @@ -18,7 +18,7 @@ Human docs for this plugin. First-run is the README (omp marketplace `pstack@pst ## Work Guidance -Port guide pages and images from upstream. Remap `../../skills//` to `../../skills/do-/`. Agents tell operators GitHub install (omp marketplace, `pi install git:…`, Claude plugin install). +Keep the omp walkthrough. Do not paste upstream Cursor install prose back over it. Remap `../../skills//` to `../../skills/do-/`. Agents tell operators GitHub install (omp marketplace, `pi install git:…`, Claude plugin install). ## Verification diff --git a/docs/guide/01-setup.md b/docs/guide/01-setup.md index fbeee7c..9de3410 100644 --- a/docs/guide/01-setup.md +++ b/docs/guide/01-setup.md @@ -1,77 +1,92 @@ # Set up pstack -In this page you install the plugin, pick which models pstack uses, and run your first task. Setup is one command plus a short conversation. +In this tutorial we'll install the plugin on omp, pick models, and run one small task. -## Install the plugin +## Prerequisites -This package is the plugin root for both hosts. Pick one. GitHub install; no clone required. +- omp from https://omp.sh +- A project you can edit -### omp +We'll use omp for the rest of this guide. Pi and Claude Code load the same plugin. Their install commands are at the end. + +## Step 1: Install the plugin + +Run: ```text omp plugin marketplace add edheltzel/Do-Pstack omp plugin install pstack@pstack ``` -This checkout: `omp plugin link ./`. Confirm with `omp plugin list`. Prove with `omp plugin doctor`. - -The Cursor product used `/add-plugin pstack`. That is history. omp catalog is `.claude-plugin/marketplace.json`. +You should see `pstack` in `omp plugin list`. Prove it with `omp plugin doctor`. -### Pi +This checkout, from the package root: ```text -pi install git:github.com/edheltzel/Do-Pstack +omp plugin link ./ ``` -This checkout: `pi install ./`. List with `pi list`. +Cursor used `/add-plugin pstack`. That is old. The catalog is `.claude-plugin/marketplace.json`. -### Claude Code +## Step 2: Pick your models -From the package root: +Start omp in the project and run: ```text -claude plugin marketplace add /absolute/path/to/this-checkout -claude plugin install pstack@pstack +/skill:do-setup-pstack ``` -Or this session only: `claude --plugin-dir ./`. Validate with `claude plugin validate .`. Skills show as `/pstack:do-*`. +You should see each plugin agent and the `@role` it uses. Routing lives in `/model` Roles and each agent's `model: "@role"` line, or an override in `/agents`. The skill writes nothing. Run it again to re-list. -The Claude catalog is `.claude-plugin/marketplace.json`. Skills stay at the plugin root (`skills/do-*/SKILL.md`), not inside `.claude-plugin/`. +To change a concrete model for a role, open `/model` then Roles. To put one agent on a different role, open `/agents` and override that agent. New `task` calls pick it up. -## Pick your models +One agent definition cannot run N models in parallel. Diversity is prompt, path, or a model override in `/agents`. -Run: +On Claude Code the same skill is [`/pstack:do-setup-pstack`](../../skills/do-setup-pstack/SKILL.md). + +## Step 3: The verification offer + +At the end of setup, `/skill:do-setup-pstack` looks for a way to prove app behavior: a `verify-*` skill or an existing harness. If it finds neither, it offers once to generate one with [`/skill:do-create-verification-skill`](../../skills/do-create-verification-skill/SKILL.md). + +Say yes and it writes `.cursor/skills/verify-/`, a project-local skill that teaches agents to drive your app the way a user does. It proves the skill once before handing it over. Say no and setup moves on. You can run `/skill:do-create-verification-skill` any time. [Verify and ship](./06-verify-and-ship.md#create-a-project-verification-skill) covers when that earns its place. + +## Step 4: Run your first task + +Pick something real but small. Describe it the way you'd describe it to a colleague: ```text -/skill:do-setup-pstack +/poteto-mode add a --json flag to this command. text output stays byte-identical. verify both. ``` -On Claude Code the same skill is [`/pstack:do-setup-pstack`](../../skills/do-setup-pstack/SKILL.md). - -[`/skill:do-setup-pstack`](../../skills/do-setup-pstack/SKILL.md) lists each plugin agent and the `@role` it uses. Routing lives in `/model` → Roles and each agent's `model: "@role"` line, or an override in `/agents`. The skill writes nothing. Re-run it to re-list. +You should see a todo list. The first item is "read the Principles section." The rest are Feature playbook steps. If `/poteto-mode` skips a step, the step stays in the list with `skip: `. -Want a different concrete model for a role? Open `/model` → Roles and change that `@role`. Want one agent on a different role or a concrete selector? Open `/agents` and override that agent. New `task` calls pick it up. +Type normal follow-ups after that. On omp, `/poteto-mode` stays on for this conversation until you turn it off. -N parallel models is not available from one agent definition. Diversity is prompt, path, or label unless you change that agent's `model` in `/agents`. +On Claude Code, start with `/pstack:do-poteto-mode` instead of the omp factory `/poteto-mode`. -## Accept the verification offer, or don't +## Other hosts -At the end of setup, `/skill:do-setup-pstack` looks for a way to prove app behavior in your project, either a `verify-*` skill or an existing harness. If it finds neither, it offers once to generate one with [`/skill:do-create-verification-skill`](../../skills/do-create-verification-skill/SKILL.md). +Pi: -Say yes and it writes `.cursor/skills/verify-/`, a project-local skill that teaches agents to drive your app the way a user does. It proves the skill works once before handing it over. Say no and setup moves on. You can run `/skill:do-create-verification-skill` yourself any time. [Verify and ship](./06-verify-and-ship.md#create-a-project-verification-skill) covers when it earns its place. +```text +pi install git:github.com/edheltzel/Do-Pstack +``` -## Run your first task +This checkout: `pi install ./`. List with `pi list`. -Pick something real but small, and describe it the way you'd describe it to a colleague: +Claude Code, from the package root: ```text -/poteto-mode add a --json flag to this command. text output stays byte-identical. verify both. +claude plugin marketplace add /absolute/path/to/this-checkout +claude plugin install pstack@pstack ``` -On Claude Code, start with `/pstack:do-poteto-mode` instead of the omp factory `/poteto-mode`. +This session only: `claude --plugin-dir ./`. Validate with `claude plugin validate .`. Skills show as `/pstack:do-*`. + +The Claude catalog is `.claude-plugin/marketplace.json`. Skills stay at the plugin root (`skills/do-*/SKILL.md`), not inside `.claude-plugin/`. -Watch the todo list. The first item is always "read the Principles section". The rest are the matched playbook's steps copied in, the Feature playbook for this prompt. If `/poteto-mode` skips a step, the step stays in the list with `skip: `, so you can see what it chose not to do. +## What you've learned -From here you can type normal follow-ups. On omp, `/poteto-mode` is sticky. It stays on for the conversation until you opt out by saying so. +You installed pstack, listed model roles, and ran one `/poteto-mode` task. Next: [Route work through `/poteto-mode`](./02-poteto-mode.md). diff --git a/docs/guide/02-poteto-mode.md b/docs/guide/02-poteto-mode.md index cf6072b..8f5dfae 100644 --- a/docs/guide/02-poteto-mode.md +++ b/docs/guide/02-poteto-mode.md @@ -1,6 +1,6 @@ # Route work through `/poteto-mode` -`/poteto-mode` is the front door. You give it a goal, it matches one of twenty-two playbooks, copies that playbook's steps into the todo list, and calls the other skills as the steps need them. In this page you learn what a good prompt looks like, and how little of one you actually need. +`/poteto-mode` is the front door. You give it a goal. It matches one of twenty-two playbooks, copies that playbook's steps into the todo list, and calls the other skills as the steps need them. ![A dispatcher pulls a switch lever to route robots on rail handcars toward lit gates, under a /poteto-mode departure board listing BUG FIX, FEATURE, and INVESTIGATION.](./images/router.jpg) @@ -27,7 +27,7 @@ flowchart TD The diagram shows the common routes. There are also playbooks for hillclimbing a metric, diagnosing runtime symptoms and captured traces, prototypes, visual parity, authoring and evaluating skills, autonomous runs, babysitting a PR or stack to merge-ready, shipping a verified stack, running a PR queue on autopilot, orchestrating project-scale programs, session pickup, pausing safely, multi-phase plans, and worktree cleanup. The [playbook directory](../../skills/do-poteto-mode/playbooks/) has the full set. -## Say the goal, not the ceremony +## Say the goal, not the steps You don't write a spec. You say what's wrong or what you want, plus anything you already know that saves the agent time: @@ -35,9 +35,9 @@ You don't write a spec. You say what's wrong or what you want, plus anything you /poteto-mode users get two notifications after a retry. repro first, then fix and verify. ``` -That's a Bug fix prompt. "repro first" is a real constraint, not politeness, and the playbook honors it. Watch the todo list fill with the Bug fix steps. A skipped step stays visible with `skip: `. +You should see the Bug fix steps in the todo list. "repro first" is a constraint, not politeness. A skipped step stays visible with `skip: `. -When the conversation already carries the context, the prompt shrinks to almost nothing. All of these are enough: +When the conversation already carries the context, these are enough: ```text /poteto-mode do it @@ -51,11 +51,11 @@ continue keep going until done ``` -Short works because the mode is sticky and the playbook holds the structure. Your words carry the intent, and the skill carries the rigor. +Short works because the mode is sticky and the playbook holds the structure. ## Switch tasks with "new task" -A long chat accumulates context from the last task. When you change subjects, say so: +A long chat keeps context from the last task. When you change subjects, say so: ```text /poteto-mode new task. figure out why the cache entry survives logout. don't change any code yet. @@ -89,9 +89,9 @@ When you step away, say what done means and go: /poteto-mode im stepping away. keep going until the migration check reports zero old callers. log your decisions. ``` -Work you'll review later routes through [`/figure-it-out`](../../skills/do-figure-it-out/SKILL.md), which designs the run's phases and keeps a [`/show-me-your-work`](../../skills/do-show-me-your-work/SKILL.md) decision log. [Run work while you sleep](./07-overnight.md) covers the full overnight contract. +Work you'll review later routes through [`/figure-it-out`](../../skills/do-figure-it-out/SKILL.md), which designs the run's phases and keeps a [`/show-me-your-work`](../../skills/do-show-me-your-work/SKILL.md) decision log. [Run work while you sleep](./07-overnight.md) covers the overnight contract. -**Pitfall:** don't enumerate skills in your prompt ("use /how, then /architect, then /arena..."). The playbook already sequences them, and a hand-written sequence usually reorders or drops steps the playbook would have kept. Name a skill only when you want to override a specific choice. +Don't list skills in your prompt ("use /how, then /architect, then /arena..."). The playbook already sequences them. A hand-written sequence usually reorders or drops steps. Name a skill only when you want to override a specific choice. Read [`poteto-mode`](../../skills/do-poteto-mode/SKILL.md) itself for the full routing rules. diff --git a/docs/guide/03-understand.md b/docs/guide/03-understand.md index 03133f2..1c88d03 100644 --- a/docs/guide/03-understand.md +++ b/docs/guide/03-understand.md @@ -10,7 +10,7 @@ Editing code you don't understand is how subtle regressions ship. pstack gives y /how do we dedupe notifications? is there an n+1 when we look up subscribers? ``` -Ask the question you actually have. [`/how`](../../skills/do-how/SKILL.md) reads the code and answers at the level of a senior engineer onboarding you onto the subsystem, with the runtime flow, the key types, and the non-obvious parts. For a big subsystem it fans out two to four read-only explorers first. For a narrow question it just reads and explains. +Ask the question you actually have. [`/how`](../../skills/do-how/SKILL.md) reads the code and answers at the level of a senior engineer onboarding you onto the subsystem: runtime flow, key types, non-obvious parts. For a big subsystem it fans out two to four read-only explorers first. For a narrow question it just reads and explains. `/how` can also push back on the design. Ask for Critique mode when you suspect the structure itself: @@ -26,9 +26,9 @@ The explanation comes first, so the critique stays grounded in how the thing rea /why was the retry limit set to five? does the reason still hold? ``` -[`/why`](../../skills/do-why/SKILL.md) works like a detective on a cold case. It starts from source control, then queries whatever evidence categories your MCPs expose, such as the issue tracker, long-form docs, team chat, observability, error tracking, and analytics, all in parallel. The report cites everything, separates direct evidence from inference, and says "appears to" when the record is thin. A null result gets reported too, because "nobody wrote down why" is itself an answer. +[`/why`](../../skills/do-why/SKILL.md) starts from source control, then queries whatever evidence categories your MCPs expose, such as the issue tracker, long-form docs, team chat, observability, error tracking, and analytics, all in parallel. The report cites everything, separates direct evidence from inference, and says "appears to" when the record is thin. A null result gets reported too, because "nobody wrote down why" is itself an answer. -The two compose naturally. `do why first then how` is a perfectly good prompt when you suspect the history explains the mess. +The two compose. `do why first then how` is a good prompt when you suspect the history explains the mess. ## Actually understand it with `/teach` @@ -36,7 +36,7 @@ The two compose naturally. `do why first then how` is a perfectly good prompt wh /teach me how this PR changes retries. convince me it fixes the cause and not the symptom. ``` -[`/teach`](../../skills/do-teach/SKILL.md) is for when a summary isn't enough. It runs `/how` and `/why`, for a small change maybe just one of them, and weaves the findings into a plain explanation that builds up diagram by diagram. The "convince me" framing is worth stealing. It turns the explanation into an argument you can poke at instead of a tour. +[`/teach`](../../skills/do-teach/SKILL.md) is for when a summary isn't enough. It runs `/how` and `/why`, for a small change maybe just one of them, and weaves the findings into a plain explanation that builds up diagram by diagram. "convince me" turns the explanation into an argument you can poke at instead of a tour. ## Rebuild your own context with `/recall` @@ -56,6 +56,6 @@ When another agent (or you, last week) left a branch mid-flight: The [Session pickup playbook](../../skills/do-poteto-mode/playbooks/session-pickup.md) treats the prior trail as authoritative. It reconstructs the branch state and decisions, names the resume point, and verifies inherited claims against the original goal instead of re-deriving everything from scratch. -**Pitfall:** don't skip this page's skills because "the agent will read the code anyway." An agent that starts editing without a traced model tends to fix the symptom at the first plausible spot. `/how` first is cheaper than the second bug. +Don't skip these skills because "the agent will read the code anyway." An agent that starts editing without a traced model tends to fix the symptom at the first plausible spot. `/how` first is cheaper than the second bug. Next: [Design the change](./04-design.md). diff --git a/docs/guide/04-design.md b/docs/guide/04-design.md index dfa4b32..cdf26e8 100644 --- a/docs/guide/04-design.md +++ b/docs/guide/04-design.md @@ -54,7 +54,7 @@ The panel comes from your [`/setup-pstack`](../../skills/do-setup-pstack/SKILL.m [`/swarm`](../../skills/do-swarm/SKILL.md) fans N workers across independent slices, coverage matrices, gauntlet lanes, exploration partitions, or declared race arms. Each worker gets its own scope and check, then reports `PASS`, `ISSUES`, or `BLOCKED`. The parent waits for the workers and returns one compact report with any gaps or dropouts. -Reach for it when parallelism buys coverage or lets independent checks race. `/arena` gives every worker the same design or code brief, then picks a base and grafts the best parts. `/swarm` covers slices or runs a race with a selection rule declared up front. It does not use the base-selection and grafting ceremony. +Reach for it when parallelism buys coverage or lets independent checks race. `/arena` gives every worker the same design or code brief, then picks a base and grafts the best parts. `/swarm` covers slices or runs a race with a selection rule declared up front. It does not pick a base or graft losers into a winner. ## Break it with `/interrogate` @@ -68,7 +68,7 @@ Read the dismissals too. The lead is a pragmatic senior engineer, not an oracle, ## How much design work does a task deserve? -You might be wondering whether every change needs this. No. Most changes need none of it. A rough ladder: +Most changes need none of this. A rough ladder: - A small, finished change you're unsure about needs `/interrogate` alone. - A change that crosses function boundaries or moves ownership earns `/architect`, which brings `/arena` with it. diff --git a/docs/guide/05-build-and-clean.md b/docs/guide/05-build-and-clean.md index 4774bc3..5b44174 100644 --- a/docs/guide/05-build-and-clean.md +++ b/docs/guide/05-build-and-clean.md @@ -1,6 +1,6 @@ # Build the change and clean the diff -The build playbooks share one discipline. Say what you observed, let the playbook demand the evidence. This page shows what to put in the prompt for each common build task, then the cleanup habit that keeps diffs reviewable. +The build playbooks share one discipline. Say what you observed. Let the playbook demand the evidence. This page shows what to put in the prompt for each common build task, then the cleanup habit that keeps diffs reviewable. ## Prompt each build playbook with what you know @@ -28,7 +28,7 @@ A perf prompt states the measurement, not a vibe: /poteto-mode startup takes 1.8s on this fixture. trace it, fix the measured cause, show me before and after. ``` -Each of these routes to its playbook ([Bug fix](../../skills/do-poteto-mode/playbooks/bug-fix.md), [Feature](../../skills/do-poteto-mode/playbooks/feature.md), [Refactoring](../../skills/do-poteto-mode/playbooks/refactoring.md), [Perf issue](../../skills/do-poteto-mode/playbooks/perf-issue.md)), and the playbook supplies the steps you didn't type: reproduce before fixing, name the data shape before implementing, pin behavior before restructuring, profile before optimizing. +Each of these routes to its playbook ([Bug fix](../../skills/do-poteto-mode/playbooks/bug-fix.md), [Feature](../../skills/do-poteto-mode/playbooks/feature.md), [Refactoring](../../skills/do-poteto-mode/playbooks/refactoring.md), [Perf issue](../../skills/do-poteto-mode/playbooks/perf-issue.md)). The playbook supplies the steps you didn't type: reproduce before fixing, name the data shape before implementing, pin behavior before restructuring, profile before optimizing. For sustained improvement of one number, there's the [Hillclimb playbook](../../skills/do-poteto-mode/playbooks/hillclimb.md). Give it the metric, a target, and a floor on attempts, and it loops one hypothesis at a time with a frozen measurement harness. It keeps wins and reverts everything else. @@ -56,7 +56,7 @@ For prose, `/unslop` takes a target and any extra rules you have: /unslop the readme changes, no emdashes ``` -You'll develop your own shorthand. The skill reads intent fine from terse prompts like `unslop that, tighten it`. +The skill reads intent from terse prompts like `unslop that, tighten it`. ## Strip the comments with `/no-comments` @@ -68,8 +68,8 @@ Comments need their own pass, and not from the agent that wrote them. An author [`/no-comments`](../../skills/do-no-comments/SKILL.md) spawns [Comment Sicko](../../agents/comment-sicko.md), a read-only reviewer with a short keep list: license headers, doc comments on a public API, links that explain what code can't, behavior forced by an external dependency you can't reshape. Everything else goes. A surprise in your own code gets no such pass. The comment comes back as a refactor flag, and `/no-comments` fixes the flags it accepts at the root cause. When a comment claims a constraint, "do not remove", the skill offers to encode the claim as a type, test, or lint. Either way, the comment comes out. -The division of labor is worth keeping straight. `/deslop` cleans slop out of the code, `/unslop` cleans it out of prose, and `/no-comments` hands the comments to a reviewer who didn't write them. +Keep the split straight. `/deslop` cleans slop out of the code. `/unslop` cleans it out of prose. `/no-comments` hands the comments to a reviewer who didn't write them. -**Pitfall:** cleanup is not optional polish. A diff with narrating comments and defensive dead weight reads as unfinished to reviewers, and the extra code is where the next bug hides. If the diff feels padded, say `deslop it` before you commit, not after review calls it out. +Cleanup is not optional polish. A diff with narrating comments and defensive dead weight reads as unfinished to reviewers, and the extra code is where the next bug hides. If the diff feels padded, say `deslop it` before you commit, not after review calls it out. Next: [Verify and ship](./06-verify-and-ship.md). diff --git a/docs/guide/06-verify-and-ship.md b/docs/guide/06-verify-and-ship.md index be3a833..30a4a55 100644 --- a/docs/guide/06-verify-and-ship.md +++ b/docs/guide/06-verify-and-ship.md @@ -1,6 +1,6 @@ # Verify the result and open a PR -"It compiles" is not evidence. The [Prove It Works principle](../../skills/do-principle-prove-it-works/SKILL.md) makes the agent check the real artifact before it reports success, and your job is to make "the real artifact" checkable. This page covers stating a finish condition, generating a verification skill for your app, opening the PR, and driving it to merged. +"It compiles" is not evidence. The [Prove It Works principle](../../skills/do-principle-prove-it-works/SKILL.md) makes the agent check the real artifact before it reports success. Your job is to make "the real artifact" checkable. This page covers stating a finish condition, generating a verification skill for your app, opening the PR, and driving it to merged. ![A prototype plane flies a real test course while she times it with a stopwatch and robots film and checklist the run; the terminal reads verify: pass, evidence: captured.](./images/verification.jpg) @@ -12,7 +12,7 @@ Put what done means in the first prompt, in whatever words fit: /poteto-mode add json output to this command. text output stays byte-identical, the json parses, both run against the sample project. show me the evidence. ``` -Now the agent has three checks it can run, not a mood to satisfy. When the reply comes back, it should carry the exact commands and outputs. If a check couldn't run, a good reply says "inconclusive", and you should treat a confident reply without evidence as a red flag. +Now the agent has three checks it can run, not a mood to satisfy. When the reply comes back, it should carry the exact commands and outputs. If a check couldn't run, a good reply says "inconclusive". Treat a confident reply without evidence as a red flag. Match the check to the change: diff --git a/docs/guide/07-overnight.md b/docs/guide/07-overnight.md index b0b16ab..7b8bed7 100644 --- a/docs/guide/07-overnight.md +++ b/docs/guide/07-overnight.md @@ -1,6 +1,6 @@ # Run work while you sleep -This is the payoff for everything before it. An agent you can trust to verify its own work is an agent you can leave alone with a hard task. What makes that safe isn't hope. It's a checkable finish condition, an isolated worktree, and a decision log you audit in the morning. +An agent you can trust to verify its own work is an agent you can leave alone with a hard task. What makes that safe isn't hope. It's a checkable finish condition, an isolated worktree, and a decision log you audit in the morning. ![She waves goodnight from the door while robots keep the factory running, one updating a DECISION LOG wall board under a BUILD LOOP ACTIVE sign.](./images/overnight.jpg) @@ -56,7 +56,7 @@ Before the skill hands back its summary, it spawns a reviewer on a different mod ## When the night holds a queue, not a task -The contract above drives one task to one finish condition. Some nights hold more, a queue of independent changes or a whole program. Three playbooks scale the same trust up. +The contract above drives one task to one finish condition. Some nights hold more: a queue of independent changes or a whole program. Three playbooks scale the same trust up. [Autopilot-full](../../skills/do-poteto-mode/playbooks/autopilot-full.md) runs a queue of independent PRs to merged. Each PR gets one owner agent that carries it from build through merge, and no owner merges on its own verdict. A swarm of fresh verifiers checks every merge-ready head, and only a clean verdict authorizes the merge: @@ -76,6 +76,6 @@ The contract above drives one task to one finish condition. Some nights hold mor /poteto-mode orchestrate the store migration. own it until every package is converted and merged. i'll check in twice a day. ``` -**Pitfall:** a duration is not a finish condition. "work on this for 4 hours" gives the agent nothing to check, and you'll wake up to four hours of motion instead of a result. Give `/loop` a predicate that can pass or fail. +A duration is not a finish condition. "work on this for 4 hours" gives the agent nothing to check, and you'll wake up to four hours of motion instead of a result. Give `/loop` a predicate that can pass or fail. Next: [Steer with principle names](./08-principles.md). diff --git a/docs/guide/09-make-it-yours.md b/docs/guide/09-make-it-yours.md index 4b2fa41..686afb4 100644 --- a/docs/guide/09-make-it-yours.md +++ b/docs/guide/09-make-it-yours.md @@ -48,7 +48,7 @@ Skills aren't the only prose you ship. For docs, RFCs, readmes, PR descriptions, /technical-writing review the readme changes ``` -[`/technical-writing`](../../skills/do-technical-writing/SKILL.md) applies a layered standard with one goal, prose a tired engineer understands on the first read. It picks the document's mode first (tutorial, how-to, reference, or explanation), then works sentence by sentence: who does what, one thought per sentence, nothing readable two ways. Use it to review what you or an agent just wrote, or name it up front when you ask for a doc. +[`/technical-writing`](../../skills/do-technical-writing/SKILL.md) applies a layered standard with one goal: prose a tired engineer understands on the first read. It picks the document's mode first (tutorial, how-to, reference, or explanation), then works sentence by sentence: who does what, one thought per sentence, nothing readable two ways. Use it to review what you or an agent just wrote, or name it up front when you ask for a doc. ## Test a skill change blind @@ -58,10 +58,10 @@ A skill edit affects every future session, so test it like the experiment it is: /poteto-mode run the eval playbook on this skill change. same task for both variants, candidates stay blind. ``` -The [Eval playbook](../../skills/do-poteto-mode/playbooks/eval.md) is built around one failure mode, the observer effect. An agent that knows it's being evaluated behaves differently. So candidate agents get an organic-looking task in sanitized directories, never the words "eval" or "candidate", and never each other's existence. One judge scores all outputs under neutral labels, and chain-following gets graded from which files each candidate actually read, not from what it claims. +The [Eval playbook](../../skills/do-poteto-mode/playbooks/eval.md) is built around one failure mode: the observer effect. An agent that knows it's being evaluated behaves differently. So candidate agents get an organic-looking task in sanitized directories, never the words "eval" or "candidate", and never each other's existence. One judge scores all outputs under neutral labels, and chain-following gets graded from which files each candidate actually read, not from what it claims. Read every output yourself before accepting the verdict. If you disagree with the judge, suspect the rubric before you suspect your judgment. -**Pitfall:** don't edit a skill mid-task because it's misbehaving. Fix it in its own PR and keep the task moving. A skill edit that ships tangled into feature work is invisible to review and impossible to evaluate. +Don't edit a skill mid-task because it's misbehaving. Fix it in its own PR and keep the task moving. A skill edit that ships tangled into feature work is invisible to review and impossible to evaluate. Next: [Recipes and pitfalls](./10-recipes-and-pitfalls.md). diff --git a/docs/guide/10-recipes-and-pitfalls.md b/docs/guide/10-recipes-and-pitfalls.md index 32121c7..194c2ca 100644 --- a/docs/guide/10-recipes-and-pitfalls.md +++ b/docs/guide/10-recipes-and-pitfalls.md @@ -1,6 +1,6 @@ # Recipes and pitfalls -Prompts worth copying, then the mistakes everyone makes once. Swap in your own paths and finish conditions. The recipes are deliberately informal. That's how they get typed in practice, and the skills read intent fine. +Prompts worth copying, then the mistakes everyone makes once. Swap in your own paths and finish conditions. The recipes are informal on purpose. That's how they get typed, and the skills read intent fine. ![She tastes a finished dish while robots cook from a recipe box, with pinned cards reading /how, /tdd, and /loop above the counter.](./images/recipes.jpg) @@ -18,7 +18,7 @@ Mechanics first, history second. Each skill's report tells you which sources it ask /arena for a second opinion on this thread and our approach ``` -Your current design becomes one candidate among several, and the synthesis tells you whether the panel found something better or confirmed what you had. Cheap insurance before a costly commitment. +Your current design becomes one candidate among several, and the synthesis tells you whether the panel found something better or confirmed what you had. ## Check independent slices in parallel @@ -80,14 +80,14 @@ That's the whole prompt. [`/bro`](../../skills/do-bro/SKILL.md) restates the las ## The pitfalls -- **Enumerating skills in the prompt.** "use /how then /architect then /arena" reorders steps the playbook already sequences. State the goal and constraints. Name a skill only to override a default. -- **A vague finish condition.** "make it better" gives `/loop` nothing to check. Give a command or artifact that can pass or fail. -- **Parallel agents in one worktree.** They overwrite each other and the diff becomes archaeology. Say "own worktree per attempt" and the isolation is free. -- **Using `/arena` for coverage.** `/arena` repeats one design or code brief, then picks a base and grafts the best parts. `/swarm` partitions slices or declared race arms and aggregates one report. -- **Accepting every review comment.** Bots and humans both file real catches and noise in one list. `/interrogate` sorts findings into act-on and dismissed buckets with reasons, and you can override either way. -- **Editing routing files by hand.** Change a role in `/model` → Roles, or override one agent in `/agents`. Do not pass `model` on `task`. [Setup](./01-setup.md) covers it. -- **Reporting success off a green build.** A build proves it compiles. Ask for the real command, flow, stored value, or profile, and expect the evidence in the reply. -- **Writing a `SKILL.md` freehand.** Route it through the [Authoring or modifying a skill playbook](../../skills/do-poteto-mode/playbooks/authoring-a-skill.md) so validation and review happen. +- Enumerating skills in the prompt. "use /how then /architect then /arena" reorders steps the playbook already sequences. State the goal and constraints. Name a skill only to override a default. +- A vague finish condition. "make it better" gives `/loop` nothing to check. Give a command or artifact that can pass or fail. +- Parallel agents in one worktree. They overwrite each other and the diff becomes archaeology. Say "own worktree per attempt" and the isolation is free. +- Using `/arena` for coverage. `/arena` repeats one design or code brief, then picks a base and grafts the best parts. `/swarm` partitions slices or declared race arms and aggregates one report. +- Accepting every review comment. Bots and humans both file real catches and noise in one list. `/interrogate` sorts findings into act-on and dismissed buckets with reasons, and you can override either way. +- Editing routing files by hand. Change a role in `/model` then Roles, or override one agent in `/agents`. Do not pass `model` on `task`. [Setup](./01-setup.md) covers it. +- Reporting success off a green build. A build proves it compiles. Ask for the real command, flow, stored value, or profile, and expect the evidence in the reply. +- Writing a `SKILL.md` freehand. Route it through the [Authoring or modifying a skill playbook](../../skills/do-poteto-mode/playbooks/authoring-a-skill.md) so validation and review happen. That's the guide. If you skipped ahead, go back to [setup](./01-setup.md) and run one real task. The habits stick from use, not from reading. diff --git a/docs/guide/README.md b/docs/guide/README.md index 814f369..b70876b 100644 --- a/docs/guide/README.md +++ b/docs/guide/README.md @@ -1,32 +1,30 @@ # The pstack guide -> This numbered guide is the original pstack product tutorial. On this fork, first-run is the [README](../../README.md) (omp `pstack@pstack`, `pi install git:github.com/edheltzel/Do-Pstack`, or Claude `claude plugin install pstack@pstack`). Slash skills are `/skill:do-…` on omp and `/pstack:do-*` on Claude (on-disk `skills/do-*`). `/poteto-mode` stays unprefixed on omp. +In this tutorial we'll run pstack on a real task. First-run is the [README](../../README.md). Install with omp `pstack@pstack`, `pi install git:github.com/edheltzel/Do-Pstack`, or Claude `claude plugin install pstack@pstack`. On-disk skills are `skills/do-*`. omp slash skills are `/skill:do-…`. Claude slash skills are `/pstack:do-*`. `/poteto-mode` stays unprefixed on omp. -pstack works best when you stop micromanaging the agent. You describe what you want and how you'll know it's done. `/poteto-mode` picks the playbook, runs the other skills as the steps need them, and shows you the evidence. This guide teaches that habit with realistic prompts. +Give a goal and a way to check it, in your own words. `/poteto-mode` picks the playbook, runs the other skills, and shows the evidence. -Here's what you'll learn: +Read these pages in order the first time. After that, each page stands alone. 1. [Set up pstack](./01-setup.md). Install the plugin and pick your models. 2. [Route work through `/poteto-mode`](./02-poteto-mode.md). Give it a goal and watch it pick a playbook. -3. [Understand the code](./03-understand.md). `/how`, `/why`, `/teach`, and `/recall` before you edit anything. -4. [Design the change](./04-design.md). `/architect`, `/arena`, `/swarm`, and `/interrogate` before code locks in a shape. +3. [Understand the code](./03-understand.md). `/how`, `/why`, `/teach`, and `/recall` before you edit. +4. [Design the change](./04-design.md). `/architect`, `/arena`, `/swarm`, and `/interrogate` before code locks a shape. 5. [Build and clean the change](./05-build-and-clean.md). The build playbooks, `/tdd`, `/unslop`, and `/no-comments`. -6. [Verify and ship](./06-verify-and-ship.md). Prove behavior on the real app, then open a focused PR and drive it to merged. -7. [Run work while you sleep](./07-overnight.md). An overnight contract, a decision log you can audit, and the playbooks that scale past one agent. +6. [Verify and ship](./06-verify-and-ship.md). Prove behavior on the real app, then open a focused PR. +7. [Run work while you sleep](./07-overnight.md). A finish condition, a decision log, and playbooks that scale past one agent. 8. [Steer with principle names](./08-principles.md). The 21 names that redirect an agent mid-task. 9. [Make it yours](./09-make-it-yours.md). Your own mode, plus how to test a skill change. 10. [Recipes and pitfalls](./10-recipes-and-pitfalls.md). Prompts to copy and mistakes to skip. -Read the pages in order the first time. After that, each page stands alone. - ## If you only remember one thing -Give the agent a goal and a way to check it, in your own words: +Type this in a repo you can edit: ```text /poteto-mode the export writes duplicate rows when a retry lands mid-run. repro first, then fix and verify. ``` -You don't need to name a playbook or list skills. "repro first" and a checkable outcome are all the routing signal `/poteto-mode` needs. It matches the Bug fix playbook, copies the steps into a todo list, and calls the right skills as each step fires. +You should see a todo list. The first item is "read the Principles section." The rest are Bug fix steps. You do not name a playbook or list skills. "repro first" and a checkable outcome are enough. Next: [Set up pstack](./01-setup.md). From 41167f9e0780931a579faeb1afe297722ca3c5a9 Mon Sep 17 00:00:00 2001 From: Ed Heltzel <402910+edheltzel@users.noreply.github.com> Date: Wed, 16 Sep 2026 15:43:30 -0400 Subject: [PATCH 4/4] test: skip .delta and .codegraph in leftover slash scan --- e2e/unit/doctor.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/e2e/unit/doctor.test.ts b/e2e/unit/doctor.test.ts index eb0d4fc..a5b5ddf 100644 --- a/e2e/unit/doctor.test.ts +++ b/e2e/unit/doctor.test.ts @@ -9,7 +9,8 @@ function walkText(root: string, rel = ""): string[] { const dir = rel ? join(root, rel) : root; const out: string[] = []; for (const name of readdirSync(dir)) { - if (name === ".git" || name === "node_modules") continue; + if (name === ".git" || name === "node_modules" || name === ".delta" || name === ".codegraph") continue; + const child = rel ? `${rel}/${name}` : name; const st = statSync(join(root, child)); if (st.isDirectory()) out.push(...walkText(root, child));