@cesarandreslopez/occ 0.11.0 → 0.13.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.
Files changed (61) hide show
  1. package/README.md +27 -6
  2. package/dist/src/code/command.js +162 -3
  3. package/dist/src/code/command.js.map +1 -1
  4. package/dist/src/code/diff.d.ts +2 -2
  5. package/dist/src/code/hash.d.ts +19 -0
  6. package/dist/src/code/hash.js +85 -0
  7. package/dist/src/code/hash.js.map +1 -0
  8. package/dist/src/code/output.d.ts +6 -1
  9. package/dist/src/code/output.js +78 -0
  10. package/dist/src/code/output.js.map +1 -1
  11. package/dist/src/code/query.d.ts +6 -0
  12. package/dist/src/code/query.js +0 -0
  13. package/dist/src/code/query.js.map +1 -1
  14. package/dist/src/code/seams.d.ts +39 -0
  15. package/dist/src/code/seams.js +154 -0
  16. package/dist/src/code/seams.js.map +1 -0
  17. package/dist/src/code/session.d.ts +7 -1
  18. package/dist/src/code/session.js +15 -0
  19. package/dist/src/code/session.js.map +1 -1
  20. package/dist/src/code/source.d.ts +10 -11
  21. package/dist/src/code/source.js +8 -2
  22. package/dist/src/code/source.js.map +1 -1
  23. package/dist/src/code/tree.d.ts +7 -0
  24. package/dist/src/code/tree.js +364 -0
  25. package/dist/src/code/tree.js.map +1 -0
  26. package/dist/src/code/types.d.ts +439 -0
  27. package/dist/src/code/types.js +146 -0
  28. package/dist/src/code/types.js.map +1 -1
  29. package/dist/src/git/api.d.ts +13 -1
  30. package/dist/src/git/api.js +22 -1
  31. package/dist/src/git/api.js.map +1 -1
  32. package/dist/src/git/client.d.ts +6 -0
  33. package/dist/src/git/client.js +12 -0
  34. package/dist/src/git/client.js.map +1 -1
  35. package/dist/src/git/command.js +22 -2
  36. package/dist/src/git/command.js.map +1 -1
  37. package/dist/src/git/output.d.ts +2 -1
  38. package/dist/src/git/output.js +5 -0
  39. package/dist/src/git/output.js.map +1 -1
  40. package/dist/src/git/parse.d.ts +2 -1
  41. package/dist/src/git/parse.js +97 -6
  42. package/dist/src/git/parse.js.map +1 -1
  43. package/dist/src/git/types.d.ts +44 -0
  44. package/dist/src/git/types.js +21 -0
  45. package/dist/src/git/types.js.map +1 -1
  46. package/dist/src/health.js +5 -0
  47. package/dist/src/health.js.map +1 -1
  48. package/dist/src/index.d.ts +16 -6
  49. package/dist/src/index.js +11 -3
  50. package/dist/src/index.js.map +1 -1
  51. package/dist/src/output/tabular.js +33 -16
  52. package/dist/src/output/tabular.js.map +1 -1
  53. package/dist/src/scc.d.ts +3 -0
  54. package/dist/src/scc.js +2 -0
  55. package/dist/src/scc.js.map +1 -1
  56. package/dist/src/workspace/types.d.ts +4 -0
  57. package/package.json +2 -1
  58. package/skills/occ/SKILL.md +31 -25
  59. package/skills/occ/reference/code.md +74 -1
  60. package/skills/occ/reference/commands.md +4 -0
  61. package/skills/occ/reference/git.md +17 -1
@@ -0,0 +1,364 @@
1
+ import { estimateTokenCount } from '../tokens.js';
2
+ import { rankNodesCached } from './rank.js';
3
+ import { toNormalizedSymbolKind } from './types.js';
4
+ const DEFAULT_TREE_MODE = 'compact';
5
+ const DEFAULT_MAX_DEPTH = 6;
6
+ const DEFAULT_MAX_ENTRIES_PER_DIR = 50;
7
+ const DEFAULT_TOKEN_BUDGET = 4096;
8
+ const DEFAULT_SYMBOLS_PER_DIRECTORY = 3;
9
+ function normalizeTreePath(value) {
10
+ return value.replace(/\\/g, '/').replace(/^\.\//, '').replace(/\/+/g, '/').replace(/\/$/, '');
11
+ }
12
+ function normalizeFocusPath(value) {
13
+ if (!value)
14
+ return undefined;
15
+ const normalized = normalizeTreePath(value.trim());
16
+ if (!normalized || normalized === '.')
17
+ return undefined;
18
+ return normalized;
19
+ }
20
+ function createDirectory(name, path) {
21
+ return {
22
+ name,
23
+ path,
24
+ directories: new Map(),
25
+ files: [],
26
+ fileCount: 0,
27
+ };
28
+ }
29
+ function isInFocus(relativePath, focusPath) {
30
+ if (!focusPath)
31
+ return true;
32
+ return relativePath === focusPath || relativePath.startsWith(`${focusPath}/`);
33
+ }
34
+ function pathWithinFocus(relativePath, focusPath) {
35
+ if (!focusPath)
36
+ return relativePath;
37
+ if (relativePath === focusPath)
38
+ return relativePath.split('/').at(-1) ?? relativePath;
39
+ return relativePath.slice(focusPath.length + 1);
40
+ }
41
+ function joinTreePath(base, segment) {
42
+ if (!base || base === '.')
43
+ return segment;
44
+ return `${base}/${segment}`;
45
+ }
46
+ function insertFile(root, file, focusPath) {
47
+ const relativePath = normalizeTreePath(file.relativePath);
48
+ const localPath = pathWithinFocus(relativePath, focusPath);
49
+ const parts = localPath.split('/').filter(Boolean);
50
+ if (parts.length === 0)
51
+ return;
52
+ root.fileCount++;
53
+ let current = root;
54
+ let currentPath = focusPath ?? '';
55
+ for (const directoryName of parts.slice(0, -1)) {
56
+ currentPath = joinTreePath(currentPath, directoryName);
57
+ let child = current.directories.get(directoryName);
58
+ if (!child) {
59
+ child = createDirectory(directoryName, currentPath);
60
+ current.directories.set(directoryName, child);
61
+ }
62
+ child.fileCount++;
63
+ current = child;
64
+ }
65
+ current.files.push(file);
66
+ }
67
+ function symbolIdentity(parts) {
68
+ return [parts.type, parts.name, parts.line ?? '', parts.containerName ?? ''].join('|');
69
+ }
70
+ function symbolsForFile(file, rankedNodes) {
71
+ const byKey = new Map();
72
+ for (const symbol of file.symbols) {
73
+ byKey.set(symbolIdentity({ type: symbol.type, name: symbol.name, line: symbol.line, containerName: symbol.containerName }), symbol);
74
+ }
75
+ const symbols = [];
76
+ const seen = new Set();
77
+ for (const ranked of rankedNodes) {
78
+ const key = symbolIdentity({
79
+ type: ranked.type,
80
+ name: ranked.name,
81
+ line: ranked.line,
82
+ containerName: ranked.containerName,
83
+ });
84
+ if (seen.has(key))
85
+ continue;
86
+ const parsed = byKey.get(key);
87
+ if (!parsed)
88
+ continue;
89
+ seen.add(key);
90
+ symbols.push({
91
+ nodeId: parsed.nodeId,
92
+ name: parsed.name,
93
+ kind: toNormalizedSymbolKind(parsed.type, parsed.containerName),
94
+ signature: parsed.fullSignature ?? parsed.signature ?? parsed.name,
95
+ line: parsed.line,
96
+ relativePath: file.relativePath,
97
+ });
98
+ }
99
+ return symbols;
100
+ }
101
+ function computeBestFiles(directory, fileScoresByPath) {
102
+ let bestScore;
103
+ let bestFile;
104
+ for (const file of directory.files) {
105
+ const score = fileScoresByPath.get(file.path);
106
+ if (!score)
107
+ continue;
108
+ if (!bestScore ||
109
+ score.score > bestScore.score ||
110
+ (score.score === bestScore.score && file.relativePath.localeCompare(bestScore.relativePath) < 0)) {
111
+ bestScore = score;
112
+ bestFile = file;
113
+ }
114
+ }
115
+ for (const child of directory.directories.values()) {
116
+ const childScore = computeBestFiles(child, fileScoresByPath);
117
+ if (!childScore || !child.bestFile)
118
+ continue;
119
+ if (!bestScore ||
120
+ childScore.score > bestScore.score ||
121
+ (childScore.score === bestScore.score && child.bestFile.relativePath.localeCompare(bestScore.relativePath) < 0)) {
122
+ bestScore = childScore;
123
+ bestFile = child.bestFile;
124
+ }
125
+ }
126
+ directory.bestFile = bestFile;
127
+ directory.bestFileScore = bestScore;
128
+ return bestScore;
129
+ }
130
+ function sortedDirectories(directory) {
131
+ return [...directory.directories.values()].sort((a, b) => a.name.localeCompare(b.name));
132
+ }
133
+ function sortedFiles(directory) {
134
+ return [...directory.files].sort((a, b) => a.relativePath.localeCompare(b.relativePath));
135
+ }
136
+ function collapseDirectory(directory, mode) {
137
+ if (mode === 'verbose')
138
+ return directory;
139
+ let current = directory;
140
+ while (current.files.length === 0 && current.directories.size === 1) {
141
+ const child = [...current.directories.values()][0];
142
+ if (!child)
143
+ break;
144
+ current = child;
145
+ }
146
+ return current;
147
+ }
148
+ function displayNameForDirectory(directory, focusPath) {
149
+ if (!focusPath)
150
+ return directory.path;
151
+ if (directory.path === focusPath)
152
+ return directory.name;
153
+ return directory.path.startsWith(`${focusPath}/`) ? directory.path.slice(focusPath.length + 1) : directory.path;
154
+ }
155
+ function directoryEntry(directory, depth, mode, focusPath, rankedSymbolsByPath) {
156
+ const entry = {
157
+ kind: 'directory',
158
+ path: directory.path,
159
+ name: displayNameForDirectory(directory, focusPath),
160
+ depth,
161
+ fileCount: directory.fileCount,
162
+ };
163
+ if (mode === 'map' && directory.bestFile && directory.bestFileScore) {
164
+ entry.score = directory.bestFileScore.score;
165
+ entry.normalizedScore = directory.bestFileScore.normalizedScore;
166
+ const symbols = symbolsForFile(directory.bestFile, rankedSymbolsByPath.get(directory.bestFile.path) ?? []).slice(0, DEFAULT_SYMBOLS_PER_DIRECTORY);
167
+ if (symbols.length > 0)
168
+ entry.symbols = symbols;
169
+ }
170
+ return entry;
171
+ }
172
+ function fileEntry(file, depth, fileScoresByPath) {
173
+ const score = fileScoresByPath.get(file.path);
174
+ const entry = {
175
+ kind: 'file',
176
+ path: file.relativePath,
177
+ name: file.relativePath.split('/').at(-1) ?? file.relativePath,
178
+ depth,
179
+ language: file.language,
180
+ };
181
+ if (score) {
182
+ entry.score = score.score;
183
+ entry.normalizedScore = score.normalizedScore;
184
+ }
185
+ return entry;
186
+ }
187
+ function renderEntryLines(entry) {
188
+ const indent = ' '.repeat(entry.depth);
189
+ if (entry.kind === 'file') {
190
+ const language = entry.language ? ` [${entry.language}]` : '';
191
+ return [`${indent}- ${entry.name}${language}`];
192
+ }
193
+ const count = entry.fileCount === 1 ? '1 file' : `${entry.fileCount ?? 0} files`;
194
+ const lines = [`${indent}+ ${entry.name}/ (${count})`];
195
+ for (const symbol of entry.symbols ?? []) {
196
+ const location = symbol.line ? `${symbol.relativePath}:${symbol.line}` : symbol.relativePath;
197
+ lines.push(`${indent} - ${location} ${symbol.signature}`);
198
+ }
199
+ return lines;
200
+ }
201
+ function addTruncatedPath(paths, treePath) {
202
+ if (treePath.length > 0)
203
+ paths.add(treePath);
204
+ }
205
+ function collectDisplayEntries(directory, options, depth = 0) {
206
+ const displays = [];
207
+ const directoryItems = sortedDirectories(directory).map(child => ({
208
+ kind: 'directory',
209
+ directory: collapseDirectory(child, options.mode),
210
+ sortPath: child.path,
211
+ }));
212
+ const fileItems = sortedFiles(directory).map(file => ({
213
+ kind: 'file',
214
+ file,
215
+ sortPath: file.relativePath,
216
+ }));
217
+ const children = [...directoryItems, ...fileItems].sort((a, b) => {
218
+ if (a.kind !== b.kind)
219
+ return a.kind === 'directory' ? -1 : 1;
220
+ return a.sortPath.localeCompare(b.sortPath);
221
+ });
222
+ const admitted = children.slice(0, options.maxEntriesPerDir);
223
+ for (const omitted of children.slice(options.maxEntriesPerDir)) {
224
+ addTruncatedPath(options.truncatedPaths, omitted.sortPath);
225
+ }
226
+ for (const child of admitted) {
227
+ if (depth > options.maxDepth) {
228
+ addTruncatedPath(options.truncatedPaths, child.sortPath);
229
+ continue;
230
+ }
231
+ if (child.kind === 'file') {
232
+ const entry = fileEntry(child.file, depth, options.fileScoresByPath);
233
+ displays.push({ entry, lines: renderEntryLines(entry) });
234
+ continue;
235
+ }
236
+ const target = child.directory;
237
+ const entry = directoryEntry(target, depth, options.mode, options.focusPath, options.rankedSymbolsByPath);
238
+ displays.push({ entry, lines: renderEntryLines(entry) });
239
+ if (depth === options.maxDepth) {
240
+ if (target.fileCount > 0)
241
+ addTruncatedPath(options.truncatedPaths, target.path);
242
+ continue;
243
+ }
244
+ displays.push(...collectDisplayEntries(target, options, depth + 1));
245
+ }
246
+ return displays;
247
+ }
248
+ export function directoryTreeHeader(result) {
249
+ return `Directory Tree: ${result.root} (${result.mode}, ${result.totalFiles} files)`;
250
+ }
251
+ export function directoryTreeFooter(result) {
252
+ if (!result.truncated)
253
+ return null;
254
+ return `truncated: ${result.truncatedPaths.length} path(s)`;
255
+ }
256
+ function fixedBudgetReserve(root, mode, totalFiles, countTokens) {
257
+ const headerTokens = countTokens(directoryTreeHeader({ root, mode, totalFiles }));
258
+ const footerTokens = countTokens('truncated: 000 path(s)');
259
+ const newlineTokens = countTokens('\n\n');
260
+ return headerTokens + footerTokens + newlineTokens;
261
+ }
262
+ function enforceBudgets(candidates, truncatedPaths, options) {
263
+ const entries = [];
264
+ const lines = [];
265
+ const tokenBudget = options.tokenBudget;
266
+ const byteBudget = options.byteBudget;
267
+ const tokenReserve = tokenBudget == null ? 0 : fixedBudgetReserve(options.root, options.mode, options.totalFiles, options.countTokens);
268
+ const byteReserve = byteBudget == null
269
+ ? 0
270
+ : Buffer.byteLength(`${directoryTreeHeader({ root: options.root, mode: options.mode, totalFiles: options.totalFiles })}\ntruncated: 000 path(s)\n`, 'utf8');
271
+ let tokensUsed = tokenReserve;
272
+ let bytesUsed = byteReserve;
273
+ for (const candidate of candidates) {
274
+ const text = candidate.lines.join('\n');
275
+ const tokenCost = options.countTokens(`${text}\n`);
276
+ const byteCost = Buffer.byteLength(`${text}\n`, 'utf8');
277
+ const exceedsTokens = tokenBudget != null && tokensUsed + tokenCost > tokenBudget;
278
+ const exceedsBytes = byteBudget != null && bytesUsed + byteCost > byteBudget;
279
+ if (exceedsTokens || exceedsBytes) {
280
+ addTruncatedPath(truncatedPaths, candidate.entry.path);
281
+ continue;
282
+ }
283
+ entries.push(candidate.entry);
284
+ lines.push(...candidate.lines);
285
+ tokensUsed += tokenCost;
286
+ bytesUsed += byteCost;
287
+ }
288
+ if (tokenBudget == null)
289
+ tokensUsed = options.countTokens(lines.join('\n'));
290
+ if (byteBudget == null)
291
+ bytesUsed = Buffer.byteLength(lines.join('\n'), 'utf8');
292
+ return { entries, lines, tokensUsed, bytesUsed };
293
+ }
294
+ export function buildDirectoryTree(index, options = {}) {
295
+ const mode = options.mode ?? DEFAULT_TREE_MODE;
296
+ const maxDepth = options.maxDepth ?? DEFAULT_MAX_DEPTH;
297
+ const maxEntriesPerDir = options.maxEntriesPerDir ?? DEFAULT_MAX_ENTRIES_PER_DIR;
298
+ const tokenBudget = options.tokenBudget ?? DEFAULT_TOKEN_BUDGET;
299
+ const byteBudget = options.byteBudget;
300
+ const countTokens = options.countTokens ?? estimateTokenCount;
301
+ const focusPath = normalizeFocusPath(options.focusPath);
302
+ const root = createDirectory(focusPath ?? '.', focusPath ?? '.');
303
+ for (const file of [...index.files].sort((a, b) => a.relativePath.localeCompare(b.relativePath))) {
304
+ const relativePath = normalizeTreePath(file.relativePath);
305
+ if (!isInFocus(relativePath, focusPath))
306
+ continue;
307
+ insertFile(root, file, focusPath);
308
+ }
309
+ const ranking = rankNodesCached(index);
310
+ const fileScoresByPath = new Map(ranking.fileScores.map(score => [score.path, score]));
311
+ const rankedSymbolsByPath = new Map();
312
+ for (const node of ranking.nodes) {
313
+ if (node.type === 'file' || node.type === 'module')
314
+ continue;
315
+ const list = rankedSymbolsByPath.get(node.path);
316
+ if (list)
317
+ list.push(node);
318
+ else
319
+ rankedSymbolsByPath.set(node.path, [node]);
320
+ }
321
+ computeBestFiles(root, fileScoresByPath);
322
+ const truncated = new Set();
323
+ const candidates = collectDisplayEntries(root, {
324
+ mode,
325
+ focusPath,
326
+ maxDepth,
327
+ maxEntriesPerDir,
328
+ fileScoresByPath,
329
+ rankedSymbolsByPath,
330
+ truncatedPaths: truncated,
331
+ });
332
+ const budgeted = enforceBudgets(candidates, truncated, {
333
+ root: root.path,
334
+ mode,
335
+ totalFiles: root.fileCount,
336
+ tokenBudget,
337
+ byteBudget,
338
+ countTokens,
339
+ });
340
+ return {
341
+ root: root.path,
342
+ focusPath,
343
+ mode,
344
+ maxDepth,
345
+ maxEntriesPerDir,
346
+ tokenBudget,
347
+ tokensUsed: budgeted.tokensUsed,
348
+ byteBudget,
349
+ bytesUsed: budgeted.bytesUsed,
350
+ totalFiles: root.fileCount,
351
+ totalDirectories: countDirectories(root),
352
+ entries: budgeted.entries,
353
+ lines: budgeted.lines,
354
+ truncated: truncated.size > 0,
355
+ truncatedPaths: [...truncated].sort((a, b) => a.localeCompare(b)),
356
+ };
357
+ }
358
+ function countDirectories(directory) {
359
+ let count = directory.path === '.' ? 0 : 1;
360
+ for (const child of directory.directories.values())
361
+ count += countDirectories(child);
362
+ return count;
363
+ }
364
+ //# sourceMappingURL=tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../../src/code/tree.ts"],"names":[],"mappings":"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"}