Commit Graph

223 Commits (5bc51b6b1a07116c795ebe217b021b22c5a6ce27)

Author SHA1 Message Date
David Sarno 064dc29213 fix: Implement CodeRabbit resource management and type safety improvements
- Move RenderTexture cleanup to finally block to ensure proper disposal
- Add PNG data validation before Base64 conversion
- Add explicit TextureFormat.RGB24 specification
- Add bool() coercion for prefer_last parameter to handle non-boolean JSON values

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-03 17:58:05 -07:00
David Sarno 264b585ceb fix: address CodeRabbit feedback on resource leaks and shader safety
- Fix material creation to handle missing shaders (URP/HDRP fallbacks)
- Add try/finally blocks for RenderTexture resource management
- Fix Python closure variable binding (ruff B023)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-03 17:11:30 -07:00
David Sarno 290c913a0f chore: remove vestigial sentinel flip code
- Remove deprecated _trigger_sentinel_async function and all call sites
- Clean up force_sentinel_reload option handling (replaced with Unity's synchronous system)
- Addresses repeated CodeRabbit flagging of unused vestigial code

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-03 16:58:13 -07:00
David Sarno 9697653b64 fix: address CodeRabbit and Greptile feedback
CodeRabbit fixes:
- Fix Python test assertions to use assert instead of print/return
- Update version consistency: server_version.txt from 3.2.0 to 3.3.0
- Assembly definition references already correctly configured

Greptile style fixes:
- Add missing newlines at end of Unity meta files and source files
- Fix test logic assumptions: use GreaterOrEqual instead of exact counts
- Make test assertions more robust for fuzzy matching algorithms

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-03 16:37:45 -07:00
David Sarno 548a4f4f29 feat: Add additive test suite and improve validation robustness
- Add nl-unity-suite-full-additive.md: new additive test design that builds state progressively instead of requiring resets
- Update claude-nl-suite.yml workflow to use additive test suite
- Fix validation scoping bugs in ManageScript.cs:
  - Correct scoped validation scope calculation (was using newText.Length instead of originalLength)
  - Enable always-on final structural validation regardless of relaxed mode
- Unify regex_replace and anchor_insert to use same smart matching logic in manage_script_edits.py
- Additive tests demonstrate better real-world workflow testing and expose interaction bugs between operations
- Self-healing capability: tools can recover from and fix broken file states

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-03 15:36:21 -07:00
GitHub Actions 65fdb4d090 chore: bump version to 3.3.0 2025-09-03 17:07:45 +00:00
David Sarno 715600956c fix: Implement collect-and-continue behavior for component property operations
- Change from fail-fast to collect-and-continue at component iteration level
- Previously: first component error would halt processing of remaining components
- Now: all components are processed, errors collected and returned together
- Maintain existing collect-and-continue behavior within individual components
- Add comprehensive tests validating the collect-and-continue behavior works correctly
- All valid properties are applied even when invalid ones fail
- Processing continues through exceptions with proper error aggregation

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-03 09:57:12 -07:00
David Sarno 43abb003ef perf: Implement CodeRabbit nitpick improvements and fix TestAsmdef
Performance & Quality Improvements:
- Add shared JsonSerializer to eliminate per-call allocation overhead
- Optimize ComponentResolver with CacheByName for short-name lookups
- Deduplicate Vector3 parsing implementations to reduce maintenance burden
- Improve property name normalization for better fuzzy matching quality
- Reduce log noise by avoiding duplicate component resolution warnings

Code Quality:
- Keep using static import for ComponentResolver (CodeRabbit was incorrect about this)
- Normalize property names consistently in AI suggestions algorithm
- Remove duplicate ParseVector3 implementation

TestAsmdef Fix:
- Revert TestAsmdef back to runtime-compatible (remove "includePlatforms": ["Editor"])
- CustomComponent now works correctly for asmdef testing as originally intended
- Validates that ComponentResolver properly handles both short and FQN for asmdef components

Live Testing Validation:
- All ComponentResolver functionality verified through live MCP connection
- AI property matching working perfectly with natural language input
- Assembly definition support fully functional for both default and custom assemblies
- Error handling provides helpful suggestions and complete context

All 45 C# tests + 31 Python tests still passing. Production ready!

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-03 09:12:44 -07:00
David Sarno 17ad011b42 fix: Address CodeRabbit review issues and improve robustness
Critical Bug Fixes:
- Fix operator precedence bug in ManageAsset.cs that could cause null reference exceptions
- Fix GameObject memory leak in primitive creation when name validation fails
- Add proper cleanup with DestroyImmediate when primitive creation fails

ComponentResolver Integration:
- Replace fragile string-based GetComponent() calls with robust ComponentResolver
- Add ComponentResolver integration in ManageAsset.cs for component lookups
- Add fallback to string-based lookup in ManageGameObject.cs for compatibility

Enhanced Error Handling:
- Surface specific ComponentResolver error context in ScriptableObject creation failures
- Add support for setting private [SerializeField] fields in property matching
- Improve debugging with detailed error messages

Assembly Definition Fixes:
- Configure TestAsmdef as Editor-only to prevent build bloat
- Add explicit TestAsmdef reference to test assembly for proper component resolution
- Fix ComponentResolverTests to use accessible CustomComponent instead of TicTacToe3D

Code Quality:
- Disable nullable reference types for legacy codebase to eliminate 100+ warnings
- Maintain backward compatibility while improving reliability

All 45 unit tests pass, ensuring no regressions while significantly improving robustness.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-03 08:27:34 -07:00
David Sarno aac237c5cf test: Add comprehensive unit tests for ComponentResolver and intelligent property matching
- Add AIPropertyMatchingTests.cs with 14 tests covering property enumeration, fuzzy matching, caching, and Unity naming conventions
- Add ManageGameObjectTests.cs with 10 integration tests for component resolution, property matching, and error handling
- Add ComponentResolverTests.cs.meta for existing comprehensive ComponentResolver tests
- Add AssemblyInfo.cs.meta for test assembly access
- Fix ManageGameObject.HandleCommand null parameter handling to prevent NullReferenceException

All 45 unit tests now pass, providing full coverage of:
- Robust component resolution avoiding Assembly.LoadFrom
- Intelligent property name suggestions using rule-based fuzzy matching
- Assembly definition (asmdef) support via CompilationPipeline
- Comprehensive error handling with helpful suggestions

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-02 19:27:40 -07:00
David Sarno cb42364263 feat: add AI-powered property matching system for component properties
- Add intelligent property name suggestions when property setting fails
- Implement GetAllComponentProperties to enumerate available properties
- Add rule-based AI algorithm for property name matching (camelCase, spaces, etc.)
- Include comprehensive error messages with suggestions and full property lists
- Add Levenshtein distance calculation for fuzzy string matching
- Cache suggestions to improve performance on repeated queries
- Add comprehensive unit tests (11 tests) covering all ComponentResolver scenarios
- Add InternalsVisibleTo attribute for test access to internal classes

Examples of improved error messages:
- "Max Reach Distance" → "Did you mean: maxReachDistance?"
- Shows all available properties when property not found
- Handles Unity Inspector display names vs actual field names

All tests passing (21/21) including new ComponentResolver test suite.
The system eliminates silent property setting failures and provides
actionable feedback to developers.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-02 19:08:59 -07:00
David Sarno c40f3d0357 feat: implement robust ComponentResolver for assembly definitions
- Replace Assembly.LoadFrom with already-loaded assembly search
- Prioritize Player assemblies over Editor assemblies using CompilationPipeline
- Support both short names and fully-qualified component names
- Add comprehensive caching and error handling with disambiguation
- Use Undo.AddComponent for proper editor integration
- Handle ReflectionTypeLoadException safely during type enumeration
- Add fallback to TypeCache for comprehensive type discovery in Editor

Fixes component resolution across custom assembly definitions and eliminates
"Could not load the file 'Assembly-CSharp-Editor'" errors.

Tested with:
- Built-in Unity components (Rigidbody, MeshRenderer, AudioSource)
- Custom user scripts in Assembly-CSharp (TicTacToe3D)
- Custom assembly definition components (TestNamespace.CustomComponent)
- Error handling for non-existent components

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-02 18:45:30 -07:00
GitHub Actions 43d1d91327 chore: bump version to 3.2.2 2025-09-02 22:23:58 +00:00
dsarno c27b8bfdf0
Merge pull request #253 from dsarno/fix/winstore-uv-detection
Fix/winstore uv detection
2025-09-02 15:23:09 -07:00
dsarno b22f3e3b4d
Merge pull request #254 from dsarno/fix/windows-auto-reload-managescript
Fix/windows auto reload managescript
2025-09-02 15:20:32 -07:00
dsarno 96326ee6a1 Editor: Detect Windows Store Python (PythonSoftwareFoundation) uv.exe in FindUvPath 2025-09-02 14:41:29 -07:00
dsarno 8c2b4a2ca8 Editor: Improve Windows auto-reload in ManageScript\n- Force synchronous ImportAsset and RequestScriptCompilation\n- Debounced refresh calls ImportAsset instead of Refresh\n- Path sanitation for Assets/ and slashes\n- Atomic writes with Windows-safe fallbacks\n- Nudge Editor tick for debounce reliability 2025-09-02 14:13:13 -07:00
GitHub Actions 35e7d89cbc chore: bump version to 3.2.1 2025-09-02 16:44:15 +00:00
dsarno 97bce34573
bump sever version (#252) 2025-09-02 09:43:13 -07:00
David Sarno 57d4f204c7 bump sever version 2025-09-02 09:42:29 -07:00
GitHub Actions f9c38da7c0 chore: bump version to 3.2.0 2025-09-02 16:37:30 +00:00
dsarno 0c52c1c92e
feat: Automatic Background Compile and Domain Reload for MCP Script Edits and New Script Creation (#248)
* Unity MCP: reliable auto-reload via Unity-side sentinel flip; remove Python writes

- Add MCP/Flip Reload Sentinel editor menu and flip package sentinel synchronously
- Trigger sentinel flip after Create/Update/ApplyTextEdits (sync) in ManageScript
- Instrument flip path with Debug.Log for traceability
- Remove Python reload_sentinel writes; tools now execute Unity menu instead
- Harden reload_sentinel path resolution to project/package
- ExecuteMenuItem runs synchronously for deterministic results
- Verified MCP edits trigger compile/reload without focus; no Python permission errors

* Getting double flips

* Fix double reload and ensure accurate batch edits; immediate structured reloads

* Remove MCP/Flip Reload Sentinel menu; rely on synchronous import/compile for reloads

* Route bridge/editor logs through McpLog and gate behind debug; create path now reloads synchronously

* chore: ignore backup artifacts; remove stray ManageScript.cs.backup files

* fix span logic

* fix: honor UNITY_MCP_STATUS_DIR for sentinel status file lookup (fallback to ~/.unity-mcp)

* test: add sentinel test honoring UNITY_MCP_STATUS_DIR; chore: ManageScript overlap check simplification and log consistency

* Harden environment path, remove extraneous flip menu test

* refactor: centralize import/compile via ManageScriptRefreshHelpers.ImportAndRequestCompile; replace duplicated sequences

* feat: add scheduledRefresh flag; standardize logs; gate info and DRY immediate import/compile

* chore: remove execute_menu_item sentinel flip from manage_script_edits; rely on import/compile

* chore: remove unused MCP reload sentinel mechanism

* fix: honor ignore_case for anchor_insert in text conversion path
2025-09-02 09:36:50 -07:00
GitHub Actions ad848f06df chore: bump version to 3.1.0 2025-08-30 16:57:57 +00:00
dsarno f4712656fa
Claude‑friendly edit tools + framed transport + live Unity NL test framework (#243)
* CI: gate desktop-parity on Anthropic key; pass anthropic_api_key like NL suite

* Add quickprobe prompt and CI workflow (mcp-quickprobe.md, unity-mcp-quickprobe.yml)

* strictier tool use to prevent subagent spawning and force mcp tools

* update workflow filesto reduce likelihood of subagent spawning

* improve permissions for claude agent, fix mcpbridge timeout/token issue

* increase max turns to 10

* ci: align NL suite to new permissions schema; prevent subagent drift

* ci: NL suite -> mini prompt for e2e; add full NL/T prompt; server: ctx optional + project_root fallback; workflows: set UNITY_PROJECT_ROOT for CI

* ci: add checks:write; revert local project hardcodes (manifest, ProjectVersion.txt)

* tools: text-edit routing fixes (anchor_insert via text, CRLF calc); prompts: mini NL/T clarifications

* ci: use absolute UNITY_PROJECT_ROOT; prompts target TestProjects; server: accept relative UNITY_PROJECT_ROOT and bare spec URI

* ci: ignore Unity test project's packages-lock.json; remove from repo to avoid absolute paths

* CI: start persistent Unity Editor for MCP (guarded by license) + allow batch-mode bridge via UNITY_MCP_ALLOW_BATCH

* CI: hide license and pass via env to docker; fix invalid ref format

* CI: readiness probe uses handshake on Unity MCP port (deterministic)

* CI: fix YAML; use TCP handshake readiness probe (FRAMING=1)

* CI: prime Unity license via game-ci; mount ULF into container; extend readiness timeout

* CI: use ULF write + mount for Unity licensing; remove serial/email/pass from container

* CI: entitlement activation (UNITY_SERIAL=''); verify host ULF cache; keep mount

* CI: write ULF from secret and verify; drop entitlement activation step

* CI: detect any licensing path; GameCI prime; status dir env; log+probe readiness; fix YAML

* CI: add GameCI license prime; conditional ULF write; one-shot license validation; explicit status dir + license env

* CI: fix YAML (inline python), add Anthropic key detect via GITHUB_ENV; ready to run happy path

* CI: mount Unity token/ulf/cache dirs into container to share host license; create dirs before start

* CI: fix YAML indentation; write ULF on host; activate in container with shared mounts; mount .config and .cache too

* CI: gate Claude via outputs; mount all Unity license dirs; fix inline probe python; stabilize licensing flow

* CI: normalize detect to step outputs; ensure license dirs mounted and validated; fix indentation

* Bridge: honor UNITY_MCP_STATUS_DIR for heartbeat/status file (CI-friendly)

* CI: guard project path for activation/start; align tool allowlist; run MCP server with python; tighten secret scoping

* CI: finalize Unity licensing mounts + status dir; mode-detect (ULF/EBL); readiness logs+probe; Claude gating via outputs

* CI: fix YAML probe (inline python -c) and finalize happy-path Unity licensing and MCP/Claude wiring

* CI: inline python probe; unify Unity image and cache mounts; ready to test

* CI: fix docker run IMAGE placement; ignore cache find perms; keep same editor image

* CI: pass -manualLicenseFile to persistent Editor; keep mounts and single image

* CI: mount full GameCI cache to /root in persistent Unity; set HOME=/root; add optional license check

* CI: make -manualLicenseFile conditional; keep full /root mount and license check

* CI: set HOME=/github/home; mount GameCI cache there; adjust manualLicenseFile path; expand license check

* CI: EBL sign-in for persistent Unity (email/password/serial); revert HOME=/root and full /root mount; keep conditional manualLicenseFile and improved readiness

* CI: run full NL/T suite prompt (nl-unity-suite-full.md) instead of mini

* NL/T: require unified diffs + explicit verdicts in JUnit; CI: remove short sanity step, publish JUnit, upload artifacts

* NL/T prompt: require CDATA wrapping for JUnit XML fields; guidance for splitting embedded ]]>; keep VERDICT in CDATA only

* CI: remove in-container license check step; keep readiness and full suite

* NL/T prompt: add version header, stricter JUnit schema, hashing/normalization, anchors, statuses, atomic semantics, tool logging

* CI: increase Claude NL/T suite timeout to 30 minutes

* CI: pre-create reports dir and result files to avoid tool approval prompts

* CI: skip wait if container not running; skip Editor start if project missing; broaden MCP deps detection; expand allowed tools

* fixies to harden ManageScript

* CI: sanitize NL/T markdown report to avoid NUL/encoding issues

* revert breaking yyaml changes

* CI: prime license, robust Unity start/wait, sanitize markdown via heredoc

* Resolve merge: accept upstream renames/installer (fix/installer-cleanup-v2) and keep local framing/script-editing

- Restored upstream server.py, EditorWindow, uv.lock\n- Preserved ManageScript editing/validation; switched to atomic write + debounced refresh\n- Updated tools/__init__.py to keep script_edits/resources and adopt new logger name\n- All Python tests via uv: 7 passed, 6 skipped, 9 xpassed; Unity compile OK

* Fix Claude Desktop config path and atomic write issues

- Fix macOS path for Claude Desktop config: use ~/Library/Application Support/Claude/ instead of ~/.config/Claude/
- Improve atomic write pattern with backup/restore safety
- Replace File.Replace() with File.Move() for better macOS compatibility
- Add proper error handling and cleanup for file operations
- Resolves issue where installer couldn't find Claude Desktop config on macOS

* Editor: use macConfigPath on macOS for MCP client config writes (Claude Desktop, etc.). Fallback to linuxConfigPath only if mac path missing.

* Models: add macConfigPath to McpClient for macOS config path selection (fixes CS1061 in editor window).

* Editor: on macOS, prefer macConfigPath in ManualConfigEditorWindow (fallback to linux path); Linux/Windows unchanged.

* Fix McpClient: align with upstream/main, prep for framing split

* NL suite: shard workflow; tighten bridge readiness; add MCP preflight; use env-based shard vars

* NL suite: fix shard step indentation; move shard vars to env; remove invalid inputs

* MCP clients: split VSCode Copilot config paths into macConfigPath and linuxConfigPath

* Unity bridge: clean stale status; bind host; robust wait probe with IPv4/IPv6 + diagnostics

* CI: use MCPForUnity.Editor.MCPForUnityBridge.StartAutoConnect as executeMethod

* Action wiring: inline mcpServers in settings for all shards; remove redundant .claude/mcp.json step

* CI: embed mcpServers in settings for all shards; fix startup sanity step; lint clean

* CI: pin claude-code-base-action to e6f32c8; use claude_args --mcp-config; switch to allowed_tools; ensure MCP config per step

* CI: unpin claude-code-base-action to @beta (commit ref not found)

* CI: align with claude-code-base-action @beta; pass MCP via claude_args and allowedTools

* Editor: Fix apply_text_edits heuristic when edits shift positions; recompute method span on candidate text with fallback delta adjustment

* CI: unify MCP wiring across workflows; write .claude/mcp.json; switch to claude_args with --mcp-config/--allowedTools; remove unsupported inputs

* CI: collapse NL suite shards into a single run to avoid repeated test execution

* CI: minimize allowedTools for NL suite to essential Unity MCP + Bash("git:*") + Write

* CI: mkdir -p reports before run; remove unsupported --timeout-minutes from claude_args

* CI: broaden allowedTools to include find_in_file and mcp__unity__*

* CI: enable use_node_cache and switch NL suite model to claude-3-7-haiku-20250219

* CI: disable use_node_cache to avoid setup-node lockfile error

* CI: set NL suite model to claude-3-haiku-20240307

* CI: cap Haiku output with --max-tokens 2048 for NL suite

* CI: switch to claude-3-7-sonnet-latest and remove unsupported --max-tokens

* CI: update allowedTools to Bash(*) and explicit Unity MCP tool list

* CI: update NL suite workflow (latest tweaks)

* Tests: tighten NL suite prompt for logging, hash discipline, stale retry, evidence windows, diff cap, and VERDICT line

* Add disallowed tools to NL suite workflow

* docs: clarify stale write retry

* Add fallback JUnit report and adjust publisher

* Indent fallback JUnit XML in workflow

* fix: correct fallback JUnit report generation

* Update mcp-quickprobe.md

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Update mcp-quickprobe.md

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Update Response.cs

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Update MCPForUnityBridge.cs

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* fix: correct McpTypes reference

* Add directory existence checks for symlink and XDG paths

* fix: only set installation flag after successful server install

* Update resource_tools.py

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* fix: respect mac config paths

* Use File.Replace for atomic config write

* Remove unused imports in manage_script

* bump server version

* Tests: update NL suite prompt and workflows; remove deprecated smoke/desktop-parity; quickprobe tidy

* Editor: atomic config write via File.Replace fallback; remove redundant backups and racey exists checks

* CI: harden NL suite - idempotent docker, gate on unity_ok, safer port probe, least-priv perms

* Editor: make atomic config write restoration safe (flag writeDone; copy-overwrite restore; cleanup in finally)

* CI: fix fallback JUnit heredoc by using printf lines (no EOF delimiter issues)

* CI: switch NL suite to mini prompt; mini prompt honors / and NL discipline

* CI: replace claude_args with allowed_tools/model/mcp_config per action schema

* CI: expand UNITY_PROJECT_ROOT via  in MCP config heredoc

* EditorWindow: add cross-platform fallback for File.Replace; macOS-insensitive PathsEqual; safer uv resolve; honor macConfigPath

* CI: strengthen JUnit publishing for NL mini suite (normalize, debug list, publish both, fail_on_parse_error)

* CI: set job-wide JUNIT_OUT/MD_OUT; normalization uses env; publish references env and ungroup reports

* CI: publish a single normalized JUnit (reports/junit-for-actions.xml); fallback writes same; avoid checkName/reportPaths mismatch

* CI: align mini prompt report filenames; redact Unity log tail in diagnostics

* chore: sync workflow and mini prompt; redacted logs; JUnit normalization/publish tweaks

* CI: redact sensitive tokens in Stop Unity; docs: CI usage + edit tools

* prompts: update nl-unity-suite-full (mini-style setup + reporting discipline); remove obsolete prompts

* CI: harden NL workflows (timeout_minutes, robust normalization); prompts: unify JUnit suite name and reporting discipline

* prompts: add guarded write pattern (LF hash, stale_file retry) to full suite

* prompts: enforce continue-on-failure, driver flow, and status handling in full suite

* Make test list more explicit in prompt. Get rid of old test prompts for hygeine.

* prompts: add stale fast-retry (server hash) + in-memory buf guidance

* CI: standardize JUNIT_OUT to reports/junit-nl-suite.xml; fix artifact upload indentation; prompt copy cleanups

* prompts: reporting discipline — append-only fragments, batch writes, no model round-trip

* prompts: stale fast-retry preference, buffer/sha carry, snapshot revert, essential logging

* workflows(nl-suite): precreate report skeletons, assemble junit, synthesize markdown; restrict allowed_tools to append-only Bash + MCP tools

* thsis too

* Update README-DEV.md

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update .github/workflows/claude-nl-suite-mini.yml

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update .github/workflows/claude-nl-suite.yml

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* workflows(nl-mini): fix YAML indentation/trailing spaces under with: and cleanup heredoc spacing

* workflows(nl-suite): fix indentation on docker logs redaction line (YAML lint)

* Add write to allowlist

* nl-suite: harden reporting discipline (fragment-only writes, forbid alt paths); workflow: clean stray junit-*updated*.xml

* nl-suite: enforce end-of-suite single Write (no bash redirection); workflow: restrict allowed_tools to Write+MCP only

* prompts(nl-full): end-of-suite results must be valid XML with single <cases> root and only <testcase> children; no raw text outside CDATA

* workflows(nl-suite): make Claude step non-fatal; tolerant normalizer extracts <testcase> via regex on bad fragments

* nl-suite: fix stale classname to UnityMCP.NL-T in mini fallback; prompt: require re-read after every revert; correct PLAN/PROGRESS to 15

* nl-suite: fix fallback JUnit classname to UnityMCP.NL-T; prompt: forbid create_script and env/mkdir checks, enforce single baseline-byte revert flow and post-revert re-read; add corruption-handling guidance

* prompts(nl-full): after each write re-read raw bytes to refresh pre_sha; prefer script_apply_edits for anchors; avoid header/using changes

* prompts(nl-full): canonicalize outputs to /; allow small fragment appends via Write or Bash(printf/echo); forbid wrappers and full-file round-trips

* prompts(nl-full): finalize markdown formatting for guarded write, execution order, specs, status

* workflows(nl-suite, mini): header/lint fixes and constrained Bash append path; align allowed_tools

* prompts(nl-full): format Fast Restore, Guarded Write, Execution, Specs, Status as proper markdown lists and code fences

* workflows(nl-suite): keep header tidy and append-path alignment with prompt

* minor fix

* workflows(nl-suite): fix indentation and dispatch; align allowed_tools and revert helper

* prompts(nl-full): switch to read_resource for buf/sha; re-read only when needed; convert 'Print this once' to heading; note snapshot helper creates parent dirs

* workflows(nl-suite): normalize step removes bootstrap when real testcases present; recompute tests/failures

* workflows(nl-suite): enrich Markdown summary by extracting per-test <system-out> blocks (truncated)

* clarify prompt resilience instructions

* ci(nl-suite): revert prompt and workflow to known-good e0f8a72 for green run; remove extra MD details

* ci(nl-suite): minimal fixes — no-mkdir guard in prompt; drop bootstrap and recompute JUnit counts

* ci(nl-suite): richer JUnit→Markdown report (per-test system-out)

* Small guard to incorret asset read call.

* ci(nl-suite): refine MD builder — unescape XML entities, safe code fences, PASS/FAIL badges

* Update UnityMcpBridge/UnityMcpServer~/src/tools/resource_tools.py

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update UnityMcpBridge/UnityMcpServer~/src/unity_connection.py

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update UnityMcpBridge/UnityMcpServer~/src/tools/manage_script_edits.py

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update .github/scripts/mark_skipped.py

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update .github/scripts/mark_skipped.py

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update .github/scripts/mark_skipped.py

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* server(manage_script): robust URI handling — percent-decode file://, normalize, strip host/leading slashes, return Assets-relative if present

* Update .claude/prompts/nl-unity-suite-full.md

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* tests(framing): reduce handshake poll window, nonblocking peek to avoid disconnect race; still enforce pre-handshake data drop

* tests(manage_script): add _split_uri tests for unity://path, file:// URLs (decoded/Assets-relative), and plain paths

* server+tests: fix handshake syntax error; robust file:// URI normalization in manage_script; add _split_uri tests; adjust stdout scan to ignore venv/site-packages

* bridge(framing): accept zero-length frames (treat as empty keepalive)

* tests(logging): use errors='replace' on decode fallback to avoid silent drops

* resources(list): restrict to Assets/, resolve symlinks, enforce .cs; add traversal/outside-path tests

* Update .claude/prompts/nl-unity-suite-full.md

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update UnityMcpBridge/UnityMcpServer~/src/unity_connection.py

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* misc: framing keepalive (zero-length), regex preview consistency, resource.list hardening, URI parsing, legacy update routing, test cleanups

* docs(tools): richer MCP tool descriptions; tests accept decorator kwargs; resource URI parsing hardened

* Update .claude/prompts/nl-unity-suite-full.md

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update UnityMcpBridge/UnityMcpServer~/src/tools/resource_tools.py

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update UnityMcpBridge/UnityMcpServer~/src/unity_connection.py

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* net+docs: hard-reject zero-length frames; TCP_NODELAY on connect; Assets detection case-insensitive; NL prompt statuses aligned

* prompt(nl-suite): constrain Write destinations under reports/, forbid traversal

* prompt+net: harden Write path rules; use monotonic deadline and plain-text advisory for non-framed peers

* unity_connection: restore recv timeout via try/finally; make global connection getter thread-safe with module lock and double-checked init

* NL/T prompt: pin structured edit ops for T-D/T-E; add schema-error guarded write behavior; keep existing path/URI and revert rules

* unity_connection: add FRAMED_MAX; use ValueError for framed length violations; lower framed receive log to debug; serialize connect() with per-instance lock

* ManageScript: use UTF8Encoding(without BOM) for atomic writes in ApplyTextEdits/EditScript to align with Create/Update and avoid BOM-related diffs/hash mismatches

* NL/T prompt: make helper deletion regex multiline-safe ((?ms) so ^ anchors line starts)

* ManageScript: emit structured overlap status {status:"overlap"} for overlapping edit ranges in apply_text_edits and edit paths

* NL/T prompt: clarify fallback vs failure — fallback only for unsupported/missing_field; treat bad_request as failure; note unsupported after fallback as failure

* NL/T prompt: pin deterministic overlap probe (apply_text_edits two ranges from same snapshot); gate too_large behind RUN_TOO_LARGE env hint

* TB update

* NL/T prompt: harden Output Rules — constrain Bash(printf|echo) to stdout-only; forbid redirection/here-docs/tee; only scripts/nlt-revert.sh may mutate FS

* Prompt: enumerate allowed script_apply_edits ops; add manage_editor/read_console guidance; fix T‑F atomic batch to single script_apply_edits. ManageScript: regex timeout for diagnostics; symlink ancestor guard; complete allowed-modes list.

* Fixes

* ManageScript: add rich overlap diagnostics (conflicts + hint) for both text range and structured batch paths

* ManageScript: return structured {status:"validation_failed"} diagnostics in create/update/edits and validate before commit

* ManageScript: echo canonical uri in responses (create/read/update/apply_text_edits/structured edits) to reinforce resource identity

* improve clarity of capabilities message

* Framing: allow zero-length frames on both ends (C# bridge, Python server). Prompt: harden T-F to single text-range apply_text_edits batch (descending order, one snapshot). URI: normalize file:// outside Assets by stripping leading slash.

* ManageScript: include new sha256 in success payload for apply_text_edits; harden TryResolveUnderAssets by rejecting symlinked ancestors up to Assets/.

* remove claudetest dir

* manage_script_edits: normalize method-anchored anchor_insert to insert_method (map text->replacement); improves CI compatibility for T‑A/T‑E without changing Editor behavior.

* tighten testing protocol around mkdir

* manage_script: validate create_script inputs (Assets/.cs/name/no traversal); add Assets/ guard to delete_script; validate level+Assets in validate_script; make legacy manage_script optional params; harden legacy update routing with base64 reuse and payload size preflight.

* Tighten prompt for testing

* Update .claude/prompts/nl-unity-suite-full.md

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update .claude/prompts/nl-unity-suite-full.md

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update UnityMcpBridge/Editor/Tools/ManageScript.cs

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* manage_script_edits: honor ignore_case on anchor_insert and regex_replace in both direct and text-conversion paths (MULTILINE|IGNORECASE).

* remove extra file

* workflow: use python3 for inline scripts and port detection on ubuntu-latest.

* Tighten prompt + manage_script

* Update UnityMcpBridge/UnityMcpServer~/src/tools/manage_script_edits.py

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update UnityMcpBridge/UnityMcpServer~/src/tools/manage_script_edits.py

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update .claude/prompts/nl-unity-suite-full.md

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update UnityMcpBridge/Editor/Tools/ManageScript.cs

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update .claude/prompts/nl-unity-suite-full.md

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* manage_script: improve file:// UNC handling; preserve POSIX absolute semantics internally; keep test-expected slash stripping for non-Assets paths.

* ManageScript.cs: add TimeSpan timeouts to all Regex uses (IsMatch/Match/new Regex) and keep CultureInvariant/Multiline options; reduces risk of catastrophic backtracking stalls.

* workflow: ensure reports/ exists in markdown build step to avoid FileNotFoundError when writing MD_OUT.

* fix brace

* manage_script_edits: expand  backrefs for regex_replace in preview->text conversion and translate  to \g<n> in local apply; keeps previews and actual edits consistent.

* anchor_insert: default to position=after, normalize surrounding newlines in Python conversion paths; C# path ensures trailing newline and skips duplicate insertion within class.

* feat(mcp): add get_sha tool; apply_text_edits normalization+overlap preflight+strict; no-op evidence in C#; update NL suite prompt; add unit tests

* feat(frames): accept zero-length heartbeat frames in client; add heartbeat test

* feat(edits): guard destructive regex_replace with structural preflight; add robust tests; prompt uses delete_method for temp helper

* feat(frames): bound heartbeat loop with timeout/threshold; align zero-length response with C#; update test

* SDK hardening: atomic multi-span text edits; stop forcing sequential for structured ops; forward options on apply_text_edits; add validate=relaxed support and scoped checks; update NL/T prompt; add tests for options forwarding, relaxed mode, and atomic batches

* Router: default applyMode=atomic for multi-span apply_text_edits; add tests

* CI prompt: pass options.validate=relaxed for T-B/C; options.applyMode=atomic for T-F; emphasize always writing testcase and restoring on errors

* Validation & DX: add validate=syntax (scoped), standardize evidence windows; early regex compile with hints; debug_preview for apply_text_edits

* Update UnityMcpBridge/Editor/Windows/MCPForUnityEditorWindow.cs

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* NL/T suite-driven edits: LongUnityScriptClaudeTest, bridge helpers, server_version; prepare framing tests

* Fix duplicate macConfigPath field in McpClient to resolve CS0102

* Editor threading: run EnsureServerInstalled on main thread; marshal EditorPrefs/DeleteKey + logging via delayCall

* Docs(apply_text_edits): strengthen guidance on 1-based positions, verify-before-edit, and recommend anchors/structured edits

* Docs(script_apply_edits): add safety guidance (anchors, method ops, validators) and recommended practices

* Framed VerifyBridgePing in editor window; docs hardening for apply_text_edits and script_apply_edits

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-08-30 09:55:38 -07:00
GitHub Actions 22e8016aee chore: bump version to 3.0.2 2025-08-26 05:26:53 +00:00
David Sarno a7d7bcdc42 Editor: on macOS, prefer macConfigPath in ManualConfigEditorWindow (fallback to linux path); Linux/Windows unchanged. 2025-08-25 16:56:43 -07:00
David Sarno 88b6390359 Models: add macConfigPath to McpClient for macOS config path selection (fixes CS1061 in editor window). 2025-08-25 16:49:42 -07:00
David Sarno 99d7a120c9 Editor: use macConfigPath on macOS for MCP client config writes (Claude Desktop, etc.). Fallback to linuxConfigPath only if mac path missing. 2025-08-25 15:26:06 -07:00
David Sarno daa105da35 Fix Claude Desktop config path and atomic write issues
- Fix macOS path for Claude Desktop config: use ~/Library/Application Support/Claude/ instead of ~/.config/Claude/
- Improve atomic write pattern with backup/restore safety
- Replace File.Replace() with File.Move() for better macOS compatibility
- Add proper error handling and cleanup for file operations
- Resolves issue where installer couldn't find Claude Desktop config on macOS
2025-08-25 14:51:03 -07:00
David Sarno aa4fc1c0ea Server: set server_version.txt to 3.0.1 2025-08-24 14:19:34 -07:00
David Sarno ad5c3112ca MCP: Fix macOS paths and VSCode manual setup
Normalize macOS to Application Support; use AppSupport symlink for Cursor args

Map XDG (~/.local/share, ~/.config) to Application Support

VSCode manual: show mcp.json path; use top-level servers JSON

VSCode macOS path: ~/Library/Application Support/Code/User/mcp.json
2025-08-24 14:18:08 -07:00
David Sarno 01ea2f46ac refactor(installer): revert to lean installer logic from ee23346c; fix macOS path via Application.platform; escape pgrep pattern 2025-08-24 11:47:04 -07:00
David Sarno ce1104e9e7 feat(installer): rewire known configs (EditorPrefs, Cursor mcp.json) to canonical path; then remove legacy if unreferenced 2025-08-24 11:39:01 -07:00
David Sarno 755e1d784b chore(version): bump server_version.txt to 3.0.5 2025-08-24 11:32:13 -07:00
David Sarno 48c1b7a51e fix(installer): use Application.platform for OS detection; add canonical root logs; fallback to RuntimeInformation 2025-08-24 11:31:38 -07:00
David Sarno 86b4dc14bc chore(logging): include OS and server version in MCP bridge start log 2025-08-24 11:28:47 -07:00
David Sarno 58ed4d4e13 chore(server): bump server_version.txt to 3.0.4 2025-08-24 11:11:27 -07:00
David Sarno 4da30cc43b bump server version 2025-08-24 11:00:58 -07:00
David Sarno 576dba407a Merge branch 'main' of https://github.com/CoplayDev/unity-mcp into fix/installer-cleanup-v2
* 'main' of https://github.com/CoplayDev/unity-mcp:
  Improve Windsurf MCP Config (#231)
2025-08-24 10:07:04 -07:00
David Sarno 742d168b51 sec(installer): escape server path in pgrep pattern to prevent injection/regex issues 2025-08-24 09:46:54 -07:00
David Sarno 175d5ae150 chore(editor): WriteToConfig honors pythonDir; robust config match; remove unused helpers 2025-08-24 09:44:39 -07:00
David Sarno f21c2cedd5 fix(installer): skip legacy deletion when still referenced in prefs or Cursor config 2025-08-24 09:40:29 -07:00
Marcus Sanatan 22fe9dfbdb
Improve Windsurf MCP Config (#231)
* Move the current test to a Tools folder

* feat: add env object and disabled flag handling for MCP client configuration

* Format manual config specially for Windsurf and Kiro

* refactor: extract config JSON building logic into dedicated ConfigJsonBuilder class

* refactor: extract unity node population logic into centralized helper method

* refactor: only add env property to config for Windsurf and Kiro clients

If it ain't broke with the other clients, don't fix...

* fix: write UTF-8 without BOM encoding for config files to avoid Windows compatibility issues

* fix: enforce UTF-8 encoding without BOM when writing files to disk
2025-08-24 06:57:11 -04:00
David Sarno ee23346ca2 feat: installer cleanup, auto-migration, logging normalization 2025-08-23 22:13:47 -07:00
GitHub Actions 97fb4a775e chore: bump version to 3.0.0 2025-08-21 00:42:06 +00:00
Marcus Sanatan eeb67e8656
Don't ignore the package's README (#230) 2025-08-20 18:26:51 -04:00
Marcus Sanatan ae13ef41d5
Rename namespace and public facing plugin output from "Unity MCP" to "MCP for Unity" (#225)
* refactor: rename namespace from UnityMcpBridge to MCPForUnity across all files

See thread in #6, we can't use Unity MCP because it violates their trademark.
That name makes us look affiliated. We can use MCP for Unity

* Change package display name, menu item and menu titles

These are front facing so has to change for Unity asset store review

* Misc name changes in logs and comments for better consistency

* chore: update editor window title from 'MCP Editor' to 'MCP for Unity'

* refactor: update branding from UNITY-MCP to MCP-FOR-UNITY across all log messages and warnings

* chore: rename Unity MCP to MCP For Unity across all files and bump version to 2.1.2

* docs: update restore script title to clarify Unity MCP naming

* Fix usage instructions

* chore: update log messages to use MCP For Unity branding instead of UnityMCP

* Add a README inside plugin, required for distributing via the asset store

* docs: update Unity port description and fix typo in troubleshooting section

* Address Rabbit feedback

* Update Editor prefs to use new name

Prevents overlap with other Unity MCPs, happy to revert if it's too much

* refactor: rename server logger and identifier from unity-mcp-server to mcp-for-unity-server

* Standardize casing of renamed project to "MCP for Unity", as it is on the asset store

* Remove unused folder

* refactor: rename Unity MCP to MCP for Unity across codebase

* Update dangling references

* docs: update product name from UnityMCP to MCP for Unity in README

* Update log and comments for new name
2025-08-20 15:59:49 -04:00
Marcus Sanatan 14a6cbaeb4
Support kiro (#221)
* Add a base Unity project to run unit tests in

* Add Windsurf IDE support so I can test more easily

* Add a dummy script

* feat: add unit tests for CommandRegistry and document prefab asset workflows

* Run tests when code is pushed to main

* Bump version of actions

* Install the MCP plugin via relative path

* Remove test branch from GH workflow

* Remove blank package.json files at the top level directory

* Add Kiro support, closes #196
2025-08-15 21:26:12 -04:00
Jos van der Westhuizen c9d30daf62
Update package.json -- add discord link 2025-08-15 10:08:24 -05:00
GitHub Actions 60a2ed4749 chore: bump version to 2.1.2 2025-08-14 23:19:31 +00:00
Marcus Sanatan ce39ca6d49 Revert "Bump version because we have a name change"
This reverts commit 148fa8b431.

We'll test the actions that bumps the version and tags the repo
2025-08-14 18:48:51 -04:00
Marcus Sanatan 148fa8b431 Bump version because we have a name change 2025-08-14 18:29:22 -04:00
Marcus Sanatan b735210d9d Update required Unity version and package name
Closes #213
2025-08-14 18:13:21 -04:00
David Sarno 80d311ec13 chore(windows): WinGet Links resolution uses ProgramFiles (machine-wide) after LOCALAPPDATA; drop ProgramData; update comment 2025-08-13 19:15:03 -07:00
David Sarno fae347b03a revert: remove protocol framing changes from config-stability PR (keep config-only changes) 2025-08-13 19:06:33 -07:00
David Sarno 616d3998b5 chore: bump package version to 2.1.1 2025-08-13 19:02:29 -07:00
David Sarno 6e59b8fe8d fix: linux XDG config paths; prefer installed server; robust cursor detection; atomic writes; uv validation; WinGet Links ordering 2025-08-13 18:13:25 -07:00
David Sarno 6e22721d3a feat: preserve existing client config; prefer installed server path; add ResolveServerSrc; block PackageCache unless dev override; canonical uv args 2025-08-13 17:46:07 -07:00
David Sarno 4e1b905ea0 chore: bump version to 2.1.0; Windows uv resolver improvements; preserve existing uv command; Claude unregister UI fix; .ps1 handling; add generic mcp_source.py 2025-08-13 14:02:19 -07:00
dsarno b6b8d47dfe Windows: robust Claude CLI resolution (prefer .cmd, fallback .ps1, where.exe); Unregister UX: use 'claude mcp get' exit codes; stop PATH prepend on Windows; safer detection when unregistered 2025-08-13 12:36:24 -07:00
David Sarno a2a14c179c Claude Code: after unregister, set NotConfigured, re-check, and repaint so button toggles and status updates 2025-08-13 11:54:07 -07:00
David Sarno 9a9267c128 Windows: prefer WinGet Links uv.exe and preserve existing absolute uv command during config writes 2025-08-13 11:35:31 -07:00
David Sarno b09a86f5fb WriteToConfig: only include type="stdio" for VSCode; omit for other clients 2025-08-12 21:47:11 -07:00
David Sarno a52ce7a219 VSCode manual config: use resolved uv path; VSCode parse init guards; NVM version parse robustness; help labels [HELP] 2025-08-12 21:33:43 -07:00
David Sarno eb7b2e952e chore: bump Unity MCP Bridge package version 2025-08-12 21:09:02 -07:00
David Sarno 4f9017d676 VSCode MCP: switch to mcp.json top-level servers schema; add type=stdio; robust parse/merge; Cursor/Windsurf UV gating UI; Claude Code UX polish and NVM detection 2025-08-12 20:56:22 -07:00
David Sarno 5965158533 Unity MCP: Claude Code UX improvements: dynamic not-found state with inline help link; NVM auto-detection; path picker override; hide picker after detection; remove auto-connect toggle. 2025-08-12 19:04:47 -07:00
David Sarno bd6114b436 fix(claude): treat 'already exists' as success; improve IsClaudeConfigured using ExecPath on all OSes 2025-08-12 12:14:48 -07:00
David Sarno efd146ab53 fix: Windows define UNITY_EDITOR_WIN; async stdout/stderr in TryRun and RepairPythonEnvironment; use EnvironmentVariables for PATH; prepend Unix PATH only on macOS/Linux; fix duplicate .meta GUIDs 2025-08-12 11:56:46 -07:00
David Sarno f6f8b24371 chore(uv): prepend ~/.local/bin and common bins to PATH for 'which uv' in GUI env 2025-08-12 10:48:46 -07:00
David Sarno 6b3a20dd78 chore(package): add .meta files for new helpers and bump version to 2.0.1 2025-08-12 10:34:34 -07:00
David Sarno 8984ab95bc feat: local-only package resolution + Claude CLI resolver; quieter install logs; guarded auto-registration 2025-08-12 08:32:51 -07:00
David Sarno ae87e3f3b2 read_console: remove dead types.Contains("all") branch; compute want directly from unityType (Exception/Assert treated as errors) 2025-08-11 17:26:51 -07:00
David Sarno 46f616df90 read_console: correct compiler diagnostic categorization (CSxxxx), preserve Debug.Log as Log without mode fallback, add explicit Debug.Log detection helper 2025-08-11 16:57:41 -07:00
dsarno 6439902d8d
Merge branch 'CoplayDev:main' into fix-read-console 2025-08-11 13:59:17 -07:00
dsarno a506f9b346 Update package.json version to 2.0.0 2025-08-11 12:30:36 -07:00
David Sarno 1938756844 server: centralize reload-aware retries and single-source retry_after_ms via config; increase default retry window (40 x 250ms); preserve structured reloading failures 2025-08-10 22:49:24 -07:00
David Sarno dc6171dfe6 ReadConsole: lock Debug.Log classification to Log; avoid bit-based fallback when stacktrace shows Debug:Log
- Detect explicit Debug.Log in stacktrace (UnityEngine.Debug:Log)
- Do not downgrade/upgrade to Warning via mode bits for editor-originated logs
- Keeps informational setup lines (e.g., MCP registration, bridge start) as Log
2025-08-10 20:12:45 -07:00
David Sarno a40db48132 ReadConsole: stable severity classification and filtering across Unity versions
- Classify severity via stacktrace/message first (LogError/LogWarning/Exception/Assertion), with safe fallback to mode-bit mapping
- Fix error/warning/log mapping; treat Exception/Assert as errors for filtering
- Return the current console buffer reliably and remove debug spam
- No changes outside ReadConsole behavior
2025-08-10 19:45:24 -07:00
dsarno b179ce1ed8
Merge branch 'main' into feat/bridge-stability 2025-08-10 11:57:07 -07:00
David Sarno 07b35837b7 Bridge: deferred init, stop-before-reload, breadcrumb logs; stable rebinds.
Editor: auto-rewrite MCP client config when package path changes.

Server: heartbeat-aware retries, structured {state: reloading, retry_after_ms}, single auto-retry across tools; guard empty calls.

Repo: remove global *~ ignore (was hiding UnityMcpServer~), track tilde server folder (Unity still excludes it from assemblies).
2025-08-09 15:09:49 -07:00
David Sarno 32f513f10d Merge branch 'feat/bridge-stability' of https://github.com/dsarno/unity-mcp into feat/bridge-stability
* 'feat/bridge-stability' of https://github.com/dsarno/unity-mcp:
  Bridge logs: add bold blue UNITY-MCP prefix; gate PortManager logs behind Debug Logs toggle; improve Python and UV detection on Windows (flex versions, where.exe/Path scan); tidy installer messages
2025-08-09 13:00:26 -07:00
David Sarno 9da9739751 Package Python server under UnityMcpServer~; remove redundant .meta files; delete old root UnityMcpServer; update editor lookup for tilde path; adjust deploy/restore scripts; remove orphan meta 2025-08-09 12:49:32 -07:00
David Sarno c0de38e1e7 Merge upstream/main: CoplayDev rebrand with bridge stability improvements
This merge combines upstream's organizational rebrand and updates with
our comprehensive bridge stability improvements:

**From Upstream:**
- CoplayDev organizational rebrand (README, LICENSE, documentation)
- Updated logo and deployment scripts
- Python version pinning (.python-version file)

**From Our Branch (Preserved):**
- Comprehensive bridge stability improvements (threading, heartbeat, retries)
- Enhanced debugging and diagnostic features
- Embedded server installation approach (more reliable than git-based)
- Broader Python compatibility (>=3.10 vs >=3.12)
- Advanced port management with per-project persistence
- Auto-setup and connection reliability features
- Robust error handling and recovery mechanisms

**Key Technical Decisions:**
- Used our comprehensive UnityMcpBridge.cs (625 lines vs 473) with all stability features
- Maintained embedded server approach over upstream's git-based installer
- Preserved broader Python compatibility (>=3.10) for better accessibility
- Used our optimized connection settings and retry logic
- Kept our user-centric server installation approach (on-demand vs automatic)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-09 12:05:47 -07:00
dsarno 4c72309dc8 Bridge logs: add bold blue UNITY-MCP prefix; gate PortManager logs behind Debug Logs toggle; improve Python and UV detection on Windows (flex versions, where.exe/Path scan); tidy installer messages 2025-08-08 15:09:18 -07:00
David Sarno f24e124c15 MCP: Embedded server reliability and UX\n\n- Embed-first installer: copies embedded server, adds RepairPythonEnvironment() (deletes .venv, runs 'uv sync'); robust uv path discovery; macOS install path -> Application Support\n- UI: Server Status shows Installed(Embedded); Python missing warning with install link; Repair button tooltip; header Show Debug Logs; cleaned layout\n- Python: unpin .python-version; set requires-python >=3.10 in both pyprojects\n- Dev: improved package/dev path resolution 2025-08-08 14:16:25 -07:00
Marcus Sanatan 3288418bbf chore: update package metadata and license to CoplayDev organization 2025-08-08 15:54:43 -04:00
Marcus Sanatan 94df819e61 fix: update package name from com.CoplayDev.unity-mcp to com.coplaydev.unity-mcp to comply with Unity package naming standards 2025-08-08 15:13:47 -04:00
Marcus Sanatan 5d148a7462 chore: update repository URLs and package name to use correct CoplayDev casing and main branch 2025-08-08 15:06:35 -04:00
Marcus Sanatan 6faa55f825 chore: update package namespace from justinpbarnett to coplaydev 2025-08-08 14:59:30 -04:00
David Sarno 06f271926b feat(editor): 2x2 layout (Server/Bridge | Clients/Validation), Auto-Setup with Connected ✓ state; add Debug Logs toggle and gate verbose logs
fix(bridge): reuse stored port in StartAutoConnect; guard listener stop to avoid ObjectDisposedException

chore(clients): reorder dropdown to Cursor, Claude Code, Windsurf, Claude Desktop, VSCode
2025-08-08 11:23:45 -07:00
David Sarno 2f387d3417 chore(ui): rename 'Re-Run Client Setup' to 'Bind to Clients' 2025-08-08 10:49:01 -07:00
David Sarno 10903a2d48 fix(setup): reuse stored project port in StartAutoConnect to avoid port changes during client setup 2025-08-08 10:35:00 -07:00
David Sarno f4bc7cd4fd fix(ports): never hop to default when stored port busy; prefer stored port and let bind micro-retry handle release to avoid port swapping on recompiles 2025-08-08 08:37:02 -07:00
David Sarno 1b892dcf49 fix(ports): write both hashed and legacy port files; compare project paths case-insensitively to prevent sticky-port drift across reloads 2025-08-08 08:32:20 -07:00
David Sarno 85202d4ccb fix(editor): only treat dev mode when manifest uses file: path for package; remove dev-mode logs under UPM 2025-08-08 08:24:50 -07:00
David Sarno 57592017ae fix(bridge): prefer persisted project port at start to avoid initial 6400 blip after UPM import 2025-08-08 08:18:33 -07:00
David Sarno 5c632f0ab3 fix(package): add UnityMcpServer folder meta; remove stray egg-info meta 2025-08-08 08:12:57 -07:00
David Sarno a65f10383a feat(bridge): embed Python server into package and remove Git-based installer
- Switch ServerInstaller to embedded copy-only (no network)
- Simplify Editor UI server status to 'Installed (Embedded)'
- Vendor UnityMcpServer/src into UnityMcpBridge/UnityMcpServer/src for UPM distribution
- Keep bridge recompile robustness (heartbeat + sticky port)
2025-08-08 08:08:30 -07:00
David Sarno a0fd9199bb Add meta for PackageInstaller so Unity includes it in package cache 2025-08-07 19:09:52 -07:00