Repository navigation
Conversation
The validator walked marketplace.json entries only, so a directory with a .cursor-plugin/plugin.json that no entry references (forgotten listing, or a typo in source) passed CI and never reached the marketplace. Walk the repo root and third_party/ for plugin directories and fail for each one that is not a listed source. main has 102 listed and 0 unlisted today, so this is an error from the start. (cherry picked from commit e8ea031)
rahul05ranjan
left a comment
There was a problem hiding this comment.
Verified most of this locally (standalone run of the new validator logic against the full tree — I didn't have bun/ajv installed, so the script-package matrix I reviewed statically only). Results:
- Copied the new
checkSkillFrontmatter/checkPluginSkillscode verbatim and ran it over all 102 marketplace plugins: 0 errors, 5 warnings — exactly the five you listed (cursor-sdk's 1045-char description,make-bot-ui/poteto-mode/x-api-mcp-guide/x-money-guidenames). Matches the PR description to the letter. - The unlisted-plugin walk reports 102 listed / 0 unlisted on main, and I planted a
zz-unlisted/.cursor-plugin/plugin.jsonto confirm it gets caught with exit-1 semantics. Also confirmed every current marketplace source is a root-level dir orthird_party/*, so the two-level walk covers everything that exists today. - Frontmatter parser edge cases behave: quoted scalars strip quotes,
>-folds lines,|preserves blank lines, missing/unterminated frontmatter returns null, and the folder-mismatch warning fires when a kebab-case name differs from its directory. - Both workflow files parse as YAML, and the
package.jsonvalidatescript wiring matches the workflow step. Lockfile is exactly the 7 claimed entries.
Two small nits, neither blocking:
-
parseFrontmatter(scripts/validate-plugins.mjs:53):text.indexOf("\n---", 3)also matches a continuation line that merely starts with---, so a block-scalar description containing e.g. a markdown rule (--- text) silently truncates the value at that point. Anchoring the terminator to a line that is exactly---would close that; as-is it's a silent mis-parse rather than an error, which is the one spot this new checking can be quietly wrong. -
script-packages.yml:33pins bun tolatest— a little at odds with this PR's own rationale for pinning the ajv deps in CI. Not urgent, but a future bun release could start failing these checks for reasons unrelated to any PR.
Thanks for folding the four pieces into one reviewable-per-commit PR — the body made it genuinely easy to verify each claim independently.
…un in CI
indexOf("\n---") also matched an indented continuation line starting with
--- (a markdown rule inside a block-scalar description), silently cutting
the value short. The terminator is now a line that is exactly --- with
optional trailing whitespace, CRLF or EOF after it. bun is pinned to 1.4.3
for the same reason the ajv deps are pinned.
|
Hey @rahul05ranjan, thanks for the thorough pass, and for replicating the walk against all 102 plugins. Both nits addressed in
|
Summary
One PR for the repo-level CI and validator work from #531, replacing #607, #599, #598 and #625 (closed in favour of this one; their commits are carried here unchanged, one commit each, reviewable separately). Together they close pieces 2, 3b, 3d and 4 of the shape in #531, the last ones; #582 (akushonkamen) covers pieces 1 and 2a and touches
validate-plugins.yml/validate-plugins.mjstoo, so whichever lands second needs a small rebase.ci: pin the validator's ajv dependencies in a root package.json and install with npm ci(was ci: pin the validator's ajv dependencies in a root package.json and install with npm ci #607). The job installedajvandajv-formatsunpinned on every run. Rootpackage.json(private, devDependencies only,validatescript),package-lock.json(7 packages),npm ciwith the npm cache, and thepaths:trigger widened toscripts/**, the package files and the workflow.validate: check SKILL.md frontmatter (name, description, folder match, length)(was validate: check SKILL.md frontmatter (name, description, folder match, length) #599). The validator never read aSKILL.md. Errors: no frontmatter, missingname, missingdescription. Warnings for now:namenot kebab-case or not equal to the folder,descriptionover 1024 characters. On currentmainthat is 0 errors and 5 warnings (cursor-sdk description, two pstack and two third_party names), all with open fix PRs (chore: keep the cursor-sdk skill description under the 1024-char limit; label agent-compatibility changelog 1.0.0 #530, fix(pstack): make skill names match their directories (poteto-mode, make-bot-ui) #596, fix(x, x-money): make skill names match their directories #600); once those land the two warnings can become errors in a two-line follow-up.ci: run bun typecheck and tests for the two script packages on PRs(was ci: run bun typecheck and tests for the two script packages on PRs #598).orchestrate/skills/orchestrate/scripts(209 tests) andpstack/skills/poteto-mode/scripts(63 tests) have test suites nothing ran. Newscript-packages.yml: matrix over the two directories,bun install --frozen-lockfile,bun run typecheck,bun run test,fail-fast: false,paths:scoped to the two packages and the workflow.validate: fail when a plugin directory is not listed in marketplace.json(was validate: fail when a plugin directory is not listed in marketplace.json #625). The validator only walkedmarketplace.jsonentries, so a directory with a.cursor-plugin/plugin.jsonthat no entry references (forgotten listing, or asourcetypo) passed silently. New step walks the repo root andthird_party/and fails for each plugin directory that is not a listed source. On currentmain: 102 listed, 0 unlisted, so this is an error from day one.Verification
rm -rf node_modules && npm ci && npm run validateon this branch:All plugins validated successfully.with the 5 expected warnings.zz-unlisted/.cursor-plugin/plugin.json:ERROR: Unlisted plugin: "zz-unlisted" ..., exit 1.Refs #531.