Skip to content

[External Plugin]: ember-to-react #6218

Closed

Description

@EmmanuellDev

Plugin name

ember-to-react

Short description

Migrate Ember.js apps to React — full rewrites or incremental strangler-fig migrations of any size.

GitHub repository

cobuild-tech/cbx-plugins

Plugin path inside the repository

ember-to-react

Ref to review

v2.1.0

Commit SHA to review

74aca6579e74a5739783dc00b6d3418c6f48af18

Version

2.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/ember-to-react

Keywords

react, migration, ember, ember-octane, refactoring, modernization

Additional notes for reviewers

Resubmission of #5863. 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 2.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 26/30 29/30
All five plugins 138/150 145/150

Examples from this framework:

  • 04-notification-bell-polling (Classic component with Ember Concurrency polling): Kept the span.bell element with its bell--unread class binding, matched the .drop() semantics and the 20 s interval, and listed each remaining difference. Without the plugin, the classes moved to an inner element and .drop() was removed without mention.
  • 02-toast-runloop-tests (Toast service on the run loop, with an acceptance test using settled()): Listed every behavior change, including the wrapper element and scheduler ordering. Without the plugin, changed toast ids and timer storage went unmentioned.

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 Ember.js (Classic and Octane) (one reference file per area under skills/cobuildx-ai-ember-to-react-migration/references/):

  • Run loop timing. schedule('afterRender'), next, run.later, run.debounce/throttle each get a specific React equivalent with the same wait and leading/trailing settings, instead of being dropped or turned into ad-hoc setTimeouts.
  • Observers and computed properties. Observers are not ported as useEffect chains; computed('a', 'b.[]', …) dependency keys become derived values with the same inputs.
  • Ember Data. Adapters (host, namespace, buildURL, urlForX) and serializers (normalizeResponse, attrs) are ported so the wire format stays byte-identical, and the identity-map caching the UI silently relies on is called out rather than lost.
  • Classic component traps. The implicit wrapper <div> (which CSS and tests often depend on), two-way mut bindings, sendAction/string actions and this.$().
  • ember-concurrency, mixins, initializers/instance-initializers and QUnit + Mirage tests, each with its own reference file.
  • Coexistence. Mounting React inside a running Ember app via a wrapper component or modifier, sharing session/current-user services, so the migration can ship route by route.

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 ember-inventory agent that maps routes, components, services, data layer and hidden wiring before any code changes.
  • Read-only ember-parity-reviewer agent that checks each ported unit against the original for behaviour, markup, data and timing differences before the old code may be deleted.
  • /plan command 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

  1. added
    awaiting-reviewSubmission is waiting for automated intake validation
    external-pluginPublic external plugin submission
    ready-for-reviewSubmission passed intake validation and is ready for maintainer review
    and removed
    awaiting-reviewSubmission is waiting for automated intake validation
    on Nov 3, 2026
  2. github-actions commented on Nov 3, 2026

    @github-actions
    Contributor

    ✅ 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

    Reviewer signals

    These are non-blocking heuristics for maintainer review; they are not evidence of misconduct or low quality.

    Signal Result
    Repository owner Organization-owned (third party)
    Repository age 28 day(s)
    Repository activity 0 stars; 0 forks
    Repository counts 0 stars · 1 watchers · 0 forks · 2 open issues/PRs
    Homepage heuristics ⚠️ pricing

    Quality gate summary

    Legend: ✅ pass · ⚠️ warning · 🛑 fail

    Gate Status
    spec compliance ✅ pass
    vally lint ✅ pass
    install smoke test ✅ pass
    version match ✅ pass
    ref/sha consistency ✅ pass
    canvas structure ⚪ not_run
    • spec compliance: pass
    • vally lint: pass
    • install smoke test: pass
    • version match: pass
    • ref/sha consistency: pass
    • canvas structure: not_run
    • overall: pass
    spec compliance output (✅ pass)
    Agent Plugins v1.0.0 manifest checks passed for plugin.json.
    
    vally lint output (✅ pass)
    ✅ cobuildx-ai-ember-to-react-migration (2/2 checks passed)
        ✓ [spec-compliance] All 1 skill(s) are spec-compliant.
            ✓ spec-compliance: All spec checks passed.
        ✓ [valid-refs] All file references across 1 skill(s) are valid.
            ✓ valid-refs: All file references resolve to existing files within the skill directory.
    
    1 skill(s) linted, 1 passed
    
    install smoke test output (✅ pass)
    Install smoke test succeeded. Verified /tmp/external-plugin-quality-pndBiA/copilot-home/.copilot/installed-plugins/external-plugin-intake/ember-to-react/plugin.json.
    
    Version match output
    - v2.1.0: matched version "2.2.0" at "ember-to-react/plugin.json".
    - 74aca6579e74a5739783dc00b6d3418c6f48af18: matched version "2.2.0" at "ember-to-react/plugin.json".
    
    Ref/SHA consistency output
    source.ref "v2.1.0" resolves to the same commit as source.sha "74aca6579e74a5739783dc00b6d3418c6f48af18".
    
    Canvas structure output
    Canvas structure gate skipped because plugin is not tagged with "canvas".
    

    Canonical external.json payload

    {
      "name": "ember-to-react",
      "description": "Migrate Ember.js apps to React — full rewrites or incremental strangler-fig migrations of any size.",
      "version": "2.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/ember-to-react",
      "license": "MIT",
      "keywords": [
        "react",
        "migration",
        "ember",
        "ember-octane",
        "refactoring",
        "modernization"
      ],
      "source": {
        "source": "github",
        "repo": "cobuild-tech/cbx-plugins",
        "path": "ember-to-react",
        "ref": "v2.1.0",
        "sha": "74aca6579e74a5739783dc00b6d3418c6f48af18"
      }
    }
  3. aaronpowell commented on Nov 4, 2026

    @aaronpowell
    Contributor

    /reject This is substantially the plugin rejected in #5863, plus a Direct mode and a coupling checklist. Your own evals show the model without the plugin already passes the Ember gotchas the checklist targets (Ember Data identity map, settled()/test waiters, router-owned query params) and scores 26/30 overall. The +3 comes from two runs where the final summary listed behaviour differences, which a one-line prompt achieves, and one wrapper-class fix. Teardown still failed with the skill loaded. All runs were single-shot in Claude Code, not Copilot. This still doesn't demonstrate meaningful model uplift.

  4. added
    rejectedSubmission was rejected by a maintainer
    and removed
    ready-for-reviewSubmission passed intake validation and is ready for maintainer review
    on Nov 4, 2026
  5. github-actions commented on Nov 4, 2026

    @github-actions
    Contributor

    ❌ External plugin rejected

    A maintainer rejected ember-to-react, and the submission issue has been closed.

    Reason

    This is substantially the plugin rejected in #5863, plus a Direct mode and a coupling checklist. Your own evals show the model without the plugin already passes the Ember gotchas the checklist targets (Ember Data identity map, settled()/test waiters, router-owned query params) and scores 26/30 overall. The +3 comes from two runs where the final summary listed behaviour differences, which a one-line prompt achieves, and one wrapper-class fix. Teardown still failed with the skill loaded. 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-intake will no longer reopen it. If you address the feedback, please open a new external plugin submission issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    external-pluginPublic external plugin submissionrejectedSubmission was rejected by a maintainerthird party

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions