POK-313: Add MiMo Code, Oh My Pi, Mistral Vibe from AgentPeek gap analysis - #38
Conversation
β¦lysis Adds three AI coding agents that AgentPeek tracks but aikit was missing, each wired end-to-end (install/update/version-check/uninstall/auth-discovery) following the existing registry pattern. Bumps aikit 1.15.5 -> 1.16.0 (MINOR, additive) and the AGENTS count 31 -> 34. New agents: - mimo (MiMo Code, Xiaomi) β curl installer + npm @mimo-ai/cli version source. - omp (Oh My Pi, can1357) β curl installer + npm @oh-my-pi/pi-coding-agent. - vibe (Mistral Vibe) β curl installer + pip mistral-vibe version source. Gateway coverage: classify the three as pending (no verified env-var or renderer yet) so they show up loudly in coverage rather than silently defaulting to unclassified. Bucket counts: renderer 12, env 7, pending 4->7, unsupported 8. ZCode intentionally not managed: Z.ai ships it only as a signed desktop app with no public CLI installer (no curl|bash, npm, or pip), so it does not fit aikit's install/update/uninstall contract. Documented as a known gap in docs/aikit.md. Closes POK-313 Co-authored-by: multica-agent <github@multica.ai>
saheljalal
left a comment
There was a problem hiding this comment.
Review β POK-313 (aikit 1.16.0: +mimo, +omp, +vibe)
Solid, well-scoped PR. The three new entries follow the existing registry pattern faithfully, version-bump discipline is clean (1.15.5 β 1.16.0 MINOR, all four sync points updated: docstring, __version__, docs H1, CHANGELOG), tests are surgical with annotated assertion deltas, and the GATEWAY_COVERAGE classification choice (pending with concrete reason strings) is exactly the right call β visibly tracked rather than silently defaulted. All 430 tests pass + 1 pre-existing skip, confirmed locally.
Verdict: Request changes β one Should-fix to verify/complete the omp + mimo uninstall path before merge, plus a few minor nits. vibe is clean.
π‘ Should-fix
- aikit:468 / aikit:685 (omp & mimo uninstall is half-wired). Both entries install via
curl | shbut rely onversion_check: {type: npm}to derivenpm uninstall -g @oh-my-pi/pi-coding-agent/npm uninstall -g @mimo-ai/cli. If the curl installer doesn't install via npm under the hood (Pi forks like omp typically ship a compiled single binary, not an npm-wrapped one), thenaikit uninstall ompwill print a command that's a no-op against the actual install aikit itself performed β and the user is left with a fully-workingomp/mimobinary plus a~/.omp//~/.local/share/mimocode/data dir that the same PR'sdiscover_authandpath_markerspoint at. I smoke-testedresolve_uninstall_cmd()for both: neither touches the vendor dir. This contradicts the PR's stated "no half-wired fields" contract. Two options:- Confirm the curl installers ultimately run
npm i -gand reply with that evidence (in which case the derived uninstall removes the package but still leaves the data dir β considerbinary_uninstall_cmd(..., vendor_dirs=[...])likegrok/kimi/claudeuse, to clean~/.ompand~/.local/share/mimocodetoo). - Add an explicit
uninstall_cmd(e.g.binary_uninstall_cmd("omp", vendor_dirs=["$HOME/.omp"])) and drop omp/mimo fromtest_aikit_npm_agent_uninstall_derived_from_version_check.
vibe is fine βpip_agent_uninstall_cmdalready does therm -f $HOME/.local/bin/vibebinary cleanup.
Note:qwenhas the same latent gap (systemic), but since this PR's whole premise is "works end to end / no half-wired entries," it's worth getting omp/mimo right here and filing a separate issue for qwen + the rest of the curl-install-with-npm-version_check family.
- Confirm the curl installers ultimately run
βͺ Nits (mimo entry polish β bundle as you see fit)
- aikit:465 β Windows install uses
powershell -ep Bypass -c "irm β¦ | iex", but no other agent in the registry uses-ep Bypass.irm | iexstreams the script (it isn't a local.ps1), so ExecutionPolicy doesn't apply β-ep Bypasslooks cargo-culted. Drop it for consistency with the other 33 entries, unless MiMo's installer genuinely requires it (in which case a one-line comment helps). - aikit:470 β
path_markersincludes/.mimocode/but neither theauth_notenordiscover_authreference that path (they use~/.config/mimocode/and~/.local/share/mimocode/). Either align the marker to a path the install actually writes, or drop it. - aikit:2767 β
discover_authcomment claimsMIMOCODE_HOME relocates both, but the branch only checks the two hardcoded paths and never readsMIMOCODE_HOME. Either honor the env override or drop the claim β as-is the comment promises behavior the code doesn't implement.
β Praise
- aikit:4158-4163 β classifying the three new agents as
pendingwithreasonstrings that name the exact config path / env var a future renderer or env wire would touch is the right call. It keeps the agents visibly tracked and the gap actionable, instead of letting them fall into the silentunclassifieddefault. This is the anti-silent-omission guarantee applied well. - Discover-auth branches correctly guard on
if data:and handleJSONDecodeError/OSErrorconsistently with the surrounding code β good defensive mirror of the existingpi/hermes/kilobranches. - Test updates are annotated with
# POK-313:comments at every assertion delta β easy to audit.
Once omp/mimo uninstall is verified or wired with an explicit cmd, this is an approve.
| "Windows": 'powershell -c "irm https://omp.sh/install.ps1 | iex"', | ||
| }, | ||
| "version_cmd": "omp --version", | ||
| "update_cmd": None, |
There was a problem hiding this comment.
π‘ Should-fix: derived npm uninstall won't reliably clean up a curl-installed omp.
omp installs via curl -fsSL https://omp.sh/install | sh, but with no explicit uninstall_cmd the npm version_check derives npm uninstall -g @oh-my-pi/pi-coding-agent. If omp.sh/install ships a compiled single binary (typical for can1357's Pi fork β it's a bun-compiled binary, not an npm-wrapped CLI), that npm uninstall is a no-op against the actual install aikit itself performed, and ~/.omp/ (which this same PR's discover_auth reads and path_markers advertises) survives.
I smoke-tested resolve_uninstall_cmd(AGENTS["omp"]) β npm uninstall -g @oh-my-pi/pi-coding-agent --prefix $HOME/.local β no rm of ~/.omp or the binary.
Two options:
- Confirm
omp.sh/installultimately runsnpm i -gand reply with that evidence; or - Add an explicit uninstall, e.g.
binary_uninstall_cmd("omp", vendor_dirs=["$HOME/.omp"])(thegrok/kimi/claudepattern), and moveompout oftest_aikit_npm_agent_uninstall_derived_from_version_check.
Same concern applies to mimo (aikit:468) β its path_markers even include /.mimocode/, implying files land there that npm uninstall won't touch. vibe is fine β pip_agent_uninstall_cmd already does binary cleanup.
This contradicts the PR's stated "no half-wired fields" contract for the uninstall axis.
| "install": { | ||
| "Linux": "curl -fsSL https://mimo.xiaomi.com/install | bash", | ||
| "Darwin": "curl -fsSL https://mimo.xiaomi.com/install | bash", | ||
| "Windows": 'powershell -ep Bypass -c "irm https://mimo.xiaomi.com/install.ps1 | iex"', |
There was a problem hiding this comment.
βͺ Nit: -ep Bypass is unique to mimo β no other entry in the registry uses it. irm | iex streams the script over HTTP (it isn't a local .ps1), so Windows ExecutionPolicy doesn't apply to it β the flag looks cargo-culted. Drop it to match the other 33 entries (powershell -c "irm β¦ | iex"), unless MiMo's installer genuinely requires it.
Two more mimo-entry polish items while I'm here:
path_markers(line 470) includes/.mimocode/, but neither theauth_notenordiscover_authreferences that path β they use~/.config/mimocode/and~/.local/share/mimocode/. Align or drop.- The
discover_authcomment (aikit:2767) saysMIMOCODE_HOME relocates both, but the branch only checks the two hardcoded paths and never readsMIMOCODE_HOME. Either honor the env override or drop the claim.
| # override or a native renderer yet, so they stay `pending` (visibly tracked) | ||
| # rather than `unclassified` (silent default). Each `reason` records the path | ||
| # a future renderer or env wire would touch, so the gap stays actionable. | ||
| "mimo": {"state": COVERAGE_PENDING, |
There was a problem hiding this comment.
β
Praise: classifying the three new agents as pending with concrete reason strings is exactly right.
The reasons name the precise config path or env var a future renderer or env wire would touch (~/.config/mimocode/mimocode.json, ~/.omp/agent/models.yml, OPENAI_BASE_URL/MISTRAL_BASE_URL), so the gap stays actionable rather than becoming a mystery. This is the anti-silent-omission guarantee (test_coverage_classifies_every_agent + assert "unclassified" not in counts) applied the way it was designed β keep these visibly tracked rather than letting them default into unclassified.
Addresses Code Reviewer Should-fix: mimo and omp install via curl (mimo ships a self-contained binary at ~/.mimocode/bin/mimo; omp runs bun install -g or drops a prebuilt binary), NOT npm β so the npm-derived 'npm uninstall -g β¦' was a no-op against aikit's own install and would have left the vendor dirs (~/.mimocode, ~/.omp) in place. - Add mimo_uninstall_cmd() (Kimi pattern: removes ~/.mimocode/bin/mimo + XDG config/data/cache dirs the curl installer and discover_auth touch). - Add omp_uninstall_cmd() (Grok pattern: removes ~/.local/bin/omp + ~/.omp). - Move mimo + omp out of test_aikit_npm_agent_uninstall_derived_from_version_check into a new test_aikit_curl_installed_npm_version_check_agents_have_explicit_uninstall that pins the contract: explicit uninstall_cmd set, npm version_check kept for update checks, derived 'npm uninstall -g β¦' NOT in the resolved cmd. - mimo nits: drop -ep Bypass from Windows install (no local .ps1 to bypass for), align path_markers + add install_paths so the curl-installed binary resolves when not on PATH (kimi pattern), switch requires to curl (the curl installer doesn't need node/npm), drop the inaccurate MIMOCODE_HOME claim in discover_auth (branch checks default XDG paths; comment now says so). vibe is unchanged (pip_agent_uninstall_cmd already does binary cleanup). 431 passed, 1 skipped. Co-authored-by: multica-agent <github@multica.ai>
saheljalal
left a comment
There was a problem hiding this comment.
Re-review β POK-313 (aikit 1.16.0: +mimo, +omp, +vibe) β Approved
All four prior findings addressed correctly; no new issues introduced. Full suite re-run locally: 431 passed, 1 skipped (matches the author's claim, +1 from the new test_aikit_curl_installed_npm_version_check_agents_have_explicit_uninstall test). CI green.
Prior findings β resolved
-
π‘ Should-fix: omp + mimo uninstall half-wired β resolved.
mimo_uninstall_cmd()correctly removes the binary at its real curl-install path (~/.mimocode/bin/mimo{,.bak}) plus all the XDG config/data dirs (~/.mimocode,~/.config/mimocode,~/.local/share/mimocode,~/Library/Application Support/mimocode,~/.cache/mimocode). Covers every dirdiscover_authreads.omp_uninstall_cmd()(Grok pattern) removes~/.local/bin/omp+~/.omp/.- Both
uninstall_removes_vendor_data = True, so the confirmation prompt fires on uninstall (same shape askimi/grok/claude). - New test
test_aikit_curl_installed_npm_version_check_agents_have_explicit_uninstallpins the contract on four axes β most importantly that the derivednpm uninstall -g β¦is NOT what runs. Good design: this is now a reusable invariant for any future curl-install + npm-version_check agent.
-
βͺ Nit 1: mimo Windows
-ep Bypassβ dropped β now plainpowershell -c "irm β¦ | iex", matchingomp/codex/grok/pi. -
βͺ Nit 2: mimo
path_markersalignment β aligned β now["/.mimocode/", "/.config/mimocode", "@mimo-ai/cli"](matches install + discover paths). Bonus: addedinstall_paths: ["~/.mimocode/bin/mimo"](matcheskimi) soresolve_agent_binfinds the binary off-PATH, and flippedrequiresfrom["node", "npm"]to["curl"]β a real correctness improvement since the curl installer the entry points at doesn't need node locally. -
βͺ Nit 3: discover_auth
MIMOCODE_HOMEclaim β corrected β comment now honestly says "we don't honor it here" and points at the default XDG paths the code actually checks.
β Praise
- Verification of the curl install mechanism (
omp.sh/installβbun install -g;mimo.xiaomi.com/installβ self-contained binary at~/.mimocode/bin/) is exactly the kind of evidence that should accompany a fix like this. Turned an assertion into a confirmed fact. - The new test doesn't just assert the fix β it asserts the contract for the whole class of curl-installed-but-npm-version-checked agents. The next agent added with this shape gets the invariant for free.
Approved β ready for human merge. Out-of-scope qwen systemic-uninstall audit the author flagged is a good candidate for a separate follow-up issue.
Closes POK-313
Summary
Adds the three AI coding agents that AgentPeek tracks but aikit was missing,
each wired end-to-end (install / update / version-check / uninstall /
auth-discovery) following the existing registry pattern. Bumps aikit
1.15.5 β 1.16.0 (MINOR, additive) and the AGENTS count 31 β 34.
The fourth AgentPeek-tracked agent we were missing, ZCode, has no public
CLI installer (Z.ai ships it only as a signed desktop app) and is intentionally
not added β documented as a known gap in
docs/aikit.mdso searches landsomewhere instead of silence.
New agents
mimocurl β¦ mimo.xiaomi.com/install/ PowerShellinstall.ps1@mimo-ai/cli(derives npm uninstall)~/.local/share/mimocode/auth.json(Linux) /~/Library/Application Support/mimocode/auth.json(macOS)ompcurl β¦ omp.sh/install/ PowerShellinstall.ps1@oh-my-pi/pi-coding-agent(derives npm uninstall)~/.omp/agent/auth.json(Pi-compatible layout)vibecurl β¦ mistral.ai/vibe/install.sh/pip install mistral-vibemistral-vibe(explicitpip_agent_uninstall_cmd)~/.vibe/config dir +MISTRAL_API_KEYenv varEach new entry has: per-platform install, real
version_check, workingupdate_cmdorupdate_via_install, uninstall (derived or explicit),auth_env_vars+auth_note,path_markers,requires,tags, and aper-agent
discover_authbranch.Gateway coverage
The three new agents land in
GATEWAY_COVERAGEaspending(each with areasonnaming the gap a future renderer or env wire would close). This keepsthem visibly tracked instead of silently defaulting to
unclassified.Bucket counts:
renderer12,env7,pending4 β 7,unsupported8(total 31 β 34;
unclassifiedstays 0).Tests
test_aikit_new_agent_registry_entries:len(AGENTS) == 34.test_aikit_npm_agent_uninstall_derived_from_version_checkwithmimoandomp(the npm-backed pair).test_aikit_pip_agent_uninstall_cmdswithvibe.test_aikit_gateway_coverage.pyandtest_aikit_gateway_passthrough.py.Verification
Files
aikitβ 3 newAGENTSentries, 3 newdiscover_authbranches, 3 newGATEWAY_COVERAGErows, version bump in docstring +__version__, agentcount 31 β 34 in module header + registry comment.
tests/test_tools_characterization.py,tests/test_aikit_gateway_coverage.py,tests/test_aikit_gateway_passthrough.pyβ count + bucket assertions updated.docs/aikit.mdβ new rows 32β34 + a "Not managed" section for ZCode;31 β 34everywhere the count appears.docs/aikit-gateway.md,README.mdβ count updates.CHANGELOG.mdβ new### 1.16.0 β 2026-07-19section.