Skip to content

feat(pstack): install pstack in Claude Code from a generated tree - #637

Merged
poteto merged 22 commits into
mainfrom
lauren/pstack-harness-adapters-bc8e
Oct 16, 2026
Merged

poteto merged 22 commits into
mainfrom
lauren/pstack-harness-adapters-bc8e

Conversation

@poteto

@poteto poteto commented Oct 15, 2026 •

Copy link
Copy Markdown
Collaborator

Why

Claude Code users can now install pstack from this repo with claude plugin install pstack@cursor-plugins, as the run under Verification shows. On main, .claude-plugin/marketplace.json does not list pstack, and the skills name Cursor tools, subagent fields, and model slugs that Claude Code calls by other names. This PR adds a generated copy of the skills for Claude Code and an adapter that maps those names. Maintainers inherit one step. After an edit to pstack skills, agents, the adapter, or pstack/plugin.json, run node scripts/generate-pstack-harness-trees.mjs and commit the result.

What changed

  • scripts/generate-pstack-harness-trees.mjs builds harness/pstack/claude-code from pstack/skills, pstack/agents, the adapter at pstack/docs/harness/claude-code.md, the license, and the plugin manifests. It adds one line under the title of the 21 skills that use Cursor names, and that line links to the adapter.
  • .claude-plugin/marketplace.json lists pstack at harness/pstack/claude-code. This PR commits the tree, because a Claude Code install copies the plugin folder and runs no build.
  • CI runs the generator with --check. The check fails on a stale tree, on a relative link that does not resolve inside the tree, and on a Cursor name with no row in the adapter. scripts/validate-plugins.mjs now also checks the Claude Code marketplace entries.

Scope

  • Cursor loads the same skills and agents as before. pstack/skills and pstack/agents match main byte for byte, checked with git diff --quiet.
  • The tree holds the skills, the agents, the adapter, the license, and the manifests. It leaves out the guide, the README, pstack/assets, and pstack/automations. A relative link to a left-out file becomes a link to that file on GitHub main.
  • Codex is out of scope. This PR does not bump the version.

Tradeoffs

  • The tree holds full skill copies, not thin pointer files. A pointer SKILL.md makes the first request about 480 tokens smaller. Each load then reads the real file in a second call and costs 104 to 186 more tokens. I measured both shapes with the o200k tokenizer at an earlier head of this branch.
  • The tree sits at the repo root, not under pstack/. A Cursor install of pstack on the test machine holds assets/, automations/, docs/, and README.md, so Cursor copies the whole plugin folder. The tree is 138 files and 643,022 bytes, measured with git ls-tree -l, and a tree under pstack/ would add that to every Cursor install.
  • Guide links point at GitHub main. A link can show a newer page than the installed version, and it needs the network. poteto-help reads a guide page before it quotes it. In Claude Code that read is a WebFetch call, and an interactive session asks permission for it.
  • This PR does not block Codex. Codex reads .claude-plugin/marketplace.json when a repo has no .agents/plugins/marketplace.json, as marketplace.rs in openai/codex shows. So a Codex user who adds this marketplace can install the Claude Code tree, as Bugbot pointed out. Main already exposes its one listed plugin to Codex the same way. A block would need a Codex marketplace file that lists that plugin and leaves out pstack. This PR adds no Codex files, so it leaves the fallback alone.

Blast Radius

The pstack/ folder that Cursor installs is 170 files and 3,487,581 bytes, against 169 files and 3,483,454 bytes on main, measured with git ls-tree -l. The new file is the Claude Code adapter. No current Claude Code user sees a change, because this repo had no pstack install path for Claude Code. When I counted with gh pr list, 47 open PRs edited pstack/skills. Each one that lands after this PR must regenerate the tree, or CI fails.

Verification

  • Claude Code 2.1.301 ran in a fresh HOME at e84046f. claude plugin marketplace add took a git URL to a local HTTPS copy of this branch, because Claude Code rejects file://. claude plugin install pstack@cursor-plugins installed a copy that matches harness/pstack/claude-code under diff -r. claude plugin details lists 54 skills and 2 agents, and the skill names match pstack/skills.
  • A real /pstack:setup-pstack dry run loaded SKILL.md and the adapter from the installed copy. A /pstack:poteto-help run found no guide page in the install, fetched the page from GitHub main, and quoted it. The test machine had no Anthropic API key, so Claude Code sent its model calls through a local LiteLLM proxy to OpenAI gpt-5.5. The install, the skill load, and the file reads are Claude Code's own, and only the model differs. At an earlier head, runs on Claude Sonnet 5.5 read setup-pstack, architect, a reference file, and the adapter from the installed copy. Those files are byte-identical at this head.
  • node scripts/generate-pstack-harness-trees.mjs --check and node scripts/validate-plugins.mjs pass. A link check over the tree resolves 86 of 87 relative links. The one left is a template placeholder that is also unresolved on main. A skill edit without a regenerate makes --check name the stale file, print the regenerate command, and exit 1.
Open in Web Open in Cursor 

Note

Low Risk
Packaging, docs, and CI around generated plugin artifacts; core Cursor skills are unchanged and there is no runtime or security-sensitive logic in the app itself.

Reviewed by Cursor Bugbot for commit e84046f. Bugbot is set up for automated code reviews on this repo. Configure here.

sirine-jnayeh and others added 8 commits October 15, 2026 19:50
Partial cherry-pick of d4d1e65 from #629. It keeps the Claude Code
manifest, the marketplace entry, and the README install lines. The
manifest version matches the other two manifests.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Partial cherry-pick of 8543ac8 from #629. It keeps the validate-plugins.mjs
checks. The workflow change is left out, as #629 also reverted it in 6bcc06b,
so the comment that says CI runs `claude plugin validate` is dropped too.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The check fails on this tree until the next commit runs it with --fix.
…adapters

Generated by node scripts/check-pstack-harness.mjs --fix.
Codex reads .agents/plugins/marketplace.json before .claude-plugin/marketplace.json, so it lists origin-apps too.
Name the relative-link test in check-pstack-harness.mjs linksToSkill so it reads without a comment.

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread pstack/docs/harness/claude-code.md
Comment thread pstack/docs/harness/codex.md Outdated
cursoragent and others added 6 commits October 15, 2026 20:55
…harness check

Core skills stay byte-identical to main. Claude Code and Codex get their own generated trees in a later commit.
Other workspaces share the Codex sessions tree, so cutting to the newest files first can drop the current session. Also name where Claude Code keeps subagent transcripts.
Core pstack/skills stays untouched and Cursor keeps using pstack/
directly. scripts/generate-pstack-harness-trees.mjs renders one tree per
harness under pstack/harness/, each a byte copy of skills and agents plus
that harness's adapter, its manifest, an adapter line in every SKILL.md
that uses Cursor names, and for Codex the sidecars that hide
disable-model-invocation skills. The Claude Code and Codex marketplaces
now install those trees.

CI runs the generator with --check and fails on drift, printing the
regenerate command.
…esolve

poteto-help links ../../README.md and ../../docs/guide/*.md, which dangled in both generated trees. Each tree now also holds pstack/README.md and every .md under pstack/docs, which covers the adapters, so their special case is gone.
@cursor cursor Bot changed the title feat(pstack): add Claude Code and Codex adapters feat(pstack): install pstack in Claude Code and Codex from generated trees Oct 16, 2026

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread scripts/generate-pstack-harness-trees.mjs Outdated
cursoragent and others added 8 commits October 16, 2026 01:21
…ship

The generator copied only Markdown under pstack/docs, so the six
docs/guide/images/*.jpg files that the guide pages link to were missing
from both harness trees.

Co-authored-by: lauren <[email protected]>
…t install them

Cursor installs a marketplace plugin by copying its whole source folder, so trees under pstack/harness tripled the Cursor install. Move them to harness/pstack at the repository root, point the Claude Code and Codex marketplaces there, and link the pstack readme to the new folder on GitHub.
The pstack readme and the overnight guide link to automations/benny, which the harness trees did not include.
A relative link that resolves from pstack/ must resolve inside each generated tree, because Claude Code and Codex install only the tree.
… out

Stop copying automations into the harness trees. When a relative link resolves from pstack/ but its target is not in a tree, the generator renders it as the file's GitHub URL on main, using /tree/ for directories. A link that leaves pstack/ still fails generation.
The trees moved from pstack/harness to harness/pstack, so the old linguist-generated pattern matched nothing and GitHub showed the generated files as hand-written in review.
Each tree now copies skills/, agents/, and only its own harness adapter,
which the adapter line in 21 SKILL.md files tells the model to read.
Links from poteto-help to the README and guide pages point at GitHub main.

Co-authored-by: lauren <[email protected]>
Removes harness/pstack/codex, the Codex adapter, the .agents marketplace,
the Codex sidecars and tree in the generator, and the Codex checks in
validate-plugins.mjs. The Claude Code tree is unchanged.

Co-authored-by: lauren <[email protected]>
@cursor cursor Bot changed the title feat(pstack): install pstack in Claude Code and Codex from generated trees feat(pstack): install pstack in Claude Code from a generated tree Oct 16, 2026

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit e84046f. Configure here.

Comment thread scripts/generate-pstack-harness-trees.mjs
@poteto
poteto merged commit 182f2ce into main Oct 16, 2026
2 checks passed
@poteto
poteto deleted the lauren/pstack-harness-adapters-bc8e branch October 16, 2026 19:56
alekscbarragan added a commit to alekscbarragan/cursor-plugins that referenced this pull request Oct 17, 2026
caelaxie added a commit to pstack-ports/devin-pstack that referenced this pull request Oct 18, 2026
<!-- CURSOR_AGENT_PR_BODY_BEGIN -->
baseline `2418e86` matches upstream pstack at
[`e5136d8`](cursor/plugins@e5136d8)
([#633](cursor/plugins#633)). diffed the
baseline tree against `pstack/` at `e5136d8` and at its parent
`850d7f2`. the parent still has the pre-#633 principle text. the only
path in `e5136d8` that the baseline lacks is `pstack/.cursor-plugin/`,
which this port never carried (devin uses `.devin-plugin/plugin.json`).

upstream `main` has no pstack commits after `019a6a2`. version is still
`0.15.25` upstream, so plugin.json, `.devin-plugin/plugin.json`, and the
readme stay at `0.15.25`. synced to
`019a6a20592c10bf92869e5740368f578a9997fd`.

ported:
-
[`99743e9`](cursor/plugins@99743e9)
([#634](cursor/plugins#634)) cut marginal
sections from `interrogate/references/lead-judgment.md`,
`principle-migrate-callers-then-delete-legacy-apis`,
`principle-type-system-discipline`, and `swarm`. kept the existing devin
frontmatter (`triggers: [user]`) and the existing devin swarm wording.
the #634 readme table edit drops "refuse to lie to the compiler" from
the upstream principle index. this port's readme no longer has that
index, and the phrase lived only in the skill description, which is
updated.
-
[`0317eb8`](cursor/plugins@0317eb8)
([#700](cursor/plugins#700)) brand via a type
guard in `typescript-best-practices` `SKILL.md` and
`references/patterns.md`. kept `triggers: [user, model]` and the dropped
`paths` frontmatter.
-
[`a968159`](cursor/plugins@a968159)
([#702](cursor/plugins#702)) `poteto-mode`
frontmatter `name` is now `poteto-mode`. `make-bot-ui` already had
`name: make-bot-ui` from the devin port. other skills already matched
their folders.
-
[`019a6a2`](cursor/plugins@019a6a2)
([#704](cursor/plugins#704)) guide prose and the
autopilot-full claim in `docs/guide/02` through `10`. kept existing
devin wording (`/pstack:` prefixes, cloud sessions, `.devin` paths).

skipped:
-
[`e5136d8`](cursor/plugins@e5136d8)
([#633](cursor/plugins#633)) is already the
baseline.
-
[`182f2ce`](cursor/plugins@182f2ce)
([#637](cursor/plugins#637)) is claude code
generated-tree install. core `pstack/skills` is unchanged. the "benny is
cursor-only" sentence is skipped because this port already runs benny as
devin sessions.
-
[`a968159`](cursor/plugins@a968159)
generator check in `scripts/generate-pstack-harness-trees.mjs`. that
script builds the claude code tree and does not apply to this repo.
-
[`1b80080`](cursor/plugins@1b80080)
([#705](cursor/plugins#705)) is claude code
packaging. it edits `docs/harness/claude-code.md`, the generated
`harness/pstack/claude-code` tree, the generator, and the claude code
install blurb in the upstream readme. no skill text under
`pstack/skills` changes. this port has no claude code adapter.
-
[`019a6a2`](cursor/plugins@019a6a2)
`scripts/check-pstack-docs.mjs` and the regenerated claude code copies.
the check hardcodes a `pstack/` subdirectory, the full upstream readme
tables, and a sibling `cursor-team-kit`. this repo is the plugin at the
root with a short devin readme, so the script does not apply as-is. the
upstream readme edits that only touch the claude code install blurb, the
cursor custom-mode paragraph, and the built-in `/babysit` to
`/autopilot` rename are also skipped. this port's readme does not have
those sections, and `docs/guide/01-setup.md` already tells devin to pin
the style in `AGENTS.md` instead of a cursor custom mode. the
autopilot-full claim from that readme table is ported in
`docs/guide/07-overnight.md`.

<!-- CURSOR_AGENT_PR_BODY_END -->

<div><a
href="https://cursor.com/agents/bc-5e99de38-babb-516d-92d0-296b6550796a?cursor_ref=pr_footer&cursor_cta=open_in_web"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/assets/images/open-in-web-light.png"><img
alt="Open in Web" width="114" height="28"
src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a>&nbsp;<a
href="https://cursor.com/background-agent?bcId=bc-5e99de38-babb-516d-92d0-296b6550796a&cursor_ref=pr_footer&cursor_cta=open_in_cursor"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img
alt="Open in Cursor" width="131" height="28"
src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a>&nbsp;</div>

---------

Co-authored-by: Cursor Agent <[email protected]>
Co-authored-by: Kaitian Xie <[email protected]>
MondayNotAGoodDay added a commit to MondayNotAGoodDay/skills that referenced this pull request Oct 19, 2026
<!-- CURSOR_AGENT_PR_BODY_BEGIN -->
## 跟进了什么

上游 pstack 从 0.15.25(`6ce45c59`,2026-10-14)到了 0.15.27(`0148b78c`,[#713](https://github.com/cursor/plugins/pull/713)),并接上没有改版本号的 [#715](https://github.com/cursor/plugins/pull/715)(`f9be7aa00c2b2bf4b13562143a6918445e06b99d`,2026-10-18)。接到现有 fork 上,没有整目录覆盖。这次 pin 写在 `UPSTREAM.md`。

- 新技能:`/create-formal-verification-skill`。`/setup-pstack` 在验证技能之后再问一次要不要生成它。`poteto-help` 和指南对上了这个入口。
- `/ketchup` 改成把每一个等待用户的决定都列出来,回复本身就能做出决定。事情本身压在 100 词以内,条目多了就变长,不为了卡字数而删条目([#692](https://github.com/cursor/plugins/pull/692)、[#708](https://github.com/cursor/plugins/pull/708))。
- `/sharpen` 不再禁止把改写后的提示交还来([#712](https://github.com/cursor/plugins/pull/712))。
- 四条 principle 改成推理而不是死规则:`attack-the-premise`、`fix-root-causes`、`make-operations-idempotent`、`test-behavior-not-implementation`([#633](https://github.com/cursor/plugins/pull/633))。`correct` 的测试句一并改了。`poteto-mode` 里对应的一行说明跟着改,spawn 段没动。
- 四处边际段落拿掉:`interrogate` 的 lead judgment、`migrate-callers`、`type-system-discipline`、`swarm` 的引言、N 的说明和结果表([#634](https://github.com/cursor/plugins/pull/634))。`swarm` 仍走 profile 的 `role` / `isolation` / `inherit`。
- TypeScript 品牌用类型守卫写,不再用 `as`([#700](https://github.com/cursor/plugins/pull/700))。
- 指南按上游刷新了用词,并写上了形式化验证、`/ketchup`、`/sharpen`、`/in-your-own-words`([#704](https://github.com/cursor/plugins/pull/704)、[#715](https://github.com/cursor/plugins/pull/715))。fork 里已经改成 harness-neutral 的句子保留,包括项目技能仍写到 `.agents/skills/`。

## 跳过的安装专用 PR

- [#637](cursor/plugins#637) 和 [#705](cursor/plugins#705) 只改 Claude Code 安装:`docs/harness/claude-code.md`、生成的 harness 树、README 里的 `/plugin install`。这个 fork 走 skills.sh,不引入 `.claude-plugin/plugin.json`,这两个 PR 也没有改到这里实际发出的技能正文。
- [#702](cursor/plugins#702) 把 `Poteto Mode` 改成 `poteto-mode`,把 `Make Bot UI` 改成 `make-bot-ui`。这个 fork 的 `poteto-mode` 已经跟目录名一致,且不发 `make-bot-ui`。
- [#704](cursor/plugins#704) 里的 docs-vs-tree 脚本在 `pstack/` 外,检查的是生成的 Claude Code 树。这里不构建那棵树,所以没带脚本;指南正文的刷新已经接上。
- [#710](cursor/plugins#710) 和 [#713](cursor/plugins#713) 只改插件清单的版本号。这个仓库没有 `plugin.json`,版本记在 `UPSTREAM.md`。

## 保留的 fork 约定

- Spawn 仍走 profile:`role` / `access` / `run`,`inherit`,面板上的 `ask`。技能正文不点名 harness 工具,也不写模型 slug。
- 没有把模型 slug、`Task` / `subagent_type` 或 `pstack-models.mdc` 写回去。`setup-pstack` 的 harness 提示(`references/harness-hints.md`)没动。
- `inherit` 仍表示不覆盖模型。harness 拒绝调整后用 profile 值并说明。
- `poteto-agent` 和 Comment Sicko 仍是提示文件(`skills/poteto-mode/references/poteto-agent.md`、`skills/no-comments/references/comment-sicko.md`)。
- 历史、循环、提问仍是 profile 能力(`history`、`loop`、`ask`)。配方里仍是 `loop until done`,不是 `/loop`。
- 技能目录仍是 skills.sh 要的 `skills/<name>/SKILL.md`,frontmatter 有 `name` 和 `description`,`name` 与目录名一致。上游笔记里的 `.agents/skills/` 没有拿来覆盖这个布局。生成的项目技能仍写到 `.agents/skills/`。
- `eli5`、`show-me`、`html-plan` 没动。`third_party/pstack/LICENSE` 没动。没有引入 `make-bot-ui` 或 Benny。

## 校对

- `npx skills add . --list` 找到 57 个技能(上一次是 56),包括 `create-formal-verification-skill`、`ketchup`、`sharpen`、`eli5`、`show-me`。frontmatter 的 `name` 与目录名一致。
- 改过的技能里没有冲突标记,也没有写回模型 slug 或 `pstack-models.mdc`。

<!-- CURSOR_AGENT_PR_BODY_END -->

<div><a href="https://cursor.com/agents/bc-feb72324-ccdf-58a8-88fc-65839b7d8caf?cursor_ref=pr_footer&cursor_cta=open_in_web"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-web-light.png"><img alt="Open in Web" width="114" height="28" src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a>&nbsp;<a href="https://cursor.com/background-agent?bcId=bc-feb72324-ccdf-58a8-88fc-65839b7d8caf&cursor_ref=pr_footer&cursor_cta=open_in_cursor"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img alt="Open in Cursor" width="131" height="28" src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a>&nbsp;</div>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants