chore: bump version to 10.0.0#1224
Merged
Merged
Conversation
…529986410 chore: sync main (v9.7.3) into beta
Spec for the brand-standardization / README+distribution / unified-analytics program, informed by a 4-agent inventory+research pass. Decomposes into 3 focused upstream PRs. Awaiting review before implementation. Claude-Session: https://claude.ai/code/session_01XFiuAUxNS9riUJFFBEHvui
…lve brand) - Web analytics: GoatCounter (free, GH Pages, exportable) + Cloudflare fallback - Brand: evolve indigo + Satoshi, refine mark - Editor casing: apply, user reviews diff - manifest.json name: keep 'Unity MCP' - Packaging: single phased PR (P1 brand -> P2 README -> P3 analytics) Claude-Session: https://claude.ai/code/session_01XFiuAUxNS9riUJFFBEHvui
User-designed split-cube mark (two iso cube-halves + 3-rung bridge). Ocean palette: blue cube #60A5FA / teal cube #2DD4BF / cyan bridge #22D3EE. Colored mark is theme-independent (renders on light + dark). Claude-Session: https://claude.ai/code/session_01XFiuAUxNS9riUJFFBEHvui
- sharp generator (npm run gen:brand) for favicon.png(48), favicon-32, apple-touch(180), android-chrome(192/512), package-icon(128) - fixes the broken 1024x576 favicon.png - hero banner (logo.png) + og social-card + github-social-preview rendered with the Ocean mark, wordmark, tagline - sync docs/images/logo.png hero Claude-Session: https://claude.ai/code/session_01XFiuAUxNS9riUJFFBEHvui
…for Unity'
Single ProductInfo.{ProductName,MenuRoot} const; routes all user-facing
'MCP For Unity' (capital F) display strings to it. Internal identifiers,
namespaces, and manifest.json 'Unity MCP' unchanged.
Claude-Session: https://claude.ai/code/session_01XFiuAUxNS9riUJFFBEHvui
README capabilities/clients/versions/architecture/positioning + badges; PyPI project.urls; Server/README docs link + badges; zh re-sync; docs/MAINTAINER_ACTIONS.md. Sponsor/citation content preserved. Claude-Session: https://claude.ai/code/session_01XFiuAUxNS9riUJFFBEHvui
…docs Brand: favicon/social-card/theme-color/icon headTags; navbar uses colored logo-mark.svg for both light & dark. Analytics: pypistats+goatcounter fetch (TDD, 3 tests), env-gated cookieless GoatCounter, /stats page, daily stats workflow, external-analytics doc. Claude-Session: https://claude.ai/code/session_01XFiuAUxNS9riUJFFBEHvui
- standardize 5 stray 'MCP For Unity' doc-comments -> 'MCP for Unity' - external-analytics: link in-product telemetry doc instead of plain ref - fetch-stats: anchor output path to import.meta.url (run-from-anywhere) - zh README: add Docs badge for EN/zh badge-row parity Claude-Session: https://claude.ai/code/session_01XFiuAUxNS9riUJFFBEHvui
Per request, stop publishing adoption numbers to outsiders: - remove the public /stats page + public data.json + navbar link - workflow now posts a unified PyPI+traffic table to $GITHUB_STEP_SUMMARY (visible only to repo collaborators); drops to contents: read, no commits - fetch-stats emits Markdown (renderSummary, +2 tests) instead of a public JSON - public side keeps only the README downloads badge (PyPI counts are public anyway) Claude-Session: https://claude.ai/code/session_01XFiuAUxNS9riUJFFBEHvui
…led proxy Adds GitHub real-account signals to the private maintainer summary and reorders it honest-first: - In-product DAU/WAU flagged as the true active-user metric (pending Coplay read API) - Unique repo cloners/viewers (14d) via GitHub traffic API (needs STATS_GITHUB_TOKEN PAT with Administration: read; default token 401s) - GitHub stars/forks (public, real accounts) - PyPI downloads kept but explicitly labeled inflated install events, not users All fetches graceful on failure; 6 unit tests; build green. Claude-Session: https://claude.ai/code/session_01XFiuAUxNS9riUJFFBEHvui
Drop the old logo's forced 676x380 (1.78:1) sizing that squished the new 2560x880 (2.9:1) hero banner; set width=820, let height auto-compute. Claude-Session: https://claude.ai/code/session_01XFiuAUxNS9riUJFFBEHvui
Swap the wide hero banner for a compact mark + wordmark lockup, served via <picture> so the wordmark flips light/dark with the GitHub theme (the colored Ocean mark is theme-independent). Applies to EN + zh READMEs. Removes the now-orphaned docs/images/logo.png banner copy (the docs site keeps its own). Claude-Session: https://claude.ai/code/session_01XFiuAUxNS9riUJFFBEHvui
- docs-deploy.yml: map GOATCOUNTER_CODE into the Build env so the cookieless beacon actually activates when the maintainer sets the variable (was a producer-without-consumer gap that silently disabled docs traffic) - MAINTAINER_ACTIONS.md: rewrite the stats section to match the shipped private design (drop the stale 'grant Actions write + commit data.json' over-priv item, add the required STATS_GITHUB_TOKEN PAT, fix the social-preview note) - docusaurus.config.js: wire favicon-32.png (was an orphaned generated asset) - lowercase 3 stray 'MCP For Unity' refs in roslyn.md / migrations/v6.md - remove internal docs/superpowers/ spec+plan scratch from the PR (contradicted the shipped Ocean/private design); gitignore superpowers artifacts Whole-branch review: 6/6 Critical/Important confirmed, 0 refuted, all docs/config hygiene — build/tests/security/correctness all clean. These are the fixes. Claude-Session: https://claude.ai/code/session_01XFiuAUxNS9riUJFFBEHvui
Maintainer manages these org-gated actions directly. The analytics provisioning steps (GoatCounter, STATS_GITHUB_TOKEN PAT) remain documented in website/docs/architecture/external-analytics.md. Claude-Session: https://claude.ai/code/session_01XFiuAUxNS9riUJFFBEHvui
…dges Center the <picture> logo header (EN + zh) via <p align=center>, and remove the Website/Visit and PyPI-version badges from the badge row (kept Downloads, Release, CI, OpenUPM, Stars, Docs, Discord, Unity, Python, MCP, MIT). Claude-Session: https://claude.ai/code/session_01XFiuAUxNS9riUJFFBEHvui
…drop How-it-compares - center the full hero (language switcher + sponsor + badges + tagline + gif) via <div align=center>, matching the centered logo (EN + zh) - replace the repetitive all-stdio clients table with a clean inline client list - replace the plain mermaid 'How it works' with a one-line flow + architecture link - remove 'How it compares' (the hand-rolled-scripting comparison added nothing; the Aura framing already lives in the 'Unity AI Tools by Aura' section) Claude-Session: https://claude.ai/code/session_01XFiuAUxNS9riUJFFBEHvui
…brief What-it-does, trim quickstart - replace the badge banner row with a clean Discord / Wiki link pair after the logo - move Recent Updates to the top (before What it does) - make What it does brief; move the full tool catalog to a Wiki (docs) hyperlink - delete the How it works section - drop the Asset Store alternative-install reference from the quickstart Claude-Session: https://claude.ai/code/session_01XFiuAUxNS9riUJFFBEHvui
…s, bigger Recent Updates - favicon now rasterized from the full logo-mark.svg (was the simplified favicon-safe mini, which dropped the inner edges, 3rd rung, and node dots); remove the now-unused logo-mark-mini.svg - add docs/images/connector.svg (blue node — cyan bridge — teal node, echoing the split-cube 'two things connected') and use it between English/中文 and Discord/Wiki - bump the Recent Updates summary to an <h3> (one size up) Claude-Session: https://claude.ai/code/session_01XFiuAUxNS9riUJFFBEHvui
…combine clients+quickstart - revert Recent Updates summary <h3> -> <strong> (the <h3> made GitHub render a heading-anchor chain icon, and tools/sync_release_notes.py regenerates it as <strong> anyway, so the heading was both buggy and non-durable) - put English/中文 and Discord/Wiki on a single line under the logo at the same size - merge 'Supported clients & versions' + '60-second quickstart' into one ## Quickstart
…hinese Mirror the EN restructure on the zh README — one-line English↔中文 | Discord↔Wiki nav with the brand connector, Recent Updates moved to the top, brief 它能做什么 with the tool catalog behind a link, combined ## 快速开始, dropped badges/工作原理/Asset Store/ the giant inline tool list. Kept the zh-only detail sections (手动配置, 多实例, Roslyn, 故障排除, 贡献, 遥测) and rewrote the authored copy to read like native dev Chinese, not machine translation.
README-zh.md edits + .meta/uv.lock churn on brand-distribution-analytics, committed (not stashed) so the feature branch can be checked out in the main worktree for editor testing. Untracked .agents/ and AGENTS.md intentionally left out. Claude-Session: https://claude.ai/code/session_01Tjpb5gYgUe2AUJuRdXr7Lv
… 2D image) Providers: Tripo/Meshy/Hunyuan (3D gen), Sketchfab (3D import), fal.ai/OpenRouter (2D image). Hybrid arch: GUI configures keys, MCP tools trigger, C# executes the provider call and imports. OS-secure-store key handling; keys never cross the bridge. Claude-Session: https://claude.ai/code/session_01Tjpb5gYgUe2AUJuRdXr7Lv
…8 integration) Partial — phases 0,2-7 to be authored just-in-time during incremental execution (plan-authoring workflow rate-limited on those phases). Phase 1 is fully detailed and serves as the task-granularity template. Claude-Session: https://claude.ai/code/session_01Tjpb5gYgUe2AUJuRdXr7Lv
…ase 0) - Register 'asset_gen' tool group (off by default, parity with vfx/animation) - EditorPrefKeys.AssetGen.* consts (non-secret config only; keys go to secure store) - AssetGenPrefs helper (provider/format/output-root/normalize/enabled) + EditMode tests - Python scaffold test asserts group present and disabled by default Claude-Session: https://claude.ai/code/session_01Tjpb5gYgUe2AUJuRdXr7Lv
…/import_model/generate_image) Thin key-free pass-throughs in group asset_gen mirroring the C# command names: camelCase param mapping, None-strip, async status/job_id (manage_packages shape). CLI group 'asset-gen' registered in cli/main.py. No key/secret param exists on any tool; tests assert sent payloads carry no key/secret/token. 34 tests pass. Claude-Session: https://claude.ai/code/session_01Tjpb5gYgUe2AUJuRdXr7Lv
… (Phase 1) OS secure store per platform: macOS Keychain (/usr/bin/security), Windows Credential Manager (advapi32 P/Invoke), Linux secret-tool; AES-256-CBC+HMAC encrypt-then-MAC fallback (CI-safe, master secret + machine id via PBKDF2, ciphertext under user app-data, never in repo). Env override (MCPFORUNITY_<P>_API_KEY, read-only) layered on top; SecretRedactor scrubs auth tokens. Keys never touch EditorPrefs/bridge/logs/git. EditMode tests for fallback round-trip, encryption-at-rest, env override, redaction. Compiles clean on Unity 2021.3.45f2 (floor). Claude-Session: https://claude.ai/code/session_01Tjpb5gYgUe2AUJuRdXr7Lv
… deadlock ImportModel.HandleCommand was synchronous and blocked on .GetAwaiter().GetResult() for the Sketchfab search/preview UnityWebRequest calls. UnityWebRequest completes on the editor loop, which a blocked main thread cannot pump — freezing the editor. Make HandleCommand (and Search/Preview) async Task<object> (CommandRegistry detects the Task return type) and add a HandleCommand_IsAsync regression guard. Surfaced via live in-editor testing. Claude-Session: https://claude.ai/code/session_01Tjpb5gYgUe2AUJuRdXr7Lv
Design + step-by-step plan for a DCC-agnostic import_model_file tool and a blender-to-unity handoff skill (FBX-default, filesystem-seam handoff). Claude-Session: https://claude.ai/code/session_01NoHk4f7N1vUFs7gu817ihm
Adds ImportModelFile tool (import_model_file command) that copies an
on-disk model file (FBX/OBJ/GLB/glTF/zip) under Assets/ and runs it
through the shared ModelImportPipeline. Returns {asset_path, asset_guid}.
Adds ImportModelFileHandlerTests covering missing-source, unsupported
extension, and a real OBJ import.
Claude-Session: https://claude.ai/code/session_01NoHk4f7N1vUFs7gu817ihm
…ll tool-name fix Claude-Session: https://claude.ai/code/session_01NoHk4f7N1vUFs7gu817ihm
…zation + scale note Blender FBX imports ~100x oversized; import_model_file target_size only acts when Auto-normalize is on and is unreliable for Blender FBX (target_size=2 measured 200m in a live test). Step 4 now measures the placed model's world bounds and sets localScale to hit the target size deterministically. Adds a Scale note + checklist item. Claude-Session: https://claude.ai/code/session_01NoHk4f7N1vUFs7gu817ihm
…ge_path
Security review + code review of the asset-gen feature surfaced concrete issues;
this fixes them and adds regression tests (request-shaping layer, FakeHttpTransport).
Security
- SafeZipExtractor enforces an extension allowlist; ModelImportPipeline passes an
inert model/texture allowlist so a provider archive can't drop a .cs/.dll under
Assets/ and have the Editor compile/load it (code execution on import).
- AssetGenJobManager refuses non-http(s) download URLs before fetching
(file:// SSRF / local-file read into the project).
Provider correctness
- Meshy image->3D polls /openapi/v1/image-to-3d/{id} (was the v2 text URL).
- Meshy text->3D honors texture=true via the preview->refine two-phase flow.
- OpenRouter image->image attaches the reference image (content image_url part).
- fal image->image uses the /edit endpoint + image_urls array; width/height
forwarded as image_size.
- Sketchfab search forwards categories/count/cursor/downloadable; preview doc
corrected (returns metadata, not a base64 thumbnail).
- Job import calls AssetDatabase.Refresh() before importing a freshly written file.
Local image input (image_path)
- New LocalImage helper; image_path is read and sent inline as a base64 data URI
for Meshy / fal / OpenRouter. Tripo rejects local images with a clear error
(needs a hosted image_url; its upload flow is not wired).
Cleanup (no behavior change)
- Shared AssetGenPaths + ProviderHttp helpers, HttpResult.Ok, MissingKeyMessage,
cached glTFast probe, dead-field / per-frame-alloc removal, CLI _emit.
Docs: README + manual-verification updated (image_path support; transparency is
import-flag-only; width/height fal-only).
Verified: package compiles clean; Python 1306 passed / 3 skipped. Meshy refine,
fal /edit, and image_path data-URI paths are unit-tested at the request layer
only -- live smoke per provider (real keys) still pending.
Claude-Session: https://claude.ai/code/session_015DAUrMR5UaSEzEn2wNPrEP
Informational row (not a keyed provider) with a best-effort "Blender app detected" status and a pointer to the blender-to-unity workflow / import_model_file. BlenderMCP runs in the AI client and isn't detectable from Unity, so this reports only the locally installed Blender app. - BlenderDetection helper: checks well-known install paths + PATH per platform; the pure DetectIn(candidates, exists) core is unit-tested with a fake predicate. - McpAssetGenSection: AddBlenderHandoffRow() appended after the provider rows. - README: note the tab's best-effort detection + that BlenderMCP lives in the AI client. Verified: package compiles clean; EditMode 972/1018 pass, 0 failures (4 new BlenderDetection tests) via tools/local_harness.py. Claude-Session: https://claude.ai/code/session_015DAUrMR5UaSEzEn2wNPrEP
Follow-up to 2efb786, from a focused AI review of the image_path work: - Validate image input synchronously in the handlers: reject unsupported extensions (LocalImage.ResolveExisting) and Tripo local-image up front, so bad input fails immediately instead of returning a fake "pending" that only faults on the next poll. - Meshy: the "no task id" submit/refine error again includes the response body (the PostTask refactor had dropped it). - Sketchfab archive allowlist: add .dds/.ktx (real GPU texture formats) so glTF textures in those formats aren't silently skipped on extract. - fal: don't send image_size to the /edit (image->image) endpoint, which derives size from the source image; build the request_id fallback poll URL from the base model id rather than the /edit sub-path. - Meshy two-phase preview+refine now runs under a 600s job timeout (was 300s) so a default textured text->3D has room for both tasks. Deferred (perf-only, noted on the PR): the blanket AssetDatabase.Refresh double-import and the synchronous main-thread base64 of large local images. Verified: package compiles clean; EditMode 977/1023 pass, 0 failures via tools/local_harness.py. Claude-Session: https://claude.ai/code/session_015DAUrMR5UaSEzEn2wNPrEP
feat(asset-gen): AI Asset Generation — 3D gen/import + 2D image (BYO-key)
…66223744 chore: update Unity package to beta version 9.7.4-beta.2
…bution-analytics # Conflicts: # README.md
…analytics Revamp brand, docs, distribution, and analytics
…70877387 chore: update Unity package to beta version 9.7.4-beta.3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Automated version bump to 10.0.0.