Skip to content

chore: sync with cursor/plugins — feat(pstack): add the statechart skill to draw TLA+ models as charts (#741) - #64

Merged
SmailG merged 22 commits into
mainfrom
sync/feat-pstack-add-the-statechart-skill-to-draw-tla-models-as-c-21-commits
Oct 22, 2026
Merged

SmailG merged 22 commits into
mainfrom
sync/feat-pstack-add-the-statechart-skill-to-draw-tla-models-as-c-21-commits

Conversation

@SmailG

@SmailG SmailG commented Oct 22, 2026

Copy link
Copy Markdown
Owner

Upstream changes

eb4db2b feat(pstack): add the statechart skill to draw TLA+ models as charts (cursor#741)
d1453c1 Merge pull request cursor#766 from cursor/djiang/vanta-mcp
e78ec96 feat(vanta): add EU and AUS regional MCP servers
25ae447 feat(third_party): add Vanta remote MCP plugin
f2bad52 Merge pull request cursor#764 from cursor/liam-ilan/framer
6b5df0c feat(third_party): add Framer plugin
13f7ad1 Merge pull request cursor#763 from cursor/djiang/lark-mcp
fa7facd feat(feishu): add Feishu remote MCP plugin
a3a6c05 Merge pull request cursor#761 from cursor/cursor/bigquery-team-oauth-client-d351
d27bff4 feat(lark): add Lark remote MCP plugin
23bc01d google-cloud-bigquery: require the team OAuth client variables
017da53 google-cloud-bigquery: add optional team OAuth client variables
699e1e7 Merge pull request cursor#758 from cursor/revert-757-djiang/quickbooks-skills
82b7afa Revert "feat(quickbooks-online): add Intuit QuickBooks skills"
5dba0b8 Merge pull request cursor#757 from djiang-jq/djiang/quickbooks-skills
1b5e36c feat(quickbooks-online): add Intuit QuickBooks skills
1541ad7 Merge pull request cursor#756 from cursor/liam-ilan/databricks-genie-logo
36f6c1e chore(databricks-genie-one): use the Genie icon as the logo
adeec11 Merge pull request cursor#754 from cursor/liam-ilan/databricks-genie
fb4f183 fix(databricks-genie-one): default CLIENT_SECRET to empty for public clients
436a95b feat(third_party): add Databricks Genie One plugin


Automated sync via sync-upstream workflow

liam-ilan and others added 22 commits October 21, 2026 11:53
[databricks-genie-one] Add Databricks Genie One plugin
…logo

[databricks-genie-one] Use the Genie icon as the logo
feat(quickbooks-online): add Intuit QuickBooks skills
…s-skills

Revert "feat(quickbooks-online): add Intuit QuickBooks skills"
…client-d351

google-cloud-bigquery: add team OAuth client variables
Add Lark and Feishu official remote MCP plugins
…ursor#741)

* Add the statechart skill to pstack

Draws what a user sees as a Mermaid statechart generated from a TLA+
model. TLC checks the reader's rules as invariants. Each state is marked
works, still wrong, or fixed by an open change, and each counterexample
class is drawn as a numbered path. The skill also turns an agreed chart
into a TLA+ skeleton and compares the drawn chart with the agreed one.

Bumps pstack to 0.15.30 and regenerates the Claude Code harness tree.

* Fix the review findings in the statechart skill

- Check each rule in its own TLC run. The generated cfg names no rule,
  and a comment in it lists the rules.
- Refuse TLC output from a run that failed or stopped early, and read
  counterexamples that a start state breaks.
- Count steps that change nothing when a state is settled, number bugs
  that only the fixed model has after the current bugs, and escape
  quotes in captions.
- Compare parallel regions as one machine, and refuse charts that were
  not drawn for comparison.
- Refuse final states and duplicate captions, read class shorthand and
  states first named inside a composite, and match a never line to an
  exact state.
- Rewrite SKILL.md to match, and run the skill script tests in CI.

* Refuse a -- outside a composite in statechart charts

A -- at the top level of a chart opened a second root part that the
parser never read, so every region after it was dropped. chart-to-tla
wrote a one-region skeleton, and compare-charts could print "same".
parseMermaid now refuses the chart. A unit test covers parseMermaid,
chart-to-tla, and compare-charts.

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

* Exit 2 when compare-charts cannot read a chart

compare-charts let a read or parse error escape, so a chart it could
not read exited 1, the code for charts that differ. It now prints the
file and the reason to stderr and exits 2, as SKILL.md says for a
refused chart. Exit 1 now means only that the charts differ.

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

* Update the statechart skill to its current version

Replace the skill, its scripts, and its tests with the current version.
statechart.mjs runs the whole flow with from-spec and from-chart, and its
--help replaces the old Setup section. New features are a code-against-spec
audit (--against), nested state boxes, parallel regions, guards, scoped
charts, timer labels, and legend groups and colors chosen in the mapping.

TLC comes from TLA2TOOLS and JAVA only. Without TLA2TOOLS, the scripts point
to the TLA+ releases page and exit 2.

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

* Exit 2 when --png cannot render a chart

A failed mermaid-cli render printed "could not render" but still exited 0,
or 0 with --expect-broken, so callers reported PNGs that did not exist.
finish() now exits 2 whenever --png renders fewer PNGs than charts, and
keeps the files it wrote. The --help exit codes say so, and a new test
covers it with an npx that cannot launch a browser.

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

* Update the statechart skill to its latest version

Rendered charts keep their full width. An edge label writes the opening
words that its choices share once, instead of cutting the label with "…".
--full-labels replaces --all-labels, and compare-charts refuses a chart
drawn without it.

The fix replay matches each bug step by the screens and step words that
the reader sees, and two states get at most one arrow. Each rule also runs
as a TLC CONSTRAINT, so a rule that stays broken stops at its first bad
state instead of flooding TLC with counterexamples.

statechart.mjs passes its arguments and models through functions instead
of module globals. The --png exit code from the previous commit is now
part of the source.

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

* Update the statechart skill: safe output folder, its TLA+ model, and the comment and assignment cleanups

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

* Drop a comment in the public findTlc that only describes the code

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

---------

Co-authored-by: Cursor Agent <[email protected]>
…d-the-statechart-skill-to-draw-tla-models-as-c-21-commits

# Conflicts:
#	README.md
@SmailG SmailG added the sync Automated upstream sync label Oct 22, 2026
@SmailG
SmailG merged commit 175edca into main Oct 22, 2026
2 checks passed
@SmailG
SmailG deleted the sync/feat-pstack-add-the-statechart-skill-to-draw-tla-models-as-c-21-commits branch October 22, 2026 11:09
@coderabbitai

coderabbitai Bot commented Oct 22, 2026

Copy link
Copy Markdown

Review in Change Stack →

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration
📥 Commits

Reviewing files that changed from the base of the PR and between 997f0c9 and b6231d3.

⛔ Files ignored due to path filters: 50
  • .cursor-plugin/marketplace.json is excluded by !**/.cursor-plugin/**
  • harness/pstack/claude-code/skills/poteto-help/SKILL.md is excluded by !**/skills/**
  • harness/pstack/claude-code/skills/statechart/SKILL.md is excluded by !**/skills/**
  • harness/pstack/claude-code/skills/statechart/scripts/chart-to-tla.mjs is excluded by !**/skills/**
  • harness/pstack/claude-code/skills/statechart/scripts/compare-charts.mjs is excluded by !**/skills/**
  • harness/pstack/claude-code/skills/statechart/scripts/lib.mjs is excluded by !**/skills/**
  • harness/pstack/claude-code/skills/statechart/scripts/model/OutputFolder.cfg is excluded by !**/skills/**
  • harness/pstack/claude-code/skills/statechart/scripts/model/OutputFolder.map.mjs is excluded by !**/skills/**
  • harness/pstack/claude-code/skills/statechart/scripts/model/OutputFolder.tla is excluded by !**/skills/**
  • harness/pstack/claude-code/skills/statechart/scripts/statechart.mjs is excluded by !**/skills/**
  • harness/pstack/claude-code/skills/statechart/scripts/test/statechart.test.mjs is excluded by !**/skills/**
  • harness/pstack/claude-code/skills/statechart/scripts/test/sync.mmd is excluded by !**/skills/**
  • harness/pstack/claude-code/skills/statechart/scripts/test/upload.mmd is excluded by !**/skills/**
  • harness/pstack/claude-code/skills/statechart/scripts/tlc-to-chart.mjs is excluded by !**/skills/**
  • pstack/.cursor-plugin/plugin.json is excluded by !**/.cursor-plugin/**
  • pstack/skills/poteto-help/SKILL.md is excluded by !**/skills/**
  • pstack/skills/statechart/SKILL.md is excluded by !**/skills/**
  • pstack/skills/statechart/scripts/chart-to-tla.mjs is excluded by !**/skills/**
  • pstack/skills/statechart/scripts/compare-charts.mjs is excluded by !**/skills/**
  • pstack/skills/statechart/scripts/lib.mjs is excluded by !**/skills/**
  • pstack/skills/statechart/scripts/model/OutputFolder.cfg is excluded by !**/skills/**
  • pstack/skills/statechart/scripts/model/OutputFolder.map.mjs is excluded by !**/skills/**
  • pstack/skills/statechart/scripts/model/OutputFolder.tla is excluded by !**/skills/**
  • pstack/skills/statechart/scripts/statechart.mjs is excluded by !**/skills/**
  • pstack/skills/statechart/scripts/test/statechart.test.mjs is excluded by !**/skills/**
  • pstack/skills/statechart/scripts/test/sync.mmd is excluded by !**/skills/**
  • pstack/skills/statechart/scripts/test/upload.mmd is excluded by !**/skills/**
  • pstack/skills/statechart/scripts/tlc-to-chart.mjs is excluded by !**/skills/**
  • third_party/databricks-genie-one/.cursor-plugin/plugin.json is excluded by !**/.cursor-plugin/**
  • third_party/databricks-genie-one/CHANGELOG.md is excluded by !**/CHANGELOG.md
  • third_party/databricks-genie-one/LICENSE is excluded by !**/LICENSE
  • third_party/databricks-genie-one/assets/logo.png is excluded by !**/*.png
  • third_party/feishu/.cursor-plugin/plugin.json is excluded by !**/.cursor-plugin/**
  • third_party/feishu/CHANGELOG.md is excluded by !**/CHANGELOG.md
  • third_party/feishu/LICENSE is excluded by !**/LICENSE
  • third_party/feishu/assets/logo.png is excluded by !**/*.png
  • third_party/framer/.cursor-plugin/plugin.json is excluded by !**/.cursor-plugin/**
  • third_party/framer/CHANGELOG.md is excluded by !**/CHANGELOG.md
  • third_party/framer/LICENSE is excluded by !**/LICENSE
  • third_party/framer/assets/logo.png is excluded by !**/*.png
  • third_party/google-cloud-bigquery/.cursor-plugin/plugin.json is excluded by !**/.cursor-plugin/**
  • third_party/google-cloud-bigquery/CHANGELOG.md is excluded by !**/CHANGELOG.md
  • third_party/lark/.cursor-plugin/plugin.json is excluded by !**/.cursor-plugin/**
  • third_party/lark/CHANGELOG.md is excluded by !**/CHANGELOG.md
  • third_party/lark/LICENSE is excluded by !**/LICENSE
  • third_party/lark/assets/logo.png is excluded by !**/*.png
  • third_party/vanta/.cursor-plugin/plugin.json is excluded by !**/.cursor-plugin/**
  • third_party/vanta/CHANGELOG.md is excluded by !**/CHANGELOG.md
  • third_party/vanta/LICENSE is excluded by !**/LICENSE
  • third_party/vanta/assets/logo.png is excluded by !**/*.png
📒 Files selected for processing: 21
  • .claude-plugin/.upstream-base
  • .github/workflows/validate-plugins.yml
  • harness/pstack/claude-code/.claude-plugin/plugin.json
  • harness/pstack/claude-code/README.md
  • harness/pstack/claude-code/docs/guide/06-verify-and-ship.md
  • harness/pstack/claude-code/plugin.json
  • pstack/README.md
  • pstack/docs/guide/06-verify-and-ship.md
  • pstack/plugin.json
  • third_party/databricks-genie-one/README.md
  • third_party/databricks-genie-one/mcp.json
  • third_party/feishu/README.md
  • third_party/feishu/mcp.json
  • third_party/framer/README.md
  • third_party/framer/mcp.json
  • third_party/google-cloud-bigquery/README.md
  • third_party/google-cloud-bigquery/mcp.json
  • third_party/lark/README.md
  • third_party/lark/mcp.json
  • third_party/vanta/README.md
  • third_party/vanta/mcp.json
+--------------------------------------------------------+
| You can't just `setTimeout` your way out of causality. |
+--------------------------------------------------------+
  \
   \     /)/)
        ( '')
        /  |
      o(___)
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

sync Automated upstream sync

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants