@jiroamato/pstack 0.0.0-stage → 0.15.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +78 -2
- package/bin/pstack.js +95 -0
- package/lib/install.js +103 -0
- package/lib/prompt.js +77 -0
- package/lib/targets.js +43 -0
- package/package.json +38 -5
- package/pstack/.claude-plugin/plugin.json +26 -0
- package/pstack/.codex-plugin/plugin.json +36 -0
- package/pstack/LICENSE +21 -0
- package/pstack/LICENSE-cursor-team-kit +21 -0
- package/pstack/NOTICE +8 -0
- package/pstack/README.md +300 -0
- package/pstack/agents/comment-sicko.md +34 -0
- package/pstack/agents/poteto-agent.md +10 -0
- package/pstack/automations/benny/FOR_AGENTS.md +92 -0
- package/pstack/automations/benny/README.md +28 -0
- package/pstack/automations/benny/skills/reproduce-and-fix-issues/SKILL.md +313 -0
- package/pstack/automations/benny/skills/reproduce-and-fix-issues/references/control-adapter.md +169 -0
- package/pstack/automations/benny/skills/reproduce-and-fix-issues/references/feature-map.example.md +205 -0
- package/pstack/automations/benny/skills/reproduce-and-fix-issues/references/verify-existing-fix.md +93 -0
- package/pstack/automations/benny/skills/setup-benny/SKILL.md +271 -0
- package/pstack/automations/benny/skills/triage-issue-reports/SKILL.md +240 -0
- package/pstack/automations/benny/skills/triage-issue-reports/references/routing.example.md +61 -0
- package/pstack/automations/benny/templates/configuration.example.yaml +84 -0
- package/pstack/automations/benny/templates/reproduce-automation-prompt.md +33 -0
- package/pstack/automations/benny/templates/triage-automation-prompt.md +39 -0
- package/pstack/codex/agents/comment-sicko.toml +36 -0
- package/pstack/codex/agents/poteto-agent.toml +11 -0
- package/pstack/docs/guide/01-setup.md +80 -0
- package/pstack/docs/guide/02-poteto-mode.md +131 -0
- package/pstack/docs/guide/03-understand.md +79 -0
- package/pstack/docs/guide/04-design.md +133 -0
- package/pstack/docs/guide/05-build-and-clean.md +83 -0
- package/pstack/docs/guide/06-verify-and-ship.md +130 -0
- package/pstack/docs/guide/07-overnight.md +120 -0
- package/pstack/docs/guide/08-principles.md +72 -0
- package/pstack/docs/guide/09-make-it-yours.md +100 -0
- package/pstack/docs/guide/10-recipes-and-pitfalls.md +156 -0
- package/pstack/docs/guide/README.md +38 -0
- package/pstack/skills/architect/SKILL.md +85 -0
- package/pstack/skills/architect/agents/openai.yaml +2 -0
- package/pstack/skills/architect/references/design-red-flags.md +57 -0
- package/pstack/skills/architect/references/rationale-template.md +35 -0
- package/pstack/skills/architect/references/runner-prompt.md +20 -0
- package/pstack/skills/arena/SKILL.md +75 -0
- package/pstack/skills/arena/agents/openai.yaml +2 -0
- package/pstack/skills/automate-me/SKILL.md +104 -0
- package/pstack/skills/automate-me/agents/openai.yaml +2 -0
- package/pstack/skills/benchmark-checklist/SKILL.md +39 -0
- package/pstack/skills/benchmark-checklist/agents/openai.yaml +2 -0
- package/pstack/skills/blast-radius/SKILL.md +52 -0
- package/pstack/skills/blast-radius/agents/openai.yaml +2 -0
- package/pstack/skills/bro/SKILL.md +7 -0
- package/pstack/skills/bro/agents/openai.yaml +2 -0
- package/pstack/skills/control-cli/SKILL.md +55 -0
- package/pstack/skills/control-cli/agents/openai.yaml +2 -0
- package/pstack/skills/control-ui/SKILL.md +72 -0
- package/pstack/skills/control-ui/agents/openai.yaml +2 -0
- package/pstack/skills/correct/SKILL.md +34 -0
- package/pstack/skills/correct/agents/openai.yaml +2 -0
- package/pstack/skills/create-verification-skill/SKILL.md +47 -0
- package/pstack/skills/create-verification-skill/agents/openai.yaml +2 -0
- package/pstack/skills/create-verification-skill/references/feature-map-example/README.md +47 -0
- package/pstack/skills/create-verification-skill/references/feature-map-example/create-note.md +39 -0
- package/pstack/skills/create-verification-skill/references/feature-map-example/search.md +45 -0
- package/pstack/skills/deslop/SKILL.md +30 -0
- package/pstack/skills/deslop/agents/openai.yaml +2 -0
- package/pstack/skills/figure-it-out/SKILL.md +55 -0
- package/pstack/skills/figure-it-out/agents/openai.yaml +2 -0
- package/pstack/skills/how/SKILL.md +58 -0
- package/pstack/skills/how/agents/openai.yaml +2 -0
- package/pstack/skills/how/references/explainer-prompt.md +55 -0
- package/pstack/skills/how/references/explorer-prompt.md +52 -0
- package/pstack/skills/interrogate/SKILL.md +111 -0
- package/pstack/skills/interrogate/agents/openai.yaml +2 -0
- package/pstack/skills/interrogate/references/code-quality-review.md +47 -0
- package/pstack/skills/interrogate/references/lead-judgment.md +58 -0
- package/pstack/skills/interrogate/references/reviewer-prompt.md +70 -0
- package/pstack/skills/interrogate/references/rubric.md +77 -0
- package/pstack/skills/maintain-verification-skill/SKILL.md +41 -0
- package/pstack/skills/maintain-verification-skill/agents/openai.yaml +2 -0
- package/pstack/skills/make-bot-ui/SKILL.md +289 -0
- package/pstack/skills/make-bot-ui/agents/openai.yaml +2 -0
- package/pstack/skills/no-comments/SKILL.md +24 -0
- package/pstack/skills/no-comments/agents/openai.yaml +2 -0
- package/pstack/skills/poteto-help/SKILL.md +156 -0
- package/pstack/skills/poteto-help/agents/openai.yaml +2 -0
- package/pstack/skills/poteto-help/references/prompting.md +51 -0
- package/pstack/skills/poteto-help/references/recipes.md +47 -0
- package/pstack/skills/poteto-mode/SKILL.md +143 -0
- package/pstack/skills/poteto-mode/agents/openai.yaml +2 -0
- package/pstack/skills/poteto-mode/playbooks/authoring-a-skill.md +12 -0
- package/pstack/skills/poteto-mode/playbooks/autonomous-run.md +13 -0
- package/pstack/skills/poteto-mode/playbooks/autopilot-full.md +13 -0
- package/pstack/skills/poteto-mode/playbooks/autopilot-stack.md +16 -0
- package/pstack/skills/poteto-mode/playbooks/babysit.md +29 -0
- package/pstack/skills/poteto-mode/playbooks/bug-fix.md +15 -0
- package/pstack/skills/poteto-mode/playbooks/eval.md +25 -0
- package/pstack/skills/poteto-mode/playbooks/feature.md +21 -0
- package/pstack/skills/poteto-mode/playbooks/hillclimb.md +21 -0
- package/pstack/skills/poteto-mode/playbooks/investigation.md +14 -0
- package/pstack/skills/poteto-mode/playbooks/multi-phase-plan.md +155 -0
- package/pstack/skills/poteto-mode/playbooks/opening-a-pr.md +38 -0
- package/pstack/skills/poteto-mode/playbooks/orchestrate.md +114 -0
- package/pstack/skills/poteto-mode/playbooks/pause-safely.md +10 -0
- package/pstack/skills/poteto-mode/playbooks/perf-issue.md +25 -0
- package/pstack/skills/poteto-mode/playbooks/prototype.md +14 -0
- package/pstack/skills/poteto-mode/playbooks/refactoring.md +16 -0
- package/pstack/skills/poteto-mode/playbooks/runtime-forensics.md +11 -0
- package/pstack/skills/poteto-mode/playbooks/session-pickup.md +11 -0
- package/pstack/skills/poteto-mode/playbooks/shipping.md +17 -0
- package/pstack/skills/poteto-mode/playbooks/trace-forensics.md +14 -0
- package/pstack/skills/poteto-mode/playbooks/visual-parity.md +11 -0
- package/pstack/skills/poteto-mode/playbooks/worktree-cleanup.md +14 -0
- package/pstack/skills/poteto-mode/references/bugbot-triage.md +142 -0
- package/pstack/skills/poteto-mode/scripts/bootstrap.ts +62 -0
- package/pstack/skills/poteto-mode/scripts/bun.lock +67 -0
- package/pstack/skills/poteto-mode/scripts/check-plan.mjs +185 -0
- package/pstack/skills/poteto-mode/scripts/orch/orch.test.ts +634 -0
- package/pstack/skills/poteto-mode/scripts/orch/orch.ts +578 -0
- package/pstack/skills/poteto-mode/scripts/orch/store.ts +1607 -0
- package/pstack/skills/poteto-mode/scripts/package.json +16 -0
- package/pstack/skills/poteto-mode/scripts/watch-pr/cli.test.ts +224 -0
- package/pstack/skills/poteto-mode/scripts/watch-pr/cli.ts +223 -0
- package/pstack/skills/poteto-mode/scripts/watch-pr/fakes.test-helper.ts +118 -0
- package/pstack/skills/poteto-mode/scripts/watch-pr/github.test.ts +306 -0
- package/pstack/skills/poteto-mode/scripts/watch-pr/github.ts +699 -0
- package/pstack/skills/poteto-mode/scripts/watch-pr/policy.test.ts +420 -0
- package/pstack/skills/poteto-mode/scripts/watch-pr/policy.ts +832 -0
- package/pstack/skills/poteto-mode/scripts/watch-pr/render.ts +169 -0
- package/pstack/skills/poteto-mode/scripts/watch-pr/tsconfig.json +13 -0
- package/pstack/skills/poteto-mode/scripts/watch-pr/types.compile.ts +93 -0
- package/pstack/skills/poteto-mode/scripts/watch-pr/types.ts +401 -0
- package/pstack/skills/poteto-mode/scripts/watch-pr/watch-pr +6 -0
- package/pstack/skills/poteto-mode/scripts/worktree-audit.sh +92 -0
- package/pstack/skills/principle-attack-the-premise/SKILL.md +23 -0
- package/pstack/skills/principle-attack-the-premise/agents/openai.yaml +2 -0
- package/pstack/skills/principle-boundary-discipline/SKILL.md +34 -0
- package/pstack/skills/principle-boundary-discipline/agents/openai.yaml +2 -0
- package/pstack/skills/principle-build-the-lever/SKILL.md +23 -0
- package/pstack/skills/principle-build-the-lever/agents/openai.yaml +2 -0
- package/pstack/skills/principle-encode-lessons-in-structure/SKILL.md +31 -0
- package/pstack/skills/principle-encode-lessons-in-structure/agents/openai.yaml +2 -0
- package/pstack/skills/principle-exhaust-the-design-space/SKILL.md +21 -0
- package/pstack/skills/principle-exhaust-the-design-space/agents/openai.yaml +2 -0
- package/pstack/skills/principle-experience-first/SKILL.md +19 -0
- package/pstack/skills/principle-experience-first/agents/openai.yaml +2 -0
- package/pstack/skills/principle-explain-the-number/SKILL.md +23 -0
- package/pstack/skills/principle-explain-the-number/agents/openai.yaml +2 -0
- package/pstack/skills/principle-fix-root-causes/SKILL.md +23 -0
- package/pstack/skills/principle-fix-root-causes/agents/openai.yaml +2 -0
- package/pstack/skills/principle-foundational-thinking/SKILL.md +21 -0
- package/pstack/skills/principle-foundational-thinking/agents/openai.yaml +2 -0
- package/pstack/skills/principle-guard-the-context-window/SKILL.md +16 -0
- package/pstack/skills/principle-guard-the-context-window/agents/openai.yaml +2 -0
- package/pstack/skills/principle-laziness-protocol/SKILL.md +18 -0
- package/pstack/skills/principle-laziness-protocol/agents/openai.yaml +2 -0
- package/pstack/skills/principle-make-operations-idempotent/SKILL.md +24 -0
- package/pstack/skills/principle-make-operations-idempotent/agents/openai.yaml +2 -0
- package/pstack/skills/principle-migrate-callers-then-delete-legacy-apis/SKILL.md +22 -0
- package/pstack/skills/principle-migrate-callers-then-delete-legacy-apis/agents/openai.yaml +2 -0
- package/pstack/skills/principle-minimize-reader-load/SKILL.md +23 -0
- package/pstack/skills/principle-minimize-reader-load/agents/openai.yaml +2 -0
- package/pstack/skills/principle-model-the-domain/SKILL.md +26 -0
- package/pstack/skills/principle-model-the-domain/agents/openai.yaml +2 -0
- package/pstack/skills/principle-never-block-on-the-human/SKILL.md +20 -0
- package/pstack/skills/principle-never-block-on-the-human/agents/openai.yaml +2 -0
- package/pstack/skills/principle-outcome-oriented-execution/SKILL.md +21 -0
- package/pstack/skills/principle-outcome-oriented-execution/agents/openai.yaml +2 -0
- package/pstack/skills/principle-prove-it-works/SKILL.md +22 -0
- package/pstack/skills/principle-prove-it-works/agents/openai.yaml +2 -0
- package/pstack/skills/principle-redesign-from-first-principles/SKILL.md +16 -0
- package/pstack/skills/principle-redesign-from-first-principles/agents/openai.yaml +2 -0
- package/pstack/skills/principle-separate-before-serializing-shared-state/SKILL.md +16 -0
- package/pstack/skills/principle-separate-before-serializing-shared-state/agents/openai.yaml +2 -0
- package/pstack/skills/principle-sequence-verifiable-units/SKILL.md +17 -0
- package/pstack/skills/principle-sequence-verifiable-units/agents/openai.yaml +2 -0
- package/pstack/skills/principle-subtract-before-you-add/SKILL.md +21 -0
- package/pstack/skills/principle-subtract-before-you-add/agents/openai.yaml +2 -0
- package/pstack/skills/principle-test-behavior-not-implementation/SKILL.md +25 -0
- package/pstack/skills/principle-test-behavior-not-implementation/agents/openai.yaml +2 -0
- package/pstack/skills/principle-type-system-discipline/SKILL.md +31 -0
- package/pstack/skills/principle-type-system-discipline/agents/openai.yaml +2 -0
- package/pstack/skills/pstack-harness/SKILL.md +67 -0
- package/pstack/skills/recall/SKILL.md +35 -0
- package/pstack/skills/recall/agents/openai.yaml +2 -0
- package/pstack/skills/reflect/SKILL.md +76 -0
- package/pstack/skills/reflect/agents/openai.yaml +2 -0
- package/pstack/skills/reflect/references/divergent-reviewer.md +43 -0
- package/pstack/skills/reflect/references/judgment-reviewer.md +42 -0
- package/pstack/skills/reflect/references/synthesizer.md +56 -0
- package/pstack/skills/reflect/references/tooling-reviewer.md +55 -0
- package/pstack/skills/setup-pstack/SKILL.md +110 -0
- package/pstack/skills/show-me-your-work/SKILL.md +82 -0
- package/pstack/skills/show-me-your-work/agents/openai.yaml +2 -0
- package/pstack/skills/show-me-your-work/references/decision-log-template.tsv +1 -0
- package/pstack/skills/show-me-your-work/scripts/log.sh +42 -0
- package/pstack/skills/swarm/SKILL.md +48 -0
- package/pstack/skills/swarm/agents/openai.yaml +2 -0
- package/pstack/skills/tdd/SKILL.md +44 -0
- package/pstack/skills/tdd/agents/openai.yaml +2 -0
- package/pstack/skills/teach/SKILL.md +21 -0
- package/pstack/skills/teach/agents/openai.yaml +2 -0
- package/pstack/skills/technical-writing/SKILL.md +106 -0
- package/pstack/skills/technical-writing/agents/openai.yaml +2 -0
- package/pstack/skills/typescript-best-practices/SKILL.md +31 -0
- package/pstack/skills/typescript-best-practices/agents/openai.yaml +2 -0
- package/pstack/skills/typescript-best-practices/references/patterns.md +324 -0
- package/pstack/skills/unslop/SKILL.md +67 -0
- package/pstack/skills/unslop/agents/openai.yaml +2 -0
- package/pstack/skills/why/SKILL.md +158 -0
- package/pstack/skills/why/agents/openai.yaml +2 -0
- package/pstack/skills/why/references/epistemics.md +144 -0
- package/pstack/skills/why/references/investigator-prompt.md +103 -0
- package/pstack/skills/why/references/source-playbook.md +17 -0
- package/pstack/skills/why/references/sources/code-archaeology.md +88 -0
- package/pstack/skills/why/references/sources/databricks.md +70 -0
- package/pstack/skills/why/references/sources/datadog.md +99 -0
- package/pstack/skills/why/references/sources/incident-postmortem.md +15 -0
- package/pstack/skills/why/references/sources/linear.md +48 -0
- package/pstack/skills/why/references/sources/notion.md +55 -0
- package/pstack/skills/why/references/sources/sentry.md +100 -0
- package/pstack/skills/why/references/sources/slack.md +54 -0
- package/pstack/skills/why/references/synthesizer-prompt.md +135 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Lauren Tan
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,79 @@
|
|
|
1
|
-
#
|
|
1
|
+
# pstack for Claude Code and Codex
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A port of [poteto's pstack](https://github.com/cursor/plugins/tree/main/pstack) from Cursor to Claude Code and Codex. Same skills, same playbooks, same twenty-four principles. One repo installs as a plugin on both.
|
|
4
|
+
|
|
5
|
+
The plugin lives in [`pstack/`](./pstack/). Its [README](./pstack/README.md) is the full guide. This file covers install and what the port changed.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
Two ways. As a plugin, which each tool updates for you and namespaces on Claude Code (`/pstack:poteto-mode`). Or copied into a skills directory with npx, which puts the files in your project or home directory where you can read and edit them, with bare names (`/poteto-mode`).
|
|
10
|
+
|
|
11
|
+
### With npx
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx @jiroamato/pstack
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
It asks which agent (Claude Code or Codex) and where (this project or your home directory), then copies the skills and the two agents there. Re-run it to update. `npx @jiroamato/pstack uninstall` removes what it installed. For scripts: `npx @jiroamato/pstack --agent claude --scope project`.
|
|
18
|
+
|
|
19
|
+
| agent | project | global |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| Claude Code | `.claude/skills/`, `.claude/agents/` | `~/.claude/skills/`, `~/.claude/agents/` |
|
|
22
|
+
| Codex | `.agents/skills/`, `.codex/agents/` | `~/.agents/skills/`, `~/.codex/agents/` |
|
|
23
|
+
|
|
24
|
+
### As a plugin
|
|
25
|
+
|
|
26
|
+
Claude Code:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
claude plugin marketplace add jiroamato/pstack
|
|
30
|
+
claude plugin install pstack@pstack-plugins
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Codex:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
codex plugin marketplace add jiroamato/pstack
|
|
37
|
+
codex plugin add pstack
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Then, in a new session, run `/pstack:setup-pstack` (Claude Code) or `$setup-pstack` (Codex) once to pick models, and start any rigorous task with `/pstack:poteto-mode` or `$poteto-mode`. Drop the `pstack:` prefix after an npx install.
|
|
41
|
+
|
|
42
|
+
Two Codex notes. Most pstack skills are user-invoked, so they stay out of the model's skill list until you type their `$name` in the composer. In `codex exec` scripts that mention is not resolved, so pass the skill's `SKILL.md` path in the prompt instead. And if you already have a user skill with the same name as a pstack skill (`tdd` and `unslop` are common), Codex treats the bare `$name` as ambiguous and attaches neither. Rename or remove one of them.
|
|
43
|
+
|
|
44
|
+
## What the port changed
|
|
45
|
+
|
|
46
|
+
pstack's skills are written in the Agent Skills format, so they load on both harnesses as they are. What differed was everything the skills assumed about Cursor: how to spawn a subagent, how to pick a model per role, where transcripts live, how to loop, how to keep a mode on. The port routes all of that through one adapter skill, [`pstack-harness`](./pstack/skills/pstack-harness/SKILL.md), and the other skills reference its rows by name. One file to maintain when a harness changes.
|
|
47
|
+
|
|
48
|
+
- `pstack/.claude-plugin/plugin.json` and `pstack/.codex-plugin/plugin.json` are the two manifests. `.claude-plugin/marketplace.json` and `.agents/plugins/marketplace.json` at the repo root make the repo installable as a marketplace on each tool.
|
|
49
|
+
- `pstack/agents/` holds the Claude Code subagents (`poteto-agent`, `comment-sicko`). `pstack/codex/agents/` holds the same two as Codex TOML, which `setup-pstack` installs into `~/.codex/agents/` because Codex plugins cannot ship agents.
|
|
50
|
+
- `~/.pstack/models.md` replaces Cursor's always-applied model rule. It has one section per harness. `setup-pstack` writes it.
|
|
51
|
+
- Every skill that had `disable-model-invocation: true` also has an `agents/openai.yaml` with `allow_implicit_invocation: false`, so Codex treats it as user-invoked too.
|
|
52
|
+
- [`deslop`](./pstack/skills/deslop/SKILL.md), [`control-cli`](./pstack/skills/control-cli/SKILL.md), and [`control-ui`](./pstack/skills/control-ui/SKILL.md) are bundled from Cursor's team kit and adapted for both harnesses. Code-writing workflows load `deslop`; web/IDE/Electron workflows load `control-ui`, and CLI/TUI workflows load `control-cli`. Project `verify-<app>` skills supply app-specific commands and selectors alongside those drivers. There is no separate `control` skill. They use available terminal/browser tools; no separate team-kit plugin is needed.
|
|
53
|
+
- `make-bot-ui` lost its Cursor Grok Bot webhook. It now wakes a Claude Code session over a channel, Claude Code with the reply on Telegram, or a ChatGPT Dot through Slack. Cloud subagents became git worktrees.
|
|
54
|
+
|
|
55
|
+
Upstream version at the time of the port: 0.15.15.
|
|
56
|
+
|
|
57
|
+
## Layout
|
|
58
|
+
|
|
59
|
+
```text
|
|
60
|
+
.
|
|
61
|
+
├── .claude-plugin/marketplace.json Claude Code marketplace entry -> ./pstack
|
|
62
|
+
├── .agents/plugins/marketplace.json Codex marketplace entry -> ./pstack
|
|
63
|
+
├── package.json the npm package, @jiroamato/pstack
|
|
64
|
+
├── bin/pstack.js the npx installer
|
|
65
|
+
├── lib/ its install logic and menu
|
|
66
|
+
├── test/ its tests, `npm test`
|
|
67
|
+
└── pstack/ the plugin
|
|
68
|
+
├── .claude-plugin/plugin.json
|
|
69
|
+
├── .codex-plugin/plugin.json
|
|
70
|
+
├── agents/ Claude Code subagents
|
|
71
|
+
├── codex/agents/ Codex agent TOML, installed by setup-pstack
|
|
72
|
+
├── skills/ the skills, plus pstack-harness
|
|
73
|
+
├── docs/guide/ the pstack guide
|
|
74
|
+
└── automations/benny/ dormant automation pack
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## License
|
|
78
|
+
|
|
79
|
+
MIT. The pstack skills are copyright Lauren Tan (poteto), from [cursor/plugins](https://github.com/cursor/plugins). The bundled team-kit skills are copyright Cursor. This port keeps both licenses; see [NOTICE](./pstack/NOTICE) and [LICENSE-cursor-team-kit](./pstack/LICENSE-cursor-team-kit).
|
package/bin/pstack.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { parseArgs } from "node:util";
|
|
3
|
+
import { AGENTS, SCOPES, resolveTarget } from "../lib/targets.js";
|
|
4
|
+
import { install, uninstall, findConflicts, VERSION } from "../lib/install.js";
|
|
5
|
+
import { select, confirm } from "../lib/prompt.js";
|
|
6
|
+
|
|
7
|
+
const USAGE = `pstack ${VERSION}
|
|
8
|
+
|
|
9
|
+
Usage:
|
|
10
|
+
npx @jiroamato/pstack [install] [options]
|
|
11
|
+
npx @jiroamato/pstack uninstall [options]
|
|
12
|
+
|
|
13
|
+
Options:
|
|
14
|
+
--agent <claude|codex> which harness to install for
|
|
15
|
+
--scope <project|global> this project (cwd) or your home directory
|
|
16
|
+
--force overwrite same-named skills pstack did not install
|
|
17
|
+
--help show this text
|
|
18
|
+
|
|
19
|
+
With no options the command asks. Re-running install upgrades in place.`;
|
|
20
|
+
|
|
21
|
+
function fail(message) {
|
|
22
|
+
process.stderr.write(`pstack: ${message}\n`);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async function main() {
|
|
27
|
+
const { values, positionals } = parseArgs({
|
|
28
|
+
allowPositionals: true,
|
|
29
|
+
options: {
|
|
30
|
+
agent: { type: "string" },
|
|
31
|
+
scope: { type: "string" },
|
|
32
|
+
force: { type: "boolean", default: false },
|
|
33
|
+
help: { type: "boolean", default: false },
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
if (values.help) return console.log(USAGE);
|
|
37
|
+
|
|
38
|
+
const command = positionals[0] ?? "install";
|
|
39
|
+
if (!["install", "uninstall"].includes(command)) fail(`unknown command "${command}"\n\n${USAGE}`);
|
|
40
|
+
if (values.agent && !AGENTS[values.agent]) fail(`--agent must be one of: ${Object.keys(AGENTS).join(", ")}`);
|
|
41
|
+
if (values.scope && !SCOPES[values.scope]) fail(`--scope must be one of: ${Object.keys(SCOPES).join(", ")}`);
|
|
42
|
+
|
|
43
|
+
const interactive = process.stdin.isTTY;
|
|
44
|
+
if ((!values.agent || !values.scope) && !interactive) fail("pass --agent and --scope when stdin is not a terminal");
|
|
45
|
+
|
|
46
|
+
const agent =
|
|
47
|
+
values.agent ??
|
|
48
|
+
(await select(
|
|
49
|
+
`Which agent should pstack be ${command}ed for?`,
|
|
50
|
+
Object.entries(AGENTS).map(([value, spec]) => ({ value, label: spec.label })),
|
|
51
|
+
));
|
|
52
|
+
const scope =
|
|
53
|
+
values.scope ??
|
|
54
|
+
(await select(
|
|
55
|
+
`Where should it be ${command}ed?`,
|
|
56
|
+
Object.entries(SCOPES).map(([value, spec]) => ({ value, label: `${spec.label} (${spec.describe(process.cwd())})` })),
|
|
57
|
+
));
|
|
58
|
+
|
|
59
|
+
if (command === "uninstall") {
|
|
60
|
+
const removed = uninstall({ agent, scope });
|
|
61
|
+
if (!removed) return console.log(`Nothing to remove: no pstack install found for ${AGENTS[agent].label} (${scope}).`);
|
|
62
|
+
return console.log(`Removed ${removed.skills.length} skills and ${removed.agents.length} agents from ${removed.target.skillsRef}.`);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
let force = values.force;
|
|
66
|
+
const conflicts = force ? [] : findConflicts(resolveTarget({ agent, scope }));
|
|
67
|
+
if (conflicts.length > 0) {
|
|
68
|
+
console.log(`These skills already exist and were not installed by pstack: ${conflicts.join(", ")}`);
|
|
69
|
+
if (!interactive || !(await confirm("Overwrite them?"))) fail("aborted. Re-run with --force to overwrite.");
|
|
70
|
+
force = true;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const result = install({ agent, scope, force });
|
|
74
|
+
const verb = result.upgraded ? "Updated" : "Installed";
|
|
75
|
+
console.log(`${verb} pstack ${VERSION} for ${AGENTS[agent].label}: ${result.skills.length} skills in ${result.target.skillsRef}, ${result.agents.length} agents next to them.`);
|
|
76
|
+
console.log(agent === "claude" ? nextStepsClaude() : nextStepsCodex());
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function nextStepsClaude() {
|
|
80
|
+
return `
|
|
81
|
+
Next, in a new Claude Code session:
|
|
82
|
+
/setup-pstack pick models once
|
|
83
|
+
/poteto-mode <task> start any rigorous task
|
|
84
|
+
|
|
85
|
+
Skills are not namespaced here, so type /poteto-mode, not /pstack:poteto-mode.`;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function nextStepsCodex() {
|
|
89
|
+
return `
|
|
90
|
+
Next, in a new Codex session:
|
|
91
|
+
$setup-pstack pick models once
|
|
92
|
+
$poteto-mode <task> start any rigorous task`;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
main().catch((error) => fail(error.message));
|
package/lib/install.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { resolveTarget } from "./targets.js";
|
|
5
|
+
|
|
6
|
+
const PACKAGE_ROOT = fileURLToPath(new URL("..", import.meta.url));
|
|
7
|
+
export const PLUGIN_ROOT = path.join(PACKAGE_ROOT, "pstack");
|
|
8
|
+
export const VERSION = JSON.parse(fs.readFileSync(path.join(PACKAGE_ROOT, "package.json"), "utf8")).version;
|
|
9
|
+
|
|
10
|
+
export function listSkills(pluginRoot = PLUGIN_ROOT) {
|
|
11
|
+
const dir = path.join(pluginRoot, "skills");
|
|
12
|
+
return fs
|
|
13
|
+
.readdirSync(dir, { withFileTypes: true })
|
|
14
|
+
.filter((entry) => entry.isDirectory() && fs.existsSync(path.join(dir, entry.name, "SKILL.md")))
|
|
15
|
+
.map((entry) => entry.name)
|
|
16
|
+
.sort();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function listAgents(target, pluginRoot = PLUGIN_ROOT) {
|
|
20
|
+
return fs
|
|
21
|
+
.readdirSync(path.join(pluginRoot, target.agentSource))
|
|
22
|
+
.filter((name) => name.endsWith(target.agentExt))
|
|
23
|
+
.map((name) => name.slice(0, -target.agentExt.length))
|
|
24
|
+
.sort();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function readManifest(target) {
|
|
28
|
+
if (!fs.existsSync(target.manifest)) return null;
|
|
29
|
+
return JSON.parse(fs.readFileSync(target.manifest, "utf8"));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Skill names already present at the target that no pstack manifest claims.
|
|
34
|
+
* Overwriting those would clobber the user's own skill of the same name.
|
|
35
|
+
*/
|
|
36
|
+
export function findConflicts(target, skills = listSkills()) {
|
|
37
|
+
const owned = new Set(readManifest(target)?.skills ?? []);
|
|
38
|
+
return skills.filter((name) => !owned.has(name) && fs.existsSync(path.join(target.skillsRoot, name)));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function rewriteAgent(text, target) {
|
|
42
|
+
const skillPath = (skill) => `${target.skillsRef}/${skill}/SKILL.md`;
|
|
43
|
+
if (target.agent === "claude") {
|
|
44
|
+
return text.replaceAll("${CLAUDE_PLUGIN_ROOT}/skills/", `${target.skillsRef}/`);
|
|
45
|
+
}
|
|
46
|
+
return text
|
|
47
|
+
.replace(/^# Installed into .*\n(#.*\n)*/, `# Installed by npx @jiroamato/pstack. setup-pstack fills in model and effort.\n`)
|
|
48
|
+
.replace("<setup-pstack fills this in>\n", `${skillPath("poteto-mode")}\n`);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function install(options) {
|
|
52
|
+
const target = resolveTarget(options);
|
|
53
|
+
const pluginRoot = options.pluginRoot ?? PLUGIN_ROOT;
|
|
54
|
+
const skills = listSkills(pluginRoot);
|
|
55
|
+
const agents = listAgents(target, pluginRoot);
|
|
56
|
+
|
|
57
|
+
const conflicts = findConflicts(target, skills);
|
|
58
|
+
if (conflicts.length > 0 && !options.force) {
|
|
59
|
+
const error = new Error(`existing skills not installed by pstack: ${conflicts.join(", ")}`);
|
|
60
|
+
error.conflicts = conflicts;
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const previous = readManifest(target);
|
|
65
|
+
for (const name of previous?.skills ?? []) {
|
|
66
|
+
if (!skills.includes(name)) fs.rmSync(path.join(target.skillsRoot, name), { recursive: true, force: true });
|
|
67
|
+
}
|
|
68
|
+
for (const name of previous?.agents ?? []) {
|
|
69
|
+
if (!agents.includes(name)) fs.rmSync(path.join(target.agentsRoot, name + target.agentExt), { force: true });
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
fs.mkdirSync(target.skillsRoot, { recursive: true });
|
|
73
|
+
for (const name of skills) {
|
|
74
|
+
const dest = path.join(target.skillsRoot, name);
|
|
75
|
+
fs.rmSync(dest, { recursive: true, force: true });
|
|
76
|
+
fs.cpSync(path.join(pluginRoot, "skills", name), dest, { recursive: true });
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
fs.mkdirSync(target.agentsRoot, { recursive: true });
|
|
80
|
+
for (const name of agents) {
|
|
81
|
+
const file = name + target.agentExt;
|
|
82
|
+
const text = fs.readFileSync(path.join(pluginRoot, target.agentSource, file), "utf8");
|
|
83
|
+
fs.writeFileSync(path.join(target.agentsRoot, file), rewriteAgent(text, target));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const manifest = { version: VERSION, agent: target.agent, scope: target.scope, skills, agents };
|
|
87
|
+
fs.writeFileSync(target.manifest, JSON.stringify(manifest, null, "\t") + "\n");
|
|
88
|
+
return { target, skills, agents, upgraded: Boolean(previous) };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function uninstall(options) {
|
|
92
|
+
const target = resolveTarget(options);
|
|
93
|
+
const manifest = readManifest(target);
|
|
94
|
+
if (!manifest) return null;
|
|
95
|
+
for (const name of manifest.skills) {
|
|
96
|
+
fs.rmSync(path.join(target.skillsRoot, name), { recursive: true, force: true });
|
|
97
|
+
}
|
|
98
|
+
for (const name of manifest.agents) {
|
|
99
|
+
fs.rmSync(path.join(target.agentsRoot, name + target.agentExt), { force: true });
|
|
100
|
+
}
|
|
101
|
+
fs.rmSync(target.manifest, { force: true });
|
|
102
|
+
return { target, ...manifest };
|
|
103
|
+
}
|
package/lib/prompt.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import readline from "node:readline/promises";
|
|
2
|
+
|
|
3
|
+
const CSI = "\x1b[";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Arrow-key menu on a TTY, numbered prompt otherwise. Returns the chosen option's value.
|
|
7
|
+
*/
|
|
8
|
+
export async function select(title, options) {
|
|
9
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) return selectByNumber(title, options);
|
|
10
|
+
return selectByArrows(title, options);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export async function confirm(question) {
|
|
14
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
15
|
+
try {
|
|
16
|
+
const answer = (await rl.question(`${question} [y/N] `)).trim().toLowerCase();
|
|
17
|
+
return answer === "y" || answer === "yes";
|
|
18
|
+
} finally {
|
|
19
|
+
rl.close();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async function selectByNumber(title, options) {
|
|
24
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
25
|
+
try {
|
|
26
|
+
for (;;) {
|
|
27
|
+
process.stdout.write(`${title}\n`);
|
|
28
|
+
options.forEach((option, index) => process.stdout.write(` ${index + 1}) ${option.label}\n`));
|
|
29
|
+
const answer = (await rl.question(`Choose 1-${options.length}: `)).trim();
|
|
30
|
+
const index = Number.parseInt(answer, 10) - 1;
|
|
31
|
+
if (options[index]) return options[index].value;
|
|
32
|
+
}
|
|
33
|
+
} finally {
|
|
34
|
+
rl.close();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function selectByArrows(title, options) {
|
|
39
|
+
const { stdin, stdout } = process;
|
|
40
|
+
let cursor = 0;
|
|
41
|
+
|
|
42
|
+
const render = (first) => {
|
|
43
|
+
if (!first) stdout.write(`${CSI}${options.length}A`);
|
|
44
|
+
for (const [index, option] of options.entries()) {
|
|
45
|
+
const marker = index === cursor ? "❯" : " ";
|
|
46
|
+
const label = index === cursor ? `${CSI}36m${option.label}${CSI}0m` : option.label;
|
|
47
|
+
stdout.write(`${CSI}2K${marker} ${label}\n`);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
stdout.write(`${title}\n`);
|
|
52
|
+
render(true);
|
|
53
|
+
|
|
54
|
+
return new Promise((resolve) => {
|
|
55
|
+
const finish = (value) => {
|
|
56
|
+
stdin.setRawMode(false);
|
|
57
|
+
stdin.off("data", onKey);
|
|
58
|
+
stdin.pause();
|
|
59
|
+
resolve(value);
|
|
60
|
+
};
|
|
61
|
+
const onKey = (key) => {
|
|
62
|
+
const code = key.toString();
|
|
63
|
+
if (code === "\x03") {
|
|
64
|
+
stdout.write("\n");
|
|
65
|
+
process.exit(130);
|
|
66
|
+
}
|
|
67
|
+
if (code === `${CSI}A` || code === "k") cursor = (cursor - 1 + options.length) % options.length;
|
|
68
|
+
else if (code === `${CSI}B` || code === "j") cursor = (cursor + 1) % options.length;
|
|
69
|
+
else if (code === "\r" || code === "\n") return finish(options[cursor].value);
|
|
70
|
+
else return;
|
|
71
|
+
render(false);
|
|
72
|
+
};
|
|
73
|
+
stdin.setRawMode(true);
|
|
74
|
+
stdin.resume();
|
|
75
|
+
stdin.on("data", onKey);
|
|
76
|
+
});
|
|
77
|
+
}
|
package/lib/targets.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
|
|
4
|
+
export const AGENTS = {
|
|
5
|
+
claude: {
|
|
6
|
+
label: "Claude Code",
|
|
7
|
+
skillsDir: [".claude", "skills"],
|
|
8
|
+
agentsDir: [".claude", "agents"],
|
|
9
|
+
agentSource: "agents",
|
|
10
|
+
agentExt: ".md",
|
|
11
|
+
},
|
|
12
|
+
codex: {
|
|
13
|
+
label: "Codex",
|
|
14
|
+
skillsDir: [".agents", "skills"],
|
|
15
|
+
agentsDir: [".codex", "agents"],
|
|
16
|
+
agentSource: path.join("codex", "agents"),
|
|
17
|
+
agentExt: ".toml",
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export const SCOPES = {
|
|
22
|
+
project: { label: "This project", describe: (root) => root },
|
|
23
|
+
global: { label: "Global (your home directory)", describe: () => "~" },
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export function resolveTarget({ agent, scope, cwd = process.cwd(), home = os.homedir() }) {
|
|
27
|
+
const spec = AGENTS[agent];
|
|
28
|
+
const root = scope === "global" ? home : cwd;
|
|
29
|
+
const skillsRoot = path.join(root, ...spec.skillsDir);
|
|
30
|
+
const agentsRoot = path.join(root, ...spec.agentsDir);
|
|
31
|
+
const displayRoot = scope === "global" ? "~" : ".";
|
|
32
|
+
return {
|
|
33
|
+
agent,
|
|
34
|
+
scope,
|
|
35
|
+
root,
|
|
36
|
+
skillsRoot,
|
|
37
|
+
agentsRoot,
|
|
38
|
+
manifest: path.join(root, spec.skillsDir[0], "pstack.json"),
|
|
39
|
+
skillsRef: [displayRoot, ...spec.skillsDir].join("/"),
|
|
40
|
+
agentSource: spec.agentSource,
|
|
41
|
+
agentExt: spec.agentExt,
|
|
42
|
+
};
|
|
43
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,39 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
"name": "@jiroamato/pstack",
|
|
3
|
+
"version": "0.15.15",
|
|
4
|
+
"description": "poteto's pstack for Claude Code and Codex. npx installer: copies the skills and agents into your project or your home directory.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"pstack",
|
|
7
|
+
"poteto-mode",
|
|
8
|
+
"claude-code",
|
|
9
|
+
"codex",
|
|
10
|
+
"skills",
|
|
11
|
+
"agents"
|
|
12
|
+
],
|
|
13
|
+
"homepage": "https://github.com/jiroamato/pstack",
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git+https://github.com/jiroamato/pstack.git"
|
|
17
|
+
},
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"author": "jiroamato",
|
|
20
|
+
"type": "module",
|
|
21
|
+
"bin": {
|
|
22
|
+
"pstack": "bin/pstack.js"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"bin",
|
|
26
|
+
"lib",
|
|
27
|
+
"pstack",
|
|
28
|
+
"!pstack/assets",
|
|
29
|
+
"!pstack/docs/guide/images",
|
|
30
|
+
"README.md",
|
|
31
|
+
"LICENSE"
|
|
32
|
+
],
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=20"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"test": "node --test \"test/**/*.test.js\""
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pstack",
|
|
3
|
+
"displayName": "pstack",
|
|
4
|
+
"version": "0.15.15",
|
|
5
|
+
"description": "if you want to go fast, go deep first. pstack helps you write less, but higher quality code. rigorous agent workflows you can parallelize with confidence.",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "Lauren Tan"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/jiroamato/pstack",
|
|
10
|
+
"repository": "https://github.com/jiroamato/pstack",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"pstack",
|
|
14
|
+
"poteto-mode",
|
|
15
|
+
"workflow",
|
|
16
|
+
"principles",
|
|
17
|
+
"agent-style",
|
|
18
|
+
"subagents",
|
|
19
|
+
"unslop"
|
|
20
|
+
],
|
|
21
|
+
"metadata": {
|
|
22
|
+
"upstream": "https://github.com/cursor/plugins/tree/main/pstack",
|
|
23
|
+
"upstreamVersion": "0.15.15",
|
|
24
|
+
"port": "Claude Code and Codex port by jiroamato"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
|
+
"name": "pstack",
|
|
4
|
+
"version": "0.15.15",
|
|
5
|
+
"description": "if you want to go fast, go deep first. pstack helps you write less, but higher quality code. rigorous agent workflows you can parallelize with confidence.",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "Lauren Tan"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/jiroamato/pstack",
|
|
10
|
+
"repository": "https://github.com/jiroamato/pstack",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"pstack",
|
|
14
|
+
"poteto-mode",
|
|
15
|
+
"workflow",
|
|
16
|
+
"principles",
|
|
17
|
+
"agent-style",
|
|
18
|
+
"subagents",
|
|
19
|
+
"unslop"
|
|
20
|
+
],
|
|
21
|
+
"extensions": {
|
|
22
|
+
"com.openai": {
|
|
23
|
+
"interface": {
|
|
24
|
+
"displayName": "pstack",
|
|
25
|
+
"shortDescription": "Rigorous agent workflows you can parallelize",
|
|
26
|
+
"longDescription": "poteto's engineering skills for Codex: poteto-mode playbooks, how, why, architect, arena, swarm, interrogate, tdd, unslop, and twenty-four one-rule principles. Ported from the Cursor plugin.",
|
|
27
|
+
"developerName": "jiroamato",
|
|
28
|
+
"category": "Developer Tools",
|
|
29
|
+
"capabilities": ["Read", "Write"],
|
|
30
|
+
"websiteURL": "https://github.com/jiroamato/pstack",
|
|
31
|
+
"defaultPrompt": ["Use $poteto-mode to fix this bug. Reproduce first, then fix and verify."],
|
|
32
|
+
"logo": "./assets/logo.png"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
package/pstack/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Lauren Tan
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Cursor
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/pstack/NOTICE
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
The deslop, control-cli, and control-ui skills are adapted from cursor-team-kit:
|
|
2
|
+
https://github.com/cursor/plugins/tree/d0ef80d86795816da932a153458c5dbe192d294e/cursor-team-kit
|
|
3
|
+
|
|
4
|
+
Copyright (c) 2026 Cursor
|
|
5
|
+
Licensed under the MIT License, reproduced in LICENSE-cursor-team-kit.
|
|
6
|
+
|
|
7
|
+
The port adds Claude Code and Codex invocation policies, platform-specific
|
|
8
|
+
tool selection, branch and working-diff selection, and evidence/cleanup guidance.
|