Build1 publisher3 min readPublished
Cursor's plugin.json puts agent tool scope where a code reviewer can diff it
Cursor's plugin manifest declares each plugin's dependencies, entry point and parallelism flags in one file, so a scope change lands in a diff. The write-up does not say what checks those declarations at run time.
The Engineer · Build desk

What happened
- Cursor has open-sourced its plugin specification, in which every plugin is a standalone directory carrying a .cursor-plugin/plugin.json manifest that declares tool boundaries, orchestration flow and handoffs.
- The manifest fields the write-up lists are name and category, description, entry point, dependencies, and orchestration hints such as a parallel flag that tells the orchestrator how to fan work out.
- The continual-learning plugin appends extracted bullets to an AGENTS.md file that other plugins read, with the location declared in the manifest's state_file field.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- constraint The hints bind only where something reads them. On the evidence in the write-up, the dependencies list constrains the orchestrator's planning; it does nothing to the entry point's imports.
- exposure A merge gate that reads a JSON file three parallel subagents are writing can act on a partial document, and the security findings are the keys most likely to go missing.
- contradiction The same verification flag appears under two key names in one write-up, so anyone building tooling against the description has to guess which name is right.
Registering a tool as a Python function or a TypeScript method binds it at import time. The scope of what that tool can reach is whatever the module can reach, and the only record is the call graph. The manifest approach moves the declaration into a file: name and category, description, entry point, dependencies, and orchestration hints, according to the dev.to write-up [3]. That file sits in the plugin's own directory at `.cursor-plugin/plugin.json` [2], where a reviewer can diff it and a CI job can parse it.
The hints are hints. Flags like `parallel: true` tell the orchestrator how to fan work out [4], and the post says the structure prevents scope creep, with a security auditor that does not accidentally pull in unrelated tools as the example [5]. A directory boundary and a dependencies list are declarations. Until a loader refuses an undeclared import, the manifest documents scope without bounding it, and the write-up does not say what validates the manifest or whether anything enforces the list [17]. It does say the orchestrator reads the flags to decide whether to block on verification or stream partial results [6].
The thermos plugin is where the concurrency shows. Three subagents run in parallel: one scanning for SQL injection, XSS and auth bypass, one for race conditions and memory leaks, one for style and documentation coverage [8]. Each writes to a shared state object, described as a JSON file at `.cursor-plugin/state/thermos.json` with keys like `security_findings` and `correctness_issues` [9]. The orchestrator reads that state and decides whether to block the merge or surface warnings [10]. The write-up says nothing about a lock, a queue or a per-subagent file in that write path [19].
The memory plugin trades one growth problem for a different one. Transcript chunks go through a lightweight LLM call, the extracted bullets append to `AGENTS.md` under a timestamped section, and other plugins read that file to adjust behaviour [12]. The manifest names the location in a `state_file` field [13]. The post frames this as avoiding context explosion, where every agent call carries the full conversation history [14]. The write-up describes no pruning step, so the file only ever gets longer [20].
One detail decides how much of this you should code against. The write-up names the verification flag as `requires_verification: true` in its field list [4] and as `verification_required: true` when it describes orchestrate's manifest [15]. Those are different keys, so at least one of them is wrong [16]. That is an argument for reading the repository's own manifests before writing a parser against a secondhand schema description. The post calls the release "plumbing" and not "a framework pitch" [18], which is fair, and the repository has 7,421 stars [1].
For the governance claim to transfer to your setup, three things have to hold: the runtime has to consult `dependencies` and fail closed, the state files have to survive parallel writers, and the field names have to match a published schema. The orchestrate flow the post describes covers the first two only at the planning layer, where a planner splits the task, workers return JSON with file paths, diffs and status, and a verifier checks for conflicts and missing coverage before the merge [7].
What to watch
- Whether the repository publishes a versioned JSON schema for plugin.json, which would settle the conflicting flag names.
- Whether the plugin loader fails closed on an undeclared dependency or only passes the list to the orchestrator's planning step.
- Whether thermos moves to per-subagent state files or a lock once parallel audits write findings a merge gate reads.