fix(miro): move the Node project under server/ so plugin install skips npm ci - #4096
Conversation
…s npm ci Closes #4084 Claude Code runs `npm ci --ignore-scripts` inside a consumer's plugin cache whenever the plugin root holds both a package.json and a supported lockfile, and that install cannot be turned off. The miro plugin kept its whole TypeScript project at the root, so every install materialised the dev toolchain (typescript, biome, esbuild, vitest and their transitive tree, about 178 MB in the audited cache) even though the committed bundle needs nothing at runtime. Move package.json, the lockfile, biome.json, build.mjs, tsconfig.json, vitest.config.ts, src/, dist/ and the project .gitignore one level down into plugins/miro/server/. The plugin root no longer carries a lockfile, so the automatic install never fires, while CI and Dependabot keep pinning and rebuilding from the same lockfile at its new path. Follow the move everywhere that named the old layout: .mcp.json now launches server/dist/index.min.js; the miro CI steps, the dependabot manifest and the dependabot-miro-bundle workflow run in plugins/miro/server; the bugs lane glob, CLOUD-SESSIONS and the README point at server/. Record plugins/miro/server/* in the affected-tests no-suite list with the miro CI lane that covers it, since its vitest suites are not one of the four conventions the selector recognises and the tree previously reported as unmapped. Basis: plugins-reference.md, "Node.js package dependencies", verified 2026-09-11. Bump miro to 0.4.0 with a matching changelog entry. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019KEd5QnRjyz3TvieTd5UbN
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Claude finished @kyle-sexton's task in 2m 27s —— View job Reviewing PR #4096
SummaryReviewed the full diff ( I traced every reference to the old layout across the repo (not just the PR's changed-files list) to check for anything missed:
No high-signal correctness or maintainability issues found — no inline comments posted. The PR author's local verification (test runs, |
|
Claude finished @kyle-sexton's task in 45s —— View job Security review
No security issues found. This PR is a pure path-relocation of the miro plugin's Node project from
No authorization, injection, secret-handling, or Actions-trigger/permission changes are present in this diff. Per this lane's scope, GitHub Actions hardening (pins, |
|
Last security-reviewed head: |
|
Claude has reviewed this PR 1 time. The lane skips further automatic reviews after 5; deleting this comment resets the count. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: bf32181107
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
The MCP carry table in docs/MIGRATION-PLAYBOOK.md still said the miro
server's TypeScript lives directly under plugins/miro and prescribed
`node ${CLAUDE_PLUGIN_ROOT}/dist/index.min.js`, both of which the
server/ move removed. The row now names plugins/miro/server, the
server/dist bundle path, and the reason the project sits one level
below the plugin root.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019KEd5QnRjyz3TvieTd5UbN
Closes #4084
Summary
Claude Code runs
npm ci --ignore-scriptsinside a consumer's plugin cache whenever a plugin root holds both apackage.jsonand a supported lockfile, and that install cannot be turned off (plugins-reference.md, "Node.js package dependencies", verified 2026-09-11). The miro plugin kept its whole TypeScript project at the plugin root, so every install of the plugin materialised the dev toolchain (typescript, biome, esbuild, vitest and their transitive tree: 176 MB / 6,120 files in the audited cloud-session cache) even though the committed bundle needs none of it at runtime. #4087's size attribution is what surfaced it.Fix
package.json,package-lock.json,biome.json,build.mjs,tsconfig.json,vitest.config.ts,src/,dist/and the project.gitignoreone level down intoplugins/miro/server/. The plugin root no longer carries a lockfile, so the automatic install never fires; CI and Dependabot keep pinning and rebuilding from the same lockfile at its new path..mcp.jsonlaunches${CLAUDE_PLUGIN_ROOT}/server/dist/index.min.js; the miro CI steps,.github/dependabot.ymlanddependabot-miro-bundle.ymlrun inplugins/miro/server; the bugs lane glob,docs/CLOUD-SESSIONS.mdand the miro README point atserver/;build.mjs's header explains the placement with its upstream basis.plugins/miro/server/*inscripts/affected-tests-no-suite.txtwith the miro CI lane that covers it. Its vitest suites are not one of the four conventions the selector recognises, and the tree reported as UNMAPPED on main before this change as well.No source or bundle content changed: every moved file is a 100% rename except
build.mjs(header comment) and.mcp.json(path).Verification
plugins/miro/server:npm ci,npm run typecheck,npm run lint,npm test,npm run verify-bundle("matches source"), and the stdio smoke test (tools/listreturnsmiro_create_board). All pass.actionlinton the two edited workflows: clean.check-jsonschemacoverage ofdependabot.ymlis exercised by CI.scripts/affected-tests.sh --explain: no UNMAPPED files (was 18 for this diff before the no-suite entry);--run: every selected shell suite passed, includingscripts/affected-tests.test.sh(76 checks) which reads the live no-suite list.scripts/check-changelog-parity.sh --check,scripts/check-purged-em-dashes.sh,markdownlint-cli2on the changed markdown: clean.package.jsonplus lockfile; yarn and pnpm lockfiles are skipped; the install cannot be disabled. A nested project is the documented-safe placement.Related
node_modulessize attribution that surfaced this.server/placement when that section changes.🤖 Generated with Claude Code
https://claude.ai/code/session_019KEd5QnRjyz3TvieTd5UbN
Generated by Claude Code