scoutline 0.1.0
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/LICENSE +21 -0
- package/README.md +146 -0
- package/bin/scoutline.js +17 -0
- package/dist/commands/code.d.ts +13 -0
- package/dist/commands/code.d.ts.map +1 -0
- package/dist/commands/code.js +94 -0
- package/dist/commands/code.js.map +1 -0
- package/dist/commands/doctor.d.ts +10 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +70 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/quota.d.ts +9 -0
- package/dist/commands/quota.d.ts.map +1 -0
- package/dist/commands/quota.js +77 -0
- package/dist/commands/quota.js.map +1 -0
- package/dist/commands/read.d.ts +20 -0
- package/dist/commands/read.d.ts.map +1 -0
- package/dist/commands/read.js +166 -0
- package/dist/commands/read.js.map +1 -0
- package/dist/commands/repo.d.ts +22 -0
- package/dist/commands/repo.d.ts.map +1 -0
- package/dist/commands/repo.js +219 -0
- package/dist/commands/repo.js.map +1 -0
- package/dist/commands/search.d.ts +19 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +235 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/tools.d.ts +22 -0
- package/dist/commands/tools.d.ts.map +1 -0
- package/dist/commands/tools.js +173 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/vision.d.ts +15 -0
- package/dist/commands/vision.d.ts.map +1 -0
- package/dist/commands/vision.js +168 -0
- package/dist/commands/vision.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +443 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-client.d.ts +133 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +150 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/cache.d.ts +34 -0
- package/dist/lib/cache.d.ts.map +1 -0
- package/dist/lib/cache.js +168 -0
- package/dist/lib/cache.js.map +1 -0
- package/dist/lib/code-mode.d.ts +19 -0
- package/dist/lib/code-mode.d.ts.map +1 -0
- package/dist/lib/code-mode.js +83 -0
- package/dist/lib/code-mode.js.map +1 -0
- package/dist/lib/config.d.ts +21 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +59 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/errors.d.ts +29 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +69 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/extract.d.ts +37 -0
- package/dist/lib/extract.d.ts.map +1 -0
- package/dist/lib/extract.js +106 -0
- package/dist/lib/extract.js.map +1 -0
- package/dist/lib/image.d.ts +13 -0
- package/dist/lib/image.d.ts.map +1 -0
- package/dist/lib/image.js +102 -0
- package/dist/lib/image.js.map +1 -0
- package/dist/lib/index.d.ts +10 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +10 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/mcp-client.d.ts +161 -0
- package/dist/lib/mcp-client.d.ts.map +1 -0
- package/dist/lib/mcp-client.js +494 -0
- package/dist/lib/mcp-client.js.map +1 -0
- package/dist/lib/mcp-config.d.ts +24 -0
- package/dist/lib/mcp-config.d.ts.map +1 -0
- package/dist/lib/mcp-config.js +129 -0
- package/dist/lib/mcp-config.js.map +1 -0
- package/dist/lib/monitor-client.d.ts +51 -0
- package/dist/lib/monitor-client.d.ts.map +1 -0
- package/dist/lib/monitor-client.js +115 -0
- package/dist/lib/monitor-client.js.map +1 -0
- package/dist/lib/output.d.ts +24 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +59 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/redact.d.ts +7 -0
- package/dist/lib/redact.d.ts.map +1 -0
- package/dist/lib/redact.js +50 -0
- package/dist/lib/redact.js.map +1 -0
- package/dist/lib/silence.d.ts +16 -0
- package/dist/lib/silence.d.ts.map +1 -0
- package/dist/lib/silence.js +56 -0
- package/dist/lib/silence.js.map +1 -0
- package/dist/lib/tty.d.ts +60 -0
- package/dist/lib/tty.d.ts.map +1 -0
- package/dist/lib/tty.js +103 -0
- package/dist/lib/tty.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web reader command using Z.AI WebReader MCP
|
|
3
|
+
*/
|
|
4
|
+
import { ZaiMcpClient } from "../lib/mcp-client.js";
|
|
5
|
+
import { outputSuccess, getOutputMode } from "../lib/output.js";
|
|
6
|
+
import { formatErrorOutput, ValidationError } from "../lib/errors.js";
|
|
7
|
+
import { silenceConsole, restoreConsole } from "../lib/silence.js";
|
|
8
|
+
import { extract, isExtractMode } from "../lib/extract.js";
|
|
9
|
+
/**
|
|
10
|
+
* Rewrite rendered GitHub gist/file URLs to their raw form so Z.AI's reader
|
|
11
|
+
* returns pure file content instead of the rendered HTML page chrome
|
|
12
|
+
* (Sign in / Star / Fork / Embed / etc.).
|
|
13
|
+
*
|
|
14
|
+
* gist.github.com/<user>/<id> -> gist.github.com/<user>/<id>/raw
|
|
15
|
+
* gist.github.com/<user>/<id>#file-... -> gist.github.com/<user>/<id>/raw
|
|
16
|
+
*
|
|
17
|
+
* Leaves alone: URLs that already end in /raw, /raw/<rev>, or have a query string.
|
|
18
|
+
*/
|
|
19
|
+
function maybeRewriteToRaw(url) {
|
|
20
|
+
// Already raw? Leave alone.
|
|
21
|
+
if (/\/raw(\/|$|\?|#)/.test(url))
|
|
22
|
+
return url;
|
|
23
|
+
// Only rewrite gist.github.com (not github.com/owner/repo — that's different)
|
|
24
|
+
const m = url.match(/^(https?:\/\/gist\.github\.com\/[^/]+\/[^/#?]+)(?:[/?#]|$)/);
|
|
25
|
+
if (!m)
|
|
26
|
+
return url;
|
|
27
|
+
const base = m[1];
|
|
28
|
+
// Append /raw, preserve any fragment (file anchor still meaningful)
|
|
29
|
+
const frag = url.indexOf("#") >= 0 ? url.slice(url.indexOf("#")) : "";
|
|
30
|
+
return `${base}/raw${frag}`;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Pull just the content string out of a Z.AI reader response. The full envelope
|
|
34
|
+
* (title, url, metadata, external) is rarely useful for agents — it just bloats
|
|
35
|
+
* output and makes truncation limits harder to reason about.
|
|
36
|
+
*/
|
|
37
|
+
function extractContent(response) {
|
|
38
|
+
if (typeof response === "string")
|
|
39
|
+
return { content: response, original: response };
|
|
40
|
+
if (response && typeof response === "object") {
|
|
41
|
+
const obj = response;
|
|
42
|
+
if (typeof obj.content === "string") {
|
|
43
|
+
return { content: obj.content, original: response };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Fallback: stringify whatever we got
|
|
47
|
+
return { content: JSON.stringify(response), original: response };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Truncate to max chars. Returns the (possibly truncated) content plus the
|
|
51
|
+
* original length so the caller can warn about truncation.
|
|
52
|
+
*/
|
|
53
|
+
function truncate(content, max) {
|
|
54
|
+
const originalLen = content.length;
|
|
55
|
+
if (!max || max <= 0 || originalLen <= max) {
|
|
56
|
+
return { text: content, originalLen, truncated: false };
|
|
57
|
+
}
|
|
58
|
+
return { text: content.slice(0, max - 1).trimEnd() + "…", originalLen, truncated: true };
|
|
59
|
+
}
|
|
60
|
+
export async function read(url, options = {}) {
|
|
61
|
+
// Validate URL first (before silencing)
|
|
62
|
+
if (!url.startsWith("http://") && !url.startsWith("https://")) {
|
|
63
|
+
console.error(formatErrorOutput(new ValidationError("URL must start with http:// or https://")));
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
if (options.extract && !isExtractMode(options.extract)) {
|
|
67
|
+
console.error(formatErrorOutput(new ValidationError(`Invalid --extract mode: ${options.extract}. Use one of: code, links, tables, headings`)));
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
const finalUrl = maybeRewriteToRaw(url);
|
|
71
|
+
if (finalUrl !== url) {
|
|
72
|
+
process.stderr.write(`ℹ️ rewrote gist URL to raw form: ${finalUrl}\n`);
|
|
73
|
+
}
|
|
74
|
+
silenceConsole();
|
|
75
|
+
const client = new ZaiMcpClient({ enableVision: false, noCache: options.noCache });
|
|
76
|
+
try {
|
|
77
|
+
try {
|
|
78
|
+
const response = await client.webRead({
|
|
79
|
+
url: finalUrl,
|
|
80
|
+
format: options.format || "markdown",
|
|
81
|
+
retainImages: !options.noImages,
|
|
82
|
+
withLinksSummary: options.withLinks,
|
|
83
|
+
timeout: options.timeout,
|
|
84
|
+
noCache: options.noCache,
|
|
85
|
+
noGfm: options.noGfm,
|
|
86
|
+
keepImgDataUrl: options.keepImgDataUrl,
|
|
87
|
+
withImagesSummary: options.withImagesSummary,
|
|
88
|
+
});
|
|
89
|
+
const { content: rawContent } = extractContent(response);
|
|
90
|
+
// --extract short-circuits: returns the extracted slice as a JSON array,
|
|
91
|
+
// bypassing truncation and envelope logic.
|
|
92
|
+
if (options.extract) {
|
|
93
|
+
const extracted = extract(rawContent, options.extract);
|
|
94
|
+
process.stderr.write(`ℹ️ extracted ${extracted.length} ${options.extract}\n`);
|
|
95
|
+
outputSuccess(extracted);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const { text, originalLen, truncated } = truncate(rawContent, options.maxChars);
|
|
99
|
+
if (truncated) {
|
|
100
|
+
process.stderr.write(`⚠️ content truncated from ${originalLen.toLocaleString()} to ${text.length.toLocaleString()} chars; use a higher --max-chars or omit it for full content\n`);
|
|
101
|
+
}
|
|
102
|
+
// Default: content-only (drops title/metadata/external envelope).
|
|
103
|
+
// --full-envelope or --output-format json/pretty keeps the structured object.
|
|
104
|
+
const wantEnvelope = options.fullEnvelope || getOutputMode() === "json" || getOutputMode() === "pretty";
|
|
105
|
+
if (wantEnvelope) {
|
|
106
|
+
const envelope = response && typeof response === "object"
|
|
107
|
+
? { ...response, content: text }
|
|
108
|
+
: { content: text };
|
|
109
|
+
outputSuccess(envelope);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
outputSuccess(text);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
await client.close().catch(() => { });
|
|
117
|
+
restoreConsole();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error(formatErrorOutput(error));
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Help text
|
|
126
|
+
export const READ_HELP = `
|
|
127
|
+
Read Command - Fetch and parse web page content using Z.AI WebReader MCP
|
|
128
|
+
|
|
129
|
+
Usage: scoutline read <url> [options]
|
|
130
|
+
|
|
131
|
+
URL handling:
|
|
132
|
+
gist.github.com/<user>/<id> URLs are auto-rewritten to /raw so you get pure
|
|
133
|
+
file content instead of rendered HTML chrome (Sign in / Star / Fork / Embed).
|
|
134
|
+
|
|
135
|
+
Options:
|
|
136
|
+
--format <f> Output format: markdown (default), text
|
|
137
|
+
--no-images Remove images from output
|
|
138
|
+
--no-cache Disable server-side caching
|
|
139
|
+
--with-links Include links summary
|
|
140
|
+
--with-images-summary Include images summary
|
|
141
|
+
--no-gfm Disable GitHub Flavored Markdown
|
|
142
|
+
--keep-img-data-url Keep image data URLs in output
|
|
143
|
+
--timeout <s> Request timeout in seconds (default: 20)
|
|
144
|
+
--max-chars <n> Truncate content to <n> chars (warns on stderr when it kicks in)
|
|
145
|
+
--full-envelope Include title/url/metadata/external fields (default: content-only)
|
|
146
|
+
--extract <m> Pull a specific slice out as JSON array: code | links | tables | headings
|
|
147
|
+
|
|
148
|
+
By default the command outputs just the page content (string). Use --full-envelope
|
|
149
|
+
or --output-format json/pretty to get the full structured response object. Use
|
|
150
|
+
--extract to return only matching elements (e.g. all code blocks, all links).
|
|
151
|
+
|
|
152
|
+
Examples:
|
|
153
|
+
scoutline read https://docs.example.com/api
|
|
154
|
+
scoutline read https://github.com/owner/repo --format text
|
|
155
|
+
scoutline read https://gist.github.com/user/abc123 # auto-rewritten to /raw
|
|
156
|
+
scoutline read https://blog.example.com/post --no-images --with-links
|
|
157
|
+
scoutline read https://example.com/long-article --max-chars 2000
|
|
158
|
+
scoutline read https://react.dev/learn/hooks --extract code # just code blocks
|
|
159
|
+
scoutline read https://example.com/page --extract links # just URLs
|
|
160
|
+
scoutline read https://en.wikipedia.org/wiki/X --extract headings # section outline
|
|
161
|
+
|
|
162
|
+
Output format:
|
|
163
|
+
Content string by default; structured object with --full-envelope or -O json;
|
|
164
|
+
JSON array of extracted elements with --extract.
|
|
165
|
+
`.trim();
|
|
166
|
+
//# sourceMappingURL=read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/commands/read.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repo commands for GitHub repository exploration (ZRead)
|
|
3
|
+
*/
|
|
4
|
+
export interface RepoSearchOptions {
|
|
5
|
+
language?: "en" | "zh";
|
|
6
|
+
maxChars?: number;
|
|
7
|
+
noCache?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface RepoTreeOptions {
|
|
10
|
+
path?: string;
|
|
11
|
+
depth?: number;
|
|
12
|
+
noCache?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface RepoReadOptions {
|
|
15
|
+
maxChars?: number;
|
|
16
|
+
noCache?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function repoSearch(repo: string, query: string, options?: RepoSearchOptions): Promise<void>;
|
|
19
|
+
export declare function repoTree(repo: string, options?: RepoTreeOptions): Promise<void>;
|
|
20
|
+
export declare function repoRead(repo: string, path: string, options?: RepoReadOptions): Promise<void>;
|
|
21
|
+
export declare const REPO_HELP: string;
|
|
22
|
+
//# sourceMappingURL=repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../src/commands/repo.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAiFD,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyCzF;AAED,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAsBf;AAGD,eAAO,MAAM,SAAS,QA2Cd,CAAC"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repo commands for GitHub repository exploration (ZRead)
|
|
3
|
+
*/
|
|
4
|
+
import { ZReadMcpClient } from "../lib/mcp-client.js";
|
|
5
|
+
import { outputSuccess } from "../lib/output.js";
|
|
6
|
+
import { formatErrorOutput, ValidationError } from "../lib/errors.js";
|
|
7
|
+
import { silenceConsole, restoreConsole } from "../lib/silence.js";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
function validateRepo(repo) {
|
|
10
|
+
if (!repo.includes("/")) {
|
|
11
|
+
throw new ValidationError(`Invalid repository format: "${repo}". Use "owner/repo" format (e.g., "facebook/react")`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function truncateText(text, max) {
|
|
15
|
+
if (!max || max <= 0 || text.length <= max)
|
|
16
|
+
return text;
|
|
17
|
+
return text.slice(0, max - 1).trimEnd() + "…";
|
|
18
|
+
}
|
|
19
|
+
function extractStructureBlock(structure) {
|
|
20
|
+
const match = structure.match(/<structure>\n([\s\S]*?)\n<\/structure>/);
|
|
21
|
+
const block = match ? match[1] : structure;
|
|
22
|
+
return block
|
|
23
|
+
.split("\n")
|
|
24
|
+
.map((line) => line.replace(/\r/g, ""))
|
|
25
|
+
.filter(Boolean);
|
|
26
|
+
}
|
|
27
|
+
function extractImmediateDirectories(structure, basePath) {
|
|
28
|
+
const lines = extractStructureBlock(structure);
|
|
29
|
+
const directories = [];
|
|
30
|
+
for (const line of lines) {
|
|
31
|
+
const match = line.match(/^([│\s]*)(├──|└──)\s(.+)$/);
|
|
32
|
+
if (!match)
|
|
33
|
+
continue;
|
|
34
|
+
const prefix = match[1] || "";
|
|
35
|
+
const name = (match[3] || "").trim();
|
|
36
|
+
const normalizedPrefix = prefix.replace(/│/g, " ");
|
|
37
|
+
const level = Math.floor(normalizedPrefix.length / 4);
|
|
38
|
+
if (level !== 0)
|
|
39
|
+
continue;
|
|
40
|
+
if (!name.endsWith("/"))
|
|
41
|
+
continue;
|
|
42
|
+
const dirName = name.slice(0, -1);
|
|
43
|
+
const fullPath = basePath ? path.posix.join(basePath, dirName) : dirName;
|
|
44
|
+
directories.push(fullPath);
|
|
45
|
+
}
|
|
46
|
+
return directories;
|
|
47
|
+
}
|
|
48
|
+
function normalizeDirPath(value) {
|
|
49
|
+
if (!value)
|
|
50
|
+
return undefined;
|
|
51
|
+
const trimmed = value.trim();
|
|
52
|
+
if (!trimmed || trimmed === "/" || trimmed === ".")
|
|
53
|
+
return undefined;
|
|
54
|
+
return trimmed.replace(/^\/+/, "").replace(/\/+$/, "");
|
|
55
|
+
}
|
|
56
|
+
async function collectTreeSnapshots(client, repo, basePath, depth) {
|
|
57
|
+
const snapshots = [];
|
|
58
|
+
const seen = new Set();
|
|
59
|
+
const queue = [{ path: basePath || "", level: 1 }];
|
|
60
|
+
while (queue.length > 0) {
|
|
61
|
+
const current = queue.shift();
|
|
62
|
+
const key = current.path;
|
|
63
|
+
if (seen.has(key))
|
|
64
|
+
continue;
|
|
65
|
+
seen.add(key);
|
|
66
|
+
const structure = await client.getRepoStructure(repo, current.path || undefined);
|
|
67
|
+
snapshots.push({ path: current.path || "/", structure });
|
|
68
|
+
if (current.level >= depth)
|
|
69
|
+
continue;
|
|
70
|
+
const children = extractImmediateDirectories(structure, current.path);
|
|
71
|
+
for (const child of children) {
|
|
72
|
+
queue.push({ path: child, level: current.level + 1 });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return snapshots;
|
|
76
|
+
}
|
|
77
|
+
export async function repoSearch(repo, query, options = {}) {
|
|
78
|
+
try {
|
|
79
|
+
validateRepo(repo);
|
|
80
|
+
if (options.language && options.language !== "en" && options.language !== "zh") {
|
|
81
|
+
throw new ValidationError('Language must be "en" or "zh"');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.error(formatErrorOutput(error));
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
silenceConsole();
|
|
89
|
+
const client = new ZReadMcpClient({ enableVision: false, noCache: options.noCache });
|
|
90
|
+
try {
|
|
91
|
+
try {
|
|
92
|
+
const language = options.language || "en";
|
|
93
|
+
const results = await client.searchDoc(repo, query, language);
|
|
94
|
+
outputSuccess(truncateText(results, options.maxChars));
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
await client.close().catch(() => { });
|
|
98
|
+
restoreConsole();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
console.error(formatErrorOutput(error));
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export async function repoTree(repo, options = {}) {
|
|
107
|
+
try {
|
|
108
|
+
validateRepo(repo);
|
|
109
|
+
if (options.depth !== undefined) {
|
|
110
|
+
const depthValue = Number(options.depth);
|
|
111
|
+
if (!Number.isFinite(depthValue) || depthValue < 1) {
|
|
112
|
+
throw new ValidationError("Depth must be a positive integer");
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
console.error(formatErrorOutput(error));
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
silenceConsole();
|
|
121
|
+
const client = new ZReadMcpClient({ enableVision: false, noCache: options.noCache });
|
|
122
|
+
try {
|
|
123
|
+
try {
|
|
124
|
+
const depth = Math.max(1, Math.floor(options.depth || 1));
|
|
125
|
+
const dirPath = normalizeDirPath(options.path);
|
|
126
|
+
if (depth === 1) {
|
|
127
|
+
const structure = await client.getRepoStructure(repo, dirPath);
|
|
128
|
+
outputSuccess(structure);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const snapshots = await collectTreeSnapshots(client, repo, dirPath, depth);
|
|
132
|
+
outputSuccess({
|
|
133
|
+
repo,
|
|
134
|
+
depth,
|
|
135
|
+
basePath: dirPath || "/",
|
|
136
|
+
snapshots,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
await client.close().catch(() => { });
|
|
141
|
+
restoreConsole();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
console.error(formatErrorOutput(error));
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
export async function repoRead(repo, path, options = {}) {
|
|
150
|
+
try {
|
|
151
|
+
validateRepo(repo);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
console.error(formatErrorOutput(error));
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
silenceConsole();
|
|
158
|
+
const client = new ZReadMcpClient({ enableVision: false, noCache: options.noCache });
|
|
159
|
+
try {
|
|
160
|
+
try {
|
|
161
|
+
const content = await client.readFile(repo, path);
|
|
162
|
+
outputSuccess(truncateText(content, options.maxChars));
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
await client.close().catch(() => { });
|
|
166
|
+
restoreConsole();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
console.error(formatErrorOutput(error));
|
|
171
|
+
process.exit(1);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// Help text
|
|
175
|
+
export const REPO_HELP = `
|
|
176
|
+
Repo Commands - Explore GitHub repositories using ZRead
|
|
177
|
+
|
|
178
|
+
Usage: scoutline repo <command> <owner/repo> [args]
|
|
179
|
+
|
|
180
|
+
Commands:
|
|
181
|
+
search <owner/repo> <query> Search docs and code in repository
|
|
182
|
+
tree <owner/repo> Get repository directory structure
|
|
183
|
+
read <owner/repo> <path> Read a file from repository
|
|
184
|
+
|
|
185
|
+
Search Options:
|
|
186
|
+
--language <lang> Result language: en (default) or zh
|
|
187
|
+
--max-chars <n> Truncate output to <n> chars
|
|
188
|
+
|
|
189
|
+
Tree Options:
|
|
190
|
+
--path <path> Directory path to inspect (default: repo root)
|
|
191
|
+
--depth <n> Expand subdirectory trees (default: 1)
|
|
192
|
+
|
|
193
|
+
Read Options:
|
|
194
|
+
--max-chars <n> Truncate file content to <n> chars
|
|
195
|
+
|
|
196
|
+
Examples:
|
|
197
|
+
scoutline repo search facebook/react "server components"
|
|
198
|
+
scoutline repo search facebook/react "server components" --language en --max-chars 2000
|
|
199
|
+
scoutline repo tree vercel/next.js
|
|
200
|
+
scoutline repo tree vercel/next.js --path packages --depth 2
|
|
201
|
+
scoutline repo read anthropics/anthropic-sdk-python src/anthropic/client.py
|
|
202
|
+
scoutline repo read facebook/react README.md --max-chars 3000
|
|
203
|
+
|
|
204
|
+
Notes:
|
|
205
|
+
- Repository must be public
|
|
206
|
+
- Use "owner/repo" format (e.g., "facebook/react")
|
|
207
|
+
- Paths are relative to repository root
|
|
208
|
+
- Depth >1 returns structured snapshots (use --output-format pretty for readability)
|
|
209
|
+
|
|
210
|
+
Output format (search):
|
|
211
|
+
Search results array
|
|
212
|
+
|
|
213
|
+
Output format (tree):
|
|
214
|
+
Repository structure object
|
|
215
|
+
|
|
216
|
+
Output format (read):
|
|
217
|
+
File contents
|
|
218
|
+
`.trim();
|
|
219
|
+
//# sourceMappingURL=repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.js","sourceRoot":"","sources":["../../src/commands/repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web search command using Z.AI WebSearchPrime MCP
|
|
3
|
+
*/
|
|
4
|
+
type RecencyFilter = "oneDay" | "oneWeek" | "oneMonth" | "oneYear" | "noLimit";
|
|
5
|
+
export interface SearchOptions {
|
|
6
|
+
count?: number;
|
|
7
|
+
domain?: string;
|
|
8
|
+
recency?: RecencyFilter;
|
|
9
|
+
contentSize?: "medium" | "high";
|
|
10
|
+
location?: "cn" | "us";
|
|
11
|
+
maxSummary?: number;
|
|
12
|
+
fields?: string[];
|
|
13
|
+
noCache?: boolean;
|
|
14
|
+
merge?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function search(query: string, options?: SearchOptions): Promise<void>;
|
|
17
|
+
export declare const SEARCH_HELP: string;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,KAAK,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAE/E,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,WAAW,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAChC,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA0FD,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+GtF;AAGD,eAAO,MAAM,WAAW,QA8ChB,CAAC"}
|