@inspecto-dev/cli 0.3.0 → 0.3.2

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @inspecto-dev/cli
2
2
 
3
+ ## 0.3.2
4
+
5
+ ### Patch Changes
6
+
7
+ - - feat: migrate all 7 integrations to Native Agent Skills
8
+ - feat: add automated onboarding experience via URI schemes
9
+ - refactor: use shared capabilities strategy for tool detection
10
+ - docs: synchronize english and chinese documentation
11
+ - fix: update travis and action test configurations
12
+ - Updated dependencies
13
+ - @inspecto-dev/types@0.3.2
14
+
15
+ ## 0.3.1
16
+
17
+ ### Patch Changes
18
+
19
+ - fix: polish onboarding and architecture visualization
20
+ - Updated dependencies
21
+ - @inspecto-dev/types@0.3.1
22
+
3
23
  ## 0.3.0
4
24
 
5
25
  ### Minor Changes
package/README.md CHANGED
@@ -7,19 +7,26 @@ The official command-line interface for Inspecto. This tool automates the proces
7
7
  For most users, the preferred setup path is assistant-first onboarding via the integrations documented in:
8
8
  `packages/docs/integrations/onboarding-skills.md`
9
9
 
10
- Install those assistant integration assets with:
10
+ Run the install command for your assistant from the target project root:
11
11
 
12
12
  ```bash
13
- npx @inspecto-dev/cli integrations install <assistant>
13
+ npx @inspecto-dev/cli integrations install codex --host-ide vscode
14
+ npx @inspecto-dev/cli integrations install claude-code --scope project --host-ide vscode
15
+ npx @inspecto-dev/cli integrations install copilot --host-ide vscode
16
+ npx @inspecto-dev/cli integrations install cursor --host-ide cursor
17
+ npx @inspecto-dev/cli integrations install gemini --host-ide vscode
18
+ npx @inspecto-dev/cli integrations install trae --host-ide trae-cn
19
+ npx @inspecto-dev/cli integrations install coco --host-ide trae-cn
14
20
  ```
15
21
 
16
22
  Supported assistants currently include `codex`, `claude-code`, `copilot`, `cursor`, `gemini`, `trae`, and `coco`.
17
23
 
24
+ `--host-ide` values: `vscode`, `cursor`, `trae`, `trae-cn`.
25
+
18
26
  Inspect available integration targets with:
19
27
 
20
28
  ```bash
21
29
  npx @inspecto-dev/cli integrations list
22
- npx @inspecto-dev/cli integrations install codex
23
30
  npx @inspecto-dev/cli integrations path <assistant>
24
31
  ```
25
32
 
@@ -93,10 +100,123 @@ Manages assistant integration assets for the current project.
93
100
  Examples:
94
101
 
95
102
  ```bash
96
- inspecto integrations install codex
103
+ inspecto integrations install codex --host-ide vscode
97
104
  inspecto integrations path codex
98
- inspecto integrations install claude-code --scope project
99
- inspecto integrations install cursor --mode rules
105
+ inspecto integrations install claude-code --scope project --host-ide vscode
106
+ inspecto integrations install cursor --host-ide cursor
107
+ ```
108
+
109
+ #### `inspecto integrations doctor`
110
+
111
+ Runs integration preflight checks for a selected assistant without writing files, installing extensions, opening IDE windows, or launching onboarding.
112
+
113
+ Examples:
114
+
115
+ ```bash
116
+ inspecto integrations doctor codex --host-ide cursor
117
+ inspecto integrations doctor gemini --host-ide trae-cn --compact
118
+ inspecto integrations doctor codex --host-ide cursor --json
119
+ ```
120
+
121
+ Use `--compact` when you want a shorter human-readable summary. Use `--json` when the result will be consumed by tooling or CI.
122
+
123
+ Recommended workflow:
124
+
125
+ 1. Run `inspecto integrations install <assistant> --host-ide <ide>` from the target project root.
126
+ 2. Use `inspecto integrations doctor <assistant> --host-ide <ide> --compact` only when you want to check blockers before install.
127
+ 3. Use `--json` instead of `--compact` when the result is consumed by scripts or CI.
128
+
129
+ ##### JSON contract
130
+
131
+ `inspecto integrations doctor <assistant> --json` prints a single JSON object with this shape:
132
+
133
+ ```json
134
+ {
135
+ "schemaVersion": "1",
136
+ "status": "ok",
137
+ "assistant": "codex",
138
+ "assets": [".agents/skills/inspecto-onboarding-codex/SKILL.md"],
139
+ "message": "Preview complete. Inspecto did not write files or open IDE windows. Review the resolved setup below, then rerun without --preview to apply it.",
140
+ "nextStep": "Run the same command again without --preview to apply the integration and launch onboarding.",
141
+ "automation": {
142
+ "status": "preview",
143
+ "message": "Preview complete. Inspecto did not write files or open IDE windows. Review the resolved setup below, then rerun without --preview to apply it.",
144
+ "nextStep": "Run the same command again without --preview to apply the integration and launch onboarding.",
145
+ "details": {
146
+ "hostIde": {
147
+ "id": "cursor",
148
+ "label": "Cursor",
149
+ "source": "from --host-ide",
150
+ "confidence": "high",
151
+ "candidates": ["cursor"]
152
+ },
153
+ "inspectoExtension": {
154
+ "source": "marketplace",
155
+ "reference": "inspecto.inspecto",
156
+ "binaryAvailable": true,
157
+ "binaryPath": "cursor",
158
+ "status": "preview_ready"
159
+ },
160
+ "runtime": {
161
+ "assistant": "Codex",
162
+ "ready": true,
163
+ "mode": "cli"
164
+ },
165
+ "workspace": {
166
+ "path": "/repo",
167
+ "attempted": true
168
+ },
169
+ "onboarding": {
170
+ "uri": "cursor://inspecto.inspecto/send?...",
171
+ "autoSend": true
172
+ }
173
+ }
174
+ }
175
+ }
176
+ ```
177
+
178
+ Top-level fields:
179
+
180
+ - `schemaVersion`: Contract version for `inspecto integrations doctor --json`. The current documented value is `1`.
181
+ - `status`: `ok` or `blocked`. This is the field most callers should branch on.
182
+ - `assistant`: The requested integration target.
183
+ - `assets`: The integration files that `inspecto integrations install <assistant>` would write.
184
+ - `message`: Human-readable summary of the preflight result.
185
+ - `nextStep`: Present when the flow is blocked or when there is a recommended follow-up action.
186
+ - `automation`: The underlying preflight result from the IDE/runtime automation layer.
187
+
188
+ `automation.status` values:
189
+
190
+ - `preview`: Preflight succeeded. The flow is runnable.
191
+ - `preview_blocked`: Preflight found blocking issues before launch.
192
+ - `blocked`: Host IDE resolution failed before preflight could complete.
193
+
194
+ `automation.details` fields:
195
+
196
+ - `hostIde`: Resolved host IDE, confidence, resolution source, and alternative candidates.
197
+ - `inspectoExtension`: How Inspecto would be installed into the host IDE.
198
+ `source` is `marketplace` or `local_vsix`.
199
+ `status` is one of:
200
+ `preview_ready`, `missing_host_ide_binary`, `missing_local_vsix`.
201
+ - `runtime`: Resolved assistant runtime.
202
+ `mode` is the selected runtime mode such as `extension` or `cli`.
203
+ `ready=false` means the assistant cannot run yet in the chosen host IDE.
204
+ - `workspace`: Target workspace routing information.
205
+ - `onboarding`: Final onboarding URI and whether `autoSend` would be requested.
206
+
207
+ ##### Exit codes
208
+
209
+ - Exit code `0`: `status=ok`
210
+ - Exit code `1`: `status=blocked`
211
+
212
+ This makes `inspecto integrations doctor` safe to use directly in CI and shell conditionals:
213
+
214
+ ```bash
215
+ if inspecto integrations doctor codex --host-ide cursor --json; then
216
+ echo "integration is runnable"
217
+ else
218
+ echo "integration is blocked"
219
+ fi
100
220
  ```
101
221
 
102
222
  ### `inspecto doctor`
package/dist/bin.js CHANGED
@@ -2,369 +2,25 @@ import {
2
2
  apply,
3
3
  detect,
4
4
  doctor,
5
- exists,
6
5
  init,
7
- log,
6
+ installIntegration,
7
+ integrationDoctor,
8
8
  onboard,
9
9
  plan,
10
+ printIntegrationList,
11
+ printIntegrationPath,
10
12
  reportCommandError,
11
- teardown,
12
- writeFile
13
- } from "./chunk-IBYH7QZM.js";
13
+ teardown
14
+ } from "./chunk-LJOKPCPD.js";
14
15
 
15
16
  // src/bin.ts
16
17
  import { cac } from "cac";
17
- import { fileURLToPath as fileURLToPath2 } from "url";
18
- import { createRequire } from "module";
19
-
20
- // src/commands/integration-install.ts
21
- import fs from "fs/promises";
22
- import { homedir } from "os";
23
- import path from "path";
24
18
  import { fileURLToPath } from "url";
25
- var REPO_RAW_BASE = "https://raw.githubusercontent.com/inspecto-dev/inspecto/main";
26
- var INTEGRATION_MANIFESTS = [
27
- {
28
- assistant: "codex",
29
- type: "native-skill",
30
- installTarget: "~/.codex/skills/",
31
- preferredInstall: "npx @inspecto-dev/cli integrations install codex",
32
- cliSupported: true
33
- },
34
- {
35
- assistant: "claude-code",
36
- type: "native-skill",
37
- installTarget: ".claude/skills/ or ~/.claude/skills/",
38
- preferredInstall: "npx @inspecto-dev/cli integrations install claude-code --scope project",
39
- cliSupported: true
40
- },
41
- {
42
- assistant: "copilot",
43
- type: "instruction-template",
44
- installTarget: ".github/copilot-instructions.md or AGENTS.md",
45
- preferredInstall: "npx @inspecto-dev/cli integrations install copilot",
46
- cliSupported: true
47
- },
48
- {
49
- assistant: "cursor",
50
- type: "rule-template",
51
- installTarget: ".cursor/rules/inspecto-onboarding.mdc or AGENTS.md",
52
- preferredInstall: "npx @inspecto-dev/cli integrations install cursor --mode rules",
53
- cliSupported: true
54
- },
55
- {
56
- assistant: "gemini",
57
- type: "context-template",
58
- installTarget: "GEMINI.md",
59
- preferredInstall: "npx @inspecto-dev/cli integrations install gemini",
60
- cliSupported: true
61
- },
62
- {
63
- assistant: "trae",
64
- type: "compatibility-template",
65
- installTarget: "AGENTS.md",
66
- preferredInstall: "npx @inspecto-dev/cli integrations install trae",
67
- cliSupported: true
68
- },
69
- {
70
- assistant: "coco",
71
- type: "compatibility-template",
72
- installTarget: "AGENTS.md",
73
- preferredInstall: "npx @inspecto-dev/cli integrations install coco",
74
- cliSupported: true
75
- }
76
- ];
77
- async function installIntegration(assistant, options = {}) {
78
- const plan2 = resolveInstallPlan(assistant, options);
79
- log.header("Inspecto Integration Install");
80
- for (const asset of plan2.assets) {
81
- if (await exists(asset.target) && !options.force) {
82
- throw new Error(
83
- `Refusing to overwrite existing file: ${asset.target}. Re-run with --force if you want to replace it.`
84
- );
85
- }
86
- }
87
- const downloadedAssets = [];
88
- for (const asset of plan2.assets) {
89
- const content = await loadAsset(asset);
90
- downloadedAssets.push({ asset, content });
91
- }
92
- for (const { asset, content } of downloadedAssets) {
93
- await writeFile(asset.target, content);
94
- if (asset.executable) {
95
- await fs.chmod(asset.target, 493);
96
- }
97
- }
98
- log.success(plan2.successMessage);
99
- log.hint(plan2.nextStep);
100
- }
101
- function describeIntegration(assistant, options = {}) {
102
- const manifest = getIntegrationManifest(assistant);
103
- const targets = manifest.cliSupported ? resolveInstallPlan(assistant, options).assets.map((asset) => asset.target) : [manifest.installTarget];
104
- return {
105
- assistant: manifest.assistant,
106
- type: manifest.type,
107
- targets,
108
- preferredInstall: manifest.preferredInstall,
109
- cliSupported: manifest.cliSupported
110
- };
111
- }
112
- function printIntegrationList() {
113
- log.header("Inspecto Integrations");
114
- for (const manifest of INTEGRATION_MANIFESTS) {
115
- const support = manifest.cliSupported ? "CLI" : "native installer";
116
- log.info(`${manifest.assistant} \u2014 ${manifest.type} \u2014 ${manifest.installTarget} \u2014 ${support}`);
117
- }
118
- }
119
- function printIntegrationPath(assistant, options = {}) {
120
- const description = describeIntegration(assistant, options);
121
- log.header(`Inspecto Integration Paths: ${description.assistant}`);
122
- for (const target of description.targets) {
123
- log.info(target);
124
- }
125
- if (description.cliSupported) {
126
- log.hint(`Preferred install: ${description.preferredInstall}`);
127
- } else {
128
- log.hint(`Native install required: ${description.preferredInstall}`);
129
- }
130
- }
131
- function resolveInstallPlan(assistant, options) {
132
- switch (assistant) {
133
- case "codex":
134
- return resolveCodexPlan(options);
135
- case "claude-code":
136
- return resolveClaudeCodePlan(options);
137
- case "copilot":
138
- return resolveCopilotPlan(options);
139
- case "cursor":
140
- return resolveCursorPlan(options);
141
- case "gemini":
142
- return {
143
- assets: [
144
- {
145
- source: `${REPO_RAW_BASE}/assistant-integrations/gemini/GEMINI.md`,
146
- target: "GEMINI.md",
147
- localSource: "assistant-integrations/gemini/GEMINI.md"
148
- }
149
- ],
150
- successMessage: "Installed Gemini context to GEMINI.md",
151
- nextStep: "Start a new Gemini CLI session."
152
- };
153
- case "trae":
154
- return {
155
- assets: [
156
- {
157
- source: `${REPO_RAW_BASE}/assistant-integrations/trae/AGENTS.md`,
158
- target: "AGENTS.md",
159
- localSource: "assistant-integrations/trae/AGENTS.md"
160
- }
161
- ],
162
- successMessage: "Installed Trae compatibility instructions to AGENTS.md",
163
- nextStep: "Open a new Trae chat."
164
- };
165
- case "coco":
166
- return {
167
- assets: [
168
- {
169
- source: `${REPO_RAW_BASE}/assistant-integrations/coco/AGENTS.md`,
170
- target: "AGENTS.md",
171
- localSource: "assistant-integrations/coco/AGENTS.md"
172
- }
173
- ],
174
- successMessage: "Installed Coco compatibility instructions to AGENTS.md",
175
- nextStep: "Start a new Coco session."
176
- };
177
- default:
178
- throw new Error(`Unknown assistant: ${assistant}`);
179
- }
180
- }
181
- function getIntegrationManifest(assistant) {
182
- const manifest = INTEGRATION_MANIFESTS.find((item) => item.assistant === assistant);
183
- if (!manifest) {
184
- throw new Error(
185
- `Unknown assistant: ${assistant}. Run 'inspecto integrations list' to see available targets.`
186
- );
187
- }
188
- return manifest;
189
- }
190
- function resolveCodexPlan(options) {
191
- if (options.scope !== void 0) {
192
- throw new Error("`--scope` is not supported for codex.");
193
- }
194
- if (options.mode !== void 0) {
195
- throw new Error("`--mode` is not supported for codex.");
196
- }
197
- const baseDir = path.join(homedir(), ".codex/skills/inspecto-onboarding-codex");
198
- return {
199
- assets: [
200
- {
201
- source: `${REPO_RAW_BASE}/skills/inspecto-onboarding-codex/SKILL.md`,
202
- target: path.join(baseDir, "SKILL.md"),
203
- localSource: "skills/inspecto-onboarding-codex/SKILL.md"
204
- },
205
- {
206
- source: `${REPO_RAW_BASE}/skills/inspecto-onboarding-codex/agents/openai.yaml`,
207
- target: path.join(baseDir, "agents/openai.yaml"),
208
- localSource: "skills/inspecto-onboarding-codex/agents/openai.yaml"
209
- },
210
- {
211
- source: `${REPO_RAW_BASE}/skills/inspecto-onboarding-codex/scripts/run-inspecto.sh`,
212
- target: path.join(baseDir, "scripts/run-inspecto.sh"),
213
- executable: true,
214
- localSource: "skills/inspecto-onboarding-codex/scripts/run-inspecto.sh"
215
- }
216
- ],
217
- successMessage: `Installed Codex skill to ${baseDir}`,
218
- nextStep: "Restart Codex or start a new Codex session to load the skill."
219
- };
220
- }
221
- function resolveClaudeCodePlan(options) {
222
- const scope = options.scope ?? "project";
223
- const unsupportedMode = options.mode !== void 0;
224
- if (unsupportedMode) {
225
- throw new Error(
226
- "`--mode` is not supported for claude-code. Use `--scope project|user` instead."
227
- );
228
- }
229
- if (scope !== "project" && scope !== "user") {
230
- throw new Error(`Unknown Claude Code scope: ${scope}`);
231
- }
232
- const baseDir = scope === "user" ? path.join(homedir(), ".claude/skills/inspecto-onboarding-claude-code") : ".claude/skills/inspecto-onboarding-claude-code";
233
- return {
234
- assets: [
235
- {
236
- source: `${REPO_RAW_BASE}/skills/inspecto-onboarding-claude-code/SKILL.md`,
237
- target: path.join(baseDir, "SKILL.md"),
238
- localSource: "skills/inspecto-onboarding-claude-code/SKILL.md"
239
- },
240
- {
241
- source: `${REPO_RAW_BASE}/skills/inspecto-onboarding-claude-code/agents/openai.yaml`,
242
- target: path.join(baseDir, "agents/openai.yaml"),
243
- localSource: "skills/inspecto-onboarding-claude-code/agents/openai.yaml"
244
- },
245
- {
246
- source: `${REPO_RAW_BASE}/skills/inspecto-onboarding-claude-code/scripts/run-inspecto.sh`,
247
- target: path.join(baseDir, "scripts/run-inspecto.sh"),
248
- executable: true,
249
- localSource: "skills/inspecto-onboarding-claude-code/scripts/run-inspecto.sh"
250
- }
251
- ],
252
- successMessage: `Installed Claude Code skill to ${baseDir}`,
253
- nextStep: "Restart Claude Code to load the new skill."
254
- };
255
- }
256
- function resolveCopilotPlan(options) {
257
- const mode = options.mode ?? "instructions";
258
- if (options.scope !== void 0) {
259
- throw new Error(
260
- "`--scope` is not supported for copilot. Use `--mode instructions|agents` instead."
261
- );
262
- }
263
- switch (mode) {
264
- case "instructions":
265
- return {
266
- assets: [
267
- {
268
- source: `${REPO_RAW_BASE}/assistant-integrations/copilot/.github/copilot-instructions.md`,
269
- target: ".github/copilot-instructions.md",
270
- localSource: "assistant-integrations/copilot/.github/copilot-instructions.md"
271
- }
272
- ],
273
- successMessage: "Installed Copilot instructions to .github/copilot-instructions.md",
274
- nextStep: "Open a new Copilot chat or agent session."
275
- };
276
- case "agents":
277
- return {
278
- assets: [
279
- {
280
- source: `${REPO_RAW_BASE}/assistant-integrations/copilot/AGENTS.md`,
281
- target: "AGENTS.md",
282
- localSource: "assistant-integrations/copilot/AGENTS.md"
283
- }
284
- ],
285
- successMessage: "Installed Copilot compatibility instructions to AGENTS.md",
286
- nextStep: "Open a new Copilot chat or agent session."
287
- };
288
- default:
289
- throw new Error(`Unknown Copilot mode: ${mode}`);
290
- }
291
- }
292
- function resolveCursorPlan(options) {
293
- const mode = options.mode ?? "rules";
294
- if (options.scope !== void 0) {
295
- throw new Error("`--scope` is not supported for cursor. Use `--mode rules|agents` instead.");
296
- }
297
- switch (mode) {
298
- case "rules":
299
- return {
300
- assets: [
301
- {
302
- source: `${REPO_RAW_BASE}/assistant-integrations/cursor/.cursor/rules/inspecto-onboarding.mdc`,
303
- target: ".cursor/rules/inspecto-onboarding.mdc",
304
- localSource: "assistant-integrations/cursor/.cursor/rules/inspecto-onboarding.mdc"
305
- }
306
- ],
307
- successMessage: "Installed Cursor rule to .cursor/rules/inspecto-onboarding.mdc",
308
- nextStep: "Open a new Cursor chat."
309
- };
310
- case "agents":
311
- return {
312
- assets: [
313
- {
314
- source: `${REPO_RAW_BASE}/assistant-integrations/cursor/AGENTS.md`,
315
- target: "AGENTS.md",
316
- localSource: "assistant-integrations/cursor/AGENTS.md"
317
- }
318
- ],
319
- successMessage: "Installed Cursor compatibility instructions to AGENTS.md",
320
- nextStep: "Open a new Cursor chat."
321
- };
322
- default:
323
- throw new Error(`Unknown Cursor mode: ${mode}`);
324
- }
325
- }
326
- async function loadAsset(asset) {
327
- if (asset.localSource) {
328
- const localPath = await resolveBundledAssetPath(asset.localSource);
329
- if (localPath) {
330
- return await fs.readFile(localPath, "utf-8");
331
- }
332
- }
333
- return await downloadAsset(asset.source);
334
- }
335
- async function resolveBundledAssetPath(relativePath) {
336
- const startDir = path.dirname(fileURLToPath(import.meta.url));
337
- let currentDir = startDir;
338
- for (let depth = 0; depth < 8; depth += 1) {
339
- const candidate = path.join(currentDir, relativePath);
340
- if (await exists(candidate)) {
341
- return candidate;
342
- }
343
- const parent = path.dirname(currentDir);
344
- if (parent === currentDir) break;
345
- currentDir = parent;
346
- }
347
- return null;
348
- }
349
- async function downloadAsset(source) {
350
- let response;
351
- try {
352
- response = await fetch(source);
353
- } catch (error) {
354
- const reason = error instanceof Error ? error.message : String(error);
355
- throw new Error(`Failed to download ${source}: ${reason}`);
356
- }
357
- if (!response.ok) {
358
- throw new Error(`Failed to download ${source}: ${response.status} ${response.statusText}`);
359
- }
360
- return await response.text();
361
- }
362
-
363
- // src/bin.ts
19
+ import { createRequire } from "module";
364
20
  var require2 = createRequire(import.meta.url);
365
21
  var { version } = require2("../package.json");
366
22
  var integrationScopes = ["project", "user"];
367
- var integrationModes = ["instructions", "agents", "rules"];
23
+ var integrationModes = ["skills", "instructions", "agents", "rules"];
368
24
  function exitWithError(error, options = {}) {
369
25
  reportCommandError(error, {
370
26
  debug: options.debug ?? false,
@@ -449,20 +105,20 @@ function createCli(_argv = process.argv) {
449
105
  exitWithError(error, options);
450
106
  }
451
107
  });
452
- cli.command("integrations [...args]", "Manage assistant integration assets").option(
108
+ cli.command("integrations [...args]", "Manage assistant integration assets").option("--json", "Print machine-readable JSON output", { default: false }).option(
453
109
  "--scope <scope>",
454
110
  "Set install scope for supported assistants (e.g. claude-code: project|user)"
455
111
  ).option(
456
112
  "--mode <mode>",
457
- "Set install mode for supported assistants (e.g. copilot: instructions|agents)"
458
- ).option("--force", "Overwrite existing integration files", { default: false }).option("--debug", "Enable debug mode to show full error traces", { default: false }).action(async (args, options) => {
113
+ "Set install mode for supported assistants (e.g. copilot: skills|instructions|agents)"
114
+ ).option("--host-ide <ide>", "Choose the host IDE for automatic extension install and launch").option("--inspecto-vsix <path>", "Install the Inspecto extension from a local .vsix path").option("--compact", "Print a shorter text summary for integration doctor").option("--preview", "Preview integration changes and IDE automation without executing them").option("--force", "Overwrite existing integration files", { default: false }).option("--debug", "Enable debug mode to show full error traces", { default: false }).action(async (args, options) => {
459
115
  try {
460
116
  const [subcommand, assistant, ...rest] = args;
461
117
  const integrationOptions = buildIntegrationOptions(options);
462
118
  if (subcommand === "list") {
463
- if (assistant || rest.length > 0 || options.scope || options.mode || options.force) {
119
+ if (assistant || rest.length > 0 || options.scope || options.mode || options.hostIde || options.inspectoVsix || options.compact || options.json || options.preview || options.force) {
464
120
  throw new Error(
465
- "The `list` subcommand does not accept assistant names, --scope, --mode, or --force."
121
+ "The `list` subcommand does not accept assistant names, --scope, --mode, --host-ide, --inspecto-vsix, --compact, --json, --preview, or --force."
466
122
  );
467
123
  }
468
124
  printIntegrationList();
@@ -475,16 +131,45 @@ function createCli(_argv = process.argv) {
475
131
  if (options.force) {
476
132
  throw new Error("The `path` subcommand does not support `--force`.");
477
133
  }
134
+ if (options.hostIde) {
135
+ throw new Error("The `path` subcommand does not support `--host-ide`.");
136
+ }
137
+ if (options.inspectoVsix) {
138
+ throw new Error("The `path` subcommand does not support `--inspecto-vsix`.");
139
+ }
140
+ if (options.preview) {
141
+ throw new Error("The `path` subcommand does not support `--preview`.");
142
+ }
143
+ if (options.compact) {
144
+ throw new Error("The `path` subcommand does not support `--compact`.");
145
+ }
146
+ if (options.json) {
147
+ throw new Error("The `path` subcommand does not support `--json`.");
148
+ }
478
149
  printIntegrationPath(assistant, integrationOptions);
479
150
  return;
480
151
  }
152
+ if (subcommand === "doctor" && assistant) {
153
+ if (rest.length > 0) {
154
+ throw new Error("The `doctor` subcommand accepts exactly one assistant argument.");
155
+ }
156
+ if (options.force) {
157
+ throw new Error("The `doctor` subcommand does not support `--force`.");
158
+ }
159
+ if (options.preview) {
160
+ throw new Error("The `doctor` subcommand does not support `--preview`.");
161
+ }
162
+ await integrationDoctor(assistant, { ...integrationOptions, failOnBlocked: true });
163
+ return;
164
+ }
481
165
  if (subcommand !== "install" || !assistant) {
482
166
  throw new Error(
483
167
  [
484
168
  "Usage:",
485
169
  " inspecto integrations list",
486
170
  " inspecto integrations path <assistant> [--scope <scope>] [--mode <mode>]",
487
- " inspecto integrations install <assistant> [--scope <scope>] [--mode <mode>] [--force]"
171
+ " inspecto integrations doctor <assistant> [--scope <scope>] [--mode <mode>] [--host-ide <ide>] [--inspecto-vsix <path>] [--compact] [--json]",
172
+ " inspecto integrations install <assistant> [--scope <scope>] [--mode <mode>] [--host-ide <ide>] [--inspecto-vsix <path>] [--preview] [--json] [--force]"
488
173
  ].join("\n")
489
174
  );
490
175
  }
@@ -519,6 +204,21 @@ function buildIntegrationOptions(options) {
519
204
  throw new Error(`Unknown integration mode: ${options.mode}`);
520
205
  }
521
206
  }
207
+ if (options.hostIde) {
208
+ resolved.ide = options.hostIde;
209
+ }
210
+ if (options.inspectoVsix) {
211
+ resolved.inspectoVsix = options.inspectoVsix;
212
+ }
213
+ if (options.compact) {
214
+ resolved.compact = options.compact;
215
+ }
216
+ if (options.preview) {
217
+ resolved.preview = options.preview;
218
+ }
219
+ if (options.json) {
220
+ resolved.json = options.json;
221
+ }
522
222
  return resolved;
523
223
  }
524
224
  function isIntegrationScope(value) {
@@ -537,7 +237,7 @@ async function runCli(argv = process.argv) {
537
237
  }
538
238
  }
539
239
  var entryPath = process.argv[1];
540
- if (entryPath && fileURLToPath2(import.meta.url) === entryPath) {
240
+ if (entryPath && fileURLToPath(import.meta.url) === entryPath) {
541
241
  void runCli();
542
242
  }
543
243
  export {