[GH-ISSUE #91] Backport remaining adapters to the CLI's local fallback #81

Closed
opened 2026-08-13 19:11:09 +02:00 by zaph0d · 3 comments
Owner

Originally created by @niels-emmer on GitHub (Aug 13, 2026).
Original GitHub issue: https://github.com/niels-emmer/myace/issues/91

`myace pull` can render a compiled profile locally without hitting the server, using per-adapter copies in `cli/myace_cli/adapters/`. Per `docs/extending.md`: "the CLI currently only mirrors the original three — `claude_code`, `opencode`, `cursor` — so this step is aspirational for the other nine until someone backports them."

Backend has 12 adapters (`backend/app/adapters/`); the CLI only has fallbacks for 3, meaning `myace pull` for any of the other 9 targets (windsurf, cline, aider, cody, amazon-q, continue, copilot-cli, codex-cli, and whichever adapter lands from #<pi.dev issue>) requires the server to be reachable — no offline fallback.

Task: port the remaining 9 backend adapters' `translate()` logic into `cli/myace_cli/adapters/`, keeping output identical to the backend version (there's no automated parity check today — worth keeping in mind, maybe worth adding as a follow-up). Can be tackled one adapter at a time / split across multiple PRs.

Originally created by @niels-emmer on GitHub (Aug 13, 2026). Original GitHub issue: https://github.com/niels-emmer/myace/issues/91 \`myace pull\` can render a compiled profile locally without hitting the server, using per-adapter copies in \`cli/myace_cli/adapters/\`. Per \`docs/extending.md\`: *"the CLI currently only mirrors the original three — \`claude_code\`, \`opencode\`, \`cursor\` — so this step is aspirational for the other nine until someone backports them."* Backend has 12 adapters (\`backend/app/adapters/\`); the CLI only has fallbacks for 3, meaning \`myace pull\` for any of the other 9 targets (windsurf, cline, aider, cody, amazon-q, continue, copilot-cli, codex-cli, and whichever adapter lands from #<pi.dev issue>) requires the server to be reachable — no offline fallback. **Task:** port the remaining 9 backend adapters' \`translate()\` logic into \`cli/myace_cli/adapters/\`, keeping output identical to the backend version (there's no automated parity check today — worth keeping in mind, maybe worth adding as a follow-up). Can be tackled one adapter at a time / split across multiple PRs.
Author
Owner

@niels-emmer commented on GitHub (Aug 14, 2026):

Marking as backlog/future work: the CLI-side adapter fallback path (cli/myace_cli/adapters/) isn't currently wired into myace pull at all — sync.py always hits /api/v1/profiles/compile on the server regardless of target. Porting the remaining 8 adapters would mean maintaining 11 hand-synced translate() copies (no parity check exists yet) for a fallback path nothing calls today. Given MyACE's self-hosted, always-on-server deployment model, the offline case is narrow (CI/airgapped runs, server outages). Worth revisiting if/when myace pull actually gains a local-fallback code path, and ideally after an automated parity check exists to catch drift.

<!-- gh-comment-id:5295229172 --> @niels-emmer commented on GitHub (Aug 14, 2026): Marking as backlog/future work: the CLI-side adapter fallback path (`cli/myace_cli/adapters/`) isn't currently wired into `myace pull` at all — `sync.py` always hits `/api/v1/profiles/compile` on the server regardless of target. Porting the remaining 8 adapters would mean maintaining 11 hand-synced `translate()` copies (no parity check exists yet) for a fallback path nothing calls today. Given MyACE's self-hosted, always-on-server deployment model, the offline case is narrow (CI/airgapped runs, server outages). Worth revisiting if/when `myace pull` actually gains a local-fallback code path, and ideally after an automated parity check exists to catch drift.
Author
Owner

@niels-emmer commented on GitHub (Aug 14, 2026):

Marvin (AI) on behalf of Niels:

Checked current state of cli/myace_cli/adapters/ vs backend/app/adapters/ and docs/extending.md against main.

Agree with the backlog call in the comment above, and can confirm the reasoning against current code: cli/myace_cli/sync.py's pull_profile() unconditionally calls the backend's /profiles/compile endpoint — no try/except, no fallback branch, and nothing in main.py/sync.py imports myace_cli.adapters at all. The package is real and (for the 3 targets it covers) correctly maintained, but genuinely dead code today. docs/extending.md already states this plainly as of #96 ("a local-rendering fallback that hasn't been wired up yet... adding a CLI copy for a new adapter is optional"), so the docs and the issue's premise are now aligned — no remaining doc drift on this point.

What's actually changed since this issue was filed (#95, #96 both merged):

  • Backend adapter count is 11, not 12 — cody.py was retired in #95 (product discontinued), so the real remaining gap is 8 un-ported adapters (aider, amazon-q, cline, codex-cli, continue, copilot-cli, goose, windsurf), not 9.
  • #96 already fixed the 2 CLI copies that existed but had drifted (claude_code.py, cursor.py had the same bugs #95 fixed on the backend side) and added test coverage that didn't exist before (test_claude_code_adapter.py, test_cursor_adapter.py). So the 3 adapters the CLI does mirror are now correct and tested — the gap is purely the 8 that were never ported, not lingering drift on the existing 3.

Triage: the backport itself still isn't worth doing — 8 more hand-synced translate() copies for a code path myace pull never calls, with no automated parity check to catch drift (exactly the kind of drift #96 just had to fix by hand). Two things would make this worth revisiting, per the issue body's own framing: (1) myace pull actually gains a local-fallback branch that calls myace_cli.adapters, and (2) an automated parity check (e.g. a test that runs both translate() implementations against the same fixture artifacts and diffs the output) exists before more hand-synced copies are added. Suggest closing this as backlog / not-planned for now, or re-scoping the title to the actual blocking prerequisite ("wire local-fallback path into myace pull") rather than leaving it phrased as a ready-to-pick-up adapter-porting task.

Comment-only, no code changes.

<!-- gh-comment-id:5295296751 --> @niels-emmer commented on GitHub (Aug 14, 2026): Marvin (AI) on behalf of Niels: Checked current state of `cli/myace_cli/adapters/` vs `backend/app/adapters/` and `docs/extending.md` against `main`. **Agree with the backlog call in the comment above, and can confirm the reasoning against current code:** `cli/myace_cli/sync.py`'s `pull_profile()` unconditionally calls the backend's `/profiles/compile` endpoint — no try/except, no fallback branch, and nothing in `main.py`/`sync.py` imports `myace_cli.adapters` at all. The package is real and (for the 3 targets it covers) correctly maintained, but genuinely dead code today. `docs/extending.md` already states this plainly as of #96 ("a local-rendering fallback that hasn't been wired up yet... adding a CLI copy for a new adapter is optional"), so the docs and the issue's premise are now aligned — no remaining doc drift on this point. **What's actually changed since this issue was filed (#95, #96 both merged):** - Backend adapter count is 11, not 12 — `cody.py` was retired in #95 (product discontinued), so the real remaining gap is **8** un-ported adapters (`aider`, `amazon-q`, `cline`, `codex-cli`, `continue`, `copilot-cli`, `goose`, `windsurf`), not 9. - #96 already fixed the 2 CLI copies that existed but had drifted (`claude_code.py`, `cursor.py` had the same bugs #95 fixed on the backend side) and added test coverage that didn't exist before (`test_claude_code_adapter.py`, `test_cursor_adapter.py`). So the 3 adapters the CLI *does* mirror are now correct and tested — the gap is purely the 8 that were never ported, not lingering drift on the existing 3. **Triage:** the backport itself still isn't worth doing — 8 more hand-synced `translate()` copies for a code path `myace pull` never calls, with no automated parity check to catch drift (exactly the kind of drift #96 just had to fix by hand). Two things would make this worth revisiting, per the issue body's own framing: (1) `myace pull` actually gains a local-fallback branch that calls `myace_cli.adapters`, and (2) an automated parity check (e.g. a test that runs both `translate()` implementations against the same fixture artifacts and diffs the output) exists before more hand-synced copies are added. Suggest closing this as backlog / not-planned for now, or re-scoping the title to the actual blocking prerequisite ("wire local-fallback path into myace pull") rather than leaving it phrased as a ready-to-pick-up adapter-porting task. Comment-only, no code changes.
Author
Owner

@niels-emmer commented on GitHub (Aug 17, 2026):

Closing as not-planned per the triage above (both the owner's comment and the AI-agent triage comment reached the same conclusion): `cli/myace_cli/adapters/` isn't wired into `myace pull` today — `sync.py` always calls the backend's `/profiles/compile` endpoint directly, so porting more adapters into it means hand-maintaining copies for a code path nothing exercises, with no automated parity check to catch drift.

Revisit if/when both prerequisites land: (1) `myace pull` gains an actual local-fallback branch that calls `myace_cli.adapters`, and (2) an automated parity check exists (e.g. a test running both `translate()` implementations against the same fixture artifacts and diffing output) to catch drift before more hand-synced copies are added.

<!-- gh-comment-id:5315876116 --> @niels-emmer commented on GitHub (Aug 17, 2026): Closing as not-planned per the triage above (both the owner's comment and the AI-agent triage comment reached the same conclusion): \`cli/myace_cli/adapters/\` isn't wired into \`myace pull\` today — \`sync.py\` always calls the backend's \`/profiles/compile\` endpoint directly, so porting more adapters into it means hand-maintaining copies for a code path nothing exercises, with no automated parity check to catch drift. Revisit if/when both prerequisites land: (1) \`myace pull\` gains an actual local-fallback branch that calls \`myace_cli.adapters\`, and (2) an automated parity check exists (e.g. a test running both \`translate()\` implementations against the same fixture artifacts and diffing output) to catch drift before more hand-synced copies are added.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
github-mirrors/myace#81
No description provided.