@swarmdo/cli 1.9.0 → 1.11.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.
@@ -0,0 +1,184 @@
1
+ /**
2
+ * `swarmdo pack` — bundle a repo (or subset) into one AI-friendly context blob.
3
+ *
4
+ * swarmdo pack # markdown bundle of the repo → stdout
5
+ * swarmdo pack src --format xml -o ctx.xml
6
+ * swarmdo pack --include '*.ts' --exclude '*.test.ts'
7
+ * swarmdo pack --tokens # just per-file + total token counts
8
+ * swarmdo pack --redact # mask secrets in each file first
9
+ *
10
+ * The fs walk lives here (default skips + .gitignore + glob include/exclude +
11
+ * binary/size guards); the pure engine (../pack/pack.ts) does formatting +
12
+ * token accounting. --redact composes the ../redact engine so secrets never
13
+ * land in the bundle.
14
+ */
15
+ import * as fs from 'node:fs';
16
+ import * as path from 'node:path';
17
+ import { output } from '../output.js';
18
+ import { packFiles, makeIgnoreMatcher } from '../pack/pack.js';
19
+ import { redactText } from '../redact/redact.js';
20
+ const SKIP_DIRS = new Set([
21
+ 'node_modules', '.git', '.swarm', 'dist', 'dist-standalone', 'build',
22
+ 'coverage', '.next', '.turbo', 'out', 'vendor', '.cache',
23
+ ]);
24
+ const BINARY_EXT = new Set([
25
+ 'png', 'jpg', 'jpeg', 'gif', 'webp', 'ico', 'pdf', 'zip', 'gz', 'tar', 'tgz',
26
+ 'woff', 'woff2', 'ttf', 'eot', 'mp4', 'mov', 'mp3', 'wav', 'wasm', 'so', 'dylib',
27
+ 'dll', 'exe', 'bin', 'node', 'lock', 'jpeg',
28
+ ]);
29
+ /** Looks binary if it has a NUL in the first 8 KiB. */
30
+ function looksBinary(buf) {
31
+ const n = Math.min(buf.length, 8192);
32
+ for (let i = 0; i < n; i++)
33
+ if (buf[i] === 0)
34
+ return true;
35
+ return false;
36
+ }
37
+ function walk(o) {
38
+ const files = [];
39
+ const stack = [o.root];
40
+ while (stack.length) {
41
+ const dir = stack.pop();
42
+ let entries;
43
+ try {
44
+ entries = fs.readdirSync(dir, { withFileTypes: true });
45
+ }
46
+ catch {
47
+ continue;
48
+ }
49
+ for (const e of entries) {
50
+ const full = path.join(dir, e.name);
51
+ const rel = path.relative(o.root, full).split(path.sep).join('/');
52
+ if (e.isDirectory()) {
53
+ if (SKIP_DIRS.has(e.name))
54
+ continue;
55
+ if (o.gitignore?.(rel + '/'))
56
+ continue;
57
+ stack.push(full);
58
+ }
59
+ else if (e.isFile()) {
60
+ if (o.gitignore?.(rel))
61
+ continue;
62
+ if (o.exclude?.(rel))
63
+ continue;
64
+ if (o.include && !o.include(rel))
65
+ continue;
66
+ if (BINARY_EXT.has(e.name.slice(e.name.lastIndexOf('.') + 1).toLowerCase()))
67
+ continue;
68
+ let stat;
69
+ try {
70
+ stat = fs.statSync(full);
71
+ }
72
+ catch {
73
+ continue;
74
+ }
75
+ if (stat.size > o.maxBytes)
76
+ continue;
77
+ let buf;
78
+ try {
79
+ buf = fs.readFileSync(full);
80
+ }
81
+ catch {
82
+ continue;
83
+ }
84
+ if (looksBinary(buf))
85
+ continue;
86
+ files.push({ path: rel, content: buf.toString('utf8') });
87
+ }
88
+ }
89
+ }
90
+ return files;
91
+ }
92
+ function csv(v) {
93
+ if (typeof v !== 'string' || !v)
94
+ return undefined;
95
+ return v.split(',').map((s) => s.trim()).filter(Boolean);
96
+ }
97
+ async function run(ctx) {
98
+ const repoRoot = ctx.cwd || process.cwd();
99
+ const scanRoot = ctx.args[0] ? path.resolve(repoRoot, ctx.args[0]) : repoRoot;
100
+ // NB: use --style, not --format — `format` is a global flag (text/json/table,
101
+ // default 'text') that would shadow ours (#1425 removed its short alias).
102
+ const format = (typeof ctx.flags.style === 'string' ? ctx.flags.style : 'md');
103
+ if (!['md', 'xml', 'json', 'plain'].includes(format)) {
104
+ output.printError(`unknown --style '${format}' (use md|xml|json|plain)`);
105
+ return { success: false, exitCode: 1 };
106
+ }
107
+ const maxKb = typeof ctx.flags['max-file-size'] === 'string' ? parseInt(ctx.flags['max-file-size'], 10) : 512;
108
+ const maxBytes = (Number.isFinite(maxKb) ? maxKb : 512) * 1024;
109
+ const includePats = csv(ctx.flags.include);
110
+ const excludePats = csv(ctx.flags.exclude);
111
+ let gitignore;
112
+ if (ctx.flags['no-gitignore'] !== true) {
113
+ try {
114
+ const gi = fs.readFileSync(path.join(scanRoot, '.gitignore'), 'utf8').split('\n');
115
+ gitignore = makeIgnoreMatcher(gi);
116
+ }
117
+ catch { /* no .gitignore */ }
118
+ }
119
+ const files = walk({
120
+ root: scanRoot,
121
+ include: includePats ? makeIgnoreMatcher(includePats) : undefined,
122
+ exclude: excludePats ? makeIgnoreMatcher(excludePats) : undefined,
123
+ gitignore,
124
+ maxBytes,
125
+ });
126
+ if (files.length === 0) {
127
+ output.printError('no files matched — check the path, --include/--exclude, or .gitignore');
128
+ return { success: false, exitCode: 1 };
129
+ }
130
+ const opts = { format, tree: ctx.flags['no-tree'] !== true };
131
+ if (ctx.flags.redact === true) {
132
+ opts.transform = (content) => redactText(content).output;
133
+ }
134
+ const { output: bundle, stats } = packFiles(files, opts);
135
+ // --tokens: report accounting only, no bundle.
136
+ if (ctx.flags.tokens === true) {
137
+ if (ctx.flags.json === true) {
138
+ output.printJson(stats);
139
+ }
140
+ else {
141
+ for (const f of [...stats.perFile].sort((a, b) => b.tokens - a.tokens)) {
142
+ output.writeln(`${String(f.tokens).padStart(8)} ${f.path}`);
143
+ }
144
+ output.writeln(output.bold(`${String(stats.tokens).padStart(8)} TOTAL (${stats.files} files, ${(stats.bytes / 1024).toFixed(1)} KiB)`));
145
+ }
146
+ return { success: true, exitCode: 0 };
147
+ }
148
+ const outFile = (typeof ctx.flags.output === 'string' && ctx.flags.output) || (typeof ctx.flags.o === 'string' && ctx.flags.o);
149
+ if (outFile) {
150
+ fs.writeFileSync(path.resolve(repoRoot, outFile), bundle);
151
+ output.printSuccess(`packed ${stats.files} files (~${stats.tokens} tokens) → ${outFile}`);
152
+ }
153
+ else {
154
+ process.stdout.write(bundle);
155
+ if (!process.stdout.isTTY) { /* piped: keep stdout clean */ }
156
+ process.stderr.write(output.dim(`packed ${stats.files} files (~${stats.tokens} tokens)\n`));
157
+ }
158
+ return { success: true, exitCode: 0 };
159
+ }
160
+ export const packCommand = {
161
+ name: 'pack',
162
+ description: 'Bundle a repo (or subset) into one AI-friendly context blob (md/xml/json/plain) with a tree + token counts — deterministic',
163
+ options: [
164
+ { name: 'style', description: 'output format: md (default), xml, json, plain', type: 'string' },
165
+ { name: 'include', description: 'comma-separated globs; keep only matching files (e.g. "*.ts,*.md")', type: 'string' },
166
+ { name: 'exclude', description: 'comma-separated globs to skip (e.g. "*.test.ts")', type: 'string' },
167
+ { name: 'output', short: 'o', description: 'write the bundle to a file instead of stdout', type: 'string' },
168
+ { name: 'no-tree', description: 'omit the directory tree header', type: 'boolean' },
169
+ { name: 'no-gitignore', description: "don't apply the repo's .gitignore", type: 'boolean' },
170
+ { name: 'max-file-size', description: 'skip files larger than N KiB (default 512)', type: 'string' },
171
+ { name: 'redact', description: 'mask secrets in each file before bundling (uses `swarmdo redact`)', type: 'boolean' },
172
+ { name: 'tokens', description: 'print per-file + total token estimates only, no bundle', type: 'boolean' },
173
+ { name: 'json', description: 'with --tokens, emit the stats as JSON', type: 'boolean' },
174
+ ],
175
+ examples: [
176
+ { command: 'swarmdo pack src -o context.md', description: 'Bundle src/ to a markdown file' },
177
+ { command: "swarmdo pack --include '*.ts' --exclude '*.test.ts'", description: 'Only non-test TypeScript' },
178
+ { command: 'swarmdo pack --tokens', description: 'Token budget breakdown, largest first' },
179
+ { command: 'swarmdo pack --redact --style xml', description: 'Secret-safe XML bundle' },
180
+ ],
181
+ action: run,
182
+ };
183
+ export default packCommand;
184
+ //# sourceMappingURL=pack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack.js","sourceRoot":"","sources":["../../../src/commands/pack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAoD,MAAM,iBAAiB,CAAC;AACjH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO;IACpE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ;CACzD,CAAC,CAAC;AACH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK;IAC5E,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO;IAChF,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAC5C,CAAC,CAAC;AAEH,uDAAuD;AACvD,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IAC1D,OAAO,KAAK,CAAC;AACf,CAAC;AAUD,SAAS,IAAI,CAAC,CAAW;IACvB,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QACzB,IAAI,OAAoB,CAAC;QACzB,IAAI,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,SAAS;QAAC,CAAC;QACnF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClE,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACpB,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;oBAAE,SAAS;gBACpC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC;oBAAE,SAAS;gBACvC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;gBACtB,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC;oBAAE,SAAS;gBACjC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAC/B,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAC3C,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;oBAAE,SAAS;gBACtF,IAAI,IAAc,CAAC;gBACnB,IAAI,CAAC;oBAAC,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBACrD,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,QAAQ;oBAAE,SAAS;gBACrC,IAAI,GAAW,CAAC;gBAChB,IAAI,CAAC;oBAAC,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBACxD,IAAI,WAAW,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,GAAG,CAAC,CAAU;IACrB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAClD,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,GAAmB;IACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE9E,8EAA8E;IAC9E,0EAA0E;IAC1E,MAAM,MAAM,GAAG,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAe,CAAC;IAC5F,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,MAAM,CAAC,UAAU,CAAC,oBAAoB,MAAM,2BAA2B,CAAC,CAAC;QACzE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzC,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACxH,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAE/D,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAE3C,IAAI,SAA+C,CAAC;IACpD,IAAI,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClF,SAAS,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC;QACjB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;QACjE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;QACjE,SAAS;QACT,QAAQ;KACT,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,UAAU,CAAC,uEAAuE,CAAC,CAAC;QAC3F,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,IAAI,GAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;IAC1E,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC3D,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAEzD,+CAA+C;IAC/C,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC9B,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC5B,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvE,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3I,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/H,IAAI,OAAO,EAAE,CAAC;QACZ,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,CAAC,YAAY,CAAC,UAAU,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,MAAM,cAAc,OAAO,EAAE,CAAC,CAAC;IAC5F,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,8BAA8B,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAY;IAClC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,4HAA4H;IACzI,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,+CAA+C,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC/F,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,oEAAoE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACtH,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,kDAAkD,EAAE,IAAI,EAAE,QAAQ,EAAE;QACpG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,8CAA8C,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC3G,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,gCAAgC,EAAE,IAAI,EAAE,SAAS,EAAE;QACnF,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,mCAAmC,EAAE,IAAI,EAAE,SAAS,EAAE;QAC3F,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,4CAA4C,EAAE,IAAI,EAAE,QAAQ,EAAE;QACpG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mEAAmE,EAAE,IAAI,EAAE,SAAS,EAAE;QACrH,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wDAAwD,EAAE,IAAI,EAAE,SAAS,EAAE;QAC1G,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,uCAAuC,EAAE,IAAI,EAAE,SAAS,EAAE;KACxF;IACD,QAAQ,EAAE;QACR,EAAE,OAAO,EAAE,gCAAgC,EAAE,WAAW,EAAE,gCAAgC,EAAE;QAC5F,EAAE,OAAO,EAAE,qDAAqD,EAAE,WAAW,EAAE,0BAA0B,EAAE;QAC3G,EAAE,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,uCAAuC,EAAE;QAC1F,EAAE,OAAO,EAAE,mCAAmC,EAAE,WAAW,EAAE,wBAAwB,EAAE;KACxF;IACD,MAAM,EAAE,GAAG;CACZ,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"codegraph-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp-tools/codegraph-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAgH1C,eAAO,MAAM,cAAc,EAAE,OAAO,EAKnC,CAAC"}
1
+ {"version":3,"file":"codegraph-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp-tools/codegraph-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAoK1C,eAAO,MAAM,cAAc,EAAE,OAAO,EAOnC,CAAC"}
@@ -6,7 +6,7 @@
6
6
  * instead of shelling out to `swarmdo codegraph` or grep+read. Reads the same
7
7
  * .swarm/codegraph.json the CLI writes (shared fs layer in codegraph/store.ts).
8
8
  */
9
- import { queryIndex, symbolsInFile, indexStats } from '../codegraph/codegraph.js';
9
+ import { queryIndex, symbolsInFile, indexStats, fileImports, fileImporters } from '../codegraph/codegraph.js';
10
10
  import { INDEX_REL, scanRepo, saveIndex, loadIndex } from '../codegraph/store.js';
11
11
  const KINDS = ['function', 'class', 'interface', 'type', 'const', 'enum', 'default'];
12
12
  /** Resolve the repo root for scan/load. Params may override; default = cwd. */
@@ -113,10 +113,65 @@ const codegraphStatsTool = {
113
113
  return indexStats(index);
114
114
  },
115
115
  };
116
+ const codegraphImportsTool = {
117
+ name: 'codegraph_imports',
118
+ description: 'List what a file imports — each edge as the raw specifier plus the repo file it resolves to (external packages resolve to null). Answers "what does this module depend on" from the index. Requires a prior codegraph_index.',
119
+ category: 'codegraph',
120
+ tags: ['code', 'imports', 'dependencies', 'navigation'],
121
+ inputSchema: {
122
+ type: 'object',
123
+ properties: {
124
+ file: { type: 'string', description: 'Repo-relative file path (as indexed, e.g. src/index.ts)' },
125
+ internal: { type: 'boolean', description: 'only edges resolved to a repo file (hide external packages)', default: false },
126
+ root: { type: 'string', description: 'Repo root (default: current working directory)' },
127
+ },
128
+ required: ['file'],
129
+ },
130
+ handler: async (params) => {
131
+ const root = rootOf(params);
132
+ const file = params.file;
133
+ if (typeof file !== 'string' || !file)
134
+ return { error: true, message: 'file is required' };
135
+ const index = loadIndex(root);
136
+ if (!index)
137
+ return { error: true, message: 'no index — run codegraph_index first' };
138
+ let edges = fileImports(index, file);
139
+ if (params.internal === true)
140
+ edges = edges.filter((e) => e.resolved !== null);
141
+ return { file, count: edges.length, edges };
142
+ },
143
+ };
144
+ const codegraphImportersTool = {
145
+ name: 'codegraph_importers',
146
+ description: 'List which files import a given file — its reverse dependencies. Use before changing or moving a file to see what depends on it ("what breaks if I change this"). Requires a prior codegraph_index.',
147
+ category: 'codegraph',
148
+ tags: ['code', 'imports', 'dependencies', 'impact', 'navigation'],
149
+ inputSchema: {
150
+ type: 'object',
151
+ properties: {
152
+ file: { type: 'string', description: 'Repo-relative file path whose importers you want' },
153
+ root: { type: 'string', description: 'Repo root (default: current working directory)' },
154
+ },
155
+ required: ['file'],
156
+ },
157
+ handler: async (params) => {
158
+ const root = rootOf(params);
159
+ const file = params.file;
160
+ if (typeof file !== 'string' || !file)
161
+ return { error: true, message: 'file is required' };
162
+ const index = loadIndex(root);
163
+ if (!index)
164
+ return { error: true, message: 'no index — run codegraph_index first' };
165
+ const edges = fileImporters(index, file);
166
+ return { file, count: edges.length, importers: edges };
167
+ },
168
+ };
116
169
  export const codegraphTools = [
117
170
  codegraphIndexTool,
118
171
  codegraphQueryTool,
119
172
  codegraphFileTool,
173
+ codegraphImportsTool,
174
+ codegraphImportersTool,
120
175
  codegraphStatsTool,
121
176
  ];
122
177
  //# sourceMappingURL=codegraph-tools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codegraph-tools.js","sourceRoot":"","sources":["../../../src/mcp-tools/codegraph-tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codegraph-tools.js","sourceRoot":"","sources":["../../../src/mcp-tools/codegraph-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * pack.ts — bundle a repo (or a subset) into one AI-friendly context blob.
3
+ *
4
+ * swarmdo has no context-assembly primitive: `codegraph` indexes symbols for
5
+ * *querying* and `compact` de-noises a *stream*, but neither emits promptable
6
+ * source for *feeding a model*. `pack` walks the tree (respecting default skips
7
+ * + a minimal .gitignore + glob include/exclude), and writes a bundle in
8
+ * markdown / xml / json / plain with a directory tree and per-file + total
9
+ * token estimates. Deterministic — same inputs, byte-identical output.
10
+ *
11
+ * Pure engine: the fs walk is injected as a file list + reader by the caller
12
+ * (../commands/pack.ts), so this module has no fs dependency and is trivially
13
+ * testable. Optional secret redaction reuses ../redact/redact.ts.
14
+ */
15
+ export type PackFormat = 'md' | 'xml' | 'json' | 'plain';
16
+ export interface PackFile {
17
+ /** repo-relative path, POSIX separators */
18
+ path: string;
19
+ content: string;
20
+ }
21
+ export interface PackOptions {
22
+ format?: PackFormat;
23
+ /** include a directory tree at the top (default true) */
24
+ tree?: boolean;
25
+ /** optional per-file transform (e.g. secret redaction) applied before bundling */
26
+ transform?: (content: string, path: string) => string;
27
+ }
28
+ export interface PackFileStat {
29
+ path: string;
30
+ bytes: number;
31
+ tokens: number;
32
+ }
33
+ export interface PackResult {
34
+ output: string;
35
+ stats: {
36
+ files: number;
37
+ bytes: number;
38
+ tokens: number;
39
+ perFile: PackFileStat[];
40
+ };
41
+ }
42
+ /**
43
+ * Cheap, deterministic token estimate (~4 chars/token, the widely-used rule of
44
+ * thumb for English + code). Not a real BPE tokenizer — good enough for budget
45
+ * warnings, and dependency-free.
46
+ */
47
+ export declare function estimateTokens(text: string): number;
48
+ /** Build an ASCII directory tree from a sorted file list. */
49
+ export declare function buildTree(paths: string[]): string;
50
+ /** Bundle files into a single context blob per `format`. */
51
+ export declare function packFiles(input: PackFile[], opts?: PackOptions): PackResult;
52
+ /**
53
+ * Minimal .gitignore-style matcher. Handles the common cases — plain names,
54
+ * `dir/`, `*.ext` globs, leading `/` anchors, and `!` negation — not the full
55
+ * spec (no `**` depth semantics beyond substring, no nested ignore files).
56
+ * Good enough to keep obvious noise out; full semantics is a follow-up.
57
+ */
58
+ export declare function makeIgnoreMatcher(patterns: string[]): (relPath: string) => boolean;
59
+ //# sourceMappingURL=pack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../../../src/pack/pack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,QAAQ;IACvB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,yDAAyD;IACzD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,kFAAkF;IAClF,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACvD;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,YAAY,EAAE,CAAC;KACzB,CAAC;CACH;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CA8BjD;AAuDD,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,GAAE,WAAgB,GAAG,UAAU,CA4B/E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CA8BlF"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * pack.ts — bundle a repo (or a subset) into one AI-friendly context blob.
3
+ *
4
+ * swarmdo has no context-assembly primitive: `codegraph` indexes symbols for
5
+ * *querying* and `compact` de-noises a *stream*, but neither emits promptable
6
+ * source for *feeding a model*. `pack` walks the tree (respecting default skips
7
+ * + a minimal .gitignore + glob include/exclude), and writes a bundle in
8
+ * markdown / xml / json / plain with a directory tree and per-file + total
9
+ * token estimates. Deterministic — same inputs, byte-identical output.
10
+ *
11
+ * Pure engine: the fs walk is injected as a file list + reader by the caller
12
+ * (../commands/pack.ts), so this module has no fs dependency and is trivially
13
+ * testable. Optional secret redaction reuses ../redact/redact.ts.
14
+ */
15
+ /**
16
+ * Cheap, deterministic token estimate (~4 chars/token, the widely-used rule of
17
+ * thumb for English + code). Not a real BPE tokenizer — good enough for budget
18
+ * warnings, and dependency-free.
19
+ */
20
+ export function estimateTokens(text) {
21
+ if (!text)
22
+ return 0;
23
+ return Math.ceil(text.length / 4);
24
+ }
25
+ /** Build an ASCII directory tree from a sorted file list. */
26
+ export function buildTree(paths) {
27
+ const root = {};
28
+ for (const p of [...paths].sort()) {
29
+ const parts = p.split('/');
30
+ let node = root;
31
+ for (let i = 0; i < parts.length; i++) {
32
+ const part = parts[i];
33
+ const isFile = i === parts.length - 1;
34
+ if (isFile) {
35
+ if (!node['\0files'])
36
+ node['\0files'] = [];
37
+ node['\0files'].push(part);
38
+ }
39
+ else {
40
+ node[part] = node[part] ?? {};
41
+ node = node[part];
42
+ }
43
+ }
44
+ }
45
+ const lines = [];
46
+ const walk = (node, prefix) => {
47
+ const dirs = Object.keys(node).filter((k) => k !== '\0files').sort();
48
+ const files = (node['\0files'] ?? []).sort();
49
+ const entries = [...dirs.map((d) => ['dir', d]), ...files.map((f) => ['file', f])];
50
+ entries.forEach(([kind, name], i) => {
51
+ const last = i === entries.length - 1;
52
+ lines.push(`${prefix}${last ? '└── ' : '├── '}${name}${kind === 'dir' ? '/' : ''}`);
53
+ if (kind === 'dir')
54
+ walk(node[name], prefix + (last ? ' ' : '│ '));
55
+ });
56
+ };
57
+ walk(root, '');
58
+ return lines.join('\n');
59
+ }
60
+ /** Pick a fenced-code language hint from a file extension. */
61
+ function langOf(path) {
62
+ const ext = path.slice(path.lastIndexOf('.') + 1).toLowerCase();
63
+ const map = {
64
+ ts: 'typescript', tsx: 'tsx', js: 'javascript', jsx: 'jsx', mjs: 'javascript', cjs: 'javascript',
65
+ json: 'json', md: 'markdown', py: 'python', rs: 'rust', go: 'go', sh: 'bash', yml: 'yaml', yaml: 'yaml',
66
+ html: 'html', css: 'css', sql: 'sql', toml: 'toml',
67
+ };
68
+ return map[ext] ?? '';
69
+ }
70
+ function renderMarkdown(files, opts) {
71
+ const parts = ['# Repository context', ''];
72
+ if (opts.tree !== false) {
73
+ parts.push('## Files', '', '```', buildTree(files.map((f) => f.path)), '```', '');
74
+ }
75
+ parts.push('## Contents', '');
76
+ for (const f of files) {
77
+ const lang = langOf(f.path);
78
+ parts.push(`### ${f.path}`, '', '```' + lang, f.content.replace(/\n$/, ''), '```', '');
79
+ }
80
+ return parts.join('\n');
81
+ }
82
+ function escapeXml(s) {
83
+ return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
84
+ }
85
+ function renderXml(files, opts) {
86
+ const parts = ['<repository>'];
87
+ if (opts.tree !== false) {
88
+ parts.push(' <tree>', escapeXml(buildTree(files.map((f) => f.path))), ' </tree>');
89
+ }
90
+ parts.push(' <files>');
91
+ for (const f of files) {
92
+ parts.push(` <file path="${escapeXml(f.path)}">`, escapeXml(f.content.replace(/\n$/, '')), ' </file>');
93
+ }
94
+ parts.push(' </files>', '</repository>');
95
+ return parts.join('\n');
96
+ }
97
+ function renderJson(files) {
98
+ return JSON.stringify({ files: files.map((f) => ({ path: f.path, content: f.content })) }, null, 2);
99
+ }
100
+ function renderPlain(files) {
101
+ const parts = [];
102
+ for (const f of files) {
103
+ parts.push('='.repeat(8) + ' ' + f.path + ' ' + '='.repeat(8), f.content.replace(/\n$/, ''), '');
104
+ }
105
+ return parts.join('\n');
106
+ }
107
+ /** Bundle files into a single context blob per `format`. */
108
+ export function packFiles(input, opts = {}) {
109
+ const files = input
110
+ .map((f) => ({ path: f.path, content: opts.transform ? opts.transform(f.content, f.path) : f.content }))
111
+ .sort((a, b) => a.path.localeCompare(b.path));
112
+ const format = opts.format ?? 'md';
113
+ let output;
114
+ switch (format) {
115
+ case 'xml':
116
+ output = renderXml(files, opts);
117
+ break;
118
+ case 'json':
119
+ output = renderJson(files);
120
+ break;
121
+ case 'plain':
122
+ output = renderPlain(files);
123
+ break;
124
+ default: output = renderMarkdown(files, opts);
125
+ }
126
+ const perFile = files.map((f) => ({
127
+ path: f.path,
128
+ bytes: Buffer.byteLength(f.content, 'utf8'),
129
+ tokens: estimateTokens(f.content),
130
+ }));
131
+ return {
132
+ output,
133
+ stats: {
134
+ files: files.length,
135
+ bytes: perFile.reduce((n, f) => n + f.bytes, 0),
136
+ tokens: estimateTokens(output),
137
+ perFile,
138
+ },
139
+ };
140
+ }
141
+ /**
142
+ * Minimal .gitignore-style matcher. Handles the common cases — plain names,
143
+ * `dir/`, `*.ext` globs, leading `/` anchors, and `!` negation — not the full
144
+ * spec (no `**` depth semantics beyond substring, no nested ignore files).
145
+ * Good enough to keep obvious noise out; full semantics is a follow-up.
146
+ */
147
+ export function makeIgnoreMatcher(patterns) {
148
+ const rules = patterns
149
+ .map((p) => p.trim())
150
+ .filter((p) => p && !p.startsWith('#'))
151
+ .map((p) => {
152
+ const negate = p.startsWith('!');
153
+ let body = negate ? p.slice(1) : p;
154
+ const dirOnly = body.endsWith('/');
155
+ if (dirOnly)
156
+ body = body.slice(0, -1);
157
+ const anchored = body.startsWith('/');
158
+ if (anchored)
159
+ body = body.slice(1);
160
+ const re = new RegExp('^' +
161
+ body
162
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&')
163
+ .replace(/\*/g, '[^/]*')
164
+ .replace(/\?/g, '[^/]') +
165
+ (dirOnly ? '(/|$)' : '($|/)'));
166
+ return { negate, anchored, re };
167
+ });
168
+ return (relPath) => {
169
+ let ignored = false;
170
+ for (const r of rules) {
171
+ const candidates = r.anchored ? [relPath] : [relPath, ...relPath.split('/').map((_, i, a) => a.slice(i).join('/'))];
172
+ if (candidates.some((c) => r.re.test(c)))
173
+ ignored = !r.negate;
174
+ }
175
+ return ignored;
176
+ };
177
+ }
178
+ //# sourceMappingURL=pack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack.js","sourceRoot":"","sources":["../../../src/pack/pack.ts"],"names":[],"mappings":"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"}