@alpsckr/unitycli 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +109 -300
  2. package/contracts/init-contract.json +57 -0
  3. package/contracts/instances-contract.json +49 -0
  4. package/contracts/package-assembly-closure.json +33 -0
  5. package/contracts/package-files.json +1953 -0
  6. package/dist/bridge/session-supervisor.d.ts +2 -0
  7. package/dist/bridge/session-supervisor.js +52 -19
  8. package/dist/bridge/session-supervisor.js.map +1 -1
  9. package/dist/cli-commands/command.js +33 -15
  10. package/dist/cli-commands/command.js.map +1 -1
  11. package/dist/cli-commands/init-discovery.d.ts +4 -0
  12. package/dist/cli-commands/init-discovery.js +175 -0
  13. package/dist/cli-commands/init-discovery.js.map +1 -0
  14. package/dist/cli-commands/init-help.d.ts +3 -0
  15. package/dist/cli-commands/init-help.js +37 -0
  16. package/dist/cli-commands/init-help.js.map +1 -0
  17. package/dist/cli-commands/init-skill.d.ts +10 -0
  18. package/dist/cli-commands/init-skill.js +105 -0
  19. package/dist/cli-commands/init-skill.js.map +1 -0
  20. package/dist/cli-commands/instances.d.ts +4 -0
  21. package/dist/cli-commands/instances.js +90 -0
  22. package/dist/cli-commands/instances.js.map +1 -0
  23. package/dist/cli-commands/package.d.ts +2 -2
  24. package/dist/cli-commands/package.js +57 -137
  25. package/dist/cli-commands/package.js.map +1 -1
  26. package/dist/cli-commands/skill-installer.d.ts +14 -6
  27. package/dist/cli-commands/skill-installer.js +37 -38
  28. package/dist/cli-commands/skill-installer.js.map +1 -1
  29. package/dist/cli-commands/types.d.ts +1 -0
  30. package/dist/cli.d.ts +1 -1
  31. package/dist/cli.js +44 -37
  32. package/dist/cli.js.map +1 -1
  33. package/dist/contracts/command-contract.js +1 -0
  34. package/dist/contracts/command-contract.js.map +1 -1
  35. package/dist/doctor.js +1 -1
  36. package/dist/doctor.js.map +1 -1
  37. package/dist/instances.d.ts +1 -1
  38. package/dist/instances.js +63 -38
  39. package/dist/instances.js.map +1 -1
  40. package/dist/output.d.ts +4 -4
  41. package/dist/output.js +3 -4
  42. package/dist/output.js.map +1 -1
  43. package/dist/package-manager.d.ts +43 -2
  44. package/dist/package-manager.js +255 -16
  45. package/dist/package-manager.js.map +1 -1
  46. package/dist/tools/.generated-schemas.js +2 -2
  47. package/dist/tools/.generated-schemas.js.map +1 -1
  48. package/dist/tools/commands.js +11 -4
  49. package/dist/tools/commands.js.map +1 -1
  50. package/dist/tools/dispatcher.js +1 -1
  51. package/dist/tools/dispatcher.js.map +1 -1
  52. package/dist/tools/tools/group-list.d.ts +4 -8
  53. package/dist/tools/tools/group-list.js +12 -13
  54. package/dist/tools/tools/group-list.js.map +1 -1
  55. package/dist/tools/tools/pagination.d.ts +17 -0
  56. package/dist/tools/tools/pagination.js +28 -0
  57. package/dist/tools/tools/pagination.js.map +1 -0
  58. package/dist/tools/tools/search.d.ts +3 -5
  59. package/dist/tools/tools/search.js +12 -12
  60. package/dist/tools/tools/search.js.map +1 -1
  61. package/docs/README.md +7 -4
  62. package/docs/architecture.md +103 -0
  63. package/docs/availability-differences.md +1 -1
  64. package/docs/command-execution.md +6 -1
  65. package/docs/development.md +91 -0
  66. package/docs/error-codes.md +5 -5
  67. package/docs/extensions.md +11 -13
  68. package/docs/target-and-instance.md +6 -4
  69. package/docs/tool-discovery.md +12 -10
  70. package/docs/tool-execution.md +3 -2
  71. package/package.json +10 -4
  72. package/schemas/init.schema.json +124 -0
  73. package/schemas/instances.schema.json +104 -0
  74. package/skills/unitycli/SKILL.md +18 -6
  75. package/skills/unitycli/manifest.json +2 -2
  76. package/skills/unitycli/references/custom-tools.md +3 -3
  77. package/skills/unitycli/references/operation-protocol.md +6 -4
  78. package/skills/unitycli/reports/output_quality_scorecard.md +1 -1
  79. package/skills/unitycli/reports/trust-report.md +1 -1
  80. package/unitypkg/Editor/Bridge/BridgeCommandRegistry.cs +1 -0
  81. package/unitypkg/Editor/Bridge/BridgeWorkQueue.cs +18 -6
  82. package/unitypkg/Editor/Infrastructure/CodeExecSupport.cs +8 -77
  83. package/unitypkg/Editor/Infrastructure/UnityCliInstanceCleanup.cs +295 -0
  84. package/unitypkg/Editor/Infrastructure/UnityCliInstanceRegistry.cs +166 -10
  85. package/unitypkg/Editor/Infrastructure/UnityCliOperationCoordinator.cs +1 -0
  86. package/unitypkg/Editor/UnityCliBridge.cs +5 -1
  87. package/unitypkg/Tests/Editor/UnityCliInstanceCleanupTests.cs +232 -0
  88. package/unitypkg/Tests/Editor/UnityCliInstancePublicationRetryTests.cs +143 -0
  89. package/unitypkg/UnityCli.Editor.asmdef +1 -5
  90. package/unitypkg/package.json +1 -1
  91. package/unitypkg/Editor/Roslyn/LICENSE.txt +0 -23
  92. package/unitypkg/Editor/Roslyn/Microsoft.CodeAnalysis.CSharp.dll +0 -0
  93. package/unitypkg/Editor/Roslyn/Microsoft.CodeAnalysis.dll +0 -0
  94. package/unitypkg/Editor/Roslyn/System.Collections.Immutable.dll +0 -0
  95. package/unitypkg/Editor/Roslyn/System.Reflection.Metadata.dll +0 -0
@@ -0,0 +1,175 @@
1
+ import { lstat, readFile, readdir, realpath, stat } from "node:fs/promises";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { failure, success } from "../output.js";
5
+ import { findSkillSourcePath, inspectSkillTarget, resolveSkillTarget } from "./skill-installer.js";
6
+ const maxDescendantDepth = 4;
7
+ const maxScannedDirectories = 2000;
8
+ const maxUnityProjects = 100;
9
+ const maxWorkspaceCandidates = 20;
10
+ const ignoredDirectories = new Set([".git", "node_modules", "library", "temp", "logs", "obj"]);
11
+ async function directoryExists(path) { try {
12
+ return (await stat(path)).isDirectory();
13
+ }
14
+ catch {
15
+ return false;
16
+ } }
17
+ async function readUnityVersion(path) {
18
+ try {
19
+ return /^m_EditorVersion:\s*(.+?)\s*$/m.exec(await readFile(join(path, "ProjectSettings", "ProjectVersion.txt"), "utf8"))?.[1];
20
+ }
21
+ catch {
22
+ return undefined;
23
+ }
24
+ }
25
+ async function unityProjectCandidate(path, relation, depth) {
26
+ try {
27
+ const info = await lstat(path);
28
+ if (!info.isDirectory() || info.isSymbolicLink())
29
+ return undefined;
30
+ const [assets, manifest, unityVersion] = await Promise.all([
31
+ directoryExists(join(path, "Assets")),
32
+ readFile(join(path, "Packages", "manifest.json"), "utf8").then((text) => { JSON.parse(text); return true; }).catch(() => false),
33
+ readUnityVersion(path),
34
+ ]);
35
+ return assets && manifest && unityVersion ? { path: await realpath(path), unityVersion, relation, depth } : undefined;
36
+ }
37
+ catch {
38
+ return undefined;
39
+ }
40
+ }
41
+ function pathIdentity(path) { return process.platform === "win32" ? path.toLowerCase() : path; }
42
+ async function findRepositoryRoot(cwd) {
43
+ let current = cwd;
44
+ for (let depth = 0; depth < 64; depth += 1) {
45
+ try {
46
+ await lstat(join(current, ".git"));
47
+ return current;
48
+ }
49
+ catch { /* continue */ }
50
+ const parent = dirname(current);
51
+ if (parent === current)
52
+ break;
53
+ current = parent;
54
+ }
55
+ return undefined;
56
+ }
57
+ async function discoverUnityProjects(cwd) {
58
+ const projects = [];
59
+ const identities = new Set();
60
+ const add = (candidate) => {
61
+ if (!candidate || projects.length >= maxUnityProjects || identities.has(pathIdentity(candidate.path)))
62
+ return;
63
+ identities.add(pathIdentity(candidate.path));
64
+ projects.push(candidate);
65
+ };
66
+ let ancestor = cwd;
67
+ for (let depth = 0; depth < 64; depth += 1) {
68
+ add(await unityProjectCandidate(ancestor, depth === 0 ? "cwd" : "ancestor", depth));
69
+ const parent = dirname(ancestor);
70
+ if (parent === ancestor)
71
+ break;
72
+ ancestor = parent;
73
+ }
74
+ const queue = [{ path: cwd, depth: 0 }];
75
+ let scannedDirectories = 0;
76
+ let truncated = false;
77
+ for (let index = 0; index < queue.length; index += 1) {
78
+ const item = queue[index];
79
+ if (++scannedDirectories > maxScannedDirectories || projects.length >= maxUnityProjects) {
80
+ truncated = true;
81
+ break;
82
+ }
83
+ if (item.depth > 0)
84
+ add(await unityProjectCandidate(item.path, "descendant", item.depth));
85
+ if (item.depth >= maxDescendantDepth)
86
+ continue;
87
+ let entries;
88
+ try {
89
+ entries = await readdir(item.path, { withFileTypes: true });
90
+ }
91
+ catch {
92
+ continue;
93
+ }
94
+ for (const entry of entries.sort((left, right) => left.name < right.name ? -1 : left.name > right.name ? 1 : 0)) {
95
+ if (!entry.isDirectory() || entry.isSymbolicLink() || ignoredDirectories.has(entry.name.toLowerCase()))
96
+ continue;
97
+ if (queue.length >= maxScannedDirectories) {
98
+ truncated = true;
99
+ break;
100
+ }
101
+ queue.push({ path: join(item.path, entry.name), depth: item.depth + 1 });
102
+ }
103
+ }
104
+ projects.sort((left, right) => left.path < right.path ? -1 : left.path > right.path ? 1 : 0);
105
+ return { projects, scannedDirectories: Math.min(scannedDirectories, maxScannedDirectories), truncated };
106
+ }
107
+ function workspaceCandidates(cwd, repositoryRoot, projects) {
108
+ const values = [{ path: cwd, reason: "current-working-directory" }];
109
+ if (repositoryRoot && pathIdentity(repositoryRoot) !== pathIdentity(cwd))
110
+ values.push({ path: repositoryRoot, reason: "repository-root" });
111
+ for (const project of projects)
112
+ values.push({ path: dirname(project.path), reason: "unity-project-parent" });
113
+ const seen = new Set();
114
+ return values.filter((item) => { const id = pathIdentity(item.path); if (seen.has(id) || seen.size >= maxWorkspaceCandidates)
115
+ return false; seen.add(id); return true; });
116
+ }
117
+ export async function discoverInitEnvironment(cwdInput, userHomeInput) {
118
+ const cwd = await realpath(resolve(cwdInput));
119
+ const userHome = await realpath(resolve(userHomeInput));
120
+ const repositoryRoot = await findRepositoryRoot(cwd);
121
+ const discovery = await discoverUnityProjects(cwd);
122
+ const workspaces = workspaceCandidates(cwd, repositoryRoot, discovery.projects);
123
+ const sourcePath = await findSkillSourcePath();
124
+ const copies = [];
125
+ for (const workspace of workspaces)
126
+ for (const agent of [".agents", "claude"]) {
127
+ const targetPath = resolveSkillTarget(workspace.path, agent);
128
+ copies.push({ scope: "workspace", workspace: workspace.path, agent, ...await inspectSkillTarget(sourcePath, targetPath) });
129
+ }
130
+ for (const agent of [".agents", "claude"]) {
131
+ const targetPath = resolveSkillTarget(userHome, agent);
132
+ copies.push({ scope: "user", agent, ...await inspectSkillTarget(sourcePath, targetPath) });
133
+ }
134
+ const shadowingRisks = [".agents", "claude"].flatMap((agent) => {
135
+ const matches = copies.filter((copy) => copy.agent === agent && copy.status !== "missing");
136
+ if (matches.length < 2)
137
+ return [];
138
+ return [{
139
+ skill: "unitycli",
140
+ agent,
141
+ precedence: agent === "claude" ? ["user", "workspace"] : ["workspace", "user"],
142
+ copies: matches,
143
+ note: agent === "claude" ? "Claude personal skills override workspace skills." : "Generic Agent Skills commonly prefer workspace skills over user skills.",
144
+ }];
145
+ });
146
+ return {
147
+ action: "init_discover", cwd, repositoryRoot: repositoryRoot ?? null,
148
+ limits: { maxDescendantDepth, maxScannedDirectories, maxUnityProjects, maxWorkspaceCandidates },
149
+ scan: { scannedDirectories: discovery.scannedDirectories, truncated: discovery.truncated },
150
+ unityProjects: discovery.projects, skillWorkspaces: workspaces, skillCopies: copies,
151
+ shadowingRisks,
152
+ requiredDecisions: [
153
+ { id: "bridgeProjects", question: "Which discovered Unity projects should receive the UnityCLI Bridge?", choices: discovery.projects.map((project) => project.path), multiple: true },
154
+ { id: "skillAgent", question: "Which Skill host should be configured?", choices: [".agents", "claude"], multiple: false },
155
+ { id: "skillScope", question: "Should the Skill be installed for one workspace or for the current user?", choices: ["workspace", "user"], multiple: false },
156
+ { id: "skillWorkspace", question: "If workspace scope is selected, which directory is the user's normal AI working directory?", choices: workspaces.map((workspace) => workspace.path), multiple: false },
157
+ ],
158
+ nextActions: ["Ask the user every required decision before running any installation effect.", "Use the exact command templates returned by `unitycli init help` after the user answers."],
159
+ };
160
+ }
161
+ /** 从当前工作目录有界发现安装现场,不修改文件或进程。 */
162
+ export async function handleInitDiscover(args, flags, requestId) {
163
+ if (args.length)
164
+ return failure(requestId, "E_INIT_ARGUMENT_UNEXPECTED", "init discover does not accept positional arguments.", ["Run `unitycli init discover` without additional arguments."]);
165
+ const unknown = Object.keys(flags).find((name) => name !== "pretty");
166
+ if (unknown)
167
+ return failure(requestId, "E_UNKNOWN_OPTION", `Unknown option for init discover: --${unknown}.`, ["Run `unitycli init discover` without options."], { option: `--${unknown}` });
168
+ try {
169
+ return success(requestId, await discoverInitEnvironment(process.cwd(), homedir()));
170
+ }
171
+ catch (error) {
172
+ return failure(requestId, "INIT_DISCOVERY_FAILED", error instanceof Error ? error.message : String(error), ["Run `unitycli init discover` from an existing readable working directory."]);
173
+ }
174
+ }
175
+ //# sourceMappingURL=init-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-discovery.js","sourceRoot":"","sources":["../../src/cli-commands/init-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CliResult } from "../types.js";
2
+ /** 返回静态、自足、无现场读取的 AI 安装协议。 */
3
+ export declare function handleInitHelp(args: string[], flags: Record<string, string | boolean>, requestId: string): CliResult;
@@ -0,0 +1,37 @@
1
+ import { failure, success } from "../output.js";
2
+ const commands = {
3
+ discover: "unitycli init discover",
4
+ packageInstall: "unitycli init package --project <UnityProject>",
5
+ packageCheck: "unitycli init package --project <UnityProject> --check",
6
+ workspaceSkillInstall: "unitycli init skill --agent <.agents|claude> --scope workspace --workspace <path>",
7
+ workspaceSkillCheck: "unitycli init skill --agent <.agents|claude> --scope workspace --workspace <path> --check",
8
+ userSkillInstall: "unitycli init skill --agent <.agents|claude> --scope user",
9
+ userSkillCheck: "unitycli init skill --agent <.agents|claude> --scope user --check",
10
+ };
11
+ /** 返回静态、自足、无现场读取的 AI 安装协议。 */
12
+ export function handleInitHelp(args, flags, requestId) {
13
+ if (args.length)
14
+ return failure(requestId, "E_INIT_ARGUMENT_UNEXPECTED", "init help does not accept positional arguments.", ["Run `unitycli init help` without additional arguments."]);
15
+ const unknown = Object.keys(flags).find((name) => name !== "pretty");
16
+ if (unknown)
17
+ return failure(requestId, "E_UNKNOWN_OPTION", `Unknown option for init help: --${unknown}.`, ["Run `unitycli init help` without options."], { option: `--${unknown}` });
18
+ return success(requestId, {
19
+ action: "init_help",
20
+ audience: "ai",
21
+ protocolVersion: 1,
22
+ aiInstructions: [
23
+ "Run `unitycli init discover` from the user's current working directory before making installation decisions.",
24
+ "Use discovery.requiredDecisions to ask the user which discovered Unity projects should receive the Bridge and which single Skill agent/scope/workspace target should be configured; do not infer or silently choose these values.",
25
+ "For multiple selected Unity projects, run one `init package` call at a time in strict serial order. Wait for and verify each terminal result before submitting the next call.",
26
+ "Install the UnityCLI Skill only once at the user-selected `.agents` or Claude workspace/user target unless the user explicitly requests more targets.",
27
+ "After every successful package or Skill installation, run the corresponding command with `--check` and verify its business status.",
28
+ "Stop immediately after the first unexpected CLI failure or failed business check. Report that terminal result and do not retry, change parameters, or continue with later installation effects.",
29
+ "Do not start, close, restart, or terminate Unity Editor as part of installation. Package import occurs when the user next opens or refreshes the selected project.",
30
+ "CLI installation calls are the authorized effects after the user answers the required decisions; do not add another confirmation gate.",
31
+ ],
32
+ commands,
33
+ nextCommand: commands.discover,
34
+ nextActions: [commands.discover],
35
+ });
36
+ }
37
+ //# sourceMappingURL=init-help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-help.js","sourceRoot":"","sources":["../../src/cli-commands/init-help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,QAAQ,GAAG;IACf,QAAQ,EAAE,wBAAwB;IAClC,cAAc,EAAE,gDAAgD;IAChE,YAAY,EAAE,wDAAwD;IACtE,qBAAqB,EAAE,mFAAmF;IAC1G,mBAAmB,EAAE,2FAA2F;IAChH,gBAAgB,EAAE,2DAA2D;IAC7E,cAAc,EAAE,mEAAmE;CAC3E,CAAC;AAEX,8BAA8B;AAC9B,MAAM,UAAU,cAAc,CAAC,IAAc,EAAE,KAAuC,EAAE,SAAiB;IACvG,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC,SAAS,EAAE,4BAA4B,EAAE,iDAAiD,EAAE,CAAC,wDAAwD,CAAC,CAAC,CAAC;IACxL,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACrE,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC,SAAS,EAAE,kBAAkB,EAAE,mCAAmC,OAAO,GAAG,EAAE,CAAC,2CAA2C,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,OAAO,EAAE,EAAE,CAAC,CAAC;IACrL,OAAO,OAAO,CAAC,SAAS,EAAE;QACxB,MAAM,EAAE,WAAW;QACnB,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,CAAC;QAClB,cAAc,EAAE;YACd,8GAA8G;YAC9G,mOAAmO;YACnO,+KAA+K;YAC/K,uJAAuJ;YACvJ,oIAAoI;YACpI,iMAAiM;YACjM,oKAAoK;YACpK,wIAAwI;SACzI;QACD,QAAQ;QACR,WAAW,EAAE,QAAQ,CAAC,QAAQ;QAC9B,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;KACjC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { CliResult } from "../types.js";
2
+ import { type AgentKind } from "./skill-installer.js";
3
+ import type { Runtime } from "./types.js";
4
+ export type SkillScope = "workspace" | "user";
5
+ export declare function resolveInitSkillTarget(agent: AgentKind, scope: SkillScope, workspace: string | undefined, userHome: string): {
6
+ basePath: string;
7
+ targetPath: string;
8
+ };
9
+ /** 安装或只读检查一个明确 agent/scope Skill target。 */
10
+ export declare function handleInitSkill(args: string[], flags: Record<string, string | boolean>, runtime: Runtime, requestId: string): Promise<CliResult>;
@@ -0,0 +1,105 @@
1
+ import { lstat, realpath, rm } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { join, resolve } from "node:path";
4
+ import { getBoolean, getString } from "../args.js";
5
+ import { failure, success } from "../output.js";
6
+ import { agentSkillInstaller, findSkillSourcePath, inspectSkillTarget, parseAgentList, resolveSkillTarget, SkillInstallerError } from "./skill-installer.js";
7
+ export function resolveInitSkillTarget(agent, scope, workspace, userHome) {
8
+ const basePath = scope === "user" ? resolve(userHome) : resolve(workspace);
9
+ return { basePath, targetPath: resolveSkillTarget(basePath, agent) };
10
+ }
11
+ async function assertRealDirectory(path, label) {
12
+ try {
13
+ const info = await lstat(path);
14
+ if (!info.isDirectory() || info.isSymbolicLink())
15
+ throw new Error("not a real directory");
16
+ return await realpath(path);
17
+ }
18
+ catch {
19
+ throw new SkillInstallerError("E_SKILL_ROOT_INVALID", `${label} must be an existing real directory: ${path}`, [`Pass an existing non-linked ${label.toLowerCase()} path.`]);
20
+ }
21
+ }
22
+ async function rejectLinkedTargetAncestors(basePath, agent) {
23
+ const agentRoot = join(basePath, agent === ".agents" ? ".agents" : ".claude");
24
+ for (const path of [agentRoot, join(agentRoot, "skills"), join(agentRoot, "skills", "unitycli")]) {
25
+ try {
26
+ const info = await lstat(path);
27
+ if (info.isSymbolicLink() || !info.isDirectory())
28
+ throw new SkillInstallerError("E_SKILL_TARGET_UNSAFE", `Skill target ancestor must be a real directory: ${path}`, ["Replace the linked or non-directory target ancestor before retrying."]);
29
+ }
30
+ catch (error) {
31
+ if (error.code === "ENOENT")
32
+ continue;
33
+ throw error;
34
+ }
35
+ }
36
+ }
37
+ function timeout(flags) {
38
+ const raw = getString(flags, "timeout-ms");
39
+ if (raw === undefined)
40
+ return 60_000;
41
+ const value = Number(raw);
42
+ return Number.isSafeInteger(value) && value > 0 ? value : undefined;
43
+ }
44
+ /** 安装或只读检查一个明确 agent/scope Skill target。 */
45
+ export async function handleInitSkill(args, flags, runtime, requestId) {
46
+ if (args.length)
47
+ return failure(requestId, "E_INIT_ARGUMENT_UNEXPECTED", "init skill does not accept positional arguments.", ["Run `unitycli init skill` using only documented options."]);
48
+ const agentRaw = getString(flags, "agent");
49
+ const scopeRaw = getString(flags, "scope");
50
+ if (!agentRaw)
51
+ return failure(requestId, "E_INIT_AGENT_REQUIRED", "init skill requires --agent <.agents|claude>.", ["Choose the Skill host after asking the user."], { option: "--agent" });
52
+ let agent;
53
+ try {
54
+ const agents = parseAgentList(agentRaw);
55
+ if (agents.length !== 1)
56
+ throw new SkillInstallerError("E_INIT_AGENT_INVALID", "init skill accepts exactly one agent target.", ["Pass either --agent .agents or --agent claude."]);
57
+ agent = agents[0];
58
+ }
59
+ catch (error) {
60
+ if (error instanceof SkillInstallerError)
61
+ return failure(requestId, error.code, error.message, error.nextActions);
62
+ throw error;
63
+ }
64
+ if (scopeRaw !== "workspace" && scopeRaw !== "user")
65
+ return failure(requestId, "E_INIT_SCOPE_INVALID", "init skill requires --scope <workspace|user>.", ["Ask the user whether this Skill belongs to one workspace or the current user."], { option: "--scope", actual: scopeRaw ?? null });
66
+ const scope = scopeRaw;
67
+ const workspaceRaw = getString(flags, "workspace");
68
+ if (scope === "workspace" && !workspaceRaw)
69
+ return failure(requestId, "E_INIT_WORKSPACE_REQUIRED", "Workspace Skill scope requires --workspace <path>.", ["Pass the user's normal AI working directory."], { option: "--workspace" });
70
+ if (scope === "user" && workspaceRaw)
71
+ return failure(requestId, "E_INIT_WORKSPACE_FORBIDDEN", "User Skill scope does not accept --workspace.", ["Remove --workspace or choose --scope workspace."], { option: "--workspace" });
72
+ const timeoutMs = timeout(flags);
73
+ if (timeoutMs === undefined)
74
+ return failure(requestId, "E_INIT_TIMEOUT_INVALID", "init skill --timeout-ms must be a positive integer.", ["Pass --timeout-ms <positive-integer>."], { option: "--timeout-ms" });
75
+ try {
76
+ const baseCandidate = scope === "user" ? resolve(runtime.userHome ?? homedir()) : resolve(workspaceRaw);
77
+ const basePath = await assertRealDirectory(baseCandidate, scope === "user" ? "User home" : "Workspace");
78
+ await rejectLinkedTargetAncestors(basePath, agent);
79
+ const targetPath = resolveSkillTarget(basePath, agent);
80
+ const sourcePath = await findSkillSourcePath();
81
+ if (getBoolean(flags, "check")) {
82
+ const inspection = await inspectSkillTarget(sourcePath, targetPath);
83
+ const installCommand = scope === "workspace"
84
+ ? `unitycli init skill --agent ${agent} --scope workspace --workspace ${JSON.stringify(basePath)}`
85
+ : `unitycli init skill --agent ${agent} --scope user`;
86
+ return success(requestId, { action: "init_skill_check", agent, scope, ...(scope === "workspace" ? { workspace: basePath } : {}), skill: inspection, nextActions: inspection.status === "installed" ? [] : [installCommand] });
87
+ }
88
+ const installRoot = scope === "user"
89
+ ? join(runtime.dataDir, ".temp", "skill-install", agent === ".agents" ? "agents" : agent)
90
+ : join(basePath, agent === ".agents" ? ".agents" : ".claude", "skills", ".unitycli-install");
91
+ const deadlineMs = Date.now() + timeoutMs;
92
+ const changes = await agentSkillInstaller.installForAgents([agent], sourcePath, basePath, deadlineMs, installRoot);
93
+ const inspection = await inspectSkillTarget(sourcePath, targetPath);
94
+ if (inspection.status !== "installed")
95
+ throw new SkillInstallerError("E_SKILL_INSTALL_PROJECTION_INVALID", "Skill installation did not reach an installed readback state.", ["Inspect the reported target before retrying."]);
96
+ await rm(installRoot, { recursive: true, force: true });
97
+ return success(requestId, { action: "init_skill", agent, scope, ...(scope === "workspace" ? { workspace: basePath } : {}), changes, skill: inspection, nextActions: ["Run the same init skill command with --check."] });
98
+ }
99
+ catch (error) {
100
+ if (error instanceof SkillInstallerError)
101
+ return failure(requestId, error.code, error.message, error.nextActions);
102
+ return failure(requestId, "INIT_SKILL_FAILED", error instanceof Error ? error.message : String(error), ["Inspect the Skill source and selected target before retrying."]);
103
+ }
104
+ }
105
+ //# sourceMappingURL=init-skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-skill.js","sourceRoot":"","sources":["../../src/cli-commands/init-skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CliResult } from "../types.js";
2
+ import type { Runtime } from "./types.js";
3
+ /** 顶层instances控制面:list纯读取,prune只授权当前Unity writer执行同一清理函数。 */
4
+ export declare function handleInstances(command: string | undefined, flags: Record<string, string | boolean>, runtime: Runtime, requestId: string): Promise<CliResult>;
@@ -0,0 +1,90 @@
1
+ import { executeBridgePayload, SessionSupervisor, SessionSupervisorError } from "../bridge/index.js";
2
+ import { handleInstancesCommand, instanceSelectionFailure } from "../instances.js";
3
+ import { failure, success } from "../output.js";
4
+ const DEFAULT_PRUNE_TIMEOUT_MS = 30_000;
5
+ /** 顶层instances控制面:list纯读取,prune只授权当前Unity writer执行同一清理函数。 */
6
+ export async function handleInstances(command, flags, runtime, requestId) {
7
+ const subCommand = command ?? "list";
8
+ if (subCommand !== "prune")
9
+ return handleInstancesCommand(subCommand, flags, runtime.dataDir, requestId);
10
+ return runWriterOwnedPrune(flags, runtime, requestId);
11
+ }
12
+ async function runWriterOwnedPrune(flags, runtime, requestId) {
13
+ const rawTimeout = flags["timeout-ms"];
14
+ const timeoutMs = rawTimeout === undefined ? DEFAULT_PRUNE_TIMEOUT_MS : typeof rawTimeout === "string" ? Number(rawTimeout) : Number.NaN;
15
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1) {
16
+ return failure(requestId, "E_SCHEMA_INVALID", "instances prune --timeout-ms must be a positive integer.", ["Pass --timeout-ms <positive-integer>."]);
17
+ }
18
+ const startedAtMs = Date.now();
19
+ const supervisor = new SessionSupervisor(flags, runtime);
20
+ try {
21
+ const admission = await supervisor.acquireRootAdmission({
22
+ requestId,
23
+ command: "instances.prune",
24
+ input: {},
25
+ dryRun: false,
26
+ target: "editor",
27
+ completionContractIdentity: "instances-prune-v1",
28
+ timeoutMs,
29
+ admissionAbsoluteDeadlineMs: startedAtMs + timeoutMs,
30
+ });
31
+ const result = await executeBridgePayload(requestId, "internal.instances.prune", {}, { ...flags, instance: admission.instanceId }, { ...runtime, rootAdmission: admission }, undefined, {
32
+ mode: "execute",
33
+ mutation: true,
34
+ absoluteDeadlineMs: admission.executionAbsoluteDeadlineMs,
35
+ });
36
+ await supervisor.completeRootAdmission(admission);
37
+ if (!result.ok)
38
+ return result;
39
+ const normalized = pruneResult(result.data);
40
+ if (!normalized) {
41
+ return failure(requestId, "E_BRIDGE_RESPONSE_INVALID", "Unity returned an invalid instances prune result.", [
42
+ "Update the selected UnityCLI Package so it matches the current CLI, then retry instances prune.",
43
+ ]);
44
+ }
45
+ return success(requestId, normalized);
46
+ }
47
+ catch (error) {
48
+ const selection = instanceSelectionFailure(requestId, error);
49
+ if (selection)
50
+ return selection;
51
+ if (error instanceof SessionSupervisorError) {
52
+ return failure(requestId, error.code, error.message, error.nextActions, error.details, {
53
+ transient: error.transient,
54
+ retryAfterMs: error.retryAfterMs,
55
+ });
56
+ }
57
+ return failure(requestId, "BRIDGE_CONNECTION_FAILED", error instanceof Error ? error.message : String(error), [
58
+ "Open the target Unity project, then retry unitycli instances prune from that project or pass --instance <id|projectPath|alias>.",
59
+ ], undefined, { transient: true, retryAfterMs: 100 });
60
+ }
61
+ }
62
+ function pruneResult(value) {
63
+ if (!exactObject(value, ["removed", "remaining", "deferred", "scanned", "truncated", "retention"]))
64
+ return undefined;
65
+ const root = value;
66
+ if (![root.removed, root.remaining, root.deferred, root.scanned].every(nonnegativeInteger) || typeof root.truncated !== "boolean")
67
+ return undefined;
68
+ if (!exactObject(root.retention, ["offlineMax", "damagedMax", "maxAgeDays", "scanLimit", "deleteLimit"]))
69
+ return undefined;
70
+ const retention = root.retention;
71
+ if (retention.offlineMax !== 100 || retention.damagedMax !== 20 || retention.maxAgeDays !== 30
72
+ || retention.scanLimit !== 2000 || retention.deleteLimit !== 20)
73
+ return undefined;
74
+ return {
75
+ removed: root.removed,
76
+ remaining: root.remaining,
77
+ deferred: root.deferred,
78
+ scanned: root.scanned,
79
+ truncated: root.truncated,
80
+ retention: { offlineMax: 100, damagedMax: 20, maxAgeDays: 30, scanLimit: 2000, deleteLimit: 20 },
81
+ };
82
+ }
83
+ function exactObject(value, keys) {
84
+ return !!value && typeof value === "object" && !Array.isArray(value)
85
+ && Object.keys(value).length === keys.length && keys.every((key) => Object.prototype.hasOwnProperty.call(value, key));
86
+ }
87
+ function nonnegativeInteger(value) {
88
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
89
+ }
90
+ //# sourceMappingURL=instances.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instances.js","sourceRoot":"","sources":["../../src/cli-commands/instances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACrG,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AACnF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAIhD,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAExC,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAA2B,EAC3B,KAAuC,EACvC,OAAgB,EAChB,SAAiB;IAEjB,MAAM,UAAU,GAAG,OAAO,IAAI,MAAM,CAAC;IACrC,IAAI,UAAU,KAAK,OAAO;QAAE,OAAO,sBAAsB,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACzG,OAAO,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AACxD,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,KAAuC,EAAE,OAAgB,EAAE,SAAiB;IAC7G,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IACzI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QACtD,OAAO,OAAO,CAAC,SAAS,EAAE,kBAAkB,EAAE,0DAA0D,EAAE,CAAC,uCAAuC,CAAC,CAAC,CAAC;IACvJ,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,IAAI,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,oBAAoB,CAAC;YACtD,SAAS;YACT,OAAO,EAAE,iBAAiB;YAC1B,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,QAAQ;YAChB,0BAA0B,EAAE,oBAAoB;YAChD,SAAS;YACT,2BAA2B,EAAE,WAAW,GAAG,SAAS;SACrD,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,SAAS,EAAE,0BAA0B,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,UAAU,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE;YACtL,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,IAAI;YACd,kBAAkB,EAAE,SAAS,CAAC,2BAA2B;SAC1D,CAAC,CAAC;QACH,MAAM,UAAU,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC;QAC9B,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,OAAO,CAAC,SAAS,EAAE,2BAA2B,EAAE,mDAAmD,EAAE;gBAC1G,iGAAiG;aAClG,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,wBAAwB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC7D,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC;QAChC,IAAI,KAAK,YAAY,sBAAsB,EAAE,CAAC;YAC5C,OAAO,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,EAAE;gBACrF,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,YAAY,EAAE,KAAK,CAAC,YAAY;aACjC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC,SAAS,EAAE,0BAA0B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YAC5G,iIAAiI;SAClI,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAiBD,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACrH,MAAM,IAAI,GAAG,KAAgC,CAAC;IAC9C,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACpJ,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3H,MAAM,SAAS,GAAG,IAAI,CAAC,SAAoC,CAAC;IAC5D,IAAI,SAAS,CAAC,UAAU,KAAK,GAAG,IAAI,SAAS,CAAC,UAAU,KAAK,EAAE,IAAI,SAAS,CAAC,UAAU,KAAK,EAAE;WACzF,SAAS,CAAC,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,WAAW,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACpF,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAiB;QAC/B,SAAS,EAAE,IAAI,CAAC,SAAmB;QACnC,QAAQ,EAAE,IAAI,CAAC,QAAkB;QACjC,OAAO,EAAE,IAAI,CAAC,OAAiB;QAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE;KACjG,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,IAAc;IACjD,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;WAC/D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;AAC1H,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAChF,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import type { CliResult } from "../types.js";
2
2
  import type { Runtime } from "./types.js";
3
- /** 安装 Core package、Agent Skill 和自动检测 Extension,并只返回文件系统 readback。 */
4
- export declare function handleInit(flags: Record<string, string | boolean>, runtime: Runtime, requestId: string): Promise<CliResult>;
3
+ /** 唯一 init 控制面分发;不保留裸 init 或旧混装 flag。 */
4
+ export declare function handleInit(command: string | undefined, args: string[], flags: Record<string, string | boolean>, runtime: Runtime, requestId: string): Promise<CliResult>;