Skip to content

fix(opencode): remove invalid top-level theme config#1287

Open
LCubero wants to merge 8 commits into
Gentleman-Programming:mainfrom
LCubero:fix/opencode-theme-config
Open

fix(opencode): remove invalid top-level theme config#1287
LCubero wants to merge 8 commits into
Gentleman-Programming:mainfrom
LCubero:fix/opencode-theme-config

Conversation

@LCubero

@LCubero LCubero commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

🔗 Linked Issue

Closes #497


🏷️ PR Type

  • type:bug — Bug fix (non-breaking change that fixes an issue)
  • type:feature — New feature (non-breaking change that adds functionality)
  • type:docs — Documentation only
  • type:refactor — Code refactoring (no functional changes)
  • type:chore — Build, CI, or tooling changes
  • type:breaking-change — Breaking change

📝 Summary

  • Prevents Gentle AI from writing the unsupported top-level theme key into OpenCode's opencode.json.
  • Migrates existing literal root theme entries while preserving nested settings, file permissions, and covered JSONC comments and formatting.
  • Rejects malformed JSONC without modifying the source file and guarantees scanner progress on malformed internal input.

📂 Changes

File / Area What Changed
Agent capabilities Adds explicit theme-injection and legacy-migration adapter capabilities
OpenCode adapter Skips new theme injection and removes legacy literal root theme entries
JSONC removal Removes only the targeted root member without reserializing unrelated content
Scanner safety Rejects malformed token splicing, guards no-progress scans, and preserves LF/CRLF boundaries
Theme workflow Runs migration before applying the adapter's current injection policy
CLI paths Includes existing OpenCode settings in backup and verification handling
Catalog and docs Describes Theme as a setting for supported agents rather than an OpenCode theme
Tests and E2E Adds regression coverage for migration, comments, malformed input, idempotency, modes, scanners, and platform behavior

🧪 Test Plan

Focused tests

go test ./internal/components/filemerge/... ./internal/components/theme/... -count=1

Full unit suite

go test ./... -count=1

Docker E2E

cd e2e && ./docker-test.sh

Results:

  • Focused filemerge and theme tests pass locally
  • Shell syntax and focused JSONC fixtures pass locally
  • Go Format passes in GitHub Actions
  • Unit Tests pass in GitHub Actions
  • Windows Runtime passes in GitHub Actions
  • E2E Tests pass on Ubuntu, Arch, and Fedora
  • Full Docker Tier 2 was not run locally and is not claimed

🤖 Automated Checks

Check Status Description
Check PR Cognitive Load BLOCKED Requires maintainer-applied size:exception
Check Issue Reference PASS Closes #497
Check Issue Has status:approved PASS Issue #497 is approved
Check PR Has type:* Label BLOCKED Requires maintainer-applied type:bug
Go Format PASS Passed on the final candidate
Unit Tests PASS Passed on the final candidate
Windows Runtime PASS Passed on the final candidate
E2E Tests PASS Passed on Ubuntu, Arch, and Fedora
CodeRabbit PASS Review completed on the final head

✅ Contributor Checklist

  • PR is linked to an issue with status:approved
  • I have requested maintainer-applied size:exception with the rationale documented below
  • I have added the appropriate type:* label to this PR
  • Unit tests pass (go test ./...)
  • E2E tests pass (cd e2e && ./docker-test.sh)
  • I have updated documentation where behavior changed
  • My commits follow Conventional Commits format
  • My commits do not include Co-Authored-By trailers

💬 Notes for Reviewers

Suggested review path

  1. OpenCode adapter opt-out and legacy migration.
  2. Byte-preserving root-key removal and fail-closed JSONC validation.
  3. Backup and post-apply verification path handling.
  4. Regression tests and Docker E2E coverage.

Review-size rationale

Requesting size:exception for one cohesive migration and safety boundary.

Measure Lines
Total change 750
Tests, E2E, goldens, and docs 463
Production implementation 287
Standard budget exceeded by 350

A chained PR was considered. It would separate legacy migration from JSONC safety and the regression proof required to review it confidently, leaving incomplete intermediate states.

Please apply the maintainer-managed size:exception label.

Label permissions

I have read-only permission on the upstream repository and cannot apply PR labels.

Please add:

  • type:bug
  • size:exception

Preservation guarantees

  • Removes Gentle AI's legacy literal root theme member.
  • Preserves nested theme members.
  • Preserves the existing file mode.
  • Preserves covered comments, whitespace, ordering, and LF/CRLF formatting.
  • Leaves malformed files byte-identical.
  • Repeated migration is idempotent.
  • Scanner helpers terminate when comment parsing makes no progress.

Intentionally out of scope

Review follow-up

  • Commit 919617e addressed the isolated-slash scanner finding, and CodeRabbit marked the thread as resolved.
  • Commit 2e04de2 made the Windows permission assertion platform-aware, accumulated migration and injection results, deduplicated affected paths, and added root-only OpenCode theme validation.
  • Commit 7f1f963 removed the dead Python test stub and preserves accumulated migration results when later theme injection fails.
  • Commit 52aa4d2 aligns the idempotent OpenCode theme checks with root-only JSONC semantics.
  • Fresh checks pass for Go Format, Unit Tests, Windows Runtime, and E2E on Ubuntu, Arch, and Fedora.

Summary by CodeRabbit

  • Bug Fixes

    • OpenCode no longer writes or expects a root-level theme key in opencode.json.
    • Legacy OpenCode theme settings are migrated by removing only the root theme key while preserving the rest of the file (including JSONC formatting).
    • Theme injection behavior is now adapter-aware and avoids missing-file/merge issues; repeated runs are idempotent.
  • Documentation

    • Updated the Gentleman Kanagawa Theme description to clarify it’s for supported agents and is a no-op for OpenCode.
  • Tests

    • Expanded unit and end-to-end coverage for JSONC handling, malformed inputs, and the absence of a root theme key.

OpenCode's opencode.json schema is strict and rejects an unrecognized
top-level "theme" key (ConfigInvalidError), which breaks runtime config
updates such as profile activation. The theme component wrote
{"theme": "gentleman-kanagawa"} into opencode.json for OpenCode.

Gate theme injection behind a new optional ThemeInjectionController
adapter capability (mirroring EffectiveCodeGraphWiringDetector). The
OpenCode adapter opts out, and a single shared helper drives both
theme injection and the post-apply verification path, so OpenCode
neither gets the key written nor requires the file to exist. Every
other agent is unaffected.

Refs Gentleman-Programming#497
@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

OpenCode now opts out of top-level theme injection through an adapter capability. Existing theme keys can be migrated out, verification paths account for optional settings files, tests validate no OpenCode theme key is written, and documentation reflects the schema constraint.

Changes

OpenCode theme support

Layer / File(s) Summary
Theme injection capability contract
internal/agents/interface.go, internal/agents/opencode/adapter.go, internal/agents/opencode/adapter_test.go
Adapters can report theme support and migrate legacy settings; OpenCode reports false and is covered by a unit test.
Legacy theme removal and injection flow
internal/components/filemerge/json_remove.go, internal/agents/opencode/adapter.go, internal/components/theme/*
Top-level theme keys are removed from OpenCode settings, unsupported theme injection is skipped, and supported adapter injection remains covered.
Theme verification path handling
internal/cli/run.go, internal/cli/run_component_paths_test.go
Theme verification includes settings paths only when supported or when an existing settings file is present.
Behavior validation and product documentation
e2e/e2e_test.sh, e2e/lib.sh, PRD.md, docs/components.md, internal/catalog/components.go, internal/tui/testdata/*
JSONC helpers, E2E assertions, and product descriptions state that OpenCode does not receive a top-level theme key.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Suggested labels: type:bug

Suggested reviewers: alan-thegentleman

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 5.56% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The PR addresses #497 by stopping OpenCode theme injection and migrating/removing the invalid root theme key.
Out of Scope Changes check ✅ Passed The added migrations, JSONC removal logic, tests, docs, and CLI updates all support the OpenCode theme-config fix.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: removing OpenCode's unsupported top-level theme config.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@Alan-TheGentleman Alan-TheGentleman left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The prevention path is solid, but I'm requesting changes because existing OpenCode installations can retain the invalid top-level theme key. Inject now returns before reading the settings file, and post-apply verification skips that file, so an install can report success while profile activation remains broken. Please migrate existing configurations by removing only the stale top-level theme key, preserve every other setting, add a regression test that starts from an existing opencode.json, and add the required type:* label. Push the update and I'll re-review.

Remove only stale top-level theme keys from existing OpenCode settings while preserving unrelated content, permissions, and malformed-file safety. Keep fresh installs as no-ops and cover migration and verification paths with regression tests.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
internal/components/theme/inject.go (1)

42-66: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Accumulate the migration result instead of returning early.

If a future adapter supports theme injection AND implements ThemeSettingsMigrator, returning early here will skip the actual injection phase during the first run. This breaks idempotency (requiring two runs to reach the final state) and contradicts the intent of running migration before the current injection behavior is applied.

Consider accumulating the changed state and merging it with the injection result to ensure both operations can complete in a single pass.

♻️ Proposed refactor
 func Inject(homeDir string, adapter agents.Adapter) (InjectionResult, error) {
-	if migrator, ok := adapter.(agents.ThemeSettingsMigrator); ok {
-		path, changed, err := migrator.MigrateThemeSettings(homeDir)
-		if err != nil {
-			return InjectionResult{}, err
-		}
-		if changed {
-			return InjectionResult{Changed: true, Files: []string{path}}, nil
-		}
-	}
-	if !agents.SupportsThemeInjection(adapter) {
-		return InjectionResult{}, nil
-	}
+	var migrated bool
+	var migratedPath string
+	if migrator, ok := adapter.(agents.ThemeSettingsMigrator); ok {
+		var err error
+		migratedPath, migrated, err = migrator.MigrateThemeSettings(homeDir)
+		if err != nil {
+			return InjectionResult{}, err
+		}
+	}
+	if !agents.SupportsThemeInjection(adapter) {
+		if migrated {
+			return InjectionResult{Changed: true, Files: []string{migratedPath}}, nil
+		}
+		return InjectionResult{}, nil
+	}

 	settingsPath := adapter.SettingsPath(homeDir)
 	if settingsPath == "" {
-		return InjectionResult{}, nil
+		if migrated {
+			return InjectionResult{Changed: true, Files: []string{migratedPath}}, nil
+		}
+		return InjectionResult{}, nil
 	}

 	writeResult, err := mergeJSONFile(settingsPath, themeOverlayJSON)
 	if err != nil {
 		return InjectionResult{}, err
 	}

-	return InjectionResult{Changed: writeResult.Changed, Files: []string{settingsPath}}, nil
+	return InjectionResult{Changed: writeResult.Changed || migrated, Files: []string{settingsPath}}, nil
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/components/theme/inject.go` around lines 42 - 66, Update Inject to
accumulate the migrator’s changed state and migrated file path instead of
returning immediately when MigrateThemeSettings reports changed. Continue
through SupportsThemeInjection, SettingsPath, and mergeJSONFile so both
migration and injection run in one pass, then combine their Changed values and
include both affected paths in the returned InjectionResult without duplicating
paths.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@internal/components/theme/inject.go`:
- Around line 42-66: Update Inject to accumulate the migrator’s changed state
and migrated file path instead of returning immediately when
MigrateThemeSettings reports changed. Continue through SupportsThemeInjection,
SettingsPath, and mergeJSONFile so both migration and injection run in one pass,
then combine their Changed values and include both affected paths in the
returned InjectionResult without duplicating paths.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: b76ea49f-4aa5-49b0-b67a-59a593c110b0

📥 Commits

Reviewing files that changed from the base of the PR and between 4cde8df and 01703f1.

📒 Files selected for processing (7)
  • internal/agents/interface.go
  • internal/agents/opencode/adapter.go
  • internal/cli/run.go
  • internal/cli/run_component_paths_test.go
  • internal/components/filemerge/json_remove.go
  • internal/components/theme/inject.go
  • internal/components/theme/inject_test.go

@Alan-TheGentleman Alan-TheGentleman left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The migration now addresses the original failure, but I'm keeping changes requested because the remover still does not preserve unrelated content or fail closed for every malformed file. When theme is the first top-level member, the removal range also deletes preceding JSONC comments; an unterminated trailing block comment can also be normalized away before validation, allowing a malformed file to be rewritten instead of left untouched. Please add regression tests for both cases and adjust the parser and removal boundaries so unrelated comments are preserved and every malformed input returns without mutation. The required type:* label is also still missing, and its policy check is failing. Push the update and I'll re-review.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@internal/components/filemerge/json_remove.go`:
- Around line 150-151: The three callers of skipJSONComment—skipJSONTrivia,
scanJSONValueDelimiter, and removeTopLevelJSONKeyOnce—must handle an unchanged
index when an isolated slash is encountered. Add an advancement check at each
site: return or otherwise terminate the current scan when skipJSONComment
returns its input index, preserving normal comment-skipping behavior when the
index advances. Apply this in internal/components/filemerge/json_remove.go at
lines 150-151, 128-129, and 69-85.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: f7e5cdb1-0b71-4430-9015-2df302ca3281

📥 Commits

Reviewing files that changed from the base of the PR and between 01703f1 and 77c3dd4.

📒 Files selected for processing (10)
  • docs/components.md
  • e2e/e2e_test.sh
  • internal/agents/interface.go
  • internal/agents/opencode/adapter.go
  • internal/catalog/components.go
  • internal/cli/run.go
  • internal/components/filemerge/json_remove.go
  • internal/components/theme/inject_test.go
  • internal/tui/testdata/preset-custom-no-opencode-next.golden
  • internal/tui/testdata/preset-custom-opencode-next.golden

Comment thread internal/components/filemerge/json_remove.go Outdated
@dnlrsls

dnlrsls commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

Please make the permission-preservation contract portable on Windows, or scope the POSIX mode assertion to platforms where those bits are meaningful. go test ./internal/components/theme -run '^TestInjectRemovesLegacyOpenCodeThemeOnly$' -count=3 fails deterministically on Windows/amd64 because the rewritten file reports mode 0666 while the new test requires 0600.

This test is candidate-only and does not exist in frozen base tree c7e46beaf7bba4bae5a12531c853b6a7690b7649. The other deterministic full-suite failures reproduced on that frozen base and are not attributed to this PR; one MCP timeout was load-sensitive. Please rerun the focused test after adjusting the contract or assertion.

Validated patch

The minimal test-only fix is to keep the permission assertion on platforms where POSIX mode bits are meaningful:

diff --git a/internal/components/theme/inject_test.go b/internal/components/theme/inject_test.go
index 1e47f1d..84851fe 100644
--- a/internal/components/theme/inject_test.go
+++ b/internal/components/theme/inject_test.go
@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"os"
 	"path/filepath"
+	"runtime"
 	"testing"
 
 	"github.com/gentleman-programming/gentle-ai/internal/agents"
@@ -145,8 +146,10 @@ func TestInjectRemovesLegacyOpenCodeThemeOnly(t *testing.T) {
 	if err != nil {
 		t.Fatalf("Stat(settings) error = %v", err)
 	}
-	if got := info.Mode().Perm(); got != 0o600 {
-		t.Fatalf("settings mode = %o, want preserved 600", got)
+	if runtime.GOOS != "windows" {
+		if got := info.Mode().Perm(); got != 0o600 {
+			t.Fatalf("settings mode = %o, want preserved 600", got)
+		}
 	}
 
 	second, err := Inject(home, opencodeAdapter())

Validated against commit 919617e437d061ae62bfbd7fdebd9681367ecf8b on Windows/amd64:

$ go test ./internal/components/theme -run '^TestInjectRemovesLegacyOpenCodeThemeOnly$' -count=3
ok  	github.com/gentleman-programming/gentle-ai/internal/components/theme	1.009s

$ go test ./internal/components/theme -count=1
ok  	github.com/gentleman-programming/gentle-ai/internal/components/theme	0.877s

$ GOOS=linux GOARCH=amd64 GOPROXY=off go test -c ./internal/components/theme
PASS (compile-only, no output)

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@e2e/e2e_test.sh`:
- Around line 1068-1081: The Node-unavailable simulation contains an unused
python3 override. Remove the `python3()` stub from the test block around
`jsonc_has_no_root_key`, while preserving the `command()` override because
`jsonc_has_no_root_key` relies on it indirectly through `command -v node`.

In `@internal/components/theme/inject.go`:
- Around line 63-70: Update the mergeJSONFile error path in MigrateThemeSettings
to return the accumulated result alongside the error instead of a fresh
InjectionResult{}. Preserve any Changed flag and Files entries recorded by the
preceding migration while continuing to propagate the merge failure.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 367c6ce3-d55d-4a59-99c5-aaf85e5665eb

📥 Commits

Reviewing files that changed from the base of the PR and between 919617e and 2e04de2.

📒 Files selected for processing (6)
  • e2e/e2e_test.sh
  • e2e/lib.sh
  • internal/cli/run.go
  • internal/cli/run_component_paths_test.go
  • internal/components/theme/inject.go
  • internal/components/theme/inject_test.go

Comment thread e2e/e2e_test.sh
Comment thread internal/components/theme/inject.go
@LCubero

LCubero commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Updated in 7f1f963 with both latest review follow-ups:

  • removed the unused Python stub from the Node-unavailable E2E simulation
  • preserved the accumulated migration result when later theme injection fails
  • added deterministic regression coverage for the partial-result contract

Fresh checks pass for Go Format, Unit Tests, Windows Runtime, and E2E on Ubuntu, Arch, and Fedora.

@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown

@LCubero Thanks for the update. I’ll review the latest revision, including the follow-up fixes and regression coverage.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
e2e/e2e_test.sh (1)

1532-1548: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Use assert_jsonc_has_no_root_key for consistency with the schema-aware check.

Lines 1539 and 1545 use assert_file_not_contains ... '"theme"', which forbids the substring anywhere in the file — stricter than the root-only semantics this PR establishes via assert_jsonc_has_no_root_key elsewhere (test_oc_theme_injection, test_full_preset_opencode, test_edge_multiple_json_overlays). Currently harmless since this test only installs --component theme, but it would false-fail if this test is ever extended to a component that legitimately writes a nested theme key.

♻️ Proposed fix
     if $BINARY install --agent opencode --component theme --persona neutral 2>&1; then
-        assert_file_not_contains "$settings" '"theme"' "No theme key after first run"
+        assert_jsonc_has_no_root_key "$settings" "theme" "No root theme key after first run"
     else
         log_fail "First OpenCode theme install exited non-zero (should be a clean no-op)"
     fi

     if $BINARY install --agent opencode --component theme --persona neutral 2>&1; then
-        assert_file_not_contains "$settings" '"theme"' "No theme key after second run"
+        assert_jsonc_has_no_root_key "$settings" "theme" "No root theme key after second run"
     else
         log_fail "Second OpenCode theme install exited non-zero (should be a clean no-op)"
     fi
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@e2e/e2e_test.sh` around lines 1532 - 1548, Replace both
assert_file_not_contains checks in test_idempotent_theme_opencode with the
schema-aware assert_jsonc_has_no_root_key helper, passing the settings file and
theme key. Preserve the existing success/failure flow and messages while
validating only the root-level theme property.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@e2e/e2e_test.sh`:
- Around line 1532-1548: Replace both assert_file_not_contains checks in
test_idempotent_theme_opencode with the schema-aware
assert_jsonc_has_no_root_key helper, passing the settings file and theme key.
Preserve the existing success/failure flow and messages while validating only
the root-level theme property.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: eb6bd6f8-66d2-4ad5-bc66-a2259e0ca0b0

📥 Commits

Reviewing files that changed from the base of the PR and between 919617e and 7f1f963.

📒 Files selected for processing (6)
  • e2e/e2e_test.sh
  • e2e/lib.sh
  • internal/cli/run.go
  • internal/cli/run_component_paths_test.go
  • internal/components/theme/inject.go
  • internal/components/theme/inject_test.go

@LCubero

LCubero commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

@Alan-TheGentleman PR #1287 is ready for re-review at 52aa4d2.

All reviewer and CodeRabbit follow-ups are addressed. Fresh checks pass for Go Format, Unit Tests, Windows Runtime, and E2E on Ubuntu, Arch, and Fedora.

Please apply type:bug and size:exception. The PR body includes the final 750-line review-size breakdown and the rationale for keeping the migration and its safety proof together.

@Alan-TheGentleman Alan-TheGentleman added type:bug Bug fix size:exception Maintainer-approved exception for PRs above the 400 changed-line review budget labels Jul 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:exception Maintainer-approved exception for PRs above the 400 changed-line review budget type:bug Bug fix

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(opencode): remove invalid top-level theme config

3 participants