Commit 3355734
Ship the Claude Code plugin (generate-app + walk-app) — 3rd distribution surface (#105)
* feat(plugin): Claude Code plugin skeleton — generate-app orchestration skill (#100)
First cut of the Claude Code plugin (ROADMAP Post-v0.1 backlog → in progress on
epic/claude-code-plugin). Minimal end-to-end: generate → validate → explain.
- plugin/.claude-plugin/plugin.json — manifest (name nativeapptemplate-agent).
- plugin/skills/generate-app/SKILL.md — orchestration skill: resolve spec,
run the CLI (local dist or npx) with --report-format=both --exit-zero, parse
out/<slug>/report.json, and summarize per-platform layer1/2(/3) + reviewer
parity + domain mapping; on failure surface the specific findings and the next
move (--rename, NATIVEAPPTEMPLATE_REPAIR, NATIVEAPPTEMPLATE_VISUAL). The
mobile-mcp home-screen walk-through is explicitly deferred to phase 2.
- plugin/.mcp.json — bundles the generator MCP server.
- plugin/README.md — local install (claude --plugin-dir ./plugin) + usage.
Fix a propagated invocation bug: there is no npm package
`nativeapptemplate-agent-mcp` (it's a *bin* of `nativeapptemplate-agent`), so
`npx -y nativeapptemplate-agent-mcp` 404s. Correct form, verified against the
published 0.2.1 with a real MCP initialize handshake from a clean dir:
`npx -y -p nativeapptemplate-agent nativeapptemplate-agent-mcp`.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat(plugin): phase 2 — walk-app skill (mobile-mcp UI walkthrough) (#102)
Second skill on the plugin epic: launch a generated app on a booted iOS sim /
Android emulator and walk its UI conversationally via mobile-mcp — capture the
home screen, list elements, tap through a flow, screenshots inline.
- plugin/skills/walk-app/SKILL.md — resolve out/<slug> + platform; get the app
onto a device (recommended: a NATIVEAPPTEMPLATE_VISUAL=1 generate run does the
build+install+launch; manual xcodebuild/gradlew path documented); connect
mobile-mcp; capture + walk; stay interactive; diagnose the known device-layer
failure modes. Honest about the booted-device + installed-build prerequisites
(the flakiest link).
- plugin/.mcp.json — bundle @mobilenext/mobile-mcp alongside the generator server.
- generate-app SKILL.md — hand-off now points at walk-app instead of "not wired".
- plugin/README.md — document both skills + both MCP servers.
- plugin.json — 0.1.0 → 0.2.0.
Android emulator guidance follows the house rule: boot via Android Studio Device
Manager, not CLI `emulator -avd` (Studio owns adb here). Device-dependent paths
are untested from here by design — needs a booted sim/emulator on the dev machine.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix(plugin): pin generator MCP server to @latest (cwd-shadow resolution bug) (#103)
The bundled generator MCP server failed to start with
`sh: nativeapptemplate-agent-mcp: command not found` (confirmed in Claude's
mcp-logs). MCP servers spawn with cwd = the project root; when that root is the
`nativeapptemplate-agent` package's own repo, `npx -p nativeapptemplate-agent`
resolves the *local* package and the bin isn't on the path it expects. Pinning
`nativeapptemplate-agent@latest` forces registry resolution regardless of cwd —
verified with a live MCP initialize handshake from inside the repo.
README updated to document why both `-p` and `@latest` are required.
Note: the `mobile-mcp` "✘ failed" seen alongside is unrelated — it's the user's
identical global mobile-mcp config (a standalone third-party package, no cwd
shadowing), whose connection closed during first-run npx download; it stays alive
when run standalone.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix(plugin): pin bundled mobile-mcp to 0.0.54 (0.0.55+ closes stdio) (#104)
The bundled mobile-mcp server (and the user's identical global one) showed
✘ failed in /mcp: mobile-mcp 0.0.55+ closes the stdio connection on startup
(observed: "Connection closed" ~6s in, zero output), so `@latest` (now 0.0.56)
never completes the MCP handshake. 0.0.54 starts cleanly ("mobile-mcp server
running on stdio" + valid initialize response) — verified with a live handshake.
This is the same conclusion the agent core already reached: src/mobile.ts pins
DEFAULT_ARGS to @mobilenext/mobile-mcp@0.0.54 "(was @latest). mobile-mcp 0.0.55+
closes the stdio …". The plugin now matches that pin.
Side benefit: pinning makes the bundled command differ from a typical global
`@latest` mobile-mcp config, so Claude won't dedup the broken global over our
working bundled one.
Note (out of scope, separate): CLAUDE.md's Stack section still lists
`npx -y @mobilenext/mobile-mcp@latest`, which is stale/misleading given this pin.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* docs: flip Claude Code plugin to shipped (3 surfaces) + fix mobile-mcp pin
The plugin epic is built and verified end-to-end (generate-app + walk-app), so
update the docs from "deferred/planned" to shipped:
- README: plugin section now documents both skills + `claude --plugin-dir ./plugin`.
- CLAUDE.md: Packaging → three surfaces (CLI + MCP + plugin), with the load-bearing
.mcp.json pins noted. Stack: mobile-mcp `@latest` → `@0.0.54` (the stale advice
that 0.0.55+ closes stdio — the bug that cost real debugging).
- ROADMAP: Track 1 third surface = plugin; Post-v0.1 "Claude Code plugin" section
flipped to Status: shipped, recording that the skill carried the value without
dispatch() streaming (as predicted).
- SPEC addendum: §8 row + structural bullet → CLI + MCP + plugin (three).
- walk-app SKILL.md: add the iOS WebDriverAgent (:8100) prerequisite; Android
needs none (adb-direct), confirmed on the Pixel emulator walk.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>1 parent 300696f commit 3355734
9 files changed
Lines changed: 347 additions & 13 deletions
File tree
- docs
- plugin
- .claude-plugin
- skills
- generate-app
- walk-app
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | | - | |
| 21 | + | |
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
| |||
110 | 110 | | |
111 | 111 | | |
112 | 112 | | |
113 | | - | |
| 113 | + | |
114 | 114 | | |
115 | 115 | | |
| 116 | + | |
116 | 117 | | |
117 | | - | |
| 118 | + | |
118 | 119 | | |
119 | 120 | | |
120 | 121 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
126 | 126 | | |
127 | 127 | | |
128 | 128 | | |
129 | | - | |
| 129 | + | |
130 | 130 | | |
131 | 131 | | |
132 | 132 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
34 | | - | |
| 34 | + | |
35 | 35 | | |
36 | 36 | | |
37 | 37 | | |
| |||
86 | 86 | | |
87 | 87 | | |
88 | 88 | | |
89 | | - | |
| 89 | + | |
90 | 90 | | |
91 | | - | |
| 91 | + | |
| 92 | + | |
92 | 93 | | |
93 | | - | |
94 | | - | |
95 | | - | |
| 94 | + | |
96 | 95 | | |
97 | | - | |
| 96 | + | |
98 | 97 | | |
99 | 98 | | |
100 | 99 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
27 | 27 | | |
28 | 28 | | |
29 | 29 | | |
30 | | - | |
| 30 | + | |
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
35 | 35 | | |
36 | 36 | | |
37 | | - | |
| 37 | + | |
38 | 38 | | |
39 | 39 | | |
40 | 40 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
0 commit comments