|
|
6 hours ago | |
|---|---|---|
| .. | ||
| codemods | 3 weeks ago | |
| transforms | 6 hours ago | |
| utils | 1 day ago | |
| README.md | 1 month ago | |
| analyze.ts | 2 months ago | |
| index.ts | 2 months ago | |
| list-versions.ts | 2 months ago | |
| merge.ts | 1 day ago | |
| package.json | 1 day ago | |
| tsconfig.json | 2 months ago | |
Scripts for automating the merge of upstream opencode changes into Kilo.
# Install dependencies (from script/upstream directory)
cd script/upstream
bun install
# List available upstream versions
bun run list-versions.ts
# Analyze changes for a specific version (without merging)
bun run analyze.ts --version v1.1.49
# Run the full merge process
bun run merge.ts --version v1.1.49
# Dry-run to preview what would happen
bun run merge.ts --version v1.1.49 --dry-run
# Use a different base branch (e.g., for incremental merges)
bun run merge.ts --version v1.1.50 --base-branch catrielmuller/kilo-opencode-v1.1.44
| Script | Description |
|---|---|
merge.ts |
Main orchestration script for upstream merges |
list-versions.ts |
List available upstream versions |
analyze.ts |
Analyze changes without merging |
| Script | Description |
|---|---|
transforms/package-names.ts |
Transform opencode package names to kilo |
transforms/preserve-versions.ts |
Preserve Kilo's package versions |
transforms/keep-ours.ts |
Keep Kilo's version of specific files |
transforms/skip-files.ts |
Skip/remove files that shouldn't exist in Kilo |
transforms/transform-i18n.ts |
Transform i18n files with Kilo branding |
transforms/transform-take-theirs.ts |
Take upstream + apply Kilo branding for branding-only files |
transforms/transform-tauri.ts |
Transform Tauri/Desktop config files |
transforms/transform-package-json.ts |
Enhanced package.json with Kilo dependency injection |
transforms/transform-scripts.ts |
Transform script files with GitHub API references |
transforms/transform-extensions.ts |
Transform extension files (Zed, etc.) |
transforms/transform-web.ts |
Transform web/docs files (.mdx) |
| Script | Description |
|---|---|
codemods/transform-imports.ts |
Transform import statements using ts-morph |
codemods/transform-strings.ts |
Transform string literals |
The merge automation follows this process, applying all transformations BEFORE the merge to minimize conflicts:
Validate environment
Fetch upstream and determine target version
Generate conflict report analyzing which files will conflict
Create branches
backup/<branch>-<timestamp> - Backup of current state<author>/kilo-opencode-<version> - Merge target branch<author>/opencode-<version> - Transformed upstream branchApply ALL transformations to upstream branch (PRE-MERGE):
Merge transformed upstream into Kilo branch
Auto-resolve any remaining conflicts
Push and generate final report
Configuration is defined in utils/config.ts:
{
// Package name mappings
packageMappings: [
{ from: "opencode-ai", to: "@kilocode/cli" },
{ from: "@opencode-ai/cli", to: "@kilocode/cli" },
// ...
],
// Files to always keep Kilo's version (never take upstream)
keepOurs: [
"README.md",
"CONTRIBUTING.md",
"AGENTS.md",
".github/workflows/publish.yml", // GitHub workflows - manual review
// ...
],
// Files to skip entirely (remove from merge)
skipFiles: [
"README.*.md", // Translated READMEs
"STATS.md",
".github/workflows/update-nix-hashes.yml",
// ...
],
// Files to take upstream + apply Kilo branding transforms
takeTheirsAndTransform: [
"packages/app/src/components/**/*.tsx",
"packages/app/src/context/**/*.tsx",
"packages/ui/src/**/*.tsx",
// ...
],
// Tauri/Desktop config files
tauriFiles: [
"packages/desktop/src-tauri/*.json",
"packages/desktop/src-tauri/src/*.rs",
// ...
],
// Kilo-specific directories (preserved)
kiloDirectories: [
"packages/opencode/src/kilocode",
"packages/kilo-gateway",
"packages/kilo-telemetry",
// ...
],
}
Key insight: By applying all branding transforms to the upstream branch BEFORE merging, we eliminate most conflicts that would otherwise occur due to branding differences (OpenCode -> Kilo).
The following transforms are applied to the opencode branch before merging:
opencode-ai -> @kilocode/cli, etc.After merging, any remaining conflicts are handled based on file type:
| File Type | Strategy | Description |
|---|---|---|
| i18n files | i18n-transform |
Take upstream, apply Kilo branding |
| App components | take-theirs-transform |
Take upstream, apply branding (no logic changes) |
| Tauri configs | tauri-transform |
Take upstream, transform identifiers/names |
| package.json | package-transform |
Take upstream, transform names, inject Kilo deps |
| Script files | script-transform |
Take upstream, transform GitHub references |
| Extensions | extension-transform |
Take upstream, apply branding |
| Web/docs | web-transform |
Take upstream, apply branding |
| README/docs | keep-ours |
Keep Kilo's version |
| GitHub workflows | keep-ours |
Keep Kilo's version (manual review) |
| Code with markers | manual |
Has kilocode_change markers, needs review |
Previously, conflicts occurred because:
OpenCode brandingKilo brandingNow:
Kilo branding BEFORE mergeThe only remaining conflicts are files with actual code differences - files with kilocode_change markers that contain Kilo-specific logic.
Options:
--version <version> Target upstream version (e.g., v1.1.49)
--commit <hash> Target upstream commit hash
--base-branch <name> Base branch to merge into (default: main)
--dry-run Preview changes without applying them
--no-push Don't push branches to remote
--report-only Only generate conflict report
--verbose Enable verbose logging
--author <name> Author name for branch prefix
Options:
--version <version> Target upstream version
--commit <hash> Target commit hash
--base-branch <name> Base branch to analyze from (default: main)
--output <file> Output file for report
By default, upstream merges start from the main branch. However, you can use --base-branch to start from a different branch. This is useful for:
When working on multiple upstream versions, you can create a chain of merge PRs:
# First merge: v1.1.44 into main
bun run merge.ts --version v1.1.44
# Create PR: catrielmuller/kilo-opencode-v1.1.44 -> main
# Second merge: v1.1.50 based on the previous PR (without waiting for approval)
bun run merge.ts --version v1.1.50 --base-branch catrielmuller/kilo-opencode-v1.1.44
# Create PR: catrielmuller/kilo-opencode-v1.1.50 -> catrielmuller/kilo-opencode-v1.1.44
# OR: catrielmuller/kilo-opencode-v1.1.50 -> main (once first PR is merged)
# 1. Analyze next version from your WIP branch
bun run analyze.ts --version v1.1.50 --base-branch catrielmuller/kilo-opencode-v1.1.44
# 2. Run the merge
bun run merge.ts --version v1.1.50 --base-branch catrielmuller/kilo-opencode-v1.1.44
# 3. Create PR from catrielmuller/kilo-opencode-v1.1.50
# - Target: catrielmuller/kilo-opencode-v1.1.44 (if first PR not merged yet)
# - Target: main (if first PR is already merged)
After running the merge script, you may have remaining conflicts. To resolve:
kilocode_change markers to identify Kilo-specific codeStage and commit:
git add -A
git commit -m "resolve merge conflicts"
If something goes wrong:
# Find your backup branch
git branch | grep backup
# Reset to backup
git checkout main
git reset --hard backup/main-<timestamp>
Edit transforms/package-names.ts and add patterns to PACKAGE_PATTERNS.
codemods/git remote add upstream [email protected]:anomalyco/opencode.git
git stash
# or
git commit -am "WIP"
Some files require manual review. Check the generated report for guidance.