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-31 00:55:38 +08:00
|
|
|
using UnityEngine;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
|
|
// Standalone, dependency-free long script for Claude NL/T editing tests.
|
|
|
|
|
// Intentionally verbose to simulate a complex gameplay script without external packages.
|
|
|
|
|
public class LongUnityScriptClaudeTest : MonoBehaviour
|
|
|
|
|
{
|
|
|
|
|
[Header("Core References")]
|
|
|
|
|
public Transform reachOrigin;
|
|
|
|
|
public Animator animator;
|
|
|
|
|
|
|
|
|
|
[Header("State")]
|
|
|
|
|
private Transform currentTarget;
|
|
|
|
|
private Transform previousTarget;
|
|
|
|
|
private float lastTargetFoundTime;
|
|
|
|
|
|
|
|
|
|
[Header("Held Objects")]
|
|
|
|
|
private readonly List<Transform> heldObjects = new List<Transform>();
|
|
|
|
|
|
|
|
|
|
// Accumulators used by padding methods to avoid complete no-ops
|
|
|
|
|
private int padAccumulator = 0;
|
|
|
|
|
private Vector3 padVector = Vector3.zero;
|
🎮 GameObject Toolset Redesign and Streamlining (#518)
* feat: Redesign GameObject API for better LLM ergonomics
## New Tools
- find_gameobjects: Search GameObjects, returns paginated instance IDs only
- manage_components: Component lifecycle (add, remove, set_property)
## New Resources
- unity://scene/gameobject/{id}: Single GameObject data (no component serialization)
- unity://scene/gameobject/{id}/components: All components (paginated)
- unity://scene/gameobject/{id}/component/{name}: Single component by type
## Updated
- manage_scene get_hierarchy: Now includes componentTypes array
- manage_gameobject: Slimmed to lifecycle only (create, modify, delete)
- Legacy actions (find, get_components, etc.) log deprecation warnings
## Extracted Utilities
- ParamCoercion: Centralized int/bool/float/string coercion
- VectorParsing: Vector3/Vector2/Quaternion/Color parsing
- GameObjectLookup: Centralized GameObject search logic
## Test Coverage
- 76 new Unity EditMode tests for ManageGameObject actions
- 21 new pytest tests for Python tools/resources
- New NL/T CI suite for GameObject API (GO-0 to GO-5)
Addresses LLM confusion with parameter overload by splitting into
focused tools and read-only resources.
* feat: Add static gameobject_api helper resource for UI discoverability
Adds unity://scene/gameobject-api resource that:
- Shows in Cursor's resource list UI (no parameters needed)
- Documents the parameterized gameobject resources
- Explains the workflow: find_gameobjects → read resource
- Lists examples and related tools
* feat: Add GO tests to main NL/T CI workflow
- Adds GO pass (GO-0 to GO-5) after T pass in claude-nl-suite.yml
- Includes retry logic for incomplete GO tests
- Updates all regex patterns to recognize GO-* test IDs
- Updates DESIRED lists to include all 21 tests (NL-0..4, T-A..J, GO-0..5)
- Updates default_titles for GO tests in markdown summary
- Keeps separate claude-gameobject-suite.yml for standalone runs
* feat: Add GameObject API stress tests and NL/T suite updates
Stress Tests (12 new tests):
- BulkCreate small/medium batches
- FindGameObjects pagination with by_component search
- AddComponents to single object
- GetComponents with full serialization
- SetComponentProperties (complex Rigidbody)
- Deep hierarchy creation and path lookup
- GetHierarchy with large scenes
- Resource read performance tests
- RapidFire create-modify-delete cycles
NL/T Suite Updates:
- Added GO-0..GO-10 tests in nl-gameobject-suite.md
- Fixed tool naming: mcp__unity__ → mcp__UnityMCP__
Other:
- Fixed LongUnityScriptClaudeTest.cs compilation errors
- Added reports/, .claude/local/, scripts/local-test/ to .gitignore
All 254 EditMode tests pass (250 run, 4 explicit skips)
* fix: Address code review feedback
- ParamCoercion: Use CultureInfo.InvariantCulture for float parsing
- ManageComponents: Move Transform removal check before GetComponent
- ManageGameObjectFindTests: Use try-finally for LogAssert.ignoreFailingMessages
- VectorParsing: Document that quaternions are not auto-normalized
- gameobject.py: Prefix unused ctx parameter with underscore
* fix: Address additional code review feedback
- ManageComponents: Reuse GameObjectLookup.FindComponentType instead of duplicate
- ManageComponents: Log warnings when SetPropertiesOnComponent fails
- GameObjectLookup: Make FindComponentType public for reuse
- gameobject.py: Extract _normalize_response helper to reduce duplication
- gameobject.py: Add TODO comment for unused typed response classes
* fix: Address more code review feedback
NL/T Prompt Fixes:
- nl-gameobject-suite.md: Remove non-existent list_resources/read_resource from AllowedTools
- nl-gameobject-suite.md: Fix parameter names (component_type, properties)
- nl-unity-suite-nl.md: Remove unused manage_editor from AllowedTools
Test Fixes:
- GameObjectAPIStressTests: Add null check to ToJObject helper
- GameObjectAPIStressTests: Clarify AudioSource usage comment
- ManageGameObjectFindTests: Use built-in 'UI' layer instead of 'Water'
- LongUnityScriptClaudeTest: Clean up NL/T test artifacts (Counte42 typo, HasTarget)
* docs: Add documentation for API limitations and behaviors
- GameObjectLookup.SearchByPath: Document and warn that includeInactive
has no effect (Unity API limitation)
- ManageComponents.TrySetProperty: Document case-insensitive lookup behavior
* More test fixes and tighten parameters on python tools
* fix: Align test expectation with implementation error message case
* docs: update README tools and resources lists
- Add missing tools: manage_components, batch_execute, find_gameobjects, refresh_unity
- Add missing resources: gameobject_api, editor_state_v2
- Make descriptions more concise across all tools and resources
- Ensure documentation matches current MCP server functionality
* fix: Address code review feedback
- ParamCoercion: Use InvariantCulture for int/double parsing consistency
- ManageComponents: Remove redundant Undo.RecordObject (AddComponent handles undo)
- ManageScene: Replace deprecated FindObjectsOfType with FindObjectsByType
- GameObjectLookup: Add explanatory comment to empty catch block
- gameobject.py: Extract _validate_instance_id helper to reduce duplication
- Tests: Fix assertion for instanceID (Unity IDs can be negative)
* chore: Remove accidentally committed test artifacts
- Remove Materials folder (40 .mat files from interactive testing)
- Remove Shaders folder (5 noise shaders from testing)
- Remove test scripts (Bounce*, CylinderBounce* from testing)
- Remove Temp.meta and commit.sh
* test: Improve delete tests to verify actual deletion
- Delete_ByTag_DeletesMatchingObjects: Verify objects are actually destroyed
- Delete_ByLayer_DeletesMatchingObjects: Assert deletion using Unity null check
- Delete_MultipleObjectsSameName_DeletesCorrectly: Document first-match behavior
- Delete_Success_ReturnsDeletedCount: Verify count value if present
All tests now verify deletion occurred rather than just checking for a result.
* refactor: remove deprecated manage_gameobject actions
- Remove deprecated switch cases: find, get_components, get_component, add_component, remove_component, set_component_property
- Remove deprecated wrapper methods (423 lines deleted from ManageGameObject.cs)
- Delete ManageGameObjectFindTests.cs (tests deprecated 'find' action)
- Remove deprecated test methods from ManageGameObjectTests.cs
- Add GameObject resource URIs to README documentation
- Add batch_execute performance tips to README, tool description, and gameobject_api resource
- Enhance batch_execute description to emphasize 10-100x performance gains
Total: ~1200 lines removed. New API (find_gameobjects, manage_components, resources) is the recommended path forward.
* fix: Remove starlette stubs from conftest.py
Starlette is now a proper dependency via the mcp package, so we don't need
to stub it anymore. The real package handles all HTTP transport needs.
2026-01-07 02:13:45 +08:00
|
|
|
|
|
|
|
|
// Animation blend hashes
|
|
|
|
|
private static readonly int BlendXHash = Animator.StringToHash("BlendX");
|
|
|
|
|
private static readonly int BlendYHash = Animator.StringToHash("BlendY");
|
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-31 00:55:38 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
[Header("Tuning")]
|
|
|
|
|
public float maxReachDistance = 2f;
|
|
|
|
|
public float maxHorizontalDistance = 1.0f;
|
|
|
|
|
public float maxVerticalDistance = 1.0f;
|
|
|
|
|
|
|
|
|
|
// Public accessors used by NL tests
|
|
|
|
|
public bool HasTarget() { return currentTarget != null; }
|
|
|
|
|
public Transform GetCurrentTarget() => currentTarget;
|
|
|
|
|
|
🎮 GameObject Toolset Redesign and Streamlining (#518)
* feat: Redesign GameObject API for better LLM ergonomics
## New Tools
- find_gameobjects: Search GameObjects, returns paginated instance IDs only
- manage_components: Component lifecycle (add, remove, set_property)
## New Resources
- unity://scene/gameobject/{id}: Single GameObject data (no component serialization)
- unity://scene/gameobject/{id}/components: All components (paginated)
- unity://scene/gameobject/{id}/component/{name}: Single component by type
## Updated
- manage_scene get_hierarchy: Now includes componentTypes array
- manage_gameobject: Slimmed to lifecycle only (create, modify, delete)
- Legacy actions (find, get_components, etc.) log deprecation warnings
## Extracted Utilities
- ParamCoercion: Centralized int/bool/float/string coercion
- VectorParsing: Vector3/Vector2/Quaternion/Color parsing
- GameObjectLookup: Centralized GameObject search logic
## Test Coverage
- 76 new Unity EditMode tests for ManageGameObject actions
- 21 new pytest tests for Python tools/resources
- New NL/T CI suite for GameObject API (GO-0 to GO-5)
Addresses LLM confusion with parameter overload by splitting into
focused tools and read-only resources.
* feat: Add static gameobject_api helper resource for UI discoverability
Adds unity://scene/gameobject-api resource that:
- Shows in Cursor's resource list UI (no parameters needed)
- Documents the parameterized gameobject resources
- Explains the workflow: find_gameobjects → read resource
- Lists examples and related tools
* feat: Add GO tests to main NL/T CI workflow
- Adds GO pass (GO-0 to GO-5) after T pass in claude-nl-suite.yml
- Includes retry logic for incomplete GO tests
- Updates all regex patterns to recognize GO-* test IDs
- Updates DESIRED lists to include all 21 tests (NL-0..4, T-A..J, GO-0..5)
- Updates default_titles for GO tests in markdown summary
- Keeps separate claude-gameobject-suite.yml for standalone runs
* feat: Add GameObject API stress tests and NL/T suite updates
Stress Tests (12 new tests):
- BulkCreate small/medium batches
- FindGameObjects pagination with by_component search
- AddComponents to single object
- GetComponents with full serialization
- SetComponentProperties (complex Rigidbody)
- Deep hierarchy creation and path lookup
- GetHierarchy with large scenes
- Resource read performance tests
- RapidFire create-modify-delete cycles
NL/T Suite Updates:
- Added GO-0..GO-10 tests in nl-gameobject-suite.md
- Fixed tool naming: mcp__unity__ → mcp__UnityMCP__
Other:
- Fixed LongUnityScriptClaudeTest.cs compilation errors
- Added reports/, .claude/local/, scripts/local-test/ to .gitignore
All 254 EditMode tests pass (250 run, 4 explicit skips)
* fix: Address code review feedback
- ParamCoercion: Use CultureInfo.InvariantCulture for float parsing
- ManageComponents: Move Transform removal check before GetComponent
- ManageGameObjectFindTests: Use try-finally for LogAssert.ignoreFailingMessages
- VectorParsing: Document that quaternions are not auto-normalized
- gameobject.py: Prefix unused ctx parameter with underscore
* fix: Address additional code review feedback
- ManageComponents: Reuse GameObjectLookup.FindComponentType instead of duplicate
- ManageComponents: Log warnings when SetPropertiesOnComponent fails
- GameObjectLookup: Make FindComponentType public for reuse
- gameobject.py: Extract _normalize_response helper to reduce duplication
- gameobject.py: Add TODO comment for unused typed response classes
* fix: Address more code review feedback
NL/T Prompt Fixes:
- nl-gameobject-suite.md: Remove non-existent list_resources/read_resource from AllowedTools
- nl-gameobject-suite.md: Fix parameter names (component_type, properties)
- nl-unity-suite-nl.md: Remove unused manage_editor from AllowedTools
Test Fixes:
- GameObjectAPIStressTests: Add null check to ToJObject helper
- GameObjectAPIStressTests: Clarify AudioSource usage comment
- ManageGameObjectFindTests: Use built-in 'UI' layer instead of 'Water'
- LongUnityScriptClaudeTest: Clean up NL/T test artifacts (Counte42 typo, HasTarget)
* docs: Add documentation for API limitations and behaviors
- GameObjectLookup.SearchByPath: Document and warn that includeInactive
has no effect (Unity API limitation)
- ManageComponents.TrySetProperty: Document case-insensitive lookup behavior
* More test fixes and tighten parameters on python tools
* fix: Align test expectation with implementation error message case
* docs: update README tools and resources lists
- Add missing tools: manage_components, batch_execute, find_gameobjects, refresh_unity
- Add missing resources: gameobject_api, editor_state_v2
- Make descriptions more concise across all tools and resources
- Ensure documentation matches current MCP server functionality
* fix: Address code review feedback
- ParamCoercion: Use InvariantCulture for int/double parsing consistency
- ManageComponents: Remove redundant Undo.RecordObject (AddComponent handles undo)
- ManageScene: Replace deprecated FindObjectsOfType with FindObjectsByType
- GameObjectLookup: Add explanatory comment to empty catch block
- gameobject.py: Extract _validate_instance_id helper to reduce duplication
- Tests: Fix assertion for instanceID (Unity IDs can be negative)
* chore: Remove accidentally committed test artifacts
- Remove Materials folder (40 .mat files from interactive testing)
- Remove Shaders folder (5 noise shaders from testing)
- Remove test scripts (Bounce*, CylinderBounce* from testing)
- Remove Temp.meta and commit.sh
* test: Improve delete tests to verify actual deletion
- Delete_ByTag_DeletesMatchingObjects: Verify objects are actually destroyed
- Delete_ByLayer_DeletesMatchingObjects: Assert deletion using Unity null check
- Delete_MultipleObjectsSameName_DeletesCorrectly: Document first-match behavior
- Delete_Success_ReturnsDeletedCount: Verify count value if present
All tests now verify deletion occurred rather than just checking for a result.
* refactor: remove deprecated manage_gameobject actions
- Remove deprecated switch cases: find, get_components, get_component, add_component, remove_component, set_component_property
- Remove deprecated wrapper methods (423 lines deleted from ManageGameObject.cs)
- Delete ManageGameObjectFindTests.cs (tests deprecated 'find' action)
- Remove deprecated test methods from ManageGameObjectTests.cs
- Add GameObject resource URIs to README documentation
- Add batch_execute performance tips to README, tool description, and gameobject_api resource
- Enhance batch_execute description to emphasize 10-100x performance gains
Total: ~1200 lines removed. New API (find_gameobjects, manage_components, resources) is the recommended path forward.
* fix: Remove starlette stubs from conftest.py
Starlette is now a proper dependency via the mcp package, so we don't need
to stub it anymore. The real package handles all HTTP transport needs.
2026-01-07 02:13:45 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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-31 00:55:38 +08:00
|
|
|
// Simple selection logic (self-contained)
|
|
|
|
|
private Transform FindBestTarget()
|
|
|
|
|
{
|
|
|
|
|
if (reachOrigin == null) return null;
|
|
|
|
|
// Dummy: prefer previously seen target within distance
|
|
|
|
|
if (currentTarget != null && Vector3.Distance(reachOrigin.position, currentTarget.position) <= maxReachDistance)
|
|
|
|
|
return currentTarget;
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void HandleTargetSwitch(Transform next)
|
|
|
|
|
{
|
|
|
|
|
if (next == currentTarget) return;
|
|
|
|
|
previousTarget = currentTarget;
|
|
|
|
|
currentTarget = next;
|
|
|
|
|
lastTargetFoundTime = Time.time;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void LateUpdate()
|
|
|
|
|
{
|
|
|
|
|
// Keep file long with harmless per-frame work
|
|
|
|
|
if (currentTarget == null && previousTarget != null)
|
|
|
|
|
{
|
|
|
|
|
// decay previous reference over time
|
|
|
|
|
if (Time.time - lastTargetFoundTime > 0.5f) previousTarget = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// NL tests sometimes add comments above Update() as an anchor
|
🎮 GameObject Toolset Redesign and Streamlining (#518)
* feat: Redesign GameObject API for better LLM ergonomics
## New Tools
- find_gameobjects: Search GameObjects, returns paginated instance IDs only
- manage_components: Component lifecycle (add, remove, set_property)
## New Resources
- unity://scene/gameobject/{id}: Single GameObject data (no component serialization)
- unity://scene/gameobject/{id}/components: All components (paginated)
- unity://scene/gameobject/{id}/component/{name}: Single component by type
## Updated
- manage_scene get_hierarchy: Now includes componentTypes array
- manage_gameobject: Slimmed to lifecycle only (create, modify, delete)
- Legacy actions (find, get_components, etc.) log deprecation warnings
## Extracted Utilities
- ParamCoercion: Centralized int/bool/float/string coercion
- VectorParsing: Vector3/Vector2/Quaternion/Color parsing
- GameObjectLookup: Centralized GameObject search logic
## Test Coverage
- 76 new Unity EditMode tests for ManageGameObject actions
- 21 new pytest tests for Python tools/resources
- New NL/T CI suite for GameObject API (GO-0 to GO-5)
Addresses LLM confusion with parameter overload by splitting into
focused tools and read-only resources.
* feat: Add static gameobject_api helper resource for UI discoverability
Adds unity://scene/gameobject-api resource that:
- Shows in Cursor's resource list UI (no parameters needed)
- Documents the parameterized gameobject resources
- Explains the workflow: find_gameobjects → read resource
- Lists examples and related tools
* feat: Add GO tests to main NL/T CI workflow
- Adds GO pass (GO-0 to GO-5) after T pass in claude-nl-suite.yml
- Includes retry logic for incomplete GO tests
- Updates all regex patterns to recognize GO-* test IDs
- Updates DESIRED lists to include all 21 tests (NL-0..4, T-A..J, GO-0..5)
- Updates default_titles for GO tests in markdown summary
- Keeps separate claude-gameobject-suite.yml for standalone runs
* feat: Add GameObject API stress tests and NL/T suite updates
Stress Tests (12 new tests):
- BulkCreate small/medium batches
- FindGameObjects pagination with by_component search
- AddComponents to single object
- GetComponents with full serialization
- SetComponentProperties (complex Rigidbody)
- Deep hierarchy creation and path lookup
- GetHierarchy with large scenes
- Resource read performance tests
- RapidFire create-modify-delete cycles
NL/T Suite Updates:
- Added GO-0..GO-10 tests in nl-gameobject-suite.md
- Fixed tool naming: mcp__unity__ → mcp__UnityMCP__
Other:
- Fixed LongUnityScriptClaudeTest.cs compilation errors
- Added reports/, .claude/local/, scripts/local-test/ to .gitignore
All 254 EditMode tests pass (250 run, 4 explicit skips)
* fix: Address code review feedback
- ParamCoercion: Use CultureInfo.InvariantCulture for float parsing
- ManageComponents: Move Transform removal check before GetComponent
- ManageGameObjectFindTests: Use try-finally for LogAssert.ignoreFailingMessages
- VectorParsing: Document that quaternions are not auto-normalized
- gameobject.py: Prefix unused ctx parameter with underscore
* fix: Address additional code review feedback
- ManageComponents: Reuse GameObjectLookup.FindComponentType instead of duplicate
- ManageComponents: Log warnings when SetPropertiesOnComponent fails
- GameObjectLookup: Make FindComponentType public for reuse
- gameobject.py: Extract _normalize_response helper to reduce duplication
- gameobject.py: Add TODO comment for unused typed response classes
* fix: Address more code review feedback
NL/T Prompt Fixes:
- nl-gameobject-suite.md: Remove non-existent list_resources/read_resource from AllowedTools
- nl-gameobject-suite.md: Fix parameter names (component_type, properties)
- nl-unity-suite-nl.md: Remove unused manage_editor from AllowedTools
Test Fixes:
- GameObjectAPIStressTests: Add null check to ToJObject helper
- GameObjectAPIStressTests: Clarify AudioSource usage comment
- ManageGameObjectFindTests: Use built-in 'UI' layer instead of 'Water'
- LongUnityScriptClaudeTest: Clean up NL/T test artifacts (Counte42 typo, HasTarget)
* docs: Add documentation for API limitations and behaviors
- GameObjectLookup.SearchByPath: Document and warn that includeInactive
has no effect (Unity API limitation)
- ManageComponents.TrySetProperty: Document case-insensitive lookup behavior
* More test fixes and tighten parameters on python tools
* fix: Align test expectation with implementation error message case
* docs: update README tools and resources lists
- Add missing tools: manage_components, batch_execute, find_gameobjects, refresh_unity
- Add missing resources: gameobject_api, editor_state_v2
- Make descriptions more concise across all tools and resources
- Ensure documentation matches current MCP server functionality
* fix: Address code review feedback
- ParamCoercion: Use InvariantCulture for int/double parsing consistency
- ManageComponents: Remove redundant Undo.RecordObject (AddComponent handles undo)
- ManageScene: Replace deprecated FindObjectsOfType with FindObjectsByType
- GameObjectLookup: Add explanatory comment to empty catch block
- gameobject.py: Extract _validate_instance_id helper to reduce duplication
- Tests: Fix assertion for instanceID (Unity IDs can be negative)
* chore: Remove accidentally committed test artifacts
- Remove Materials folder (40 .mat files from interactive testing)
- Remove Shaders folder (5 noise shaders from testing)
- Remove test scripts (Bounce*, CylinderBounce* from testing)
- Remove Temp.meta and commit.sh
* test: Improve delete tests to verify actual deletion
- Delete_ByTag_DeletesMatchingObjects: Verify objects are actually destroyed
- Delete_ByLayer_DeletesMatchingObjects: Assert deletion using Unity null check
- Delete_MultipleObjectsSameName_DeletesCorrectly: Document first-match behavior
- Delete_Success_ReturnsDeletedCount: Verify count value if present
All tests now verify deletion occurred rather than just checking for a result.
* refactor: remove deprecated manage_gameobject actions
- Remove deprecated switch cases: find, get_components, get_component, add_component, remove_component, set_component_property
- Remove deprecated wrapper methods (423 lines deleted from ManageGameObject.cs)
- Delete ManageGameObjectFindTests.cs (tests deprecated 'find' action)
- Remove deprecated test methods from ManageGameObjectTests.cs
- Add GameObject resource URIs to README documentation
- Add batch_execute performance tips to README, tool description, and gameobject_api resource
- Enhance batch_execute description to emphasize 10-100x performance gains
Total: ~1200 lines removed. New API (find_gameobjects, manage_components, resources) is the recommended path forward.
* fix: Remove starlette stubs from conftest.py
Starlette is now a proper dependency via the mcp package, so we don't need
to stub it anymore. The real package handles all HTTP transport needs.
2026-01-07 02:13:45 +08:00
|
|
|
// Build marker OK
|
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-31 00:55:38 +08:00
|
|
|
private void Update()
|
|
|
|
|
{
|
|
|
|
|
if (reachOrigin == null) return;
|
|
|
|
|
var best = FindBestTarget();
|
|
|
|
|
if (best != null) HandleTargetSwitch(best);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Dummy reach/hold API (no external deps)
|
|
|
|
|
public void OnObjectHeld(Transform t)
|
|
|
|
|
{
|
|
|
|
|
if (t == null) return;
|
|
|
|
|
if (!heldObjects.Contains(t)) heldObjects.Add(t);
|
|
|
|
|
animator?.SetInteger("objectsHeld", heldObjects.Count);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void OnObjectPlaced()
|
|
|
|
|
{
|
|
|
|
|
if (heldObjects.Count == 0) return;
|
|
|
|
|
heldObjects.RemoveAt(heldObjects.Count - 1);
|
|
|
|
|
animator?.SetInteger("objectsHeld", heldObjects.Count);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// More padding: repetitive blocks with slight variations
|
|
|
|
|
#region Padding Blocks
|
|
|
|
|
private Vector3 AccumulateBlend(Transform t)
|
|
|
|
|
{
|
|
|
|
|
if (t == null || reachOrigin == null) return Vector3.zero;
|
|
|
|
|
Vector3 local = reachOrigin.InverseTransformPoint(t.position);
|
|
|
|
|
float bx = Mathf.Clamp(local.x / Mathf.Max(0.001f, maxHorizontalDistance), -1f, 1f);
|
|
|
|
|
float by = Mathf.Clamp(local.y / Mathf.Max(0.001f, maxVerticalDistance), -1f, 1f);
|
|
|
|
|
return new Vector3(bx, by, 0f);
|
|
|
|
|
}
|
|
|
|
|
|
🎮 GameObject Toolset Redesign and Streamlining (#518)
* feat: Redesign GameObject API for better LLM ergonomics
## New Tools
- find_gameobjects: Search GameObjects, returns paginated instance IDs only
- manage_components: Component lifecycle (add, remove, set_property)
## New Resources
- unity://scene/gameobject/{id}: Single GameObject data (no component serialization)
- unity://scene/gameobject/{id}/components: All components (paginated)
- unity://scene/gameobject/{id}/component/{name}: Single component by type
## Updated
- manage_scene get_hierarchy: Now includes componentTypes array
- manage_gameobject: Slimmed to lifecycle only (create, modify, delete)
- Legacy actions (find, get_components, etc.) log deprecation warnings
## Extracted Utilities
- ParamCoercion: Centralized int/bool/float/string coercion
- VectorParsing: Vector3/Vector2/Quaternion/Color parsing
- GameObjectLookup: Centralized GameObject search logic
## Test Coverage
- 76 new Unity EditMode tests for ManageGameObject actions
- 21 new pytest tests for Python tools/resources
- New NL/T CI suite for GameObject API (GO-0 to GO-5)
Addresses LLM confusion with parameter overload by splitting into
focused tools and read-only resources.
* feat: Add static gameobject_api helper resource for UI discoverability
Adds unity://scene/gameobject-api resource that:
- Shows in Cursor's resource list UI (no parameters needed)
- Documents the parameterized gameobject resources
- Explains the workflow: find_gameobjects → read resource
- Lists examples and related tools
* feat: Add GO tests to main NL/T CI workflow
- Adds GO pass (GO-0 to GO-5) after T pass in claude-nl-suite.yml
- Includes retry logic for incomplete GO tests
- Updates all regex patterns to recognize GO-* test IDs
- Updates DESIRED lists to include all 21 tests (NL-0..4, T-A..J, GO-0..5)
- Updates default_titles for GO tests in markdown summary
- Keeps separate claude-gameobject-suite.yml for standalone runs
* feat: Add GameObject API stress tests and NL/T suite updates
Stress Tests (12 new tests):
- BulkCreate small/medium batches
- FindGameObjects pagination with by_component search
- AddComponents to single object
- GetComponents with full serialization
- SetComponentProperties (complex Rigidbody)
- Deep hierarchy creation and path lookup
- GetHierarchy with large scenes
- Resource read performance tests
- RapidFire create-modify-delete cycles
NL/T Suite Updates:
- Added GO-0..GO-10 tests in nl-gameobject-suite.md
- Fixed tool naming: mcp__unity__ → mcp__UnityMCP__
Other:
- Fixed LongUnityScriptClaudeTest.cs compilation errors
- Added reports/, .claude/local/, scripts/local-test/ to .gitignore
All 254 EditMode tests pass (250 run, 4 explicit skips)
* fix: Address code review feedback
- ParamCoercion: Use CultureInfo.InvariantCulture for float parsing
- ManageComponents: Move Transform removal check before GetComponent
- ManageGameObjectFindTests: Use try-finally for LogAssert.ignoreFailingMessages
- VectorParsing: Document that quaternions are not auto-normalized
- gameobject.py: Prefix unused ctx parameter with underscore
* fix: Address additional code review feedback
- ManageComponents: Reuse GameObjectLookup.FindComponentType instead of duplicate
- ManageComponents: Log warnings when SetPropertiesOnComponent fails
- GameObjectLookup: Make FindComponentType public for reuse
- gameobject.py: Extract _normalize_response helper to reduce duplication
- gameobject.py: Add TODO comment for unused typed response classes
* fix: Address more code review feedback
NL/T Prompt Fixes:
- nl-gameobject-suite.md: Remove non-existent list_resources/read_resource from AllowedTools
- nl-gameobject-suite.md: Fix parameter names (component_type, properties)
- nl-unity-suite-nl.md: Remove unused manage_editor from AllowedTools
Test Fixes:
- GameObjectAPIStressTests: Add null check to ToJObject helper
- GameObjectAPIStressTests: Clarify AudioSource usage comment
- ManageGameObjectFindTests: Use built-in 'UI' layer instead of 'Water'
- LongUnityScriptClaudeTest: Clean up NL/T test artifacts (Counte42 typo, HasTarget)
* docs: Add documentation for API limitations and behaviors
- GameObjectLookup.SearchByPath: Document and warn that includeInactive
has no effect (Unity API limitation)
- ManageComponents.TrySetProperty: Document case-insensitive lookup behavior
* More test fixes and tighten parameters on python tools
* fix: Align test expectation with implementation error message case
* docs: update README tools and resources lists
- Add missing tools: manage_components, batch_execute, find_gameobjects, refresh_unity
- Add missing resources: gameobject_api, editor_state_v2
- Make descriptions more concise across all tools and resources
- Ensure documentation matches current MCP server functionality
* fix: Address code review feedback
- ParamCoercion: Use InvariantCulture for int/double parsing consistency
- ManageComponents: Remove redundant Undo.RecordObject (AddComponent handles undo)
- ManageScene: Replace deprecated FindObjectsOfType with FindObjectsByType
- GameObjectLookup: Add explanatory comment to empty catch block
- gameobject.py: Extract _validate_instance_id helper to reduce duplication
- Tests: Fix assertion for instanceID (Unity IDs can be negative)
* chore: Remove accidentally committed test artifacts
- Remove Materials folder (40 .mat files from interactive testing)
- Remove Shaders folder (5 noise shaders from testing)
- Remove test scripts (Bounce*, CylinderBounce* from testing)
- Remove Temp.meta and commit.sh
* test: Improve delete tests to verify actual deletion
- Delete_ByTag_DeletesMatchingObjects: Verify objects are actually destroyed
- Delete_ByLayer_DeletesMatchingObjects: Assert deletion using Unity null check
- Delete_MultipleObjectsSameName_DeletesCorrectly: Document first-match behavior
- Delete_Success_ReturnsDeletedCount: Verify count value if present
All tests now verify deletion occurred rather than just checking for a result.
* refactor: remove deprecated manage_gameobject actions
- Remove deprecated switch cases: find, get_components, get_component, add_component, remove_component, set_component_property
- Remove deprecated wrapper methods (423 lines deleted from ManageGameObject.cs)
- Delete ManageGameObjectFindTests.cs (tests deprecated 'find' action)
- Remove deprecated test methods from ManageGameObjectTests.cs
- Add GameObject resource URIs to README documentation
- Add batch_execute performance tips to README, tool description, and gameobject_api resource
- Enhance batch_execute description to emphasize 10-100x performance gains
Total: ~1200 lines removed. New API (find_gameobjects, manage_components, resources) is the recommended path forward.
* fix: Remove starlette stubs from conftest.py
Starlette is now a proper dependency via the mcp package, so we don't need
to stub it anymore. The real package handles all HTTP transport needs.
2026-01-07 02:13:45 +08:00
|
|
|
private void ApplyBlend(Vector3 blend) // safe animation
|
|
|
|
|
{
|
|
|
|
|
if (animator == null) return; // safety check
|
|
|
|
|
animator.SetFloat(BlendXHash, blend.x);
|
|
|
|
|
animator.SetFloat(BlendYHash, blend.y);
|
|
|
|
|
}
|
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-31 00:55:38 +08:00
|
|
|
|
|
|
|
|
public void TickBlendOnce()
|
|
|
|
|
{
|
|
|
|
|
var b = AccumulateBlend(currentTarget);
|
|
|
|
|
ApplyBlend(b);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// A long series of small no-op methods to bulk up the file without adding deps
|
|
|
|
|
private void Step001() { }
|
|
|
|
|
private void Step002() { }
|
|
|
|
|
private void Step003() { }
|
|
|
|
|
private void Step004() { }
|
|
|
|
|
private void Step005() { }
|
|
|
|
|
private void Step006() { }
|
|
|
|
|
private void Step007() { }
|
|
|
|
|
private void Step008() { }
|
|
|
|
|
private void Step009() { }
|
|
|
|
|
private void Step010() { }
|
|
|
|
|
private void Step011() { }
|
|
|
|
|
private void Step012() { }
|
|
|
|
|
private void Step013() { }
|
|
|
|
|
private void Step014() { }
|
|
|
|
|
private void Step015() { }
|
|
|
|
|
private void Step016() { }
|
|
|
|
|
private void Step017() { }
|
|
|
|
|
private void Step018() { }
|
|
|
|
|
private void Step019() { }
|
|
|
|
|
private void Step020() { }
|
|
|
|
|
private void Step021() { }
|
|
|
|
|
private void Step022() { }
|
|
|
|
|
private void Step023() { }
|
|
|
|
|
private void Step024() { }
|
|
|
|
|
private void Step025() { }
|
|
|
|
|
private void Step026() { }
|
|
|
|
|
private void Step027() { }
|
|
|
|
|
private void Step028() { }
|
|
|
|
|
private void Step029() { }
|
|
|
|
|
private void Step030() { }
|
|
|
|
|
private void Step031() { }
|
|
|
|
|
private void Step032() { }
|
|
|
|
|
private void Step033() { }
|
|
|
|
|
private void Step034() { }
|
|
|
|
|
private void Step035() { }
|
|
|
|
|
private void Step036() { }
|
|
|
|
|
private void Step037() { }
|
|
|
|
|
private void Step038() { }
|
|
|
|
|
private void Step039() { }
|
|
|
|
|
private void Step040() { }
|
|
|
|
|
private void Step041() { }
|
|
|
|
|
private void Step042() { }
|
|
|
|
|
private void Step043() { }
|
|
|
|
|
private void Step044() { }
|
|
|
|
|
private void Step045() { }
|
|
|
|
|
private void Step046() { }
|
|
|
|
|
private void Step047() { }
|
|
|
|
|
private void Step048() { }
|
|
|
|
|
private void Step049() { }
|
|
|
|
|
private void Step050() { }
|
|
|
|
|
#endregion
|
|
|
|
|
#region MassivePadding
|
|
|
|
|
private void Pad0051()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0052()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0053()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0054()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0055()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0056()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0057()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0058()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0059()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0060()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0061()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0062()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0063()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0064()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0065()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0066()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0067()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0068()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0069()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0070()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0071()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0072()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0073()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0074()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0075()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0076()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0077()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0078()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0079()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0080()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0081()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0082()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0083()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0084()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0085()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0086()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0087()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0088()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0089()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0090()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0091()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0092()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0093()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0094()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0095()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0096()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0097()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0098()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0099()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0100()
|
|
|
|
|
{
|
|
|
|
|
// lightweight math to give this padding method some substance
|
|
|
|
|
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 100) & 0x7fffffff;
|
|
|
|
|
float t = (padAccumulator % 1000) * 0.001f;
|
|
|
|
|
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
|
|
|
|
|
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
|
|
|
|
|
padVector.z = 0f;
|
|
|
|
|
}
|
|
|
|
|
private void Pad0101()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0102()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0103()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0104()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0105()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0106()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0107()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0108()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0109()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0110()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0111()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0112()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0113()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0114()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0115()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0116()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0117()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0118()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0119()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0120()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0121()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0122()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0123()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0124()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0125()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0126()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0127()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0128()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0129()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0130()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0131()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0132()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0133()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0134()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0135()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0136()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0137()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0138()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0139()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0140()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0141()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0142()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0143()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0144()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0145()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0146()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0147()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0148()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0149()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0150()
|
|
|
|
|
{
|
|
|
|
|
// lightweight math to give this padding method some substance
|
|
|
|
|
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 150) & 0x7fffffff;
|
|
|
|
|
float t = (padAccumulator % 1000) * 0.001f;
|
|
|
|
|
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
|
|
|
|
|
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
|
|
|
|
|
padVector.z = 0f;
|
|
|
|
|
}
|
|
|
|
|
private void Pad0151()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0152()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0153()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0154()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0155()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0156()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0157()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0158()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0159()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0160()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0161()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0162()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0163()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0164()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0165()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0166()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0167()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0168()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0169()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0170()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0171()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0172()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0173()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0174()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0175()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0176()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0177()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0178()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0179()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0180()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0181()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0182()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0183()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0184()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0185()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0186()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0187()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0188()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0189()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0190()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0191()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0192()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0193()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0194()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0195()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0196()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0197()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0198()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0199()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0200()
|
|
|
|
|
{
|
|
|
|
|
// lightweight math to give this padding method some substance
|
|
|
|
|
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 200) & 0x7fffffff;
|
|
|
|
|
float t = (padAccumulator % 1000) * 0.001f;
|
|
|
|
|
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
|
|
|
|
|
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
|
|
|
|
|
padVector.z = 0f;
|
|
|
|
|
}
|
|
|
|
|
private void Pad0201()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0202()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0203()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0204()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0205()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0206()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0207()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0208()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0209()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0210()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0211()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0212()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0213()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0214()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0215()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0216()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0217()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0218()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0219()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0220()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0221()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0222()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0223()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0224()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0225()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0226()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0227()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0228()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0229()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0230()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0231()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0232()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0233()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0234()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0235()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0236()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0237()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0238()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0239()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0240()
|
|
|
|
|
{
|
🎮 GameObject Toolset Redesign and Streamlining (#518)
* feat: Redesign GameObject API for better LLM ergonomics
## New Tools
- find_gameobjects: Search GameObjects, returns paginated instance IDs only
- manage_components: Component lifecycle (add, remove, set_property)
## New Resources
- unity://scene/gameobject/{id}: Single GameObject data (no component serialization)
- unity://scene/gameobject/{id}/components: All components (paginated)
- unity://scene/gameobject/{id}/component/{name}: Single component by type
## Updated
- manage_scene get_hierarchy: Now includes componentTypes array
- manage_gameobject: Slimmed to lifecycle only (create, modify, delete)
- Legacy actions (find, get_components, etc.) log deprecation warnings
## Extracted Utilities
- ParamCoercion: Centralized int/bool/float/string coercion
- VectorParsing: Vector3/Vector2/Quaternion/Color parsing
- GameObjectLookup: Centralized GameObject search logic
## Test Coverage
- 76 new Unity EditMode tests for ManageGameObject actions
- 21 new pytest tests for Python tools/resources
- New NL/T CI suite for GameObject API (GO-0 to GO-5)
Addresses LLM confusion with parameter overload by splitting into
focused tools and read-only resources.
* feat: Add static gameobject_api helper resource for UI discoverability
Adds unity://scene/gameobject-api resource that:
- Shows in Cursor's resource list UI (no parameters needed)
- Documents the parameterized gameobject resources
- Explains the workflow: find_gameobjects → read resource
- Lists examples and related tools
* feat: Add GO tests to main NL/T CI workflow
- Adds GO pass (GO-0 to GO-5) after T pass in claude-nl-suite.yml
- Includes retry logic for incomplete GO tests
- Updates all regex patterns to recognize GO-* test IDs
- Updates DESIRED lists to include all 21 tests (NL-0..4, T-A..J, GO-0..5)
- Updates default_titles for GO tests in markdown summary
- Keeps separate claude-gameobject-suite.yml for standalone runs
* feat: Add GameObject API stress tests and NL/T suite updates
Stress Tests (12 new tests):
- BulkCreate small/medium batches
- FindGameObjects pagination with by_component search
- AddComponents to single object
- GetComponents with full serialization
- SetComponentProperties (complex Rigidbody)
- Deep hierarchy creation and path lookup
- GetHierarchy with large scenes
- Resource read performance tests
- RapidFire create-modify-delete cycles
NL/T Suite Updates:
- Added GO-0..GO-10 tests in nl-gameobject-suite.md
- Fixed tool naming: mcp__unity__ → mcp__UnityMCP__
Other:
- Fixed LongUnityScriptClaudeTest.cs compilation errors
- Added reports/, .claude/local/, scripts/local-test/ to .gitignore
All 254 EditMode tests pass (250 run, 4 explicit skips)
* fix: Address code review feedback
- ParamCoercion: Use CultureInfo.InvariantCulture for float parsing
- ManageComponents: Move Transform removal check before GetComponent
- ManageGameObjectFindTests: Use try-finally for LogAssert.ignoreFailingMessages
- VectorParsing: Document that quaternions are not auto-normalized
- gameobject.py: Prefix unused ctx parameter with underscore
* fix: Address additional code review feedback
- ManageComponents: Reuse GameObjectLookup.FindComponentType instead of duplicate
- ManageComponents: Log warnings when SetPropertiesOnComponent fails
- GameObjectLookup: Make FindComponentType public for reuse
- gameobject.py: Extract _normalize_response helper to reduce duplication
- gameobject.py: Add TODO comment for unused typed response classes
* fix: Address more code review feedback
NL/T Prompt Fixes:
- nl-gameobject-suite.md: Remove non-existent list_resources/read_resource from AllowedTools
- nl-gameobject-suite.md: Fix parameter names (component_type, properties)
- nl-unity-suite-nl.md: Remove unused manage_editor from AllowedTools
Test Fixes:
- GameObjectAPIStressTests: Add null check to ToJObject helper
- GameObjectAPIStressTests: Clarify AudioSource usage comment
- ManageGameObjectFindTests: Use built-in 'UI' layer instead of 'Water'
- LongUnityScriptClaudeTest: Clean up NL/T test artifacts (Counte42 typo, HasTarget)
* docs: Add documentation for API limitations and behaviors
- GameObjectLookup.SearchByPath: Document and warn that includeInactive
has no effect (Unity API limitation)
- ManageComponents.TrySetProperty: Document case-insensitive lookup behavior
* More test fixes and tighten parameters on python tools
* fix: Align test expectation with implementation error message case
* docs: update README tools and resources lists
- Add missing tools: manage_components, batch_execute, find_gameobjects, refresh_unity
- Add missing resources: gameobject_api, editor_state_v2
- Make descriptions more concise across all tools and resources
- Ensure documentation matches current MCP server functionality
* fix: Address code review feedback
- ParamCoercion: Use InvariantCulture for int/double parsing consistency
- ManageComponents: Remove redundant Undo.RecordObject (AddComponent handles undo)
- ManageScene: Replace deprecated FindObjectsOfType with FindObjectsByType
- GameObjectLookup: Add explanatory comment to empty catch block
- gameobject.py: Extract _validate_instance_id helper to reduce duplication
- Tests: Fix assertion for instanceID (Unity IDs can be negative)
* chore: Remove accidentally committed test artifacts
- Remove Materials folder (40 .mat files from interactive testing)
- Remove Shaders folder (5 noise shaders from testing)
- Remove test scripts (Bounce*, CylinderBounce* from testing)
- Remove Temp.meta and commit.sh
* test: Improve delete tests to verify actual deletion
- Delete_ByTag_DeletesMatchingObjects: Verify objects are actually destroyed
- Delete_ByLayer_DeletesMatchingObjects: Assert deletion using Unity null check
- Delete_MultipleObjectsSameName_DeletesCorrectly: Document first-match behavior
- Delete_Success_ReturnsDeletedCount: Verify count value if present
All tests now verify deletion occurred rather than just checking for a result.
* refactor: remove deprecated manage_gameobject actions
- Remove deprecated switch cases: find, get_components, get_component, add_component, remove_component, set_component_property
- Remove deprecated wrapper methods (423 lines deleted from ManageGameObject.cs)
- Delete ManageGameObjectFindTests.cs (tests deprecated 'find' action)
- Remove deprecated test methods from ManageGameObjectTests.cs
- Add GameObject resource URIs to README documentation
- Add batch_execute performance tips to README, tool description, and gameobject_api resource
- Enhance batch_execute description to emphasize 10-100x performance gains
Total: ~1200 lines removed. New API (find_gameobjects, manage_components, resources) is the recommended path forward.
* fix: Remove starlette stubs from conftest.py
Starlette is now a proper dependency via the mcp package, so we don't need
to stub it anymore. The real package handles all HTTP transport needs.
2026-01-07 02:13:45 +08:00
|
|
|
// Tail test A
|
|
|
|
|
// Tail test B
|
|
|
|
|
// Tail test C
|
|
|
|
|
// idempotency test marker
|
|
|
|
|
|
|
|
|
|
void TestHelper() { /* placeholder */ }
|
|
|
|
|
void IncrementCounter() { padAccumulator++; }
|
|
|
|
|
// end of test modifications
|
|
|
|
|
// path test marker A
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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-31 00:55:38 +08:00
|
|
|
}
|
|
|
|
|
private void Pad0241()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0242()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0243()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0244()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0245()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0246()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0247()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0248()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0249()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0250()
|
|
|
|
|
{
|
|
|
|
|
// lightweight math to give this padding method some substance
|
|
|
|
|
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 250) & 0x7fffffff;
|
|
|
|
|
float t = (padAccumulator % 1000) * 0.001f;
|
|
|
|
|
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
|
|
|
|
|
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
|
|
|
|
|
padVector.z = 0f;
|
|
|
|
|
}
|
|
|
|
|
private void Pad0251()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0252()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0253()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0254()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0255()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0256()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0257()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0258()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0259()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0260()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0261()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0262()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0263()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0264()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0265()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0266()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0267()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0268()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0269()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0270()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0271()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0272()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0273()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0274()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0275()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0276()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0277()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0278()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0279()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0280()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0281()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0282()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0283()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0284()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0285()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0286()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0287()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0288()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0289()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0290()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0291()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0292()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0293()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0294()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0295()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0296()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0297()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0298()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0299()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0300()
|
|
|
|
|
{
|
|
|
|
|
// lightweight math to give this padding method some substance
|
|
|
|
|
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 300) & 0x7fffffff;
|
|
|
|
|
float t = (padAccumulator % 1000) * 0.001f;
|
|
|
|
|
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
|
|
|
|
|
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
|
|
|
|
|
padVector.z = 0f;
|
|
|
|
|
}
|
|
|
|
|
private void Pad0301()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0302()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0303()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0304()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0305()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0306()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0307()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0308()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0309()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0310()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0311()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0312()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0313()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0314()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0315()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0316()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0317()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0318()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0319()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0320()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0321()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0322()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0323()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0324()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0325()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0326()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0327()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0328()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0329()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0330()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0331()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0332()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0333()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0334()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0335()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0336()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0337()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0338()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0339()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0340()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0341()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0342()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0343()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0344()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0345()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0346()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0347()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0348()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0349()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0350()
|
|
|
|
|
{
|
|
|
|
|
// lightweight math to give this padding method some substance
|
|
|
|
|
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 350) & 0x7fffffff;
|
|
|
|
|
float t = (padAccumulator % 1000) * 0.001f;
|
|
|
|
|
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
|
|
|
|
|
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
|
|
|
|
|
padVector.z = 0f;
|
|
|
|
|
}
|
|
|
|
|
private void Pad0351()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0352()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0353()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0354()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0355()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0356()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0357()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0358()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0359()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0360()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0361()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0362()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0363()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0364()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0365()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0366()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0367()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0368()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0369()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0370()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0371()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0372()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0373()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0374()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0375()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0376()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0377()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0378()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0379()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0380()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0381()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0382()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0383()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0384()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0385()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0386()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0387()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0388()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0389()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0390()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0391()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0392()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0393()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0394()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0395()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0396()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0397()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0398()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0399()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0400()
|
|
|
|
|
{
|
|
|
|
|
// lightweight math to give this padding method some substance
|
|
|
|
|
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 400) & 0x7fffffff;
|
|
|
|
|
float t = (padAccumulator % 1000) * 0.001f;
|
|
|
|
|
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
|
|
|
|
|
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
|
|
|
|
|
padVector.z = 0f;
|
|
|
|
|
}
|
|
|
|
|
private void Pad0401()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0402()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0403()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0404()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0405()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0406()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0407()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0408()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0409()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0410()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0411()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0412()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0413()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0414()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0415()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0416()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0417()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0418()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0419()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0420()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0421()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0422()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0423()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0424()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0425()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0426()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0427()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0428()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0429()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0430()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0431()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0432()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0433()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0434()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0435()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0436()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0437()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0438()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0439()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0440()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0441()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0442()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0443()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0444()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0445()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0446()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0447()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0448()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0449()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0450()
|
|
|
|
|
{
|
|
|
|
|
// lightweight math to give this padding method some substance
|
|
|
|
|
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 450) & 0x7fffffff;
|
|
|
|
|
float t = (padAccumulator % 1000) * 0.001f;
|
|
|
|
|
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
|
|
|
|
|
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
|
|
|
|
|
padVector.z = 0f;
|
|
|
|
|
}
|
|
|
|
|
private void Pad0451()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0452()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0453()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0454()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0455()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0456()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0457()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0458()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0459()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0460()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0461()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0462()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0463()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0464()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0465()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0466()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0467()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0468()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0469()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0470()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0471()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0472()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0473()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0474()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0475()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0476()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0477()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0478()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0479()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0480()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0481()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0482()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0483()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0484()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0485()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0486()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0487()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0488()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0489()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0490()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0491()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0492()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0493()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0494()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0495()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0496()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0497()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0498()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0499()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0500()
|
|
|
|
|
{
|
|
|
|
|
// lightweight math to give this padding method some substance
|
|
|
|
|
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 500) & 0x7fffffff;
|
|
|
|
|
float t = (padAccumulator % 1000) * 0.001f;
|
|
|
|
|
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
|
|
|
|
|
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
|
|
|
|
|
padVector.z = 0f;
|
|
|
|
|
}
|
|
|
|
|
private void Pad0501()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0502()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0503()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0504()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0505()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0506()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0507()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0508()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0509()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0510()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0511()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0512()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0513()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0514()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0515()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0516()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0517()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0518()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0519()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0520()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0521()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0522()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0523()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0524()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0525()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0526()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0527()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0528()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0529()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0530()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0531()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0532()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0533()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0534()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0535()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0536()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0537()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0538()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0539()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0540()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0541()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0542()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0543()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0544()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0545()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0546()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0547()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0548()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0549()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0550()
|
|
|
|
|
{
|
|
|
|
|
// lightweight math to give this padding method some substance
|
|
|
|
|
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 550) & 0x7fffffff;
|
|
|
|
|
float t = (padAccumulator % 1000) * 0.001f;
|
|
|
|
|
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
|
|
|
|
|
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
|
|
|
|
|
padVector.z = 0f;
|
|
|
|
|
}
|
|
|
|
|
private void Pad0551()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0552()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0553()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0554()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0555()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0556()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0557()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0558()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0559()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0560()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0561()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0562()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0563()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0564()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0565()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0566()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0567()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0568()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0569()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0570()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0571()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0572()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0573()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0574()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0575()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0576()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0577()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0578()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0579()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0580()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0581()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0582()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0583()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0584()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0585()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0586()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0587()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0588()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0589()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0590()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0591()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0592()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0593()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0594()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0595()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0596()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0597()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0598()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0599()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0600()
|
|
|
|
|
{
|
|
|
|
|
// lightweight math to give this padding method some substance
|
|
|
|
|
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 600) & 0x7fffffff;
|
|
|
|
|
float t = (padAccumulator % 1000) * 0.001f;
|
|
|
|
|
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
|
|
|
|
|
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
|
|
|
|
|
padVector.z = 0f;
|
|
|
|
|
}
|
|
|
|
|
private void Pad0601()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0602()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0603()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0604()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0605()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0606()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0607()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0608()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0609()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0610()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0611()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0612()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0613()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0614()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0615()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0616()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0617()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0618()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0619()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0620()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0621()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0622()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0623()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0624()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0625()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0626()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0627()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0628()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0629()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0630()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0631()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0632()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0633()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0634()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0635()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0636()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0637()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0638()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0639()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0640()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0641()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0642()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0643()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0644()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0645()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0646()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0647()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0648()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0649()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
private void Pad0650()
|
|
|
|
|
{
|
|
|
|
|
// lightweight math to give this padding method some substance
|
|
|
|
|
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 650) & 0x7fffffff;
|
|
|
|
|
float t = (padAccumulator % 1000) * 0.001f;
|
|
|
|
|
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
|
|
|
|
|
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
|
|
|
|
|
padVector.z = 0f;
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
}
|