|
| 1 | +# Amp native adapter proof — 2026-09-07 |
| 2 | + |
| 3 | +## Pins and boundary |
| 4 | + |
| 5 | +- `@ampcode/plugin@0.0.0-20260907001852-gf348fed` |
| 6 | +- `@ampcode/cli@0.0.1788739286-gf348fe` |
| 7 | +- Official Plugin, PluginAPI, Skills, and MCP pages retrieved 2026-09-07 |
| 8 | +- No Amp account was available. Live thread, model, and tool execution was not run and remains |
| 9 | + **unverified**, not unsupported. |
| 10 | + |
| 11 | +Everything below ran under `/tmp/agent-bundle-amp-proof` with |
| 12 | +`HOME=/tmp/agent-bundle-amp-proof/home`. |
| 13 | + |
| 14 | +## Build and static artifact proof |
| 15 | + |
| 16 | +The disposable consumer installed the two pinned Amp packages, TypeScript, Node/Bun type |
| 17 | +declarations, and the locally built `agent-bundle` package. npm 12 blocked the CLI postinstall by |
| 18 | +default, so the proof completed the package's own `node node_modules/@ampcode/cli/install.cjs` |
| 19 | +before invoking Amp. |
| 20 | + |
| 21 | +`agent-bundle build --target amp` emitted: |
| 22 | + |
| 23 | +```text |
| 24 | +artifact/ |
| 25 | +├── .amp/plugins/amp-proof/index.js |
| 26 | +├── .amp/plugins/amp-proof/skills/review/SKILL.md |
| 27 | +├── INSTALL.md |
| 28 | +├── agent-bundle.compile-evidence.json |
| 29 | +└── agent-bundle.manifest.json |
| 30 | +``` |
| 31 | + |
| 32 | +The manifest recorded `manifestVersion: 4`, |
| 33 | +`builtInHost: "amp"`, `documents.entry: ".amp/plugins/amp-proof/index.js"`, |
| 34 | +adapter revision `1.0.0`, and the pinned PluginAPI version. The compile evidence used |
| 35 | +`closed-world-externals` revision 1 and recorded no compiled assets for the content-only plugin. |
| 36 | + |
| 37 | +## PluginAPI type and fake-host proof |
| 38 | + |
| 39 | +Two generated entries were checked with TypeScript 7.0.2 in strict `checkJs` mode: |
| 40 | + |
| 41 | +1. the content-only factory with one explicit `registerSkill`; |
| 42 | +2. a callback factory containing inline handlers for `session.start`, `tool.call`, `tool.result`, |
| 43 | + `agent.start`, and `agent.end`. |
| 44 | + |
| 45 | +The disposable `tsconfig.json` alone used `skipLibCheck: true`, because the pinned upstream |
| 46 | +declaration references `Symbol.observable`, which the selected TypeScript libs do not declare. |
| 47 | +No repository compiler setting was weakened. |
| 48 | + |
| 49 | +Both entries passed. Neither has a runtime `@ampcode/plugin` import; its only reference is the |
| 50 | +JSDoc type on the default async factory. A typed fake `PluginAPI` then imported the factories and |
| 51 | +asserted: |
| 52 | + |
| 53 | +- exactly `registerSkill({ path: "skills/review" })`; |
| 54 | +- no event registrations for the content-only entry; |
| 55 | +- exactly the five documented event registrations for the callback entry; |
| 56 | +- `tool.call` native results preserved as `reject-and-continue`, `modify`, and `synthesize`; |
| 57 | +- `tool.result` replacement preserved as `{ status: "done", output: "replaced" }`. |
| 58 | + |
| 59 | +The repository adapter tests additionally cover `allow`, `agent.start` appended context, |
| 60 | +`agent.end` continuation, generated wrapper execution, MCP/frontmatter precedence, relocation, |
| 61 | +and receipt-owned install/replace/uninstall. |
| 62 | + |
| 63 | +## Account-free CLI observations |
| 64 | + |
| 65 | +- `amp --help`: exit 0; lists `plugins`, `skill`, and `mcp`. |
| 66 | +- `amp skill add --help`: exit 0; source is `owner/repo[/path]`, a Git URL, or a local path; |
| 67 | + `--global` targets `~/.config/agents/skills/`. |
| 68 | +- `amp plugins list`: exit 1: |
| 69 | + |
| 70 | + ```text |
| 71 | + Error: failed to load global plugins. Unable to connect to https://ampcode.com/. |
| 72 | + ``` |
| 73 | + |
| 74 | +- `amp skills list --json`: started the login flow with `No API key found. Starting login flow...` |
| 75 | + and was terminated rather than opening or completing an account login. |
| 76 | + |
| 77 | +Amp documents `plugins: reload` only as an interactive command-palette action. No standalone |
| 78 | +plugin validator exists, so the implementation does not invent or automate either operation. |
0 commit comments