{"owner":"Tencent","repo":"puerts","hasSkills":true,"totalSkillsCount":5,"totalTokensCount":13606,"categories":["anthropic-skill"],"hasMcp":false,"mcpConfig":null,"found":[".codebuddy/skills/puerts_changelogs/SKILL.md","unity/test/unity/Packages/manifest.json","unity/skills/install-puerts-for-unity/SKILL.md","unity/test/unity/Packages/packages-lock.json","unity/skills/puerts-agent-development/SKILL.md"],"skills":{".codebuddy/skills/puerts_changelogs/SKILL.md":"---\r\nname: puerts_changelogs\r\ndescription: 指引如何为 puerts 项目编写 Unity 和 Unreal 的 changelog\r\n---\r\n\r\n# 编写 PuerTS Changelog 的指引\r\n\r\n## 文件位置\r\n\r\n| 平台 | 英文版 | 中文版 |\r\n|------|--------|--------|\r\n| Unity | `unity/changelog.md` | `unity/changelog-hans.md` |\r\n| Unreal | `unreal/changelog.md` | `unreal/changelog-hans.md` |\r\n\r\n## 操作流程\r\n\r\n### 1. 确定版本范围\r\n\r\n用户会告诉你要更新哪个平台（Unity 或 Unreal）的 changelog。\r\n\r\n- 先读取对应平台的英文版 changelog 文件，找到最新版本号（如 Unity 的 `3.0.1`，Unreal 的 `1.0.9`）。\r\n- 新版本号通常是在最后一位 +1（如 `3.0.1` → `3.0.2`，`1.0.9` → `1.0.10`），但如果用户指定了版本号则以用户为准。\r\n\r\n### 2. 获取两个 tag 之间的 commit\r\n\r\n根据平台确定 tag 命名规则：\r\n- **Unity**：tag 格式为 `Unity_v{版本号}`，例如 `Unity_v3.0.1`\r\n- **Unreal**：tag 格式为 `Unreal_v{版本号}`，例如 `Unreal_v1.0.9`\r\n\r\n执行 git log 获取 commit 列表，**只关注对应平台目录的改动**：\r\n\r\n**Unity 示例**（假设上一版本是 3.0.1，新版本是 3.0.2）：\r\n```bash\r\n# 如果新版本 tag 已存在\r\ngit log Unity_v3.0.1..Unity_v3.0.2 --oneline -- unity/\r\n\r\n# 如果新版本 tag 尚未打，则对比到 master\r\ngit log Unity_v3.0.1..master --oneline -- unity/\r\n```\r\n\r\n**Unreal 示例**（假设上一版本是 1.0.9，新版本是 1.0.10）：\r\n```bash\r\n# 如果新版本 tag 已存在\r\ngit log Unreal_v1.0.9..Unreal_v1.0.10 --oneline -- unreal/\r\n\r\n# 如果新版本 tag 尚未打，则对比到 master\r\ngit log Unreal_v1.0.9..master --oneline -- unreal/\r\n```\r\n\r\n### 3. 筛选和理解 commit\r\n\r\n- 不重要的 commit（如纯格式调整、注释修改、CI 配置等）可以跳过不写。\r\n- changelog 内容应该从**用户影响角度**来写，而不是实现层面的描述。\r\n- 如果从 commit message 无法确定改动的用户影响，应该通过 `git show <commit_hash>` 或 `git diff` 查看具体修改内容来确定。\r\n\r\n### 4. 编写 changelog\r\n\r\n**必须同时编写中文版和英文版**，写到对应的文件中。新版本的内容插入到文件最前面（在文件头部注释之后、旧版本之前）。\r\n\r\n#### Unity changelog 格式\r\n\r\n英文版（`unity/changelog.md`）：\r\n```markdown\r\n## [3.0.2] - 2025-04-01\r\n1. Fixed xxx issue fix #1234\r\n2. Added support for xxx feature (#5678)\r\n3. Optimized xxx performance\r\n```\r\n\r\n中文版（`unity/changelog-hans.md`）：\r\n```markdown\r\n## [3.0.2] - 2025-04-01\r\n1. 修复了 xxx 问题 fix #1234\r\n2. 新增 xxx 功能支持 (#5678)\r\n3. 优化了 xxx 性能\r\n```\r\n\r\n格式要点：\r\n- 标题格式：`## [版本号] - 日期`（日期格式 `YYYY-MM-DD` 或 `YYYY-M-D`）\r\n- 内容使用编号列表 `1. 2. 3. ...`\r\n- 英文版文件头有 `[跳转中文](./changelog-hans.md)` 链接\r\n- 中文版文件头有 `[english version](./changelog.md)` 链接\r\n- 如果 commit 关联了 issue，在条目末尾附上 `fix #issue号` 或 `(#PR号)`\r\n\r\n#### Unreal changelog 格式\r\n\r\n英文版（`unreal/changelog.md`）：\r\n```markdown\r\n### v1.0.10 2025/4/1\r\n\r\n#### New Features\r\n\r\n* Added support for xxx\r\n\r\n#### Optimizations\r\n\r\n* Optimized xxx performance (#1234)\r\n\r\n#### Changes\r\n\r\n* Changed xxx behavior\r\n\r\n#### Bug Fixes\r\n\r\n* Fixed xxx crash issue (fix #5678)\r\n```\r\n\r\n中文版（`unreal/changelog-hans.md`）：\r\n```markdown\r\n### v1.0.10 2025年4月1日\r\n\r\n#### 新增特性\r\n\r\n* 新增 xxx 支持\r\n\r\n#### 优化\r\n\r\n* 优化了 xxx 性能 (#1234)\r\n\r\n#### 变更\r\n\r\n* 变更了 xxx 行为\r\n\r\n#### bug修复\r\n\r\n* 修复了 xxx 崩溃问题 (fix #5678)\r\n```\r\n\r\n格式要点：\r\n- 标题格式：英文版 `### v版本号 YYYY/M/D`，中文版 `### v版本号 YYYY年M月D日`\r\n- 内容按分类组织：`New Features / Optimizations / Changes / Bug Fixes`（中文：`新增特性 / 优化 / 变更 / bug修复`）\r\n- 每个分类使用四级标题 `####`\r\n- 内容使用 `* ` 无序列表\r\n- 如果某个分类没有内容，则省略该分类，不要写空分类\r\n- 如果 commit 关联了 issue，在条目末尾附上 `fix #issue号` 或 `(#PR号)`\r\n\r\n### 5. 写入文件\r\n\r\n将新版本的 changelog 内容插入到对应文件中，位置在文件头部元信息之后、上一个版本之前。确保中英文两个文件都更新。","unity/test/unity/Packages/manifest.json":"{\n  \"dependencies\": {\n    \"com.tencent.puerts.commonjs\": \"file:../../../upms/commonjs\",\n    \"com.tencent.puerts.core\": \"file:../../../upms/core\",\n    \"com.tencent.puerts.lua\": \"file:../../../upms/lua\",\n    \"com.tencent.puerts.nodejs\": \"file:../../../upms/nodejs\",\n    \"com.tencent.puerts.python\": \"file:../../../upms/python\",\n    \"com.tencent.puerts.quickjs\": \"file:../../../upms/quickjs\",\n\t\"com.tencent.puerts.v8\": \"file:../../../upms/v8\",\n    \"com.tencent.puerts.unittest\": \"file:../../Src\",\n    \"com.unity.2d.sprite\": \"1.0.0\",\n    \"com.unity.2d.tilemap\": \"1.0.0\",\n    \"com.unity.ads\": \"3.7.5\",\n    \"com.unity.analytics\": \"3.6.12\",\n    \"com.unity.collab-proxy\": \"2.0.0\",\n    \"com.unity.ide.rider\": \"3.0.18\",\n    \"com.unity.ide.visualstudio\": \"2.0.17\",\n    \"com.unity.ide.vscode\": \"1.2.5\",\n    \"com.unity.purchasing\": \"4.5.2\",\n    \"com.unity.test-framework\": \"1.1.31\",\n    \"com.unity.textmeshpro\": \"3.0.6\",\n    \"com.unity.timeline\": \"1.6.4\",\n    \"com.unity.ugui\": \"1.0.0\",\n    \"com.unity.xr.legacyinputhelpers\": \"2.1.10\",\n    \"com.unity.modules.ai\": \"1.0.0\",\n    \"com.unity.modules.androidjni\": \"1.0.0\",\n    \"com.unity.modules.animation\": \"1.0.0\",\n    \"com.unity.modules.assetbundle\": \"1.0.0\",\n    \"com.unity.modules.audio\": \"1.0.0\",\n    \"com.unity.modules.cloth\": \"1.0.0\",\n    \"com.unity.modules.director\": \"1.0.0\",\n    \"com.unity.modules.imageconversion\": \"1.0.0\",\n    \"com.unity.modules.imgui\": \"1.0.0\",\n    \"com.unity.modules.jsonserialize\": \"1.0.0\",\n    \"com.unity.modules.particlesystem\": \"1.0.0\",\n    \"com.unity.modules.physics\": \"1.0.0\",\n    \"com.unity.modules.physics2d\": \"1.0.0\",\n    \"com.unity.modules.screencapture\": \"1.0.0\",\n    \"com.unity.modules.terrain\": \"1.0.0\",\n    \"com.unity.modules.terrainphysics\": \"1.0.0\",\n    \"com.unity.modules.tilemap\": \"1.0.0\",\n    \"com.unity.modules.ui\": \"1.0.0\",\n    \"com.unity.modules.uielements\": \"1.0.0\",\n    \"com.unity.modules.umbra\": \"1.0.0\",\n    \"com.unity.modules.unityanalytics\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequestassetbundle\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequestaudio\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequesttexture\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequestwww\": \"1.0.0\",\n    \"com.unity.modules.vehicles\": \"1.0.0\",\n    \"com.unity.modules.video\": \"1.0.0\",\n    \"com.unity.modules.vr\": \"1.0.0\",\n    \"com.unity.modules.wind\": \"1.0.0\",\n    \"com.unity.modules.xr\": \"1.0.0\"\n  }\n}\n","unity/skills/install-puerts-for-unity/SKILL.md":"﻿---\r\nname: Install PuerTS for Unity\r\ndescription: Guide for downloading and installing PuerTS UPM packages into a Unity project — covers version selection, package dependencies, download/extract and git URL installation methods, and Editor Assistant setup.\r\n---\r\n\r\n# Install PuerTS for Unity\r\n\r\nThis skill guides you through downloading and installing PuerTS packages into a Unity project.\r\n\r\n> **⚠️ Important**: Always ask the user which PuerTS version they want to install if they haven't specified one. The version number follows the **Core** package's version (e.g., `3.0.2`).\r\n\r\n---\r\n\r\n## 1. Release Page & Version\r\n\r\n- The release download page URL pattern is:\r\n  ```\r\n  https://github.com/Tencent/puerts/releases/tag/Unity_v{VERSION}\r\n  ```\r\n  For example: `https://github.com/Tencent/puerts/releases/tag/Unity_v3.0.2`\r\n\r\n> **⚠️ Important — Version Numbers Inside Archives**: The version number in the release page URL (e.g., `Unity_v3.0.2`) is based on the **Core** package version. However, the version numbers inside each `.tar.gz` filename may differ — each package follows its own versioning cadence. You may need to download/parse the release page HTML to determine the exact filenames available.\r\n\r\n---\r\n\r\n## 2. Available Packages\r\n\r\nEach release page may contain the following `.tar.gz` archives, each corresponding to a UPM package:\r\n\r\n| Archive File | UPM Package | Has Native Plugins | Always Available |\r\n|---|---|---|---|\r\n| `PuerTS_Core_{ver}.tar.gz` | `com.tencent.puerts.core` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Lua_{ver}.tar.gz` | `com.tencent.puerts.lua` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Nodejs_{ver}.tar.gz` | `com.tencent.puerts.nodejs` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Python_{ver}.tar.gz` | `com.tencent.puerts.python` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Quickjs_{ver}.tar.gz` | `com.tencent.puerts.quickjs` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_V8_{ver}.tar.gz` | `com.tencent.puerts.v8` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Webgl_{ver}.tar.gz` | `com.tencent.puerts.webgl` | ❌ No | ✅ Yes |\r\n| `PuerTS_Agent_{ver}.tar.gz` | `com.tencent.puerts.agent` | ❌ No | ❌ Not every release |\r\n| `PuerTS_MCP_{ver}.tar.gz` | `com.tencent.puerts.mcp` | ❌ No | ❌ Not every release |\r\n\r\n### Notable Package Features\r\n\r\n- **`com.tencent.puerts.agent`**: Provides an **Agent framework** for building LLM agents, and also includes an **Agent-based Editor Assistant** for Unity.\r\n- **`com.tencent.puerts.mcp`**: Provides an **MCP (Model Context Protocol) framework**, and also includes an **MCP-based Editor Assistant** for Unity.\r\n\r\n> Both the `agent` and `mcp` packages offer an **Editor Assistant** variant. See Section 5 for how to handle user requests like \"install PuerTS Editor Assistant\".\r\n\r\n---\r\n\r\n## 3. Package Dependencies\r\n\r\n> **⚠️ Important**: Packages have dependency relationships. When a user requests to install a package, you **must** ensure all of its dependencies are also installed.\r\n\r\n### Dependency Rules\r\n\r\n- **`com.tencent.puerts.core`** is the foundational package — **all other packages depend on it**.\r\n- **`com.tencent.puerts.agent`** depends on `com.tencent.puerts.core` + `com.tencent.puerts.v8`\r\n- **`com.tencent.puerts.mcp`** depends on `com.tencent.puerts.core` + `com.tencent.puerts.v8` + `com.tencent.puerts.agent`\r\n- **All backend packages** (`com.tencent.puerts.v8`, `com.tencent.puerts.lua`, `com.tencent.puerts.nodejs`, `com.tencent.puerts.python`, `com.tencent.puerts.quickjs`, `com.tencent.puerts.webgl`) depend on `com.tencent.puerts.core`\r\n\r\n### Dependency Graph\r\n\r\n```\r\ncom.tencent.puerts.core  (required by all)\r\n  ├── com.tencent.puerts.v8\r\n  │     ├── com.tencent.puerts.agent\r\n  │     │     └── com.tencent.puerts.mcp\r\n  │     └── com.tencent.puerts.mcp\r\n  ├── com.tencent.puerts.nodejs\r\n  ├── com.tencent.puerts.lua\r\n  ├── com.tencent.puerts.python\r\n  ├── com.tencent.puerts.quickjs\r\n  └── com.tencent.puerts.webgl\r\n```\r\n\r\n### Examples of Automatic Dependency Resolution\r\n\r\n| User requests to install | Must also install |\r\n|---|---|\r\n| `agent` | `core`, `v8` |\r\n| `mcp` | `core`, `v8`, `agent` |\r\n| `mcp` + `agent` | `core`, `v8` |\r\n| `v8` | `core` |\r\n| `lua` | `core` |\r\n\r\n---\r\n\r\n## 4. Installation Methods\r\n\r\n### 4.1 Download & Extract Method (Required for packages with native plugins)\r\n\r\nThe following packages contain compiled native binary plugins and **must** be installed by downloading from the release page:\r\n\r\n- `com.tencent.puerts.core`\r\n- `com.tencent.puerts.lua`\r\n- `com.tencent.puerts.nodejs`\r\n- `com.tencent.puerts.python`\r\n- `com.tencent.puerts.quickjs`\r\n- `com.tencent.puerts.v8`\r\n\r\n**Steps:**\r\n\r\n1. Go to `https://github.com/Tencent/puerts/releases/tag/Unity_v{VERSION}`\r\n2. Download the required `.tar.gz` file(s) (e.g., `PuerTS_Core_3.0.2.tar.gz`)\r\n3. Extract the archive — it will produce a directory (e.g., `core/`) containing a standard UPM package structure with a `package.json`\r\n4. Move the extracted directory into the Unity project's `Packages/` folder\r\n5. Verify installation by checking `Packages/manifest.json`\r\n\r\n### 4.2 Git URL Method (Available for packages without native plugins)\r\n\r\nThe following packages can also be installed via Unity's **Add package from git URL** method:\r\n\r\n- `com.tencent.puerts.webgl`\r\n- `com.tencent.puerts.agent`\r\n- `com.tencent.puerts.mcp`\r\n\r\n#### When the package **exists** on the release page\r\n\r\nYou can either:\r\n- Use the **Download & Extract** method (Section 4.1), OR\r\n- Use a **versioned git URL** in Unity Package Manager:\r\n  ```\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/{package_name}#Unity_v{VERSION}\r\n  ```\r\n  Examples:\r\n  ```\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/agent#Unity_v3.0.2\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/mcp#Unity_v3.0.2\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/webgl#Unity_v3.0.2\r\n  ```\r\n\r\n#### When the package **does NOT exist** on the release page\r\n\r\nSince `com.tencent.puerts.agent` and `com.tencent.puerts.mcp` are newer packages and not available in every release, if they are missing from the download page, install them using an **unversioned git URL**:\r\n  ```\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/agent\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/mcp\r\n  ```\r\n\r\n#### How to add a git URL in Unity\r\n\r\nAdd the URL to the project's `Packages/manifest.json` under `\"dependencies\"`, for example:\r\n```json\r\n{\r\n  \"dependencies\": {\r\n    \"com.tencent.puerts.agent\": \"https://github.com/Tencent/puerts.git?path=unity/upms/agent#Unity_v3.0.2\"\r\n  }\r\n}\r\n```\r\nOr use the Unity Editor: **Window → Package Manager → + → Add package from git URL...**\r\n\r\n---\r\n\r\n## 5. Installation Workflow\r\n\r\nWhen a user asks to install PuerTS, follow this workflow:\r\n\r\n1. **Ask the user** which version to install (if not already specified)\r\n2. **Ask the user** which packages they need (common combo: `com.tencent.puerts.core` + `com.tencent.puerts.v8` + `com.tencent.puerts.agent`)\r\n3. **Resolve dependencies** — based on the dependency rules in Section 3, automatically include all required dependency packages. Inform the user about the additional packages that will be installed.\r\n\r\n### Editor Assistant Installation Rules\r\n\r\nIf the user requests to **\"install PuerTS Editor Assistant\"** (or similar phrasing like \"安装 puerts 编辑器助手\"), apply the following rules:\r\n\r\n| User Request | Packages to Install |\r\n|---|---|\r\n| \"Install PuerTS Editor Assistant\" (no specific version mentioned) | **Both** `com.tencent.puerts.agent` **and** `com.tencent.puerts.mcp` (plus all their dependencies: `core`, `v8`) |\r\n| \"Install PuerTS Editor Assistant — Agent version\" | Only `com.tencent.puerts.agent` (plus its dependencies: `core`, `v8`) |\r\n| \"Install PuerTS Editor Assistant — MCP version\" | Only `com.tencent.puerts.mcp` (plus its dependencies: `core`, `v8`, `agent`) |\r\n\r\n4. **Check the release page** `https://github.com/Tencent/puerts/releases/tag/Unity_v{VERSION}` to see which archives are available — note that actual filenames in the `.tar.gz` may have different version numbers than the release tag\r\n5. **For packages with native plugins** (`com.tencent.puerts.core`, `com.tencent.puerts.v8`, `com.tencent.puerts.lua`, `com.tencent.puerts.nodejs`, `com.tencent.puerts.python`, `com.tencent.puerts.quickjs`): guide the user to download and extract into `Packages/`\r\n6. **For packages without native plugins** (`com.tencent.puerts.webgl`, `com.tencent.puerts.agent`, `com.tencent.puerts.mcp`):\r\n   - If the `.tar.gz` exists on the release page → offer both download or git URL options\r\n   - If the `.tar.gz` does NOT exist on the release page → use the unversioned git URL\r\n7. **Verify** the installation by checking `Packages/manifest.json` for the expected package entries\r\n\r\n---\r\n\r\n## 6. Verifying Installation\r\n\r\nAfter installation, the following package IDs should appear in `Packages/manifest.json` (depending on which packages were installed):\r\n\r\n- `com.tencent.puerts.core`\r\n- `com.tencent.puerts.v8` (or other backend: `com.tencent.puerts.lua`, `com.tencent.puerts.nodejs`, `com.tencent.puerts.python`, `com.tencent.puerts.quickjs`)\r\n- `com.tencent.puerts.agent`\r\n- `com.tencent.puerts.webgl`\r\n- `com.tencent.puerts.mcp`\r\n\r\n---\r\n\r\n## 7. Known Issues & Troubleshooting (Windows)\r\n\r\n### 7.1 `curl` on Windows is an alias for `Invoke-WebRequest` — use different flags\r\n\r\nOn Windows PowerShell, `curl` is an alias for `Invoke-WebRequest` and does **not** accept standard Unix `curl` flags like `-L`, `--max-time`, `-o`. Use the native PowerShell syntax instead:\r\n\r\n```powershell\r\n# ❌ Wrong — Unix curl flags don't work in PowerShell\r\ncurl -L --max-time 30 -o output.html https://...\r\n\r\n# ✅ Correct — use Invoke-WebRequest with PowerShell parameters\r\nInvoke-WebRequest -Uri \"https://...\" -OutFile \"output.html\" -UseBasicParsing\r\n```\r\n\r\n### 7.2 GitHub API rate limit when unauthenticated\r\n\r\nCalling `https://api.github.com/repos/Tencent/puerts/releases/tags/Unity_v{VERSION}` without authentication will quickly hit GitHub's rate limit (especially on shared IPs). \r\n\r\n**Workaround**: Instead of the API, fetch the **expanded assets HTML fragment** directly — it contains all download links and is not rate-limited:\r\n\r\n```powershell\r\nInvoke-WebRequest -Uri \"https://github.com/Tencent/puerts/releases/expanded_assets/Unity_v{VERSION}\" `\r\n    -OutFile \"assets.html\" -UseBasicParsing\r\n\r\n# Then extract download links with regex:\r\n$content = Get-Content \"assets.html\" -Raw\r\n$matches = [regex]::Matches($content, 'href=\"(/Tencent/puerts/releases/download[^\"]*)\"')\r\n$matches | ForEach-Object { $_.Groups[1].Value }\r\n```\r\n\r\nThis returns the exact filenames (e.g., `PuerTS_Core_3.0.2.tar.gz`) without consuming API quota.\r\n\r\n### 7.3 `Invoke-WebRequest` times out on large files\r\n\r\n`Invoke-WebRequest` can time out when downloading large packages (e.g., `PuerTS_V8` ~74 MB, `PuerTS_Nodejs` ~169 MB).\r\n\r\n**Workaround**: Use `Start-BitsTransfer` instead — it is more reliable for large files and does not time out:\r\n\r\n```powershell\r\nStart-BitsTransfer `\r\n    -Source \"https://github.com/Tencent/puerts/releases/download/Unity_v3.0.2/PuerTS_V8_3.0.2.tar.gz\" `\r\n    -Destination \"C:\\path\\to\\output\\PuerTS_V8_3.0.2.tar.gz\"\r\n```\r\n\r\n### 7.4 Release page HTML does not contain download links (JavaScript-rendered)\r\n\r\nThe main release page (`/releases/tag/Unity_v{VERSION}`) renders asset links via JavaScript — the raw HTML fetched by `Invoke-WebRequest` will **not** contain any `releases/download` links.\r\n\r\n**Solution**: Use the `expanded_assets` endpoint instead (see Section 7.2 above), which returns a static HTML fragment with all asset links.\r\n\r\n### 7.5 `manifest.json` must use `file:` prefix for local packages\r\n\r\nWhen packages are extracted into the `Packages/` directory, `manifest.json` must reference them with the `file:` prefix pointing to the subdirectory name:\r\n\r\n```json\r\n{\r\n  \"dependencies\": {\r\n    \"com.tencent.puerts.core\":   \"file:core\",\r\n    \"com.tencent.puerts.v8\":     \"file:v8\",\r\n    \"com.tencent.puerts.nodejs\": \"file:nodejs\",\r\n    \"com.tencent.puerts.agent\":  \"file:agent\",\r\n    \"com.tencent.puerts.mcp\":    \"file:mcp\"\r\n  }\r\n}\r\n```\r\n\r\nUnity will automatically resolve these local paths when the project is opened.\r\n","unity/test/unity/Packages/packages-lock.json":"{\n  \"dependencies\": {\n    \"com.tencent.puerts.commonjs\": {\n      \"version\": \"file:../../../upms/commonjs\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {}\n    },\n    \"com.tencent.puerts.core\": {\n      \"version\": \"file:../../../upms/core\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {}\n    },\n    \"com.tencent.puerts.lua\": {\n      \"version\": \"file:../../../upms/lua\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.tencent.puerts.nodejs\": {\n      \"version\": \"file:../../../upms/nodejs\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.tencent.puerts.python\": {\n      \"version\": \"file:../../../upms/python\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.tencent.puerts.quickjs\": {\n      \"version\": \"file:../../../upms/quickjs\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.tencent.puerts.unittest\": {\n      \"version\": \"file:../../Src\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {}\n    },\n    \"com.tencent.puerts.v8\": {\n      \"version\": \"file:../../../upms/v8\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.unity.2d.sprite\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.2d.tilemap\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.tilemap\": \"1.0.0\",\n        \"com.unity.modules.uielements\": \"1.0.0\"\n      }\n    },\n    \"com.unity.ads\": {\n      \"version\": \"3.7.5\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.analytics\": {\n      \"version\": \"3.6.12\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.collab-proxy\": {\n      \"version\": \"2.0.0\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ext.nunit\": {\n      \"version\": \"1.0.6\",\n      \"depth\": 1,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ide.rider\": {\n      \"version\": \"3.0.18\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ext.nunit\": \"1.0.6\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ide.visualstudio\": {\n      \"version\": \"2.0.17\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.test-framework\": \"1.1.9\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ide.vscode\": {\n      \"version\": \"1.2.5\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.nuget.newtonsoft-json\": {\n      \"version\": \"3.2.0\",\n      \"depth\": 2,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.purchasing\": {\n      \"version\": \"4.5.2\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\",\n        \"com.unity.modules.unityanalytics\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\",\n        \"com.unity.modules.androidjni\": \"1.0.0\",\n        \"com.unity.services.core\": \"1.3.1\",\n        \"com.unity.services.analytics\": \"4.0.1\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.services.analytics\": {\n      \"version\": \"4.4.0\",\n      \"depth\": 1,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\",\n        \"com.unity.services.core\": \"1.8.1\",\n        \"com.unity.nuget.newtonsoft-json\": \"3.0.2\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.services.core\": {\n      \"version\": \"1.8.2\",\n      \"depth\": 1,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.nuget.newtonsoft-json\": \"3.0.2\",\n        \"com.unity.modules.androidjni\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.test-framework\": {\n      \"version\": \"1.1.31\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ext.nunit\": \"1.0.6\",\n        \"com.unity.modules.imgui\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.textmeshpro\": {\n      \"version\": \"3.0.6\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.timeline\": {\n      \"version\": \"1.6.4\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.modules.director\": \"1.0.0\",\n        \"com.unity.modules.animation\": \"1.0.0\",\n        \"com.unity.modules.audio\": \"1.0.0\",\n        \"com.unity.modules.particlesystem\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ugui\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.ui\": \"1.0.0\",\n        \"com.unity.modules.imgui\": \"1.0.0\"\n      }\n    },\n    \"com.unity.xr.legacyinputhelpers\": {\n      \"version\": \"2.1.10\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.modules.vr\": \"1.0.0\",\n        \"com.unity.modules.xr\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.modules.ai\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.androidjni\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.animation\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.assetbundle\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.audio\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.cloth\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.director\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.audio\": \"1.0.0\",\n        \"com.unity.modules.animation\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.imageconversion\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.imgui\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.jsonserialize\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.particlesystem\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.physics\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.physics2d\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.screencapture\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.imageconversion\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.subsystems\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 1,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.terrain\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.terrainphysics\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\",\n        \"com.unity.modules.terrain\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.tilemap\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics2d\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.ui\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.uielements\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.ui\": \"1.0.0\",\n        \"com.unity.modules.imgui\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.umbra\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.unityanalytics\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequest\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.unitywebrequestassetbundle\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.assetbundle\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequestaudio\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.audio\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequesttexture\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.imageconversion\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequestwww\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequestassetbundle\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequestaudio\": \"1.0.0\",\n        \"com.unity.modules.audio\": \"1.0.0\",\n        \"com.unity.modules.assetbundle\": \"1.0.0\",\n        \"com.unity.modules.imageconversion\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.vehicles\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.video\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.audio\": \"1.0.0\",\n        \"com.unity.modules.ui\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.vr\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.jsonserialize\": \"1.0.0\",\n        \"com.unity.modules.physics\": \"1.0.0\",\n        \"com.unity.modules.xr\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.wind\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.xr\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\",\n        \"com.unity.modules.subsystems\": \"1.0.0\"\n      }\n    }\n  }\n}\n","unity/skills/puerts-agent-development/SKILL.md":"﻿---\r\nname: PuerTS Agent Development Guide\r\ndescription: Guide for developing LLM agents based on PuerTsAgent framework — covers resource directory structure, system-prompt, skills, builtin modules, and best practices.\r\n---\r\n\r\n# PuerTS Agent Development Guide\r\n\r\nThis skill provides the complete guide for developing LLM agents based on the PuerTsAgent framework.\r\n\r\n> **⚠️ Important — Required Packages**: This framework depends on PuerTS **core**, **v8**, and **agent** packages. Before proceeding, you **must** check the Unity project's `Packages/manifest.json` to verify that the following packages are installed:\r\n> - `com.tencent.puerts.core`\r\n> - `com.tencent.puerts.v8`\r\n> - `com.tencent.puerts.agent`\r\n>\r\n> If any of these packages are missing, they must be installed first before using this skill. you MUST first invoke the **\"Install PuerTS for Unity\"** skill to AUTO complete the setup.\r\n\r\n> **⚠️ Prerequisite**: Before using this skill to create or modify an agent, you **must** know the agent's resource directory path under Unity `Resources/` (e.g., `maze-runner`, `editor-assistant`). If the user has not provided this path, **ask the user** which `Resources/` subdirectory to use before proceeding. All agent files (system-prompt, skills, builtins) are organized under this path.\r\n\r\n> **⚠️ Builtin Language Choice**: When creating builtin modules, you **must ask the user** whether they want to write builtins in **TypeScript** or **JavaScript**:\r\n> - **TypeScript** → Create a dedicated TS project (with `package.json`, `tsconfig.json`, `esbuild.mjs`) whose build output (`outdir`) points to `Assets/Resources/<agent-name>/builtins/`. See [TypeScript Project Setup for Builtins](#typescript-project-setup-for-builtins) section below.\r\n> - **JavaScript** → Write `.mjs` files directly in `Assets/Resources/<agent-name>/builtins/`.\r\n\r\n## Overview\r\n\r\nIn this framework, an agent's behavior and capabilities are entirely defined by files in a **resource directory** (Resource Root). Different resource directories represent different agents — Unity editor assistants, in-game AI characters, or any role you need.\r\n\r\n> **Key Concept**: Both `system-prompt.md.txt` and files under `skills/` are essentially **prompts** (natural language instructions for the LLM). The only difference is their **loading strategy**:\r\n> - **`system-prompt.md.txt`** — Always present in context (persistent). Put prompts here that are needed for **most tasks**.\r\n> - **`skills/*.md.txt`** — Loaded on demand by the LLM via `loadSkill`. Put prompts here that are **not needed for every task** — they are loaded only when the LLM determines they are relevant.\r\n\r\n## Creating an Agent\r\n\r\nInitialize an agent in C# via its resource path:\r\n\r\n```csharp\r\nvar agent = new AgentScriptManager();\r\nagent.Initialize(\"maze-runner\", () =>\r\n{\r\n    Debug.Log(\"Maze runner agent is ready!\");\r\n});\r\n```\r\n\r\nThe first parameter of `Initialize` is the resource directory path under Unity `Resources/`. The framework loads the full agent definition from this directory:\r\n\r\n- **`system-prompt.md.txt`** — Role definition (System Prompt)\r\n- **`skills/`** — Domain skill documents (loaded on demand, optional)\r\n- **`builtins/`** — Built-in helper modules (executable JS modules)\r\n\r\n### Example Directory Structure\r\n\r\n```\r\nResources/maze-runner/\r\n├── system-prompt.md.txt          # Role definition (System Prompt)\r\n├── skills/                       # Domain skills (loaded on demand, optional)\r\n└── builtins/                     # Built-in modules (loaded on demand)\r\n    ├── maze-control.mjs          # Maze movement and status query\r\n    └── screenshot.mjs            # Screenshot to observe the maze\r\n```\r\n\r\nAll resource files are placed in Unity's `Resources/` directory.\r\n\r\n> **File extension convention**: Unity `Resources` does not support `.md` and `.mjs` as TextAsset, so:\r\n> - Markdown files use `.md.txt` suffix\r\n> - JS module files use `.mjs` suffix\r\n\r\n---\r\n\r\n## 1. System Prompt — Role Definition\r\n\r\n### Purpose\r\n\r\n`system-prompt.md.txt` defines the agent's identity, personality, capabilities, and behavioral rules. It is injected at the beginning of the LLM's system prompt and is the core of the agent's \"persona.\"\r\n\r\n> **This is a persistent prompt** — it is always present in the LLM's context for every conversation turn. Therefore, put only the most frequently used instructions here — things the agent needs for the **majority** of its tasks. Avoid stuffing rarely-used domain knowledge here, as it permanently consumes context tokens.\r\n\r\n### File Location\r\n\r\n```text\r\n<resource-root>/system-prompt.md.txt\r\n```\r\n\r\n### Format\r\n\r\nPlain text / Markdown format, write role definition directly, no front-matter needed.\r\n\r\n### Example — Editor Assistant\r\n\r\n```markdown\r\nYou are a helpful AI assistant running inside Unity via PuerTS (a TypeScript/JavaScript runtime for Unity). You can help with game development, scripting, and general questions. Be concise and practical.\r\n```\r\n\r\n### Example — Maze AI (excerpt)\r\n\r\n```markdown\r\nYou are a Maze Explorer AI — an intelligent agent that navigates through 3D mazes by observing, reasoning, and acting.\r\n\r\n## Your Capabilities\r\n\r\nYou can control a player character in a 3D maze using two builtin modules:\r\n- **maze-control**: Move in compass directions (north/south/east/west) with `movePath()` and query obstacle distances with `getPlayerStatus()`\r\n- **screenshot**: Capture the game view to visually observe the maze\r\n\r\n## Goal Description\r\n\r\nYour goal is to reach the **maze exit marker** — a tall RED pillar with a bright RED glowing ring.\r\n```\r\n\r\n> The System Prompt describes the AI's identity, available modules, goals, exploration loops, navigation rules, etc. It can be lengthy — it defines the AI's behavior pattern throughout the task.\r\n\r\n---\r\n\r\n## 2. Skills — Domain Skills\r\n\r\n### Purpose\r\n\r\nA Skill is an **on-demand loaded** Markdown document providing domain-specific operation guides and rules for the LLM. The LLM actively loads skills into context via the `loadSkill` tool when needed.\r\n\r\n> **Skills are prompts too** — just like `system-prompt.md.txt`, they are natural language instructions. The key difference is that skills are **not always in context**. If a piece of knowledge is not needed for most tasks the agent handles, it belongs in a skill file rather than in the system prompt. This keeps the base context lean while still making specialized knowledge available when the LLM needs it.\r\n\r\n### File Location\r\n\r\n```text\r\n<resource-root>/skills/<skill-name>.md.txt\r\n```\r\n\r\n### File Format\r\n\r\nSkill files use **YAML front-matter** for metadata, body is Markdown content:\r\n\r\n```yaml\r\n---\r\nname: <skill-id>\r\ndescription: \"<one-line description shown to the LLM>\"\r\n---\r\n\r\n(Markdown body — the actual skill instructions)\r\n```\r\n\r\n| Front-matter Field | Required | Description |\r\n|---|---|---|\r\n| `name` | ✅ | Unique identifier, LLM calls `loadSkill` with this name |\r\n| `description` | ❌ | Short description shown in `loadSkill` available skills list |\r\n\r\n### Example\r\n\r\n`skills/puerts-interop.md.txt`:\r\n\r\n```yaml\r\n---\r\nname: puerts-interop\r\ndescription: \"PuerTS JS ↔ C# interop rules: CS/puer globals, out/ref params, generics, operators, Array/List indexer access, async/Task.\"\r\n---\r\n\r\n## PuerTS: JS ↔ C# Interop Rules\r\n...\r\n```\r\n\r\n### Design Tips\r\n\r\n- **description should be accurate**: LLM decides whether to load based on description\r\n- **content should be thorough**: skill docs are the LLM's only reference for specific tasks\r\n- **one domain per skill**: keep responsibilities single for precise loading\r\n- **system-prompt vs skill decision rule**: If the agent needs this knowledge in >80% of tasks → put it in `system-prompt.md.txt`. Otherwise → put it in `skills/` for on-demand loading\r\n\r\n---\r\n\r\n## 3. Builtin — Built-in Helper Modules\r\n\r\n### Purpose\r\n\r\nBuiltin modules are JavaScript modules providing pre-built helper functions for the LLM's `evalJsCode` tool. Unlike Skills, Builtins are actually executable code, not documentation.\r\n\r\n### File Location\r\n\r\n```text\r\n<resource-root>/builtins/<module-name>.mjs\r\n```\r\n\r\n> Source code can use TypeScript, JavaScript, or any language compilable to `.mjs`. The framework only cares about the final `.mjs` files in the resource directory.\r\n\r\n### Module Contract\r\n\r\nEvery Builtin module must export the following two string constants:\r\n\r\n| Export | Type | Description |\r\n|---|---|---|\r\n| `summary` | `string` | Short summary (~one line), always shown in `evalJsCode` tool description |\r\n| `description` | `string` | Detailed function signatures and usage, LLM reads via `import()` |\r\n\r\nAdditionally, the module's exported functions are the actual capabilities the LLM can call in `evalJsCode`.\r\n\r\n### Example — `builtins/unity-log.mjs` (shown as TypeScript source)\r\n\r\n```typescript\r\n// ---- Summary for tool description (always in context) ----\r\nexport const summary = `**unity-log** — Unity console log access (retrieve and summarize recent logs). Read \\`.description\\` to see available functions and their signatures.`;\r\n\r\n// ---- Description for on-demand access via import ----\r\nexport const description = `\r\n- **\\`getUnityLogs(count?, logType?)\\`** — Get recent Unity console logs.\r\n  - \\`count\\` (number, default 20): Number of log entries to retrieve (1-50).\r\n  - \\`logType\\` (string, default \\`'all'\\`): Filter by type — \\`'all'\\`, \\`'error'\\`, \\`'warning'\\`, or \\`'log'\\`.\r\n  - Returns an array of log entry objects: \\`{ timestamp, type, message, stackTrace? }\\`.\r\n`.trim();\r\n\r\n// ---- Function implementations ----\r\nexport function getUnityLogs(count: number = 20, logType: string = 'all'): LogEntry[] {\r\n    const logsJson = CS.LLMAgent.UnityLogBridge.GetRecentLogs(count, logType);\r\n    return JSON.parse(logsJson);\r\n}\r\n```\r\n\r\n### Example — `builtins/maze-control.mjs` (TypeScript source, excerpt)\r\n\r\n```typescript\r\nexport const summary = `**maze-control** — Control the player in the maze. \\`movePath([{dir, steps}, ...])\\` executes a multi-segment path. \\`getPlayerStatus()\\` returns position and obstacle distances. Read \\`.description\\` for details.`;\r\n\r\nexport const description = `\r\n- **\\`movePath(segments)\\`** — Move the player along a multi-segment planned path.\r\n  - \\`segments\\` (array): Array of \\`{ dir: string, steps: number }\\`.\r\n  - Returns: \\`{ success, stepsCompleted, blocked, reachedGoal, position, message }\\`\r\n- **\\`getPlayerStatus()\\`** — Get the player's position and obstacle distances.\r\n  - Returns: \\`{ position, northDistance, southDistance, eastDistance, westDistance, reachedGoal }\\`\r\n`.trim();\r\n\r\nexport async function movePath(segments: PathSegment[]): Promise<MoveSequenceResult> {\r\n    const directionsJson = JSON.stringify(segments.map(s => s.dir));\r\n    const distancesJson = JSON.stringify(segments.map(s => s.steps));\r\n    const resultJson = await new Promise<string>((resolve, reject) => {\r\n        CS.LLMAgent.MazePlayerBridge.MoveSequenceV2(directionsJson, distancesJson, (json: string) => resolve(json));\r\n    });\r\n    return JSON.parse(resultJson);\r\n}\r\n\r\nexport async function getPlayerStatus(): Promise<PlayerStatusResult> {\r\n    const resultJson = await new Promise<string>((resolve, reject) => {\r\n        CS.LLMAgent.MazePlayerBridge.GetPlayerStatus((json: string) => resolve(json));\r\n    });\r\n    return JSON.parse(resultJson);\r\n}\r\n```\r\n\r\n### Design Tips\r\n\r\n- **summary should be brief**: it always consumes tokens, just convey the module's purpose\r\n- **description must list complete signatures**: LLM must read description before calling functions\r\n- **functions should validate parameters**: LLM may pass incorrect params, validate and throw meaningful errors\r\n- **top-level await is supported**: modules can use `await` at top level (e.g., async initialization)\r\n- C# bridge classes must be pre-implemented on the Unity side\r\n\r\n---\r\n\r\n## 4. Complete Development Workflow\r\n\r\n### Step 1: Create Resource Directory\r\n\r\n```\r\nResources/<agent-name>/\r\n├── system-prompt.md.txt\r\n├── skills/\r\n└── builtins/\r\n```\r\n\r\n### Step 2: Write Role Definition\r\n\r\nEdit `system-prompt.md.txt` to define the AI's identity and behavioral rules. For example, a maze AI should describe:\r\n- Role identity (maze explorer)\r\n- Available modules (maze-control, screenshot)\r\n- Goal (reach the red exit marker)\r\n- Exploration loop (observe → plan → act)\r\n- Navigation strategy (right-hand rule, dead-end detection, etc.)\r\n\r\n### Step 3: Write Domain Skills (Optional)\r\n\r\nCreate `.md.txt` files in the `skills/` directory with YAML front-matter and skill content.\r\n\r\n> The Maze Demo doesn't use skill files — all navigation rules are directly in system-prompt. When domain knowledge is extensive and doesn't need to be loaded every time, splitting into skills is more appropriate.\r\n\r\n### Step 4: Write Helper Modules\r\n\r\nFirst, ask the user whether to write builtins in **TypeScript** or **JavaScript**:\r\n\r\n- **TypeScript**: Create a dedicated TS project following the [TypeScript Project Setup for Builtins](#typescript-project-setup-for-builtins) template (Section 6). The project's build output will automatically go to `Resources/<agent-name>/builtins/`.\r\n- **JavaScript**: Write `.mjs` files directly in `Assets/Resources/<agent-name>/builtins/`.\r\n\r\n### Step 5: Initialize the Agent\r\n\r\nIn C# code, initialize the agent with the corresponding resource path (see \"Creating an Agent\" section above).\r\n\r\n---\r\n\r\n## 5. Best Practices\r\n\r\n### System Prompt\r\n- Keep it concise and clear, avoid excessive length (it always consumes context tokens)\r\n- Focus on \"who you are\" and \"what you should do\", don't include framework runtime details\r\n- Only include prompts needed for the **majority** of tasks — this is always-on context\r\n\r\n### Skills\r\n- Split complex domain knowledge into separate skill files\r\n- Include keywords in description to help LLM decide when to load\r\n- The more detailed the better — this is the LLM's only reference for the task\r\n- Remember: skills and system-prompt are both prompts; the difference is persistent vs on-demand loading\r\n\r\n### Builtins\r\n- Each module focuses on one functional area (e.g., scene operations, log queries)\r\n- Summary should be one line, description must list all function signatures completely\r\n- All exported functions should validate parameters and throw meaningful errors\r\n\r\n### General\r\n- One resource directory = one independent agent role\r\n- Different agents are completely isolated, can have entirely different skills and toolsets\r\n\r\n---\r\n\r\n## 6. TypeScript Project Setup for Builtins\r\n\r\nWhen the user chooses TypeScript for builtins, create a dedicated TS project with the following structure and files. Replace `<agent-name>` with the actual agent name (e.g., `maze-runner`).\r\n\r\n### Project Structure\r\n\r\n```\r\nTs<AgentNamePascalCase>/          # e.g., TsMazeRunner/\r\n├── package.json\r\n├── tsconfig.json\r\n├── esbuild.mjs                   # Build script — outputs to Resources/<agent-name>/builtins/\r\n└── src/\r\n    └── builtins/\r\n        └── <module-name>.mts     # TypeScript source files\r\n```\r\n\r\n### package.json Template\r\n\r\n```json\r\n{\r\n  \"name\": \"<agent-name>\",\r\n  \"version\": \"1.0.0\",\r\n  \"description\": \"<Agent description> - TypeScript builtins\",\r\n  \"private\": true,\r\n  \"scripts\": {\r\n    \"build\": \"node esbuild.mjs\",\r\n    \"typecheck\": \"tsc --noEmit\"\r\n  },\r\n  \"devDependencies\": {\r\n    \"esbuild\": \"^0.25.0\",\r\n    \"typescript\": \"^5.4.0\"\r\n  }\r\n}\r\n```\r\n\r\n### tsconfig.json Template\r\n\r\n```json\r\n{\r\n  \"compilerOptions\": {\r\n    \"target\": \"esnext\",\r\n    \"module\": \"nodenext\",\r\n    \"moduleResolution\": \"nodenext\",\r\n    \"rootDir\": \"src\",\r\n    \"strict\": true,\r\n    \"esModuleInterop\": true,\r\n    \"skipLibCheck\": true,\r\n    \"forceConsistentCasingInFileNames\": true,\r\n    \"declaration\": false,\r\n    \"sourceMap\": false,\r\n    \"noEmit\": true,\r\n    \"typeRoots\": [\"../Assets/Gen/Typing\", \"../puerts/unity/upms/core/Typing\"]\r\n  },\r\n  \"include\": [\"src/**/*.mts\", \"src/**/*.d.ts\", \"../Assets/Gen/Typing/csharp/index.d.ts\"],\r\n  \"exclude\": [\"node_modules\"]\r\n}\r\n```\r\n\r\n### esbuild.mjs Template\r\n\r\n```javascript\r\nimport { build } from 'esbuild';\r\nimport { readdirSync, mkdirSync, existsSync } from 'fs';\r\nimport { join } from 'path';\r\n\r\n// Build <agent-name> builtins modules\r\nconst builtinSrcDir = 'src/builtins';\r\nconst builtinOutDir = '../Assets/Resources/<agent-name>/builtins';\r\n\r\nconst builtinFiles = existsSync(builtinSrcDir)\r\n    ? readdirSync(builtinSrcDir).filter(f =>\r\n        f.endsWith('.mts') && !f.endsWith('.d.mts'))\r\n    : [];\r\n\r\nif (builtinFiles.length > 0) {\r\n    if (!existsSync(builtinOutDir)) {\r\n        mkdirSync(builtinOutDir, { recursive: true });\r\n    }\r\n\r\n    const builtinEntries = builtinFiles.map(f => join(builtinSrcDir, f));\r\n\r\n    await build({\r\n        entryPoints: builtinEntries,\r\n        bundle: true,\r\n        format: 'esm',\r\n        outdir: builtinOutDir,\r\n        outExtension: { '.js': '.mjs' },\r\n        platform: 'neutral',\r\n        target: 'esnext',\r\n        sourcemap: false,\r\n        minify: false,\r\n        keepNames: true,\r\n        external: [],\r\n        define: {\r\n            'process.env.NODE_ENV': '\"production\"',\r\n        },\r\n    });\r\n\r\n    console.log(`[esbuild:<agent-name>] Built ${builtinFiles.length} builtins module(s) → ${builtinOutDir}/`);\r\n} else {\r\n    console.log('[esbuild:<agent-name>] No builtins modules found in src/builtins/');\r\n}\r\n```\r\n\r\n### Setup Steps\r\n\r\nAfter creating the project files:\r\n\r\n1. Run `npm install` in the project directory to install dependencies\r\n2. Write `.mts` source files in `src/builtins/`\r\n3. Run `npm run build` to compile and output `.mjs` files to `Assets/Resources/<agent-name>/builtins/`\r\n4. Run `npm run typecheck` for type checking (optional but recommended)\r\n"},"files":{".codebuddy/skills/puerts_changelogs/SKILL.md":"---\r\nname: puerts_changelogs\r\ndescription: 指引如何为 puerts 项目编写 Unity 和 Unreal 的 changelog\r\n---\r\n\r\n# 编写 PuerTS Changelog 的指引\r\n\r\n## 文件位置\r\n\r\n| 平台 | 英文版 | 中文版 |\r\n|------|--------|--------|\r\n| Unity | `unity/changelog.md` | `unity/changelog-hans.md` |\r\n| Unreal | `unreal/changelog.md` | `unreal/changelog-hans.md` |\r\n\r\n## 操作流程\r\n\r\n### 1. 确定版本范围\r\n\r\n用户会告诉你要更新哪个平台（Unity 或 Unreal）的 changelog。\r\n\r\n- 先读取对应平台的英文版 changelog 文件，找到最新版本号（如 Unity 的 `3.0.1`，Unreal 的 `1.0.9`）。\r\n- 新版本号通常是在最后一位 +1（如 `3.0.1` → `3.0.2`，`1.0.9` → `1.0.10`），但如果用户指定了版本号则以用户为准。\r\n\r\n### 2. 获取两个 tag 之间的 commit\r\n\r\n根据平台确定 tag 命名规则：\r\n- **Unity**：tag 格式为 `Unity_v{版本号}`，例如 `Unity_v3.0.1`\r\n- **Unreal**：tag 格式为 `Unreal_v{版本号}`，例如 `Unreal_v1.0.9`\r\n\r\n执行 git log 获取 commit 列表，**只关注对应平台目录的改动**：\r\n\r\n**Unity 示例**（假设上一版本是 3.0.1，新版本是 3.0.2）：\r\n```bash\r\n# 如果新版本 tag 已存在\r\ngit log Unity_v3.0.1..Unity_v3.0.2 --oneline -- unity/\r\n\r\n# 如果新版本 tag 尚未打，则对比到 master\r\ngit log Unity_v3.0.1..master --oneline -- unity/\r\n```\r\n\r\n**Unreal 示例**（假设上一版本是 1.0.9，新版本是 1.0.10）：\r\n```bash\r\n# 如果新版本 tag 已存在\r\ngit log Unreal_v1.0.9..Unreal_v1.0.10 --oneline -- unreal/\r\n\r\n# 如果新版本 tag 尚未打，则对比到 master\r\ngit log Unreal_v1.0.9..master --oneline -- unreal/\r\n```\r\n\r\n### 3. 筛选和理解 commit\r\n\r\n- 不重要的 commit（如纯格式调整、注释修改、CI 配置等）可以跳过不写。\r\n- changelog 内容应该从**用户影响角度**来写，而不是实现层面的描述。\r\n- 如果从 commit message 无法确定改动的用户影响，应该通过 `git show <commit_hash>` 或 `git diff` 查看具体修改内容来确定。\r\n\r\n### 4. 编写 changelog\r\n\r\n**必须同时编写中文版和英文版**，写到对应的文件中。新版本的内容插入到文件最前面（在文件头部注释之后、旧版本之前）。\r\n\r\n#### Unity changelog 格式\r\n\r\n英文版（`unity/changelog.md`）：\r\n```markdown\r\n## [3.0.2] - 2025-04-01\r\n1. Fixed xxx issue fix #1234\r\n2. Added support for xxx feature (#5678)\r\n3. Optimized xxx performance\r\n```\r\n\r\n中文版（`unity/changelog-hans.md`）：\r\n```markdown\r\n## [3.0.2] - 2025-04-01\r\n1. 修复了 xxx 问题 fix #1234\r\n2. 新增 xxx 功能支持 (#5678)\r\n3. 优化了 xxx 性能\r\n```\r\n\r\n格式要点：\r\n- 标题格式：`## [版本号] - 日期`（日期格式 `YYYY-MM-DD` 或 `YYYY-M-D`）\r\n- 内容使用编号列表 `1. 2. 3. ...`\r\n- 英文版文件头有 `[跳转中文](./changelog-hans.md)` 链接\r\n- 中文版文件头有 `[english version](./changelog.md)` 链接\r\n- 如果 commit 关联了 issue，在条目末尾附上 `fix #issue号` 或 `(#PR号)`\r\n\r\n#### Unreal changelog 格式\r\n\r\n英文版（`unreal/changelog.md`）：\r\n```markdown\r\n### v1.0.10 2025/4/1\r\n\r\n#### New Features\r\n\r\n* Added support for xxx\r\n\r\n#### Optimizations\r\n\r\n* Optimized xxx performance (#1234)\r\n\r\n#### Changes\r\n\r\n* Changed xxx behavior\r\n\r\n#### Bug Fixes\r\n\r\n* Fixed xxx crash issue (fix #5678)\r\n```\r\n\r\n中文版（`unreal/changelog-hans.md`）：\r\n```markdown\r\n### v1.0.10 2025年4月1日\r\n\r\n#### 新增特性\r\n\r\n* 新增 xxx 支持\r\n\r\n#### 优化\r\n\r\n* 优化了 xxx 性能 (#1234)\r\n\r\n#### 变更\r\n\r\n* 变更了 xxx 行为\r\n\r\n#### bug修复\r\n\r\n* 修复了 xxx 崩溃问题 (fix #5678)\r\n```\r\n\r\n格式要点：\r\n- 标题格式：英文版 `### v版本号 YYYY/M/D`，中文版 `### v版本号 YYYY年M月D日`\r\n- 内容按分类组织：`New Features / Optimizations / Changes / Bug Fixes`（中文：`新增特性 / 优化 / 变更 / bug修复`）\r\n- 每个分类使用四级标题 `####`\r\n- 内容使用 `* ` 无序列表\r\n- 如果某个分类没有内容，则省略该分类，不要写空分类\r\n- 如果 commit 关联了 issue，在条目末尾附上 `fix #issue号` 或 `(#PR号)`\r\n\r\n### 5. 写入文件\r\n\r\n将新版本的 changelog 内容插入到对应文件中，位置在文件头部元信息之后、上一个版本之前。确保中英文两个文件都更新。","unity/test/unity/Packages/manifest.json":"{\n  \"dependencies\": {\n    \"com.tencent.puerts.commonjs\": \"file:../../../upms/commonjs\",\n    \"com.tencent.puerts.core\": \"file:../../../upms/core\",\n    \"com.tencent.puerts.lua\": \"file:../../../upms/lua\",\n    \"com.tencent.puerts.nodejs\": \"file:../../../upms/nodejs\",\n    \"com.tencent.puerts.python\": \"file:../../../upms/python\",\n    \"com.tencent.puerts.quickjs\": \"file:../../../upms/quickjs\",\n\t\"com.tencent.puerts.v8\": \"file:../../../upms/v8\",\n    \"com.tencent.puerts.unittest\": \"file:../../Src\",\n    \"com.unity.2d.sprite\": \"1.0.0\",\n    \"com.unity.2d.tilemap\": \"1.0.0\",\n    \"com.unity.ads\": \"3.7.5\",\n    \"com.unity.analytics\": \"3.6.12\",\n    \"com.unity.collab-proxy\": \"2.0.0\",\n    \"com.unity.ide.rider\": \"3.0.18\",\n    \"com.unity.ide.visualstudio\": \"2.0.17\",\n    \"com.unity.ide.vscode\": \"1.2.5\",\n    \"com.unity.purchasing\": \"4.5.2\",\n    \"com.unity.test-framework\": \"1.1.31\",\n    \"com.unity.textmeshpro\": \"3.0.6\",\n    \"com.unity.timeline\": \"1.6.4\",\n    \"com.unity.ugui\": \"1.0.0\",\n    \"com.unity.xr.legacyinputhelpers\": \"2.1.10\",\n    \"com.unity.modules.ai\": \"1.0.0\",\n    \"com.unity.modules.androidjni\": \"1.0.0\",\n    \"com.unity.modules.animation\": \"1.0.0\",\n    \"com.unity.modules.assetbundle\": \"1.0.0\",\n    \"com.unity.modules.audio\": \"1.0.0\",\n    \"com.unity.modules.cloth\": \"1.0.0\",\n    \"com.unity.modules.director\": \"1.0.0\",\n    \"com.unity.modules.imageconversion\": \"1.0.0\",\n    \"com.unity.modules.imgui\": \"1.0.0\",\n    \"com.unity.modules.jsonserialize\": \"1.0.0\",\n    \"com.unity.modules.particlesystem\": \"1.0.0\",\n    \"com.unity.modules.physics\": \"1.0.0\",\n    \"com.unity.modules.physics2d\": \"1.0.0\",\n    \"com.unity.modules.screencapture\": \"1.0.0\",\n    \"com.unity.modules.terrain\": \"1.0.0\",\n    \"com.unity.modules.terrainphysics\": \"1.0.0\",\n    \"com.unity.modules.tilemap\": \"1.0.0\",\n    \"com.unity.modules.ui\": \"1.0.0\",\n    \"com.unity.modules.uielements\": \"1.0.0\",\n    \"com.unity.modules.umbra\": \"1.0.0\",\n    \"com.unity.modules.unityanalytics\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequestassetbundle\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequestaudio\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequesttexture\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequestwww\": \"1.0.0\",\n    \"com.unity.modules.vehicles\": \"1.0.0\",\n    \"com.unity.modules.video\": \"1.0.0\",\n    \"com.unity.modules.vr\": \"1.0.0\",\n    \"com.unity.modules.wind\": \"1.0.0\",\n    \"com.unity.modules.xr\": \"1.0.0\"\n  }\n}\n","unity/skills/install-puerts-for-unity/SKILL.md":"﻿---\r\nname: Install PuerTS for Unity\r\ndescription: Guide for downloading and installing PuerTS UPM packages into a Unity project — covers version selection, package dependencies, download/extract and git URL installation methods, and Editor Assistant setup.\r\n---\r\n\r\n# Install PuerTS for Unity\r\n\r\nThis skill guides you through downloading and installing PuerTS packages into a Unity project.\r\n\r\n> **⚠️ Important**: Always ask the user which PuerTS version they want to install if they haven't specified one. The version number follows the **Core** package's version (e.g., `3.0.2`).\r\n\r\n---\r\n\r\n## 1. Release Page & Version\r\n\r\n- The release download page URL pattern is:\r\n  ```\r\n  https://github.com/Tencent/puerts/releases/tag/Unity_v{VERSION}\r\n  ```\r\n  For example: `https://github.com/Tencent/puerts/releases/tag/Unity_v3.0.2`\r\n\r\n> **⚠️ Important — Version Numbers Inside Archives**: The version number in the release page URL (e.g., `Unity_v3.0.2`) is based on the **Core** package version. However, the version numbers inside each `.tar.gz` filename may differ — each package follows its own versioning cadence. You may need to download/parse the release page HTML to determine the exact filenames available.\r\n\r\n---\r\n\r\n## 2. Available Packages\r\n\r\nEach release page may contain the following `.tar.gz` archives, each corresponding to a UPM package:\r\n\r\n| Archive File | UPM Package | Has Native Plugins | Always Available |\r\n|---|---|---|---|\r\n| `PuerTS_Core_{ver}.tar.gz` | `com.tencent.puerts.core` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Lua_{ver}.tar.gz` | `com.tencent.puerts.lua` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Nodejs_{ver}.tar.gz` | `com.tencent.puerts.nodejs` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Python_{ver}.tar.gz` | `com.tencent.puerts.python` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Quickjs_{ver}.tar.gz` | `com.tencent.puerts.quickjs` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_V8_{ver}.tar.gz` | `com.tencent.puerts.v8` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Webgl_{ver}.tar.gz` | `com.tencent.puerts.webgl` | ❌ No | ✅ Yes |\r\n| `PuerTS_Agent_{ver}.tar.gz` | `com.tencent.puerts.agent` | ❌ No | ❌ Not every release |\r\n| `PuerTS_MCP_{ver}.tar.gz` | `com.tencent.puerts.mcp` | ❌ No | ❌ Not every release |\r\n\r\n### Notable Package Features\r\n\r\n- **`com.tencent.puerts.agent`**: Provides an **Agent framework** for building LLM agents, and also includes an **Agent-based Editor Assistant** for Unity.\r\n- **`com.tencent.puerts.mcp`**: Provides an **MCP (Model Context Protocol) framework**, and also includes an **MCP-based Editor Assistant** for Unity.\r\n\r\n> Both the `agent` and `mcp` packages offer an **Editor Assistant** variant. See Section 5 for how to handle user requests like \"install PuerTS Editor Assistant\".\r\n\r\n---\r\n\r\n## 3. Package Dependencies\r\n\r\n> **⚠️ Important**: Packages have dependency relationships. When a user requests to install a package, you **must** ensure all of its dependencies are also installed.\r\n\r\n### Dependency Rules\r\n\r\n- **`com.tencent.puerts.core`** is the foundational package — **all other packages depend on it**.\r\n- **`com.tencent.puerts.agent`** depends on `com.tencent.puerts.core` + `com.tencent.puerts.v8`\r\n- **`com.tencent.puerts.mcp`** depends on `com.tencent.puerts.core` + `com.tencent.puerts.v8` + `com.tencent.puerts.agent`\r\n- **All backend packages** (`com.tencent.puerts.v8`, `com.tencent.puerts.lua`, `com.tencent.puerts.nodejs`, `com.tencent.puerts.python`, `com.tencent.puerts.quickjs`, `com.tencent.puerts.webgl`) depend on `com.tencent.puerts.core`\r\n\r\n### Dependency Graph\r\n\r\n```\r\ncom.tencent.puerts.core  (required by all)\r\n  ├── com.tencent.puerts.v8\r\n  │     ├── com.tencent.puerts.agent\r\n  │     │     └── com.tencent.puerts.mcp\r\n  │     └── com.tencent.puerts.mcp\r\n  ├── com.tencent.puerts.nodejs\r\n  ├── com.tencent.puerts.lua\r\n  ├── com.tencent.puerts.python\r\n  ├── com.tencent.puerts.quickjs\r\n  └── com.tencent.puerts.webgl\r\n```\r\n\r\n### Examples of Automatic Dependency Resolution\r\n\r\n| User requests to install | Must also install |\r\n|---|---|\r\n| `agent` | `core`, `v8` |\r\n| `mcp` | `core`, `v8`, `agent` |\r\n| `mcp` + `agent` | `core`, `v8` |\r\n| `v8` | `core` |\r\n| `lua` | `core` |\r\n\r\n---\r\n\r\n## 4. Installation Methods\r\n\r\n### 4.1 Download & Extract Method (Required for packages with native plugins)\r\n\r\nThe following packages contain compiled native binary plugins and **must** be installed by downloading from the release page:\r\n\r\n- `com.tencent.puerts.core`\r\n- `com.tencent.puerts.lua`\r\n- `com.tencent.puerts.nodejs`\r\n- `com.tencent.puerts.python`\r\n- `com.tencent.puerts.quickjs`\r\n- `com.tencent.puerts.v8`\r\n\r\n**Steps:**\r\n\r\n1. Go to `https://github.com/Tencent/puerts/releases/tag/Unity_v{VERSION}`\r\n2. Download the required `.tar.gz` file(s) (e.g., `PuerTS_Core_3.0.2.tar.gz`)\r\n3. Extract the archive — it will produce a directory (e.g., `core/`) containing a standard UPM package structure with a `package.json`\r\n4. Move the extracted directory into the Unity project's `Packages/` folder\r\n5. Verify installation by checking `Packages/manifest.json`\r\n\r\n### 4.2 Git URL Method (Available for packages without native plugins)\r\n\r\nThe following packages can also be installed via Unity's **Add package from git URL** method:\r\n\r\n- `com.tencent.puerts.webgl`\r\n- `com.tencent.puerts.agent`\r\n- `com.tencent.puerts.mcp`\r\n\r\n#### When the package **exists** on the release page\r\n\r\nYou can either:\r\n- Use the **Download & Extract** method (Section 4.1), OR\r\n- Use a **versioned git URL** in Unity Package Manager:\r\n  ```\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/{package_name}#Unity_v{VERSION}\r\n  ```\r\n  Examples:\r\n  ```\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/agent#Unity_v3.0.2\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/mcp#Unity_v3.0.2\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/webgl#Unity_v3.0.2\r\n  ```\r\n\r\n#### When the package **does NOT exist** on the release page\r\n\r\nSince `com.tencent.puerts.agent` and `com.tencent.puerts.mcp` are newer packages and not available in every release, if they are missing from the download page, install them using an **unversioned git URL**:\r\n  ```\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/agent\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/mcp\r\n  ```\r\n\r\n#### How to add a git URL in Unity\r\n\r\nAdd the URL to the project's `Packages/manifest.json` under `\"dependencies\"`, for example:\r\n```json\r\n{\r\n  \"dependencies\": {\r\n    \"com.tencent.puerts.agent\": \"https://github.com/Tencent/puerts.git?path=unity/upms/agent#Unity_v3.0.2\"\r\n  }\r\n}\r\n```\r\nOr use the Unity Editor: **Window → Package Manager → + → Add package from git URL...**\r\n\r\n---\r\n\r\n## 5. Installation Workflow\r\n\r\nWhen a user asks to install PuerTS, follow this workflow:\r\n\r\n1. **Ask the user** which version to install (if not already specified)\r\n2. **Ask the user** which packages they need (common combo: `com.tencent.puerts.core` + `com.tencent.puerts.v8` + `com.tencent.puerts.agent`)\r\n3. **Resolve dependencies** — based on the dependency rules in Section 3, automatically include all required dependency packages. Inform the user about the additional packages that will be installed.\r\n\r\n### Editor Assistant Installation Rules\r\n\r\nIf the user requests to **\"install PuerTS Editor Assistant\"** (or similar phrasing like \"安装 puerts 编辑器助手\"), apply the following rules:\r\n\r\n| User Request | Packages to Install |\r\n|---|---|\r\n| \"Install PuerTS Editor Assistant\" (no specific version mentioned) | **Both** `com.tencent.puerts.agent` **and** `com.tencent.puerts.mcp` (plus all their dependencies: `core`, `v8`) |\r\n| \"Install PuerTS Editor Assistant — Agent version\" | Only `com.tencent.puerts.agent` (plus its dependencies: `core`, `v8`) |\r\n| \"Install PuerTS Editor Assistant — MCP version\" | Only `com.tencent.puerts.mcp` (plus its dependencies: `core`, `v8`, `agent`) |\r\n\r\n4. **Check the release page** `https://github.com/Tencent/puerts/releases/tag/Unity_v{VERSION}` to see which archives are available — note that actual filenames in the `.tar.gz` may have different version numbers than the release tag\r\n5. **For packages with native plugins** (`com.tencent.puerts.core`, `com.tencent.puerts.v8`, `com.tencent.puerts.lua`, `com.tencent.puerts.nodejs`, `com.tencent.puerts.python`, `com.tencent.puerts.quickjs`): guide the user to download and extract into `Packages/`\r\n6. **For packages without native plugins** (`com.tencent.puerts.webgl`, `com.tencent.puerts.agent`, `com.tencent.puerts.mcp`):\r\n   - If the `.tar.gz` exists on the release page → offer both download or git URL options\r\n   - If the `.tar.gz` does NOT exist on the release page → use the unversioned git URL\r\n7. **Verify** the installation by checking `Packages/manifest.json` for the expected package entries\r\n\r\n---\r\n\r\n## 6. Verifying Installation\r\n\r\nAfter installation, the following package IDs should appear in `Packages/manifest.json` (depending on which packages were installed):\r\n\r\n- `com.tencent.puerts.core`\r\n- `com.tencent.puerts.v8` (or other backend: `com.tencent.puerts.lua`, `com.tencent.puerts.nodejs`, `com.tencent.puerts.python`, `com.tencent.puerts.quickjs`)\r\n- `com.tencent.puerts.agent`\r\n- `com.tencent.puerts.webgl`\r\n- `com.tencent.puerts.mcp`\r\n\r\n---\r\n\r\n## 7. Known Issues & Troubleshooting (Windows)\r\n\r\n### 7.1 `curl` on Windows is an alias for `Invoke-WebRequest` — use different flags\r\n\r\nOn Windows PowerShell, `curl` is an alias for `Invoke-WebRequest` and does **not** accept standard Unix `curl` flags like `-L`, `--max-time`, `-o`. Use the native PowerShell syntax instead:\r\n\r\n```powershell\r\n# ❌ Wrong — Unix curl flags don't work in PowerShell\r\ncurl -L --max-time 30 -o output.html https://...\r\n\r\n# ✅ Correct — use Invoke-WebRequest with PowerShell parameters\r\nInvoke-WebRequest -Uri \"https://...\" -OutFile \"output.html\" -UseBasicParsing\r\n```\r\n\r\n### 7.2 GitHub API rate limit when unauthenticated\r\n\r\nCalling `https://api.github.com/repos/Tencent/puerts/releases/tags/Unity_v{VERSION}` without authentication will quickly hit GitHub's rate limit (especially on shared IPs). \r\n\r\n**Workaround**: Instead of the API, fetch the **expanded assets HTML fragment** directly — it contains all download links and is not rate-limited:\r\n\r\n```powershell\r\nInvoke-WebRequest -Uri \"https://github.com/Tencent/puerts/releases/expanded_assets/Unity_v{VERSION}\" `\r\n    -OutFile \"assets.html\" -UseBasicParsing\r\n\r\n# Then extract download links with regex:\r\n$content = Get-Content \"assets.html\" -Raw\r\n$matches = [regex]::Matches($content, 'href=\"(/Tencent/puerts/releases/download[^\"]*)\"')\r\n$matches | ForEach-Object { $_.Groups[1].Value }\r\n```\r\n\r\nThis returns the exact filenames (e.g., `PuerTS_Core_3.0.2.tar.gz`) without consuming API quota.\r\n\r\n### 7.3 `Invoke-WebRequest` times out on large files\r\n\r\n`Invoke-WebRequest` can time out when downloading large packages (e.g., `PuerTS_V8` ~74 MB, `PuerTS_Nodejs` ~169 MB).\r\n\r\n**Workaround**: Use `Start-BitsTransfer` instead — it is more reliable for large files and does not time out:\r\n\r\n```powershell\r\nStart-BitsTransfer `\r\n    -Source \"https://github.com/Tencent/puerts/releases/download/Unity_v3.0.2/PuerTS_V8_3.0.2.tar.gz\" `\r\n    -Destination \"C:\\path\\to\\output\\PuerTS_V8_3.0.2.tar.gz\"\r\n```\r\n\r\n### 7.4 Release page HTML does not contain download links (JavaScript-rendered)\r\n\r\nThe main release page (`/releases/tag/Unity_v{VERSION}`) renders asset links via JavaScript — the raw HTML fetched by `Invoke-WebRequest` will **not** contain any `releases/download` links.\r\n\r\n**Solution**: Use the `expanded_assets` endpoint instead (see Section 7.2 above), which returns a static HTML fragment with all asset links.\r\n\r\n### 7.5 `manifest.json` must use `file:` prefix for local packages\r\n\r\nWhen packages are extracted into the `Packages/` directory, `manifest.json` must reference them with the `file:` prefix pointing to the subdirectory name:\r\n\r\n```json\r\n{\r\n  \"dependencies\": {\r\n    \"com.tencent.puerts.core\":   \"file:core\",\r\n    \"com.tencent.puerts.v8\":     \"file:v8\",\r\n    \"com.tencent.puerts.nodejs\": \"file:nodejs\",\r\n    \"com.tencent.puerts.agent\":  \"file:agent\",\r\n    \"com.tencent.puerts.mcp\":    \"file:mcp\"\r\n  }\r\n}\r\n```\r\n\r\nUnity will automatically resolve these local paths when the project is opened.\r\n","unity/test/unity/Packages/packages-lock.json":"{\n  \"dependencies\": {\n    \"com.tencent.puerts.commonjs\": {\n      \"version\": \"file:../../../upms/commonjs\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {}\n    },\n    \"com.tencent.puerts.core\": {\n      \"version\": \"file:../../../upms/core\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {}\n    },\n    \"com.tencent.puerts.lua\": {\n      \"version\": \"file:../../../upms/lua\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.tencent.puerts.nodejs\": {\n      \"version\": \"file:../../../upms/nodejs\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.tencent.puerts.python\": {\n      \"version\": \"file:../../../upms/python\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.tencent.puerts.quickjs\": {\n      \"version\": \"file:../../../upms/quickjs\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.tencent.puerts.unittest\": {\n      \"version\": \"file:../../Src\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {}\n    },\n    \"com.tencent.puerts.v8\": {\n      \"version\": \"file:../../../upms/v8\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.unity.2d.sprite\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.2d.tilemap\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.tilemap\": \"1.0.0\",\n        \"com.unity.modules.uielements\": \"1.0.0\"\n      }\n    },\n    \"com.unity.ads\": {\n      \"version\": \"3.7.5\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.analytics\": {\n      \"version\": \"3.6.12\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.collab-proxy\": {\n      \"version\": \"2.0.0\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ext.nunit\": {\n      \"version\": \"1.0.6\",\n      \"depth\": 1,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ide.rider\": {\n      \"version\": \"3.0.18\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ext.nunit\": \"1.0.6\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ide.visualstudio\": {\n      \"version\": \"2.0.17\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.test-framework\": \"1.1.9\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ide.vscode\": {\n      \"version\": \"1.2.5\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.nuget.newtonsoft-json\": {\n      \"version\": \"3.2.0\",\n      \"depth\": 2,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.purchasing\": {\n      \"version\": \"4.5.2\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\",\n        \"com.unity.modules.unityanalytics\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\",\n        \"com.unity.modules.androidjni\": \"1.0.0\",\n        \"com.unity.services.core\": \"1.3.1\",\n        \"com.unity.services.analytics\": \"4.0.1\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.services.analytics\": {\n      \"version\": \"4.4.0\",\n      \"depth\": 1,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\",\n        \"com.unity.services.core\": \"1.8.1\",\n        \"com.unity.nuget.newtonsoft-json\": \"3.0.2\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.services.core\": {\n      \"version\": \"1.8.2\",\n      \"depth\": 1,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.nuget.newtonsoft-json\": \"3.0.2\",\n        \"com.unity.modules.androidjni\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.test-framework\": {\n      \"version\": \"1.1.31\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ext.nunit\": \"1.0.6\",\n        \"com.unity.modules.imgui\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.textmeshpro\": {\n      \"version\": \"3.0.6\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.timeline\": {\n      \"version\": \"1.6.4\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.modules.director\": \"1.0.0\",\n        \"com.unity.modules.animation\": \"1.0.0\",\n        \"com.unity.modules.audio\": \"1.0.0\",\n        \"com.unity.modules.particlesystem\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ugui\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.ui\": \"1.0.0\",\n        \"com.unity.modules.imgui\": \"1.0.0\"\n      }\n    },\n    \"com.unity.xr.legacyinputhelpers\": {\n      \"version\": \"2.1.10\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.modules.vr\": \"1.0.0\",\n        \"com.unity.modules.xr\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.modules.ai\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.androidjni\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.animation\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.assetbundle\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.audio\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.cloth\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.director\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.audio\": \"1.0.0\",\n        \"com.unity.modules.animation\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.imageconversion\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.imgui\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.jsonserialize\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.particlesystem\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.physics\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.physics2d\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.screencapture\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.imageconversion\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.subsystems\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 1,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.terrain\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.terrainphysics\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\",\n        \"com.unity.modules.terrain\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.tilemap\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics2d\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.ui\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.uielements\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.ui\": \"1.0.0\",\n        \"com.unity.modules.imgui\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.umbra\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.unityanalytics\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequest\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.unitywebrequestassetbundle\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.assetbundle\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequestaudio\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.audio\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequesttexture\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.imageconversion\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequestwww\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequestassetbundle\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequestaudio\": \"1.0.0\",\n        \"com.unity.modules.audio\": \"1.0.0\",\n        \"com.unity.modules.assetbundle\": \"1.0.0\",\n        \"com.unity.modules.imageconversion\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.vehicles\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.video\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.audio\": \"1.0.0\",\n        \"com.unity.modules.ui\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.vr\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.jsonserialize\": \"1.0.0\",\n        \"com.unity.modules.physics\": \"1.0.0\",\n        \"com.unity.modules.xr\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.wind\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.xr\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\",\n        \"com.unity.modules.subsystems\": \"1.0.0\"\n      }\n    }\n  }\n}\n","unity/skills/puerts-agent-development/SKILL.md":"﻿---\r\nname: PuerTS Agent Development Guide\r\ndescription: Guide for developing LLM agents based on PuerTsAgent framework — covers resource directory structure, system-prompt, skills, builtin modules, and best practices.\r\n---\r\n\r\n# PuerTS Agent Development Guide\r\n\r\nThis skill provides the complete guide for developing LLM agents based on the PuerTsAgent framework.\r\n\r\n> **⚠️ Important — Required Packages**: This framework depends on PuerTS **core**, **v8**, and **agent** packages. Before proceeding, you **must** check the Unity project's `Packages/manifest.json` to verify that the following packages are installed:\r\n> - `com.tencent.puerts.core`\r\n> - `com.tencent.puerts.v8`\r\n> - `com.tencent.puerts.agent`\r\n>\r\n> If any of these packages are missing, they must be installed first before using this skill. you MUST first invoke the **\"Install PuerTS for Unity\"** skill to AUTO complete the setup.\r\n\r\n> **⚠️ Prerequisite**: Before using this skill to create or modify an agent, you **must** know the agent's resource directory path under Unity `Resources/` (e.g., `maze-runner`, `editor-assistant`). If the user has not provided this path, **ask the user** which `Resources/` subdirectory to use before proceeding. All agent files (system-prompt, skills, builtins) are organized under this path.\r\n\r\n> **⚠️ Builtin Language Choice**: When creating builtin modules, you **must ask the user** whether they want to write builtins in **TypeScript** or **JavaScript**:\r\n> - **TypeScript** → Create a dedicated TS project (with `package.json`, `tsconfig.json`, `esbuild.mjs`) whose build output (`outdir`) points to `Assets/Resources/<agent-name>/builtins/`. See [TypeScript Project Setup for Builtins](#typescript-project-setup-for-builtins) section below.\r\n> - **JavaScript** → Write `.mjs` files directly in `Assets/Resources/<agent-name>/builtins/`.\r\n\r\n## Overview\r\n\r\nIn this framework, an agent's behavior and capabilities are entirely defined by files in a **resource directory** (Resource Root). Different resource directories represent different agents — Unity editor assistants, in-game AI characters, or any role you need.\r\n\r\n> **Key Concept**: Both `system-prompt.md.txt` and files under `skills/` are essentially **prompts** (natural language instructions for the LLM). The only difference is their **loading strategy**:\r\n> - **`system-prompt.md.txt`** — Always present in context (persistent). Put prompts here that are needed for **most tasks**.\r\n> - **`skills/*.md.txt`** — Loaded on demand by the LLM via `loadSkill`. Put prompts here that are **not needed for every task** — they are loaded only when the LLM determines they are relevant.\r\n\r\n## Creating an Agent\r\n\r\nInitialize an agent in C# via its resource path:\r\n\r\n```csharp\r\nvar agent = new AgentScriptManager();\r\nagent.Initialize(\"maze-runner\", () =>\r\n{\r\n    Debug.Log(\"Maze runner agent is ready!\");\r\n});\r\n```\r\n\r\nThe first parameter of `Initialize` is the resource directory path under Unity `Resources/`. The framework loads the full agent definition from this directory:\r\n\r\n- **`system-prompt.md.txt`** — Role definition (System Prompt)\r\n- **`skills/`** — Domain skill documents (loaded on demand, optional)\r\n- **`builtins/`** — Built-in helper modules (executable JS modules)\r\n\r\n### Example Directory Structure\r\n\r\n```\r\nResources/maze-runner/\r\n├── system-prompt.md.txt          # Role definition (System Prompt)\r\n├── skills/                       # Domain skills (loaded on demand, optional)\r\n└── builtins/                     # Built-in modules (loaded on demand)\r\n    ├── maze-control.mjs          # Maze movement and status query\r\n    └── screenshot.mjs            # Screenshot to observe the maze\r\n```\r\n\r\nAll resource files are placed in Unity's `Resources/` directory.\r\n\r\n> **File extension convention**: Unity `Resources` does not support `.md` and `.mjs` as TextAsset, so:\r\n> - Markdown files use `.md.txt` suffix\r\n> - JS module files use `.mjs` suffix\r\n\r\n---\r\n\r\n## 1. System Prompt — Role Definition\r\n\r\n### Purpose\r\n\r\n`system-prompt.md.txt` defines the agent's identity, personality, capabilities, and behavioral rules. It is injected at the beginning of the LLM's system prompt and is the core of the agent's \"persona.\"\r\n\r\n> **This is a persistent prompt** — it is always present in the LLM's context for every conversation turn. Therefore, put only the most frequently used instructions here — things the agent needs for the **majority** of its tasks. Avoid stuffing rarely-used domain knowledge here, as it permanently consumes context tokens.\r\n\r\n### File Location\r\n\r\n```text\r\n<resource-root>/system-prompt.md.txt\r\n```\r\n\r\n### Format\r\n\r\nPlain text / Markdown format, write role definition directly, no front-matter needed.\r\n\r\n### Example — Editor Assistant\r\n\r\n```markdown\r\nYou are a helpful AI assistant running inside Unity via PuerTS (a TypeScript/JavaScript runtime for Unity). You can help with game development, scripting, and general questions. Be concise and practical.\r\n```\r\n\r\n### Example — Maze AI (excerpt)\r\n\r\n```markdown\r\nYou are a Maze Explorer AI — an intelligent agent that navigates through 3D mazes by observing, reasoning, and acting.\r\n\r\n## Your Capabilities\r\n\r\nYou can control a player character in a 3D maze using two builtin modules:\r\n- **maze-control**: Move in compass directions (north/south/east/west) with `movePath()` and query obstacle distances with `getPlayerStatus()`\r\n- **screenshot**: Capture the game view to visually observe the maze\r\n\r\n## Goal Description\r\n\r\nYour goal is to reach the **maze exit marker** — a tall RED pillar with a bright RED glowing ring.\r\n```\r\n\r\n> The System Prompt describes the AI's identity, available modules, goals, exploration loops, navigation rules, etc. It can be lengthy — it defines the AI's behavior pattern throughout the task.\r\n\r\n---\r\n\r\n## 2. Skills — Domain Skills\r\n\r\n### Purpose\r\n\r\nA Skill is an **on-demand loaded** Markdown document providing domain-specific operation guides and rules for the LLM. The LLM actively loads skills into context via the `loadSkill` tool when needed.\r\n\r\n> **Skills are prompts too** — just like `system-prompt.md.txt`, they are natural language instructions. The key difference is that skills are **not always in context**. If a piece of knowledge is not needed for most tasks the agent handles, it belongs in a skill file rather than in the system prompt. This keeps the base context lean while still making specialized knowledge available when the LLM needs it.\r\n\r\n### File Location\r\n\r\n```text\r\n<resource-root>/skills/<skill-name>.md.txt\r\n```\r\n\r\n### File Format\r\n\r\nSkill files use **YAML front-matter** for metadata, body is Markdown content:\r\n\r\n```yaml\r\n---\r\nname: <skill-id>\r\ndescription: \"<one-line description shown to the LLM>\"\r\n---\r\n\r\n(Markdown body — the actual skill instructions)\r\n```\r\n\r\n| Front-matter Field | Required | Description |\r\n|---|---|---|\r\n| `name` | ✅ | Unique identifier, LLM calls `loadSkill` with this name |\r\n| `description` | ❌ | Short description shown in `loadSkill` available skills list |\r\n\r\n### Example\r\n\r\n`skills/puerts-interop.md.txt`:\r\n\r\n```yaml\r\n---\r\nname: puerts-interop\r\ndescription: \"PuerTS JS ↔ C# interop rules: CS/puer globals, out/ref params, generics, operators, Array/List indexer access, async/Task.\"\r\n---\r\n\r\n## PuerTS: JS ↔ C# Interop Rules\r\n...\r\n```\r\n\r\n### Design Tips\r\n\r\n- **description should be accurate**: LLM decides whether to load based on description\r\n- **content should be thorough**: skill docs are the LLM's only reference for specific tasks\r\n- **one domain per skill**: keep responsibilities single for precise loading\r\n- **system-prompt vs skill decision rule**: If the agent needs this knowledge in >80% of tasks → put it in `system-prompt.md.txt`. Otherwise → put it in `skills/` for on-demand loading\r\n\r\n---\r\n\r\n## 3. Builtin — Built-in Helper Modules\r\n\r\n### Purpose\r\n\r\nBuiltin modules are JavaScript modules providing pre-built helper functions for the LLM's `evalJsCode` tool. Unlike Skills, Builtins are actually executable code, not documentation.\r\n\r\n### File Location\r\n\r\n```text\r\n<resource-root>/builtins/<module-name>.mjs\r\n```\r\n\r\n> Source code can use TypeScript, JavaScript, or any language compilable to `.mjs`. The framework only cares about the final `.mjs` files in the resource directory.\r\n\r\n### Module Contract\r\n\r\nEvery Builtin module must export the following two string constants:\r\n\r\n| Export | Type | Description |\r\n|---|---|---|\r\n| `summary` | `string` | Short summary (~one line), always shown in `evalJsCode` tool description |\r\n| `description` | `string` | Detailed function signatures and usage, LLM reads via `import()` |\r\n\r\nAdditionally, the module's exported functions are the actual capabilities the LLM can call in `evalJsCode`.\r\n\r\n### Example — `builtins/unity-log.mjs` (shown as TypeScript source)\r\n\r\n```typescript\r\n// ---- Summary for tool description (always in context) ----\r\nexport const summary = `**unity-log** — Unity console log access (retrieve and summarize recent logs). Read \\`.description\\` to see available functions and their signatures.`;\r\n\r\n// ---- Description for on-demand access via import ----\r\nexport const description = `\r\n- **\\`getUnityLogs(count?, logType?)\\`** — Get recent Unity console logs.\r\n  - \\`count\\` (number, default 20): Number of log entries to retrieve (1-50).\r\n  - \\`logType\\` (string, default \\`'all'\\`): Filter by type — \\`'all'\\`, \\`'error'\\`, \\`'warning'\\`, or \\`'log'\\`.\r\n  - Returns an array of log entry objects: \\`{ timestamp, type, message, stackTrace? }\\`.\r\n`.trim();\r\n\r\n// ---- Function implementations ----\r\nexport function getUnityLogs(count: number = 20, logType: string = 'all'): LogEntry[] {\r\n    const logsJson = CS.LLMAgent.UnityLogBridge.GetRecentLogs(count, logType);\r\n    return JSON.parse(logsJson);\r\n}\r\n```\r\n\r\n### Example — `builtins/maze-control.mjs` (TypeScript source, excerpt)\r\n\r\n```typescript\r\nexport const summary = `**maze-control** — Control the player in the maze. \\`movePath([{dir, steps}, ...])\\` executes a multi-segment path. \\`getPlayerStatus()\\` returns position and obstacle distances. Read \\`.description\\` for details.`;\r\n\r\nexport const description = `\r\n- **\\`movePath(segments)\\`** — Move the player along a multi-segment planned path.\r\n  - \\`segments\\` (array): Array of \\`{ dir: string, steps: number }\\`.\r\n  - Returns: \\`{ success, stepsCompleted, blocked, reachedGoal, position, message }\\`\r\n- **\\`getPlayerStatus()\\`** — Get the player's position and obstacle distances.\r\n  - Returns: \\`{ position, northDistance, southDistance, eastDistance, westDistance, reachedGoal }\\`\r\n`.trim();\r\n\r\nexport async function movePath(segments: PathSegment[]): Promise<MoveSequenceResult> {\r\n    const directionsJson = JSON.stringify(segments.map(s => s.dir));\r\n    const distancesJson = JSON.stringify(segments.map(s => s.steps));\r\n    const resultJson = await new Promise<string>((resolve, reject) => {\r\n        CS.LLMAgent.MazePlayerBridge.MoveSequenceV2(directionsJson, distancesJson, (json: string) => resolve(json));\r\n    });\r\n    return JSON.parse(resultJson);\r\n}\r\n\r\nexport async function getPlayerStatus(): Promise<PlayerStatusResult> {\r\n    const resultJson = await new Promise<string>((resolve, reject) => {\r\n        CS.LLMAgent.MazePlayerBridge.GetPlayerStatus((json: string) => resolve(json));\r\n    });\r\n    return JSON.parse(resultJson);\r\n}\r\n```\r\n\r\n### Design Tips\r\n\r\n- **summary should be brief**: it always consumes tokens, just convey the module's purpose\r\n- **description must list complete signatures**: LLM must read description before calling functions\r\n- **functions should validate parameters**: LLM may pass incorrect params, validate and throw meaningful errors\r\n- **top-level await is supported**: modules can use `await` at top level (e.g., async initialization)\r\n- C# bridge classes must be pre-implemented on the Unity side\r\n\r\n---\r\n\r\n## 4. Complete Development Workflow\r\n\r\n### Step 1: Create Resource Directory\r\n\r\n```\r\nResources/<agent-name>/\r\n├── system-prompt.md.txt\r\n├── skills/\r\n└── builtins/\r\n```\r\n\r\n### Step 2: Write Role Definition\r\n\r\nEdit `system-prompt.md.txt` to define the AI's identity and behavioral rules. For example, a maze AI should describe:\r\n- Role identity (maze explorer)\r\n- Available modules (maze-control, screenshot)\r\n- Goal (reach the red exit marker)\r\n- Exploration loop (observe → plan → act)\r\n- Navigation strategy (right-hand rule, dead-end detection, etc.)\r\n\r\n### Step 3: Write Domain Skills (Optional)\r\n\r\nCreate `.md.txt` files in the `skills/` directory with YAML front-matter and skill content.\r\n\r\n> The Maze Demo doesn't use skill files — all navigation rules are directly in system-prompt. When domain knowledge is extensive and doesn't need to be loaded every time, splitting into skills is more appropriate.\r\n\r\n### Step 4: Write Helper Modules\r\n\r\nFirst, ask the user whether to write builtins in **TypeScript** or **JavaScript**:\r\n\r\n- **TypeScript**: Create a dedicated TS project following the [TypeScript Project Setup for Builtins](#typescript-project-setup-for-builtins) template (Section 6). The project's build output will automatically go to `Resources/<agent-name>/builtins/`.\r\n- **JavaScript**: Write `.mjs` files directly in `Assets/Resources/<agent-name>/builtins/`.\r\n\r\n### Step 5: Initialize the Agent\r\n\r\nIn C# code, initialize the agent with the corresponding resource path (see \"Creating an Agent\" section above).\r\n\r\n---\r\n\r\n## 5. Best Practices\r\n\r\n### System Prompt\r\n- Keep it concise and clear, avoid excessive length (it always consumes context tokens)\r\n- Focus on \"who you are\" and \"what you should do\", don't include framework runtime details\r\n- Only include prompts needed for the **majority** of tasks — this is always-on context\r\n\r\n### Skills\r\n- Split complex domain knowledge into separate skill files\r\n- Include keywords in description to help LLM decide when to load\r\n- The more detailed the better — this is the LLM's only reference for the task\r\n- Remember: skills and system-prompt are both prompts; the difference is persistent vs on-demand loading\r\n\r\n### Builtins\r\n- Each module focuses on one functional area (e.g., scene operations, log queries)\r\n- Summary should be one line, description must list all function signatures completely\r\n- All exported functions should validate parameters and throw meaningful errors\r\n\r\n### General\r\n- One resource directory = one independent agent role\r\n- Different agents are completely isolated, can have entirely different skills and toolsets\r\n\r\n---\r\n\r\n## 6. TypeScript Project Setup for Builtins\r\n\r\nWhen the user chooses TypeScript for builtins, create a dedicated TS project with the following structure and files. Replace `<agent-name>` with the actual agent name (e.g., `maze-runner`).\r\n\r\n### Project Structure\r\n\r\n```\r\nTs<AgentNamePascalCase>/          # e.g., TsMazeRunner/\r\n├── package.json\r\n├── tsconfig.json\r\n├── esbuild.mjs                   # Build script — outputs to Resources/<agent-name>/builtins/\r\n└── src/\r\n    └── builtins/\r\n        └── <module-name>.mts     # TypeScript source files\r\n```\r\n\r\n### package.json Template\r\n\r\n```json\r\n{\r\n  \"name\": \"<agent-name>\",\r\n  \"version\": \"1.0.0\",\r\n  \"description\": \"<Agent description> - TypeScript builtins\",\r\n  \"private\": true,\r\n  \"scripts\": {\r\n    \"build\": \"node esbuild.mjs\",\r\n    \"typecheck\": \"tsc --noEmit\"\r\n  },\r\n  \"devDependencies\": {\r\n    \"esbuild\": \"^0.25.0\",\r\n    \"typescript\": \"^5.4.0\"\r\n  }\r\n}\r\n```\r\n\r\n### tsconfig.json Template\r\n\r\n```json\r\n{\r\n  \"compilerOptions\": {\r\n    \"target\": \"esnext\",\r\n    \"module\": \"nodenext\",\r\n    \"moduleResolution\": \"nodenext\",\r\n    \"rootDir\": \"src\",\r\n    \"strict\": true,\r\n    \"esModuleInterop\": true,\r\n    \"skipLibCheck\": true,\r\n    \"forceConsistentCasingInFileNames\": true,\r\n    \"declaration\": false,\r\n    \"sourceMap\": false,\r\n    \"noEmit\": true,\r\n    \"typeRoots\": [\"../Assets/Gen/Typing\", \"../puerts/unity/upms/core/Typing\"]\r\n  },\r\n  \"include\": [\"src/**/*.mts\", \"src/**/*.d.ts\", \"../Assets/Gen/Typing/csharp/index.d.ts\"],\r\n  \"exclude\": [\"node_modules\"]\r\n}\r\n```\r\n\r\n### esbuild.mjs Template\r\n\r\n```javascript\r\nimport { build } from 'esbuild';\r\nimport { readdirSync, mkdirSync, existsSync } from 'fs';\r\nimport { join } from 'path';\r\n\r\n// Build <agent-name> builtins modules\r\nconst builtinSrcDir = 'src/builtins';\r\nconst builtinOutDir = '../Assets/Resources/<agent-name>/builtins';\r\n\r\nconst builtinFiles = existsSync(builtinSrcDir)\r\n    ? readdirSync(builtinSrcDir).filter(f =>\r\n        f.endsWith('.mts') && !f.endsWith('.d.mts'))\r\n    : [];\r\n\r\nif (builtinFiles.length > 0) {\r\n    if (!existsSync(builtinOutDir)) {\r\n        mkdirSync(builtinOutDir, { recursive: true });\r\n    }\r\n\r\n    const builtinEntries = builtinFiles.map(f => join(builtinSrcDir, f));\r\n\r\n    await build({\r\n        entryPoints: builtinEntries,\r\n        bundle: true,\r\n        format: 'esm',\r\n        outdir: builtinOutDir,\r\n        outExtension: { '.js': '.mjs' },\r\n        platform: 'neutral',\r\n        target: 'esnext',\r\n        sourcemap: false,\r\n        minify: false,\r\n        keepNames: true,\r\n        external: [],\r\n        define: {\r\n            'process.env.NODE_ENV': '\"production\"',\r\n        },\r\n    });\r\n\r\n    console.log(`[esbuild:<agent-name>] Built ${builtinFiles.length} builtins module(s) → ${builtinOutDir}/`);\r\n} else {\r\n    console.log('[esbuild:<agent-name>] No builtins modules found in src/builtins/');\r\n}\r\n```\r\n\r\n### Setup Steps\r\n\r\nAfter creating the project files:\r\n\r\n1. Run `npm install` in the project directory to install dependencies\r\n2. Write `.mts` source files in `src/builtins/`\r\n3. Run `npm run build` to compile and output `.mjs` files to `Assets/Resources/<agent-name>/builtins/`\r\n4. Run `npm run typecheck` for type checking (optional but recommended)\r\n"},"items":[{"name":"SKILL.md","path":".codebuddy/skills/puerts_changelogs/SKILL.md","rawUrl":"https://raw.githubusercontent.com/Tencent/puerts/HEAD/.codebuddy/skills/puerts_changelogs/SKILL.md","title":"puerts_changelogs","category":"anthropic-skill","format":"markdown","content":"---\r\nname: puerts_changelogs\r\ndescription: 指引如何为 puerts 项目编写 Unity 和 Unreal 的 changelog\r\n---\r\n\r\n# 编写 PuerTS Changelog 的指引\r\n\r\n## 文件位置\r\n\r\n| 平台 | 英文版 | 中文版 |\r\n|------|--------|--------|\r\n| Unity | `unity/changelog.md` | `unity/changelog-hans.md` |\r\n| Unreal | `unreal/changelog.md` | `unreal/changelog-hans.md` |\r\n\r\n## 操作流程\r\n\r\n### 1. 确定版本范围\r\n\r\n用户会告诉你要更新哪个平台（Unity 或 Unreal）的 changelog。\r\n\r\n- 先读取对应平台的英文版 changelog 文件，找到最新版本号（如 Unity 的 `3.0.1`，Unreal 的 `1.0.9`）。\r\n- 新版本号通常是在最后一位 +1（如 `3.0.1` → `3.0.2`，`1.0.9` → `1.0.10`），但如果用户指定了版本号则以用户为准。\r\n\r\n### 2. 获取两个 tag 之间的 commit\r\n\r\n根据平台确定 tag 命名规则：\r\n- **Unity**：tag 格式为 `Unity_v{版本号}`，例如 `Unity_v3.0.1`\r\n- **Unreal**：tag 格式为 `Unreal_v{版本号}`，例如 `Unreal_v1.0.9`\r\n\r\n执行 git log 获取 commit 列表，**只关注对应平台目录的改动**：\r\n\r\n**Unity 示例**（假设上一版本是 3.0.1，新版本是 3.0.2）：\r\n```bash\r\n# 如果新版本 tag 已存在\r\ngit log Unity_v3.0.1..Unity_v3.0.2 --oneline -- unity/\r\n\r\n# 如果新版本 tag 尚未打，则对比到 master\r\ngit log Unity_v3.0.1..master --oneline -- unity/\r\n```\r\n\r\n**Unreal 示例**（假设上一版本是 1.0.9，新版本是 1.0.10）：\r\n```bash\r\n# 如果新版本 tag 已存在\r\ngit log Unreal_v1.0.9..Unreal_v1.0.10 --oneline -- unreal/\r\n\r\n# 如果新版本 tag 尚未打，则对比到 master\r\ngit log Unreal_v1.0.9..master --oneline -- unreal/\r\n```\r\n\r\n### 3. 筛选和理解 commit\r\n\r\n- 不重要的 commit（如纯格式调整、注释修改、CI 配置等）可以跳过不写。\r\n- changelog 内容应该从**用户影响角度**来写，而不是实现层面的描述。\r\n- 如果从 commit message 无法确定改动的用户影响，应该通过 `git show <commit_hash>` 或 `git diff` 查看具体修改内容来确定。\r\n\r\n### 4. 编写 changelog\r\n\r\n**必须同时编写中文版和英文版**，写到对应的文件中。新版本的内容插入到文件最前面（在文件头部注释之后、旧版本之前）。\r\n\r\n#### Unity changelog 格式\r\n\r\n英文版（`unity/changelog.md`）：\r\n```markdown\r\n## [3.0.2] - 2025-04-01\r\n1. Fixed xxx issue fix #1234\r\n2. Added support for xxx feature (#5678)\r\n3. Optimized xxx performance\r\n```\r\n\r\n中文版（`unity/changelog-hans.md`）：\r\n```markdown\r\n## [3.0.2] - 2025-04-01\r\n1. 修复了 xxx 问题 fix #1234\r\n2. 新增 xxx 功能支持 (#5678)\r\n3. 优化了 xxx 性能\r\n```\r\n\r\n格式要点：\r\n- 标题格式：`## [版本号] - 日期`（日期格式 `YYYY-MM-DD` 或 `YYYY-M-D`）\r\n- 内容使用编号列表 `1. 2. 3. ...`\r\n- 英文版文件头有 `[跳转中文](./changelog-hans.md)` 链接\r\n- 中文版文件头有 `[english version](./changelog.md)` 链接\r\n- 如果 commit 关联了 issue，在条目末尾附上 `fix #issue号` 或 `(#PR号)`\r\n\r\n#### Unreal changelog 格式\r\n\r\n英文版（`unreal/changelog.md`）：\r\n```markdown\r\n### v1.0.10 2025/4/1\r\n\r\n#### New Features\r\n\r\n* Added support for xxx\r\n\r\n#### Optimizations\r\n\r\n* Optimized xxx performance (#1234)\r\n\r\n#### Changes\r\n\r\n* Changed xxx behavior\r\n\r\n#### Bug Fixes\r\n\r\n* Fixed xxx crash issue (fix #5678)\r\n```\r\n\r\n中文版（`unreal/changelog-hans.md`）：\r\n```markdown\r\n### v1.0.10 2025年4月1日\r\n\r\n#### 新增特性\r\n\r\n* 新增 xxx 支持\r\n\r\n#### 优化\r\n\r\n* 优化了 xxx 性能 (#1234)\r\n\r\n#### 变更\r\n\r\n* 变更了 xxx 行为\r\n\r\n#### bug修复\r\n\r\n* 修复了 xxx 崩溃问题 (fix #5678)\r\n```\r\n\r\n格式要点：\r\n- 标题格式：英文版 `### v版本号 YYYY/M/D`，中文版 `### v版本号 YYYY年M月D日`\r\n- 内容按分类组织：`New Features / Optimizations / Changes / Bug Fixes`（中文：`新增特性 / 优化 / 变更 / bug修复`）\r\n- 每个分类使用四级标题 `####`\r\n- 内容使用 `* ` 无序列表\r\n- 如果某个分类没有内容，则省略该分类，不要写空分类\r\n- 如果 commit 关联了 issue，在条目末尾附上 `fix #issue号` 或 `(#PR号)`\r\n\r\n### 5. 写入文件\r\n\r\n将新版本的 changelog 内容插入到对应文件中，位置在文件头部元信息之后、上一个版本之前。确保中英文两个文件都更新。","frontmatter":{"name":"puerts_changelogs","description":"指引如何为 puerts 项目编写 Unity 和 Unreal 的 changelog"},"isInternal":false,"tokens":1449,"sizeBytes":4341},{"name":"SKILL.md","path":"unity/skills/install-puerts-for-unity/SKILL.md","rawUrl":"https://raw.githubusercontent.com/Tencent/puerts/HEAD/unity/skills/install-puerts-for-unity/SKILL.md","title":"install-puerts-for-unity","category":"anthropic-skill","format":"markdown","content":"﻿---\r\nname: Install PuerTS for Unity\r\ndescription: Guide for downloading and installing PuerTS UPM packages into a Unity project — covers version selection, package dependencies, download/extract and git URL installation methods, and Editor Assistant setup.\r\n---\r\n\r\n# Install PuerTS for Unity\r\n\r\nThis skill guides you through downloading and installing PuerTS packages into a Unity project.\r\n\r\n> **⚠️ Important**: Always ask the user which PuerTS version they want to install if they haven't specified one. The version number follows the **Core** package's version (e.g., `3.0.2`).\r\n\r\n---\r\n\r\n## 1. Release Page & Version\r\n\r\n- The release download page URL pattern is:\r\n  ```\r\n  https://github.com/Tencent/puerts/releases/tag/Unity_v{VERSION}\r\n  ```\r\n  For example: `https://github.com/Tencent/puerts/releases/tag/Unity_v3.0.2`\r\n\r\n> **⚠️ Important — Version Numbers Inside Archives**: The version number in the release page URL (e.g., `Unity_v3.0.2`) is based on the **Core** package version. However, the version numbers inside each `.tar.gz` filename may differ — each package follows its own versioning cadence. You may need to download/parse the release page HTML to determine the exact filenames available.\r\n\r\n---\r\n\r\n## 2. Available Packages\r\n\r\nEach release page may contain the following `.tar.gz` archives, each corresponding to a UPM package:\r\n\r\n| Archive File | UPM Package | Has Native Plugins | Always Available |\r\n|---|---|---|---|\r\n| `PuerTS_Core_{ver}.tar.gz` | `com.tencent.puerts.core` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Lua_{ver}.tar.gz` | `com.tencent.puerts.lua` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Nodejs_{ver}.tar.gz` | `com.tencent.puerts.nodejs` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Python_{ver}.tar.gz` | `com.tencent.puerts.python` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Quickjs_{ver}.tar.gz` | `com.tencent.puerts.quickjs` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_V8_{ver}.tar.gz` | `com.tencent.puerts.v8` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Webgl_{ver}.tar.gz` | `com.tencent.puerts.webgl` | ❌ No | ✅ Yes |\r\n| `PuerTS_Agent_{ver}.tar.gz` | `com.tencent.puerts.agent` | ❌ No | ❌ Not every release |\r\n| `PuerTS_MCP_{ver}.tar.gz` | `com.tencent.puerts.mcp` | ❌ No | ❌ Not every release |\r\n\r\n### Notable Package Features\r\n\r\n- **`com.tencent.puerts.agent`**: Provides an **Agent framework** for building LLM agents, and also includes an **Agent-based Editor Assistant** for Unity.\r\n- **`com.tencent.puerts.mcp`**: Provides an **MCP (Model Context Protocol) framework**, and also includes an **MCP-based Editor Assistant** for Unity.\r\n\r\n> Both the `agent` and `mcp` packages offer an **Editor Assistant** variant. See Section 5 for how to handle user requests like \"install PuerTS Editor Assistant\".\r\n\r\n---\r\n\r\n## 3. Package Dependencies\r\n\r\n> **⚠️ Important**: Packages have dependency relationships. When a user requests to install a package, you **must** ensure all of its dependencies are also installed.\r\n\r\n### Dependency Rules\r\n\r\n- **`com.tencent.puerts.core`** is the foundational package — **all other packages depend on it**.\r\n- **`com.tencent.puerts.agent`** depends on `com.tencent.puerts.core` + `com.tencent.puerts.v8`\r\n- **`com.tencent.puerts.mcp`** depends on `com.tencent.puerts.core` + `com.tencent.puerts.v8` + `com.tencent.puerts.agent`\r\n- **All backend packages** (`com.tencent.puerts.v8`, `com.tencent.puerts.lua`, `com.tencent.puerts.nodejs`, `com.tencent.puerts.python`, `com.tencent.puerts.quickjs`, `com.tencent.puerts.webgl`) depend on `com.tencent.puerts.core`\r\n\r\n### Dependency Graph\r\n\r\n```\r\ncom.tencent.puerts.core  (required by all)\r\n  ├── com.tencent.puerts.v8\r\n  │     ├── com.tencent.puerts.agent\r\n  │     │     └── com.tencent.puerts.mcp\r\n  │     └── com.tencent.puerts.mcp\r\n  ├── com.tencent.puerts.nodejs\r\n  ├── com.tencent.puerts.lua\r\n  ├── com.tencent.puerts.python\r\n  ├── com.tencent.puerts.quickjs\r\n  └── com.tencent.puerts.webgl\r\n```\r\n\r\n### Examples of Automatic Dependency Resolution\r\n\r\n| User requests to install | Must also install |\r\n|---|---|\r\n| `agent` | `core`, `v8` |\r\n| `mcp` | `core`, `v8`, `agent` |\r\n| `mcp` + `agent` | `core`, `v8` |\r\n| `v8` | `core` |\r\n| `lua` | `core` |\r\n\r\n---\r\n\r\n## 4. Installation Methods\r\n\r\n### 4.1 Download & Extract Method (Required for packages with native plugins)\r\n\r\nThe following packages contain compiled native binary plugins and **must** be installed by downloading from the release page:\r\n\r\n- `com.tencent.puerts.core`\r\n- `com.tencent.puerts.lua`\r\n- `com.tencent.puerts.nodejs`\r\n- `com.tencent.puerts.python`\r\n- `com.tencent.puerts.quickjs`\r\n- `com.tencent.puerts.v8`\r\n\r\n**Steps:**\r\n\r\n1. Go to `https://github.com/Tencent/puerts/releases/tag/Unity_v{VERSION}`\r\n2. Download the required `.tar.gz` file(s) (e.g., `PuerTS_Core_3.0.2.tar.gz`)\r\n3. Extract the archive — it will produce a directory (e.g., `core/`) containing a standard UPM package structure with a `package.json`\r\n4. Move the extracted directory into the Unity project's `Packages/` folder\r\n5. Verify installation by checking `Packages/manifest.json`\r\n\r\n### 4.2 Git URL Method (Available for packages without native plugins)\r\n\r\nThe following packages can also be installed via Unity's **Add package from git URL** method:\r\n\r\n- `com.tencent.puerts.webgl`\r\n- `com.tencent.puerts.agent`\r\n- `com.tencent.puerts.mcp`\r\n\r\n#### When the package **exists** on the release page\r\n\r\nYou can either:\r\n- Use the **Download & Extract** method (Section 4.1), OR\r\n- Use a **versioned git URL** in Unity Package Manager:\r\n  ```\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/{package_name}#Unity_v{VERSION}\r\n  ```\r\n  Examples:\r\n  ```\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/agent#Unity_v3.0.2\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/mcp#Unity_v3.0.2\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/webgl#Unity_v3.0.2\r\n  ```\r\n\r\n#### When the package **does NOT exist** on the release page\r\n\r\nSince `com.tencent.puerts.agent` and `com.tencent.puerts.mcp` are newer packages and not available in every release, if they are missing from the download page, install them using an **unversioned git URL**:\r\n  ```\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/agent\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/mcp\r\n  ```\r\n\r\n#### How to add a git URL in Unity\r\n\r\nAdd the URL to the project's `Packages/manifest.json` under `\"dependencies\"`, for example:\r\n```json\r\n{\r\n  \"dependencies\": {\r\n    \"com.tencent.puerts.agent\": \"https://github.com/Tencent/puerts.git?path=unity/upms/agent#Unity_v3.0.2\"\r\n  }\r\n}\r\n```\r\nOr use the Unity Editor: **Window → Package Manager → + → Add package from git URL...**\r\n\r\n---\r\n\r\n## 5. Installation Workflow\r\n\r\nWhen a user asks to install PuerTS, follow this workflow:\r\n\r\n1. **Ask the user** which version to install (if not already specified)\r\n2. **Ask the user** which packages they need (common combo: `com.tencent.puerts.core` + `com.tencent.puerts.v8` + `com.tencent.puerts.agent`)\r\n3. **Resolve dependencies** — based on the dependency rules in Section 3, automatically include all required dependency packages. Inform the user about the additional packages that will be installed.\r\n\r\n### Editor Assistant Installation Rules\r\n\r\nIf the user requests to **\"install PuerTS Editor Assistant\"** (or similar phrasing like \"安装 puerts 编辑器助手\"), apply the following rules:\r\n\r\n| User Request | Packages to Install |\r\n|---|---|\r\n| \"Install PuerTS Editor Assistant\" (no specific version mentioned) | **Both** `com.tencent.puerts.agent` **and** `com.tencent.puerts.mcp` (plus all their dependencies: `core`, `v8`) |\r\n| \"Install PuerTS Editor Assistant — Agent version\" | Only `com.tencent.puerts.agent` (plus its dependencies: `core`, `v8`) |\r\n| \"Install PuerTS Editor Assistant — MCP version\" | Only `com.tencent.puerts.mcp` (plus its dependencies: `core`, `v8`, `agent`) |\r\n\r\n4. **Check the release page** `https://github.com/Tencent/puerts/releases/tag/Unity_v{VERSION}` to see which archives are available — note that actual filenames in the `.tar.gz` may have different version numbers than the release tag\r\n5. **For packages with native plugins** (`com.tencent.puerts.core`, `com.tencent.puerts.v8`, `com.tencent.puerts.lua`, `com.tencent.puerts.nodejs`, `com.tencent.puerts.python`, `com.tencent.puerts.quickjs`): guide the user to download and extract into `Packages/`\r\n6. **For packages without native plugins** (`com.tencent.puerts.webgl`, `com.tencent.puerts.agent`, `com.tencent.puerts.mcp`):\r\n   - If the `.tar.gz` exists on the release page → offer both download or git URL options\r\n   - If the `.tar.gz` does NOT exist on the release page → use the unversioned git URL\r\n7. **Verify** the installation by checking `Packages/manifest.json` for the expected package entries\r\n\r\n---\r\n\r\n## 6. Verifying Installation\r\n\r\nAfter installation, the following package IDs should appear in `Packages/manifest.json` (depending on which packages were installed):\r\n\r\n- `com.tencent.puerts.core`\r\n- `com.tencent.puerts.v8` (or other backend: `com.tencent.puerts.lua`, `com.tencent.puerts.nodejs`, `com.tencent.puerts.python`, `com.tencent.puerts.quickjs`)\r\n- `com.tencent.puerts.agent`\r\n- `com.tencent.puerts.webgl`\r\n- `com.tencent.puerts.mcp`\r\n\r\n---\r\n\r\n## 7. Known Issues & Troubleshooting (Windows)\r\n\r\n### 7.1 `curl` on Windows is an alias for `Invoke-WebRequest` — use different flags\r\n\r\nOn Windows PowerShell, `curl` is an alias for `Invoke-WebRequest` and does **not** accept standard Unix `curl` flags like `-L`, `--max-time`, `-o`. Use the native PowerShell syntax instead:\r\n\r\n```powershell\r\n# ❌ Wrong — Unix curl flags don't work in PowerShell\r\ncurl -L --max-time 30 -o output.html https://...\r\n\r\n# ✅ Correct — use Invoke-WebRequest with PowerShell parameters\r\nInvoke-WebRequest -Uri \"https://...\" -OutFile \"output.html\" -UseBasicParsing\r\n```\r\n\r\n### 7.2 GitHub API rate limit when unauthenticated\r\n\r\nCalling `https://api.github.com/repos/Tencent/puerts/releases/tags/Unity_v{VERSION}` without authentication will quickly hit GitHub's rate limit (especially on shared IPs). \r\n\r\n**Workaround**: Instead of the API, fetch the **expanded assets HTML fragment** directly — it contains all download links and is not rate-limited:\r\n\r\n```powershell\r\nInvoke-WebRequest -Uri \"https://github.com/Tencent/puerts/releases/expanded_assets/Unity_v{VERSION}\" `\r\n    -OutFile \"assets.html\" -UseBasicParsing\r\n\r\n# Then extract download links with regex:\r\n$content = Get-Content \"assets.html\" -Raw\r\n$matches = [regex]::Matches($content, 'href=\"(/Tencent/puerts/releases/download[^\"]*)\"')\r\n$matches | ForEach-Object { $_.Groups[1].Value }\r\n```\r\n\r\nThis returns the exact filenames (e.g., `PuerTS_Core_3.0.2.tar.gz`) without consuming API quota.\r\n\r\n### 7.3 `Invoke-WebRequest` times out on large files\r\n\r\n`Invoke-WebRequest` can time out when downloading large packages (e.g., `PuerTS_V8` ~74 MB, `PuerTS_Nodejs` ~169 MB).\r\n\r\n**Workaround**: Use `Start-BitsTransfer` instead — it is more reliable for large files and does not time out:\r\n\r\n```powershell\r\nStart-BitsTransfer `\r\n    -Source \"https://github.com/Tencent/puerts/releases/download/Unity_v3.0.2/PuerTS_V8_3.0.2.tar.gz\" `\r\n    -Destination \"C:\\path\\to\\output\\PuerTS_V8_3.0.2.tar.gz\"\r\n```\r\n\r\n### 7.4 Release page HTML does not contain download links (JavaScript-rendered)\r\n\r\nThe main release page (`/releases/tag/Unity_v{VERSION}`) renders asset links via JavaScript — the raw HTML fetched by `Invoke-WebRequest` will **not** contain any `releases/download` links.\r\n\r\n**Solution**: Use the `expanded_assets` endpoint instead (see Section 7.2 above), which returns a static HTML fragment with all asset links.\r\n\r\n### 7.5 `manifest.json` must use `file:` prefix for local packages\r\n\r\nWhen packages are extracted into the `Packages/` directory, `manifest.json` must reference them with the `file:` prefix pointing to the subdirectory name:\r\n\r\n```json\r\n{\r\n  \"dependencies\": {\r\n    \"com.tencent.puerts.core\":   \"file:core\",\r\n    \"com.tencent.puerts.v8\":     \"file:v8\",\r\n    \"com.tencent.puerts.nodejs\": \"file:nodejs\",\r\n    \"com.tencent.puerts.agent\":  \"file:agent\",\r\n    \"com.tencent.puerts.mcp\":    \"file:mcp\"\r\n  }\r\n}\r\n```\r\n\r\nUnity will automatically resolve these local paths when the project is opened.\r\n","isInternal":false,"tokens":3289,"sizeBytes":12297},{"name":"SKILL.md","path":"unity/skills/puerts-agent-development/SKILL.md","rawUrl":"https://raw.githubusercontent.com/Tencent/puerts/HEAD/unity/skills/puerts-agent-development/SKILL.md","title":"puerts-agent-development","category":"anthropic-skill","format":"markdown","content":"﻿---\r\nname: PuerTS Agent Development Guide\r\ndescription: Guide for developing LLM agents based on PuerTsAgent framework — covers resource directory structure, system-prompt, skills, builtin modules, and best practices.\r\n---\r\n\r\n# PuerTS Agent Development Guide\r\n\r\nThis skill provides the complete guide for developing LLM agents based on the PuerTsAgent framework.\r\n\r\n> **⚠️ Important — Required Packages**: This framework depends on PuerTS **core**, **v8**, and **agent** packages. Before proceeding, you **must** check the Unity project's `Packages/manifest.json` to verify that the following packages are installed:\r\n> - `com.tencent.puerts.core`\r\n> - `com.tencent.puerts.v8`\r\n> - `com.tencent.puerts.agent`\r\n>\r\n> If any of these packages are missing, they must be installed first before using this skill. you MUST first invoke the **\"Install PuerTS for Unity\"** skill to AUTO complete the setup.\r\n\r\n> **⚠️ Prerequisite**: Before using this skill to create or modify an agent, you **must** know the agent's resource directory path under Unity `Resources/` (e.g., `maze-runner`, `editor-assistant`). If the user has not provided this path, **ask the user** which `Resources/` subdirectory to use before proceeding. All agent files (system-prompt, skills, builtins) are organized under this path.\r\n\r\n> **⚠️ Builtin Language Choice**: When creating builtin modules, you **must ask the user** whether they want to write builtins in **TypeScript** or **JavaScript**:\r\n> - **TypeScript** → Create a dedicated TS project (with `package.json`, `tsconfig.json`, `esbuild.mjs`) whose build output (`outdir`) points to `Assets/Resources/<agent-name>/builtins/`. See [TypeScript Project Setup for Builtins](#typescript-project-setup-for-builtins) section below.\r\n> - **JavaScript** → Write `.mjs` files directly in `Assets/Resources/<agent-name>/builtins/`.\r\n\r\n## Overview\r\n\r\nIn this framework, an agent's behavior and capabilities are entirely defined by files in a **resource directory** (Resource Root). Different resource directories represent different agents — Unity editor assistants, in-game AI characters, or any role you need.\r\n\r\n> **Key Concept**: Both `system-prompt.md.txt` and files under `skills/` are essentially **prompts** (natural language instructions for the LLM). The only difference is their **loading strategy**:\r\n> - **`system-prompt.md.txt`** — Always present in context (persistent). Put prompts here that are needed for **most tasks**.\r\n> - **`skills/*.md.txt`** — Loaded on demand by the LLM via `loadSkill`. Put prompts here that are **not needed for every task** — they are loaded only when the LLM determines they are relevant.\r\n\r\n## Creating an Agent\r\n\r\nInitialize an agent in C# via its resource path:\r\n\r\n```csharp\r\nvar agent = new AgentScriptManager();\r\nagent.Initialize(\"maze-runner\", () =>\r\n{\r\n    Debug.Log(\"Maze runner agent is ready!\");\r\n});\r\n```\r\n\r\nThe first parameter of `Initialize` is the resource directory path under Unity `Resources/`. The framework loads the full agent definition from this directory:\r\n\r\n- **`system-prompt.md.txt`** — Role definition (System Prompt)\r\n- **`skills/`** — Domain skill documents (loaded on demand, optional)\r\n- **`builtins/`** — Built-in helper modules (executable JS modules)\r\n\r\n### Example Directory Structure\r\n\r\n```\r\nResources/maze-runner/\r\n├── system-prompt.md.txt          # Role definition (System Prompt)\r\n├── skills/                       # Domain skills (loaded on demand, optional)\r\n└── builtins/                     # Built-in modules (loaded on demand)\r\n    ├── maze-control.mjs          # Maze movement and status query\r\n    └── screenshot.mjs            # Screenshot to observe the maze\r\n```\r\n\r\nAll resource files are placed in Unity's `Resources/` directory.\r\n\r\n> **File extension convention**: Unity `Resources` does not support `.md` and `.mjs` as TextAsset, so:\r\n> - Markdown files use `.md.txt` suffix\r\n> - JS module files use `.mjs` suffix\r\n\r\n---\r\n\r\n## 1. System Prompt — Role Definition\r\n\r\n### Purpose\r\n\r\n`system-prompt.md.txt` defines the agent's identity, personality, capabilities, and behavioral rules. It is injected at the beginning of the LLM's system prompt and is the core of the agent's \"persona.\"\r\n\r\n> **This is a persistent prompt** — it is always present in the LLM's context for every conversation turn. Therefore, put only the most frequently used instructions here — things the agent needs for the **majority** of its tasks. Avoid stuffing rarely-used domain knowledge here, as it permanently consumes context tokens.\r\n\r\n### File Location\r\n\r\n```text\r\n<resource-root>/system-prompt.md.txt\r\n```\r\n\r\n### Format\r\n\r\nPlain text / Markdown format, write role definition directly, no front-matter needed.\r\n\r\n### Example — Editor Assistant\r\n\r\n```markdown\r\nYou are a helpful AI assistant running inside Unity via PuerTS (a TypeScript/JavaScript runtime for Unity). You can help with game development, scripting, and general questions. Be concise and practical.\r\n```\r\n\r\n### Example — Maze AI (excerpt)\r\n\r\n```markdown\r\nYou are a Maze Explorer AI — an intelligent agent that navigates through 3D mazes by observing, reasoning, and acting.\r\n\r\n## Your Capabilities\r\n\r\nYou can control a player character in a 3D maze using two builtin modules:\r\n- **maze-control**: Move in compass directions (north/south/east/west) with `movePath()` and query obstacle distances with `getPlayerStatus()`\r\n- **screenshot**: Capture the game view to visually observe the maze\r\n\r\n## Goal Description\r\n\r\nYour goal is to reach the **maze exit marker** — a tall RED pillar with a bright RED glowing ring.\r\n```\r\n\r\n> The System Prompt describes the AI's identity, available modules, goals, exploration loops, navigation rules, etc. It can be lengthy — it defines the AI's behavior pattern throughout the task.\r\n\r\n---\r\n\r\n## 2. Skills — Domain Skills\r\n\r\n### Purpose\r\n\r\nA Skill is an **on-demand loaded** Markdown document providing domain-specific operation guides and rules for the LLM. The LLM actively loads skills into context via the `loadSkill` tool when needed.\r\n\r\n> **Skills are prompts too** — just like `system-prompt.md.txt`, they are natural language instructions. The key difference is that skills are **not always in context**. If a piece of knowledge is not needed for most tasks the agent handles, it belongs in a skill file rather than in the system prompt. This keeps the base context lean while still making specialized knowledge available when the LLM needs it.\r\n\r\n### File Location\r\n\r\n```text\r\n<resource-root>/skills/<skill-name>.md.txt\r\n```\r\n\r\n### File Format\r\n\r\nSkill files use **YAML front-matter** for metadata, body is Markdown content:\r\n\r\n```yaml\r\n---\r\nname: <skill-id>\r\ndescription: \"<one-line description shown to the LLM>\"\r\n---\r\n\r\n(Markdown body — the actual skill instructions)\r\n```\r\n\r\n| Front-matter Field | Required | Description |\r\n|---|---|---|\r\n| `name` | ✅ | Unique identifier, LLM calls `loadSkill` with this name |\r\n| `description` | ❌ | Short description shown in `loadSkill` available skills list |\r\n\r\n### Example\r\n\r\n`skills/puerts-interop.md.txt`:\r\n\r\n```yaml\r\n---\r\nname: puerts-interop\r\ndescription: \"PuerTS JS ↔ C# interop rules: CS/puer globals, out/ref params, generics, operators, Array/List indexer access, async/Task.\"\r\n---\r\n\r\n## PuerTS: JS ↔ C# Interop Rules\r\n...\r\n```\r\n\r\n### Design Tips\r\n\r\n- **description should be accurate**: LLM decides whether to load based on description\r\n- **content should be thorough**: skill docs are the LLM's only reference for specific tasks\r\n- **one domain per skill**: keep responsibilities single for precise loading\r\n- **system-prompt vs skill decision rule**: If the agent needs this knowledge in >80% of tasks → put it in `system-prompt.md.txt`. Otherwise → put it in `skills/` for on-demand loading\r\n\r\n---\r\n\r\n## 3. Builtin — Built-in Helper Modules\r\n\r\n### Purpose\r\n\r\nBuiltin modules are JavaScript modules providing pre-built helper functions for the LLM's `evalJsCode` tool. Unlike Skills, Builtins are actually executable code, not documentation.\r\n\r\n### File Location\r\n\r\n```text\r\n<resource-root>/builtins/<module-name>.mjs\r\n```\r\n\r\n> Source code can use TypeScript, JavaScript, or any language compilable to `.mjs`. The framework only cares about the final `.mjs` files in the resource directory.\r\n\r\n### Module Contract\r\n\r\nEvery Builtin module must export the following two string constants:\r\n\r\n| Export | Type | Description |\r\n|---|---|---|\r\n| `summary` | `string` | Short summary (~one line), always shown in `evalJsCode` tool description |\r\n| `description` | `string` | Detailed function signatures and usage, LLM reads via `import()` |\r\n\r\nAdditionally, the module's exported functions are the actual capabilities the LLM can call in `evalJsCode`.\r\n\r\n### Example — `builtins/unity-log.mjs` (shown as TypeScript source)\r\n\r\n```typescript\r\n// ---- Summary for tool description (always in context) ----\r\nexport const summary = `**unity-log** — Unity console log access (retrieve and summarize recent logs). Read \\`.description\\` to see available functions and their signatures.`;\r\n\r\n// ---- Description for on-demand access via import ----\r\nexport const description = `\r\n- **\\`getUnityLogs(count?, logType?)\\`** — Get recent Unity console logs.\r\n  - \\`count\\` (number, default 20): Number of log entries to retrieve (1-50).\r\n  - \\`logType\\` (string, default \\`'all'\\`): Filter by type — \\`'all'\\`, \\`'error'\\`, \\`'warning'\\`, or \\`'log'\\`.\r\n  - Returns an array of log entry objects: \\`{ timestamp, type, message, stackTrace? }\\`.\r\n`.trim();\r\n\r\n// ---- Function implementations ----\r\nexport function getUnityLogs(count: number = 20, logType: string = 'all'): LogEntry[] {\r\n    const logsJson = CS.LLMAgent.UnityLogBridge.GetRecentLogs(count, logType);\r\n    return JSON.parse(logsJson);\r\n}\r\n```\r\n\r\n### Example — `builtins/maze-control.mjs` (TypeScript source, excerpt)\r\n\r\n```typescript\r\nexport const summary = `**maze-control** — Control the player in the maze. \\`movePath([{dir, steps}, ...])\\` executes a multi-segment path. \\`getPlayerStatus()\\` returns position and obstacle distances. Read \\`.description\\` for details.`;\r\n\r\nexport const description = `\r\n- **\\`movePath(segments)\\`** — Move the player along a multi-segment planned path.\r\n  - \\`segments\\` (array): Array of \\`{ dir: string, steps: number }\\`.\r\n  - Returns: \\`{ success, stepsCompleted, blocked, reachedGoal, position, message }\\`\r\n- **\\`getPlayerStatus()\\`** — Get the player's position and obstacle distances.\r\n  - Returns: \\`{ position, northDistance, southDistance, eastDistance, westDistance, reachedGoal }\\`\r\n`.trim();\r\n\r\nexport async function movePath(segments: PathSegment[]): Promise<MoveSequenceResult> {\r\n    const directionsJson = JSON.stringify(segments.map(s => s.dir));\r\n    const distancesJson = JSON.stringify(segments.map(s => s.steps));\r\n    const resultJson = await new Promise<string>((resolve, reject) => {\r\n        CS.LLMAgent.MazePlayerBridge.MoveSequenceV2(directionsJson, distancesJson, (json: string) => resolve(json));\r\n    });\r\n    return JSON.parse(resultJson);\r\n}\r\n\r\nexport async function getPlayerStatus(): Promise<PlayerStatusResult> {\r\n    const resultJson = await new Promise<string>((resolve, reject) => {\r\n        CS.LLMAgent.MazePlayerBridge.GetPlayerStatus((json: string) => resolve(json));\r\n    });\r\n    return JSON.parse(resultJson);\r\n}\r\n```\r\n\r\n### Design Tips\r\n\r\n- **summary should be brief**: it always consumes tokens, just convey the module's purpose\r\n- **description must list complete signatures**: LLM must read description before calling functions\r\n- **functions should validate parameters**: LLM may pass incorrect params, validate and throw meaningful errors\r\n- **top-level await is supported**: modules can use `await` at top level (e.g., async initialization)\r\n- C# bridge classes must be pre-implemented on the Unity side\r\n\r\n---\r\n\r\n## 4. Complete Development Workflow\r\n\r\n### Step 1: Create Resource Directory\r\n\r\n```\r\nResources/<agent-name>/\r\n├── system-prompt.md.txt\r\n├── skills/\r\n└── builtins/\r\n```\r\n\r\n### Step 2: Write Role Definition\r\n\r\nEdit `system-prompt.md.txt` to define the AI's identity and behavioral rules. For example, a maze AI should describe:\r\n- Role identity (maze explorer)\r\n- Available modules (maze-control, screenshot)\r\n- Goal (reach the red exit marker)\r\n- Exploration loop (observe → plan → act)\r\n- Navigation strategy (right-hand rule, dead-end detection, etc.)\r\n\r\n### Step 3: Write Domain Skills (Optional)\r\n\r\nCreate `.md.txt` files in the `skills/` directory with YAML front-matter and skill content.\r\n\r\n> The Maze Demo doesn't use skill files — all navigation rules are directly in system-prompt. When domain knowledge is extensive and doesn't need to be loaded every time, splitting into skills is more appropriate.\r\n\r\n### Step 4: Write Helper Modules\r\n\r\nFirst, ask the user whether to write builtins in **TypeScript** or **JavaScript**:\r\n\r\n- **TypeScript**: Create a dedicated TS project following the [TypeScript Project Setup for Builtins](#typescript-project-setup-for-builtins) template (Section 6). The project's build output will automatically go to `Resources/<agent-name>/builtins/`.\r\n- **JavaScript**: Write `.mjs` files directly in `Assets/Resources/<agent-name>/builtins/`.\r\n\r\n### Step 5: Initialize the Agent\r\n\r\nIn C# code, initialize the agent with the corresponding resource path (see \"Creating an Agent\" section above).\r\n\r\n---\r\n\r\n## 5. Best Practices\r\n\r\n### System Prompt\r\n- Keep it concise and clear, avoid excessive length (it always consumes context tokens)\r\n- Focus on \"who you are\" and \"what you should do\", don't include framework runtime details\r\n- Only include prompts needed for the **majority** of tasks — this is always-on context\r\n\r\n### Skills\r\n- Split complex domain knowledge into separate skill files\r\n- Include keywords in description to help LLM decide when to load\r\n- The more detailed the better — this is the LLM's only reference for the task\r\n- Remember: skills and system-prompt are both prompts; the difference is persistent vs on-demand loading\r\n\r\n### Builtins\r\n- Each module focuses on one functional area (e.g., scene operations, log queries)\r\n- Summary should be one line, description must list all function signatures completely\r\n- All exported functions should validate parameters and throw meaningful errors\r\n\r\n### General\r\n- One resource directory = one independent agent role\r\n- Different agents are completely isolated, can have entirely different skills and toolsets\r\n\r\n---\r\n\r\n## 6. TypeScript Project Setup for Builtins\r\n\r\nWhen the user chooses TypeScript for builtins, create a dedicated TS project with the following structure and files. Replace `<agent-name>` with the actual agent name (e.g., `maze-runner`).\r\n\r\n### Project Structure\r\n\r\n```\r\nTs<AgentNamePascalCase>/          # e.g., TsMazeRunner/\r\n├── package.json\r\n├── tsconfig.json\r\n├── esbuild.mjs                   # Build script — outputs to Resources/<agent-name>/builtins/\r\n└── src/\r\n    └── builtins/\r\n        └── <module-name>.mts     # TypeScript source files\r\n```\r\n\r\n### package.json Template\r\n\r\n```json\r\n{\r\n  \"name\": \"<agent-name>\",\r\n  \"version\": \"1.0.0\",\r\n  \"description\": \"<Agent description> - TypeScript builtins\",\r\n  \"private\": true,\r\n  \"scripts\": {\r\n    \"build\": \"node esbuild.mjs\",\r\n    \"typecheck\": \"tsc --noEmit\"\r\n  },\r\n  \"devDependencies\": {\r\n    \"esbuild\": \"^0.25.0\",\r\n    \"typescript\": \"^5.4.0\"\r\n  }\r\n}\r\n```\r\n\r\n### tsconfig.json Template\r\n\r\n```json\r\n{\r\n  \"compilerOptions\": {\r\n    \"target\": \"esnext\",\r\n    \"module\": \"nodenext\",\r\n    \"moduleResolution\": \"nodenext\",\r\n    \"rootDir\": \"src\",\r\n    \"strict\": true,\r\n    \"esModuleInterop\": true,\r\n    \"skipLibCheck\": true,\r\n    \"forceConsistentCasingInFileNames\": true,\r\n    \"declaration\": false,\r\n    \"sourceMap\": false,\r\n    \"noEmit\": true,\r\n    \"typeRoots\": [\"../Assets/Gen/Typing\", \"../puerts/unity/upms/core/Typing\"]\r\n  },\r\n  \"include\": [\"src/**/*.mts\", \"src/**/*.d.ts\", \"../Assets/Gen/Typing/csharp/index.d.ts\"],\r\n  \"exclude\": [\"node_modules\"]\r\n}\r\n```\r\n\r\n### esbuild.mjs Template\r\n\r\n```javascript\r\nimport { build } from 'esbuild';\r\nimport { readdirSync, mkdirSync, existsSync } from 'fs';\r\nimport { join } from 'path';\r\n\r\n// Build <agent-name> builtins modules\r\nconst builtinSrcDir = 'src/builtins';\r\nconst builtinOutDir = '../Assets/Resources/<agent-name>/builtins';\r\n\r\nconst builtinFiles = existsSync(builtinSrcDir)\r\n    ? readdirSync(builtinSrcDir).filter(f =>\r\n        f.endsWith('.mts') && !f.endsWith('.d.mts'))\r\n    : [];\r\n\r\nif (builtinFiles.length > 0) {\r\n    if (!existsSync(builtinOutDir)) {\r\n        mkdirSync(builtinOutDir, { recursive: true });\r\n    }\r\n\r\n    const builtinEntries = builtinFiles.map(f => join(builtinSrcDir, f));\r\n\r\n    await build({\r\n        entryPoints: builtinEntries,\r\n        bundle: true,\r\n        format: 'esm',\r\n        outdir: builtinOutDir,\r\n        outExtension: { '.js': '.mjs' },\r\n        platform: 'neutral',\r\n        target: 'esnext',\r\n        sourcemap: false,\r\n        minify: false,\r\n        keepNames: true,\r\n        external: [],\r\n        define: {\r\n            'process.env.NODE_ENV': '\"production\"',\r\n        },\r\n    });\r\n\r\n    console.log(`[esbuild:<agent-name>] Built ${builtinFiles.length} builtins module(s) → ${builtinOutDir}/`);\r\n} else {\r\n    console.log('[esbuild:<agent-name>] No builtins modules found in src/builtins/');\r\n}\r\n```\r\n\r\n### Setup Steps\r\n\r\nAfter creating the project files:\r\n\r\n1. Run `npm install` in the project directory to install dependencies\r\n2. Write `.mts` source files in `src/builtins/`\r\n3. Run `npm run build` to compile and output `.mjs` files to `Assets/Resources/<agent-name>/builtins/`\r\n4. Run `npm run typecheck` for type checking (optional but recommended)\r\n","isInternal":false,"tokens":4106,"sizeBytes":17812},{"name":"manifest.json","path":"unity/test/unity/Packages/manifest.json","rawUrl":"https://raw.githubusercontent.com/Tencent/puerts/HEAD/unity/test/unity/Packages/manifest.json","title":"Packages Skill","category":"anthropic-skill","format":"json","content":"{\n  \"dependencies\": {\n    \"com.tencent.puerts.commonjs\": \"file:../../../upms/commonjs\",\n    \"com.tencent.puerts.core\": \"file:../../../upms/core\",\n    \"com.tencent.puerts.lua\": \"file:../../../upms/lua\",\n    \"com.tencent.puerts.nodejs\": \"file:../../../upms/nodejs\",\n    \"com.tencent.puerts.python\": \"file:../../../upms/python\",\n    \"com.tencent.puerts.quickjs\": \"file:../../../upms/quickjs\",\n\t\"com.tencent.puerts.v8\": \"file:../../../upms/v8\",\n    \"com.tencent.puerts.unittest\": \"file:../../Src\",\n    \"com.unity.2d.sprite\": \"1.0.0\",\n    \"com.unity.2d.tilemap\": \"1.0.0\",\n    \"com.unity.ads\": \"3.7.5\",\n    \"com.unity.analytics\": \"3.6.12\",\n    \"com.unity.collab-proxy\": \"2.0.0\",\n    \"com.unity.ide.rider\": \"3.0.18\",\n    \"com.unity.ide.visualstudio\": \"2.0.17\",\n    \"com.unity.ide.vscode\": \"1.2.5\",\n    \"com.unity.purchasing\": \"4.5.2\",\n    \"com.unity.test-framework\": \"1.1.31\",\n    \"com.unity.textmeshpro\": \"3.0.6\",\n    \"com.unity.timeline\": \"1.6.4\",\n    \"com.unity.ugui\": \"1.0.0\",\n    \"com.unity.xr.legacyinputhelpers\": \"2.1.10\",\n    \"com.unity.modules.ai\": \"1.0.0\",\n    \"com.unity.modules.androidjni\": \"1.0.0\",\n    \"com.unity.modules.animation\": \"1.0.0\",\n    \"com.unity.modules.assetbundle\": \"1.0.0\",\n    \"com.unity.modules.audio\": \"1.0.0\",\n    \"com.unity.modules.cloth\": \"1.0.0\",\n    \"com.unity.modules.director\": \"1.0.0\",\n    \"com.unity.modules.imageconversion\": \"1.0.0\",\n    \"com.unity.modules.imgui\": \"1.0.0\",\n    \"com.unity.modules.jsonserialize\": \"1.0.0\",\n    \"com.unity.modules.particlesystem\": \"1.0.0\",\n    \"com.unity.modules.physics\": \"1.0.0\",\n    \"com.unity.modules.physics2d\": \"1.0.0\",\n    \"com.unity.modules.screencapture\": \"1.0.0\",\n    \"com.unity.modules.terrain\": \"1.0.0\",\n    \"com.unity.modules.terrainphysics\": \"1.0.0\",\n    \"com.unity.modules.tilemap\": \"1.0.0\",\n    \"com.unity.modules.ui\": \"1.0.0\",\n    \"com.unity.modules.uielements\": \"1.0.0\",\n    \"com.unity.modules.umbra\": \"1.0.0\",\n    \"com.unity.modules.unityanalytics\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequestassetbundle\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequestaudio\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequesttexture\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequestwww\": \"1.0.0\",\n    \"com.unity.modules.vehicles\": \"1.0.0\",\n    \"com.unity.modules.video\": \"1.0.0\",\n    \"com.unity.modules.vr\": \"1.0.0\",\n    \"com.unity.modules.wind\": \"1.0.0\",\n    \"com.unity.modules.xr\": \"1.0.0\"\n  }\n}\n","frontmatter":{"dependencies":{"com.tencent.puerts.commonjs":"file:../../../upms/commonjs","com.tencent.puerts.core":"file:../../../upms/core","com.tencent.puerts.lua":"file:../../../upms/lua","com.tencent.puerts.nodejs":"file:../../../upms/nodejs","com.tencent.puerts.python":"file:../../../upms/python","com.tencent.puerts.quickjs":"file:../../../upms/quickjs","com.tencent.puerts.v8":"file:../../../upms/v8","com.tencent.puerts.unittest":"file:../../Src","com.unity.2d.sprite":"1.0.0","com.unity.2d.tilemap":"1.0.0","com.unity.ads":"3.7.5","com.unity.analytics":"3.6.12","com.unity.collab-proxy":"2.0.0","com.unity.ide.rider":"3.0.18","com.unity.ide.visualstudio":"2.0.17","com.unity.ide.vscode":"1.2.5","com.unity.purchasing":"4.5.2","com.unity.test-framework":"1.1.31","com.unity.textmeshpro":"3.0.6","com.unity.timeline":"1.6.4","com.unity.ugui":"1.0.0","com.unity.xr.legacyinputhelpers":"2.1.10","com.unity.modules.ai":"1.0.0","com.unity.modules.androidjni":"1.0.0","com.unity.modules.animation":"1.0.0","com.unity.modules.assetbundle":"1.0.0","com.unity.modules.audio":"1.0.0","com.unity.modules.cloth":"1.0.0","com.unity.modules.director":"1.0.0","com.unity.modules.imageconversion":"1.0.0","com.unity.modules.imgui":"1.0.0","com.unity.modules.jsonserialize":"1.0.0","com.unity.modules.particlesystem":"1.0.0","com.unity.modules.physics":"1.0.0","com.unity.modules.physics2d":"1.0.0","com.unity.modules.screencapture":"1.0.0","com.unity.modules.terrain":"1.0.0","com.unity.modules.terrainphysics":"1.0.0","com.unity.modules.tilemap":"1.0.0","com.unity.modules.ui":"1.0.0","com.unity.modules.uielements":"1.0.0","com.unity.modules.umbra":"1.0.0","com.unity.modules.unityanalytics":"1.0.0","com.unity.modules.unitywebrequest":"1.0.0","com.unity.modules.unitywebrequestassetbundle":"1.0.0","com.unity.modules.unitywebrequestaudio":"1.0.0","com.unity.modules.unitywebrequesttexture":"1.0.0","com.unity.modules.unitywebrequestwww":"1.0.0","com.unity.modules.vehicles":"1.0.0","com.unity.modules.video":"1.0.0","com.unity.modules.vr":"1.0.0","com.unity.modules.wind":"1.0.0","com.unity.modules.xr":"1.0.0"}},"isInternal":false,"tokens":887,"sizeBytes":2420},{"name":"packages-lock.json","path":"unity/test/unity/Packages/packages-lock.json","rawUrl":"https://raw.githubusercontent.com/Tencent/puerts/HEAD/unity/test/unity/Packages/packages-lock.json","title":"Packages Skill","category":"anthropic-skill","format":"json","content":"{\n  \"dependencies\": {\n    \"com.tencent.puerts.commonjs\": {\n      \"version\": \"file:../../../upms/commonjs\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {}\n    },\n    \"com.tencent.puerts.core\": {\n      \"version\": \"file:../../../upms/core\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {}\n    },\n    \"com.tencent.puerts.lua\": {\n      \"version\": \"file:../../../upms/lua\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.tencent.puerts.nodejs\": {\n      \"version\": \"file:../../../upms/nodejs\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.tencent.puerts.python\": {\n      \"version\": \"file:../../../upms/python\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.tencent.puerts.quickjs\": {\n      \"version\": \"file:../../../upms/quickjs\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.tencent.puerts.unittest\": {\n      \"version\": \"file:../../Src\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {}\n    },\n    \"com.tencent.puerts.v8\": {\n      \"version\": \"file:../../../upms/v8\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.unity.2d.sprite\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.2d.tilemap\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.tilemap\": \"1.0.0\",\n        \"com.unity.modules.uielements\": \"1.0.0\"\n      }\n    },\n    \"com.unity.ads\": {\n      \"version\": \"3.7.5\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.analytics\": {\n      \"version\": \"3.6.12\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.collab-proxy\": {\n      \"version\": \"2.0.0\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ext.nunit\": {\n      \"version\": \"1.0.6\",\n      \"depth\": 1,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ide.rider\": {\n      \"version\": \"3.0.18\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ext.nunit\": \"1.0.6\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ide.visualstudio\": {\n      \"version\": \"2.0.17\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.test-framework\": \"1.1.9\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ide.vscode\": {\n      \"version\": \"1.2.5\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.nuget.newtonsoft-json\": {\n      \"version\": \"3.2.0\",\n      \"depth\": 2,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.purchasing\": {\n      \"version\": \"4.5.2\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\",\n        \"com.unity.modules.unityanalytics\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\",\n        \"com.unity.modules.androidjni\": \"1.0.0\",\n        \"com.unity.services.core\": \"1.3.1\",\n        \"com.unity.services.analytics\": \"4.0.1\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.services.analytics\": {\n      \"version\": \"4.4.0\",\n      \"depth\": 1,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\",\n        \"com.unity.services.core\": \"1.8.1\",\n        \"com.unity.nuget.newtonsoft-json\": \"3.0.2\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.services.core\": {\n      \"version\": \"1.8.2\",\n      \"depth\": 1,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.nuget.newtonsoft-json\": \"3.0.2\",\n        \"com.unity.modules.androidjni\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.test-framework\": {\n      \"version\": \"1.1.31\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ext.nunit\": \"1.0.6\",\n        \"com.unity.modules.imgui\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.textmeshpro\": {\n      \"version\": \"3.0.6\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.timeline\": {\n      \"version\": \"1.6.4\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.modules.director\": \"1.0.0\",\n        \"com.unity.modules.animation\": \"1.0.0\",\n        \"com.unity.modules.audio\": \"1.0.0\",\n        \"com.unity.modules.particlesystem\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ugui\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.ui\": \"1.0.0\",\n        \"com.unity.modules.imgui\": \"1.0.0\"\n      }\n    },\n    \"com.unity.xr.legacyinputhelpers\": {\n      \"version\": \"2.1.10\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.modules.vr\": \"1.0.0\",\n        \"com.unity.modules.xr\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.modules.ai\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.androidjni\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.animation\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.assetbundle\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.audio\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.cloth\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.director\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.audio\": \"1.0.0\",\n        \"com.unity.modules.animation\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.imageconversion\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.imgui\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.jsonserialize\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.particlesystem\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.physics\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.physics2d\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.screencapture\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.imageconversion\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.subsystems\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 1,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.terrain\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.terrainphysics\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\",\n        \"com.unity.modules.terrain\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.tilemap\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics2d\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.ui\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.uielements\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.ui\": \"1.0.0\",\n        \"com.unity.modules.imgui\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.umbra\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.unityanalytics\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequest\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.unitywebrequestassetbundle\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.assetbundle\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequestaudio\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.audio\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequesttexture\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.imageconversion\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequestwww\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequestassetbundle\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequestaudio\": \"1.0.0\",\n        \"com.unity.modules.audio\": \"1.0.0\",\n        \"com.unity.modules.assetbundle\": \"1.0.0\",\n        \"com.unity.modules.imageconversion\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.vehicles\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.video\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.audio\": \"1.0.0\",\n        \"com.unity.modules.ui\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.vr\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.jsonserialize\": \"1.0.0\",\n        \"com.unity.modules.physics\": \"1.0.0\",\n        \"com.unity.modules.xr\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.wind\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.xr\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\",\n        \"com.unity.modules.subsystems\": \"1.0.0\"\n      }\n    }\n  }\n}\n","frontmatter":{"dependencies":{"com.tencent.puerts.commonjs":{"version":"file:../../../upms/commonjs","depth":0,"source":"local","dependencies":{}},"com.tencent.puerts.core":{"version":"file:../../../upms/core","depth":0,"source":"local","dependencies":{}},"com.tencent.puerts.lua":{"version":"file:../../../upms/lua","depth":0,"source":"local","dependencies":{"com.tencent.puerts.core":"3.0.0"}},"com.tencent.puerts.nodejs":{"version":"file:../../../upms/nodejs","depth":0,"source":"local","dependencies":{"com.tencent.puerts.core":"3.0.0"}},"com.tencent.puerts.python":{"version":"file:../../../upms/python","depth":0,"source":"local","dependencies":{"com.tencent.puerts.core":"3.0.0"}},"com.tencent.puerts.quickjs":{"version":"file:../../../upms/quickjs","depth":0,"source":"local","dependencies":{"com.tencent.puerts.core":"3.0.0"}},"com.tencent.puerts.unittest":{"version":"file:../../Src","depth":0,"source":"local","dependencies":{}},"com.tencent.puerts.v8":{"version":"file:../../../upms/v8","depth":0,"source":"local","dependencies":{"com.tencent.puerts.core":"3.0.0"}},"com.unity.2d.sprite":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{}},"com.unity.2d.tilemap":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{"com.unity.modules.tilemap":"1.0.0","com.unity.modules.uielements":"1.0.0"}},"com.unity.ads":{"version":"3.7.5","depth":0,"source":"registry","dependencies":{"com.unity.ugui":"1.0.0"},"url":"https://packages.unity.cn"},"com.unity.analytics":{"version":"3.6.12","depth":0,"source":"registry","dependencies":{"com.unity.ugui":"1.0.0"},"url":"https://packages.unity.cn"},"com.unity.collab-proxy":{"version":"2.0.0","depth":0,"source":"registry","dependencies":{},"url":"https://packages.unity.cn"},"com.unity.ext.nunit":{"version":"1.0.6","depth":1,"source":"registry","dependencies":{},"url":"https://packages.unity.cn"},"com.unity.ide.rider":{"version":"3.0.18","depth":0,"source":"registry","dependencies":{"com.unity.ext.nunit":"1.0.6"},"url":"https://packages.unity.cn"},"com.unity.ide.visualstudio":{"version":"2.0.17","depth":0,"source":"registry","dependencies":{"com.unity.test-framework":"1.1.9"},"url":"https://packages.unity.cn"},"com.unity.ide.vscode":{"version":"1.2.5","depth":0,"source":"registry","dependencies":{},"url":"https://packages.unity.cn"},"com.unity.nuget.newtonsoft-json":{"version":"3.2.0","depth":2,"source":"registry","dependencies":{},"url":"https://packages.unity.cn"},"com.unity.purchasing":{"version":"4.5.2","depth":0,"source":"registry","dependencies":{"com.unity.ugui":"1.0.0","com.unity.modules.unityanalytics":"1.0.0","com.unity.modules.unitywebrequest":"1.0.0","com.unity.modules.jsonserialize":"1.0.0","com.unity.modules.androidjni":"1.0.0","com.unity.services.core":"1.3.1","com.unity.services.analytics":"4.0.1"},"url":"https://packages.unity.cn"},"com.unity.services.analytics":{"version":"4.4.0","depth":1,"source":"registry","dependencies":{"com.unity.ugui":"1.0.0","com.unity.services.core":"1.8.1","com.unity.nuget.newtonsoft-json":"3.0.2"},"url":"https://packages.unity.cn"},"com.unity.services.core":{"version":"1.8.2","depth":1,"source":"registry","dependencies":{"com.unity.modules.unitywebrequest":"1.0.0","com.unity.nuget.newtonsoft-json":"3.0.2","com.unity.modules.androidjni":"1.0.0"},"url":"https://packages.unity.cn"},"com.unity.test-framework":{"version":"1.1.31","depth":0,"source":"registry","dependencies":{"com.unity.ext.nunit":"1.0.6","com.unity.modules.imgui":"1.0.0","com.unity.modules.jsonserialize":"1.0.0"},"url":"https://packages.unity.cn"},"com.unity.textmeshpro":{"version":"3.0.6","depth":0,"source":"registry","dependencies":{"com.unity.ugui":"1.0.0"},"url":"https://packages.unity.cn"},"com.unity.timeline":{"version":"1.6.4","depth":0,"source":"registry","dependencies":{"com.unity.modules.director":"1.0.0","com.unity.modules.animation":"1.0.0","com.unity.modules.audio":"1.0.0","com.unity.modules.particlesystem":"1.0.0"},"url":"https://packages.unity.cn"},"com.unity.ugui":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{"com.unity.modules.ui":"1.0.0","com.unity.modules.imgui":"1.0.0"}},"com.unity.xr.legacyinputhelpers":{"version":"2.1.10","depth":0,"source":"registry","dependencies":{"com.unity.modules.vr":"1.0.0","com.unity.modules.xr":"1.0.0"},"url":"https://packages.unity.cn"},"com.unity.modules.ai":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{}},"com.unity.modules.androidjni":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{}},"com.unity.modules.animation":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{}},"com.unity.modules.assetbundle":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{}},"com.unity.modules.audio":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{}},"com.unity.modules.cloth":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{"com.unity.modules.physics":"1.0.0"}},"com.unity.modules.director":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{"com.unity.modules.audio":"1.0.0","com.unity.modules.animation":"1.0.0"}},"com.unity.modules.imageconversion":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{}},"com.unity.modules.imgui":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{}},"com.unity.modules.jsonserialize":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{}},"com.unity.modules.particlesystem":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{}},"com.unity.modules.physics":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{}},"com.unity.modules.physics2d":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{}},"com.unity.modules.screencapture":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{"com.unity.modules.imageconversion":"1.0.0"}},"com.unity.modules.subsystems":{"version":"1.0.0","depth":1,"source":"builtin","dependencies":{"com.unity.modules.jsonserialize":"1.0.0"}},"com.unity.modules.terrain":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{}},"com.unity.modules.terrainphysics":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{"com.unity.modules.physics":"1.0.0","com.unity.modules.terrain":"1.0.0"}},"com.unity.modules.tilemap":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{"com.unity.modules.physics2d":"1.0.0"}},"com.unity.modules.ui":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{}},"com.unity.modules.uielements":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{"com.unity.modules.ui":"1.0.0","com.unity.modules.imgui":"1.0.0","com.unity.modules.jsonserialize":"1.0.0"}},"com.unity.modules.umbra":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{}},"com.unity.modules.unityanalytics":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{"com.unity.modules.unitywebrequest":"1.0.0","com.unity.modules.jsonserialize":"1.0.0"}},"com.unity.modules.unitywebrequest":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{}},"com.unity.modules.unitywebrequestassetbundle":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{"com.unity.modules.assetbundle":"1.0.0","com.unity.modules.unitywebrequest":"1.0.0"}},"com.unity.modules.unitywebrequestaudio":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{"com.unity.modules.unitywebrequest":"1.0.0","com.unity.modules.audio":"1.0.0"}},"com.unity.modules.unitywebrequesttexture":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{"com.unity.modules.unitywebrequest":"1.0.0","com.unity.modules.imageconversion":"1.0.0"}},"com.unity.modules.unitywebrequestwww":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{"com.unity.modules.unitywebrequest":"1.0.0","com.unity.modules.unitywebrequestassetbundle":"1.0.0","com.unity.modules.unitywebrequestaudio":"1.0.0","com.unity.modules.audio":"1.0.0","com.unity.modules.assetbundle":"1.0.0","com.unity.modules.imageconversion":"1.0.0"}},"com.unity.modules.vehicles":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{"com.unity.modules.physics":"1.0.0"}},"com.unity.modules.video":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{"com.unity.modules.audio":"1.0.0","com.unity.modules.ui":"1.0.0","com.unity.modules.unitywebrequest":"1.0.0"}},"com.unity.modules.vr":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{"com.unity.modules.jsonserialize":"1.0.0","com.unity.modules.physics":"1.0.0","com.unity.modules.xr":"1.0.0"}},"com.unity.modules.wind":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{}},"com.unity.modules.xr":{"version":"1.0.0","depth":0,"source":"builtin","dependencies":{"com.unity.modules.physics":"1.0.0","com.unity.modules.jsonserialize":"1.0.0","com.unity.modules.subsystems":"1.0.0"}}}},"isInternal":false,"tokens":3875,"sizeBytes":12394}],"systemPromptSnippet":"<yakaai_skills repo=\"Tencent/puerts\">\n<!-- File: .codebuddy/skills/puerts_changelogs/SKILL.md (Tokens: ~1449 | Category: anthropic-skill) -->\n---\r\nname: puerts_changelogs\r\ndescription: 指引如何为 puerts 项目编写 Unity 和 Unreal 的 changelog\r\n---\r\n\r\n# 编写 PuerTS Changelog 的指引\r\n\r\n## 文件位置\r\n\r\n| 平台 | 英文版 | 中文版 |\r\n|------|--------|--------|\r\n| Unity | `unity/changelog.md` | `unity/changelog-hans.md` |\r\n| Unreal | `unreal/changelog.md` | `unreal/changelog-hans.md` |\r\n\r\n## 操作流程\r\n\r\n### 1. 确定版本范围\r\n\r\n用户会告诉你要更新哪个平台（Unity 或 Unreal）的 changelog。\r\n\r\n- 先读取对应平台的英文版 changelog 文件，找到最新版本号（如 Unity 的 `3.0.1`，Unreal 的 `1.0.9`）。\r\n- 新版本号通常是在最后一位 +1（如 `3.0.1` → `3.0.2`，`1.0.9` → `1.0.10`），但如果用户指定了版本号则以用户为准。\r\n\r\n### 2. 获取两个 tag 之间的 commit\r\n\r\n根据平台确定 tag 命名规则：\r\n- **Unity**：tag 格式为 `Unity_v{版本号}`，例如 `Unity_v3.0.1`\r\n- **Unreal**：tag 格式为 `Unreal_v{版本号}`，例如 `Unreal_v1.0.9`\r\n\r\n执行 git log 获取 commit 列表，**只关注对应平台目录的改动**：\r\n\r\n**Unity 示例**（假设上一版本是 3.0.1，新版本是 3.0.2）：\r\n```bash\r\n# 如果新版本 tag 已存在\r\ngit log Unity_v3.0.1..Unity_v3.0.2 --oneline -- unity/\r\n\r\n# 如果新版本 tag 尚未打，则对比到 master\r\ngit log Unity_v3.0.1..master --oneline -- unity/\r\n```\r\n\r\n**Unreal 示例**（假设上一版本是 1.0.9，新版本是 1.0.10）：\r\n```bash\r\n# 如果新版本 tag 已存在\r\ngit log Unreal_v1.0.9..Unreal_v1.0.10 --oneline -- unreal/\r\n\r\n# 如果新版本 tag 尚未打，则对比到 master\r\ngit log Unreal_v1.0.9..master --oneline -- unreal/\r\n```\r\n\r\n### 3. 筛选和理解 commit\r\n\r\n- 不重要的 commit（如纯格式调整、注释修改、CI 配置等）可以跳过不写。\r\n- changelog 内容应该从**用户影响角度**来写，而不是实现层面的描述。\r\n- 如果从 commit message 无法确定改动的用户影响，应该通过 `git show <commit_hash>` 或 `git diff` 查看具体修改内容来确定。\r\n\r\n### 4. 编写 changelog\r\n\r\n**必须同时编写中文版和英文版**，写到对应的文件中。新版本的内容插入到文件最前面（在文件头部注释之后、旧版本之前）。\r\n\r\n#### Unity changelog 格式\r\n\r\n英文版（`unity/changelog.md`）：\r\n```markdown\r\n## [3.0.2] - 2025-04-01\r\n1. Fixed xxx issue fix #1234\r\n2. Added support for xxx feature (#5678)\r\n3. Optimized xxx performance\r\n```\r\n\r\n中文版（`unity/changelog-hans.md`）：\r\n```markdown\r\n## [3.0.2] - 2025-04-01\r\n1. 修复了 xxx 问题 fix #1234\r\n2. 新增 xxx 功能支持 (#5678)\r\n3. 优化了 xxx 性能\r\n```\r\n\r\n格式要点：\r\n- 标题格式：`## [版本号] - 日期`（日期格式 `YYYY-MM-DD` 或 `YYYY-M-D`）\r\n- 内容使用编号列表 `1. 2. 3. ...`\r\n- 英文版文件头有 `[跳转中文](./changelog-hans.md)` 链接\r\n- 中文版文件头有 `[english version](./changelog.md)` 链接\r\n- 如果 commit 关联了 issue，在条目末尾附上 `fix #issue号` 或 `(#PR号)`\r\n\r\n#### Unreal changelog 格式\r\n\r\n英文版（`unreal/changelog.md`）：\r\n```markdown\r\n### v1.0.10 2025/4/1\r\n\r\n#### New Features\r\n\r\n* Added support for xxx\r\n\r\n#### Optimizations\r\n\r\n* Optimized xxx performance (#1234)\r\n\r\n#### Changes\r\n\r\n* Changed xxx behavior\r\n\r\n#### Bug Fixes\r\n\r\n* Fixed xxx crash issue (fix #5678)\r\n```\r\n\r\n中文版（`unreal/changelog-hans.md`）：\r\n```markdown\r\n### v1.0.10 2025年4月1日\r\n\r\n#### 新增特性\r\n\r\n* 新增 xxx 支持\r\n\r\n#### 优化\r\n\r\n* 优化了 xxx 性能 (#1234)\r\n\r\n#### 变更\r\n\r\n* 变更了 xxx 行为\r\n\r\n#### bug修复\r\n\r\n* 修复了 xxx 崩溃问题 (fix #5678)\r\n```\r\n\r\n格式要点：\r\n- 标题格式：英文版 `### v版本号 YYYY/M/D`，中文版 `### v版本号 YYYY年M月D日`\r\n- 内容按分类组织：`New Features / Optimizations / Changes / Bug Fixes`（中文：`新增特性 / 优化 / 变更 / bug修复`）\r\n- 每个分类使用四级标题 `####`\r\n- 内容使用 `* ` 无序列表\r\n- 如果某个分类没有内容，则省略该分类，不要写空分类\r\n- 如果 commit 关联了 issue，在条目末尾附上 `fix #issue号` 或 `(#PR号)`\r\n\r\n### 5. 写入文件\r\n\r\n将新版本的 changelog 内容插入到对应文件中，位置在文件头部元信息之后、上一个版本之前。确保中英文两个文件都更新。\n\n<!-- File: unity/skills/install-puerts-for-unity/SKILL.md (Tokens: ~3289 | Category: anthropic-skill) -->\n---\r\nname: Install PuerTS for Unity\r\ndescription: Guide for downloading and installing PuerTS UPM packages into a Unity project — covers version selection, package dependencies, download/extract and git URL installation methods, and Editor Assistant setup.\r\n---\r\n\r\n# Install PuerTS for Unity\r\n\r\nThis skill guides you through downloading and installing PuerTS packages into a Unity project.\r\n\r\n> **⚠️ Important**: Always ask the user which PuerTS version they want to install if they haven't specified one. The version number follows the **Core** package's version (e.g., `3.0.2`).\r\n\r\n---\r\n\r\n## 1. Release Page & Version\r\n\r\n- The release download page URL pattern is:\r\n  ```\r\n  https://github.com/Tencent/puerts/releases/tag/Unity_v{VERSION}\r\n  ```\r\n  For example: `https://github.com/Tencent/puerts/releases/tag/Unity_v3.0.2`\r\n\r\n> **⚠️ Important — Version Numbers Inside Archives**: The version number in the release page URL (e.g., `Unity_v3.0.2`) is based on the **Core** package version. However, the version numbers inside each `.tar.gz` filename may differ — each package follows its own versioning cadence. You may need to download/parse the release page HTML to determine the exact filenames available.\r\n\r\n---\r\n\r\n## 2. Available Packages\r\n\r\nEach release page may contain the following `.tar.gz` archives, each corresponding to a UPM package:\r\n\r\n| Archive File | UPM Package | Has Native Plugins | Always Available |\r\n|---|---|---|---|\r\n| `PuerTS_Core_{ver}.tar.gz` | `com.tencent.puerts.core` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Lua_{ver}.tar.gz` | `com.tencent.puerts.lua` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Nodejs_{ver}.tar.gz` | `com.tencent.puerts.nodejs` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Python_{ver}.tar.gz` | `com.tencent.puerts.python` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Quickjs_{ver}.tar.gz` | `com.tencent.puerts.quickjs` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_V8_{ver}.tar.gz` | `com.tencent.puerts.v8` | ✅ Yes | ✅ Yes |\r\n| `PuerTS_Webgl_{ver}.tar.gz` | `com.tencent.puerts.webgl` | ❌ No | ✅ Yes |\r\n| `PuerTS_Agent_{ver}.tar.gz` | `com.tencent.puerts.agent` | ❌ No | ❌ Not every release |\r\n| `PuerTS_MCP_{ver}.tar.gz` | `com.tencent.puerts.mcp` | ❌ No | ❌ Not every release |\r\n\r\n### Notable Package Features\r\n\r\n- **`com.tencent.puerts.agent`**: Provides an **Agent framework** for building LLM agents, and also includes an **Agent-based Editor Assistant** for Unity.\r\n- **`com.tencent.puerts.mcp`**: Provides an **MCP (Model Context Protocol) framework**, and also includes an **MCP-based Editor Assistant** for Unity.\r\n\r\n> Both the `agent` and `mcp` packages offer an **Editor Assistant** variant. See Section 5 for how to handle user requests like \"install PuerTS Editor Assistant\".\r\n\r\n---\r\n\r\n## 3. Package Dependencies\r\n\r\n> **⚠️ Important**: Packages have dependency relationships. When a user requests to install a package, you **must** ensure all of its dependencies are also installed.\r\n\r\n### Dependency Rules\r\n\r\n- **`com.tencent.puerts.core`** is the foundational package — **all other packages depend on it**.\r\n- **`com.tencent.puerts.agent`** depends on `com.tencent.puerts.core` + `com.tencent.puerts.v8`\r\n- **`com.tencent.puerts.mcp`** depends on `com.tencent.puerts.core` + `com.tencent.puerts.v8` + `com.tencent.puerts.agent`\r\n- **All backend packages** (`com.tencent.puerts.v8`, `com.tencent.puerts.lua`, `com.tencent.puerts.nodejs`, `com.tencent.puerts.python`, `com.tencent.puerts.quickjs`, `com.tencent.puerts.webgl`) depend on `com.tencent.puerts.core`\r\n\r\n### Dependency Graph\r\n\r\n```\r\ncom.tencent.puerts.core  (required by all)\r\n  ├── com.tencent.puerts.v8\r\n  │     ├── com.tencent.puerts.agent\r\n  │     │     └── com.tencent.puerts.mcp\r\n  │     └── com.tencent.puerts.mcp\r\n  ├── com.tencent.puerts.nodejs\r\n  ├── com.tencent.puerts.lua\r\n  ├── com.tencent.puerts.python\r\n  ├── com.tencent.puerts.quickjs\r\n  └── com.tencent.puerts.webgl\r\n```\r\n\r\n### Examples of Automatic Dependency Resolution\r\n\r\n| User requests to install | Must also install |\r\n|---|---|\r\n| `agent` | `core`, `v8` |\r\n| `mcp` | `core`, `v8`, `agent` |\r\n| `mcp` + `agent` | `core`, `v8` |\r\n| `v8` | `core` |\r\n| `lua` | `core` |\r\n\r\n---\r\n\r\n## 4. Installation Methods\r\n\r\n### 4.1 Download & Extract Method (Required for packages with native plugins)\r\n\r\nThe following packages contain compiled native binary plugins and **must** be installed by downloading from the release page:\r\n\r\n- `com.tencent.puerts.core`\r\n- `com.tencent.puerts.lua`\r\n- `com.tencent.puerts.nodejs`\r\n- `com.tencent.puerts.python`\r\n- `com.tencent.puerts.quickjs`\r\n- `com.tencent.puerts.v8`\r\n\r\n**Steps:**\r\n\r\n1. Go to `https://github.com/Tencent/puerts/releases/tag/Unity_v{VERSION}`\r\n2. Download the required `.tar.gz` file(s) (e.g., `PuerTS_Core_3.0.2.tar.gz`)\r\n3. Extract the archive — it will produce a directory (e.g., `core/`) containing a standard UPM package structure with a `package.json`\r\n4. Move the extracted directory into the Unity project's `Packages/` folder\r\n5. Verify installation by checking `Packages/manifest.json`\r\n\r\n### 4.2 Git URL Method (Available for packages without native plugins)\r\n\r\nThe following packages can also be installed via Unity's **Add package from git URL** method:\r\n\r\n- `com.tencent.puerts.webgl`\r\n- `com.tencent.puerts.agent`\r\n- `com.tencent.puerts.mcp`\r\n\r\n#### When the package **exists** on the release page\r\n\r\nYou can either:\r\n- Use the **Download & Extract** method (Section 4.1), OR\r\n- Use a **versioned git URL** in Unity Package Manager:\r\n  ```\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/{package_name}#Unity_v{VERSION}\r\n  ```\r\n  Examples:\r\n  ```\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/agent#Unity_v3.0.2\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/mcp#Unity_v3.0.2\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/webgl#Unity_v3.0.2\r\n  ```\r\n\r\n#### When the package **does NOT exist** on the release page\r\n\r\nSince `com.tencent.puerts.agent` and `com.tencent.puerts.mcp` are newer packages and not available in every release, if they are missing from the download page, install them using an **unversioned git URL**:\r\n  ```\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/agent\r\n  https://github.com/Tencent/puerts.git?path=unity/upms/mcp\r\n  ```\r\n\r\n#### How to add a git URL in Unity\r\n\r\nAdd the URL to the project's `Packages/manifest.json` under `\"dependencies\"`, for example:\r\n```json\r\n{\r\n  \"dependencies\": {\r\n    \"com.tencent.puerts.agent\": \"https://github.com/Tencent/puerts.git?path=unity/upms/agent#Unity_v3.0.2\"\r\n  }\r\n}\r\n```\r\nOr use the Unity Editor: **Window → Package Manager → + → Add package from git URL...**\r\n\r\n---\r\n\r\n## 5. Installation Workflow\r\n\r\nWhen a user asks to install PuerTS, follow this workflow:\r\n\r\n1. **Ask the user** which version to install (if not already specified)\r\n2. **Ask the user** which packages they need (common combo: `com.tencent.puerts.core` + `com.tencent.puerts.v8` + `com.tencent.puerts.agent`)\r\n3. **Resolve dependencies** — based on the dependency rules in Section 3, automatically include all required dependency packages. Inform the user about the additional packages that will be installed.\r\n\r\n### Editor Assistant Installation Rules\r\n\r\nIf the user requests to **\"install PuerTS Editor Assistant\"** (or similar phrasing like \"安装 puerts 编辑器助手\"), apply the following rules:\r\n\r\n| User Request | Packages to Install |\r\n|---|---|\r\n| \"Install PuerTS Editor Assistant\" (no specific version mentioned) | **Both** `com.tencent.puerts.agent` **and** `com.tencent.puerts.mcp` (plus all their dependencies: `core`, `v8`) |\r\n| \"Install PuerTS Editor Assistant — Agent version\" | Only `com.tencent.puerts.agent` (plus its dependencies: `core`, `v8`) |\r\n| \"Install PuerTS Editor Assistant — MCP version\" | Only `com.tencent.puerts.mcp` (plus its dependencies: `core`, `v8`, `agent`) |\r\n\r\n4. **Check the release page** `https://github.com/Tencent/puerts/releases/tag/Unity_v{VERSION}` to see which archives are available — note that actual filenames in the `.tar.gz` may have different version numbers than the release tag\r\n5. **For packages with native plugins** (`com.tencent.puerts.core`, `com.tencent.puerts.v8`, `com.tencent.puerts.lua`, `com.tencent.puerts.nodejs`, `com.tencent.puerts.python`, `com.tencent.puerts.quickjs`): guide the user to download and extract into `Packages/`\r\n6. **For packages without native plugins** (`com.tencent.puerts.webgl`, `com.tencent.puerts.agent`, `com.tencent.puerts.mcp`):\r\n   - If the `.tar.gz` exists on the release page → offer both download or git URL options\r\n   - If the `.tar.gz` does NOT exist on the release page → use the unversioned git URL\r\n7. **Verify** the installation by checking `Packages/manifest.json` for the expected package entries\r\n\r\n---\r\n\r\n## 6. Verifying Installation\r\n\r\nAfter installation, the following package IDs should appear in `Packages/manifest.json` (depending on which packages were installed):\r\n\r\n- `com.tencent.puerts.core`\r\n- `com.tencent.puerts.v8` (or other backend: `com.tencent.puerts.lua`, `com.tencent.puerts.nodejs`, `com.tencent.puerts.python`, `com.tencent.puerts.quickjs`)\r\n- `com.tencent.puerts.agent`\r\n- `com.tencent.puerts.webgl`\r\n- `com.tencent.puerts.mcp`\r\n\r\n---\r\n\r\n## 7. Known Issues & Troubleshooting (Windows)\r\n\r\n### 7.1 `curl` on Windows is an alias for `Invoke-WebRequest` — use different flags\r\n\r\nOn Windows PowerShell, `curl` is an alias for `Invoke-WebRequest` and does **not** accept standard Unix `curl` flags like `-L`, `--max-time`, `-o`. Use the native PowerShell syntax instead:\r\n\r\n```powershell\r\n# ❌ Wrong — Unix curl flags don't work in PowerShell\r\ncurl -L --max-time 30 -o output.html https://...\r\n\r\n# ✅ Correct — use Invoke-WebRequest with PowerShell parameters\r\nInvoke-WebRequest -Uri \"https://...\" -OutFile \"output.html\" -UseBasicParsing\r\n```\r\n\r\n### 7.2 GitHub API rate limit when unauthenticated\r\n\r\nCalling `https://api.github.com/repos/Tencent/puerts/releases/tags/Unity_v{VERSION}` without authentication will quickly hit GitHub's rate limit (especially on shared IPs). \r\n\r\n**Workaround**: Instead of the API, fetch the **expanded assets HTML fragment** directly — it contains all download links and is not rate-limited:\r\n\r\n```powershell\r\nInvoke-WebRequest -Uri \"https://github.com/Tencent/puerts/releases/expanded_assets/Unity_v{VERSION}\" `\r\n    -OutFile \"assets.html\" -UseBasicParsing\r\n\r\n# Then extract download links with regex:\r\n$content = Get-Content \"assets.html\" -Raw\r\n$matches = [regex]::Matches($content, 'href=\"(/Tencent/puerts/releases/download[^\"]*)\"')\r\n$matches | ForEach-Object { $_.Groups[1].Value }\r\n```\r\n\r\nThis returns the exact filenames (e.g., `PuerTS_Core_3.0.2.tar.gz`) without consuming API quota.\r\n\r\n### 7.3 `Invoke-WebRequest` times out on large files\r\n\r\n`Invoke-WebRequest` can time out when downloading large packages (e.g., `PuerTS_V8` ~74 MB, `PuerTS_Nodejs` ~169 MB).\r\n\r\n**Workaround**: Use `Start-BitsTransfer` instead — it is more reliable for large files and does not time out:\r\n\r\n```powershell\r\nStart-BitsTransfer `\r\n    -Source \"https://github.com/Tencent/puerts/releases/download/Unity_v3.0.2/PuerTS_V8_3.0.2.tar.gz\" `\r\n    -Destination \"C:\\path\\to\\output\\PuerTS_V8_3.0.2.tar.gz\"\r\n```\r\n\r\n### 7.4 Release page HTML does not contain download links (JavaScript-rendered)\r\n\r\nThe main release page (`/releases/tag/Unity_v{VERSION}`) renders asset links via JavaScript — the raw HTML fetched by `Invoke-WebRequest` will **not** contain any `releases/download` links.\r\n\r\n**Solution**: Use the `expanded_assets` endpoint instead (see Section 7.2 above), which returns a static HTML fragment with all asset links.\r\n\r\n### 7.5 `manifest.json` must use `file:` prefix for local packages\r\n\r\nWhen packages are extracted into the `Packages/` directory, `manifest.json` must reference them with the `file:` prefix pointing to the subdirectory name:\r\n\r\n```json\r\n{\r\n  \"dependencies\": {\r\n    \"com.tencent.puerts.core\":   \"file:core\",\r\n    \"com.tencent.puerts.v8\":     \"file:v8\",\r\n    \"com.tencent.puerts.nodejs\": \"file:nodejs\",\r\n    \"com.tencent.puerts.agent\":  \"file:agent\",\r\n    \"com.tencent.puerts.mcp\":    \"file:mcp\"\r\n  }\r\n}\r\n```\r\n\r\nUnity will automatically resolve these local paths when the project is opened.\n\n<!-- File: unity/skills/puerts-agent-development/SKILL.md (Tokens: ~4106 | Category: anthropic-skill) -->\n---\r\nname: PuerTS Agent Development Guide\r\ndescription: Guide for developing LLM agents based on PuerTsAgent framework — covers resource directory structure, system-prompt, skills, builtin modules, and best practices.\r\n---\r\n\r\n# PuerTS Agent Development Guide\r\n\r\nThis skill provides the complete guide for developing LLM agents based on the PuerTsAgent framework.\r\n\r\n> **⚠️ Important — Required Packages**: This framework depends on PuerTS **core**, **v8**, and **agent** packages. Before proceeding, you **must** check the Unity project's `Packages/manifest.json` to verify that the following packages are installed:\r\n> - `com.tencent.puerts.core`\r\n> - `com.tencent.puerts.v8`\r\n> - `com.tencent.puerts.agent`\r\n>\r\n> If any of these packages are missing, they must be installed first before using this skill. you MUST first invoke the **\"Install PuerTS for Unity\"** skill to AUTO complete the setup.\r\n\r\n> **⚠️ Prerequisite**: Before using this skill to create or modify an agent, you **must** know the agent's resource directory path under Unity `Resources/` (e.g., `maze-runner`, `editor-assistant`). If the user has not provided this path, **ask the user** which `Resources/` subdirectory to use before proceeding. All agent files (system-prompt, skills, builtins) are organized under this path.\r\n\r\n> **⚠️ Builtin Language Choice**: When creating builtin modules, you **must ask the user** whether they want to write builtins in **TypeScript** or **JavaScript**:\r\n> - **TypeScript** → Create a dedicated TS project (with `package.json`, `tsconfig.json`, `esbuild.mjs`) whose build output (`outdir`) points to `Assets/Resources/<agent-name>/builtins/`. See [TypeScript Project Setup for Builtins](#typescript-project-setup-for-builtins) section below.\r\n> - **JavaScript** → Write `.mjs` files directly in `Assets/Resources/<agent-name>/builtins/`.\r\n\r\n## Overview\r\n\r\nIn this framework, an agent's behavior and capabilities are entirely defined by files in a **resource directory** (Resource Root). Different resource directories represent different agents — Unity editor assistants, in-game AI characters, or any role you need.\r\n\r\n> **Key Concept**: Both `system-prompt.md.txt` and files under `skills/` are essentially **prompts** (natural language instructions for the LLM). The only difference is their **loading strategy**:\r\n> - **`system-prompt.md.txt`** — Always present in context (persistent). Put prompts here that are needed for **most tasks**.\r\n> - **`skills/*.md.txt`** — Loaded on demand by the LLM via `loadSkill`. Put prompts here that are **not needed for every task** — they are loaded only when the LLM determines they are relevant.\r\n\r\n## Creating an Agent\r\n\r\nInitialize an agent in C# via its resource path:\r\n\r\n```csharp\r\nvar agent = new AgentScriptManager();\r\nagent.Initialize(\"maze-runner\", () =>\r\n{\r\n    Debug.Log(\"Maze runner agent is ready!\");\r\n});\r\n```\r\n\r\nThe first parameter of `Initialize` is the resource directory path under Unity `Resources/`. The framework loads the full agent definition from this directory:\r\n\r\n- **`system-prompt.md.txt`** — Role definition (System Prompt)\r\n- **`skills/`** — Domain skill documents (loaded on demand, optional)\r\n- **`builtins/`** — Built-in helper modules (executable JS modules)\r\n\r\n### Example Directory Structure\r\n\r\n```\r\nResources/maze-runner/\r\n├── system-prompt.md.txt          # Role definition (System Prompt)\r\n├── skills/                       # Domain skills (loaded on demand, optional)\r\n└── builtins/                     # Built-in modules (loaded on demand)\r\n    ├── maze-control.mjs          # Maze movement and status query\r\n    └── screenshot.mjs            # Screenshot to observe the maze\r\n```\r\n\r\nAll resource files are placed in Unity's `Resources/` directory.\r\n\r\n> **File extension convention**: Unity `Resources` does not support `.md` and `.mjs` as TextAsset, so:\r\n> - Markdown files use `.md.txt` suffix\r\n> - JS module files use `.mjs` suffix\r\n\r\n---\r\n\r\n## 1. System Prompt — Role Definition\r\n\r\n### Purpose\r\n\r\n`system-prompt.md.txt` defines the agent's identity, personality, capabilities, and behavioral rules. It is injected at the beginning of the LLM's system prompt and is the core of the agent's \"persona.\"\r\n\r\n> **This is a persistent prompt** — it is always present in the LLM's context for every conversation turn. Therefore, put only the most frequently used instructions here — things the agent needs for the **majority** of its tasks. Avoid stuffing rarely-used domain knowledge here, as it permanently consumes context tokens.\r\n\r\n### File Location\r\n\r\n```text\r\n<resource-root>/system-prompt.md.txt\r\n```\r\n\r\n### Format\r\n\r\nPlain text / Markdown format, write role definition directly, no front-matter needed.\r\n\r\n### Example — Editor Assistant\r\n\r\n```markdown\r\nYou are a helpful AI assistant running inside Unity via PuerTS (a TypeScript/JavaScript runtime for Unity). You can help with game development, scripting, and general questions. Be concise and practical.\r\n```\r\n\r\n### Example — Maze AI (excerpt)\r\n\r\n```markdown\r\nYou are a Maze Explorer AI — an intelligent agent that navigates through 3D mazes by observing, reasoning, and acting.\r\n\r\n## Your Capabilities\r\n\r\nYou can control a player character in a 3D maze using two builtin modules:\r\n- **maze-control**: Move in compass directions (north/south/east/west) with `movePath()` and query obstacle distances with `getPlayerStatus()`\r\n- **screenshot**: Capture the game view to visually observe the maze\r\n\r\n## Goal Description\r\n\r\nYour goal is to reach the **maze exit marker** — a tall RED pillar with a bright RED glowing ring.\r\n```\r\n\r\n> The System Prompt describes the AI's identity, available modules, goals, exploration loops, navigation rules, etc. It can be lengthy — it defines the AI's behavior pattern throughout the task.\r\n\r\n---\r\n\r\n## 2. Skills — Domain Skills\r\n\r\n### Purpose\r\n\r\nA Skill is an **on-demand loaded** Markdown document providing domain-specific operation guides and rules for the LLM. The LLM actively loads skills into context via the `loadSkill` tool when needed.\r\n\r\n> **Skills are prompts too** — just like `system-prompt.md.txt`, they are natural language instructions. The key difference is that skills are **not always in context**. If a piece of knowledge is not needed for most tasks the agent handles, it belongs in a skill file rather than in the system prompt. This keeps the base context lean while still making specialized knowledge available when the LLM needs it.\r\n\r\n### File Location\r\n\r\n```text\r\n<resource-root>/skills/<skill-name>.md.txt\r\n```\r\n\r\n### File Format\r\n\r\nSkill files use **YAML front-matter** for metadata, body is Markdown content:\r\n\r\n```yaml\r\n---\r\nname: <skill-id>\r\ndescription: \"<one-line description shown to the LLM>\"\r\n---\r\n\r\n(Markdown body — the actual skill instructions)\r\n```\r\n\r\n| Front-matter Field | Required | Description |\r\n|---|---|---|\r\n| `name` | ✅ | Unique identifier, LLM calls `loadSkill` with this name |\r\n| `description` | ❌ | Short description shown in `loadSkill` available skills list |\r\n\r\n### Example\r\n\r\n`skills/puerts-interop.md.txt`:\r\n\r\n```yaml\r\n---\r\nname: puerts-interop\r\ndescription: \"PuerTS JS ↔ C# interop rules: CS/puer globals, out/ref params, generics, operators, Array/List indexer access, async/Task.\"\r\n---\r\n\r\n## PuerTS: JS ↔ C# Interop Rules\r\n...\r\n```\r\n\r\n### Design Tips\r\n\r\n- **description should be accurate**: LLM decides whether to load based on description\r\n- **content should be thorough**: skill docs are the LLM's only reference for specific tasks\r\n- **one domain per skill**: keep responsibilities single for precise loading\r\n- **system-prompt vs skill decision rule**: If the agent needs this knowledge in >80% of tasks → put it in `system-prompt.md.txt`. Otherwise → put it in `skills/` for on-demand loading\r\n\r\n---\r\n\r\n## 3. Builtin — Built-in Helper Modules\r\n\r\n### Purpose\r\n\r\nBuiltin modules are JavaScript modules providing pre-built helper functions for the LLM's `evalJsCode` tool. Unlike Skills, Builtins are actually executable code, not documentation.\r\n\r\n### File Location\r\n\r\n```text\r\n<resource-root>/builtins/<module-name>.mjs\r\n```\r\n\r\n> Source code can use TypeScript, JavaScript, or any language compilable to `.mjs`. The framework only cares about the final `.mjs` files in the resource directory.\r\n\r\n### Module Contract\r\n\r\nEvery Builtin module must export the following two string constants:\r\n\r\n| Export | Type | Description |\r\n|---|---|---|\r\n| `summary` | `string` | Short summary (~one line), always shown in `evalJsCode` tool description |\r\n| `description` | `string` | Detailed function signatures and usage, LLM reads via `import()` |\r\n\r\nAdditionally, the module's exported functions are the actual capabilities the LLM can call in `evalJsCode`.\r\n\r\n### Example — `builtins/unity-log.mjs` (shown as TypeScript source)\r\n\r\n```typescript\r\n// ---- Summary for tool description (always in context) ----\r\nexport const summary = `**unity-log** — Unity console log access (retrieve and summarize recent logs). Read \\`.description\\` to see available functions and their signatures.`;\r\n\r\n// ---- Description for on-demand access via import ----\r\nexport const description = `\r\n- **\\`getUnityLogs(count?, logType?)\\`** — Get recent Unity console logs.\r\n  - \\`count\\` (number, default 20): Number of log entries to retrieve (1-50).\r\n  - \\`logType\\` (string, default \\`'all'\\`): Filter by type — \\`'all'\\`, \\`'error'\\`, \\`'warning'\\`, or \\`'log'\\`.\r\n  - Returns an array of log entry objects: \\`{ timestamp, type, message, stackTrace? }\\`.\r\n`.trim();\r\n\r\n// ---- Function implementations ----\r\nexport function getUnityLogs(count: number = 20, logType: string = 'all'): LogEntry[] {\r\n    const logsJson = CS.LLMAgent.UnityLogBridge.GetRecentLogs(count, logType);\r\n    return JSON.parse(logsJson);\r\n}\r\n```\r\n\r\n### Example — `builtins/maze-control.mjs` (TypeScript source, excerpt)\r\n\r\n```typescript\r\nexport const summary = `**maze-control** — Control the player in the maze. \\`movePath([{dir, steps}, ...])\\` executes a multi-segment path. \\`getPlayerStatus()\\` returns position and obstacle distances. Read \\`.description\\` for details.`;\r\n\r\nexport const description = `\r\n- **\\`movePath(segments)\\`** — Move the player along a multi-segment planned path.\r\n  - \\`segments\\` (array): Array of \\`{ dir: string, steps: number }\\`.\r\n  - Returns: \\`{ success, stepsCompleted, blocked, reachedGoal, position, message }\\`\r\n- **\\`getPlayerStatus()\\`** — Get the player's position and obstacle distances.\r\n  - Returns: \\`{ position, northDistance, southDistance, eastDistance, westDistance, reachedGoal }\\`\r\n`.trim();\r\n\r\nexport async function movePath(segments: PathSegment[]): Promise<MoveSequenceResult> {\r\n    const directionsJson = JSON.stringify(segments.map(s => s.dir));\r\n    const distancesJson = JSON.stringify(segments.map(s => s.steps));\r\n    const resultJson = await new Promise<string>((resolve, reject) => {\r\n        CS.LLMAgent.MazePlayerBridge.MoveSequenceV2(directionsJson, distancesJson, (json: string) => resolve(json));\r\n    });\r\n    return JSON.parse(resultJson);\r\n}\r\n\r\nexport async function getPlayerStatus(): Promise<PlayerStatusResult> {\r\n    const resultJson = await new Promise<string>((resolve, reject) => {\r\n        CS.LLMAgent.MazePlayerBridge.GetPlayerStatus((json: string) => resolve(json));\r\n    });\r\n    return JSON.parse(resultJson);\r\n}\r\n```\r\n\r\n### Design Tips\r\n\r\n- **summary should be brief**: it always consumes tokens, just convey the module's purpose\r\n- **description must list complete signatures**: LLM must read description before calling functions\r\n- **functions should validate parameters**: LLM may pass incorrect params, validate and throw meaningful errors\r\n- **top-level await is supported**: modules can use `await` at top level (e.g., async initialization)\r\n- C# bridge classes must be pre-implemented on the Unity side\r\n\r\n---\r\n\r\n## 4. Complete Development Workflow\r\n\r\n### Step 1: Create Resource Directory\r\n\r\n```\r\nResources/<agent-name>/\r\n├── system-prompt.md.txt\r\n├── skills/\r\n└── builtins/\r\n```\r\n\r\n### Step 2: Write Role Definition\r\n\r\nEdit `system-prompt.md.txt` to define the AI's identity and behavioral rules. For example, a maze AI should describe:\r\n- Role identity (maze explorer)\r\n- Available modules (maze-control, screenshot)\r\n- Goal (reach the red exit marker)\r\n- Exploration loop (observe → plan → act)\r\n- Navigation strategy (right-hand rule, dead-end detection, etc.)\r\n\r\n### Step 3: Write Domain Skills (Optional)\r\n\r\nCreate `.md.txt` files in the `skills/` directory with YAML front-matter and skill content.\r\n\r\n> The Maze Demo doesn't use skill files — all navigation rules are directly in system-prompt. When domain knowledge is extensive and doesn't need to be loaded every time, splitting into skills is more appropriate.\r\n\r\n### Step 4: Write Helper Modules\r\n\r\nFirst, ask the user whether to write builtins in **TypeScript** or **JavaScript**:\r\n\r\n- **TypeScript**: Create a dedicated TS project following the [TypeScript Project Setup for Builtins](#typescript-project-setup-for-builtins) template (Section 6). The project's build output will automatically go to `Resources/<agent-name>/builtins/`.\r\n- **JavaScript**: Write `.mjs` files directly in `Assets/Resources/<agent-name>/builtins/`.\r\n\r\n### Step 5: Initialize the Agent\r\n\r\nIn C# code, initialize the agent with the corresponding resource path (see \"Creating an Agent\" section above).\r\n\r\n---\r\n\r\n## 5. Best Practices\r\n\r\n### System Prompt\r\n- Keep it concise and clear, avoid excessive length (it always consumes context tokens)\r\n- Focus on \"who you are\" and \"what you should do\", don't include framework runtime details\r\n- Only include prompts needed for the **majority** of tasks — this is always-on context\r\n\r\n### Skills\r\n- Split complex domain knowledge into separate skill files\r\n- Include keywords in description to help LLM decide when to load\r\n- The more detailed the better — this is the LLM's only reference for the task\r\n- Remember: skills and system-prompt are both prompts; the difference is persistent vs on-demand loading\r\n\r\n### Builtins\r\n- Each module focuses on one functional area (e.g., scene operations, log queries)\r\n- Summary should be one line, description must list all function signatures completely\r\n- All exported functions should validate parameters and throw meaningful errors\r\n\r\n### General\r\n- One resource directory = one independent agent role\r\n- Different agents are completely isolated, can have entirely different skills and toolsets\r\n\r\n---\r\n\r\n## 6. TypeScript Project Setup for Builtins\r\n\r\nWhen the user chooses TypeScript for builtins, create a dedicated TS project with the following structure and files. Replace `<agent-name>` with the actual agent name (e.g., `maze-runner`).\r\n\r\n### Project Structure\r\n\r\n```\r\nTs<AgentNamePascalCase>/          # e.g., TsMazeRunner/\r\n├── package.json\r\n├── tsconfig.json\r\n├── esbuild.mjs                   # Build script — outputs to Resources/<agent-name>/builtins/\r\n└── src/\r\n    └── builtins/\r\n        └── <module-name>.mts     # TypeScript source files\r\n```\r\n\r\n### package.json Template\r\n\r\n```json\r\n{\r\n  \"name\": \"<agent-name>\",\r\n  \"version\": \"1.0.0\",\r\n  \"description\": \"<Agent description> - TypeScript builtins\",\r\n  \"private\": true,\r\n  \"scripts\": {\r\n    \"build\": \"node esbuild.mjs\",\r\n    \"typecheck\": \"tsc --noEmit\"\r\n  },\r\n  \"devDependencies\": {\r\n    \"esbuild\": \"^0.25.0\",\r\n    \"typescript\": \"^5.4.0\"\r\n  }\r\n}\r\n```\r\n\r\n### tsconfig.json Template\r\n\r\n```json\r\n{\r\n  \"compilerOptions\": {\r\n    \"target\": \"esnext\",\r\n    \"module\": \"nodenext\",\r\n    \"moduleResolution\": \"nodenext\",\r\n    \"rootDir\": \"src\",\r\n    \"strict\": true,\r\n    \"esModuleInterop\": true,\r\n    \"skipLibCheck\": true,\r\n    \"forceConsistentCasingInFileNames\": true,\r\n    \"declaration\": false,\r\n    \"sourceMap\": false,\r\n    \"noEmit\": true,\r\n    \"typeRoots\": [\"../Assets/Gen/Typing\", \"../puerts/unity/upms/core/Typing\"]\r\n  },\r\n  \"include\": [\"src/**/*.mts\", \"src/**/*.d.ts\", \"../Assets/Gen/Typing/csharp/index.d.ts\"],\r\n  \"exclude\": [\"node_modules\"]\r\n}\r\n```\r\n\r\n### esbuild.mjs Template\r\n\r\n```javascript\r\nimport { build } from 'esbuild';\r\nimport { readdirSync, mkdirSync, existsSync } from 'fs';\r\nimport { join } from 'path';\r\n\r\n// Build <agent-name> builtins modules\r\nconst builtinSrcDir = 'src/builtins';\r\nconst builtinOutDir = '../Assets/Resources/<agent-name>/builtins';\r\n\r\nconst builtinFiles = existsSync(builtinSrcDir)\r\n    ? readdirSync(builtinSrcDir).filter(f =>\r\n        f.endsWith('.mts') && !f.endsWith('.d.mts'))\r\n    : [];\r\n\r\nif (builtinFiles.length > 0) {\r\n    if (!existsSync(builtinOutDir)) {\r\n        mkdirSync(builtinOutDir, { recursive: true });\r\n    }\r\n\r\n    const builtinEntries = builtinFiles.map(f => join(builtinSrcDir, f));\r\n\r\n    await build({\r\n        entryPoints: builtinEntries,\r\n        bundle: true,\r\n        format: 'esm',\r\n        outdir: builtinOutDir,\r\n        outExtension: { '.js': '.mjs' },\r\n        platform: 'neutral',\r\n        target: 'esnext',\r\n        sourcemap: false,\r\n        minify: false,\r\n        keepNames: true,\r\n        external: [],\r\n        define: {\r\n            'process.env.NODE_ENV': '\"production\"',\r\n        },\r\n    });\r\n\r\n    console.log(`[esbuild:<agent-name>] Built ${builtinFiles.length} builtins module(s) → ${builtinOutDir}/`);\r\n} else {\r\n    console.log('[esbuild:<agent-name>] No builtins modules found in src/builtins/');\r\n}\r\n```\r\n\r\n### Setup Steps\r\n\r\nAfter creating the project files:\r\n\r\n1. Run `npm install` in the project directory to install dependencies\r\n2. Write `.mts` source files in `src/builtins/`\r\n3. Run `npm run build` to compile and output `.mjs` files to `Assets/Resources/<agent-name>/builtins/`\r\n4. Run `npm run typecheck` for type checking (optional but recommended)\n\n<!-- File: unity/test/unity/Packages/manifest.json (Tokens: ~887 | Category: anthropic-skill) -->\n{\n  \"dependencies\": {\n    \"com.tencent.puerts.commonjs\": \"file:../../../upms/commonjs\",\n    \"com.tencent.puerts.core\": \"file:../../../upms/core\",\n    \"com.tencent.puerts.lua\": \"file:../../../upms/lua\",\n    \"com.tencent.puerts.nodejs\": \"file:../../../upms/nodejs\",\n    \"com.tencent.puerts.python\": \"file:../../../upms/python\",\n    \"com.tencent.puerts.quickjs\": \"file:../../../upms/quickjs\",\n\t\"com.tencent.puerts.v8\": \"file:../../../upms/v8\",\n    \"com.tencent.puerts.unittest\": \"file:../../Src\",\n    \"com.unity.2d.sprite\": \"1.0.0\",\n    \"com.unity.2d.tilemap\": \"1.0.0\",\n    \"com.unity.ads\": \"3.7.5\",\n    \"com.unity.analytics\": \"3.6.12\",\n    \"com.unity.collab-proxy\": \"2.0.0\",\n    \"com.unity.ide.rider\": \"3.0.18\",\n    \"com.unity.ide.visualstudio\": \"2.0.17\",\n    \"com.unity.ide.vscode\": \"1.2.5\",\n    \"com.unity.purchasing\": \"4.5.2\",\n    \"com.unity.test-framework\": \"1.1.31\",\n    \"com.unity.textmeshpro\": \"3.0.6\",\n    \"com.unity.timeline\": \"1.6.4\",\n    \"com.unity.ugui\": \"1.0.0\",\n    \"com.unity.xr.legacyinputhelpers\": \"2.1.10\",\n    \"com.unity.modules.ai\": \"1.0.0\",\n    \"com.unity.modules.androidjni\": \"1.0.0\",\n    \"com.unity.modules.animation\": \"1.0.0\",\n    \"com.unity.modules.assetbundle\": \"1.0.0\",\n    \"com.unity.modules.audio\": \"1.0.0\",\n    \"com.unity.modules.cloth\": \"1.0.0\",\n    \"com.unity.modules.director\": \"1.0.0\",\n    \"com.unity.modules.imageconversion\": \"1.0.0\",\n    \"com.unity.modules.imgui\": \"1.0.0\",\n    \"com.unity.modules.jsonserialize\": \"1.0.0\",\n    \"com.unity.modules.particlesystem\": \"1.0.0\",\n    \"com.unity.modules.physics\": \"1.0.0\",\n    \"com.unity.modules.physics2d\": \"1.0.0\",\n    \"com.unity.modules.screencapture\": \"1.0.0\",\n    \"com.unity.modules.terrain\": \"1.0.0\",\n    \"com.unity.modules.terrainphysics\": \"1.0.0\",\n    \"com.unity.modules.tilemap\": \"1.0.0\",\n    \"com.unity.modules.ui\": \"1.0.0\",\n    \"com.unity.modules.uielements\": \"1.0.0\",\n    \"com.unity.modules.umbra\": \"1.0.0\",\n    \"com.unity.modules.unityanalytics\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequestassetbundle\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequestaudio\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequesttexture\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequestwww\": \"1.0.0\",\n    \"com.unity.modules.vehicles\": \"1.0.0\",\n    \"com.unity.modules.video\": \"1.0.0\",\n    \"com.unity.modules.vr\": \"1.0.0\",\n    \"com.unity.modules.wind\": \"1.0.0\",\n    \"com.unity.modules.xr\": \"1.0.0\"\n  }\n}\n\n<!-- File: unity/test/unity/Packages/packages-lock.json (Tokens: ~3875 | Category: anthropic-skill) -->\n{\n  \"dependencies\": {\n    \"com.tencent.puerts.commonjs\": {\n      \"version\": \"file:../../../upms/commonjs\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {}\n    },\n    \"com.tencent.puerts.core\": {\n      \"version\": \"file:../../../upms/core\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {}\n    },\n    \"com.tencent.puerts.lua\": {\n      \"version\": \"file:../../../upms/lua\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.tencent.puerts.nodejs\": {\n      \"version\": \"file:../../../upms/nodejs\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.tencent.puerts.python\": {\n      \"version\": \"file:../../../upms/python\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.tencent.puerts.quickjs\": {\n      \"version\": \"file:../../../upms/quickjs\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.tencent.puerts.unittest\": {\n      \"version\": \"file:../../Src\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {}\n    },\n    \"com.tencent.puerts.v8\": {\n      \"version\": \"file:../../../upms/v8\",\n      \"depth\": 0,\n      \"source\": \"local\",\n      \"dependencies\": {\n        \"com.tencent.puerts.core\": \"3.0.0\"\n      }\n    },\n    \"com.unity.2d.sprite\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.2d.tilemap\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.tilemap\": \"1.0.0\",\n        \"com.unity.modules.uielements\": \"1.0.0\"\n      }\n    },\n    \"com.unity.ads\": {\n      \"version\": \"3.7.5\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.analytics\": {\n      \"version\": \"3.6.12\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.collab-proxy\": {\n      \"version\": \"2.0.0\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ext.nunit\": {\n      \"version\": \"1.0.6\",\n      \"depth\": 1,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ide.rider\": {\n      \"version\": \"3.0.18\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ext.nunit\": \"1.0.6\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ide.visualstudio\": {\n      \"version\": \"2.0.17\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.test-framework\": \"1.1.9\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ide.vscode\": {\n      \"version\": \"1.2.5\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.nuget.newtonsoft-json\": {\n      \"version\": \"3.2.0\",\n      \"depth\": 2,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.purchasing\": {\n      \"version\": \"4.5.2\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\",\n        \"com.unity.modules.unityanalytics\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\",\n        \"com.unity.modules.androidjni\": \"1.0.0\",\n        \"com.unity.services.core\": \"1.3.1\",\n        \"com.unity.services.analytics\": \"4.0.1\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.services.analytics\": {\n      \"version\": \"4.4.0\",\n      \"depth\": 1,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\",\n        \"com.unity.services.core\": \"1.8.1\",\n        \"com.unity.nuget.newtonsoft-json\": \"3.0.2\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.services.core\": {\n      \"version\": \"1.8.2\",\n      \"depth\": 1,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.nuget.newtonsoft-json\": \"3.0.2\",\n        \"com.unity.modules.androidjni\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.test-framework\": {\n      \"version\": \"1.1.31\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ext.nunit\": \"1.0.6\",\n        \"com.unity.modules.imgui\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.textmeshpro\": {\n      \"version\": \"3.0.6\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.timeline\": {\n      \"version\": \"1.6.4\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.modules.director\": \"1.0.0\",\n        \"com.unity.modules.animation\": \"1.0.0\",\n        \"com.unity.modules.audio\": \"1.0.0\",\n        \"com.unity.modules.particlesystem\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.ugui\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.ui\": \"1.0.0\",\n        \"com.unity.modules.imgui\": \"1.0.0\"\n      }\n    },\n    \"com.unity.xr.legacyinputhelpers\": {\n      \"version\": \"2.1.10\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.modules.vr\": \"1.0.0\",\n        \"com.unity.modules.xr\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.cn\"\n    },\n    \"com.unity.modules.ai\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.androidjni\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.animation\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.assetbundle\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.audio\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.cloth\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.director\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.audio\": \"1.0.0\",\n        \"com.unity.modules.animation\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.imageconversion\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.imgui\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.jsonserialize\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.particlesystem\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.physics\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.physics2d\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.screencapture\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.imageconversion\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.subsystems\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 1,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.terrain\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.terrainphysics\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\",\n        \"com.unity.modules.terrain\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.tilemap\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics2d\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.ui\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.uielements\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.ui\": \"1.0.0\",\n        \"com.unity.modules.imgui\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.umbra\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.unityanalytics\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequest\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.unitywebrequestassetbundle\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.assetbundle\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequestaudio\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.audio\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequesttexture\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.imageconversion\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequestwww\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequestassetbundle\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequestaudio\": \"1.0.0\",\n        \"com.unity.modules.audio\": \"1.0.0\",\n        \"com.unity.modules.assetbundle\": \"1.0.0\",\n        \"com.unity.modules.imageconversion\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.vehicles\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.video\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.audio\": \"1.0.0\",\n        \"com.unity.modules.ui\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.vr\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.jsonserialize\": \"1.0.0\",\n        \"com.unity.modules.physics\": \"1.0.0\",\n        \"com.unity.modules.xr\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.wind\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.xr\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\",\n        \"com.unity.modules.subsystems\": \"1.0.0\"\n      }\n    }\n  }\n}\n</yakaai_skills>"}