-
Notifications
You must be signed in to change notification settings - Fork 3
Description
Problem
When altimate-code is installed via Homebrew (brew install altimate/tap/altimate-code) or from GitHub release archives, builtin skills are never copied to ~/.altimate/builtin/. This means users get zero builtin skills — a significantly degraded experience compared to npm installs.
How skills get installed today
The npm install path works correctly:
publish.ts:32copies skills into the published wrapper package:cp -r ../../.opencode/skills ./dist/${pkg.name}/skillspostinstall.mjs:136-149(copySkillsToAltimate()) copies them to~/.altimate/builtin/on every install/upgrade- At runtime,
skill.ts:111-121scans~/.altimate/builtin/and loads all builtin skills
What Homebrew/GitHub release archives contain
The Homebrew formula (publish.ts:191-244) only installs the bare binary:
def install
bin.install "altimate"
bin.install_symlink "altimate" => "altimate-code"
endThe GitHub release archives (build.ts:278-282) are created from dist/${key}/bin/ — just the compiled binary:
// Linux
await $`tar -czf ${archivePath}.tar.gz *`.cwd(`dist/${key}/bin`)
// macOS/Windows
await $`zip -r ${archivePath}.zip *`.cwd(`dist/${key}/bin`)Neither path includes the skills/ directory or runs postinstall.mjs.
Impact
| Install method | Skills copied to ~/.altimate/builtin/? |
Skills available? |
|---|---|---|
npm install -g altimate-code |
Yes (via postinstall.mjs) |
Yes |
npm install -g @altimateai/altimate-code |
Yes (via postinstall.mjs) |
Yes |
brew install altimate/tap/altimate-code |
No | No |
| Download from GitHub releases | No | No |
Users who install via Homebrew (common on macOS) or download release binaries get no builtin skills — they only get project-local skills from .opencode/skills/ if they happen to be in a project that has them.
Root cause
The builtin skills distribution is coupled to npm's postinstall lifecycle hook. Homebrew and direct binary installs bypass npm entirely, so the skill copy never happens.
Proposed solutions
Option A: Bundle skills into the compiled binary (recommended)
Embed the skills directory into the Bun binary at build time using Bun.file() or a define/import:
- Skills are just markdown files (SKILL.md) — small enough to embed
- No filesystem dependency — works for all install methods
- At startup, extract to
~/.altimate/builtin/if missing or outdated (check version marker)
Option B: Include skills in release archives + Homebrew formula
-
Release archives: Include
skills/alongside the binary in tar/zip:// Copy skills into dist bin directory before archiving await $`cp -r ../../.opencode/skills dist/${key}/bin/skills` await $`tar -czf ${archivePath}.tar.gz *`.cwd(`dist/${key}/bin`)
-
Homebrew formula: Install skills directory and add a post_install step:
def install bin.install "altimate" bin.install_symlink "altimate" => "altimate-code" (share/"altimate-code/skills").install Dir["skills/*"] end def post_install builtin_dir = Pathname.new(Dir.home) / ".altimate" / "builtin" builtin_dir.rmtree if builtin_dir.exist? cp_r (share/"altimate-code/skills").to_s, builtin_dir.to_s end
-
Binary first-run: Have the binary itself check on startup if
~/.altimate/builtin/exists, and if not, extract embedded skills or warn the user.
Option C: First-run self-install
Have the binary detect missing skills on first run and copy them from a known location (e.g., adjacent skills/ directory or embedded resource). This is the most resilient approach since it works regardless of install method.
Relevant files
| File | Role |
|---|---|
packages/opencode/script/publish.ts:32 |
Copies skills into npm package |
packages/opencode/script/publish.ts:191-244 |
Generates Homebrew formula — no skills |
packages/opencode/script/build.ts:278-282 |
Creates release archives — no skills |
packages/opencode/script/postinstall.mjs:136-149 |
Copies skills to ~/.altimate/builtin/ (npm only) |
packages/opencode/src/skill/skill.ts:107-121 |
Loads builtin skills from ~/.altimate/builtin/ |
.opencode/skills/ |
Source of truth for builtin skills |