@wrongstack/tools 0.313.0 → 0.316.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/_edit-match.d.ts +3 -2
- package/dist/_output-spool.d.ts +4 -3
- package/dist/_shell-pick.d.ts +2 -1
- package/dist/_spawn-stream.d.ts +2 -1
- package/dist/_syntax-check.d.ts +2 -1
- package/dist/audit.js +10 -4055
- package/dist/bash-kill-guard.d.ts +3 -6
- package/dist/bash.js +9 -2308
- package/dist/batch-tool-use.js +2 -187
- package/dist/browser/index.js +25 -1339
- package/dist/browser/network-guard-proxy.d.ts +2 -1
- package/dist/builtin.js +69 -33949
- package/dist/chunk-22B7GE5T.js +260 -0
- package/dist/chunk-2VSZC6QM.js +113 -0
- package/dist/chunk-3PVYQFRQ.js +472 -0
- package/dist/chunk-42BHI7TN.js +337 -0
- package/dist/chunk-4BHUSMNL.js +104 -0
- package/dist/chunk-4I4LWFOO.js +431 -0
- package/dist/chunk-4UESMQDP.js +122 -0
- package/dist/chunk-553IQUMO.js +478 -0
- package/dist/chunk-5H4GSJAI.js +223 -0
- package/dist/chunk-6RNIFLG4.js +305 -0
- package/dist/chunk-7EY5DCRO.js +434 -0
- package/dist/chunk-A6BRWIXN.js +317 -0
- package/dist/chunk-AHHDWNXC.js +200 -0
- package/dist/chunk-BSLVR56S.js +199 -0
- package/dist/chunk-BTSFTGIL.js +7 -0
- package/dist/chunk-D33S4RQG.js +222 -0
- package/dist/chunk-DA4KNE2H.js +4412 -0
- package/dist/chunk-DR7JOQTC.js +520 -0
- package/dist/chunk-EEOFQDT6.js +898 -0
- package/dist/chunk-EJWSCQ6D.js +137 -0
- package/dist/chunk-EMRGN4KM.js +170 -0
- package/dist/chunk-FQZOHLG3.js +89 -0
- package/dist/chunk-GOIZNNOA.js +221 -0
- package/dist/chunk-HFXSNKCV.js +196 -0
- package/dist/chunk-HYX2TZ7O.js +1272 -0
- package/dist/chunk-I64BS3VC.js +15 -0
- package/dist/chunk-IVWV2UM6.js +955 -0
- package/dist/chunk-IXMNTNW5.js +238 -0
- package/dist/chunk-IYK7XGDZ.js +892 -0
- package/dist/chunk-J5SKD6LN.js +235 -0
- package/dist/chunk-JNNVRHMV.js +2111 -0
- package/dist/chunk-JOHXDF3D.js +295 -0
- package/dist/chunk-JRJJX3L5.js +424 -0
- package/dist/chunk-K3WNSHUF.js +1371 -0
- package/dist/chunk-L25CVUVR.js +2830 -0
- package/dist/chunk-LIJQMYYX.js +59 -0
- package/dist/chunk-LWKUTMD5.js +197 -0
- package/dist/chunk-MQX2KXVW.js +54 -0
- package/dist/chunk-MZZN7VCD.js +359 -0
- package/dist/chunk-NBDZMMG2.js +169 -0
- package/dist/chunk-NKJW5GFO.js +366 -0
- package/dist/chunk-NKNOBUBU.js +522 -0
- package/dist/chunk-O4MBV4AX.js +134 -0
- package/dist/chunk-OUBDL3WH.js +3515 -0
- package/dist/chunk-PQKK5JH7.js +101 -0
- package/dist/chunk-PY2IOS7C.js +1000 -0
- package/dist/chunk-Q5JPPCZC.js +12 -0
- package/dist/chunk-QBV725YG.js +128 -0
- package/dist/chunk-QZQSPUBF.js +315 -0
- package/dist/chunk-RGISBZBD.js +231 -0
- package/dist/chunk-RJZQWEMS.js +84 -0
- package/dist/chunk-RXISBFR5.js +315 -0
- package/dist/chunk-S5CCLZL3.js +99 -0
- package/dist/chunk-SDLVH5RZ.js +178 -0
- package/dist/chunk-T2F4S7U4.js +1723 -0
- package/dist/chunk-TEBQ4VPZ.js +163 -0
- package/dist/chunk-U4D5S3VQ.js +21 -0
- package/dist/chunk-U4VAATKP.js +193 -0
- package/dist/chunk-UCYQTZ7F.js +113 -0
- package/dist/chunk-UKU2ZX4C.js +203 -0
- package/dist/chunk-UNSKG6DC.js +159 -0
- package/dist/chunk-V43EQ6VR.js +68 -0
- package/dist/chunk-VB3MJGCV.js +610 -0
- package/dist/chunk-VFKPWSOX.js +154 -0
- package/dist/chunk-VJNHFZ7J.js +190 -0
- package/dist/chunk-VXECAJJ7.js +1091 -0
- package/dist/chunk-WHIIIREL.js +223 -0
- package/dist/chunk-Z6DAKQ3U.js +1 -0
- package/dist/chunk-ZJQ4IGXK.js +474 -0
- package/dist/chunk-ZLTFLC25.js +385 -0
- package/dist/circuit-breaker.js +3 -191
- package/dist/codebase-index/ast-invariant-engine.d.ts +5 -4
- package/dist/codebase-index/binary-frame.d.ts +0 -2
- package/dist/codebase-index/bm25.d.ts +1 -1
- package/dist/codebase-index/circuit-breaker.d.ts +2 -1
- package/dist/codebase-index/codebase-ast-replace-tool.d.ts +3 -2
- package/dist/codebase-index/codebase-impact-analysis-tool.d.ts +4 -3
- package/dist/codebase-index/codebase-invariant-check-tool.d.ts +3 -2
- package/dist/codebase-index/codebase-repo-map-tool.d.ts +3 -2
- package/dist/codebase-index/codebase-skeleton-tool.d.ts +3 -2
- package/dist/codebase-index/codebase-targeted-test-tool.d.ts +3 -2
- package/dist/codebase-index/content-hash.d.ts +0 -2
- package/dist/codebase-index/import-extractor.d.ts +0 -13
- package/dist/codebase-index/index-service.d.ts +1 -1
- package/dist/codebase-index/index.js +84 -13688
- package/dist/codebase-index/languages.d.ts +2 -1
- package/dist/codebase-index/module-roots.d.ts +3 -2
- package/dist/codebase-index/parser-batch.d.ts +0 -5
- package/dist/codebase-index/parser-dispatch.d.ts +2 -1
- package/dist/codebase-index/parser-output.d.ts +4 -3
- package/dist/codebase-index/parser-worker-pool.d.ts +0 -2
- package/dist/codebase-index/parser-worker-script.d.ts +1 -16
- package/dist/codebase-index/parser-worker-script.js +8 -3995
- package/dist/codebase-index/project-server-client-state.d.ts +2 -2
- package/dist/codebase-index/project-server-endpoint.d.ts +0 -15
- package/dist/codebase-index/project-server.js +60 -8548
- package/dist/codebase-index/tree-sitter/visitor.d.ts +2 -1
- package/dist/codebase-index/tree-sitter-parser.d.ts +0 -2
- package/dist/codebase-index/ts-parser.d.ts +1 -1
- package/dist/codebase-index/vector-search.d.ts +2 -1
- package/dist/codebase-index/wal-maintenance.d.ts +3 -2
- package/dist/codebase-index/worker.js +20 -8416
- package/dist/codebase-index/writer-admin.d.ts +0 -1
- package/dist/codebase-index/writer-search.d.ts +0 -9
- package/dist/design.js +2 -299
- package/dist/diff.js +4 -256
- package/dist/document.js +4 -222
- package/dist/e2e.js +5 -476
- package/dist/edit.js +14 -10200
- package/dist/exec.js +16 -3131
- package/dist/fetch.js +8 -398
- package/dist/format.js +10 -3750
- package/dist/generic-parser-VUXDIAOZ.js +13 -0
- package/dist/git.js +4 -380
- package/dist/glob.js +6 -280
- package/dist/go-parser-JXYKJHRC.js +469 -0
- package/dist/grep.js +7 -604
- package/dist/index.js +318 -35387
- package/dist/install.js +10 -4091
- package/dist/json-parser-IBHZ4BZC.js +213 -0
- package/dist/json.js +4 -665
- package/dist/kanban-contract-actions.d.ts +1 -1
- package/dist/kanban-detail-actions.d.ts +2 -1
- package/dist/kanban-presence.d.ts +2 -1
- package/dist/kanban-serializer.d.ts +0 -8
- package/dist/kanban-split-task-handler.d.ts +2 -2
- package/dist/kanban-tool-types.d.ts +2 -1
- package/dist/kanban.js +3 -2096
- package/dist/languages/diagnostics.d.ts +2 -1
- package/dist/languages/index.js +23 -4664
- package/dist/languages/legacy-bridge.d.ts +3 -2
- package/dist/languages/types.d.ts +2 -1
- package/dist/legacy-bridge-7M6QLUQN.js +18 -0
- package/dist/lint.js +10 -3706
- package/dist/logs.js +4 -287
- package/dist/memory.js +6 -215
- package/dist/mode.js +3 -99
- package/dist/outdated.js +4 -5170
- package/dist/pack.js +65 -33897
- package/dist/parser-dispatch-QH4XPGG6.js +14 -0
- package/dist/patch.js +13 -9935
- package/dist/plan.js +5 -3286
- package/dist/process-registry.js +8 -651
- package/dist/ps-slash.js +12 -1439
- package/dist/pwsh.d.ts +0 -1
- package/dist/py-parser-IS4HKYMF.js +16 -0
- package/dist/read.js +13 -9816
- package/dist/replace.js +15 -10014
- package/dist/rs-parser-XHUUO2KZ.js +81 -0
- package/dist/scaffold.js +4 -253
- package/dist/search.js +5 -585
- package/dist/session-kanban-sync.d.ts +0 -6
- package/dist/session-kanban.js +30 -972
- package/dist/skill.js +2 -215
- package/dist/spawn-background.d.ts +1 -1
- package/dist/task.js +5 -3410
- package/dist/test.js +10 -3773
- package/dist/todo.js +4 -2891
- package/dist/tool-help.js +3 -123
- package/dist/tool-search.js +3 -79
- package/dist/tool-tier.js +68 -33984
- package/dist/tool-use.js +2 -93
- package/dist/tree-sitter-parser-AIERW3YI.js +15 -0
- package/dist/tree.js +4 -288
- package/dist/ts-parser-RCTYKSVI.js +232 -0
- package/dist/typecheck.js +10 -3753
- package/dist/win32.js +6 -60
- package/dist/write.js +14 -9882
- package/dist/yaml-parser-4SAXV3PL.js +157 -0
- package/package.json +5 -5
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import {
|
|
2
|
+
safeResolveReal
|
|
3
|
+
} from "./chunk-D33S4RQG.js";
|
|
4
|
+
|
|
5
|
+
// src/tree.ts
|
|
6
|
+
import * as fs from "node:fs/promises";
|
|
7
|
+
import * as path from "node:path";
|
|
8
|
+
import { DEFAULT_WALK_IGNORE_DIRS, compileGlob, expectDefined } from "@wrongstack/core/utils";
|
|
9
|
+
var DEFAULT_IGNORE = /* @__PURE__ */ new Set([
|
|
10
|
+
...DEFAULT_WALK_IGNORE_DIRS,
|
|
11
|
+
".wrongstack",
|
|
12
|
+
".ssh",
|
|
13
|
+
".gnupg",
|
|
14
|
+
".aws"
|
|
15
|
+
]);
|
|
16
|
+
var DEFAULT_MAX_ENTRIES = 5e3;
|
|
17
|
+
var MAX_TREE_OUTPUT_BYTES = 256 * 1024;
|
|
18
|
+
var treeTool = {
|
|
19
|
+
name: "tree",
|
|
20
|
+
category: "Filesystem",
|
|
21
|
+
description: "Display a project or subpath directory tree. Use it for structural layout; use index-backed `codebase-search` first for code understanding when it is live.",
|
|
22
|
+
usageHint: "DIRECTORY-LAYOUT EXPLORATION:\n\n- When `codebase-search` is live, use it first for symbols and concepts; use `tree` when the directory hierarchy itself matters.\n- Tune `depth` (default 3) and use `glob`/`exclude` to focus the view.\n- Prefer this over raw `bash find` or `glob` + manual reading when you need a quick structural overview.\nOutput is truncated for very large trees.",
|
|
23
|
+
permission: "auto",
|
|
24
|
+
mutating: false,
|
|
25
|
+
capabilities: ["fs.read"],
|
|
26
|
+
icon: "tree",
|
|
27
|
+
maxOutputBytes: 262144,
|
|
28
|
+
timeoutMs: 15e3,
|
|
29
|
+
inputSchema: {
|
|
30
|
+
type: "object",
|
|
31
|
+
properties: {
|
|
32
|
+
path: {
|
|
33
|
+
type: "string",
|
|
34
|
+
description: "Root directory to display the tree from (defaults to project root)."
|
|
35
|
+
},
|
|
36
|
+
depth: {
|
|
37
|
+
type: "integer",
|
|
38
|
+
description: "Maximum directory depth to traverse (default 3, use 0 for unlimited).",
|
|
39
|
+
minimum: 0,
|
|
40
|
+
maximum: 20
|
|
41
|
+
},
|
|
42
|
+
glob: {
|
|
43
|
+
type: "string",
|
|
44
|
+
description: "Only include files matching this glob pattern."
|
|
45
|
+
},
|
|
46
|
+
exclude: {
|
|
47
|
+
type: "array",
|
|
48
|
+
items: { type: "string" },
|
|
49
|
+
description: "List of directory names to completely ignore."
|
|
50
|
+
},
|
|
51
|
+
show_files: {
|
|
52
|
+
type: "boolean",
|
|
53
|
+
description: "Whether to show individual files (default true)."
|
|
54
|
+
},
|
|
55
|
+
show_dirs: {
|
|
56
|
+
type: "boolean",
|
|
57
|
+
description: "Whether to show directories (default true)."
|
|
58
|
+
},
|
|
59
|
+
show_hidden: {
|
|
60
|
+
type: "boolean",
|
|
61
|
+
description: "Show hidden files starting with . (default: false)"
|
|
62
|
+
},
|
|
63
|
+
max_entries: {
|
|
64
|
+
type: "integer",
|
|
65
|
+
description: `Maximum entries retained in the rendered tree (default ${DEFAULT_MAX_ENTRIES}).`,
|
|
66
|
+
minimum: 1,
|
|
67
|
+
maximum: 5e4
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
async execute(input, ctx, opts) {
|
|
72
|
+
let final;
|
|
73
|
+
const executeStream = treeTool.executeStream;
|
|
74
|
+
if (!executeStream) throw new Error("treeTool: stream execution unavailable");
|
|
75
|
+
for await (const ev of executeStream(input, ctx, opts)) {
|
|
76
|
+
if (ev.type === "final") final = ev.output;
|
|
77
|
+
}
|
|
78
|
+
if (!final) throw new Error("tree: stream ended without final event");
|
|
79
|
+
return final;
|
|
80
|
+
},
|
|
81
|
+
async *executeStream(input, ctx, opts) {
|
|
82
|
+
const basePath = input.path ? await safeResolveReal(input.path, ctx) : ctx.cwd;
|
|
83
|
+
const maxDepth = input.depth ?? 3;
|
|
84
|
+
const showFiles = input.show_files ?? true;
|
|
85
|
+
const showDirs = input.show_dirs ?? true;
|
|
86
|
+
const showHidden = input.show_hidden ?? false;
|
|
87
|
+
const exclude = /* @__PURE__ */ new Set([...DEFAULT_IGNORE, ...input.exclude ?? []]);
|
|
88
|
+
const globRe = input.glob ? compileGlob(input.glob) : void 0;
|
|
89
|
+
const maxEntries = input.max_entries ?? DEFAULT_MAX_ENTRIES;
|
|
90
|
+
const signal = opts?.signal ?? ctx.signal ?? new AbortController().signal;
|
|
91
|
+
const lines = [basePath];
|
|
92
|
+
const totals = { totalFiles: { value: 0 }, totalDirs: { value: 0 } };
|
|
93
|
+
const retention = {
|
|
94
|
+
entries: 0,
|
|
95
|
+
outputBytes: Buffer.byteLength(basePath, "utf8"),
|
|
96
|
+
maxEntries,
|
|
97
|
+
maxOutputBytes: MAX_TREE_OUTPUT_BYTES,
|
|
98
|
+
truncated: false
|
|
99
|
+
};
|
|
100
|
+
const queue = [];
|
|
101
|
+
const FLUSH_EVERY = 200;
|
|
102
|
+
let lastEmittedTotal = 0;
|
|
103
|
+
const tickProgress = () => {
|
|
104
|
+
const seen = totals.totalFiles.value + totals.totalDirs.value;
|
|
105
|
+
if (seen - lastEmittedTotal >= FLUSH_EVERY) {
|
|
106
|
+
queue.push({
|
|
107
|
+
type: "metric",
|
|
108
|
+
text: `${seen} entries`,
|
|
109
|
+
data: { files: totals.totalFiles.value, dirs: totals.totalDirs.value }
|
|
110
|
+
});
|
|
111
|
+
lastEmittedTotal = seen;
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
const walkPromise = walkDir(basePath, 0, {
|
|
115
|
+
maxDepth,
|
|
116
|
+
exclude,
|
|
117
|
+
showFiles,
|
|
118
|
+
showDirs,
|
|
119
|
+
showHidden,
|
|
120
|
+
globRe,
|
|
121
|
+
basePath,
|
|
122
|
+
lines,
|
|
123
|
+
prefix: "",
|
|
124
|
+
isLast: true,
|
|
125
|
+
totalFiles: totals.totalFiles,
|
|
126
|
+
totalDirs: totals.totalDirs,
|
|
127
|
+
onProgress: tickProgress,
|
|
128
|
+
retention,
|
|
129
|
+
signal
|
|
130
|
+
});
|
|
131
|
+
let walkDone = false;
|
|
132
|
+
void walkPromise.then(
|
|
133
|
+
() => {
|
|
134
|
+
walkDone = true;
|
|
135
|
+
},
|
|
136
|
+
() => {
|
|
137
|
+
walkDone = true;
|
|
138
|
+
}
|
|
139
|
+
);
|
|
140
|
+
while (!walkDone || queue.length > 0) {
|
|
141
|
+
if (queue.length > 0) {
|
|
142
|
+
yield expectDefined(queue.shift());
|
|
143
|
+
} else {
|
|
144
|
+
let pollTimer;
|
|
145
|
+
const poll = new Promise((r) => {
|
|
146
|
+
pollTimer = setTimeout(r, 50);
|
|
147
|
+
});
|
|
148
|
+
try {
|
|
149
|
+
await Promise.race([walkPromise, poll]).catch(() => void 0);
|
|
150
|
+
} finally {
|
|
151
|
+
if (pollTimer) clearTimeout(pollTimer);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
await walkPromise;
|
|
156
|
+
yield {
|
|
157
|
+
type: "final",
|
|
158
|
+
output: {
|
|
159
|
+
tree: lines.join("\n"),
|
|
160
|
+
total_files: totals.totalFiles.value,
|
|
161
|
+
total_dirs: totals.totalDirs.value,
|
|
162
|
+
truncated: retention.truncated,
|
|
163
|
+
path: basePath
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
function matchesTreeGlob(globRe, fileName, absPath, basePath) {
|
|
169
|
+
if (globRe.test(fileName)) return true;
|
|
170
|
+
const rel = path.relative(basePath, absPath);
|
|
171
|
+
const posixRel = !rel || rel.startsWith("..") || path.isAbsolute(rel) ? absPath.split(path.sep).join("/") : rel.split(path.sep).join("/");
|
|
172
|
+
return globRe.test(posixRel);
|
|
173
|
+
}
|
|
174
|
+
async function walkDir(dir, depth, opts) {
|
|
175
|
+
opts.signal.throwIfAborted();
|
|
176
|
+
if (opts.retention.truncated) return;
|
|
177
|
+
const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => []);
|
|
178
|
+
const filtered = entries.filter((e) => {
|
|
179
|
+
if (!opts.showHidden && e.name.startsWith(".")) return false;
|
|
180
|
+
if (opts.exclude.has(e.name)) return false;
|
|
181
|
+
if (e.isFile() && opts.globRe) {
|
|
182
|
+
const abs = path.join(dir, e.name);
|
|
183
|
+
if (!matchesTreeGlob(opts.globRe, e.name, abs, opts.basePath)) return false;
|
|
184
|
+
}
|
|
185
|
+
return true;
|
|
186
|
+
});
|
|
187
|
+
let dirCount = 0;
|
|
188
|
+
let fileCount = 0;
|
|
189
|
+
for (const e of filtered) {
|
|
190
|
+
if (e.isDirectory()) dirCount++;
|
|
191
|
+
else if (e.isFile()) fileCount++;
|
|
192
|
+
}
|
|
193
|
+
opts.totalDirs.value += dirCount;
|
|
194
|
+
opts.totalFiles.value += fileCount;
|
|
195
|
+
opts.onProgress?.();
|
|
196
|
+
const items = filtered.sort((a, b) => {
|
|
197
|
+
if (a.isDirectory() && !b.isDirectory()) return -1;
|
|
198
|
+
if (!a.isDirectory() && b.isDirectory()) return 1;
|
|
199
|
+
return a.name.localeCompare(b.name);
|
|
200
|
+
});
|
|
201
|
+
for (let i = 0; i < items.length; i++) {
|
|
202
|
+
opts.signal.throwIfAborted();
|
|
203
|
+
if (opts.retention.truncated) return;
|
|
204
|
+
const entry = items[i];
|
|
205
|
+
if (!entry) continue;
|
|
206
|
+
const isLast = i === items.length - 1;
|
|
207
|
+
const connector = opts.isLast ? " " : "\u2502 ";
|
|
208
|
+
const branch = isLast ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 ";
|
|
209
|
+
const displayName = entry.name + (entry.isDirectory() ? "/" : "");
|
|
210
|
+
if (!opts.showDirs && entry.isDirectory()) continue;
|
|
211
|
+
if (!opts.showFiles && entry.isFile()) continue;
|
|
212
|
+
const line = opts.prefix + branch + displayName;
|
|
213
|
+
const lineBytes = Buffer.byteLength(line, "utf8") + 1;
|
|
214
|
+
if (opts.retention.entries >= opts.retention.maxEntries || opts.retention.outputBytes + lineBytes > opts.retention.maxOutputBytes) {
|
|
215
|
+
opts.retention.truncated = true;
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
opts.lines.push(line);
|
|
219
|
+
opts.retention.entries++;
|
|
220
|
+
opts.retention.outputBytes += lineBytes;
|
|
221
|
+
if (entry.isDirectory() && (opts.maxDepth === 0 || depth < opts.maxDepth)) {
|
|
222
|
+
const childPrefix = opts.prefix + connector;
|
|
223
|
+
await walkDir(path.join(dir, entry.name), depth + 1, {
|
|
224
|
+
...opts,
|
|
225
|
+
prefix: childPrefix,
|
|
226
|
+
isLast
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export {
|
|
233
|
+
treeTool
|
|
234
|
+
};
|
|
235
|
+
//# sourceMappingURL=chunk-J5SKD6LN.js.map
|