doc-detective 4.0.2-dev.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.
Files changed (93) hide show
  1. package/dist/agents/adapters/claude-code.d.ts +77 -0
  2. package/dist/agents/adapters/claude-code.d.ts.map +1 -0
  3. package/dist/agents/adapters/claude-code.js +461 -0
  4. package/dist/agents/adapters/claude-code.js.map +1 -0
  5. package/dist/agents/adapters/codex.d.ts +64 -0
  6. package/dist/agents/adapters/codex.d.ts.map +1 -0
  7. package/dist/agents/adapters/codex.js +299 -0
  8. package/dist/agents/adapters/codex.js.map +1 -0
  9. package/dist/agents/adapters/copilot-cli.d.ts +29 -0
  10. package/dist/agents/adapters/copilot-cli.d.ts.map +1 -0
  11. package/dist/agents/adapters/copilot-cli.js +195 -0
  12. package/dist/agents/adapters/copilot-cli.js.map +1 -0
  13. package/dist/agents/adapters/gemini-cli.d.ts +29 -0
  14. package/dist/agents/adapters/gemini-cli.d.ts.map +1 -0
  15. package/dist/agents/adapters/gemini-cli.js +207 -0
  16. package/dist/agents/adapters/gemini-cli.js.map +1 -0
  17. package/dist/agents/adapters/opencode.d.ts +67 -0
  18. package/dist/agents/adapters/opencode.d.ts.map +1 -0
  19. package/dist/agents/adapters/opencode.js +341 -0
  20. package/dist/agents/adapters/opencode.js.map +1 -0
  21. package/dist/agents/adapters/qwen-code.d.ts +30 -0
  22. package/dist/agents/adapters/qwen-code.d.ts.map +1 -0
  23. package/dist/agents/adapters/qwen-code.js +212 -0
  24. package/dist/agents/adapters/qwen-code.js.map +1 -0
  25. package/dist/agents/command.d.ts +11 -0
  26. package/dist/agents/command.d.ts.map +1 -0
  27. package/dist/agents/command.js +41 -0
  28. package/dist/agents/command.js.map +1 -0
  29. package/dist/agents/fetcher.d.ts +30 -0
  30. package/dist/agents/fetcher.d.ts.map +1 -0
  31. package/dist/agents/fetcher.js +112 -0
  32. package/dist/agents/fetcher.js.map +1 -0
  33. package/dist/agents/prompts.d.ts +24 -0
  34. package/dist/agents/prompts.d.ts.map +1 -0
  35. package/dist/agents/prompts.js +74 -0
  36. package/dist/agents/prompts.js.map +1 -0
  37. package/dist/agents/registry.d.ts +4 -0
  38. package/dist/agents/registry.d.ts.map +1 -0
  39. package/dist/agents/registry.js +25 -0
  40. package/dist/agents/registry.js.map +1 -0
  41. package/dist/agents/runner.d.ts +13 -0
  42. package/dist/agents/runner.d.ts.map +1 -0
  43. package/dist/agents/runner.js +155 -0
  44. package/dist/agents/runner.js.map +1 -0
  45. package/dist/agents/spawn-helper.d.ts +33 -0
  46. package/dist/agents/spawn-helper.d.ts.map +1 -0
  47. package/dist/agents/spawn-helper.js +98 -0
  48. package/dist/agents/spawn-helper.js.map +1 -0
  49. package/dist/agents/types.d.ts +41 -0
  50. package/dist/agents/types.d.ts.map +1 -0
  51. package/dist/agents/types.js +2 -0
  52. package/dist/agents/types.js.map +1 -0
  53. package/dist/cli.js +42 -10
  54. package/dist/cli.js.map +1 -1
  55. package/dist/common/src/detectTests.d.ts.map +1 -1
  56. package/dist/common/src/detectTests.js +43 -12
  57. package/dist/common/src/detectTests.js.map +1 -1
  58. package/dist/common/src/fileTypes.d.ts.map +1 -1
  59. package/dist/common/src/fileTypes.js +10 -0
  60. package/dist/common/src/fileTypes.js.map +1 -1
  61. package/dist/common/src/schemas/schemas.json +594 -0
  62. package/dist/common/src/types/generated/checkLink_v3.d.ts +15 -0
  63. package/dist/common/src/types/generated/checkLink_v3.d.ts.map +1 -1
  64. package/dist/common/src/types/generated/config_v3.d.ts +4 -0
  65. package/dist/common/src/types/generated/config_v3.d.ts.map +1 -1
  66. package/dist/common/src/types/generated/resolvedTests_v3.d.ts +4 -0
  67. package/dist/common/src/types/generated/resolvedTests_v3.d.ts.map +1 -1
  68. package/dist/common/src/types/generated/step_v3.d.ts +15 -0
  69. package/dist/common/src/types/generated/step_v3.d.ts.map +1 -1
  70. package/dist/common/src/types/generated/test_v3.d.ts +30 -0
  71. package/dist/common/src/types/generated/test_v3.d.ts.map +1 -1
  72. package/dist/core/config.d.ts.map +1 -1
  73. package/dist/core/config.js +10 -0
  74. package/dist/core/config.js.map +1 -1
  75. package/dist/core/integrations/heretto.d.ts.map +1 -1
  76. package/dist/core/integrations/heretto.js +11 -3
  77. package/dist/core/integrations/heretto.js.map +1 -1
  78. package/dist/core/tests/checkLink.d.ts.map +1 -1
  79. package/dist/core/tests/checkLink.js +136 -29
  80. package/dist/core/tests/checkLink.js.map +1 -1
  81. package/dist/core/tests/loadCookie.d.ts.map +1 -1
  82. package/dist/core/tests/loadCookie.js +12 -2
  83. package/dist/core/tests/loadCookie.js.map +1 -1
  84. package/dist/index.cjs +783 -44
  85. package/dist/reporters/htmlReporter.d.ts +2 -0
  86. package/dist/reporters/htmlReporter.d.ts.map +1 -0
  87. package/dist/reporters/htmlReporter.js +1589 -0
  88. package/dist/reporters/htmlReporter.js.map +1 -0
  89. package/dist/utils.d.ts +2 -1
  90. package/dist/utils.d.ts.map +1 -1
  91. package/dist/utils.js +43 -10
  92. package/dist/utils.js.map +1 -1
  93. package/package.json +3 -1
@@ -0,0 +1,77 @@
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
+ /**
8
+ * Dependencies injected into the adapter. Default implementations use real
9
+ * system calls; tests pass stubs. Keeping this as a plain interface (not a
10
+ * class) avoids leaking test-only code into the runtime and keeps the adapter
11
+ * cheap to instantiate.
12
+ */
13
+ export interface ClaudeCodeDeps {
14
+ /** Run a command and resolve with stdout/stderr/exitCode. Rejects on spawn failures (e.g., ENOENT). */
15
+ run: (cmd: string, args: string[]) => Promise<RunResult>;
16
+ existsSync: (p: string) => boolean;
17
+ readFileSync: (p: string, encoding?: BufferEncoding) => string;
18
+ readdirSync: (p: string) => string[];
19
+ /** Write a file, creating parent directories as needed. Optional — defaults to fs. */
20
+ writeFileSync?: (p: string, data: string) => void;
21
+ /** Ensure a directory exists (recursive). Optional — defaults to fs.mkdirSync. */
22
+ mkdirSync?: (p: string, options?: {
23
+ recursive?: boolean;
24
+ }) => void;
25
+ /** Rename a file. Optional — defaults to fs.renameSync. Used for atomic writes. */
26
+ renameSync?: (from: string, to: string) => void;
27
+ homedir: () => string;
28
+ cwd: () => string;
29
+ /**
30
+ * Best-effort fetch of the latest plugin version from GitHub. Returning
31
+ * undefined or throwing is treated as "unknown" — never fatal.
32
+ */
33
+ fetchLatestVersion: () => Promise<string | undefined>;
34
+ }
35
+ export declare function defaultClaudeCodeDeps(): ClaudeCodeDeps;
36
+ export declare class ClaudeCodeAdapter implements AgentAdapter {
37
+ readonly id = "claude";
38
+ readonly displayName = "Claude Code";
39
+ private deps;
40
+ constructor(deps?: ClaudeCodeDeps);
41
+ supportsScopes(): Scope[];
42
+ detect(): Promise<DetectionResult>;
43
+ getInstallState(scope: Scope): Promise<InstallState>;
44
+ private queryLocalInstallState;
45
+ private enrichWithLatest;
46
+ /**
47
+ * Invoke `claude plugin list --json` and find our plugin at the requested
48
+ * scope. Returns binaryAvailable=false on spawn failure so callers can fall
49
+ * back to the settings-file path; binaryAvailable=true otherwise, with
50
+ * `installed` reflecting whether doc-detective@doc-detective is present at
51
+ * the mapped Claude scope (`user` for our `global`, `project` for `project`).
52
+ *
53
+ * Note: `claude plugin marketplace list --json` returns the *marketplaces*,
54
+ * not the installed plugins — a separate command (`plugin list`) is the
55
+ * authoritative source for install state.
56
+ */
57
+ private queryMarketplaceList;
58
+ private findInstalledVersionFromCache;
59
+ private settingsPathFor;
60
+ install(opts: InstallOptions): Promise<InstallReport>;
61
+ /**
62
+ * Path B: edit ~/.claude/settings.json (or ./.claude/settings.json) directly.
63
+ * Claude Code will notice the extraKnownMarketplaces + enabledPlugins entries
64
+ * on its next launch and prompt to trust + complete the install.
65
+ */
66
+ private installViaSettingsFile;
67
+ private readSettingsFile;
68
+ private mergeSettingsForDocDetective;
69
+ private writeSettingsFile;
70
+ /**
71
+ * Path A: `claude plugin ...` subcommands. Assumes binary is available.
72
+ */
73
+ private installViaCli;
74
+ private isClaudeAvailable;
75
+ }
76
+ export declare const claudeCodeAdapter: AgentAdapter;
77
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/agents/adapters/claude-code.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,KAAK,EACN,MAAM,aAAa,CAAC;AAGrB,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,uGAAuG;IACvG,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,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACrC,sFAAsF;IACtF,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,kFAAkF;IAClF,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IACnE,mFAAmF;IACnF,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,OAAO,EAAE,MAAM,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB;;;OAGG;IACH,kBAAkB,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACvD;AAKD,wBAAgB,qBAAqB,IAAI,cAAc,CAoBtD;AAMD,qBAAa,iBAAkB,YAAW,YAAY;IACpD,QAAQ,CAAC,EAAE,YAAY;IACvB,QAAQ,CAAC,WAAW,iBAAiB;IACrC,OAAO,CAAC,IAAI,CAAiB;gBAEjB,IAAI,GAAE,cAAwC;IAI1D,cAAc,IAAI,KAAK,EAAE;IAInB,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC;IAqClC,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC;YAM5C,sBAAsB;YAgCtB,gBAAgB;IAiB9B;;;;;;;;;;OAUG;YACW,oBAAoB;IAgDlC,OAAO,CAAC,6BAA6B;IAmCrC,OAAO,CAAC,eAAe;IAKjB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAU3D;;;;OAIG;YACW,sBAAsB;IA4DpC,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,4BAA4B;IAcpC,OAAO,CAAC,iBAAiB;IAwBzB;;OAEG;YACW,aAAa;YA+Fb,iBAAiB;CAQhC;AAED,eAAO,MAAM,iBAAiB,EAAE,YAAsC,CAAC"}
@@ -0,0 +1,461 @@
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
+ const LATEST_PLUGIN_JSON_URL = "https://raw.githubusercontent.com/doc-detective/agent-tools/main/plugins/doc-detective/.claude-plugin/plugin.json";
7
+ export function defaultClaudeCodeDeps() {
8
+ return {
9
+ run: (cmd, args) => safeSpawn(cmd, args),
10
+ existsSync: fs.existsSync,
11
+ readFileSync: (p, encoding = "utf8") => fs.readFileSync(p, encoding),
12
+ readdirSync: (p) => fs.readdirSync(p),
13
+ writeFileSync: (p, data) => fs.writeFileSync(p, data, "utf8"),
14
+ mkdirSync: (p, opts) => { fs.mkdirSync(p, opts); },
15
+ renameSync: fs.renameSync,
16
+ homedir: os.homedir,
17
+ cwd: () => process.cwd(),
18
+ fetchLatestVersion: async () => {
19
+ const response = await axios.get(LATEST_PLUGIN_JSON_URL, {
20
+ timeout: 5000,
21
+ responseType: "json",
22
+ });
23
+ const version = response?.data?.version;
24
+ return typeof version === "string" ? version : undefined;
25
+ },
26
+ };
27
+ }
28
+ const MARKETPLACE_NAME = "doc-detective";
29
+ const PLUGIN_NAME = "doc-detective";
30
+ const PLUGIN_KEY = `${PLUGIN_NAME}@${MARKETPLACE_NAME}`;
31
+ export class ClaudeCodeAdapter {
32
+ id = "claude";
33
+ displayName = "Claude Code";
34
+ deps;
35
+ constructor(deps = defaultClaudeCodeDeps()) {
36
+ this.deps = deps;
37
+ }
38
+ supportsScopes() {
39
+ return ["global", "project"];
40
+ }
41
+ async detect() {
42
+ const homeClaude = path.join(this.deps.homedir(), ".claude");
43
+ const projectClaude = path.join(this.deps.cwd(), ".claude");
44
+ let onPath = false;
45
+ let version;
46
+ try {
47
+ const result = await this.deps.run("claude", ["--version"]);
48
+ if (result.exitCode === 0 && result.stdout.trim()) {
49
+ onPath = true;
50
+ version = result.stdout.trim();
51
+ }
52
+ }
53
+ catch {
54
+ // Binary not on PATH, or spawn failure — silently fall through.
55
+ }
56
+ const configPaths = {};
57
+ if (this.deps.existsSync(homeClaude))
58
+ configPaths.global = homeClaude;
59
+ if (this.deps.existsSync(projectClaude))
60
+ configPaths.project = projectClaude;
61
+ const present = onPath || !!configPaths.global || !!configPaths.project;
62
+ const notes = [];
63
+ if (!onPath && (configPaths.global || configPaths.project)) {
64
+ notes.push("`claude` not on PATH but Claude Code settings exist; install will use settings-file fallback.");
65
+ }
66
+ return {
67
+ present,
68
+ onPath,
69
+ version,
70
+ configPaths,
71
+ notes: notes.length ? notes : undefined,
72
+ };
73
+ }
74
+ async getInstallState(scope) {
75
+ const baseState = await this.queryLocalInstallState(scope);
76
+ if (!baseState.installed)
77
+ return baseState;
78
+ return this.enrichWithLatest(baseState);
79
+ }
80
+ async queryLocalInstallState(scope) {
81
+ // Path A: talk to the `claude` CLI if we can.
82
+ const listed = await this.queryMarketplaceList(scope);
83
+ if (listed.binaryAvailable) {
84
+ if (listed.installed) {
85
+ const version = listed.installedVersion ?? this.findInstalledVersionFromCache();
86
+ return { installed: true, installedVersion: version };
87
+ }
88
+ return { installed: false };
89
+ }
90
+ // Path B: binary not available — inspect the settings file for the target scope.
91
+ const settingsPath = this.settingsPathFor(scope);
92
+ if (!this.deps.existsSync(settingsPath)) {
93
+ return { installed: false };
94
+ }
95
+ try {
96
+ const raw = this.deps.readFileSync(settingsPath, "utf8");
97
+ const parsed = JSON.parse(raw);
98
+ const enabled = parsed?.enabledPlugins?.[PLUGIN_KEY];
99
+ if (enabled === true) {
100
+ return { installed: true };
101
+ }
102
+ return { installed: false };
103
+ }
104
+ catch {
105
+ // Corrupt settings file: treat as not-installed; the install() path
106
+ // handles this more loudly when a write is actually attempted.
107
+ return { installed: false };
108
+ }
109
+ }
110
+ async enrichWithLatest(state) {
111
+ let latestVersion;
112
+ try {
113
+ latestVersion = await this.deps.fetchLatestVersion();
114
+ }
115
+ catch {
116
+ latestVersion = undefined;
117
+ }
118
+ if (!latestVersion) {
119
+ return { ...state, latestVersion: undefined, upToDate: undefined };
120
+ }
121
+ const upToDate = state.installedVersion !== undefined
122
+ ? state.installedVersion === latestVersion
123
+ : undefined;
124
+ return { ...state, latestVersion, upToDate };
125
+ }
126
+ /**
127
+ * Invoke `claude plugin list --json` and find our plugin at the requested
128
+ * scope. Returns binaryAvailable=false on spawn failure so callers can fall
129
+ * back to the settings-file path; binaryAvailable=true otherwise, with
130
+ * `installed` reflecting whether doc-detective@doc-detective is present at
131
+ * the mapped Claude scope (`user` for our `global`, `project` for `project`).
132
+ *
133
+ * Note: `claude plugin marketplace list --json` returns the *marketplaces*,
134
+ * not the installed plugins — a separate command (`plugin list`) is the
135
+ * authoritative source for install state.
136
+ */
137
+ async queryMarketplaceList(scope) {
138
+ const mappedScope = scope === "global" ? "user" : "project";
139
+ let stdout;
140
+ try {
141
+ const result = await this.deps.run("claude", [
142
+ "plugin",
143
+ "list",
144
+ "--json",
145
+ ]);
146
+ // A non-zero exit here means the binary ran but the subcommand failed
147
+ // (auth, transient error, corrupt config, etc.). Don't conflate that
148
+ // with ENOENT/spawn failure — keep `binaryAvailable: true` so install()
149
+ // still takes Path A and surfaces the real error at install time
150
+ // instead of silently dropping into the settings.json fallback.
151
+ if (result.exitCode !== 0)
152
+ return { binaryAvailable: true, installed: false };
153
+ stdout = result.stdout;
154
+ }
155
+ catch {
156
+ // Spawn failure (e.g., ENOENT — `claude` not on PATH). Fall back to
157
+ // reading settings.json directly.
158
+ return { binaryAvailable: false, installed: false };
159
+ }
160
+ let parsed;
161
+ try {
162
+ parsed = JSON.parse(stdout);
163
+ }
164
+ catch {
165
+ // Binary was there but returned non-JSON — treat as "available but empty".
166
+ return { binaryAvailable: true, installed: false };
167
+ }
168
+ const plugins = toPluginListArray(parsed);
169
+ const plugin = plugins.find((p) => p?.id === PLUGIN_KEY && p?.scope === mappedScope);
170
+ if (!plugin)
171
+ return { binaryAvailable: true, installed: false };
172
+ // `enabled` flag distinguishes installed-and-on from installed-but-disabled.
173
+ // Treat disabled-but-installed as installed — the user made a choice to
174
+ // keep it disabled, so we shouldn't clobber their state by reinstalling.
175
+ const installedVersion = typeof plugin.version === "string" ? plugin.version : undefined;
176
+ return { binaryAvailable: true, installed: true, installedVersion };
177
+ }
178
+ findInstalledVersionFromCache() {
179
+ const cacheDir = path.join(this.deps.homedir(), ".claude", "plugins", "cache", MARKETPLACE_NAME, PLUGIN_NAME);
180
+ if (!this.deps.existsSync(cacheDir))
181
+ return undefined;
182
+ let entries;
183
+ try {
184
+ entries = this.deps.readdirSync(cacheDir);
185
+ }
186
+ catch {
187
+ return undefined;
188
+ }
189
+ if (entries.length === 0)
190
+ return undefined;
191
+ // Pick the highest semver-ish entry. Numeric component comparison avoids
192
+ // the "1.10.0" < "1.2.0" trap that a raw lexicographic sort would hit.
193
+ // Falls back to localeCompare for entries that don't parse as numeric
194
+ // tuples (pre-release tags, unexpected names).
195
+ const chosen = [...entries].sort(compareSemverish).reverse()[0];
196
+ const pluginJson = path.join(cacheDir, chosen, ".claude-plugin", "plugin.json");
197
+ try {
198
+ const raw = this.deps.readFileSync(pluginJson, "utf8");
199
+ const parsed = JSON.parse(raw);
200
+ if (typeof parsed?.version === "string")
201
+ return parsed.version;
202
+ }
203
+ catch {
204
+ // fall through
205
+ }
206
+ // Last resort: the directory name itself.
207
+ return chosen;
208
+ }
209
+ settingsPathFor(scope) {
210
+ const root = scope === "global" ? this.deps.homedir() : this.deps.cwd();
211
+ return path.join(root, ".claude", "settings.json");
212
+ }
213
+ async install(opts) {
214
+ const local = await this.queryLocalInstallState(opts.scope);
215
+ const binaryAvailable = await this.isClaudeAvailable();
216
+ if (binaryAvailable) {
217
+ return this.installViaCli(local, opts);
218
+ }
219
+ return this.installViaSettingsFile(local, opts);
220
+ }
221
+ /**
222
+ * Path B: edit ~/.claude/settings.json (or ./.claude/settings.json) directly.
223
+ * Claude Code will notice the extraKnownMarketplaces + enabledPlugins entries
224
+ * on its next launch and prompt to trust + complete the install.
225
+ */
226
+ async installViaSettingsFile(local, opts) {
227
+ const settingsPath = this.settingsPathFor(opts.scope);
228
+ // Compute the desired shape first so dry-run can report it.
229
+ const current = this.readSettingsFile(settingsPath);
230
+ const merged = this.mergeSettingsForDocDetective(current);
231
+ // Only treat settings as current when the marketplace entry actually
232
+ // points at our repo. A stale fork URL or malformed entry should still
233
+ // be repaired — otherwise we'd silently leave broken state in place.
234
+ const mp = current?.extraKnownMarketplaces?.[MARKETPLACE_NAME];
235
+ const hasExpectedMarketplace = mp?.source?.source === "github" &&
236
+ mp?.source?.repo === "doc-detective/agent-tools";
237
+ const alreadyRegistered = current?.enabledPlugins?.[PLUGIN_KEY] === true && hasExpectedMarketplace;
238
+ if (opts.dryRun) {
239
+ opts.logger(`[dry-run] would merge extraKnownMarketplaces + enabledPlugins into ${settingsPath}`, "info");
240
+ return {
241
+ adapterId: this.id,
242
+ scope: opts.scope,
243
+ action: "dry-run",
244
+ installedVersion: local.installedVersion,
245
+ };
246
+ }
247
+ if (alreadyRegistered && !opts.force) {
248
+ return {
249
+ adapterId: this.id,
250
+ scope: opts.scope,
251
+ action: "already-up-to-date",
252
+ installedVersion: local.installedVersion,
253
+ notes: [`Settings already reference the doc-detective plugin at ${settingsPath}.`],
254
+ };
255
+ }
256
+ this.writeSettingsFile(settingsPath, merged);
257
+ opts.logger(`Wrote ${settingsPath}. Claude Code will prompt to install + trust on next launch.`, "info");
258
+ return {
259
+ adapterId: this.id,
260
+ scope: opts.scope,
261
+ action: "fallback",
262
+ installedVersion: local.installedVersion,
263
+ notes: [
264
+ "Claude Code binary was not on PATH; updated settings.json directly.",
265
+ "Start Claude Code to complete the install (you'll see a trust prompt).",
266
+ ],
267
+ };
268
+ }
269
+ readSettingsFile(p) {
270
+ if (!this.deps.existsSync(p))
271
+ return undefined;
272
+ try {
273
+ const raw = this.deps.readFileSync(p, "utf8");
274
+ const parsed = JSON.parse(raw);
275
+ return parsed && typeof parsed === "object" ? parsed : undefined;
276
+ }
277
+ catch (err) {
278
+ throw new Error(`Settings file at ${p} is not valid JSON. Fix or remove it, then re-run install-agents. (${String(err)})`);
279
+ }
280
+ }
281
+ mergeSettingsForDocDetective(existing) {
282
+ const next = { ...(existing ?? {}) };
283
+ next.enabledPlugins = { ...(next.enabledPlugins ?? {}), [PLUGIN_KEY]: true };
284
+ next.extraKnownMarketplaces = {
285
+ ...(next.extraKnownMarketplaces ?? {}),
286
+ [MARKETPLACE_NAME]: {
287
+ source: { source: "github", repo: "doc-detective/agent-tools" },
288
+ },
289
+ };
290
+ return next;
291
+ }
292
+ writeSettingsFile(p, contents) {
293
+ const dir = path.dirname(p);
294
+ const mkdir = this.deps.mkdirSync ?? ((d, o) => { fs.mkdirSync(d, o); });
295
+ const write = this.deps.writeFileSync ?? ((f, d) => fs.writeFileSync(f, d, "utf8"));
296
+ const rename = this.deps.renameSync ?? fs.renameSync;
297
+ const exists = this.deps.existsSync ?? fs.existsSync;
298
+ mkdir(dir, { recursive: true });
299
+ const tmp = `${p}.tmp.${process.pid}.${Date.now()}`;
300
+ write(tmp, JSON.stringify(contents, null, 2) + "\n");
301
+ // Node's fs.renameSync uses MoveFileEx with MOVEFILE_REPLACE_EXISTING on
302
+ // Windows, which atomically replaces an existing destination. Letting
303
+ // rename do the replace avoids the data-loss window that a prior
304
+ // unlink-then-rename pattern opened — if the rename had failed after the
305
+ // unlink, the user's settings.json would have been gone. Best-effort
306
+ // clean up the tmp file if rename throws so we don't leave stragglers.
307
+ try {
308
+ rename(tmp, p);
309
+ }
310
+ catch (err) {
311
+ try {
312
+ if (exists(tmp))
313
+ fs.unlinkSync(tmp);
314
+ }
315
+ catch { }
316
+ throw err;
317
+ }
318
+ }
319
+ /**
320
+ * Path A: `claude plugin ...` subcommands. Assumes binary is available.
321
+ */
322
+ async installViaCli(local, opts) {
323
+ const mappedScope = opts.scope === "global" ? "user" : "project";
324
+ const enriched = local.installed ? await this.enrichWithLatest(local) : local;
325
+ const isInstalled = enriched.installed;
326
+ const isUpToDate = enriched.upToDate === true;
327
+ // Already up-to-date and no --force → no-op.
328
+ if (isInstalled && isUpToDate && !opts.force) {
329
+ return {
330
+ adapterId: this.id,
331
+ scope: opts.scope,
332
+ action: "already-up-to-date",
333
+ installedVersion: enriched.installedVersion,
334
+ };
335
+ }
336
+ const commands = isInstalled
337
+ ? [
338
+ ["claude", "plugin", "marketplace", "update", MARKETPLACE_NAME],
339
+ ["claude", "plugin", "update", PLUGIN_KEY, "--scope", mappedScope],
340
+ ]
341
+ : [
342
+ [
343
+ "claude",
344
+ "plugin",
345
+ "marketplace",
346
+ "add",
347
+ "doc-detective/agent-tools",
348
+ "--scope",
349
+ mappedScope,
350
+ ],
351
+ [
352
+ "claude",
353
+ "plugin",
354
+ "install",
355
+ PLUGIN_KEY,
356
+ "--scope",
357
+ mappedScope,
358
+ ],
359
+ ];
360
+ if (opts.dryRun) {
361
+ for (const cmd of commands) {
362
+ opts.logger(`[dry-run] would run: ${cmd.join(" ")}`, "info");
363
+ }
364
+ return {
365
+ adapterId: this.id,
366
+ scope: opts.scope,
367
+ action: "dry-run",
368
+ installedVersion: enriched.installedVersion,
369
+ };
370
+ }
371
+ for (const [cmd, ...args] of commands) {
372
+ opts.logger(`Running: ${cmd} ${args.join(" ")}`, "debug");
373
+ const result = await this.deps.run(cmd, args);
374
+ if (result.stdout)
375
+ opts.logger(result.stdout, "debug");
376
+ if (result.exitCode !== 0) {
377
+ throw new Error(`\`${cmd} ${args.join(" ")}\` exited with code ${result.exitCode}` +
378
+ (result.stderr ? `: ${result.stderr}` : ""));
379
+ }
380
+ }
381
+ // Report the version we expect after the install. Prefer the freshly-
382
+ // fetched latest; fall back to re-querying the plugin list; last resort
383
+ // is the cache-dir snoop.
384
+ const after = await this.queryMarketplaceList(opts.scope);
385
+ const installedVersion = enriched.latestVersion ??
386
+ after.installedVersion ??
387
+ this.findInstalledVersionFromCache();
388
+ let action;
389
+ if (opts.force && isInstalled && isUpToDate)
390
+ action = "forced";
391
+ else if (isInstalled)
392
+ action = "updated";
393
+ else
394
+ action = "installed";
395
+ return {
396
+ adapterId: this.id,
397
+ scope: opts.scope,
398
+ action,
399
+ installedVersion,
400
+ };
401
+ }
402
+ async isClaudeAvailable() {
403
+ try {
404
+ const result = await this.deps.run("claude", ["--version"]);
405
+ return result.exitCode === 0;
406
+ }
407
+ catch {
408
+ return false;
409
+ }
410
+ }
411
+ }
412
+ export const claudeCodeAdapter = new ClaudeCodeAdapter();
413
+ /**
414
+ * `claude plugin list --json` returns an array of installed plugin entries:
415
+ *
416
+ * [{ "id": "doc-detective@doc-detective",
417
+ * "version": "1.3.0",
418
+ * "scope": "user" | "project",
419
+ * "enabled": true,
420
+ * "installPath": "...",
421
+ * ...
422
+ * }]
423
+ *
424
+ * Accept either that shape or an object wrapping the array under a common
425
+ * key so we stay compatible with small future schema tweaks.
426
+ */
427
+ function toPluginListArray(parsed) {
428
+ if (Array.isArray(parsed))
429
+ return parsed;
430
+ if (parsed && typeof parsed === "object") {
431
+ const obj = parsed;
432
+ for (const key of ["plugins", "installedPlugins", "items"]) {
433
+ if (Array.isArray(obj[key]))
434
+ return obj[key];
435
+ }
436
+ }
437
+ return [];
438
+ }
439
+ /**
440
+ * Compare two version-ish directory names, component-wise by numeric segments.
441
+ * Falls back to localeCompare for any segment that isn't an integer (e.g.
442
+ * pre-release tags or unexpected names). Used to pick the "latest" entry in
443
+ * the Claude Code plugin cache without the "1.10.0" < "1.2.0" trap.
444
+ */
445
+ function compareSemverish(a, b) {
446
+ const pa = a.split(".");
447
+ const pb = b.split(".");
448
+ const len = Math.max(pa.length, pb.length);
449
+ for (let i = 0; i < len; i++) {
450
+ const sa = pa[i] ?? "";
451
+ const sb = pb[i] ?? "";
452
+ const na = /^\d+$/.test(sa) ? parseInt(sa, 10) : NaN;
453
+ const nb = /^\d+$/.test(sb) ? parseInt(sb, 10) : NaN;
454
+ if (Number.isNaN(na) || Number.isNaN(nb))
455
+ return a.localeCompare(b);
456
+ if (na !== nb)
457
+ return na - nb;
458
+ }
459
+ return 0;
460
+ }
461
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/agents/adapters/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
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 CodexDeps {
8
+ run: (cmd: string, args: string[]) => Promise<RunResult>;
9
+ existsSync: (p: string) => boolean;
10
+ readFileSync: (p: string, encoding?: BufferEncoding) => string;
11
+ readdirSync?: (p: string) => string[];
12
+ mkdirSync?: (p: string, opts?: {
13
+ recursive?: boolean;
14
+ }) => void;
15
+ writeFileSync?: (p: string, data: string | Buffer) => void;
16
+ rmSync?: (p: string, opts?: {
17
+ recursive?: boolean;
18
+ force?: boolean;
19
+ }) => void;
20
+ homedir: () => string;
21
+ cwd: () => string;
22
+ fetchLatestVersion: () => Promise<string | undefined>;
23
+ fetchZip: (ref: string) => Promise<{
24
+ tempDir: string;
25
+ ref: string;
26
+ owned?: boolean;
27
+ }>;
28
+ }
29
+ export declare function defaultCodexDeps(): CodexDeps;
30
+ export declare class CodexAdapter implements AgentAdapter {
31
+ readonly id = "codex";
32
+ readonly displayName = "Codex";
33
+ private deps;
34
+ constructor(deps?: CodexDeps);
35
+ supportsScopes(): Scope[];
36
+ detect(): Promise<DetectionResult>;
37
+ getInstallState(scope: Scope): Promise<InstallState>;
38
+ private skillsRoot;
39
+ private canonicalSkillPath;
40
+ private queryLocalInstallState;
41
+ private enrichWithLatest;
42
+ get depsRef(): CodexDeps;
43
+ install(opts: InstallOptions): Promise<InstallReport>;
44
+ private mkdirp;
45
+ /**
46
+ * Recursive directory copy. Uses `this.deps.readdirSync` and
47
+ * `this.deps.writeFileSync` where the injected signatures match, but falls
48
+ * back to `fs.statSync` and buffer-returning `fs.readFileSync` directly —
49
+ * the `CodexDeps.readFileSync` signature returns a string (UTF-8), so we
50
+ * can't use it here without losing binary content (images, shell scripts
51
+ * with executable bits, etc.). Fully-injected recursion would require
52
+ * widening the deps interface with buffer/stat variants; for the narrow
53
+ * use case of copying extracted skills the direct fs calls are fine.
54
+ */
55
+ private copyDir;
56
+ }
57
+ /**
58
+ * Parse YAML frontmatter from a SKILL.md body and return metadata.version.
59
+ * Returns undefined if the front matter is missing, malformed, or lacks the
60
+ * metadata.version key. Never throws — Codex skills can vary.
61
+ */
62
+ export declare function parseMetadataVersion(body: string): string | undefined;
63
+ export declare const codexAdapter: AgentAdapter;
64
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/agents/adapters/codex.ts"],"names":[],"mappings":"AAKA,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,SAAS;IACxB,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,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACtC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAChE,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IAC3D,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAC9E,OAAO,EAAE,MAAM,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACtD,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACvF;AAMD,wBAAgB,gBAAgB,IAAI,SAAS,CAqB5C;AAED,qBAAa,YAAa,YAAW,YAAY;IAC/C,QAAQ,CAAC,EAAE,WAAW;IACtB,QAAQ,CAAC,WAAW,WAAW;IAC/B,OAAO,CAAC,IAAI,CAAY;gBAEZ,IAAI,GAAE,SAA8B;IAIhD,cAAc,IAAI,KAAK,EAAE;IAInB,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC;IAkClC,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC;IAM1D,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,sBAAsB;YAYhB,gBAAgB;IAmB9B,IAAW,OAAO,IAAI,SAAS,CAE9B;IAEK,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IA8H3D,OAAO,CAAC,MAAM;IAQd;;;;;;;;;OASG;IACH,OAAO,CAAC,OAAO;CAuBhB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUrE;AAED,eAAO,MAAM,YAAY,EAAE,YAAiC,CAAC"}