Skip to content

chore: Restructure the Go CLI into independent dispatcher, runner, and shared modules - #1461

Merged
hatayama merged 19 commits into
v3-betafrom
refactor/directory-split-go-work
Jul 3, 2026
Merged

hatayama merged 19 commits into
v3-betafrom
refactor/directory-split-go-work

Conversation

@hatayama

@hatayama hatayama commented Jul 2, 2026 •

Copy link
Copy Markdown
Owner

Summary

  • The Go CLI codebase is now physically split into four Go modules that match the v3 release boundaries: common/ (shared packages), dispatcher/, project-runner/ (renamed from cli/), and tools/release-automation/, tied together by a repo-root go.work.
  • All planned steps are complete on this branch: module split, architecture-test expansion, and the docs/config sweep. The prerequisite release cycle (chore: release v3-beta #1455 → uloop-project-runner-v3.0.0-beta.46) has been published and its stamps are merged into this branch.

User Impact

  • No runtime behavior change. The uloop dispatcher and uloop-project-runner binaries are built from the same sources as before.
  • The dispatcher and the project runner can no longer accidentally depend on each other: they live in separate Go modules that only share common, so the compiler itself enforces the release boundary.

Changes

  • Extracted common/ (clicore, project, skills, tools, unityipc, version, clicontract), dispatcher/ (with its contract and internal packages), and tools/release-automation/ into their own modules; the remaining runner code moved from cli/ to project-runner/ with a matching module path.
  • The runner contract (contract.json + loader) now lives in common/clicontract; the dispatcher contract lives in dispatcher/. This deviates from the original plan (both under the runner) because the handshake and version stamps are needed by all three consumers.
  • release-please package key cli renamed to project-runner; the component uloop-project-runner, its tag series, and all stamped versions are unchanged. dispatcherVersion bumped to 3.0.1-beta.11 because dispatcher release inputs moved.
  • Native binaries now build into a repo-root dist/ tree; .go-version, the golangci configs, and the layout contract (schema v2, declaring all four modules) moved to the repo root as single sources of truth. Workflows, packaging, sync, and release-target scripts follow.
  • Package release commit matching is now gated on release-please commit subjects, so file moves in this PR cannot be mistaken for release commits.
  • The architecture tests moved to tools/release-automation and now validate the whole repository from the repo root: the pre-split cli/ directory must not reappear, module dependency directions are enforced from go.mod requires, the go directive stays aligned across go.mod/go.work/.go-version, internal boundary lists and the 500-line production file cap cover all four modules, and module enumeration is cross-checked against go.work, the check scripts, and the code-complexity workflow. Extending the file cap to all modules surfaced a 523-line guard file, which was resolved by extracting the contract-at-ref helpers into their own file.
  • AGENTS.md (CLAUDE.md is a symlink to it), README, the CodeRabbit IPC instructions, and the simplification-plan verification commands now reference the split paths and the renamed MINIMUM_REQUIRED_PROJECT_RUNNER_VERSION constant.

Known transitional states

  • Release automation reads contracts at historical release tags through the legacy cli/contract.json / cli/dispatcher-contract.json paths. This fallback is permanent because pre-split tags keep those paths forever.
  • Until the next phase lands, changes touching only common/ do not surface in release PRs (release-please package roots are Packages/src and project-runner). common/ is treated as frozen in the interim.

Verification

  • scripts/check-go-cli.sh: fmt / vet / lint / tests across all four modules, plus build and dist verification — green, including after merging the origin/v3-beta beta.46 release stamps.
  • Every new architecture guard was proven to bite via fake violation injection (top-level cli/ recreation, an illegal go.mod require, a clicore import inside common, an internal package in common, and a layout-contract typo), then reverted.
  • Release tooling test scripts all green: test-release-please-config, test-sync-release-please-package-releases, test-resolve-native-cli-release-target, test-native-cli-publish-workflow, test-go-cli-toolchain, test-install-release-filter, test-use-local-uloop, test-resolve-dispatcher-release-target.
  • Dispatcher version bump guard verified in both directions: fails at HEAD~1 (inputs moved without a bump) and passes at HEAD.
  • v3 upgrade smoke test (v2.1.1 → v3.0.0-beta.48 released tag) run against a scratch Unity project as the pre-merge gate.

Review in cubic

hatayama added 9 commits July 2, 2026 20:07
The release commit search matched any commit whose pathspec-limited diff
re-added the manifest entry and the changelog heading. A commit that moves
a package changelog always re-adds every changelog line in that diff
because the rename source falls outside the pathspec, so a restructure
commit could impersonate the release commit and break the sync against
the published release target. Reuse is-release-please-release-commit.sh
so only release-please subjects qualify, ahead of the directory split
that moves cli/CHANGELOG.md.
The directory split will turn cli into multiple Go modules (common,
project-runner, dispatcher, release tooling). A workspace lets every
module resolve its siblings locally without publishing, and landing it
first pins that the existing single-module checks stay green with a
go.work present. The go directive matches cli/go.mod so the patch-level
toolchain pin stays solely in cli/.go-version.
Move clicore, project, skills, tools, unityipc, and version out of
cli/internal into a new common module that depends on no other module
in the repo, so the compiler itself enforces the shared-code boundary
once dispatcher and project-runner become separate modules. The runner
contract (contract.json and its loader) moves to common/clicontract
because common code (clicore, unityipc) and the dispatcher both consume
the runner version and protocol generation, and neither may depend on
the runner module; the dispatcher contract stays at the cli module root
until the dispatcher module split. Release-please extra-files now point
at the moved stamped files via repo-root-relative paths.
Move internal/dispatcher, install, uninstall, update, cmd/dispatcher,
and the dispatcher contract out of the cli module into a dispatcher
module that requires only common. The compiler now enforces that the
dispatcher and the project runner cannot import each other: neither
module requires the other. The dispatcher contract package is renamed
to dispatchercontract because the clicontract name now belongs to the
runner contract in common. Exclude-paths for the moved directories are
dropped from the runner release config since the paths left its package
root, and the boundary architecture tests now run go list inside the
owning module.
Move internal/automation and the six release automation commands out of
the cli module into tools/release-automation, requiring only common.
Path constants inside the guards now describe the split layout
(common/clicontract, dispatcher/), and the runner and dispatcher
contracts read at git refs fall back to the legacy cli/ paths because
releases tagged before the split still store the contracts there.
Workflow steps and the release sync script now run the automation
commands from the new module directory, and the cli package exclude
list is gone because the excluded directories left the package root.
Every dispatcher source file moved into the dispatcher module in this
branch, which changes the dispatcher release inputs, so the next
dispatcher release must carry a new version per the bump guard.
The dispatcher version bump guard read the base dispatcher contract
only at the split path, so any base ref predating the directory split
looked like an initial contract introduction and the bump requirement
was silently skipped. Route the base read through the existing
legacy-path fallback so pre-split bases still enforce a version
increase; a base missing the contract at both paths remains the
bootstrap case.
…path

The dispatcher module split moved dispatcher-contract.json from cli/ to
dispatcher/, and resolve-dispatcher-release-target.sh now reads the new
path. The test fixture still wrote the contract to the legacy cli/ path,
so every case failed with a missing-file jq error.
…e repo root

After the dispatcher and release-automation splits, the cli/ directory
only contained the project runner, so the name no longer described the
module. Renaming the directory and Go module path finishes the physical
split of the release boundaries.

- release-please package key "cli" -> "project-runner"; the component
  uloop-project-runner and its tag series stay unchanged, and the
  manifest carries the current version over to the renamed key
- native binaries now build into a repo-root dist/ tree shared by the
  dispatcher and project runner outputs
- the Go toolchain version file, golangci configs, and the layout
  contract (now schema v2 declaring all four modules) move to the repo
  root as the single source of truth
- workflows, packaging, release-target, and sync scripts follow the new
  paths; module-wide checks and vulnerability scans cover all four
  modules
@coderabbitai

coderabbitai Bot commented Jul 2, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 206 files, which is 56 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 80c750bc-cc82-4524-955d-0d25b666258d

📥 Commits

Reviewing files that changed from the base of the PR and between 4363b2c and 35e4628.

⛔ Files ignored due to path filters (11)
  • .gitignore is excluded by none and included by none
  • .go-version is excluded by none and included by none
  • common/go.mod is excluded by none and included by none
  • common/go.sum is excluded by !**/*.sum and included by none
  • dispatcher/go.mod is excluded by none and included by none
  • dispatcher/go.sum is excluded by !**/*.sum and included by none
  • go.work is excluded by !**/*.work and included by none
  • go.work.sum is excluded by !**/*.sum and included by none
  • project-runner/go.mod is excluded by none and included by none
  • project-runner/go.sum is excluded by !**/*.sum and included by none
  • tools/release-automation/go.mod is excluded by none and included by none
📒 Files selected for processing (206)
  • .coderabbit.yaml
  • .github/workflows/build-and-test.yml
  • .github/workflows/code-complexity.yml
  • .github/workflows/dispatcher-publish.yml
  • .github/workflows/native-cli-publish.yml
  • .github/workflows/protocol-minimum-version-warning.yml
  • .github/workflows/release-please.yml
  • .github/workflows/security-scan.yml
  • .golangci-complexity.yml
  • .golangci.yml
  • .release-please-manifest.json
  • AGENTS.md
  • README.md
  • cli/internal/architecture/architecture_test.go
  • cli/layout-contract.json
  • common/clicontract/contract.go
  • common/clicontract/contract.json
  • common/clicontract/contract_test.go
  • common/clicontract/protocol_version_consistency_test.go
  • common/clicore/argument_error.go
  • common/clicore/busy_status.go
  • common/clicore/cli_vibe.go
  • common/clicore/cli_vibe_test.go
  • common/clicore/command_registry.go
  • common/clicore/command_registry_test.go
  • common/clicore/error_editor_unresponsive.go
  • common/clicore/error_envelope.go
  • common/clicore/error_envelope_classification.go
  • common/clicore/error_envelope_test.go
  • common/clicore/focus.go
  • common/clicore/focus_test.go
  • common/clicore/global_args.go
  • common/clicore/output.go
  • common/clicore/output_test.go
  • common/clicore/runner_version.go
  • common/clicore/server_not_responding.go
  • common/clicore/skill_sources.go
  • common/clicore/skills_packages.go
  • common/clicore/skills_packages_test.go
  • common/clicore/spinner.go
  • common/clicore/spinner_test.go
  • common/clicore/string_helpers.go
  • common/clicore/tool_catalog.go
  • common/clicore/tool_catalog_test.go
  • common/clicore/tool_option_help.go
  • common/clicore/tool_options.go
  • common/clicore/tool_readiness.go
  • common/clicore/tool_readiness_test.go
  • common/clicore/tool_settings.go
  • common/clicore/transport_errors.go
  • common/clicore/transport_errors_test.go
  • common/project/project.go
  • common/project/project_test.go
  • common/skills/source.go
  • common/tools/catalog.go
  • common/tools/default-tools.json
  • common/tools/types.go
  • common/unityipc/client.go
  • common/unityipc/client_heartbeat_test.go
  • common/unityipc/client_test.go
  • common/unityipc/client_windows_test.go
  • common/unityipc/connection.go
  • common/unityipc/dial_unix.go
  • common/unityipc/dial_windows.go
  • common/unityipc/framing.go
  • common/unityipc/framing_test.go
  • common/unityipc/outcome.go
  • common/version/compare.go
  • common/version/compare_test.go
  • dispatcher/cmd/dispatcher/main.go
  • dispatcher/contract.go
  • dispatcher/contract_test.go
  • dispatcher/dispatcher-contract.json
  • dispatcher/internal/dispatcher/bootstrap_platform_errors.go
  • dispatcher/internal/dispatcher/command_help.go
  • dispatcher/internal/dispatcher/completion.go
  • dispatcher/internal/dispatcher/completion_options.go
  • dispatcher/internal/dispatcher/completion_test.go
  • dispatcher/internal/dispatcher/dispatcher.go
  • dispatcher/internal/dispatcher/dispatcher_bootstrap_routing_test.go
  • dispatcher/internal/dispatcher/dispatcher_download.go
  • dispatcher/internal/dispatcher/dispatcher_pin.go
  • dispatcher/internal/dispatcher/dispatcher_process.go
  • dispatcher/internal/dispatcher/dispatcher_test.go
  • dispatcher/internal/dispatcher/dispatcher_update_version.go
  • dispatcher/internal/dispatcher/dispatcher_update_version_test.go
  • dispatcher/internal/dispatcher/dispatcher_version.go
  • dispatcher/internal/dispatcher/error_envelope_test.go
  • dispatcher/internal/dispatcher/help_test.go
  • dispatcher/internal/dispatcher/install.go
  • dispatcher/internal/dispatcher/install_test.go
  • dispatcher/internal/dispatcher/launch.go
  • dispatcher/internal/dispatcher/launch_focus_log.go
  • dispatcher/internal/dispatcher/launch_options.go
  • dispatcher/internal/dispatcher/launch_process_exit_timeout_error.go
  • dispatcher/internal/dispatcher/launch_process_unix.go
  • dispatcher/internal/dispatcher/launch_process_unix_test.go
  • dispatcher/internal/dispatcher/launch_process_windows.go
  • dispatcher/internal/dispatcher/launch_ready.go
  • dispatcher/internal/dispatcher/launch_startup_timeout_error.go
  • dispatcher/internal/dispatcher/launch_test.go
  • dispatcher/internal/dispatcher/native_install_dir.go
  • dispatcher/internal/dispatcher/run_dispatcher.go
  • dispatcher/internal/dispatcher/run_help.go
  • dispatcher/internal/dispatcher/skills.go
  • dispatcher/internal/dispatcher/skills_content.go
  • dispatcher/internal/dispatcher/skills_discovery.go
  • dispatcher/internal/dispatcher/skills_dispatch.go
  • dispatcher/internal/dispatcher/skills_display.go
  • dispatcher/internal/dispatcher/skills_sync.go
  • dispatcher/internal/dispatcher/skills_targets.go
  • dispatcher/internal/dispatcher/skills_test.go
  • dispatcher/internal/dispatcher/skills_v3_migration.go
  • dispatcher/internal/dispatcher/uninstall.go
  • dispatcher/internal/dispatcher/uninstall_test.go
  • dispatcher/internal/dispatcher/update.go
  • dispatcher/internal/dispatcher/update_test.go
  • dispatcher/internal/install/command.go
  • dispatcher/internal/install/command_test.go
  • dispatcher/internal/install/posix_install.go
  • dispatcher/internal/uninstall/command.go
  • dispatcher/internal/uninstall/command_test.go
  • dispatcher/internal/update/command.go
  • dispatcher/internal/update/installer.go
  • dispatcher/internal/update/installer_test.go
  • docs/architecture/native-cli-simplification-plan.md
  • layout-contract.json
  • project-runner/CHANGELOG.md
  • project-runner/cmd/project-runner/main.go
  • project-runner/internal/projectrunner/compile_wait.go
  • project-runner/internal/projectrunner/compile_wait_test.go
  • project-runner/internal/projectrunner/connection_retry.go
  • project-runner/internal/projectrunner/connection_retry_flow.go
  • project-runner/internal/projectrunner/connection_retry_test.go
  • project-runner/internal/projectrunner/control_play_mode_wait.go
  • project-runner/internal/projectrunner/control_play_mode_wait_test.go
  • project-runner/internal/projectrunner/debug_timing.go
  • project-runner/internal/projectrunner/debug_timing_test.go
  • project-runner/internal/projectrunner/dynamic_code_file.go
  • project-runner/internal/projectrunner/dynamic_code_file_test.go
  • project-runner/internal/projectrunner/dynamic_code_wait.go
  • project-runner/internal/projectrunner/execution_errors.go
  • project-runner/internal/projectrunner/list_output.go
  • project-runner/internal/projectrunner/list_output_test.go
  • project-runner/internal/projectrunner/native_tool_settings.go
  • project-runner/internal/projectrunner/pause_point_errors.go
  • project-runner/internal/projectrunner/pause_point_logs.go
  • project-runner/internal/projectrunner/pause_point_wait.go
  • project-runner/internal/projectrunner/pause_point_wait_test.go
  • project-runner/internal/projectrunner/projectrunner.go
  • project-runner/internal/projectrunner/run.go
  • project-runner/internal/projectrunner/run_test.go
  • project-runner/internal/projectrunner/runner_commands.go
  • project-runner/internal/projectrunner/runner_usage.go
  • project-runner/internal/projectrunner/runner_usage_test.go
  • project-runner/internal/projectrunner/tool_params.go
  • project-runner/internal/projectrunner/tools_test.go
  • release-please-config.json
  • scripts/build-go-cli.sh
  • scripts/check-build-link-go-cli.sh
  • scripts/check-code-complexity.sh
  • scripts/check-go-cli-source.sh
  • scripts/go-cli-toolchain.sh
  • scripts/package-dispatcher.sh
  • scripts/package-go-cli.sh
  • scripts/refresh-neighbor-game-skills-macos.sh
  • scripts/refresh-neighbor-game-skills-windows.sh
  • scripts/resolve-dispatcher-release-target.sh
  • scripts/resolve-native-cli-release-target.sh
  • scripts/run-posix-e2e.sh
  • scripts/smoke-cli-recovery-readiness.go
  • scripts/sync-release-please-package-releases.sh
  • scripts/test-go-cli-toolchain.sh
  • scripts/test-native-cli-publish-workflow.sh
  • scripts/test-release-please-config.sh
  • scripts/test-resolve-dispatcher-release-target.sh
  • scripts/test-resolve-native-cli-release-target.sh
  • scripts/test-sync-release-please-package-releases.sh
  • scripts/test-use-local-uloop.sh
  • scripts/use-local-uloop.sh
  • scripts/verify-dispatcher-release-assets.sh
  • scripts/verify-go-cli-dist.sh
  • scripts/verify-native-cli-release-assets.sh
  • tools/release-automation/cmd/check-dispatcher-minimum-version/main.go
  • tools/release-automation/cmd/check-dispatcher-version-bump/main.go
  • tools/release-automation/cmd/check-ipc-protocol-reminder/main.go
  • tools/release-automation/cmd/check-protocol-minimum-version/main.go
  • tools/release-automation/cmd/comment-protocol-minimum-version/main.go
  • tools/release-automation/cmd/dispatch-release-please-pr-checks/main.go
  • tools/release-automation/internal/architecture/architecture_test.go
  • tools/release-automation/internal/architecture/github_actions_security_test.go
  • tools/release-automation/internal/automation/contract_file_at_ref.go
  • tools/release-automation/internal/automation/contract_file_at_ref_test.go
  • tools/release-automation/internal/automation/dispatcher_minimum_version_guard.go
  • tools/release-automation/internal/automation/dispatcher_minimum_version_guard_test.go
  • tools/release-automation/internal/automation/dispatcher_version_bump_guard.go
  • tools/release-automation/internal/automation/dispatcher_version_bump_guard_test.go
  • tools/release-automation/internal/automation/ipc_protocol_reminder.go
  • tools/release-automation/internal/automation/ipc_protocol_reminder_test.go
  • tools/release-automation/internal/automation/protocol_minimum_version_comment.go
  • tools/release-automation/internal/automation/protocol_minimum_version_guard.go
  • tools/release-automation/internal/automation/protocol_minimum_version_guard_test.go
  • tools/release-automation/internal/automation/protocol_minimum_version_parse.go
  • tools/release-automation/internal/automation/release_pr_body.go
  • tools/release-automation/internal/automation/release_pr_checks.go
  • tools/release-automation/internal/automation/release_pr_checks_test.go

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/directory-split-go-work

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.

@hatayama
hatayama marked this pull request as ready for review July 2, 2026 13:23

@cubic-dev-ai cubic-dev-ai 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.

4 issues found across 209 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="scripts/resolve-native-cli-release-target.sh">

<violation number="1" location="scripts/resolve-native-cli-release-target.sh:15">
P2: Project-runner assets can be skipped even when workspace dependency wiring changes, because release-input detection no longer includes repo-root go.work. Adding go.work (and go.work.sum if present) to CLI_RELEASE_INPUT_PATHS would keep publish decisions aligned with actual build inputs.</violation>
</file>

<file name="tools/release-automation/internal/automation/dispatcher_version_bump_guard.go">

<violation number="1" location="tools/release-automation/internal/automation/dispatcher_version_bump_guard.go:20">
P2: Dispatcher behavior changes in `common/project` or `common/version` can bypass this bump guard, so dispatcher releases may merge without a required `dispatcherVersion` increment. Expanding the common-module patterns beyond `common/clicore` would keep the guard aligned with current dispatcher dependencies.</violation>
</file>

Note: This PR contains a large number of files. cubic only reviews up to 200 files per PR, so some files may not have been reviewed. cubic prioritizes the most important files to review.

Re-trigger cubic

Comment thread scripts/resolve-native-cli-release-target.sh
Comment thread .github/workflows/code-complexity.yml
Comment thread tools/release-automation/internal/automation/dispatcher_version_bump_guard.go Outdated
hatayama added 3 commits July 3, 2026 00:11
The directory split moved built binaries from cli/dist to the repo-root
dist tree, but defaultUloopPath still joined the legacy cli segment, so
running the smoke without --uloop-path or ULOOP_BIN always failed with a
missing-binary error. The string never matched the cli/dist residual
grep because filepath.Join splits it into separate segments.
The complexity job triggers on changes in every module, but after the
split both the script and the workflow only linted project-runner, so
complexity in common, dispatcher, and tools/release-automation went
silently unmeasured. Before the split the single cli module covered all
of that code. The workflow writes one JSON artifact per module, and the
script keeps a fatal golangci-lint status from being masked by a later
module that only reports findings.
runnerContractFileAtRef and dispatcherContractFileAtRef implemented the
same try-primary-then-legacy-path branching with only the file constants
differing. A single contractFileAtRefWithLegacyFallback keeps the two
readers from drifting when the fallback behavior changes.
hatayama added 3 commits July 3, 2026 00:33
…-split-go-work

# Conflicts:
#	.release-please-manifest.json
The architecture test now applies the 500-line production file cap to
every module, which surfaced protocol_minimum_version_guard.go at 523
lines. The git contract reading layer (legacy-path fallback and command
execution) is a distinct concern also consumed by the dispatcher guard,
so move it to its own file instead of raising the cap.
After the module split, the architecture test could only see the
project-runner module from its old location, leaving stale never-match
boundary lists. Relocate it to the release-automation module and anchor
everything at the repository root so it enforces the whole-repo layout:

- the pre-split top-level cli/ directory must not reappear
- module dependency directions: common requires no repo module, the
  other three require only common (acceptance criterion 7)
- go directive alignment across go.mod files, go.work, and .go-version
- production file size cap and internal boundary lists now cover all
  four modules; common must never grow internal packages
- layout-contract v2 checks now include the Windows binary names, and
  module enumeration is cross-checked against go.work, check scripts,
  and the code-complexity workflow

Each new guard was proven to fail via fake violation injection.

@cubic-dev-ai cubic-dev-ai 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.

1 issue found across 5 files (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

hatayama added 4 commits July 3, 2026 00:54
The module split moved every path these documents referenced: the IPC
contract now lives at common/clicontract/contract.json, the dispatcher
contract under dispatcher/, the bump guard under tools/release-automation,
and development binaries under the repo-root dist/. The Unity-side
constant is now MINIMUM_REQUIRED_PROJECT_RUNNER_VERSION. Refresh
AGENTS.md (CLAUDE.md is a symlink to it), README, the CodeRabbit IPC
instructions, and the simplification plan's verification commands so
agents and reviewers stop being pointed at pre-split paths.
Current git (measured on 2.50.1) reports a file absent from both the
ref and the working tree as "fatal: path '...' does not exist in ...",
but the classifier only matched the capitalized "Path" form from older
git versions. In environments without the file on disk (bare or sparse
CI checkouts), the legacy contract fallback and the initial-introduction
detection would therefore fail instead of falling back.
The dispatcher binary depends on all seven common packages (verified
via go list -deps), not just clicore, so changes to common/project or
common/version could previously ship without the required
dispatcherVersion bump.
The workspace files wire module resolution for the release build, so
changing them can change the built binaries without touching any path
the release-input detection previously watched.
@hatayama
hatayama merged commit 1efab44 into v3-beta Jul 3, 2026
10 checks passed
@hatayama
hatayama deleted the refactor/directory-split-go-work branch July 3, 2026 04:56
RyanXie123 pushed a commit to RyanXie123/unity-cli-loop that referenced this pull request Sep 22, 2026
Sign up for free to 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.

1 participant