Repository navigation
make pstack fully droid compatible - #47
Conversation
Fix the places where the port still assumed Cursor behavior, write COMPATIBILITY.md as the Cursor-to-Droid porting guide, and make the validator fail on the patterns that broke compatibility before. Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
caelaxie
left a comment
There was a problem hiding this comment.
verdict: changes requested (comment review, since github won't let the same account request changes on its own pr).
the skill fixes themselves look right: dropping run_in_background, the no-nested-spawn paths, the script-path fix, the typescript-best-practices routing, and comment-sicko losing tools: read-only all trace to real droid facts, and the last one actually restores upstream (upstream sets no tool restriction). ci Validate plugin is green. blockers:
- cursor-team-kit mention.
COMPATIBILITY.md:63says "cursor-team-kitdeslop,control-cli,control-ui". the port must not name cursor-team-kit anywhere. smallest fix is to drop that row. - minimum changes.
COMPATIBILITY.md(110 lines) andAGENTS.mdare new port-only docs that droid doesn't need to load pstack, andCOMPATIBILITY.mdkeeps cursor paths and manifests in the tree (.cursor-plugin/plugin.json,~/.cursor/plugins/,.cursor/rules/pstack-models,CURSOR_AUTOMATION_ID). smallest fix is to drop both files and point the validator's error strings at the rule itself instead ofCOMPATIBILITY.md. the validator allowlists and the forbidden-token check can stay, since they're minimal ci harness-compat. - harness proof. this touches plugin content (skills, a droid, a playbook), so it needs a real droid run on the exact head
c846d49:droid plugin marketplace addon this branch,droid plugin install pstack@droid-pstack, and the plugin list. also show the installed copy has the changedcomment-sicko(notools: read-only) andtypescript-best-practices(nopathsand nodisable-model-invocation), and that deslop, control-cli and control-ui still load. validator, bun tests and the subagent probes don't count as install proof. - linkage. if this fixes a tracked issue, add
Closes #N(orRefs #Nif it's partial).
nit: droids/comment-sicko.md:26 adds "I cannot spawn subagents, so I never run /how or /why." the replacement clause already covers that, so drop the extra sentence and stay closer to upstream.
| | `paths: [...]` glob activation | Drop `paths`. Remove `disable-model-invocation` and let the description route the skill (`typescript-best-practices`) | | ||
| | `icon`, `color` | Kept for parity with upstream. Droid ignores them | | ||
| | A skill loaded by the model by name | Skills with `disable-model-invocation: true` are read by path. `poteto-mode` reads `../<name>/SKILL.md`. Seat droids find `poteto-mode` in `~/.factory/plugins/` | | ||
| | cursor-team-kit `deslop`, `control-cli`, `control-ui` | Bundled in `skills/` | |
There was a problem hiding this comment.
names cursor-team-kit. the port must not mention it anywhere, so drop this row (or the whole file, see the review body).
|
|
||
| | Cursor | Droid | | ||
| | :-- | :-- | | ||
| | `.cursor-plugin/plugin.json` | `.factory-plugin/plugin.json`, with only `name`, `version`, `description`, `author`, `homepage`, `repository`, `license`, and `keywords` | |
There was a problem hiding this comment.
a port-only doc that keeps cursor manifests and paths (.cursor-plugin/plugin.json, ~/.cursor/..., .cursor/rules/...) in the tree. droid doesn't need it to adopt pstack, so drop the file.
| @@ -0,0 +1,5 @@ | |||
| # droid-pstack | |||
|
|
|||
| This repository is the Droid port of pstack. Before you change any skill, playbook, droid, script, or doc, read `COMPATIBILITY.md` and keep its invariants. | |||
There was a problem hiding this comment.
port-only addition that droid doesn't need to load the plugin, and it points at COMPATIBILITY.md. drop it along with that file.
| `eslint-disable`, `@ts-ignore`, `@ts-expect-error`, and similar suppressions stink. Look up the rule. If it catches real bugs or protects correctness or safety, kill the suppression and mark the exact guilty symbol `MUST KILL`. | ||
|
|
||
| `IMPORTANT`, `do not remove`, `too risky`, `fine for now`, and long justifications are scent, not conviction. Before judging, I read nearby code. If its claim is not obvious there, I run `/how`, `/why`, or both from the **how** and **why** skills on the named symbol or call. Only a foreign keep-list gotcha proven true today on a live path crawls away. Our-code surprises die with the reshape flag above. Doubt after the hunt is meat. | ||
| `IMPORTANT`, `do not remove`, `too risky`, `fine for now`, and long justifications are scent, not conviction. Before judging, I read nearby code. If its claim is not obvious there, I trace the named symbol or call myself through its callers, its tests, and the line's history. I cannot spawn subagents, so I never run `/how` or `/why`. Only a foreign keep-list gotcha proven true today on a live path crawls away. Our-code surprises die with the reshape flag above. Doubt after the hunt is meat. |
There was a problem hiding this comment.
"I cannot spawn subagents, so I never run /how or /why." just repeats the clause before it. drop it to stay closer to upstream.
Why
The installed plugin loaded cleanly, but several skills still assumed Cursor behavior that Droid does not have. On Droid a subagent has no
Tasktool. EveryTaskcall already runs in the background. Droid also ignores skill frontmatter keys outside its schema. Each fix below follows from one of those facts. I checked them against the Droid CLI binary and against liveworkerandexplorersubagents.This PR also adds
COMPATIBILITY.md. It maps every change the Cursor plugin needs to run on Droid and lists the invariants future ports must keep. The validator now enforces the ones a script can check, so CI catches a regression.What changed
comment-sickotraces claims itself instead of running/howor/why.no-commentsandshow-me-your-workhave an in-subagent path, so Autopilot owners can run them.poteto-modesays every spawn stays in the main chat. The orchestrate sub-coordinator came back in the 0.15.36 port and is removed again, as Drop the orchestrate sub-coordinator #28 did.comment-sickocan edit. It wastools: read-only, so it could not delete the comments it is spawned to delete. Upstream sets no tool restriction.run_in_background. The field is removed from poteto-mode, arena, swarm, orchestrate, autopilot-full, shipping, and the guide.node skills/poteto-mode/scripts/check-plan.mjs, a path that only exists inside this repository. Script paths are now relative to the skill directory, andpoteto-modestates that rule.typescript-best-practices. Droid drops the Cursorpathsglob, so the skill never turned on. The description now routes it.scripts/validate-plugin.mjschecks skill and droid frontmatter against Droid's key allowlists. It also rejects Cursor-only tokens:run_in_background,AskQuestion,generalPurpose,.cursor/paths,.cursor-plugin,is_background,node skills/, andsub-coordinator.AGENTS.mdpoints agents atCOMPATIBILITY.md.Scope
iconandcolorstay onpoteto-mode(restore poteto-mode icon and color #38). Droid ignores them, and the validator allows them.grok-4.7andclaude-opus-5-5atxhigh) are unchanged. Both models and the effort level are valid in the current CLI.Blast Radius
The changes are prose in skills, two droid frontmatter edits, and validator rules. A delegate that used to try a nested spawn now does the work inline. Inline work is a weaker check than a fresh reviewer, and each fallback says so.
typescript-best-practicesnow appears in the model's skill catalog.Verification
node scripts/validate-plugin.mjson this branch: OK (61 skills, 5 droids). I also ran it withskills/,droids/, anddocs/restored frommain. It fails on every issue this PR fixes.skills/poteto-mode/scripts,bun run typecheckpasses andbun run testreports 61 pass, 0 fail.bash -npasses on both shell scripts.workersubagent and anexplorersubagent both report noTasktool.workerhasLoop,Edit, andCreate.