doc-detective 4.0.1 → 4.0.2-dev.10
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/dist/agents/adapters/claude-code.d.ts +77 -0
- package/dist/agents/adapters/claude-code.d.ts.map +1 -0
- package/dist/agents/adapters/claude-code.js +461 -0
- package/dist/agents/adapters/claude-code.js.map +1 -0
- package/dist/agents/adapters/codex.d.ts +64 -0
- package/dist/agents/adapters/codex.d.ts.map +1 -0
- package/dist/agents/adapters/codex.js +299 -0
- package/dist/agents/adapters/codex.js.map +1 -0
- package/dist/agents/adapters/copilot-cli.d.ts +29 -0
- package/dist/agents/adapters/copilot-cli.d.ts.map +1 -0
- package/dist/agents/adapters/copilot-cli.js +195 -0
- package/dist/agents/adapters/copilot-cli.js.map +1 -0
- package/dist/agents/adapters/gemini-cli.d.ts +29 -0
- package/dist/agents/adapters/gemini-cli.d.ts.map +1 -0
- package/dist/agents/adapters/gemini-cli.js +207 -0
- package/dist/agents/adapters/gemini-cli.js.map +1 -0
- package/dist/agents/adapters/opencode.d.ts +67 -0
- package/dist/agents/adapters/opencode.d.ts.map +1 -0
- package/dist/agents/adapters/opencode.js +341 -0
- package/dist/agents/adapters/opencode.js.map +1 -0
- package/dist/agents/adapters/qwen-code.d.ts +30 -0
- package/dist/agents/adapters/qwen-code.d.ts.map +1 -0
- package/dist/agents/adapters/qwen-code.js +212 -0
- package/dist/agents/adapters/qwen-code.js.map +1 -0
- package/dist/agents/command.d.ts +11 -0
- package/dist/agents/command.d.ts.map +1 -0
- package/dist/agents/command.js +41 -0
- package/dist/agents/command.js.map +1 -0
- package/dist/agents/fetcher.d.ts +30 -0
- package/dist/agents/fetcher.d.ts.map +1 -0
- package/dist/agents/fetcher.js +112 -0
- package/dist/agents/fetcher.js.map +1 -0
- package/dist/agents/prompts.d.ts +24 -0
- package/dist/agents/prompts.d.ts.map +1 -0
- package/dist/agents/prompts.js +74 -0
- package/dist/agents/prompts.js.map +1 -0
- package/dist/agents/registry.d.ts +4 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +25 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/runner.d.ts +13 -0
- package/dist/agents/runner.d.ts.map +1 -0
- package/dist/agents/runner.js +155 -0
- package/dist/agents/runner.js.map +1 -0
- package/dist/agents/spawn-helper.d.ts +33 -0
- package/dist/agents/spawn-helper.d.ts.map +1 -0
- package/dist/agents/spawn-helper.js +98 -0
- package/dist/agents/spawn-helper.js.map +1 -0
- package/dist/agents/types.d.ts +41 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/cli.js +42 -10
- package/dist/cli.js.map +1 -1
- package/dist/common/src/detectTests.d.ts +101 -0
- package/dist/common/src/detectTests.d.ts.map +1 -0
- package/dist/common/src/detectTests.js +693 -0
- package/dist/common/src/detectTests.js.map +1 -0
- package/dist/common/src/fileTypes.d.ts +35 -0
- package/dist/common/src/fileTypes.d.ts.map +1 -0
- package/dist/common/src/fileTypes.js +303 -0
- package/dist/common/src/fileTypes.js.map +1 -0
- package/dist/common/src/index.d.ts +10 -0
- package/dist/common/src/index.d.ts.map +1 -0
- package/dist/common/src/index.js +5 -0
- package/dist/common/src/index.js.map +1 -0
- package/dist/common/src/schemas/index.d.ts +5 -0
- package/dist/common/src/schemas/index.d.ts.map +1 -0
- package/dist/common/src/schemas/index.js +3 -0
- package/dist/common/src/schemas/index.js.map +1 -0
- package/dist/common/src/schemas/schemas.json +128711 -0
- package/dist/common/src/types/generated/checkLink_v3.d.ts +42 -0
- package/dist/common/src/types/generated/checkLink_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/checkLink_v3.js +7 -0
- package/dist/common/src/types/generated/checkLink_v3.js.map +1 -0
- package/dist/common/src/types/generated/click_v3.d.ts +16 -0
- package/dist/common/src/types/generated/click_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/click_v3.js +7 -0
- package/dist/common/src/types/generated/click_v3.js.map +1 -0
- package/dist/common/src/types/generated/config_v3.d.ts +402 -0
- package/dist/common/src/types/generated/config_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/config_v3.js +7 -0
- package/dist/common/src/types/generated/config_v3.js.map +1 -0
- package/dist/common/src/types/generated/context_v3.d.ts +108 -0
- package/dist/common/src/types/generated/context_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/context_v3.js +7 -0
- package/dist/common/src/types/generated/context_v3.js.map +1 -0
- package/dist/common/src/types/generated/dragAndDrop_v3.d.ts +37 -0
- package/dist/common/src/types/generated/dragAndDrop_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/dragAndDrop_v3.js +7 -0
- package/dist/common/src/types/generated/dragAndDrop_v3.js.map +1 -0
- package/dist/common/src/types/generated/endRecord_v3.d.ts +9 -0
- package/dist/common/src/types/generated/endRecord_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/endRecord_v3.js +7 -0
- package/dist/common/src/types/generated/endRecord_v3.js.map +1 -0
- package/dist/common/src/types/generated/find_v3.d.ts +16 -0
- package/dist/common/src/types/generated/find_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/find_v3.js +7 -0
- package/dist/common/src/types/generated/find_v3.js.map +1 -0
- package/dist/common/src/types/generated/goTo_v3.d.ts +46 -0
- package/dist/common/src/types/generated/goTo_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/goTo_v3.js +7 -0
- package/dist/common/src/types/generated/goTo_v3.js.map +1 -0
- package/dist/common/src/types/generated/httpRequest_v3.d.ts +16 -0
- package/dist/common/src/types/generated/httpRequest_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/httpRequest_v3.js +7 -0
- package/dist/common/src/types/generated/httpRequest_v3.js.map +1 -0
- package/dist/common/src/types/generated/loadCookie_v3.d.ts +16 -0
- package/dist/common/src/types/generated/loadCookie_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/loadCookie_v3.js +7 -0
- package/dist/common/src/types/generated/loadCookie_v3.js.map +1 -0
- package/dist/common/src/types/generated/loadVariables_v3.d.ts +9 -0
- package/dist/common/src/types/generated/loadVariables_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/loadVariables_v3.js +7 -0
- package/dist/common/src/types/generated/loadVariables_v3.js.map +1 -0
- package/dist/common/src/types/generated/openApi_v3.d.ts +62 -0
- package/dist/common/src/types/generated/openApi_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/openApi_v3.js +7 -0
- package/dist/common/src/types/generated/openApi_v3.js.map +1 -0
- package/dist/common/src/types/generated/record_v3.d.ts +32 -0
- package/dist/common/src/types/generated/record_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/record_v3.js +7 -0
- package/dist/common/src/types/generated/record_v3.js.map +1 -0
- package/dist/common/src/types/generated/report_v3.d.ts +174 -0
- package/dist/common/src/types/generated/report_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/report_v3.js +7 -0
- package/dist/common/src/types/generated/report_v3.js.map +1 -0
- package/dist/common/src/types/generated/resolvedTests_v3.d.ts +575 -0
- package/dist/common/src/types/generated/resolvedTests_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/resolvedTests_v3.js +7 -0
- package/dist/common/src/types/generated/resolvedTests_v3.js.map +1 -0
- package/dist/common/src/types/generated/runCode_v3.d.ts +57 -0
- package/dist/common/src/types/generated/runCode_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/runCode_v3.js +7 -0
- package/dist/common/src/types/generated/runCode_v3.js.map +1 -0
- package/dist/common/src/types/generated/runShell_v3.d.ts +56 -0
- package/dist/common/src/types/generated/runShell_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/runShell_v3.js +7 -0
- package/dist/common/src/types/generated/runShell_v3.js.map +1 -0
- package/dist/common/src/types/generated/saveCookie_v3.d.ts +16 -0
- package/dist/common/src/types/generated/saveCookie_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/saveCookie_v3.js +7 -0
- package/dist/common/src/types/generated/saveCookie_v3.js.map +1 -0
- package/dist/common/src/types/generated/screenshot_v3.d.ts +74 -0
- package/dist/common/src/types/generated/screenshot_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/screenshot_v3.js +7 -0
- package/dist/common/src/types/generated/screenshot_v3.js.map +1 -0
- package/dist/common/src/types/generated/sourceIntegration_v3.d.ts +30 -0
- package/dist/common/src/types/generated/sourceIntegration_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/sourceIntegration_v3.js +7 -0
- package/dist/common/src/types/generated/sourceIntegration_v3.js.map +1 -0
- package/dist/common/src/types/generated/spec_v3.d.ts +159 -0
- package/dist/common/src/types/generated/spec_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/spec_v3.js +7 -0
- package/dist/common/src/types/generated/spec_v3.js.map +1 -0
- package/dist/common/src/types/generated/step_v3.d.ts +1573 -0
- package/dist/common/src/types/generated/step_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/step_v3.js +7 -0
- package/dist/common/src/types/generated/step_v3.js.map +1 -0
- package/dist/common/src/types/generated/stopRecord_v3.d.ts +9 -0
- package/dist/common/src/types/generated/stopRecord_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/stopRecord_v3.js +7 -0
- package/dist/common/src/types/generated/stopRecord_v3.js.map +1 -0
- package/dist/common/src/types/generated/test_v3.d.ts +3521 -0
- package/dist/common/src/types/generated/test_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/test_v3.js +7 -0
- package/dist/common/src/types/generated/test_v3.js.map +1 -0
- package/dist/common/src/types/generated/type_v3.d.ts +54 -0
- package/dist/common/src/types/generated/type_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/type_v3.js +7 -0
- package/dist/common/src/types/generated/type_v3.js.map +1 -0
- package/dist/common/src/types/generated/wait_v3.d.ts +12 -0
- package/dist/common/src/types/generated/wait_v3.d.ts.map +1 -0
- package/dist/common/src/types/generated/wait_v3.js +7 -0
- package/dist/common/src/types/generated/wait_v3.js.map +1 -0
- package/dist/common/src/validate.d.ts +41 -0
- package/dist/common/src/validate.d.ts.map +1 -0
- package/dist/common/src/validate.js +557 -0
- package/dist/common/src/validate.js.map +1 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +10 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/detectTests.d.ts.map +1 -1
- package/dist/core/detectTests.js +50 -2
- package/dist/core/detectTests.js.map +1 -1
- package/dist/core/integrations/heretto.d.ts +32 -0
- package/dist/core/integrations/heretto.d.ts.map +1 -1
- package/dist/core/integrations/heretto.js +368 -0
- package/dist/core/integrations/heretto.js.map +1 -1
- package/dist/core/tests/checkLink.d.ts.map +1 -1
- package/dist/core/tests/checkLink.js +136 -29
- package/dist/core/tests/checkLink.js.map +1 -1
- package/dist/core/tests/loadCookie.d.ts.map +1 -1
- package/dist/core/tests/loadCookie.js +12 -2
- package/dist/core/tests/loadCookie.js.map +1 -1
- package/dist/index.cjs +2083 -965
- package/dist/reporters/htmlReporter.d.ts +2 -0
- package/dist/reporters/htmlReporter.d.ts.map +1 -0
- package/dist/reporters/htmlReporter.js +1589 -0
- package/dist/reporters/htmlReporter.js.map +1 -0
- package/dist/utils.d.ts +2 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +43 -10
- package/dist/utils.js.map +1 -1
- package/package.json +146 -135
- package/.doc-detective.json +0 -1
- package/CONTRIBUTIONS.md +0 -27
- package/scripts/createCjsWrapper.js +0 -31
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { AgentAdapter, DetectionResult, InstallOptions, InstallReport, InstallState, Scope } from "../types.js";
|
|
2
|
+
export interface RunResult {
|
|
3
|
+
stdout: string;
|
|
4
|
+
stderr: string;
|
|
5
|
+
exitCode: number;
|
|
6
|
+
}
|
|
7
|
+
export interface QwenCodeDeps {
|
|
8
|
+
run: (cmd: string, args: string[]) => Promise<RunResult>;
|
|
9
|
+
existsSync: (p: string) => boolean;
|
|
10
|
+
readFileSync: (p: string, encoding?: BufferEncoding) => string;
|
|
11
|
+
homedir: () => string;
|
|
12
|
+
fetchLatestVersion: () => Promise<string | undefined>;
|
|
13
|
+
}
|
|
14
|
+
export declare function defaultQwenCodeDeps(): QwenCodeDeps;
|
|
15
|
+
export declare class QwenCodeAdapter implements AgentAdapter {
|
|
16
|
+
readonly id = "qwen";
|
|
17
|
+
readonly displayName = "Qwen Code";
|
|
18
|
+
private deps;
|
|
19
|
+
constructor(deps?: QwenCodeDeps);
|
|
20
|
+
supportsScopes(): Scope[];
|
|
21
|
+
detect(): Promise<DetectionResult>;
|
|
22
|
+
getInstallState(_scope: Scope): Promise<InstallState>;
|
|
23
|
+
private canonicalSkillPath;
|
|
24
|
+
private manifestPath;
|
|
25
|
+
private queryLocalInstallState;
|
|
26
|
+
private enrichWithLatest;
|
|
27
|
+
install(opts: InstallOptions): Promise<InstallReport>;
|
|
28
|
+
}
|
|
29
|
+
export declare const qwenCodeAdapter: AgentAdapter;
|
|
30
|
+
//# sourceMappingURL=qwen-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qwen-code.d.ts","sourceRoot":"","sources":["../../../src/agents/adapters/qwen-code.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,KAAK,EACN,MAAM,aAAa,CAAC;AAIrB,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACzD,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,YAAY,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,KAAK,MAAM,CAAC;IAC/D,OAAO,EAAE,MAAM,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACvD;AAOD,wBAAgB,mBAAmB,IAAI,YAAY,CAclD;AAED,qBAAa,eAAgB,YAAW,YAAY;IAClD,QAAQ,CAAC,EAAE,UAAU;IACrB,QAAQ,CAAC,WAAW,eAAe;IACnC,OAAO,CAAC,IAAI,CAAe;gBAEf,IAAI,GAAE,YAAoC;IAItD,cAAc,IAAI,KAAK,EAAE;IAKnB,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC;IAgClC,eAAe,CAAC,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC;IAM3D,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,sBAAsB;YA2BhB,gBAAgB;IAiBxB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;CA4F5D;AAED,eAAO,MAAM,eAAe,EAAE,YAAoC,CAAC"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import axios from "axios";
|
|
5
|
+
import { safeSpawn } from "../spawn-helper.js";
|
|
6
|
+
import { parseMetadataVersion } from "./codex.js";
|
|
7
|
+
const EXTENSION_NAME = "doc-detective";
|
|
8
|
+
const GIT_SOURCE = "https://github.com/doc-detective/agent-tools";
|
|
9
|
+
const LATEST_SKILL_URL = "https://raw.githubusercontent.com/doc-detective/agent-tools/main/skills/doc-detective-init/SKILL.md";
|
|
10
|
+
export function defaultQwenCodeDeps() {
|
|
11
|
+
return {
|
|
12
|
+
run: (cmd, args) => safeSpawn(cmd, args),
|
|
13
|
+
existsSync: fs.existsSync,
|
|
14
|
+
readFileSync: (p, enc = "utf8") => fs.readFileSync(p, enc),
|
|
15
|
+
homedir: os.homedir,
|
|
16
|
+
fetchLatestVersion: async () => {
|
|
17
|
+
const response = await axios.get(LATEST_SKILL_URL, {
|
|
18
|
+
timeout: 5000,
|
|
19
|
+
responseType: "text",
|
|
20
|
+
});
|
|
21
|
+
return parseMetadataVersion(String(response?.data ?? ""));
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export class QwenCodeAdapter {
|
|
26
|
+
id = "qwen";
|
|
27
|
+
displayName = "Qwen Code";
|
|
28
|
+
deps;
|
|
29
|
+
constructor(deps = defaultQwenCodeDeps()) {
|
|
30
|
+
this.deps = deps;
|
|
31
|
+
}
|
|
32
|
+
supportsScopes() {
|
|
33
|
+
// Qwen's `extensions install` has no --scope flag; extensions live in ~/.qwen.
|
|
34
|
+
return ["global"];
|
|
35
|
+
}
|
|
36
|
+
async detect() {
|
|
37
|
+
const qwenHome = path.join(this.deps.homedir(), ".qwen");
|
|
38
|
+
let onPath = false;
|
|
39
|
+
let version;
|
|
40
|
+
try {
|
|
41
|
+
const result = await this.deps.run("qwen", ["--version"]);
|
|
42
|
+
if (result.exitCode === 0 && result.stdout.trim()) {
|
|
43
|
+
onPath = true;
|
|
44
|
+
version = result.stdout.trim();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Binary absent — silent.
|
|
49
|
+
}
|
|
50
|
+
const configPaths = {};
|
|
51
|
+
if (this.deps.existsSync(qwenHome))
|
|
52
|
+
configPaths.global = qwenHome;
|
|
53
|
+
const present = onPath || !!configPaths.global;
|
|
54
|
+
const notes = [];
|
|
55
|
+
if (!onPath && configPaths.global) {
|
|
56
|
+
notes.push("`qwen` not on PATH; install requires the binary — `npm install -g @qwen-code/qwen-code`.");
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
present,
|
|
60
|
+
onPath,
|
|
61
|
+
version,
|
|
62
|
+
configPaths,
|
|
63
|
+
notes: notes.length ? notes : undefined,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async getInstallState(_scope) {
|
|
67
|
+
const base = this.queryLocalInstallState();
|
|
68
|
+
if (!base.installed)
|
|
69
|
+
return base;
|
|
70
|
+
return this.enrichWithLatest(base);
|
|
71
|
+
}
|
|
72
|
+
canonicalSkillPath() {
|
|
73
|
+
// Canonical skill file used as an authoritative version source when it's
|
|
74
|
+
// present. Not always copied on install — see manifestPath() fallback.
|
|
75
|
+
return path.join(this.deps.homedir(), ".qwen", "extensions", EXTENSION_NAME, "skills", "doc-detective-init", "SKILL.md");
|
|
76
|
+
}
|
|
77
|
+
manifestPath() {
|
|
78
|
+
// Qwen writes this manifest on every successful install, regardless of
|
|
79
|
+
// whether Claude-plugin conversion copied the skills/ subtree. Anchoring
|
|
80
|
+
// "is installed?" on manifest existence keeps detection robust even when
|
|
81
|
+
// QwenLM/qwen-code#1737 suppresses the skills copy.
|
|
82
|
+
return path.join(this.deps.homedir(), ".qwen", "extensions", EXTENSION_NAME, "qwen-extension.json");
|
|
83
|
+
}
|
|
84
|
+
queryLocalInstallState() {
|
|
85
|
+
// Prefer SKILL.md's metadata.version when available — it's authoritative.
|
|
86
|
+
const canonical = this.canonicalSkillPath();
|
|
87
|
+
if (this.deps.existsSync(canonical)) {
|
|
88
|
+
try {
|
|
89
|
+
const raw = this.deps.readFileSync(canonical, "utf8");
|
|
90
|
+
const version = parseMetadataVersion(raw);
|
|
91
|
+
return { installed: true, installedVersion: version };
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Fall through to the manifest-only detection.
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Fall back to the manifest for the install marker. Its `version` may be
|
|
98
|
+
// undefined due to bug #1737 but presence still means "installed".
|
|
99
|
+
const manifest = this.manifestPath();
|
|
100
|
+
if (this.deps.existsSync(manifest)) {
|
|
101
|
+
try {
|
|
102
|
+
const parsed = JSON.parse(this.deps.readFileSync(manifest, "utf8"));
|
|
103
|
+
const version = typeof parsed?.version === "string" ? parsed.version : undefined;
|
|
104
|
+
return { installed: true, installedVersion: version };
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return { installed: true };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return { installed: false };
|
|
111
|
+
}
|
|
112
|
+
async enrichWithLatest(state) {
|
|
113
|
+
let latestVersion;
|
|
114
|
+
try {
|
|
115
|
+
latestVersion = await this.deps.fetchLatestVersion();
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
latestVersion = undefined;
|
|
119
|
+
}
|
|
120
|
+
if (!latestVersion) {
|
|
121
|
+
return { ...state, latestVersion: undefined, upToDate: undefined };
|
|
122
|
+
}
|
|
123
|
+
const upToDate = state.installedVersion !== undefined
|
|
124
|
+
? state.installedVersion === latestVersion
|
|
125
|
+
: undefined;
|
|
126
|
+
return { ...state, latestVersion, upToDate };
|
|
127
|
+
}
|
|
128
|
+
async install(opts) {
|
|
129
|
+
const base = this.queryLocalInstallState();
|
|
130
|
+
// Fresh install uses the documented `<url>:<plugin>` colon syntax so
|
|
131
|
+
// Qwen's marketplace-adapter picks the plugin directly instead of
|
|
132
|
+
// showing an interactive "Select a plugin to install" prompt — a prompt
|
|
133
|
+
// that `--consent` doesn't suppress. With stdio closed in CI the prompt
|
|
134
|
+
// would EOF and exit 0 without installing anything.
|
|
135
|
+
const installArg = `${GIT_SOURCE}:${EXTENSION_NAME}`;
|
|
136
|
+
const commands = base.installed
|
|
137
|
+
? [["qwen", "extensions", "update", EXTENSION_NAME]]
|
|
138
|
+
: [["qwen", "extensions", "install", installArg, "--auto-update", "--consent"]];
|
|
139
|
+
// Short-circuit dry-run BEFORE touching the network: dry-run is a
|
|
140
|
+
// side-effect-free preview and shouldn't block on (or fail due to) a
|
|
141
|
+
// GitHub request. Pick the install-vs-update command from local state
|
|
142
|
+
// alone and skip the latest-version enrichment entirely.
|
|
143
|
+
if (opts.dryRun) {
|
|
144
|
+
for (const cmd of commands) {
|
|
145
|
+
opts.logger(`[dry-run] would run: ${cmd.join(" ")}`, "info");
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
adapterId: this.id,
|
|
149
|
+
scope: opts.scope,
|
|
150
|
+
action: "dry-run",
|
|
151
|
+
installedVersion: base.installedVersion,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
// Always enrich — even on fresh install — so `latestVersion` is populated
|
|
155
|
+
// for the post-install report. Qwen's local manifest often omits a
|
|
156
|
+
// version (bug #1737), so the network-fetched latest is our best signal
|
|
157
|
+
// for the installed version after a successful run.
|
|
158
|
+
const enriched = await this.enrichWithLatest(base);
|
|
159
|
+
const isInstalled = enriched.installed;
|
|
160
|
+
const isUpToDate = enriched.upToDate === true;
|
|
161
|
+
if (isInstalled && isUpToDate && !opts.force) {
|
|
162
|
+
return {
|
|
163
|
+
adapterId: this.id,
|
|
164
|
+
scope: opts.scope,
|
|
165
|
+
action: "already-up-to-date",
|
|
166
|
+
installedVersion: enriched.installedVersion,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
for (const [cmd, ...args] of commands) {
|
|
170
|
+
opts.logger(`Running: ${cmd} ${args.join(" ")}`, "debug");
|
|
171
|
+
let result;
|
|
172
|
+
try {
|
|
173
|
+
result = await this.deps.run(cmd, args);
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
const code = err?.code;
|
|
177
|
+
if (code === "ENOENT") {
|
|
178
|
+
throw new Error("Qwen Code is not installed or not on PATH. Run `npm install -g @qwen-code/qwen-code` and re-run install-agents.");
|
|
179
|
+
}
|
|
180
|
+
throw err;
|
|
181
|
+
}
|
|
182
|
+
if (result.stdout)
|
|
183
|
+
opts.logger(result.stdout, "debug");
|
|
184
|
+
if (result.exitCode !== 0) {
|
|
185
|
+
throw new Error(`\`${cmd} ${args.join(" ")}\` exited with code ${result.exitCode}` +
|
|
186
|
+
(result.stderr ? `: ${result.stderr}` : ""));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Prefer the network-fetched latest version (authoritative post-install);
|
|
190
|
+
// fall back to a fresh on-disk SKILL.md read, then to the pre-install
|
|
191
|
+
// state. This matters on a fresh install where `fetchLatestVersion()`
|
|
192
|
+
// failed — we still surface the installed version rather than undefined.
|
|
193
|
+
const installedVersion = enriched.latestVersion ??
|
|
194
|
+
this.queryLocalInstallState().installedVersion ??
|
|
195
|
+
enriched.installedVersion;
|
|
196
|
+
let action;
|
|
197
|
+
if (opts.force && isInstalled && isUpToDate)
|
|
198
|
+
action = "forced";
|
|
199
|
+
else if (isInstalled)
|
|
200
|
+
action = "updated";
|
|
201
|
+
else
|
|
202
|
+
action = "installed";
|
|
203
|
+
return {
|
|
204
|
+
adapterId: this.id,
|
|
205
|
+
scope: opts.scope,
|
|
206
|
+
action,
|
|
207
|
+
installedVersion,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
export const qwenCodeAdapter = new QwenCodeAdapter();
|
|
212
|
+
//# sourceMappingURL=qwen-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qwen-code.js","sourceRoot":"","sources":["../../../src/agents/adapters/qwen-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CommandModule } from "yargs";
|
|
2
|
+
export interface InstallAgentsArgv {
|
|
3
|
+
agent?: string[];
|
|
4
|
+
scope?: "project" | "global";
|
|
5
|
+
force: boolean;
|
|
6
|
+
yes: boolean;
|
|
7
|
+
"dry-run": boolean;
|
|
8
|
+
dryRun?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare const installAgentsCommand: CommandModule<{}, InstallAgentsArgv>;
|
|
11
|
+
//# sourceMappingURL=command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/agents/command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC,EAAE,EAAE,iBAAiB,CA2CrE,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export const installAgentsCommand = {
|
|
2
|
+
command: "install-agents",
|
|
3
|
+
describe: "Install or update the doc-detective agent tools for detected AI coding agents (e.g., Claude Code).",
|
|
4
|
+
builder: (yargs) => yargs
|
|
5
|
+
.option("agent", {
|
|
6
|
+
alias: "a",
|
|
7
|
+
type: "string",
|
|
8
|
+
array: true,
|
|
9
|
+
describe: "Agent id to install into (repeatable). Skips the interactive picker. Example: --agent claude",
|
|
10
|
+
})
|
|
11
|
+
.option("scope", {
|
|
12
|
+
alias: "s",
|
|
13
|
+
type: "string",
|
|
14
|
+
choices: ["project", "global"],
|
|
15
|
+
describe: "Where to install: 'project' (current repo) or 'global' (user home). Each adapter resolves the exact path. Prompted if omitted.",
|
|
16
|
+
})
|
|
17
|
+
.option("force", {
|
|
18
|
+
alias: "f",
|
|
19
|
+
type: "boolean",
|
|
20
|
+
default: false,
|
|
21
|
+
describe: "Reinstall/overwrite even if already installed and up to date.",
|
|
22
|
+
})
|
|
23
|
+
.option("yes", {
|
|
24
|
+
alias: "y",
|
|
25
|
+
type: "boolean",
|
|
26
|
+
default: false,
|
|
27
|
+
describe: "Skip all prompts. Requires --agent and --scope.",
|
|
28
|
+
})
|
|
29
|
+
.option("dry-run", {
|
|
30
|
+
type: "boolean",
|
|
31
|
+
default: false,
|
|
32
|
+
describe: "Print the actions that would be taken without executing them.",
|
|
33
|
+
}),
|
|
34
|
+
handler: async (argv) => {
|
|
35
|
+
// Lazy-load so unrelated subcommands don't pay the import cost.
|
|
36
|
+
const { runInstallAgents } = await import("./runner.js");
|
|
37
|
+
const { createPrompts } = await import("./prompts.js");
|
|
38
|
+
await runInstallAgents(argv, { prompts: createPrompts() });
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/agents/command.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,oBAAoB,GAAyC;IACxE,OAAO,EAAE,gBAAgB;IACzB,QAAQ,EACN,oGAAoG;IACtG,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,MAAM,CAAC,OAAO,EAAE;QACf,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,IAAI;QACX,QAAQ,EACN,8FAA8F;KACjG,CAAC;SACD,MAAM,CAAC,OAAO,EAAE;QACf,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAU;QACvC,QAAQ,EACN,gIAAgI;KACnI,CAAC;SACD,MAAM,CAAC,OAAO,EAAE;QACf,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,+DAA+D;KAC1E,CAAC;SACD,MAAM,CAAC,KAAK,EAAE;QACb,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,iDAAiD;KAC5D,CAAC;SACD,MAAM,CAAC,SAAS,EAAE;QACjB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,+DAA+D;KAC1E,CAAuD;IAC5D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,gEAAgE;QAChE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACzD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface FetchResult {
|
|
2
|
+
/** Absolute path to the extracted tree. The caller is responsible for deleting it. */
|
|
3
|
+
tempDir: string;
|
|
4
|
+
/** Git ref that was fetched. */
|
|
5
|
+
ref: string;
|
|
6
|
+
/**
|
|
7
|
+
* True if the caller owns the tempDir and should delete it after use. False
|
|
8
|
+
* when a test (or other caller) points at a pre-existing directory they'll
|
|
9
|
+
* clean up themselves. Defaults to true when the real fetcher ran.
|
|
10
|
+
*/
|
|
11
|
+
owned: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface FetchDeps {
|
|
14
|
+
/** HTTP GET. Injected so tests can return in-memory zip buffers. */
|
|
15
|
+
get?: (url: string, config: {
|
|
16
|
+
responseType: "arraybuffer";
|
|
17
|
+
timeout?: number;
|
|
18
|
+
maxContentLength?: number;
|
|
19
|
+
}) => Promise<{
|
|
20
|
+
data: Buffer | ArrayBuffer;
|
|
21
|
+
}>;
|
|
22
|
+
/** Filesystem access (mostly for tests that want to isolate temp dirs). */
|
|
23
|
+
mkdtempSync?: (prefix: string) => string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Download and extract the agent-tools repo at the given ref, stripping the
|
|
27
|
+
* top-level `agent-tools-<ref>/` wrapper dir that GitHub adds to codeload zips.
|
|
28
|
+
*/
|
|
29
|
+
export declare function fetchAgentToolsZip(ref?: string, deps?: FetchDeps): Promise<FetchResult>;
|
|
30
|
+
//# sourceMappingURL=fetcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../src/agents/fetcher.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,sFAAsF;IACtF,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ;;;;OAIG;IACH,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,oEAAoE;IACpE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE;QAAE,YAAY,EAAE,aAAa,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;KAAE,CAAC,CAAC;IACrJ,2EAA2E;IAC3E,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;CAC1C;AAcD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,GAAE,MAAe,EACpB,IAAI,GAAE,SAAc,GACnB,OAAO,CAAC,WAAW,CAAC,CAgFtB"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import axios from "axios";
|
|
5
|
+
import AdmZip from "adm-zip";
|
|
6
|
+
const REPO_SLUG = "doc-detective/agent-tools";
|
|
7
|
+
const MAX_ZIP_BYTES = 50 * 1024 * 1024;
|
|
8
|
+
/**
|
|
9
|
+
* Build the codeload archive URL for a given ref. GitHub's codeload endpoint
|
|
10
|
+
* accepts `<ref>` directly (branches, tags, and full commit SHAs all resolve),
|
|
11
|
+
* so we don't hard-code `refs/heads/…` and we support tags like `v1.3.0`.
|
|
12
|
+
*/
|
|
13
|
+
function codeloadUrl(ref) {
|
|
14
|
+
return `https://codeload.github.com/${REPO_SLUG}/zip/${ref}`;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Download and extract the agent-tools repo at the given ref, stripping the
|
|
18
|
+
* top-level `agent-tools-<ref>/` wrapper dir that GitHub adds to codeload zips.
|
|
19
|
+
*/
|
|
20
|
+
export async function fetchAgentToolsZip(ref = "main", deps = {}) {
|
|
21
|
+
const get = deps.get ?? ((url, config) => axios.get(url, config));
|
|
22
|
+
const mkdtempSync = deps.mkdtempSync ?? ((prefix) => fs.mkdtempSync(prefix));
|
|
23
|
+
const tempDir = mkdtempSync(path.join(os.tmpdir(), "doc-detective-agent-tools-"));
|
|
24
|
+
try {
|
|
25
|
+
const response = await get(codeloadUrl(ref), {
|
|
26
|
+
responseType: "arraybuffer",
|
|
27
|
+
timeout: 30000,
|
|
28
|
+
maxContentLength: MAX_ZIP_BYTES,
|
|
29
|
+
});
|
|
30
|
+
const buf = Buffer.isBuffer(response.data)
|
|
31
|
+
? response.data
|
|
32
|
+
: Buffer.from(response.data);
|
|
33
|
+
const zip = new AdmZip(buf);
|
|
34
|
+
const entries = zip.getEntries();
|
|
35
|
+
// Detect the GitHub wrapper directory (e.g. "agent-tools-main/"). It's the
|
|
36
|
+
// common prefix of every entry in a codeload zip.
|
|
37
|
+
const prefix = commonTopLevelPrefix(entries.map((e) => e.entryName));
|
|
38
|
+
const resolvedBase = path.resolve(tempDir);
|
|
39
|
+
for (const entry of entries) {
|
|
40
|
+
const rel = entry.entryName.startsWith(prefix)
|
|
41
|
+
? entry.entryName.slice(prefix.length)
|
|
42
|
+
: entry.entryName;
|
|
43
|
+
if (!rel)
|
|
44
|
+
continue; // skip the wrapper dir itself
|
|
45
|
+
// Belt-and-suspenders zip-slip guards. The first checks the *entry name*
|
|
46
|
+
// before any path computation, satisfying CodeQL's taint tracker that
|
|
47
|
+
// `rel` is sanitized before it reaches `path.resolve`. The second
|
|
48
|
+
// verifies (via `path.relative`) that the fully-resolved destination
|
|
49
|
+
// stays inside the extraction root — this catches anything the first
|
|
50
|
+
// guard misses (e.g., symlink-like canonicalization edge cases).
|
|
51
|
+
if (path.isAbsolute(rel) ||
|
|
52
|
+
rel.split(/[\\/]/).some((seg) => seg === "..") ||
|
|
53
|
+
/^[a-zA-Z]:[\\/]/.test(rel)) {
|
|
54
|
+
throw new Error(`Refusing to extract zip entry with traversal path: ${entry.entryName}`);
|
|
55
|
+
}
|
|
56
|
+
const resolvedDest = path.resolve(resolvedBase, rel);
|
|
57
|
+
const relativeFromBase = path.relative(resolvedBase, resolvedDest);
|
|
58
|
+
if (relativeFromBase.startsWith("..") ||
|
|
59
|
+
path.isAbsolute(relativeFromBase)) {
|
|
60
|
+
throw new Error(`Refusing to extract zip entry outside extraction root: ${entry.entryName}`);
|
|
61
|
+
}
|
|
62
|
+
if (entry.isDirectory) {
|
|
63
|
+
fs.mkdirSync(resolvedDest, { recursive: true });
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
fs.mkdirSync(path.dirname(resolvedDest), { recursive: true });
|
|
67
|
+
fs.writeFileSync(resolvedDest, entry.getData());
|
|
68
|
+
// Preserve the unix permission bits the zip carries. GitHub codeload
|
|
69
|
+
// zips store file modes in the high 16 bits of the external-attributes
|
|
70
|
+
// field (adm-zip exposes this as `entry.attr`). Without this, shell
|
|
71
|
+
// scripts committed as 0755 in the source repo land on disk with
|
|
72
|
+
// default permissions and refuse to execute at runtime.
|
|
73
|
+
const unixMode = (entry.attr >>> 16) & 0o777;
|
|
74
|
+
if (unixMode !== 0) {
|
|
75
|
+
try {
|
|
76
|
+
fs.chmodSync(resolvedDest, unixMode);
|
|
77
|
+
}
|
|
78
|
+
catch { }
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return { tempDir, ref, owned: true };
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
// Best-effort cleanup; propagate the original error.
|
|
86
|
+
try {
|
|
87
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
88
|
+
}
|
|
89
|
+
catch { }
|
|
90
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
91
|
+
throw new Error(`Failed to download agent-tools@${ref} from GitHub: ${reason}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Return the common top-level directory prefix across all entry names. Returns
|
|
96
|
+
* "" if the entries have no shared root (treat as already-stripped).
|
|
97
|
+
*/
|
|
98
|
+
function commonTopLevelPrefix(names) {
|
|
99
|
+
if (names.length === 0)
|
|
100
|
+
return "";
|
|
101
|
+
const first = names[0];
|
|
102
|
+
const slash = first.indexOf("/");
|
|
103
|
+
if (slash === -1)
|
|
104
|
+
return "";
|
|
105
|
+
const candidate = first.slice(0, slash + 1);
|
|
106
|
+
for (const n of names) {
|
|
107
|
+
if (!n.startsWith(candidate))
|
|
108
|
+
return "";
|
|
109
|
+
}
|
|
110
|
+
return candidate;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../../src/agents/fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AgentAdapter, Scope } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Ask the user which detected agents to install into. Pre-selects all of them
|
|
4
|
+
* since, by assumption, the caller already filtered to agents that were
|
|
5
|
+
* actually detected on the machine.
|
|
6
|
+
*/
|
|
7
|
+
export declare function pickAgents(available: AgentAdapter[]): Promise<string[]>;
|
|
8
|
+
/**
|
|
9
|
+
* Ask the user which install scope to use. If only one is supported, skip the
|
|
10
|
+
* prompt and return it directly.
|
|
11
|
+
*/
|
|
12
|
+
export declare function pickScope(supported: Scope[]): Promise<Scope>;
|
|
13
|
+
export declare function confirmForce(modifiedFiles: string[]): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Factory to hand into {@link runInstallAgents} as its `prompts` dep. The
|
|
16
|
+
* `install-agents` command already imports this module lazily (dynamic
|
|
17
|
+
* `import("./prompts.js")` from the yargs handler) so other subcommands
|
|
18
|
+
* don't pay the inquirer load cost.
|
|
19
|
+
*/
|
|
20
|
+
export declare function createPrompts(): {
|
|
21
|
+
pickAgents: typeof pickAgents;
|
|
22
|
+
pickScope: typeof pickScope;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/agents/prompts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAY7E;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CASlE;AAED,wBAAsB,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAY5E;AAED;;;;;GAKG;AACH,wBAAgB,aAAa;;;EAE5B"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { checkbox, select, confirm } from "@inquirer/prompts";
|
|
2
|
+
/**
|
|
3
|
+
* Ask the user which detected agents to install into. Pre-selects all of them
|
|
4
|
+
* since, by assumption, the caller already filtered to agents that were
|
|
5
|
+
* actually detected on the machine.
|
|
6
|
+
*/
|
|
7
|
+
export async function pickAgents(available) {
|
|
8
|
+
assertTTY();
|
|
9
|
+
if (available.length === 0)
|
|
10
|
+
return [];
|
|
11
|
+
return checkbox({
|
|
12
|
+
message: "Which agents should receive the doc-detective tools?",
|
|
13
|
+
choices: available.map((a) => ({
|
|
14
|
+
name: a.displayName,
|
|
15
|
+
value: a.id,
|
|
16
|
+
checked: true,
|
|
17
|
+
})),
|
|
18
|
+
required: false,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Ask the user which install scope to use. If only one is supported, skip the
|
|
23
|
+
* prompt and return it directly.
|
|
24
|
+
*/
|
|
25
|
+
export async function pickScope(supported) {
|
|
26
|
+
assertTTY();
|
|
27
|
+
if (supported.length === 1)
|
|
28
|
+
return supported[0];
|
|
29
|
+
const chosen = await select({
|
|
30
|
+
message: "Install scope?",
|
|
31
|
+
choices: buildScopeChoices(supported),
|
|
32
|
+
default: supported.includes("project") ? "project" : supported[0],
|
|
33
|
+
});
|
|
34
|
+
return chosen;
|
|
35
|
+
}
|
|
36
|
+
export async function confirmForce(modifiedFiles) {
|
|
37
|
+
assertTTY();
|
|
38
|
+
if (modifiedFiles.length > 0) {
|
|
39
|
+
console.log("Locally modified files detected:\n" +
|
|
40
|
+
modifiedFiles.map((f) => " " + f).join("\n"));
|
|
41
|
+
}
|
|
42
|
+
return confirm({
|
|
43
|
+
message: "Overwrite them? (equivalent to --force)",
|
|
44
|
+
default: false,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Factory to hand into {@link runInstallAgents} as its `prompts` dep. The
|
|
49
|
+
* `install-agents` command already imports this module lazily (dynamic
|
|
50
|
+
* `import("./prompts.js")` from the yargs handler) so other subcommands
|
|
51
|
+
* don't pay the inquirer load cost.
|
|
52
|
+
*/
|
|
53
|
+
export function createPrompts() {
|
|
54
|
+
return { pickAgents, pickScope };
|
|
55
|
+
}
|
|
56
|
+
function assertTTY() {
|
|
57
|
+
if (!process.stdin.isTTY) {
|
|
58
|
+
throw new Error("No TTY detected; run interactively or pass --agent and --scope with --yes.");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function buildScopeChoices(supported) {
|
|
62
|
+
const labels = {
|
|
63
|
+
project: {
|
|
64
|
+
name: "Project — applies to this repo only",
|
|
65
|
+
description: "Installs into the current project directory.",
|
|
66
|
+
},
|
|
67
|
+
global: {
|
|
68
|
+
name: "User-global — applies to every project for this user",
|
|
69
|
+
description: "Installs into your user home directory.",
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
return supported.map((s) => ({ name: labels[s].name, value: s, description: labels[s].description }));
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/agents/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG9D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,SAAyB;IACxD,SAAS,EAAE,CAAC;IACZ,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,OAAO,QAAQ,CAAC;QACd,OAAO,EAAE,sDAAsD;QAC/D,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7B,IAAI,EAAE,CAAC,CAAC,WAAW;YACnB,KAAK,EAAE,CAAC,CAAC,EAAE;YACX,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAkB;IAChD,SAAS,EAAE,CAAC;IACZ,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAQ;QACjC,OAAO,EAAE,gBAAgB;QACzB,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC;QACrC,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;KAClE,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,aAAuB;IACxD,SAAS,EAAE,CAAC;IACZ,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CACT,oCAAoC;YAClC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAChD,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;QACb,OAAO,EAAE,yCAAyC;QAClD,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAkB;IAC3C,MAAM,MAAM,GAAyD;QACnE,OAAO,EAAE;YACP,IAAI,EAAE,qCAAqC;YAC3C,WAAW,EAAE,8CAA8C;SAC5D;QACD,MAAM,EAAE;YACN,IAAI,EAAE,sDAAsD;YAC5D,WAAW,EAAE,yCAAyC;SACvD;KACF,CAAC;IACF,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AACxG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/agents/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAiB/C,wBAAgB,YAAY,IAAI,YAAY,EAAE,CAE7C;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,CAQnD"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { claudeCodeAdapter } from "./adapters/claude-code.js";
|
|
2
|
+
import { copilotCliAdapter } from "./adapters/copilot-cli.js";
|
|
3
|
+
import { geminiCliAdapter } from "./adapters/gemini-cli.js";
|
|
4
|
+
import { codexAdapter } from "./adapters/codex.js";
|
|
5
|
+
import { qwenCodeAdapter } from "./adapters/qwen-code.js";
|
|
6
|
+
import { opencodeAdapter } from "./adapters/opencode.js";
|
|
7
|
+
const adapters = [
|
|
8
|
+
claudeCodeAdapter,
|
|
9
|
+
copilotCliAdapter,
|
|
10
|
+
geminiCliAdapter,
|
|
11
|
+
codexAdapter,
|
|
12
|
+
qwenCodeAdapter,
|
|
13
|
+
opencodeAdapter,
|
|
14
|
+
];
|
|
15
|
+
export function listAdapters() {
|
|
16
|
+
return adapters.slice();
|
|
17
|
+
}
|
|
18
|
+
export function getAdapter(id) {
|
|
19
|
+
const adapter = adapters.find((a) => a.id === id);
|
|
20
|
+
if (!adapter) {
|
|
21
|
+
throw new Error(`Unknown agent adapter: '${id}'. Available: ${adapters.map((a) => a.id).join(", ")}`);
|
|
22
|
+
}
|
|
23
|
+
return adapter;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/agents/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,QAAQ,GAAmB;IAC/B,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB;IAChB,YAAY;IACZ,eAAe;IACf,eAAe;CAChB,CAAC;AAEF,MAAM,UAAU,YAAY;IAC1B,OAAO,QAAQ,CAAC,KAAK,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,2BAA2B,EAAE,iBAAiB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrF,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AgentAdapter, InstallReport, LogLevel, Scope } from "./types.js";
|
|
2
|
+
import type { InstallAgentsArgv } from "./command.js";
|
|
3
|
+
export interface RunnerDeps {
|
|
4
|
+
adapters?: AgentAdapter[];
|
|
5
|
+
prompts?: {
|
|
6
|
+
pickAgents: (available: AgentAdapter[]) => Promise<string[]>;
|
|
7
|
+
pickScope: (supported: Scope[]) => Promise<Scope>;
|
|
8
|
+
};
|
|
9
|
+
logger?: (message: string, level?: LogLevel) => void;
|
|
10
|
+
isTTY?: () => boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function runInstallAgents(argv: InstallAgentsArgv, deps?: RunnerDeps): Promise<InstallReport[]>;
|
|
13
|
+
//# sourceMappingURL=runner.d.ts.map
|