@mccune1224/pi-pstack 0.1.0 → 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 (126) hide show
  1. package/README.md +52 -100
  2. package/agents/comment-sicko.md +1 -1
  3. package/agents/poteto-agent.md +2 -2
  4. package/docs/compare.md +122 -0
  5. package/docs/guide/01-setup.md +37 -12
  6. package/docs/guide/02-poteto-mode.md +1 -1
  7. package/docs/guide/03-understand.md +0 -8
  8. package/docs/guide/05-build-and-clean.md +1 -1
  9. package/docs/guide/06-verify-and-ship.md +1 -1
  10. package/docs/guide/07-overnight.md +2 -2
  11. package/docs/guide/08-principles.md +4 -2
  12. package/docs/guide/10-recipes-and-pitfalls.md +2 -2
  13. package/docs/guide/README.md +2 -2
  14. package/extensions/compaction.test.ts +132 -0
  15. package/extensions/compaction.ts +183 -0
  16. package/extensions/context-guard.test.ts +53 -0
  17. package/extensions/context-guard.ts +65 -0
  18. package/extensions/doctor.test.ts +85 -0
  19. package/extensions/doctor.ts +100 -0
  20. package/extensions/index.ts +289 -26
  21. package/extensions/settings.test.ts +71 -16
  22. package/extensions/settings.ts +57 -9
  23. package/extensions/skill-budget.test.ts +110 -0
  24. package/extensions/skill-budget.ts +101 -0
  25. package/package.json +9 -4
  26. package/scripts/check-pi-isms.mjs +106 -0
  27. package/scripts/lib/pi-delta-rules.mjs +110 -0
  28. package/scripts/lib/pi-delta-rules.test.mjs +100 -0
  29. package/scripts/lib/upstream-vendor.mjs +32 -0
  30. package/scripts/pi-deltas.json +754 -0
  31. package/scripts/sync-upstream.mjs +117 -0
  32. package/scripts/verify-guards.mjs +132 -0
  33. package/scripts/verify-sync.mjs +206 -0
  34. package/skills/architect/SKILL.md +10 -10
  35. package/skills/architect/references/rationale-template.md +2 -2
  36. package/skills/architect/references/runner-prompt.md +7 -7
  37. package/skills/arena/SKILL.md +11 -11
  38. package/skills/automate-me/SKILL.md +21 -26
  39. package/skills/blast-radius/SKILL.md +5 -5
  40. package/skills/create-verification-skill/SKILL.md +5 -5
  41. package/skills/figure-it-out/SKILL.md +11 -13
  42. package/skills/how/SKILL.md +30 -104
  43. package/skills/how/references/explainer-prompt.md +6 -6
  44. package/skills/how/references/explorer-prompt.md +1 -1
  45. package/skills/interrogate/SKILL.md +13 -14
  46. package/skills/interrogate/references/code-quality-review.md +1 -1
  47. package/skills/interrogate/references/lead-judgment.md +1 -1
  48. package/skills/interrogate/references/rubric.md +2 -2
  49. package/skills/maintain-verification-skill/SKILL.md +5 -5
  50. package/skills/no-comments/SKILL.md +3 -3
  51. package/skills/poteto-mode/SKILL.md +9 -8
  52. package/skills/poteto-mode/playbooks/authoring-a-skill.md +4 -4
  53. package/skills/poteto-mode/playbooks/autonomous-run.md +4 -4
  54. package/skills/poteto-mode/playbooks/autopilot-full.md +9 -9
  55. package/skills/poteto-mode/playbooks/autopilot-stack.md +8 -8
  56. package/skills/poteto-mode/playbooks/babysit.md +17 -17
  57. package/skills/poteto-mode/playbooks/bug-fix.md +6 -6
  58. package/skills/poteto-mode/playbooks/eval.md +6 -8
  59. package/skills/poteto-mode/playbooks/feature.md +7 -7
  60. package/skills/poteto-mode/playbooks/hillclimb.md +10 -10
  61. package/skills/poteto-mode/playbooks/investigation.md +3 -3
  62. package/skills/poteto-mode/playbooks/multi-phase-plan.md +26 -25
  63. package/skills/poteto-mode/playbooks/opening-a-pr.md +17 -13
  64. package/skills/poteto-mode/playbooks/orchestrate.md +37 -39
  65. package/skills/poteto-mode/playbooks/pause-safely.md +4 -4
  66. package/skills/poteto-mode/playbooks/perf-issue.md +9 -9
  67. package/skills/poteto-mode/playbooks/prototype.md +5 -5
  68. package/skills/poteto-mode/playbooks/refactoring.md +9 -9
  69. package/skills/poteto-mode/playbooks/runtime-forensics.md +3 -3
  70. package/skills/poteto-mode/playbooks/session-pickup.md +4 -6
  71. package/skills/poteto-mode/playbooks/shipping.md +11 -14
  72. package/skills/poteto-mode/playbooks/trace-forensics.md +4 -4
  73. package/skills/poteto-mode/playbooks/visual-parity.md +3 -3
  74. package/skills/poteto-mode/playbooks/worktree-cleanup.md +4 -4
  75. package/skills/poteto-mode/references/bugbot-triage.md +3 -3
  76. package/skills/poteto-mode/scripts/worktree-audit.mjs +0 -7
  77. package/skills/principle-attack-the-premise/SKILL.md +23 -0
  78. package/skills/principle-boundary-discipline/SKILL.md +2 -2
  79. package/skills/principle-build-the-lever/SKILL.md +5 -5
  80. package/skills/principle-encode-lessons-in-structure/SKILL.md +3 -3
  81. package/skills/principle-experience-first/SKILL.md +5 -5
  82. package/skills/principle-fix-root-causes/SKILL.md +4 -4
  83. package/skills/principle-foundational-thinking/SKILL.md +3 -3
  84. package/skills/principle-guard-the-context-window/SKILL.md +2 -2
  85. package/skills/principle-laziness-protocol/SKILL.md +2 -2
  86. package/skills/principle-migrate-callers-then-delete-legacy-apis/SKILL.md +1 -1
  87. package/skills/principle-minimize-reader-load/SKILL.md +2 -2
  88. package/skills/principle-model-the-domain/SKILL.md +3 -3
  89. package/skills/principle-never-block-on-the-human/SKILL.md +4 -5
  90. package/skills/principle-prove-it-works/SKILL.md +3 -3
  91. package/skills/principle-redesign-from-first-principles/SKILL.md +3 -3
  92. package/skills/principle-separate-before-serializing-shared-state/SKILL.md +3 -3
  93. package/skills/principle-sequence-verifiable-units/SKILL.md +3 -3
  94. package/skills/principle-subtract-before-you-add/SKILL.md +3 -4
  95. package/skills/principle-test-behavior-not-implementation/SKILL.md +25 -0
  96. package/skills/principle-type-system-discipline/SKILL.md +5 -5
  97. package/skills/recall/SKILL.md +7 -7
  98. package/skills/reflect/SKILL.md +14 -20
  99. package/skills/reflect/references/divergent-reviewer.md +3 -3
  100. package/skills/reflect/references/judgment-reviewer.md +3 -3
  101. package/skills/reflect/references/synthesizer.md +2 -2
  102. package/skills/reflect/references/tooling-reviewer.md +4 -6
  103. package/skills/setup-pstack/SKILL.md +61 -49
  104. package/skills/show-me-your-work/SKILL.md +17 -17
  105. package/skills/show-me-your-work/scripts/log.mjs +2 -8
  106. package/skills/swarm/SKILL.md +6 -6
  107. package/skills/tdd/SKILL.md +2 -2
  108. package/skills/teach/SKILL.md +7 -7
  109. package/skills/technical-writing/SKILL.md +5 -8
  110. package/skills/typescript-best-practices/SKILL.md +6 -3
  111. package/skills/typescript-best-practices/references/patterns.md +35 -14
  112. package/skills/unslop/SKILL.md +8 -20
  113. package/skills/why/SKILL.md +27 -100
  114. package/skills/why/references/epistemics.md +6 -6
  115. package/skills/why/references/investigator-prompt.md +5 -5
  116. package/skills/why/references/source-playbook.md +1 -1
  117. package/skills/why/references/sources/databricks.md +7 -7
  118. package/skills/why/references/sources/datadog.md +5 -5
  119. package/skills/why/references/sources/incident-postmortem.md +2 -2
  120. package/skills/why/references/sources/linear.md +2 -2
  121. package/skills/why/references/sources/notion.md +3 -3
  122. package/skills/why/references/sources/sentry.md +4 -4
  123. package/skills/why/references/sources/slack.md +2 -2
  124. package/skills/why/references/synthesizer-prompt.md +3 -3
  125. package/skills/how/references/critic-prompt.md +0 -59
  126. package/skills/how/references/critique-rubric.md +0 -58
@@ -0,0 +1,754 @@
1
+ {
2
+ "version": 1,
3
+ "upstream": {
4
+ "repo": "https://github.com/cursor/plugins",
5
+ "path": "pstack",
6
+ "ref": "5bf2b1544db739998121a306340631963c2ff3de",
7
+ "version": "0.15.2"
8
+ },
9
+ "note": "Rules apply in declaration order per file. Long, line-specific rules are declared before the uniform ones they would otherwise be consumed by. A rule that matches nothing fails the run, so upstream drift surfaces as a STALE RULE instead of a silent loss.",
10
+ "rules": [
11
+ {
12
+ "kind": "substitute",
13
+ "id": "guide-index-install",
14
+ "path": "docs/guide/README.md",
15
+ "find": "Install the plugin and pick your models.",
16
+ "replace": "Install the package and pick your models.",
17
+ "reason": "Pi installs a package, and the setup page defines the term that way. The index has to match it."
18
+ },
19
+ {
20
+ "kind": "substitute",
21
+ "id": "guide-make-it-yours-draft",
22
+ "path": "docs/guide/09-make-it-yours.md",
23
+ "find": "It drafts `.cursor/skills/<your-name>-mode/SKILL.md` through Cursor's built-in `create-skill` flow",
24
+ "replace": "It drafts `<your-name>-mode` as a skill through this package's [`create-skill`](../../skills/create-skill/SKILL.md) flow",
25
+ "reason": "create-skill ships in this package on Pi, not in the host runtime."
26
+ },
27
+ {
28
+ "kind": "substitute",
29
+ "id": "guide-make-it-yours-authoring",
30
+ "path": "docs/guide/09-make-it-yours.md",
31
+ "find": "which routes through Cursor's built-in `create-skill`,",
32
+ "replace": "which routes through this package's [`create-skill`](../../skills/create-skill/SKILL.md) skill,",
33
+ "reason": "Same create-skill origin, stated in the authoring playbook reference."
34
+ },
35
+ {
36
+ "kind": "substitute",
37
+ "id": "pi-reflect-reviewer-spawn",
38
+ "path": "skills/reflect/SKILL.md",
39
+ "find": "One message, three `Task` calls, `subagent_type: generalPurpose`, explicit `model:` on each, agent mode (`readonly: false`).",
40
+ "replace": "One message, three parallel `subagent` calls, an explicit `agent` and `model` on each, and `mode: \"agent\"` so MCP access survives.",
41
+ "reason": "Pi uses the subagent tool with agent names and a mode field. Readonly mode strips MCP, which these reviewers need for ticket, chat, and trace lookups."
42
+ },
43
+ {
44
+ "kind": "substitute",
45
+ "id": "pi-reflect-synthesizer-spawn",
46
+ "path": "skills/reflect/SKILL.md",
47
+ "find": "One `Task` call, `subagent_type: generalPurpose`, using your configured reflect-judgment model (default `claude-fable-5-1-thinking-max`), agent mode (`readonly: false`).",
48
+ "replace": "One `subagent` call on the reflect-judgment agent, `mode: \"agent\"` so MCP access survives.",
49
+ "reason": "Same shape as the reviewer spawn. The synthesizer spot-verifies citations, which needs MCP."
50
+ },
51
+ {
52
+ "kind": "substitute",
53
+ "id": "pi-swarm-worker-spawn",
54
+ "path": "skills/swarm/SKILL.md",
55
+ "find": "Spawn all N workers in one message with `subagent_type: generalPurpose`, `environment: \"cloud\"`, `run_in_background: true`, and the configured model. Use `environment: \"local\"` only when the worker needs access to something on the user's computer.",
56
+ "replace": "Spawn all N workers in one message with `agent: \"scout\"`, `async: true`, and the configured model. Pi subagents always run locally, which is what these workers need.",
57
+ "reason": "Pi has no cloud execution environment. Subagents run on the user's machine, so the local-versus-cloud choice does not exist."
58
+ },
59
+ {
60
+ "kind": "substitute",
61
+ "id": "pi-agent-comment-sicko-spawn",
62
+ "path": "skills/no-comments/SKILL.md",
63
+ "find": "Spawn `Task` with `subagent_type: \"Comment Sicko\"`.",
64
+ "replace": "Spawn `subagent({ agent: \"comment-sicko\" })`.",
65
+ "reason": "The comment reviewer is a Pi agent registered by this package, invoked through the subagent tool."
66
+ },
67
+ {
68
+ "kind": "substitute",
69
+ "id": "pi-interrogate-launch",
70
+ "path": "skills/interrogate/SKILL.md",
71
+ "find": "Launch all reviewers in a single message using the Task tool.",
72
+ "replace": "Launch all reviewers in a single message with parallel `subagent` calls.",
73
+ "reason": "Pi has no Task tool. The reviewers are parallel subagent calls."
74
+ },
75
+ {
76
+ "kind": "substitute",
77
+ "id": "pi-interrogate-reviewer-a",
78
+ "path": "skills/interrogate/SKILL.md",
79
+ "find": "| Reviewer A | `claude-fable-5-1-thinking-max` |",
80
+ "replace": "| Reviewer A | inherit the parent model |",
81
+ "reason": "Reviewer models come from the /pstack-setup map on Pi."
82
+ },
83
+ {
84
+ "kind": "substitute",
85
+ "id": "pi-interrogate-reviewer-b",
86
+ "path": "skills/interrogate/SKILL.md",
87
+ "find": "| Reviewer B | `gpt-5.6-sol-max` |",
88
+ "replace": "| Reviewer B | inherit, or a model family that differs from the parent's |",
89
+ "reason": "Reviewer models come from the /pstack-setup map on Pi."
90
+ },
91
+ {
92
+ "kind": "substitute",
93
+ "id": "pi-interrogate-reviewer-c",
94
+ "path": "skills/interrogate/SKILL.md",
95
+ "find": "| Reviewer C | `grok-4.6-fast-xhigh` |",
96
+ "replace": "| Reviewer C | inherit, or a model family that differs from the parent's |",
97
+ "reason": "Reviewer models come from the /pstack-setup map on Pi."
98
+ },
99
+ {
100
+ "kind": "substitute",
101
+ "id": "pi-interrogate-reviewer-d",
102
+ "path": "skills/interrogate/SKILL.md",
103
+ "find": "| Reviewer D | `claude-opus-5-thinking-xhigh` |",
104
+ "replace": "| Reviewer D | inherit, or a model family that differs from the parent's |",
105
+ "reason": "Reviewer models come from the /pstack-setup map on Pi."
106
+ },
107
+ {
108
+ "kind": "substitute",
109
+ "id": "pi-model-defaults",
110
+ "path": "**/*.md",
111
+ "regex": true,
112
+ "find": "\\(defaults? `[^`]+`(?:, `[^`]+`)*\\)",
113
+ "replace": "(default: inherit, the parent session model)",
114
+ "reason": "Upstream pins Cursor model slugs as role defaults. Pi runs every role on the parent session model unless /pstack-setup assigned one, so a concrete slug would name a model the reader may not have."
115
+ },
116
+ {
117
+ "kind": "substitute",
118
+ "id": "pi-model-panel-list",
119
+ "path": "**/*.md",
120
+ "find": "`claude-fable-5-1-thinking-max`, `gpt-5.6-sol-max`, `grok-4.6-fast-xhigh`, `claude-opus-5-thinking-xhigh`",
121
+ "replace": "your configured panel, one model family per runner",
122
+ "reason": "Upstream names its own four-model panel. Pi roles come from the /pstack-setup map instead."
123
+ },
124
+ {
125
+ "kind": "substitute",
126
+ "id": "pi-model-swarm-default",
127
+ "path": "skills/swarm/SKILL.md",
128
+ "find": "Otherwise use `grok-4.6-fast-xhigh`.",
129
+ "replace": "Otherwise inherit the parent session model.",
130
+ "reason": "Same pinned-slug problem, on a line without the (default ...) shape."
131
+ },
132
+ {
133
+ "kind": "substitute",
134
+ "id": "pi-model-settings-path",
135
+ "path": "**/*.md",
136
+ "find": "`~/.cursor/rules/pstack-models.mdc`",
137
+ "replace": "the `subagents.*` keys in Pi settings",
138
+ "reason": "Pi stores role models in its own settings files, not in a Cursor always-applied rule."
139
+ },
140
+ {
141
+ "kind": "substitute",
142
+ "id": "pi-transcript-glob",
143
+ "path": "**/*.md",
144
+ "find": "`~/.cursor/projects/*/`",
145
+ "replace": "other working-directory session subdirs",
146
+ "reason": "Pi groups sessions by working directory under ~/.pi/agent/sessions/, not by Cursor project slug."
147
+ },
148
+ {
149
+ "kind": "substitute",
150
+ "id": "pi-plugin-install-path",
151
+ "path": "**/*.md",
152
+ "find": "plugin-installed paths under `~/.cursor/plugins/`",
153
+ "replace": "plugin-installed paths under the `@mccune1224/pi-pstack` package",
154
+ "reason": "Pi installs packages under its own npm root, not a Cursor plugins directory."
155
+ },
156
+ {
157
+ "kind": "substitute",
158
+ "id": "pi-ask-tool-name",
159
+ "path": "**/*.md",
160
+ "find": "`AskQuestion`",
161
+ "replace": "`ask_user_question`",
162
+ "reason": "The Pi tool is named ask_user_question."
163
+ },
164
+ {
165
+ "kind": "substitute",
166
+ "id": "pi-pr-lanes-model",
167
+ "path": "**/*",
168
+ "find": "Ten lanes on `grok-4.6-fast-xhigh` at the PR head",
169
+ "replace": "Ten parallel lanes at the PR head",
170
+ "reason": "A pinned Cursor model slug in the verification skeleton reads as an instruction to use a model the reader may not have. Only the lane count carries meaning."
171
+ },
172
+ {
173
+ "kind": "substitute",
174
+ "id": "pi-agent-role-line",
175
+ "path": "**/*.md",
176
+ "find": "`subagent_type`: `generalPurpose`",
177
+ "replace": "`agent`: the one `/pstack-setup` assigned this role",
178
+ "reason": "Pi selects a subagent by name through the subagent tool, not by a subagent_type field."
179
+ },
180
+ {
181
+ "kind": "substitute",
182
+ "id": "pi-agent-poteto-inline",
183
+ "path": "**/*.md",
184
+ "find": "`subagent_type: \"poteto-agent\"`",
185
+ "replace": "`agent: \"poteto-agent\"`",
186
+ "reason": "Same field name, inline form, for the poteto-agent route."
187
+ },
188
+ {
189
+ "kind": "substitute",
190
+ "id": "pi-automate-me-transcripts",
191
+ "path": "skills/automate-me/SKILL.md",
192
+ "find": "Locate the active workspace's transcripts before fanning out. The system prompt names the workspace's `agent-transcripts/` directory. Use only that path. Don't glob across other working-directory session subdirs. That crosses workspace boundaries and reads private chats from unrelated projects.",
193
+ "replace": "Locate the active working directory's transcripts before fanning out. Pi stores them under `~/.pi/agent/sessions/--<cwd-with-slashes-as-dashes>--/`. Use only that subdir. Don't glob across other working-directory session subdirs, that reads private sessions from unrelated projects.",
194
+ "reason": "Pi stores sessions under ~/.pi/agent/sessions/, keyed by working directory."
195
+ },
196
+ {
197
+ "kind": "substitute",
198
+ "id": "pi-eval-transcripts",
199
+ "path": "skills/poteto-mode/playbooks/eval.md",
200
+ "find": "Read each candidate's local transcript under the active workspace's `agent-transcripts/` directory (the system prompt names this path). Do not glob across other working-directory session subdirs. That crosses workspace boundaries and reads private chats from unrelated projects.",
201
+ "replace": "Read each candidate's local transcript under `~/.pi/agent/sessions/--<cwd-with-slashes-as-dashes>--/`. Do not glob across other working-directory session subdirs, that reads private sessions from unrelated projects.",
202
+ "reason": "Pi stores sessions under ~/.pi/agent/sessions/, keyed by working directory."
203
+ },
204
+ {
205
+ "kind": "substitute",
206
+ "id": "pi-reflect-transcripts",
207
+ "path": "skills/reflect/SKILL.md",
208
+ "find": "The parent finds its own transcript file before fanning out. The system prompt names the active workspace's `agent-transcripts/` directory. Use that path. Do not glob across other working-directory session subdirs. That crosses workspace boundaries and reads private chats from unrelated projects.",
209
+ "replace": "The parent finds its own transcript file before fanning out. Pi keeps this run's session under `~/.pi/agent/sessions/--<cwd-with-slashes-as-dashes>--/`. Use that subdir. Do not glob across other working-directory session subdirs, that reads private sessions from unrelated projects.",
210
+ "reason": "Pi stores sessions under ~/.pi/agent/sessions/, keyed by working directory."
211
+ },
212
+ {
213
+ "kind": "substitute",
214
+ "id": "pi-session-pickup-transcripts",
215
+ "path": "skills/poteto-mode/playbooks/session-pickup.md",
216
+ "find": "A local transcript under the active workspace's `agent-transcripts/` directory (the system prompt names the path. Do not glob across other working-directory session subdirs, that crosses workspace boundaries and reads private chats from unrelated projects), a cloud-agent URL, or a pushed branch.",
217
+ "replace": "A local transcript under `~/.pi/agent/sessions/--<cwd-with-slashes-as-dashes>--/`. Do not glob across other working-directory session subdirs, that reads private sessions from unrelated projects. Or a background-run handoff, or a pushed branch.",
218
+ "reason": "Pi stores sessions under ~/.pi/agent/sessions/, keyed by working directory, and has no cloud-agent URLs."
219
+ },
220
+ {
221
+ "kind": "substitute",
222
+ "id": "show-me-your-work-transcripts",
223
+ "path": "skills/show-me-your-work/SKILL.md",
224
+ "find": "Read this run's transcript under the active workspace's `agent-transcripts/` directory (the system prompt names the path). Don't glob across other working-directory session subdirs. That reads unrelated private chats.",
225
+ "replace": "Read this run's session under `~/.pi/agent/sessions/--<cwd-with-slashes-as-dashes>--/`, newest file first. Don't glob across other working-directory session subdirs, that reads unrelated private sessions.",
226
+ "reason": "Pi stores sessions under ~/.pi/agent/sessions/, keyed by working directory."
227
+ },
228
+ {
229
+ "kind": "substitute",
230
+ "id": "pi-recall-transcript-path",
231
+ "path": "skills/recall/SKILL.md",
232
+ "find": "Transcripts live at `~/.cursor/projects/<slug>/agent-transcripts/<uuid>/<uuid>.jsonl`, where `<slug>` is the workspace path with the leading slash dropped and each \"/\" turned into \"-\" (so `/Users/you/proj` becomes `Users-you-proj`). Every line is one chat message.",
233
+ "replace": "Transcripts live at `~/.pi/agent/sessions/--<slug>--/<timestamp>_<id>.jsonl`, where `<slug>` is the working directory with the leading slash dropped and every \"/\" and \":\" turned into \"-\" (so `/Users/you/proj` becomes `Users-you-proj`). Every line is one chat message.",
234
+ "reason": "Pi's session directory name drops the leading slash and dashes every slash and colon. The file is named from the creation timestamp and the session id."
235
+ },
236
+ {
237
+ "kind": "substitute",
238
+ "id": "pi-repo-layout-paths",
239
+ "path": "**/*",
240
+ "find": "pstack/skills/",
241
+ "replace": "skills/",
242
+ "reason": "Upstream nests pstack under a pstack/ directory in its monorepo. This repo is the pstack package, so its paths are one level shorter."
243
+ },
244
+ {
245
+ "kind": "substitute",
246
+ "id": "guide-build-clean-deslop",
247
+ "path": "docs/guide/05-build-and-clean.md",
248
+ "find": "`/deslop` ships in the `cursor-team-kit` plugin, not in pstack. If you don't have it, ask for the same outcome in plain words: remove narrating comments, unsupported guards, dead compatibility paths, and unrelated edits.",
249
+ "replace": "`/deslop` ships in this package as [`/skill:deslop`](../../skills/deslop/SKILL.md). The bar is the same either way: remove narrating comments, unsupported guards, dead compatibility paths, and unrelated edits.",
250
+ "reason": "deslop is bundled here, so the guide points at the local skill instead of telling the reader to ask in plain words."
251
+ },
252
+ {
253
+ "kind": "substitute",
254
+ "id": "pi-cursor-team-kit-plugin",
255
+ "path": "**/*",
256
+ "find": "from the `cursor-team-kit` plugin",
257
+ "replace": "from this package",
258
+ "reason": "Same bundling, in the from-the-plugin phrasing that would otherwise read as 'the this package plugin'."
259
+ },
260
+ {
261
+ "kind": "substitute",
262
+ "id": "pi-cursor-team-kit",
263
+ "path": "**/*",
264
+ "find": "`cursor-team-kit`",
265
+ "replace": "this package",
266
+ "reason": "control-cli, control-ui, and deslop ship here instead of in cursor-team-kit, so a reader never has to install a second plugin."
267
+ },
268
+ {
269
+ "kind": "substitute",
270
+ "id": "pi-cursor-create-skill-skill",
271
+ "path": "**/*.md",
272
+ "find": "Cursor's built-in `create-skill` skill",
273
+ "replace": "the bundled `create-skill` skill",
274
+ "reason": "create-skill is a skill in this package on Pi, not a host built-in."
275
+ },
276
+ {
277
+ "kind": "substitute",
278
+ "id": "pi-cursor-create-skill",
279
+ "path": "**/*.md",
280
+ "find": "Cursor's built-in `create-skill`",
281
+ "replace": "the bundled `create-skill` skill",
282
+ "reason": "Same origin, in the shorter phrasing."
283
+ },
284
+ {
285
+ "kind": "substitute",
286
+ "id": "pi-cursor-create-skill-note",
287
+ "path": "**/*.md",
288
+ "find": "(Cursor's built-in for authoring SKILL.md files)",
289
+ "replace": "(bundled with this package)",
290
+ "reason": "Same origin, in the parenthetical phrasing."
291
+ },
292
+ {
293
+ "kind": "substitute",
294
+ "id": "pi-cursor-environment",
295
+ "path": "skills/why/SKILL.md",
296
+ "find": "list the available MCPs from the Cursor environment. Use the available-tools map when present. Otherwise inspect the `mcps/` directory Cursor exposes for enabled MCP servers.",
297
+ "replace": "list the available MCPs from the Pi session. Use the available-tools map when present. Otherwise inspect the MCP configuration Pi loads.",
298
+ "reason": "Pi exposes MCP servers through its own configuration, not a Cursor mcps/ directory."
299
+ },
300
+ {
301
+ "kind": "substitute",
302
+ "id": "pi-cursor-builtin-babysit",
303
+ "path": "skills/poteto-mode/playbooks/babysit.md",
304
+ "find": "This playbook replaces Cursor's built-in babysit skill for these requests, so do not route there even though its description matches the same words.",
305
+ "replace": "This playbook owns these requests, so do not route to a built-in babysit skill even though its description matches the same words.",
306
+ "reason": "Pi has no built-in babysit skill to contrast against."
307
+ },
308
+ {
309
+ "kind": "substitute",
310
+ "id": "pi-loop-bug-fix",
311
+ "path": "skills/poteto-mode/playbooks/bug-fix.md",
312
+ "find": "Drive a long or stubborn hunt with Cursor's `/loop` command.",
313
+ "replace": "Drive a long or stubborn hunt by re-checking the finish condition each pass.",
314
+ "reason": "Pi has no /loop command. The hunt re-checks its own predicate instead."
315
+ },
316
+ {
317
+ "kind": "substitute",
318
+ "id": "pi-loop-autonomous-run",
319
+ "path": "skills/poteto-mode/playbooks/autonomous-run.md",
320
+ "find": "Pick the wake mechanism using Cursor's `/loop` command (a built-in, not a pstack skill).",
321
+ "replace": "Pick the wake mechanism. Pi has no `/loop`, so the run re-checks the finish condition when the watched event fires or when the operator next writes.",
322
+ "reason": "Pi has no /loop command, so the wake mechanism is an event watcher plus the operator's next turn."
323
+ },
324
+ {
325
+ "kind": "substitute",
326
+ "id": "pi-loop-audit-tick",
327
+ "path": "**/*.md",
328
+ "find": "A local root arms each tick as a real terminal `/loop`. The loop uses a monitored-shell 30-minute sleep and emits an output-notification sentinel. A cloud root uses the existing cloud-sleeper wake chain instead.",
329
+ "replace": "The root arms each tick as a background subagent that sleeps 30 minutes and reports back. Pi has no cloud execution, so the tick always runs locally.",
330
+ "reason": "Pi has no /loop and no cloud execution environment. A background subagent is the available tick mechanism."
331
+ },
332
+ {
333
+ "kind": "substitute",
334
+ "id": "pi-loop-audit-checklist",
335
+ "path": "skills/poteto-mode/playbooks/multi-phase-plan.md",
336
+ "find": "- [ ] Arm the 30-minute audit tick. In a local session, a real terminal `/loop`. In a cloud root, a cloud-sleeper wake chain. Never leave the cadence to memory.",
337
+ "replace": "- [ ] Arm the 30-minute audit tick as a background subagent that sleeps and reports. Never leave the cadence to memory.",
338
+ "reason": "Same mechanism substitution in the checklist form."
339
+ },
340
+ {
341
+ "kind": "substitute",
342
+ "id": "pi-loop-watch-drive",
343
+ "path": "skills/poteto-mode/playbooks/babysit.md",
344
+ "find": "Run `drive` and `background` under `/loop` in dynamic mode.",
345
+ "replace": "Run `drive` and `background` as background subagent ticks.",
346
+ "reason": "Pi has no /loop command to hold the watcher."
347
+ },
348
+ {
349
+ "kind": "substitute",
350
+ "id": "pi-loop-shipping",
351
+ "path": "skills/poteto-mode/playbooks/shipping.md",
352
+ "find": "Hold the watch under `/loop` in dynamic mode.",
353
+ "replace": "Hold the watch with a background subagent tick.",
354
+ "reason": "Pi has no /loop command to hold the watch."
355
+ },
356
+ {
357
+ "kind": "substitute",
358
+ "id": "pi-loop-visual-parity",
359
+ "path": "skills/poteto-mode/playbooks/visual-parity.md",
360
+ "find": "`/loop` per component until the diff is zero.",
361
+ "replace": "Re-check each component until the diff is zero.",
362
+ "reason": "Pi has no /loop command to drive the re-check."
363
+ },
364
+ {
365
+ "kind": "substitute",
366
+ "id": "pi-loop-guide-prompt",
367
+ "path": "docs/guide/07-overnight.md",
368
+ "find": "/loop until done.",
369
+ "replace": "keep going until done.",
370
+ "reason": "The page cannot hand the reader a command Pi does not have. The intent is the finish condition."
371
+ },
372
+ {
373
+ "kind": "substitute",
374
+ "id": "pi-loop-guide-pitfall",
375
+ "path": "docs/guide/10-recipes-and-pitfalls.md",
376
+ "find": "\"make it better\" gives `/loop` nothing to check",
377
+ "replace": "\"make it better\" gives the run nothing to check",
378
+ "reason": "Same missing command in the pitfall list."
379
+ },
380
+ {
381
+ "kind": "substitute",
382
+ "id": "pi-guide-image-alt",
383
+ "path": "docs/guide/10-recipes-and-pitfalls.md",
384
+ "find": "pinned cards reading /how, /tdd, and /loop above the counter",
385
+ "replace": "pinned cards reading /how and /tdd above the counter",
386
+ "reason": "The illustration's alt text should not name a command Pi lacks."
387
+ },
388
+ {
389
+ "kind": "substitute",
390
+ "id": "pi-cursor-cloud-agent-owner",
391
+ "path": "**/*.md",
392
+ "find": "One Cursor cloud agent per PR owns",
393
+ "replace": "One fresh subagent per PR owns",
394
+ "reason": "Pi subagents run locally in the operator's session, not as Cursor cloud agents."
395
+ },
396
+ {
397
+ "kind": "substitute",
398
+ "id": "pi-shipping-cloud-agent",
399
+ "path": "skills/poteto-mode/playbooks/shipping.md",
400
+ "find": "each a Cursor cloud agent, each exercising",
401
+ "replace": "each a fresh subagent, each exercising",
402
+ "reason": "Same substitution for the shipping verifier lanes."
403
+ },
404
+ {
405
+ "kind": "substitute",
406
+ "id": "pi-cloud-environment-flag",
407
+ "path": "skills/poteto-mode/playbooks/orchestrate.md",
408
+ "find": "Always `environment: \"cloud\"` unless the task needs this machine",
409
+ "replace": "Always a background subagent unless the task needs this machine",
410
+ "reason": "Pi subagents always run locally, so there is no environment flag to set."
411
+ },
412
+ {
413
+ "kind": "substitute",
414
+ "id": "pi-orchestrate-transcripts",
415
+ "path": "skills/poteto-mode/playbooks/orchestrate.md",
416
+ "find": "Reading local transcripts under `agent-transcripts/`.",
417
+ "replace": "Reading local transcripts under `~/.pi/agent/sessions/`.",
418
+ "reason": "Pi stores sessions under ~/.pi/agent/sessions/."
419
+ },
420
+ {
421
+ "kind": "substitute",
422
+ "id": "pi-orchestrate-cloud-status",
423
+ "path": "skills/poteto-mode/playbooks/orchestrate.md",
424
+ "find": "pushed branches, the cloud agent's status in the Cursor dashboard",
425
+ "replace": "pushed branches, and the run's status",
426
+ "reason": "There is no Cursor dashboard on Pi. Status comes from the subagent status surface and the ledger."
427
+ },
428
+ {
429
+ "kind": "substitute",
430
+ "id": "pi-orchestrate-restart",
431
+ "path": "skills/poteto-mode/playbooks/orchestrate.md",
432
+ "find": "After a Cursor restart: local agents are dead, cloud work is not.",
433
+ "replace": "After a Pi restart: in-flight subagents are gone, committed work is not.",
434
+ "reason": "The restart in question is Pi's, and the durable half is committed work and pushed branches."
435
+ },
436
+ {
437
+ "kind": "substitute",
438
+ "id": "pi-orchestrate-reattach",
439
+ "path": "skills/poteto-mode/playbooks/orchestrate.md",
440
+ "find": "reattach cloud work by PR and branch rather than agent id",
441
+ "replace": "reattach work by PR and branch rather than run id",
442
+ "reason": "Run ids do not survive a restart. Branch and PR state does."
443
+ },
444
+ {
445
+ "kind": "substitute",
446
+ "id": "pi-cloud-local-store-read",
447
+ "path": "skills/poteto-mode/playbooks/orchestrate.md",
448
+ "find": "Cloud agents cannot read the local store, so their briefs inline what they need or point at repo paths.",
449
+ "replace": "Background subagents can read the local store, but keep briefs to pointers so their context stays small.",
450
+ "reason": "The constraint that forced inlining is a cloud-execution limit Pi does not have. The pointer habit still earns its place for context size."
451
+ },
452
+ {
453
+ "kind": "substitute",
454
+ "id": "pi-cloud-vm-lane",
455
+ "path": "skills/poteto-mode/playbooks/multi-phase-plan.md",
456
+ "find": "Each live lane runs on its own cloud VM at the PR head.",
457
+ "replace": "Each live lane runs in its own worktree at the PR head.",
458
+ "reason": "Pi has no cloud VMs. A per-lane worktree gives the same isolation."
459
+ },
460
+ {
461
+ "kind": "substitute",
462
+ "id": "pi-reflect-transcript-ls",
463
+ "path": "skills/reflect/SKILL.md",
464
+ "find": "ls -t <agent-transcripts>/*.jsonl <agent-transcripts>/*/*.jsonl <agent-transcripts>/*/subagents/*.jsonl 2>/dev/null | head -10",
465
+ "replace": "ls -t ~/.pi/agent/sessions/--<cwd-with-slashes-as-dashes>--/*.jsonl 2>/dev/null | head -10",
466
+ "reason": "Pi groups sessions by working directory under ~/.pi/agent/sessions/ and nests subagent transcripts inside the parent session file."
467
+ },
468
+ {
469
+ "kind": "substitute",
470
+ "id": "pi-em-dash-cvs-description",
471
+ "path": "skills/create-verification-skill/SKILL.md",
472
+ "find": "drives your app the way a user does — any language, framework, or platform.",
473
+ "replace": "drives your app the way a user does, across any language, framework, or platform.",
474
+ "reason": "The mode skill bans the long-dash character outright. Upstream's sweep missed this file, and a rule the package teaches should hold in the prose it ships."
475
+ },
476
+ {
477
+ "kind": "substitute",
478
+ "id": "pi-em-dash-cvs-drive",
479
+ "path": "skills/create-verification-skill/SKILL.md",
480
+ "find": "Existing harnesses first — Playwright/Cypress specs,",
481
+ "replace": "Existing harnesses first. Playwright/Cypress specs,",
482
+ "reason": "Same long-dash rule."
483
+ },
484
+ {
485
+ "kind": "substitute",
486
+ "id": "pi-em-dash-cvs-frontmatter",
487
+ "path": "skills/create-verification-skill/SKILL.md",
488
+ "find": "when to reach for it — without frontmatter the skill never registers)",
489
+ "replace": "when to reach for it. Without frontmatter the skill never registers)",
490
+ "reason": "Same long-dash rule."
491
+ },
492
+ {
493
+ "kind": "substitute",
494
+ "id": "pi-em-dash-cvs-doctor",
495
+ "path": "skills/create-verification-skill/SKILL.md",
496
+ "find": "worth driving?\" — process up,",
497
+ "replace": "worth driving?\" Process up,",
498
+ "reason": "Same long-dash rule."
499
+ },
500
+ {
501
+ "kind": "substitute",
502
+ "id": "pi-em-dash-cvs-evidence",
503
+ "path": "skills/create-verification-skill/SKILL.md",
504
+ "find": "at the named location — a cleanup that eats the proof fails this step.",
505
+ "replace": "at the named location. A cleanup that eats the proof fails this step.",
506
+ "reason": "Same long-dash rule."
507
+ },
508
+ {
509
+ "kind": "substitute",
510
+ "id": "pi-em-dash-mvs-verdicts",
511
+ "path": "skills/maintain-verification-skill/SKILL.md",
512
+ "regex": true,
513
+ "find": "\\*\\*(clean|changed|blocked)\\*\\* — ",
514
+ "replace": "**$1** means ",
515
+ "reason": "Same long-dash rule, on the three verdict bullets."
516
+ },
517
+ {
518
+ "kind": "substitute",
519
+ "id": "pi-em-dash-mvs-churn",
520
+ "path": "skills/maintain-verification-skill/SKILL.md",
521
+ "find": "missing from the map — require a concrete source path",
522
+ "replace": "missing from the map. Require a concrete source path",
523
+ "reason": "Same long-dash rule."
524
+ },
525
+ {
526
+ "kind": "substitute",
527
+ "id": "pi-em-dash-mvs-launch",
528
+ "path": "skills/maintain-verification-skill/SKILL.md",
529
+ "find": "the verification skill's own launch model — one long-lived instance driven serially",
530
+ "replace": "the verification skill's own launch model. One long-lived instance driven serially",
531
+ "reason": "Same long-dash rule."
532
+ },
533
+ {
534
+ "kind": "substitute",
535
+ "id": "pi-em-dash-mvs-doctor",
536
+ "path": "skills/maintain-verification-skill/SKILL.md",
537
+ "find": "since it last did something surprising — doctor before first drive",
538
+ "replace": "since it last did something surprising. Doctor before first drive",
539
+ "reason": "Same long-dash rule."
540
+ },
541
+ {
542
+ "kind": "substitute",
543
+ "id": "pi-em-dash-mvs-residue",
544
+ "path": "skills/maintain-verification-skill/SKILL.md",
545
+ "find": "outlives that drive's usefulness — failed-iteration residue is cleaned",
546
+ "replace": "outlives that drive's usefulness. Failed-iteration residue is cleaned",
547
+ "reason": "Same long-dash rule."
548
+ },
549
+ {
550
+ "kind": "substitute",
551
+ "id": "pi-em-dash-mvs-retry",
552
+ "path": "skills/maintain-verification-skill/SKILL.md",
553
+ "find": "retry once — restart whatever the fix invalidated, nothing more — before calling",
554
+ "replace": "retry once, restart whatever the fix invalidated, nothing more, before calling",
555
+ "reason": "Same long-dash rule, with commas because the clause reads as a parenthetical."
556
+ },
557
+ {
558
+ "kind": "substitute",
559
+ "id": "pi-em-dash-mvs-teardown",
560
+ "path": "skills/maintain-verification-skill/SKILL.md",
561
+ "find": "after the last drive of the run — including those re-proofs — so nothing",
562
+ "replace": "after the last drive of the run, including those re-proofs, so nothing",
563
+ "reason": "Same long-dash rule, with commas for the same reason."
564
+ },
565
+ {
566
+ "kind": "substitute",
567
+ "id": "pi-em-dash-bugbot-heading",
568
+ "path": "skills/poteto-mode/references/bugbot-triage.md",
569
+ "find": "cheaply verifiable — run the test first",
570
+ "replace": "cheaply verifiable, so run the test first",
571
+ "reason": "Same long-dash rule."
572
+ },
573
+ {
574
+ "kind": "substitute",
575
+ "id": "pi-em-dash-bugbot-skip",
576
+ "path": "skills/poteto-mode/references/bugbot-triage.md",
577
+ "find": "n/a — this is a verification shortcut",
578
+ "replace": "n/a, this is a verification shortcut",
579
+ "reason": "Same long-dash rule."
580
+ },
581
+ {
582
+ "kind": "override",
583
+ "id": "override-poteto-mode-skill",
584
+ "path": "skills/poteto-mode/SKILL.md",
585
+ "basedOn": "sha256:b3c505602b82fb3641a3983e9c46fb974881faa12ece1af804fae27afb7be532",
586
+ "reason": "Rewritten for Pi. Upstream 0.15.2 weakened the opening non-negotiable to a citation rule and dropped the instruction to make reading the Principles the first todo, which its own guide diagram still shows. This file keeps that instruction, names Pi agents and tools, and points at the skills this package ships rather than cursor-team-kit. Upstream edits must be merged by hand, which the baselined hash enforces."
587
+ },
588
+ {
589
+ "kind": "override",
590
+ "id": "override-setup-pstack-skill",
591
+ "path": "skills/setup-pstack/SKILL.md",
592
+ "basedOn": "sha256:2399a5670c6408e92a996299c9de9f22736997cb7e835c694309e7c6fc8c39bf",
593
+ "reason": "Upstream writes a Cursor always-applied rule. Pi writes the native subagents.* keys instead, so the headless path and the /pstack-setup picker share one source of truth."
594
+ },
595
+ {
596
+ "kind": "override",
597
+ "id": "override-guide-setup",
598
+ "path": "docs/guide/01-setup.md",
599
+ "basedOn": "sha256:0a928ce6ff6199104e57914692ce71bb4ec5c629dec2a54988ae97ea4f3c64ef",
600
+ "reason": "Pi installs a package and reloads, where Cursor installs a plugin from a marketplace. The whole page is the install and setup walkthrough."
601
+ },
602
+ {
603
+ "kind": "substitute",
604
+ "id": "guide-overnight-loop",
605
+ "path": "docs/guide/07-overnight.md",
606
+ "find": "`/loop` is Cursor's built-in wake mechanism, not a pstack skill. The [Autonomous run playbook](../../skills/poteto-mode/playbooks/autonomous-run.md) uses it to re-check the finish condition on events or a heartbeat.",
607
+ "replace": "Pi has no `/loop`. The [Autonomous run playbook](../../skills/poteto-mode/playbooks/autonomous-run.md) re-checks the finish condition on events or a heartbeat. Saying \"keep going until the goal is done\" keeps the run alive without one.",
608
+ "reason": "Pi has no /loop command, so the overnight page must not promise one."
609
+ },
610
+ {
611
+ "kind": "substitute",
612
+ "id": "show-me-your-work-log-helper",
613
+ "path": "skills/show-me-your-work/SKILL.md",
614
+ "find": "`scripts/log.sh <logfile>",
615
+ "replace": "`scripts/log.mjs <logfile>",
616
+ "reason": "The helper is cross-platform Node, so the invocation name changes."
617
+ },
618
+ {
619
+ "kind": "substitute",
620
+ "id": "worktree-cleanup-audit-script",
621
+ "path": "skills/poteto-mode/playbooks/worktree-cleanup.md",
622
+ "find": "run `scripts/worktree-audit.sh`",
623
+ "replace": "run `node scripts/worktree-audit.mjs`",
624
+ "reason": "The audit lever is cross-platform Node, so the playbook invokes node directly."
625
+ },
626
+ {
627
+ "kind": "substitute",
628
+ "id": "worktree-cleanup-cursor-root",
629
+ "path": "skills/poteto-mode/playbooks/worktree-cleanup.md",
630
+ "find": "misses one that lives at `.cursor/worktrees/myrepo/x`",
631
+ "replace": "misses one configured under a different worktree root",
632
+ "reason": "Pi worktrees are not rooted at .cursor/worktrees, so the example must not name that path."
633
+ },
634
+ {
635
+ "kind": "substitute",
636
+ "id": "agent-comment-sicko-description",
637
+ "path": "agents/comment-sicko.md",
638
+ "find": "description: A deranged comment-hater that savors deletion and condemns workaround code.",
639
+ "replace": "description: A deranged comment-hater that savors deletion and condemns workaround code. Read-only comment reviewer; reports only.",
640
+ "reason": "The description states the read-only contract, which is what Pi shows when the agent is selected."
641
+ },
642
+ {
643
+ "kind": "insert",
644
+ "id": "agent-comment-sicko-frontmatter",
645
+ "path": "agents/comment-sicko.md",
646
+ "anchor": "^description: ",
647
+ "position": "after",
648
+ "text": "thinking: high\nsystemPromptMode: replace\ninheritProjectContext: true\ninheritSkills: true\ntools: read, grep, find, ls, bash",
649
+ "reason": "Pi agent frontmatter: pin high thinking, replace the host system prompt with the agent body, keep project context and skills, and restrict the tool list to a read-only set."
650
+ },
651
+ {
652
+ "kind": "substitute",
653
+ "id": "agent-poteto-description-routing",
654
+ "path": "agents/poteto-agent.md",
655
+ "find": "description: Routing target for `/poteto-mode` and any request for poteto's style. Resume an existing `poteto-agent` for the conversation rather than spawning a sibling. Reads the `poteto-mode` skill's `SKILL.md` in full before any work, including its inline Principles index. Substituting `generalPurpose` skips that read and drifts.",
656
+ "replace": "description: Routing target for /poteto-mode and any request for poteto's style. Resume an existing poteto-agent for the conversation rather than spawning a sibling. Reads the poteto-mode skill's SKILL.md in full before any work, including its inline Principles index. Substituting generalPurpose skips that read and drifts.",
657
+ "reason": "Pi's agent selector renders the description as plain text, so backticks show up literally."
658
+ },
659
+ {
660
+ "kind": "substitute",
661
+ "id": "agent-poteto-body-locate",
662
+ "path": "agents/poteto-agent.md",
663
+ "find": "Read the `poteto-mode` skill's `SKILL.md` in full before doing any work, including its inline Principles index. Navigate to a leaf `principle-*` skill whenever you apply that principle.\n",
664
+ "replace": "Read the `poteto-mode` skill's `SKILL.md` in full before doing any work, including its inline Principles index. If it is not already in context, locate it under the installed pi-pstack package's `skills/poteto-mode/` directory. Navigate to a leaf `principle-*` skill whenever you apply that principle.\n\nExecute the assigned task exactly as that skill prescribes: match a playbook, copy its steps in verbatim, cite each principle with the decision it changed, verify against the real artifact, and write the reply clean as you draft it. You own the work. Review your own diff and report what changed for the consumer and the maintainer.\n",
665
+ "reason": "A Pi subagent starts with a fresh context, so the body tells it where the skill lives and restates the contract it must execute."
666
+ },
667
+ {
668
+ "kind": "insert",
669
+ "id": "agent-poteto-frontmatter",
670
+ "path": "agents/poteto-agent.md",
671
+ "anchor": "^is_background: true$",
672
+ "position": "before",
673
+ "text": "thinking: high\nsystemPromptMode: replace\ninheritProjectContext: true\ninheritSkills: true\ntools: read, grep, find, ls, bash, edit, write, subagent",
674
+ "reason": "Pi agent frontmatter: pin high thinking, replace the host system prompt with the agent body, keep project context and skills, and grant the tools the playbooks need."
675
+ },
676
+ {
677
+ "kind": "substitute",
678
+ "id": "pi-dir-skills",
679
+ "path": "**/*.md",
680
+ "find": ".cursor/skills/",
681
+ "replace": ".pi/skills/",
682
+ "reason": "Pi reads project-local skills from .pi/skills/."
683
+ },
684
+ {
685
+ "kind": "substitute",
686
+ "id": "pi-command-setup",
687
+ "path": "**/*.md",
688
+ "regex": true,
689
+ "find": "(?<![A-Za-z0-9_/-])/setup-pstack",
690
+ "replace": "/pstack-setup",
691
+ "reason": "The extension registers the command as /pstack-setup, which is what Pi's command list shows. The lookbehind keeps the rule off link targets, because skills/setup-pstack/SKILL.md contains the same substring and rewriting it breaks every link to that skill."
692
+ },
693
+ {
694
+ "kind": "exclude",
695
+ "id": "exclude-make-bot-ui",
696
+ "path": "skills/make-bot-ui/**",
697
+ "reason": "Drives a Cursor Grok Bot webhook and api2.cursor.sh. Pi has no equivalent; skills/control-ui covers the same job locally."
698
+ },
699
+ {
700
+ "kind": "exclude",
701
+ "id": "exclude-worktree-audit-sh",
702
+ "path": "skills/poteto-mode/scripts/worktree-audit.sh",
703
+ "reason": "Replaced by the cross-platform worktree-audit.mjs so the playbook runs without bash."
704
+ },
705
+ {
706
+ "kind": "exclude",
707
+ "id": "exclude-log-sh",
708
+ "path": "skills/show-me-your-work/scripts/log.sh",
709
+ "reason": "Replaced by the cross-platform log.mjs so the skill runs without bash."
710
+ },
711
+ {
712
+ "kind": "add",
713
+ "id": "add-control-cli",
714
+ "path": "skills/control-cli/**",
715
+ "reason": "Pi-native skill with no upstream counterpart. Ships with this plugin."
716
+ },
717
+ {
718
+ "kind": "add",
719
+ "id": "add-control-ui",
720
+ "path": "skills/control-ui/**",
721
+ "reason": "Pi-native skill with no upstream counterpart. Ships with this plugin."
722
+ },
723
+ {
724
+ "kind": "add",
725
+ "id": "add-create-skill",
726
+ "path": "skills/create-skill/**",
727
+ "reason": "Pi-native skill with no upstream counterpart. Ships with this plugin."
728
+ },
729
+ {
730
+ "kind": "add",
731
+ "id": "add-deslop",
732
+ "path": "skills/deslop/**",
733
+ "reason": "Pi-native skill with no upstream counterpart. Ships with this plugin."
734
+ },
735
+ {
736
+ "kind": "add",
737
+ "id": "add-compare-doc",
738
+ "path": "docs/compare.md",
739
+ "reason": "This package's own comparison of upstream pstack and the other Pi port. Upstream has no counterpart."
740
+ },
741
+ {
742
+ "kind": "add",
743
+ "id": "add-worktree-audit-mjs",
744
+ "path": "skills/poteto-mode/scripts/worktree-audit.mjs",
745
+ "reason": "Cross-platform replacement for upstream's worktree-audit.sh."
746
+ },
747
+ {
748
+ "kind": "add",
749
+ "id": "add-log-mjs",
750
+ "path": "skills/show-me-your-work/scripts/log.mjs",
751
+ "reason": "Cross-platform replacement for upstream's log.sh."
752
+ }
753
+ ]
754
+ }