tf_code/docs/build-release.md
2026-03-24 15:06:34 +11:00

230 lines
6.4 KiB
Markdown

# tfcode Build & Release Guide
This document explains how to build and release tfcode to match opencode's distribution model.
## Distribution Channels
tfcode can be installed via:
1. **curl** - `curl -fsSL https://toothfairyai.com/install/tfcode | bash`
2. **npm** - `npm install -g @toothfairyai/tfcode`
3. **bun** - `bun install -g @toothfairyai/tfcode`
4. **brew** - `brew install toothfairyai/tap/tfcode`
## How It Works
### Architecture
```
┌──────────────────────────────────────────────────────────────┐
│ Gitea Releases │
│ (gitea.toothfairyai.com/ToothFairyAI/tfcode/releases) │
│ │
│ - tfcode-darwin-arm64.zip │
│ - tfcode-darwin-x64.zip │
│ - tfcode-linux-arm64.tar.gz │
│ - tfcode-linux-x64.tar.gz │
│ - tfcode-windows-x64.zip │
│ - ... │
└──────────────────────────────────────────────────────────────┘
┌─────────────────┼─────────────────┐
│ │ │
┌────┴────┐ ┌─────┴─────┐ ┌────┴────┐
│ npm │ │ curl │ │ brew │
│ │ │ │ │ │
│Downloads│ │ Downloads │ │Downloads│
│ binary │ │ binary │ │ binary │
└─────────┘ └───────────┘ └─────────┘
```
### npm Package Structure
```
@toothfairyai/tfcode (main package)
├── bin/tfcode (wrapper script)
├── postinstall.mjs (downloads correct binary)
└── optionalDependencies:
├── @toothfairyai/tfcode-darwin-arm64
├── @toothfairyai/tfcode-darwin-x64
├── @toothfairyai/tfcode-linux-arm64
├── @toothfairyai/tfcode-linux-x64
├── @toothfairyai/tfcode-windows-arm64
└── @toothfairyai/tfcode-windows-x64
```
## Build Process
### Prerequisites
1. **bun** installed
2. **Gitea token** with release permissions
3. **npm token** for publishing
### Step 1: Build Binaries
```bash
# Build all platform binaries
cd packages/tfcode
bun run build
# Or build just for current platform (faster for testing)
bun run build:single
```
This creates:
- `dist/tfcode-darwin-arm64/bin/tfcode`
- `dist/tfcode-darwin-x64/bin/tfcode`
- `dist/tfcode-linux-arm64/bin/tfcode`
- etc.
### Step 2: Package for Release
```bash
# Set environment
export GITEA_TOKEN="your-token"
export GITEA_HOST="gitea.toothfairyai.com"
export GITEA_REPO="ToothFairyAI/tfcode"
# Upload to Gitea release
bun run publish:upload
# Publish to npm
bun run publish:npm
# Create Homebrew formula
bun run publish:brew
# Or do all at once
bun run publish:all
```
## Release Checklist
### Before Release
1. Update version in `packages/tfcode/package.json`
2. Update `CHANGELOG.md` with changes
3. Test build locally: `bun run build:single`
4. Test the binary: `./dist/tfcode-darwin-arm64/bin/tfcode --version`
### During Release
```bash
# 1. Build all binaries
bun run build
# 2. Upload to Gitea
bun run publish:upload
# 3. Publish to npm
npm login --scope=@toothfairyai
bun run publish:npm
# 4. Update Homebrew tap
# (Manual: copy dist/tfcode.rb to homebrew-tap repo)
```
### After Release
1. Verify curl install works:
```bash
curl -fsSL https://toothfairyai.com/install/tfcode | bash
tfcode --version
```
2. Verify npm install works:
```bash
npm install -g @toothfairyai/tfcode
tfcode --version
```
3. Verify brew install works:
```bash
brew install toothfairyai/tap/tfcode
tfcode --version
```
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `GITEA_HOST` | Gitea server | `gitea.toothfairyai.com` |
| `GITEA_REPO` | Gitea repository | `ToothFairyAI/tfcode` |
| `GITEA_TOKEN` | Gitea API token | (required for upload) |
| `TFCODE_VERSION` | Override version | (from package.json) |
## Platform Support
| Platform | Arch | Variants |
|----------|------|----------|
| macOS | arm64 | - |
| macOS | x64 | baseline |
| Linux | arm64 | musl |
| Linux | x64 | baseline, musl |
| Windows | arm64 | - |
| Windows | x64 | baseline |
### Binary Variants
- **baseline**: For older CPUs without AVX2 support
- **musl**: For Alpine Linux and other musl-based distros
## Troubleshooting
### Build Fails
```bash
# Try installing dependencies first
bun install
# Then rebuild
bun run build:single
```
### Upload Fails
```bash
# Check token permissions
curl -H "Authorization: token $GITEA_TOKEN" \
https://$GITEA_HOST/api/v1/user/repos
```
### npm Publish Fails
```bash
# Login to npm
npm login --scope=@toothfairyai
# Check you're logged in
npm whoami
```
## Files Reference
| File | Purpose |
|------|---------|
| `script/build-tfcode.ts` | Build all platform binaries |
| `script/publish-tfcode.ts` | Upload to Gitea, publish npm, create brew formula |
| `script/postinstall-tfcode.mjs` | npm postinstall - downloads binary |
| `scripts/install-tfcode.sh` | curl install script |
| `bin/tfcode` | Wrapper script (source repo) |
| `bin/tfcode.js` | Minimal CLI (npm package) |
## Comparison with OpenCode
| Aspect | OpenCode | tfcode |
|--------|----------|--------|
| Release hosting | GitHub Releases | Gitea Releases |
| npm package | `opencode-ai/opencode` | `@toothfairyai/tfcode` |
| Binary packages | `opencode-*` | `tfcode-*` |
| Install script | `opencode.ai/install` | `toothfairyai.com/install/tfcode` |
| Brew tap | `anomalyco/homebrew-tap` | `toothfairyai/homebrew-tap` |
## Next Steps
1. **Set up CI/CD** - Automate builds on tag push
2. **Create Homebrew tap repo** - `github.com/toothfairyai/homebrew-tap`
3. **Set up install website** - `toothfairyai.com/install/tfcode`
4. **Add auto-update** - Check for updates on launch