Skip to content

chore(upstream): merge cursor/plugins - #35

Merged
mstephenholl merged 26 commits into
mainfrom
upstream-merge
Oct 27, 2026
Merged

mstephenholl merged 26 commits into
mainfrom
upstream-merge

Conversation

@mstephenholl

@mstephenholl mstephenholl commented Oct 24, 2026 •

Copy link
Copy Markdown
Owner

Closes #34.

Upstream: cursor/plugins@9580c23696ac, which brings 13 pstack commits. The daily sync stopped on one conflict and opened #34, so this is the manual merge from pstack/port/merge-upstream.py, plus the ports that #34 lists.

What changes

Risk

  • The worktree-audit.sh change is the only hand-written code. On macOS it now goes through upstream's BSD branch (stat -f '%m %N', date -r) in place of the port's. The pstack macOS workflow covers that after merge.
  • statechart changed a lot upstream (+7k/−2k lines). The port doesn't modify it, and this repository's CI doesn't run its tests. On first run it can now install TLC and Java with mise, about 305 MB. TLA2TOOLS still takes precedence.

Proof

  • check.py: 0 problems, 0 warnings across 56 pstack skills, on each commit.
  • Removing either new harness mapping, or ketchup-video's pointer, makes check.py name the problem.
  • Port unit tests: 257 pass. install_test.sh passes with 59 skills. test_worktree_audit.py passes with both GNU and system tools.
  • poteto-mode bun tests (orch, watch-pr, check-plan): 82 pass.
  • statechart on Node 18.19.1: its test file can't load, because it imports zlib.crc32, which only Node 20.15+ has. The skill's scripts don't use it. A real from-chart run on upstream's test/sync.mmd wrote the spec, ran TLC, and drew one bug path.
  • statechart's full suite: not run. Upstream feat(pstack): port the statechart compiler cursor/plugins#977, which the next sync brings in (cursor/plugins@519d36a), rewrites these scripts in TypeScript and replaces this suite. The next sync's pull request runs the new suite.
  • Smoke test: after release. smoke.py runs the installed clone behind ~/.agents/pstack, not this branch, so it can't test this branch before merge. After pstack update, run smoke.py --only reflect,swarm, the scenarios for the changed skills.

poteto and others added 26 commits October 23, 2026 12:37
…nderer (cursor#791)

* feat(pstack): bring the statechart skill up to date, with the Pele renderer

Port 49 changes from the source copy of the skill. PNGs come from Pele
and resvg in place of the Mermaid CLI, TLC installs with mise when
TLA2TOOLS is not set, and the OutputFolder model is removed. SKILL.md
keeps the wording from cursor#741 for where a spec lives.

* fix(pstack): let the statechart regions proof leave out self-loops when the overview does

productOf now records combined self-loops, but the flat graph that the
regions proof compares against leaves them out unless --loops is set.
A region with a stay-or-leave loop on one label then gave a false
difference, and from-spec declined parallel regions.

Pass the loops setting through productOf, compareCharts, and
regionsChart. The proof chart marks "%% self-loops left out" so that
compare-charts.mjs compares it the same way.

Co-authored-by: lauren <[email protected]>

---------

Co-authored-by: Cursor Agent <[email protected]>
…esult with /statechart (cursor#794)

* feat(pstack): tell generated verify skills to read each model-check result with /statechart

* fix(pstack): match the /statechart paragraph to what statechart does now

Statechart draws how any system moves between states, not only what a
user sees, and it draws no path for a broken PROPERTY.

Co-authored-by: lauren <[email protected]>

---------

Co-authored-by: Lauren (agent) <[email protected]>
Co-authored-by: Cursor Agent <[email protected]>
The listing now covers financial insights, invoicing actions, payroll, and QuickBooks Capital.

Co-authored-by: Cursor <[email protected]>
Update the QuickBooks Online plugin description
Connect agents to PitchBook's hosted MCP server at https://premium.mcp.pitchbook.com/mcp. Auth is OAuth with dynamic client registration, so there is nothing to configure.

Co-authored-by: Cursor <[email protected]>
* feat(pstack): add the ketchup-video skill

Port /ketchup-video: the /ketchup catch-up shown as a short silent video
of slides, with the calls waiting on the user as text under it. Lists it
in poteto-help, the README skills table, and the recipes guide, and
regenerates the Claude Code harness tree.

* fix(pstack): start the ketchup-video catch-up window at /ketchup-video

Co-authored-by: lauren <[email protected]>

---------

Co-authored-by: Cursor Agent <[email protected]>
* fix(pstack): route reflect edits out of the plugin cache

Reflect wrote approved skill edits into the installed plugin cache.
A plugin update moved to a new hash and dropped them.

Apply refuses a plugins/cache path.
For a third-party skill, the edit is a PR against the repo named by plugin.json repository.
Apply writes any other skill under .cursor/skills or ~/.cursor/skills.
The summary names the PR URL or the destination path.

Co-authored-by: Jhonny <[email protected]>

* fix(pstack): keep reflect edits local and show destinations before approval

The first commit sent a third-party skill edit to a PR on the plugin's
repository. Every plugin manifest has a repository field, so an approved
local edit could become a public PR the user never saw.

Step 5 now copies a plugins/cache/ skill folder to .cursor/skills/ or
~/.cursor/skills/, shows that destination before approval, and edits the
copy. It never opens a PR or pushes.

Regenerate the Claude Code harness copy.

Co-authored-by: lauren <[email protected]>

---------

Co-authored-by: Cursor Agent <[email protected]>
Co-authored-by: Jhonny <[email protected]>
…ketplaces (cursor#806)

Claude Code only auto-updates plugins from Anthropic's official
marketplaces by default, so a pstack install from cursor-plugins stays
pinned to its install version. Say so in the Claude Code install
section and give the steps to turn auto-update on.

Co-authored-by: Jaxon Wright <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
…rence (cursor#807)

* fix(pstack): renumber swarm's Phase A and fix its dangling table reference

cursor#634 cut Phase A item 3 and left the list numbered 1, 2, 4, 5 so that
Phase B's "the step 4 model" kept pointing at the model step. Rendered
Markdown renumbers the list, so readers see the model step as 3 while
Phase B says 4. Number the list 1 to 4 and point Phase B at step 3.

cursor#634 also cut the Phase C sentence that introduced the result table,
which left Phase D's "the table" with nothing to refer to. Phase D now
asks for "a result table".

* fix(pstack): regenerate the Claude Code harness copy of swarm

The validate workflow runs generate-pstack-harness-trees.mjs with
--check, which fails while harness/pstack/claude-code/skills/swarm
still holds the old numbering. Regenerate it from the source skill.

---------

Co-authored-by: Michael Holland <[email protected]>
…one-variables-copy

[databricks-genie-one] Update setup form copy
…icks-genie-one-variables-copy

Revert "[databricks-genie-one] Update setup form copy"
Resolved pstack/skills/poteto-mode/scripts/worktree-audit.sh by keeping the port's transcript list, which also scans Claude Code and Codex session logs, and taking upstream's stat_fmt and fmt_day for GNU and BSD stat and date. They replace the port's own mtime array and date fallback, so the port's change to this file is now only the transcript list.
It follows ketchup, which is already ported, and ends with a video
embedded in the reply, which a terminal cannot show. It gets the
pstack-harness pointer, and the harness now says to give an embedded
image or video by its absolute path. check.py requires that mapping for
any skill that embeds a video. It is user-only, so it also gets the
Codex policy file. The README lists it under ketchup.
…cache

Upstream's reflect now refuses to edit a skill under plugins/cache/,
since a plugin update moves to a new folder and drops the edit. The port
has the same trap in two places: Claude Code keeps upstream's plugin in
~/.claude/plugins/cache/ with one folder per version, and pstack's own
skills link into the clone behind ~/.agents/pstack/, which pstack update
moves to each new release. pstack-harness now names both and says to
copy the skill to the project or personal skill folder and edit the
copy, unless the clone is the repo being worked in. check.py requires
that mapping for any skill that mentions plugins/cache.
@mstephenholl
mstephenholl merged commit 720a772 into main Oct 27, 2026
10 checks passed
@mstephenholl
mstephenholl deleted the upstream-merge branch October 27, 2026 16:17
mstephenholl added a commit that referenced this pull request Oct 27, 2026
Upstream: cursor/plugins@519d36aa9895, which brings 5 pstack commits.
The daily sync opened this pull request after #35 merged.
`merge-upstream.py` resolved everything and found nothing to port.

## What changes

- **Merge (`323d97f`)**: drops 441 upstream paths outside the port,
including the new ServiceNow and RingCentral plugins, the Tailscale
skill updates, and upstream's version bumps to 0.15.33 and 0.15.34. In
the port:
- `statechart` (upstream cursor#977) is now a TypeScript compiler. A
`scripts/statechart` launcher runs `statechart.ts` and replaces the
`.mjs` scripts. It only goes from a TLA+ model to a chart. `from-chart`,
`--against`, and `--fixed` are gone. It renders charts with Pele, a
public npm package. cursor#982 keeps qualified action names in property
traces, and cursor#981 fixes a test.
- `create-formal-verification-skill` drops one clause: `/statechart` no
longer shows which violations a change fixes.
- **`docs(pstack): describe the statechart rewrite in the README`
(`2991dba`)**: `merge-upstream.py` keeps the port's own README, so the
merge couldn't update it.
  - The skill table no longer offers a TLA+ skeleton from a chart.
- Requirements now lists what `statechart` runs on: Bun 1.1.5 or later,
Node 22.18 to 22.x, Node 23.6 or later, or Deno 2.0 or later, plus
`mise` for TLC and Java unless `TLA2TOOLS` is set.
- **Not ported**: `statechart` has no Cursor terms and still needs no
`pstack-harness` pointer. The port's copy matches upstream's except for
its Codex policy file. "Give the user the SVG" is covered by the
harness's Tools row from #35, which says to give an image by its
absolute path.

## Risk

- **Runtime**: before, `statechart` ran on any `node`. Now a machine
with Node older than 22.18 and no Bun or Deno gets exit 127, and the
launcher names the versions it needs. `pstack doctor` already warns when
`bun` is missing, so I didn't add a separate check.
- **Tests**: this repository's CI doesn't run `statechart`'s own suite.
It needs Node 22.18 or later and `fast-check`.

## Proof

- `check.py`: 0 problems, 0 warnings across 56 pstack skills.
- Port unit tests: 257 pass.
- `statechart` through the launcher on this machine: Node 18.19.1 is too
old, so it ran on Bun 1.4.2, with `TLA2TOOLS` set to tla2tools 1.7.4.
For all 33 specs in upstream's `test/corpus`, its `report.md` and
`chart.mmd` match upstream's expected files byte for byte. The specs
include ones with broken rules, deadlocks, VIEW, and parallel regions.
- `statechart`'s own suite: not run. It needs Node 22.18 or later, which
this machine doesn't have.
- Smoke test: no scenario covers `statechart`, which is user-only. The
other skills' text didn't change.
- macOS: #35's run on `main` never got a runner and was cancelled after
15 minutes. It's re-running. This pull request doesn't touch
`worktree-audit.sh`.
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.

Upstream cursor/plugins needs a manual merge

4 participants