doc-detective 4.0.2 → 4.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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.map +1 -1
- package/dist/common/src/detectTests.js +43 -12
- package/dist/common/src/detectTests.js.map +1 -1
- package/dist/common/src/fileTypes.d.ts.map +1 -1
- package/dist/common/src/fileTypes.js +10 -0
- package/dist/common/src/fileTypes.js.map +1 -1
- package/dist/common/src/schemas/schemas.json +1462 -112
- package/dist/common/src/types/generated/checkLink_v3.d.ts +21 -0
- package/dist/common/src/types/generated/checkLink_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/config_v3.d.ts +10 -0
- package/dist/common/src/types/generated/config_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/goTo_v3.d.ts +6 -0
- package/dist/common/src/types/generated/goTo_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/resolvedTests_v3.d.ts +10 -0
- package/dist/common/src/types/generated/resolvedTests_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/screenshot_v3.d.ts +2 -2
- package/dist/common/src/types/generated/step_v3.d.ts +29 -2
- package/dist/common/src/types/generated/step_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/test_v3.d.ts +58 -4
- package/dist/common/src/types/generated/test_v3.d.ts.map +1 -1
- 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 +153 -31
- package/dist/core/tests/checkLink.js.map +1 -1
- package/dist/core/tests/goTo.d.ts.map +1 -1
- package/dist/core/tests/goTo.js +17 -2
- package/dist/core/tests/goTo.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/core/tests/saveScreenshot.d.ts +15 -1
- package/dist/core/tests/saveScreenshot.d.ts.map +1 -1
- package/dist/core/tests/saveScreenshot.js +171 -50
- package/dist/core/tests/saveScreenshot.js.map +1 -1
- package/dist/core/utils.d.ts +9 -2
- package/dist/core/utils.d.ts.map +1 -1
- package/dist/core/utils.js +234 -14
- package/dist/core/utils.js.map +1 -1
- package/dist/index.cjs +3944 -1817
- 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 +24 -3
|
@@ -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"}
|