[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81769":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":12,"contributorsCount":12,"subscribersCount":12,"size":12,"stars1d":12,"stars7d":12,"stars30d":12,"stars90d":12,"forks30d":12,"starsTrendScore":12,"compositeScore":12,"rankGlobal":9,"rankLanguage":9,"license":14,"archived":15,"fork":15,"defaultBranch":16,"hasWiki":17,"hasPages":15,"topics":18,"createdAt":9,"pushedAt":9,"updatedAt":24,"readmeContent":25,"aiSummary":26,"trendingCount":12,"starSnapshotCount":12,"syncStatus":27,"lastSyncTime":28,"discoverSource":29},81769,"unity-scanner","youngwoocho02\u002Funity-scanner","youngwoocho02","Token-saving Unity asset scanner for AI agent workflows",null,"Go",23,0,1,"MIT License",false,"master",true,[19,20,21,22,23],"ai-tools","cli","llm","unity","unity3d","2026-06-12 02:04:19","# unity-scanner\n\n[Korean](README.ko.md) | [Japanese](README.ja.md)\n\n## Core Examples\n\n- Remove path and extension noise: `Assets\u002FExamples\u002FCharacters\u002FEnemy_01.prefab` -> `Characters [prefab] Enemy_01`\n- Omit `.meta` files: `Hero.prefab + Hero.prefab.meta` -> `Hero`\n- Fold numbered names: `Enemy_01, Enemy_02, Enemy_03` -> `Enemy_01..03`\n- Turn YAML objects into hierarchy: `GameObject + Transform + MeshRenderer` -> `TREE [0] HeroRoot c1`\n- Code repeated component sets: `Transform, MeshFilter, MeshRenderer` x 40 -> `CMP c2 ...` + `... c2`\n- Group repeated render objects: `SampleMesh_01 ... SampleMesh_08` -> `[2..9] SampleMesh_01..08 c2 (8)`\n- Extract only needed fields: `MeshRenderer {40 fields}` -> `m_CastShadows, m_ReceiveShadows, more fields: 35 hidden`\n- Resolve GUIDs to paths: `{guid: 222...}` -> `Assets\u002FExamples\u002FData\u002FSampleReference.asset`\n- Structure match reasons: `SamplePanel.prefab:12 m_Name: SamplePanel` -> `[prefab] UI \u002F SamplePanel \u002F object: SamplePanel`\n- Summarize GUID refs: `guid: 333...` x 30 -> `[asset] . :: SampleConfig`\n- Show omitted counts: `hidden rows` -> `more: 41 hidden by depth\u002Flimit`\n- Parallelize broad search: `name search 1500ms` -> `600ms`\n\n## Why\n\n1. Reduce token cost. Like RTK, reduce CLI output before it reaches the model by compressing repeated Unity paths, extensions, `.meta` files, GUIDs, and YAML fields.\n\n2. Turn raw Unity YAML dumps into structured output. Instead of forcing the model to chase `GameObject`, `Transform`, components, fileIDs, and GUIDs separately, it shows hierarchy, component sets, and references together.\n\n## Design\n\n- CLI reads current files only: no cache, no required editor state.\n- Unity-aware compression: hierarchy, component groups, GUIDs, path groups.\n- Compact by default: repeated data is declared once, omitted counts are shown.\n- Parallel where useful: broad scans split work by file.\n- Simple pipeline first: no extra wrappers, fallback layers, or features unless they reduce output or clarify Unity structure.\n\nToken counts in examples below are approximate. They use `chars \u002F 4` because exact tokens depend on the model tokenizer.\n\n## Install\n\n### macOS \u002F Linux\n\n```bash\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fyoungwoocho02\u002Funity-scanner\u002Fmaster\u002Finstall.sh | sh\n```\n\n### Windows PowerShell\n\n```powershell\nirm https:\u002F\u002Fraw.githubusercontent.com\u002Fyoungwoocho02\u002Funity-scanner\u002Fmaster\u002Finstall.ps1 | iex\n```\n\nThe installer downloads the latest release binary and adds the install directory to `PATH`. After installing, run commands as `unity-scanner ...`.\n\n### Update\n\n```bash\nunity-scanner update\nunity-scanner update --check\n```\n\nUpdate checks run only when `unity-scanner update` or `unity-scanner update --check` is called.\n\n## Commands\n\n```bash\nunity-scanner list   -p \u003Cproject> [path]\nunity-scanner read   -p \u003Cproject> \u003Casset>\nunity-scanner search -p \u003Cproject> [path] [filters]\nunity-scanner refs   -p \u003Cproject> \u003Casset-or-guid> [scan-path]\nunity-scanner update [--check]\nunity-scanner help [command]\nunity-scanner version\n```\n\nRoot options:\n\n```text\n-h, --help             Show help\n-v, --version          Print version\n```\n\nProject command option:\n\n```text\n-p, --project \u003Cpath>   Unity project path\n--line-width \u003Cn>       Max output line width, default 1200, 0 disables truncation\n--profile              Print command timing profile\n--workers \u003Cn>          Parallel worker count, default CPU count\n```\n\nCommand aliases: `ls` = `list`, `cat` = `read`, `find` = `search`.\n\n## list\n\nCompressed `ls` for Unity assets.\n\nWithout this tool:\n\n```bash\nfind Assets\u002FExamples -type f\n```\n\n```text\nAssets\u002FExamples\u002FCharacters\u002FHero.prefab\nAssets\u002FExamples\u002FCharacters\u002FHero.prefab.meta\nAssets\u002FExamples\u002FCharacters\u002FEnemy_01.prefab\nAssets\u002FExamples\u002FCharacters\u002FEnemy_01.prefab.meta\nAssets\u002FExamples\u002FData\u002FHeroConfig.asset\nAssets\u002FExamples\u002FScenes\u002FDemo.unity\nAssets\u002FExamples\u002FScripts\u002FInventoryService.cs\nAssets\u002FExamples\u002FUI\u002FInventoryPanel.prefab\n...\n```\n\nWith `unity-scanner`:\n\n```bash\nunity-scanner list -p \u002Fprojects\u002FSampleProject Assets\u002FExamples --depth 2 --limit 8\n```\n\n```text\nEXT\n  asset      .asset\n  cs         .cs\n  mat        .mat\n  prefab     .prefab\n  scene      .unity\n\nDIRS\n  Characters\u002F mat 2, prefab 5\n  Data\u002F       asset 4\n  Scenes\u002F     scene 2\n  Scripts\u002F    cs 3\n  UI\u002F         prefab 5\n\nGROUPS\n  Characters  [mat]\n    HeroBody, HeroFace\n  Characters  [prefab]\n    Enemy_01..03, Hero, Villager\n  Data  [asset]\n    BalanceConfig, EnemyConfig, HeroConfig, ItemCatalog\n  Scenes  [scene]\n    Demo, Menu\n  Scripts  [cs]\n    CharacterController, InventoryService, UIHudController\n  UI  [prefab]\n    InventoryPanel, Tooltip, UI_Button_01..03\n```\n\nDifference:\n\n```text\nplain file list:      about 180 lines, 8400 chars, about 2100 tokens\nunity-scanner list:   about  28 lines,  900 chars, about  225 tokens\nreduction:            about 89% fewer chars\n```\n\nThe command already contains the project and root path, so the output does not repeat them. Long `Assets\u002F...` prefixes become groups, `.meta` files are omitted unless requested, and extensions are declared once in `EXT`.\n\n## read\n\nModel-context summary for Unity YAML assets: `.prefab`, `.unity`, `.asset`.\n\nWithout this tool:\n\n```bash\ncat Assets\u002FExamples\u002FPrefabs\u002FSamplePrefab.prefab\n```\n\n```text\n--- !u!1 &100001\nGameObject:\n  m_Name: SampleRoot\n  m_Component:\n  - component: {fileID: 400001}\n  - component: {fileID: 230001}\n--- !u!4 &400001\nTransform:\n  m_GameObject: {fileID: 100001}\n  m_Father: {fileID: 0}\n--- !u!23 &230001\nMeshRenderer:\n  m_GameObject: {fileID: 100001}\n  m_CastShadows: 1\n...\n```\n\nWith `unity-scanner`:\n\n```bash\nunity-scanner read -p \u002Fprojects\u002FSampleProject Assets\u002FExamples\u002FPrefabs\u002FSamplePrefab.prefab --depth 2 --limit 30\n```\n\n```text\nASSET       prefab\nPATH        Assets\u002FExamples\u002FPrefabs\u002FSamplePrefab.prefab\nGUID        0123456789abcdef0123456789abcdef\nOBJECTS     64\nCOMPONENTS  138\nDEPTH       2\n\nCMP\n  c1 Transform\n  c2 Transform, MeshFilter, MeshRenderer\n\nTREE\n[0] SampleRoot  c1\n[1] SampleMeshRoot  c1\n  [2..9] SampleMesh, SampleMesh_01..07  c2  (8)\n[10] SampleLogicRoot  c1\n[11] SampleChild  c1\n\nmore: 41 hidden by depth\u002Flimit\ncollapsed render-only: 18\nhint: use --depth N, --path NAME, --component NAME, or --full-tree\n```\n\nUse `--full-tree` when you need every visible render-only row.\n\nDifference:\n\n```text\nraw Unity YAML:       about 6000 lines, 200000 chars, about 50000 tokens\nunity-scanner read:   about   30 lines,    900 chars, about   225 tokens\nreduction:            about 99% fewer chars\n```\n\nRaw object blocks become a GameObject tree. Repeated component sets are declared in `CMP`. Render-only leaf repetition is folded, and hidden rows are counted.\n\n### Component Drilldown\n\n```bash\nunity-scanner read -p \u002Fprojects\u002FSampleProject Assets\u002FExamples\u002FPrefabs\u002FSamplePrefab.prefab --component MeshRenderer --path SampleMeshRoot --field-limit 3 --limit 3\n```\n\nOutput shape:\n\n```text\nASSET       prefab\nPATH        Assets\u002FExamples\u002FPrefabs\u002FSamplePrefab.prefab\nGUID        0123456789abcdef0123456789abcdef\nOBJECTS     64\nCOMPONENTS  138\n\nCOMPONENT  MeshRenderer\nOBJECT     SampleRoot\u002FSampleMeshRoot\u002FSampleMesh\nfields:\n  m_CastShadows            1\n  m_ReceiveShadows         1\n  m_DynamicOccludee        1\nmore fields: 35 hidden by --field-limit\n\nmore components: 5 hidden by --limit\n```\n\n### ScriptableObject Asset\n\n```bash\nunity-scanner read -p \u002Fprojects\u002FSampleProject Assets\u002FExamples\u002FData\u002FSampleConfig.asset --field-limit 4\n```\n\n```text\nASSET       asset\nPATH        Assets\u002FExamples\u002FData\u002FSampleConfig.asset\nGUID        11111111111111111111111111111111\nYAML_OBJECTS 1\n\n[0] SampleConfig  name: SampleConfig\n    script: Assets\u002FExamples\u002FScripts\u002FSampleConfig.cs\n    startingLevel            1\n    reference                {fileID: 11400000, guid: 22222222222222222222222222222222, type: 2} -> Assets\u002FExamples\u002FData\u002FSampleReference.asset\n```\n\n## search\n\nStructured search for file names, GameObjects, components, and GUID references.\n\nWithout this tool:\n\n```bash\ngrep -R -n -E \"Sample|guid:\" Assets\u002FExamples\u002FPrefabs\n```\n\n```text\nAssets\u002FExamples\u002FPrefabs\u002FCommon\u002FSamplePrefab.prefab:12:  m_Name: SampleRoot\nAssets\u002FExamples\u002FPrefabs\u002FCommon\u002FSamplePrefab.prefab:80:  m_Script: {fileID: 11500000, guid: 33333333333333333333333333333333, type: 3}\nAssets\u002FExamples\u002FPrefabs\u002FCommon\u002FSampleVariant.prefab:12:  m_Name: SampleRoot\nAssets\u002FExamples\u002FPrefabs\u002FUI\u002FSamplePanel.prefab:12:  m_Name: SamplePanel\n...\n```\n\nWith `unity-scanner`:\n\n```bash\nunity-scanner search -p \u002Fprojects\u002FSampleProject Assets\u002FExamples\u002FPrefabs --name Sample --type prefab --limit 5\n```\n\n```text\nEXT\n  prefab     .prefab\n\nMATCHES  3\n\n[prefab] Common\n  SamplePrefab\n    file-name\n  SampleVariant\n    file-name\n[prefab] UI\n  SamplePanel\n    file-name\n```\n\nDifference:\n\n```text\nplain grep\u002Ffind:        about 40 lines, 2600 chars, about 650 tokens\nunity-scanner search:   about 11 lines, 320 chars,  about 80 tokens\nreduction:              about 80% fewer chars\n```\n\nPath and extension repetition are grouped. Name-only file hits stop at `file-name` instead of expanding YAML internals. Matches say whether the hit came from file name, GameObject, component, or GUID reference.\n\nBroad searches use file-level parallelism when it helps. Example timing shape from a large Unity project:\n\n```text\nname search:      about 1500ms -> 600ms\nguid search:      about 1600ms -> 1000ms\ncomponent search: about 2000ms -> 1100ms\n```\n\n## refs\n\nFind where an asset or raw GUID is referenced.\n\nWithout this tool:\n\n```bash\ngrep -R -n \"33333333333333333333333333333333\" Assets\u002FExamples\u002FData\n```\n\n```text\nAssets\u002FExamples\u002FData\u002FSampleConfig.asset:18:  m_Script: {fileID: 11500000, guid: 33333333333333333333333333333333, type: 3}\nAssets\u002FExamples\u002FData\u002FSamplePreset.asset:44:  source: {fileID: 11400000, guid: 33333333333333333333333333333333, type: 2}\n...\n```\n\nWith `unity-scanner`:\n\n```bash\nunity-scanner refs -p \u002Fprojects\u002FSampleProject Assets\u002FExamples\u002FScripts\u002FSampleConfig.cs Assets\u002FExamples\u002FData --limit 5\n```\n\n```text\nREF     Assets\u002FExamples\u002FScripts\u002FSampleConfig.cs\nGUID    33333333333333333333333333333333\n\nEXT\n  asset      .asset\n\nMATCHES  1\n\n[asset]\n  . :: SampleConfig\n```\n\n`refs` accepts either an asset path or a raw 32-character GUID.\n\nDifference:\n\n```text\nplain GUID grep:     about 30 lines, 2400 chars, about 600 tokens\nunity-scanner refs:  about 10 lines, 260 chars,  about 65 tokens\nreduction:           about 89% fewer chars\n```\n\nThe target asset path is resolved once. Results are grouped by asset type and folder instead of repeating raw YAML reference lines.\n\n## Options\n\n### list\n\n```text\n--depth \u003Cn>       directory summary depth, default unlimited\n--kind \u003Clist>     comma-separated kinds: prefab,scene,asset,cs,mat\n--meta            include .meta files in body\n--flat            omit directory summary\n--limit \u003Cn>       max groups, default unlimited\n```\n\n### read\n\n```text\n--depth \u003Cn>          hierarchy depth, default unlimited\n--path \u003Cname\u002Fpath>   only show matching object branch\n--component \u003Cname>   show fields for matching component; prefab local misses search source prefabs\n--id \u003CfileID>        focus a local YAML object\u002Fcomponent by fileID\n--field-limit \u003Cn>    max fields per component, default unlimited\n--limit \u003Cn>          max GameObjects\u002Fcomponent matches, default unlimited\n--full-tree          show every visible tree row without render-only folding\n--override \u003Ctext>    only show prefab overrides matching text\n--override-limit \u003Cn> max prefab overrides shown, default 40, 0 unlimited\n--raw-overrides      show raw prefab override target references\n--ref-format \u003Cmode>  field reference format: name, path, or raw, default name\n--no-resolve         skip script, GUID, and source prefab path resolution\n```\n\nWhen `read` reports `PREFAB_SOURCES`, the tree view is local serialized YAML. `read --component` searches source prefabs on local misses and prints `SOURCE_MATCHES`. Source matches are marked `INHERITED`, and matching variant property overrides are printed separately as `variant overrides`. Use Unity `LoadPrefabContents` only when the fully editor-resolved prefab state matters.\n\n### search\n\n```text\n--name \u003Ctext>        match file or GameObject name\n--component \u003Ctext>   match component\u002Fscript name\n--script-path \u003Cpath> match MonoBehaviour scripts under asset path\n--source \u003Ctext>      match prefab source path\u002Fname\n--guid \u003Cguid>        match raw Unity GUID reference\n--ref \u003Cguid>         alias of --guid\n--type \u003Clist>        prefab,scene,asset,cs,mat\n--compact            one-line grouped result\n--warnings \u003Cmode>    summary or detail, default summary\n--limit \u003Cn>          max result files, default unlimited\n--object-limit \u003Cn>   max objects shown per result file, default 12\n```\n\n### refs\n\n```text\n--type \u003Clist>        prefab,scene,asset,mat,controller\n--detail             print detailed matches instead of compact groups\n--warnings \u003Cmode>    summary or detail, default summary\n--limit \u003Cn>          max result files, default unlimited\n```\n\n### update\n\n```text\n--check              check for updates without installing\n```\n\n## Design Choices\n\n### No Cache\n\nCache would make repeated scans faster, but it adds invalidation rules and stale-result risk. This tool stays simple: command in, current files read, compact result out.\n\n### No Required Editor Connection\n\nUnity Editor can provide richer type data, but then the tool depends on an open project, a connector, and editor state. `unity-scanner` stays offline by default and reads project files directly.\n\n### Compact Before Complete\n\nFor agent workflows, the first answer should usually be a map, not a dump. Use `list` or `search` to find the likely target, then `read --component` or `refs --detail` to drill in.\n\n## Development\n\n```bash\ngofmt -w .\ngo test .\u002F...\ngo build -o unity-scanner .\n```\n","unity-scanner 是一个为AI代理工作流设计的Unity资源扫描工具，旨在减少Token消耗。其核心功能包括压缩重复的Unity路径、扩展名、.meta文件、GUID和YAML字段，将原始Unity YAML转储转换为结构化的输出，并提供并行处理以加快搜索速度。该工具使用Go语言开发，具有CLI界面，支持层级结构、组件组和引用的展示，同时通过省略计数来简化输出。适用于需要高效处理大量Unity项目数据，尤其是在与AI模型交互时希望降低传输成本的场景。",2,"2026-06-11 04:06:19","CREATED_QUERY"]