Repository navigation
Description
Plugin name
vanillajs-to-react
Short description
Migrate vanilla JavaScript apps and pages to React — full rewrites or incremental strangler-fig migrations of any size, from script-tag pages to ES-module apps.
GitHub repository
cobuild-tech/cbx-plugins
Plugin path inside the repository
vanillajs-to-react
Ref to review
v2.1.0
Commit SHA to review
74aca6579e74a5739783dc00b6d3418c6f48af18
Version
1.2.0
License identifier
MIT
Author name
CobuildX
Author URL
https://github.com/cobuild-tech
Homepage URL
https://github.com/cobuild-tech/cbx-plugins/tree/main/vanillajs-to-react
Keywords
react, migration, vanilla-js, javascript, dom, legacy-javascript, refactoring, modernization
Additional notes for reviewers
Resubmission of #5867. The plugin has changed since that review: this submission pins the new release v2.1.0, and the evaluation evidence ships inside that snapshot.
What changed in v2.1.0 (this plugin is now 1.2.0):
- Direct mode for the most common request, "convert this part of my repo to React". The skill reads its framework references, searches the rest of the repo for code that depends on the area, and ends with a list of every behavior difference.
- A framework-specific coupling checklist, always applied, covering the implicit behavior that migrations break (details below).
- Broader triggers for "rewrite / rebuild / replace … with React" requests.
Evaluation, at the pinned snapshot. The same model (Claude Sonnet), the same repository, and the same prompt, with and without the plugin. There are 25 multi-file cases across the five sibling plugins, 5 of them for this framework. Each case has 6 pass/fail criteria, written before any run and kept hidden from the model. Grading is blind to which run used the plugin.
| Without plugin | With plugin | |
|---|---|---|
| This framework | 29/30 | 29/30 |
| All five plugins | 138/150 | 145/150 |
Examples from this framework:
- 02-theme-toggle-dom-state (Theme toggle where
<html data-theme>is also changed by another script): Keptdata-themeas the source of truth (useSyncExternalStorewith aMutationObserver), so changes from other scripts show up. Without the plugin, the theme was copied into React state that drifts.
Every run's diff, final answer, and per-criterion grade with its reason are in evals/results/. Also see results · method · cases · runner.
Domain-specific constraints this plugin encodes for plain JavaScript (vanilla DOM) apps and pages (one reference file per area under skills/cobuildx-ai-vanillajs-to-react-migration/references/):
- Finds where state really lives: text content, CSS classes,
data-*attributes, globals and closures, and which DOM reads later code depends on. - Module system and page model: classic
<script>tags sharing globals, IIFEs, ES modules; server-rendered pages enhanced with scripts vs single-page apps. - Events and timing. Listener order, delegation, timers and
requestAnimationFrameloops are ported with explicit cleanup. - What should stay outside React. Pre-paint scripts (theme, locale) in
<head>, third-party scripts, and canvas/map/chart widgets wrapped with aref. - One owner per element. Once React owns a container, old code no longer touches it; the skill enforces this during the incremental phase.
Specialized workflow, not just advice:
- Resumable state across sessions. A
.migration/folder in the user's repo holds the unit list, route map, per-unit status and QA gates, so "continue the migration" or "what's left?" works in a new session without re-reading the codebase. - Strategy selection. Full rewrite vs strangler-fig vs branch-by-abstraction, chosen from app size and risk, with an explicit cutover plan.
- Read-only
vanillajs-inventoryagent that maps routes, components, services, data layer and hidden wiring before any code changes. - Read-only
vanillajs-parity-revieweragent that checks each ported unit against the original for behaviour, markup, data and timing differences before the old code may be deleted. /plancommand that writes the plan without touching app code.
Pins tag v2.1.0 and its full commit SHA. Free, MIT licensed, no telemetry, sign-up, or paid service. The bundled Context7 MCP server is the public endpoint and needs no credentials. This is one of five sibling plugins (ember, angular, backbone, jquery, and vanillajs to React), each with its own framework-specific references, submitted separately.
Submission checklist
- The plugin lives in a public GitHub repository.
- The ref and/or sha I provided is immutable (release tag and/or full 40-character commit SHA), not a branch.
- This submission follows this repository's contribution, security, and responsible AI policies.
- This plugin is not already listed in the Awesome Copilot marketplace.
Activity
github-actions commentedon Nov 3, 2026
✅ External plugin intake passed
This submission passed automated intake validation and quality checks and is ready for maintainer review.
View workflow run · Download full quality gate logs
v2.1.074aca6579e74a5739783dc00b6d3418c6f48af18Reviewer signals
These are non-blocking heuristics for maintainer review; they are not evidence of misconduct or low quality.
Quality gate summary
Legend: ✅ pass ·⚠️ warning · 🛑 fail
spec compliance output (✅ pass)
vally lint output (✅ pass)
install smoke test output (✅ pass)
Version match output
Ref/SHA consistency output
Canvas structure output
Canonical external.json payload
{ "name": "vanillajs-to-react", "description": "Migrate vanilla JavaScript apps and pages to React — full rewrites or incremental strangler-fig migrations of any size, from script-tag pages to ES-module apps.", "version": "1.2.0", "author": { "name": "CobuildX", "url": "https://github.com/cobuild-tech" }, "repository": "https://github.com/cobuild-tech/cbx-plugins", "homepage": "https://github.com/cobuild-tech/cbx-plugins/tree/main/vanillajs-to-react", "license": "MIT", "keywords": [ "react", "migration", "vanilla-js", "javascript", "dom", "legacy-javascript", "refactoring", "modernization" ], "source": { "source": "github", "repo": "cobuild-tech/cbx-plugins", "path": "vanillajs-to-react", "ref": "v2.1.0", "sha": "74aca6579e74a5739783dc00b6d3418c6f48af18" } }aaronpowell commentedon Nov 4, 2026
/reject This is substantially the plugin rejected in #5867, plus a Direct mode and a coupling checklist. Your own evals score 29/30 both with and without the plugin. The one gain came from a run where the skill didn't load, and the one regression broke the global API bridge, the first item on your own checklist. All runs were single-shot in Claude Code, not Copilot. This still doesn't demonstrate meaningful model uplift.
github-actions commentedon Nov 4, 2026
❌ External plugin rejected
A maintainer rejected vanillajs-to-react, and the submission issue has been closed.
Reason
This is substantially the plugin rejected in #5867, plus a Direct mode and a coupling checklist. Your own evals score 29/30 both with and without the plugin. The one gain came from a run where the skill didn't load, and the one regression broke the global API bridge, the first item on your own checklist. All runs were single-shot in Claude Code, not Copilot. This still doesn't demonstrate meaningful model uplift.
This issue is now closed and
/rerun-intakewill no longer reopen it. If you address the feedback, please open a new external plugin submission issue.