fix(pstack): let poteto-agent find poteto-mode, drop ignored frontmatter, document the / menu
Summary
pstack skills often do not run. Part of the cause is in Cursor itself: a /poteto-mode typed as plain text is not attached to the message. That is being fixed in Cursor separately. This PR has only the pstack-side edits that need no decision. The two edits that do need one are listed under Open questions below.
Changes
agents/poteto-agent.md: when the parent passes no path, the agent searches~/.cursor/plugins/for a file whose path ends inskills/poteto-mode/SKILL.md. The search is the first step. The agent body also says that the skill catalog hidespoteto-mode, so a missing catalog entry does not mean pstack is absent. If no file matches, the agent stops and tells its parent. The suffix match is not tied to one install layout, which was the problem with thefindfallback in #569. If more than one copy matches, for example a second version folder in the plugin cache or a copy underlocal/, the agent uses the copy whose.cursor-plugin/plugin.jsonhas the highestversion.skills/poteto-mode/SKILL.md: removemode: trueandreminder:. Cursor ignoresmodeandreminderin skill frontmatter, so the reminder text was never injected. Keeping the keys suggests a behavior that does not exist.README.md: one line that tells users to pick/poteto-modefrom the/menu before they type the task, so Cursor attaches the skill.
Open questions for the pstack owner
- Should
poteto-modebecome model-invocable? This meansdisable-model-invocation: false, for this one skill only. The investigation behind this PR recommends yes. If yes, the trigger condition from the removedreminder:line can go intodescription. - Should
how,why,recall, andketchuptrigger from plain requests? The alternative is that they stay slash-only and their descriptions drop the "Use for ..." routing language. #519 and #392 already propose that rewording for slash-only skills. - Does Grok Bot remove slash-only skills before its catalog limit? Known: Grok Bot's skill catalog includes at most 24 skills in total from all non-bot plugins. It takes the first 24 skills from one combined list of those plugins' skills, and this list comes after its managed skills. Not verified: whether Grok Bot removes slash-only (
disable-model-invocation: true) skills before it applies that limit. A Cursor agent removes them, so onlysetup-pstackfrom pstack is in its catalog. Grok Bot was not tested. If Grok Bot does not remove them, pstack's 51 slash-only skills could fill the 24 places and push outsetup-pstackor skills from other plugins. Catalog text is also truncated to fit a token budget. So this PR does not shorten any descriptions. It is better to size them after this item and questions 1 and 2 have answers.
Test plan
-
poteto-agentwith no path: before and after the change, same prompt. Each run got the agent body as its instructions and the same small read-only task, with no path to the skill. Thepstackfolder was removed from the workspace, so the skill existed only in the installed plugin cache. That is the usual situation on a user's machine. I checked tool calls in the transcripts. The two Grok runs on main searched the workspace first and found nothing. On a user's machine, the workspace is their own repository. The "this PR" rows ran before I added the sentence about choosing between copies. With only one copy on disk, that sentence does not apply.Agent body Model Read poteto-modemain default 1 of 2. One run searched only the workspace and answered without the skill. The other found the skill late, after it had read the task file and searched the code. main Grok 4.7 2 of 2, before the task, after four searches each this PR default 2 of 2, after one search. The run read the task file at the same time as that search, and read the skill before it started the analysis. this PR Grok 4.7 2 of 2, before the task, after one search -
Two copies on disk: this PR's final text, run twice. I added a second pstack copy next to the installed one. Its files were the same, except that
versioninplugin.jsonwas 0.15.30 instead of 0.15.21. So that a naive pick would fail, the 0.15.30 copy had the older file times and a folder name that sorts after the other copy. Both runs (default model) compared the twoplugin.jsonversions and read only the 0.15.30SKILL.md. As in the runs above, both read the task file in the same step as the search, but read the skill before they started the analysis. I removed the second copy afterward. -
The runs got the body inside the prompt and did not use the installed
poteto-agenttype. A running session loads agent definitions at startup, so an edited agent file does not reach a spawnedpoteto-agentuntil the next session. I did not test install locations outside~/.cursor/plugins/, and I did not test Windows. -
Frontmatter: after the edit, the
poteto-modefrontmatter still parses as YAML, with keysname,description,disable-model-invocation,icon, andcolor. Nothing reads the two removed keys, so a before-and-after run would show no difference. On the client side, I searched the agent runtime that ships in this VM: no code readsmodeorreminderas fields. For the server side, I depend on the investigation behind this PR, which quotes Cursor's source. I could not see that code myself. -
README: not verified. Checking it needs the Cursor desktop composer, and this environment does not have it.
-
node scripts/validate-plugins.mjspasses. -
The diff is plain ASCII. The branch merges cleanly with #595 and #596.

