β.4: one-lab provisioning (closes #4) - #10

Merged
Rchari1 merged 6 commits into
mainfrom
rchari/beta4-provisioning
Jun 26, 2026
Merged

β.4: one-lab provisioning (closes #4)#10
Rchari1 merged 6 commits into
mainfrom
rchari/beta4-provisioning

Conversation

@Rchari1

Copy link
Copy Markdown
Member

Closes#4. Stacked on #9 (β.3) → base retargets to main as 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

  • Bundled pinned Julia projectpackages/extension/julia/{Project,Manifest}.toml pins the vetted Piccolo 1.19 stack; provisioning is a deterministic Pkg.instantiate (no resolver drift, no sysimage).
  • scripts/install.sh — idempotent: checks Julia, instantiates ~/.amico/julia, code --install-extension, drops a starter lab.toml, prints next steps.
  • scripts/healthcheck.mjs — exit-coded; a pure resolveChecks() (unit-tested with injected probes) + probes for julia+Piccolo, opencode /event 200 (spawns β.2's boot-smoke), amico-run --help, and Bedrock-creds (config-level). All 4 ✓, exit 0 on this machine.
  • vsce packagingpnpm --filter amicode-v2 package produces amicode.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

Issue ACEvidence
Clean install ≤60min + amico-run finds bundled script (no exit-64)install.sh + RUNBOOK; amico-run probe --help exits 0; β.3 ships the template
healthcheck exit 0 all-pass / non-zero precise messageresolveChecks unit tests (3) + live run: all 4 ✓ exit 0
VSIX contains amico-run + opencode + template + juliapackaging-manifest assertion (green): extension/bin/dist/amico-run.js, vendor/opencode/darwin-arm64/opencode, templates/solve_template.jl, julia/Project.toml all present

Scope 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

@Rchari1

Copy link
Copy Markdown
MemberAuthor

@jack-champagne

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

  • package builds the extension + opencode but never builds/stages amico-run, so the VSIX can ship without the orchestrator — and the test that'd catch it is skipIf(no VSIX), so CI never does. Only the runtime healthcheck backstops it.
  • probeCreds regexes a .jsonc file, 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 resolveChecks aggregator does.

Comment threadpackages/extension/package.json Outdated
"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"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regex on a .jsonc file — a "model" inside a // comment passes here. Parse with jsonc-parser (already a dep).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 7c768d8probeCreds 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.

Rchari1and others added 6 commits June 20, 2026 21:40
…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>
@Rchari1
Rchari1force-pushed the rchari/beta4-provisioning branch from a9c4e2c to 7c768d8CompareJune 21, 2026 01:46
@Rchari1

Copy link
Copy Markdown
MemberAuthor

Thanks Jack — both addressed in the latest push (rebased on the updated #9).

  • package stages amico-run:package now runs pnpm --filter @amicode/amico-run build first, so esbuild's bin/ staging isn't skipped and the VSIX always ships the orchestrator. (esbuild also already warns on a skipped stage as a backstop.)
  • creds probe / jsonc:probeCreds now strips JSONC comments (string-aware, so the $schema URL's // is preserved) and JSON.parses — a "model" inside a // comment no longer false-passes. Verified both cases. Note: I used a small string-aware strip rather than jsonc-parser — it isn't actually in the dep tree, and the strip avoids adding a dep across the whole stack; happy to switch to jsonc-parser if you'd prefer.

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.

@Rchari1

Copy link
Copy Markdown
MemberAuthor

Thanks @jack-champagne — both must-changes are in 7c768d8:

  • package now builds/stages amico-run before packaging (VSIX can't ship without the orchestrator).
  • probeCreds parses with a string-aware JSONC strip + JSON.parse, so a "model" inside a // comment no longer false-passes.

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.

@jack-champagne

Copy link
Copy Markdown
Member

Provisioning machinery is solid — deterministic instantiate of the pinned stack, clean pure/impure split in healthcheck, VSIX-content guard. Notes:

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving — provisioning is solid; the blank --project is fixed in #12. The julia-version gate is a worthwhile follow-up (comment above).

@Rchari1
Rchari1 changed the base branch from rchari/beta3-agents-template to mainJune 26, 2026 20:08
@Rchari1
Rchari1 merged commit 22808dd into mainJun 26, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

β.4 — One-lab provisioning slice (bundle + install + healthcheck)

2 participants

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

β.4: one-lab provisioning (closes #4) - #10

Merged
Rchari1 merged 6 commits into
mainfrom
rchari/beta4-provisioning
Jun 26, 2026
Merged

β.4: one-lab provisioning (closes #4)#10
Rchari1 merged 6 commits into
mainfrom
rchari/beta4-provisioning

Conversation

@Rchari1

Copy link
Copy Markdown
Member

Closes#4. Stacked on #9 (β.3) → base retargets to main as 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

  • Bundled pinned Julia projectpackages/extension/julia/{Project,Manifest}.toml pins the vetted Piccolo 1.19 stack; provisioning is a deterministic Pkg.instantiate (no resolver drift, no sysimage).
  • scripts/install.sh — idempotent: checks Julia, instantiates ~/.amico/julia, code --install-extension, drops a starter lab.toml, prints next steps.
  • scripts/healthcheck.mjs — exit-coded; a pure resolveChecks() (unit-tested with injected probes) + probes for julia+Piccolo, opencode /event 200 (spawns β.2's boot-smoke), amico-run --help, and Bedrock-creds (config-level). All 4 ✓, exit 0 on this machine.
  • vsce packagingpnpm --filter amicode-v2 package produces amicode.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

Issue ACEvidence
Clean install ≤60min + amico-run finds bundled script (no exit-64)install.sh + RUNBOOK; amico-run probe --help exits 0; β.3 ships the template
healthcheck exit 0 all-pass / non-zero precise messageresolveChecks unit tests (3) + live run: all 4 ✓ exit 0
VSIX contains amico-run + opencode + template + juliapackaging-manifest assertion (green): extension/bin/dist/amico-run.js, vendor/opencode/darwin-arm64/opencode, templates/solve_template.jl, julia/Project.toml all present

Scope 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

@Rchari1

Copy link
Copy Markdown
MemberAuthor

@jack-champagne

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

  • package builds the extension + opencode but never builds/stages amico-run, so the VSIX can ship without the orchestrator — and the test that'd catch it is skipIf(no VSIX), so CI never does. Only the runtime healthcheck backstops it.
  • probeCreds regexes a .jsonc file, 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 resolveChecks aggregator does.

Comment threadpackages/extension/package.json Outdated
"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"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regex on a .jsonc file — a "model" inside a // comment passes here. Parse with jsonc-parser (already a dep).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 7c768d8probeCreds 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.

Rchari1and others added 6 commits June 20, 2026 21:40
…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>
@Rchari1
Rchari1force-pushed the rchari/beta4-provisioning branch from a9c4e2c to 7c768d8CompareJune 21, 2026 01:46
@Rchari1

Copy link
Copy Markdown
MemberAuthor

Thanks Jack — both addressed in the latest push (rebased on the updated #9).

  • package stages amico-run:package now runs pnpm --filter @amicode/amico-run build first, so esbuild's bin/ staging isn't skipped and the VSIX always ships the orchestrator. (esbuild also already warns on a skipped stage as a backstop.)
  • creds probe / jsonc:probeCreds now strips JSONC comments (string-aware, so the $schema URL's // is preserved) and JSON.parses — a "model" inside a // comment no longer false-passes. Verified both cases. Note: I used a small string-aware strip rather than jsonc-parser — it isn't actually in the dep tree, and the strip avoids adding a dep across the whole stack; happy to switch to jsonc-parser if you'd prefer.

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.

@Rchari1

Copy link
Copy Markdown
MemberAuthor

Thanks @jack-champagne — both must-changes are in 7c768d8:

  • package now builds/stages amico-run before packaging (VSIX can't ship without the orchestrator).
  • probeCreds parses with a string-aware JSONC strip + JSON.parse, so a "model" inside a // comment no longer false-passes.

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.

@jack-champagne

Copy link
Copy Markdown
Member

Provisioning machinery is solid — deterministic instantiate of the pinned stack, clean pure/impure split in healthcheck, VSIX-content guard. Notes:

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving — provisioning is solid; the blank --project is fixed in #12. The julia-version gate is a worthwhile follow-up (comment above).

@Rchari1
Rchari1 changed the base branch from rchari/beta3-agents-template to mainJune 26, 2026 20:08
@Rchari1
Rchari1 merged commit 22808dd into mainJun 26, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

β.4 — One-lab provisioning slice (bundle + install + healthcheck)

2 participants

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

β.4: one-lab provisioning (closes #4) - #10

Merged
Rchari1 merged 6 commits into
mainfrom
rchari/beta4-provisioning
Jun 26, 2026
Merged

β.4: one-lab provisioning (closes #4)#10
Rchari1 merged 6 commits into
mainfrom
rchari/beta4-provisioning

Conversation

@Rchari1

Copy link
Copy Markdown
Member

Closes#4. Stacked on #9 (β.3) → base retargets to main as 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

  • Bundled pinned Julia projectpackages/extension/julia/{Project,Manifest}.toml pins the vetted Piccolo 1.19 stack; provisioning is a deterministic Pkg.instantiate (no resolver drift, no sysimage).
  • scripts/install.sh — idempotent: checks Julia, instantiates ~/.amico/julia, code --install-extension, drops a starter lab.toml, prints next steps.
  • scripts/healthcheck.mjs — exit-coded; a pure resolveChecks() (unit-tested with injected probes) + probes for julia+Piccolo, opencode /event 200 (spawns β.2's boot-smoke), amico-run --help, and Bedrock-creds (config-level). All 4 ✓, exit 0 on this machine.
  • vsce packagingpnpm --filter amicode-v2 package produces amicode.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

Issue ACEvidence
Clean install ≤60min + amico-run finds bundled script (no exit-64)install.sh + RUNBOOK; amico-run probe --help exits 0; β.3 ships the template
healthcheck exit 0 all-pass / non-zero precise messageresolveChecks unit tests (3) + live run: all 4 ✓ exit 0
VSIX contains amico-run + opencode + template + juliapackaging-manifest assertion (green): extension/bin/dist/amico-run.js, vendor/opencode/darwin-arm64/opencode, templates/solve_template.jl, julia/Project.toml all present

Scope 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

@Rchari1

Copy link
Copy Markdown
MemberAuthor

@jack-champagne

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

  • package builds the extension + opencode but never builds/stages amico-run, so the VSIX can ship without the orchestrator — and the test that'd catch it is skipIf(no VSIX), so CI never does. Only the runtime healthcheck backstops it.
  • probeCreds regexes a .jsonc file, 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 resolveChecks aggregator does.

Comment threadpackages/extension/package.json Outdated
"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"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regex on a .jsonc file — a "model" inside a // comment passes here. Parse with jsonc-parser (already a dep).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 7c768d8probeCreds 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.

Rchari1and others added 6 commits June 20, 2026 21:40
…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>
@Rchari1
Rchari1force-pushed the rchari/beta4-provisioning branch from a9c4e2c to 7c768d8CompareJune 21, 2026 01:46
@Rchari1

Copy link
Copy Markdown
MemberAuthor

Thanks Jack — both addressed in the latest push (rebased on the updated #9).

  • package stages amico-run:package now runs pnpm --filter @amicode/amico-run build first, so esbuild's bin/ staging isn't skipped and the VSIX always ships the orchestrator. (esbuild also already warns on a skipped stage as a backstop.)
  • creds probe / jsonc:probeCreds now strips JSONC comments (string-aware, so the $schema URL's // is preserved) and JSON.parses — a "model" inside a // comment no longer false-passes. Verified both cases. Note: I used a small string-aware strip rather than jsonc-parser — it isn't actually in the dep tree, and the strip avoids adding a dep across the whole stack; happy to switch to jsonc-parser if you'd prefer.

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.

@Rchari1

Copy link
Copy Markdown
MemberAuthor

Thanks @jack-champagne — both must-changes are in 7c768d8:

  • package now builds/stages amico-run before packaging (VSIX can't ship without the orchestrator).
  • probeCreds parses with a string-aware JSONC strip + JSON.parse, so a "model" inside a // comment no longer false-passes.

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.

@jack-champagne

Copy link
Copy Markdown
Member

Provisioning machinery is solid — deterministic instantiate of the pinned stack, clean pure/impure split in healthcheck, VSIX-content guard. Notes:

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving — provisioning is solid; the blank --project is fixed in #12. The julia-version gate is a worthwhile follow-up (comment above).

@Rchari1
Rchari1 changed the base branch from rchari/beta3-agents-template to mainJune 26, 2026 20:08
@Rchari1
Rchari1 merged commit 22808dd into mainJun 26, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

β.4 — One-lab provisioning slice (bundle + install + healthcheck)

2 participants

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

β.4: one-lab provisioning (closes #4) - #10

Merged
Rchari1 merged 6 commits into
mainfrom
rchari/beta4-provisioning
Jun 26, 2026
Merged

β.4: one-lab provisioning (closes #4)#10
Rchari1 merged 6 commits into
mainfrom
rchari/beta4-provisioning

Conversation

@Rchari1

Copy link
Copy Markdown
Member

Closes#4. Stacked on #9 (β.3) → base retargets to main as 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

  • Bundled pinned Julia projectpackages/extension/julia/{Project,Manifest}.toml pins the vetted Piccolo 1.19 stack; provisioning is a deterministic Pkg.instantiate (no resolver drift, no sysimage).
  • scripts/install.sh — idempotent: checks Julia, instantiates ~/.amico/julia, code --install-extension, drops a starter lab.toml, prints next steps.
  • scripts/healthcheck.mjs — exit-coded; a pure resolveChecks() (unit-tested with injected probes) + probes for julia+Piccolo, opencode /event 200 (spawns β.2's boot-smoke), amico-run --help, and Bedrock-creds (config-level). All 4 ✓, exit 0 on this machine.
  • vsce packagingpnpm --filter amicode-v2 package produces amicode.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

Issue ACEvidence
Clean install ≤60min + amico-run finds bundled script (no exit-64)install.sh + RUNBOOK; amico-run probe --help exits 0; β.3 ships the template
healthcheck exit 0 all-pass / non-zero precise messageresolveChecks unit tests (3) + live run: all 4 ✓ exit 0
VSIX contains amico-run + opencode + template + juliapackaging-manifest assertion (green): extension/bin/dist/amico-run.js, vendor/opencode/darwin-arm64/opencode, templates/solve_template.jl, julia/Project.toml all present

Scope 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

@Rchari1

Copy link
Copy Markdown
MemberAuthor

@jack-champagne

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

  • package builds the extension + opencode but never builds/stages amico-run, so the VSIX can ship without the orchestrator — and the test that'd catch it is skipIf(no VSIX), so CI never does. Only the runtime healthcheck backstops it.
  • probeCreds regexes a .jsonc file, 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 resolveChecks aggregator does.

Comment threadpackages/extension/package.json Outdated
"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"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regex on a .jsonc file — a "model" inside a // comment passes here. Parse with jsonc-parser (already a dep).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 7c768d8probeCreds 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.

Rchari1and others added 6 commits June 20, 2026 21:40
…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>
@Rchari1
Rchari1force-pushed the rchari/beta4-provisioning branch from a9c4e2c to 7c768d8CompareJune 21, 2026 01:46
@Rchari1

Copy link
Copy Markdown
MemberAuthor

Thanks Jack — both addressed in the latest push (rebased on the updated #9).

  • package stages amico-run:package now runs pnpm --filter @amicode/amico-run build first, so esbuild's bin/ staging isn't skipped and the VSIX always ships the orchestrator. (esbuild also already warns on a skipped stage as a backstop.)
  • creds probe / jsonc:probeCreds now strips JSONC comments (string-aware, so the $schema URL's // is preserved) and JSON.parses — a "model" inside a // comment no longer false-passes. Verified both cases. Note: I used a small string-aware strip rather than jsonc-parser — it isn't actually in the dep tree, and the strip avoids adding a dep across the whole stack; happy to switch to jsonc-parser if you'd prefer.

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.

@Rchari1

Copy link
Copy Markdown
MemberAuthor

Thanks @jack-champagne — both must-changes are in 7c768d8:

  • package now builds/stages amico-run before packaging (VSIX can't ship without the orchestrator).
  • probeCreds parses with a string-aware JSONC strip + JSON.parse, so a "model" inside a // comment no longer false-passes.

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.

@jack-champagne

Copy link
Copy Markdown
Member

Provisioning machinery is solid — deterministic instantiate of the pinned stack, clean pure/impure split in healthcheck, VSIX-content guard. Notes:

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving — provisioning is solid; the blank --project is fixed in #12. The julia-version gate is a worthwhile follow-up (comment above).

@Rchari1
Rchari1 changed the base branch from rchari/beta3-agents-template to mainJune 26, 2026 20:08
@Rchari1
Rchari1 merged commit 22808dd into mainJun 26, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

β.4 — One-lab provisioning slice (bundle + install + healthcheck)

2 participants

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

β.4: one-lab provisioning (closes #4) - #10

Merged
Rchari1 merged 6 commits into
mainfrom
rchari/beta4-provisioning
Jun 26, 2026
Merged

β.4: one-lab provisioning (closes #4)#10
Rchari1 merged 6 commits into
mainfrom
rchari/beta4-provisioning

Conversation

@Rchari1

Copy link
Copy Markdown
Member

Closes#4. Stacked on #9 (β.3) → base retargets to main as 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

  • Bundled pinned Julia projectpackages/extension/julia/{Project,Manifest}.toml pins the vetted Piccolo 1.19 stack; provisioning is a deterministic Pkg.instantiate (no resolver drift, no sysimage).
  • scripts/install.sh — idempotent: checks Julia, instantiates ~/.amico/julia, code --install-extension, drops a starter lab.toml, prints next steps.
  • scripts/healthcheck.mjs — exit-coded; a pure resolveChecks() (unit-tested with injected probes) + probes for julia+Piccolo, opencode /event 200 (spawns β.2's boot-smoke), amico-run --help, and Bedrock-creds (config-level). All 4 ✓, exit 0 on this machine.
  • vsce packagingpnpm --filter amicode-v2 package produces amicode.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

Issue ACEvidence
Clean install ≤60min + amico-run finds bundled script (no exit-64)install.sh + RUNBOOK; amico-run probe --help exits 0; β.3 ships the template
healthcheck exit 0 all-pass / non-zero precise messageresolveChecks unit tests (3) + live run: all 4 ✓ exit 0
VSIX contains amico-run + opencode + template + juliapackaging-manifest assertion (green): extension/bin/dist/amico-run.js, vendor/opencode/darwin-arm64/opencode, templates/solve_template.jl, julia/Project.toml all present

Scope 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

@Rchari1

Copy link
Copy Markdown
MemberAuthor

@jack-champagne

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

  • package builds the extension + opencode but never builds/stages amico-run, so the VSIX can ship without the orchestrator — and the test that'd catch it is skipIf(no VSIX), so CI never does. Only the runtime healthcheck backstops it.
  • probeCreds regexes a .jsonc file, 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 resolveChecks aggregator does.

Comment threadpackages/extension/package.json Outdated
"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"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regex on a .jsonc file — a "model" inside a // comment passes here. Parse with jsonc-parser (already a dep).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 7c768d8probeCreds 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.

Rchari1and others added 6 commits June 20, 2026 21:40
…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>
@Rchari1
Rchari1force-pushed the rchari/beta4-provisioning branch from a9c4e2c to 7c768d8CompareJune 21, 2026 01:46
@Rchari1

Copy link
Copy Markdown
MemberAuthor

Thanks Jack — both addressed in the latest push (rebased on the updated #9).

  • package stages amico-run:package now runs pnpm --filter @amicode/amico-run build first, so esbuild's bin/ staging isn't skipped and the VSIX always ships the orchestrator. (esbuild also already warns on a skipped stage as a backstop.)
  • creds probe / jsonc:probeCreds now strips JSONC comments (string-aware, so the $schema URL's // is preserved) and JSON.parses — a "model" inside a // comment no longer false-passes. Verified both cases. Note: I used a small string-aware strip rather than jsonc-parser — it isn't actually in the dep tree, and the strip avoids adding a dep across the whole stack; happy to switch to jsonc-parser if you'd prefer.

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.

@Rchari1

Copy link
Copy Markdown
MemberAuthor

Thanks @jack-champagne — both must-changes are in 7c768d8:

  • package now builds/stages amico-run before packaging (VSIX can't ship without the orchestrator).
  • probeCreds parses with a string-aware JSONC strip + JSON.parse, so a "model" inside a // comment no longer false-passes.

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.

@jack-champagne

Copy link
Copy Markdown
Member

Provisioning machinery is solid — deterministic instantiate of the pinned stack, clean pure/impure split in healthcheck, VSIX-content guard. Notes:

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving — provisioning is solid; the blank --project is fixed in #12. The julia-version gate is a worthwhile follow-up (comment above).

@Rchari1
Rchari1 changed the base branch from rchari/beta3-agents-template to mainJune 26, 2026 20:08
@Rchari1
Rchari1 merged commit 22808dd into mainJun 26, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

β.4 — One-lab provisioning slice (bundle + install + healthcheck)

2 participants

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

β.4: one-lab provisioning (closes #4) - #10

Merged
Rchari1 merged 6 commits into
mainfrom
rchari/beta4-provisioning
Jun 26, 2026
Merged

β.4: one-lab provisioning (closes #4)#10
Rchari1 merged 6 commits into
mainfrom
rchari/beta4-provisioning

Conversation

@Rchari1

Copy link
Copy Markdown
Member

Closes#4. Stacked on #9 (β.3) → base retargets to main as 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

  • Bundled pinned Julia projectpackages/extension/julia/{Project,Manifest}.toml pins the vetted Piccolo 1.19 stack; provisioning is a deterministic Pkg.instantiate (no resolver drift, no sysimage).
  • scripts/install.sh — idempotent: checks Julia, instantiates ~/.amico/julia, code --install-extension, drops a starter lab.toml, prints next steps.
  • scripts/healthcheck.mjs — exit-coded; a pure resolveChecks() (unit-tested with injected probes) + probes for julia+Piccolo, opencode /event 200 (spawns β.2's boot-smoke), amico-run --help, and Bedrock-creds (config-level). All 4 ✓, exit 0 on this machine.
  • vsce packagingpnpm --filter amicode-v2 package produces amicode.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

Issue ACEvidence
Clean install ≤60min + amico-run finds bundled script (no exit-64)install.sh + RUNBOOK; amico-run probe --help exits 0; β.3 ships the template
healthcheck exit 0 all-pass / non-zero precise messageresolveChecks unit tests (3) + live run: all 4 ✓ exit 0
VSIX contains amico-run + opencode + template + juliapackaging-manifest assertion (green): extension/bin/dist/amico-run.js, vendor/opencode/darwin-arm64/opencode, templates/solve_template.jl, julia/Project.toml all present

Scope 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

@Rchari1

Copy link
Copy Markdown
MemberAuthor

@jack-champagne

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

  • package builds the extension + opencode but never builds/stages amico-run, so the VSIX can ship without the orchestrator — and the test that'd catch it is skipIf(no VSIX), so CI never does. Only the runtime healthcheck backstops it.
  • probeCreds regexes a .jsonc file, 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 resolveChecks aggregator does.

Comment threadpackages/extension/package.json Outdated
"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"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regex on a .jsonc file — a "model" inside a // comment passes here. Parse with jsonc-parser (already a dep).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 7c768d8probeCreds 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.

Rchari1and others added 6 commits June 20, 2026 21:40
…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>
@Rchari1
Rchari1force-pushed the rchari/beta4-provisioning branch from a9c4e2c to 7c768d8CompareJune 21, 2026 01:46
@Rchari1

Copy link
Copy Markdown
MemberAuthor

Thanks Jack — both addressed in the latest push (rebased on the updated #9).

  • package stages amico-run:package now runs pnpm --filter @amicode/amico-run build first, so esbuild's bin/ staging isn't skipped and the VSIX always ships the orchestrator. (esbuild also already warns on a skipped stage as a backstop.)
  • creds probe / jsonc:probeCreds now strips JSONC comments (string-aware, so the $schema URL's // is preserved) and JSON.parses — a "model" inside a // comment no longer false-passes. Verified both cases. Note: I used a small string-aware strip rather than jsonc-parser — it isn't actually in the dep tree, and the strip avoids adding a dep across the whole stack; happy to switch to jsonc-parser if you'd prefer.

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.

@Rchari1

Copy link
Copy Markdown
MemberAuthor

Thanks @jack-champagne — both must-changes are in 7c768d8:

  • package now builds/stages amico-run before packaging (VSIX can't ship without the orchestrator).
  • probeCreds parses with a string-aware JSONC strip + JSON.parse, so a "model" inside a // comment no longer false-passes.

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.

@jack-champagne

Copy link
Copy Markdown
Member

Provisioning machinery is solid — deterministic instantiate of the pinned stack, clean pure/impure split in healthcheck, VSIX-content guard. Notes:

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving — provisioning is solid; the blank --project is fixed in #12. The julia-version gate is a worthwhile follow-up (comment above).

@Rchari1
Rchari1 changed the base branch from rchari/beta3-agents-template to mainJune 26, 2026 20:08
@Rchari1
Rchari1 merged commit 22808dd into mainJun 26, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

β.4 — One-lab provisioning slice (bundle + install + healthcheck)

2 participants

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

β.4: one-lab provisioning (closes #4) - #10

Merged
Rchari1 merged 6 commits into
mainfrom
rchari/beta4-provisioning
Jun 26, 2026
Merged

β.4: one-lab provisioning (closes #4)#10
Rchari1 merged 6 commits into
mainfrom
rchari/beta4-provisioning

Conversation

@Rchari1

Copy link
Copy Markdown
Member

Closes#4. Stacked on #9 (β.3) → base retargets to main as 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

  • Bundled pinned Julia projectpackages/extension/julia/{Project,Manifest}.toml pins the vetted Piccolo 1.19 stack; provisioning is a deterministic Pkg.instantiate (no resolver drift, no sysimage).
  • scripts/install.sh — idempotent: checks Julia, instantiates ~/.amico/julia, code --install-extension, drops a starter lab.toml, prints next steps.
  • scripts/healthcheck.mjs — exit-coded; a pure resolveChecks() (unit-tested with injected probes) + probes for julia+Piccolo, opencode /event 200 (spawns β.2's boot-smoke), amico-run --help, and Bedrock-creds (config-level). All 4 ✓, exit 0 on this machine.
  • vsce packagingpnpm --filter amicode-v2 package produces amicode.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

Issue ACEvidence
Clean install ≤60min + amico-run finds bundled script (no exit-64)install.sh + RUNBOOK; amico-run probe --help exits 0; β.3 ships the template
healthcheck exit 0 all-pass / non-zero precise messageresolveChecks unit tests (3) + live run: all 4 ✓ exit 0
VSIX contains amico-run + opencode + template + juliapackaging-manifest assertion (green): extension/bin/dist/amico-run.js, vendor/opencode/darwin-arm64/opencode, templates/solve_template.jl, julia/Project.toml all present

Scope 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

@Rchari1

Copy link
Copy Markdown
MemberAuthor

@jack-champagne

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

  • package builds the extension + opencode but never builds/stages amico-run, so the VSIX can ship without the orchestrator — and the test that'd catch it is skipIf(no VSIX), so CI never does. Only the runtime healthcheck backstops it.
  • probeCreds regexes a .jsonc file, 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 resolveChecks aggregator does.

Comment threadpackages/extension/package.json Outdated
"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"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regex on a .jsonc file — a "model" inside a // comment passes here. Parse with jsonc-parser (already a dep).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 7c768d8probeCreds 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.

Rchari1and others added 6 commits June 20, 2026 21:40
…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>
@Rchari1
Rchari1force-pushed the rchari/beta4-provisioning branch from a9c4e2c to 7c768d8CompareJune 21, 2026 01:46
@Rchari1

Copy link
Copy Markdown
MemberAuthor

Thanks Jack — both addressed in the latest push (rebased on the updated #9).

  • package stages amico-run:package now runs pnpm --filter @amicode/amico-run build first, so esbuild's bin/ staging isn't skipped and the VSIX always ships the orchestrator. (esbuild also already warns on a skipped stage as a backstop.)
  • creds probe / jsonc:probeCreds now strips JSONC comments (string-aware, so the $schema URL's // is preserved) and JSON.parses — a "model" inside a // comment no longer false-passes. Verified both cases. Note: I used a small string-aware strip rather than jsonc-parser — it isn't actually in the dep tree, and the strip avoids adding a dep across the whole stack; happy to switch to jsonc-parser if you'd prefer.

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.

@Rchari1

Copy link
Copy Markdown
MemberAuthor

Thanks @jack-champagne — both must-changes are in 7c768d8:

  • package now builds/stages amico-run before packaging (VSIX can't ship without the orchestrator).
  • probeCreds parses with a string-aware JSONC strip + JSON.parse, so a "model" inside a // comment no longer false-passes.

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.

@jack-champagne

Copy link
Copy Markdown
Member

Provisioning machinery is solid — deterministic instantiate of the pinned stack, clean pure/impure split in healthcheck, VSIX-content guard. Notes:

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving — provisioning is solid; the blank --project is fixed in #12. The julia-version gate is a worthwhile follow-up (comment above).

@Rchari1
Rchari1 changed the base branch from rchari/beta3-agents-template to mainJune 26, 2026 20:08
@Rchari1
Rchari1 merged commit 22808dd into mainJun 26, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

β.4 — One-lab provisioning slice (bundle + install + healthcheck)

2 participants

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

β.4: one-lab provisioning (closes #4) - #10

Merged
Rchari1 merged 6 commits into
mainfrom
rchari/beta4-provisioning
Jun 26, 2026
Merged

β.4: one-lab provisioning (closes #4)#10
Rchari1 merged 6 commits into
mainfrom
rchari/beta4-provisioning

Conversation

@Rchari1

Copy link
Copy Markdown
Member

Closes#4. Stacked on #9 (β.3) → base retargets to main as 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

  • Bundled pinned Julia projectpackages/extension/julia/{Project,Manifest}.toml pins the vetted Piccolo 1.19 stack; provisioning is a deterministic Pkg.instantiate (no resolver drift, no sysimage).
  • scripts/install.sh — idempotent: checks Julia, instantiates ~/.amico/julia, code --install-extension, drops a starter lab.toml, prints next steps.
  • scripts/healthcheck.mjs — exit-coded; a pure resolveChecks() (unit-tested with injected probes) + probes for julia+Piccolo, opencode /event 200 (spawns β.2's boot-smoke), amico-run --help, and Bedrock-creds (config-level). All 4 ✓, exit 0 on this machine.
  • vsce packagingpnpm --filter amicode-v2 package produces amicode.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

Issue ACEvidence
Clean install ≤60min + amico-run finds bundled script (no exit-64)install.sh + RUNBOOK; amico-run probe --help exits 0; β.3 ships the template
healthcheck exit 0 all-pass / non-zero precise messageresolveChecks unit tests (3) + live run: all 4 ✓ exit 0
VSIX contains amico-run + opencode + template + juliapackaging-manifest assertion (green): extension/bin/dist/amico-run.js, vendor/opencode/darwin-arm64/opencode, templates/solve_template.jl, julia/Project.toml all present

Scope 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

@Rchari1

Copy link
Copy Markdown
MemberAuthor

@jack-champagne

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

  • package builds the extension + opencode but never builds/stages amico-run, so the VSIX can ship without the orchestrator — and the test that'd catch it is skipIf(no VSIX), so CI never does. Only the runtime healthcheck backstops it.
  • probeCreds regexes a .jsonc file, 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 resolveChecks aggregator does.

Comment threadpackages/extension/package.json Outdated
"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"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regex on a .jsonc file — a "model" inside a // comment passes here. Parse with jsonc-parser (already a dep).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 7c768d8probeCreds 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.

Rchari1and others added 6 commits June 20, 2026 21:40
…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>
@Rchari1
Rchari1force-pushed the rchari/beta4-provisioning branch from a9c4e2c to 7c768d8CompareJune 21, 2026 01:46
@Rchari1

Copy link
Copy Markdown
MemberAuthor

Thanks Jack — both addressed in the latest push (rebased on the updated #9).

  • package stages amico-run:package now runs pnpm --filter @amicode/amico-run build first, so esbuild's bin/ staging isn't skipped and the VSIX always ships the orchestrator. (esbuild also already warns on a skipped stage as a backstop.)
  • creds probe / jsonc:probeCreds now strips JSONC comments (string-aware, so the $schema URL's // is preserved) and JSON.parses — a "model" inside a // comment no longer false-passes. Verified both cases. Note: I used a small string-aware strip rather than jsonc-parser — it isn't actually in the dep tree, and the strip avoids adding a dep across the whole stack; happy to switch to jsonc-parser if you'd prefer.

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.

@Rchari1

Copy link
Copy Markdown
MemberAuthor

Thanks @jack-champagne — both must-changes are in 7c768d8:

  • package now builds/stages amico-run before packaging (VSIX can't ship without the orchestrator).
  • probeCreds parses with a string-aware JSONC strip + JSON.parse, so a "model" inside a // comment no longer false-passes.

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.

@jack-champagne

Copy link
Copy Markdown
Member

Provisioning machinery is solid — deterministic instantiate of the pinned stack, clean pure/impure split in healthcheck, VSIX-content guard. Notes:

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving — provisioning is solid; the blank --project is fixed in #12. The julia-version gate is a worthwhile follow-up (comment above).

@Rchari1
Rchari1 changed the base branch from rchari/beta3-agents-template to mainJune 26, 2026 20:08
@Rchari1
Rchari1 merged commit 22808dd into mainJun 26, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

β.4 — One-lab provisioning slice (bundle + install + healthcheck)

2 participants

@Rchari1@jack-champagne