β.4: one-lab provisioning (closes #4) - #10
Conversation
jack-champagne
left a comment
There was a problem hiding this comment.
Gave β.4 a look — pulled it, CI green, scope is clean and in-lane. Two things stood out that are worth fixing before this is the install path we hand a lab.
Must change
packagebuilds the extension + opencode but never builds/stagesamico-run, so the VSIX can ship without the orchestrator — and the test that'd catch it isskipIf(no VSIX), so CI never does. Only the runtime healthcheck backstops it.probeCredsregexes a.jsoncfile, so a"model"inside a//comment passes the creds check (false green).
Taste / non-blocking
- Pin the Julia minor to the 1.12.3 Manifest you vendor, so the healthcheck Julia and the shipped Manifest can't drift.
- The probes (creds/julia/opencode/amicorun) have no tests — only the pure
resolveChecksaggregator does.
| "fetch:opencode": "node scripts/fetch_opencode.mjs" | ||
| "fetch:opencode": "node scripts/fetch_opencode.mjs", | ||
| "healthcheck": "node scripts/healthcheck.mjs", | ||
| "package": "pnpm run build && pnpm run fetch:opencode && vsce package --no-dependencies --allow-missing-repository -o amicode.vsix" |
There was a problem hiding this comment.
package never builds/stages amico-run — the VSIX can ship without it, and packaging.test.ts is skipIf(no VSIX) so CI won't catch it.
There was a problem hiding this comment.
Fixed in 7c768d8 — the package script now runs pnpm --filter @amicode/amico-run build first, so the VSIX can't ship without the orchestrator. The packaging-manifest assertion verifies amico-run is present in the staged VSIX.
| // amazon-bedrock, AWS creds findable in env or ~/.aws. Not a paid LLM call. | ||
| const cfgPath = [join(homedir(), '.config', 'opencode', 'opencode.jsonc'), join(homedir(), '.config', 'opencode', 'opencode.json')].find(existsSync) | ||
| if (!cfgPath) return { ok: false, reason: 'no opencode config', fix: 'create ~/.config/opencode/opencode.jsonc with a model' } | ||
| const model = /"model"\s*:\s*"([^"]+)"/.exec(readFileSync(cfgPath, 'utf8'))?.[1] |
There was a problem hiding this comment.
Regex on a .jsonc file — a "model" inside a // comment passes here. Parse with jsonc-parser (already a dep).
There was a problem hiding this comment.
Fixed in 7c768d8 — probeCreds now strips JSONC (string-aware, so a // inside a URL/model-id is preserved) and JSON.parses the result, so a "model" mentioned inside a real comment can't false-pass. Covered in healthcheck.test.ts.
…ce + package/healthcheck scripts + repository field; .vscodeignore ships julia/ Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…de/amico-run/creds probes); all 4 green on dev machine Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…+ opencode + template + julia (verified, 39MB, 16 files) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- package: build @amicode/amico-run before packaging, so esbuild's bin/ staging isn't silently skipped and the VSIX always ships the orchestrator (the packaging.test is skipIf-no-VSIX, so this was the real backstop). - healthcheck probeCreds: parse the opencode .jsonc (string-aware comment strip + JSON.parse) instead of regexing it — a "model" inside a // comment no longer false-passes, and the $schema URL's // is preserved. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
a9c4e2c to
7c768d8
Compare
|
Thanks Jack — both addressed in the latest push (rebased on the updated #9).
Taste: pinning the healthcheck Julia minor to the vendored 1.12.3 Manifest — sensible; I left it for a follow-up to keep this PR focused on the two must-changes. Noted. |
|
Thanks @jack-champagne — both must-changes are in 7c768d8:
The taste items (pin Julia minor to the vendored Manifest; probe-level tests) I'm treating as non-blocking follow-ups unless you'd rather they land here. Re-requesting review. |
|
Provisioning machinery is solid — deterministic instantiate of the pinned stack, clean pure/impure split in healthcheck, VSIX-content guard. Notes:
|
jack-champagne
left a comment
There was a problem hiding this comment.
Approving — provisioning is solid; the blank --project is fixed in #12. The julia-version gate is a worthwhile follow-up (comment above).
Closes #4. Stacked on #9 (β.3) → base retargets to
mainas the stack merges. Separate PR from β.6 (demo dry-run, coming next).Makes a clean machine Amicode-ready + verifiable, per
spec-20260617-134308-one-lab-provisioning.What this is
packages/extension/julia/{Project,Manifest}.tomlpins the vetted Piccolo 1.19 stack; provisioning is a deterministicPkg.instantiate(no resolver drift, no sysimage).scripts/install.sh— idempotent: checks Julia, instantiates~/.amico/julia,code --install-extension, drops a starterlab.toml, prints next steps.scripts/healthcheck.mjs— exit-coded; a pureresolveChecks()(unit-tested with injected probes) + probes for julia+Piccolo, opencode/event200 (spawns β.2's boot-smoke), amico-run--help, and Bedrock-creds (config-level). All 4 ✓, exit 0 on this machine.vscepackaging —pnpm --filter amicode-v2 packageproducesamicode.vsix(39 MB, 16 files); a packaging-manifest test asserts the VSIX actually contains the staged amico-run, vendored opencode, template, and the pinned julia project (guards the β.2 dropped-asset trap).RUNBOOK.md— timed ≤60-min clean-machine steps.AC → evidence
--helpexits 0; β.3 ships the templateresolveChecksunit tests (3) + live run: all 4 ✓ exit 0extension/bin/dist/amico-run.js,vendor/opencode/darwin-arm64/opencode,templates/solve_template.jl,julia/Project.tomlall presentScope guardrails held: no PackageCompiler sysimage and no multi-lab lab.toml schema (both Phase 2); deterministic instantiate from the committed Manifest.
Fast tier: 45 amico-run + 30 extension tests green from a clean install.
🤖 Generated with Claude Code