@cesarandreslopez/occ 0.8.11 → 0.9.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 (182) hide show
  1. package/README.md +167 -77
  2. package/dist/src/cli-validation.js +3 -11
  3. package/dist/src/cli-validation.js.map +1 -1
  4. package/dist/src/cli.js +23 -11
  5. package/dist/src/cli.js.map +1 -1
  6. package/dist/src/code/build.js +28 -22
  7. package/dist/src/code/build.js.map +1 -1
  8. package/dist/src/code/cache.js +3 -1
  9. package/dist/src/code/cache.js.map +1 -1
  10. package/dist/src/code/chunk.js +4 -4
  11. package/dist/src/code/chunk.js.map +1 -1
  12. package/dist/src/code/command.js +147 -37
  13. package/dist/src/code/command.js.map +1 -1
  14. package/dist/src/code/diff.d.ts +264 -0
  15. package/dist/src/code/diff.js +504 -0
  16. package/dist/src/code/diff.js.map +1 -0
  17. package/dist/src/code/discover.js +5 -5
  18. package/dist/src/code/discover.js.map +1 -1
  19. package/dist/src/code/focus.js +5 -5
  20. package/dist/src/code/focus.js.map +1 -1
  21. package/dist/src/code/incremental.js +11 -9
  22. package/dist/src/code/incremental.js.map +1 -1
  23. package/dist/src/code/index-io.js.map +1 -1
  24. package/dist/src/code/isolated-runner.js.map +1 -1
  25. package/dist/src/code/isolated.js +2 -2
  26. package/dist/src/code/isolated.js.map +1 -1
  27. package/dist/src/code/languages.js +2 -2
  28. package/dist/src/code/languages.js.map +1 -1
  29. package/dist/src/code/map.d.ts +12 -0
  30. package/dist/src/code/map.js +22 -9
  31. package/dist/src/code/map.js.map +1 -1
  32. package/dist/src/code/output.d.ts +3 -0
  33. package/dist/src/code/output.js +39 -22
  34. package/dist/src/code/output.js.map +1 -1
  35. package/dist/src/code/parsers.js +87 -26
  36. package/dist/src/code/parsers.js.map +1 -1
  37. package/dist/src/code/query.js +44 -38
  38. package/dist/src/code/query.js.map +1 -1
  39. package/dist/src/code/rank.js +30 -17
  40. package/dist/src/code/rank.js.map +1 -1
  41. package/dist/src/code/session.js.map +1 -1
  42. package/dist/src/code/slim.js.map +1 -1
  43. package/dist/src/code/store.js +35 -23
  44. package/dist/src/code/store.js.map +1 -1
  45. package/dist/src/code/types.js +15 -3
  46. package/dist/src/code/types.js.map +1 -1
  47. package/dist/src/doc/batch.js +6 -2
  48. package/dist/src/doc/batch.js.map +1 -1
  49. package/dist/src/doc/chunk.js +9 -5
  50. package/dist/src/doc/chunk.js.map +1 -1
  51. package/dist/src/doc/command.js +18 -9
  52. package/dist/src/doc/command.js.map +1 -1
  53. package/dist/src/doc/discover.d.ts +1 -1
  54. package/dist/src/doc/discover.js.map +1 -1
  55. package/dist/src/doc/entities.js +90 -10
  56. package/dist/src/doc/entities.js.map +1 -1
  57. package/dist/src/doc/inspect-docx.js +5 -4
  58. package/dist/src/doc/inspect-docx.js.map +1 -1
  59. package/dist/src/doc/inspect-odt.js.map +1 -1
  60. package/dist/src/doc/inspect-pdf.js +1 -1
  61. package/dist/src/doc/inspect-pdf.js.map +1 -1
  62. package/dist/src/doc/inspect.js +4 -4
  63. package/dist/src/doc/inspect.js.map +1 -1
  64. package/dist/src/doc/output.js +11 -8
  65. package/dist/src/doc/output.js.map +1 -1
  66. package/dist/src/doc/references.js +4 -4
  67. package/dist/src/doc/references.js.map +1 -1
  68. package/dist/src/errors.js +2 -4
  69. package/dist/src/errors.js.map +1 -1
  70. package/dist/src/git/api.d.ts +34 -0
  71. package/dist/src/git/api.js +247 -0
  72. package/dist/src/git/api.js.map +1 -0
  73. package/dist/src/git/client.d.ts +48 -0
  74. package/dist/src/git/client.js +336 -0
  75. package/dist/src/git/client.js.map +1 -0
  76. package/dist/src/git/command.d.ts +2 -0
  77. package/dist/src/git/command.js +173 -0
  78. package/dist/src/git/command.js.map +1 -0
  79. package/dist/src/git/index.d.ts +5 -0
  80. package/dist/src/git/index.js +6 -0
  81. package/dist/src/git/index.js.map +1 -0
  82. package/dist/src/git/output.d.ts +8 -0
  83. package/dist/src/git/output.js +38 -0
  84. package/dist/src/git/output.js.map +1 -0
  85. package/dist/src/git/parse.d.ts +19 -0
  86. package/dist/src/git/parse.js +354 -0
  87. package/dist/src/git/parse.js.map +1 -0
  88. package/dist/src/git/types.d.ts +334 -0
  89. package/dist/src/git/types.js +135 -0
  90. package/dist/src/git/types.js.map +1 -0
  91. package/dist/src/index.d.ts +29 -7
  92. package/dist/src/index.js +20 -3
  93. package/dist/src/index.js.map +1 -1
  94. package/dist/src/inspect/shared.js.map +1 -1
  95. package/dist/src/markdown/convert.js +17 -11
  96. package/dist/src/markdown/convert.js.map +1 -1
  97. package/dist/src/output/tabular.js +25 -17
  98. package/dist/src/output/tabular.js.map +1 -1
  99. package/dist/src/output/tree.js +7 -7
  100. package/dist/src/output/tree.js.map +1 -1
  101. package/dist/src/parsers/docx.js +1 -1
  102. package/dist/src/parsers/docx.js.map +1 -1
  103. package/dist/src/parsers/index.js +9 -7
  104. package/dist/src/parsers/index.js.map +1 -1
  105. package/dist/src/parsers/pdf.js +1 -1
  106. package/dist/src/parsers/pdf.js.map +1 -1
  107. package/dist/src/parsers/pptx.js.map +1 -1
  108. package/dist/src/parsers/xlsx.js +5 -3
  109. package/dist/src/parsers/xlsx.js.map +1 -1
  110. package/dist/src/progress-event.d.ts +1 -1
  111. package/dist/src/progress-event.js +1 -0
  112. package/dist/src/progress-event.js.map +1 -1
  113. package/dist/src/scc.js +9 -5
  114. package/dist/src/scc.js.map +1 -1
  115. package/dist/src/sheet/command.js +11 -7
  116. package/dist/src/sheet/command.js.map +1 -1
  117. package/dist/src/sheet/inspect.js +14 -14
  118. package/dist/src/sheet/inspect.js.map +1 -1
  119. package/dist/src/sheet/output.js +10 -15
  120. package/dist/src/sheet/output.js.map +1 -1
  121. package/dist/src/skills/command.d.ts +2 -0
  122. package/dist/src/skills/command.js +188 -0
  123. package/dist/src/skills/command.js.map +1 -0
  124. package/dist/src/slide/command.js +8 -6
  125. package/dist/src/slide/command.js.map +1 -1
  126. package/dist/src/slide/inspect-odp.js.map +1 -1
  127. package/dist/src/slide/inspect-pptx.js +5 -2
  128. package/dist/src/slide/inspect-pptx.js.map +1 -1
  129. package/dist/src/slide/inspect.js +4 -2
  130. package/dist/src/slide/inspect.js.map +1 -1
  131. package/dist/src/slide/output.js +10 -15
  132. package/dist/src/slide/output.js.map +1 -1
  133. package/dist/src/slide/types.js.map +1 -1
  134. package/dist/src/stats.js +31 -3
  135. package/dist/src/stats.js.map +1 -1
  136. package/dist/src/table/command.js +8 -6
  137. package/dist/src/table/command.js.map +1 -1
  138. package/dist/src/table/inspect-docx.js +1 -1
  139. package/dist/src/table/inspect-docx.js.map +1 -1
  140. package/dist/src/table/inspect-odt.js.map +1 -1
  141. package/dist/src/table/inspect-pptx.js +5 -2
  142. package/dist/src/table/inspect-pptx.js.map +1 -1
  143. package/dist/src/table/inspect-xlsx.js +1 -1
  144. package/dist/src/table/inspect-xlsx.js.map +1 -1
  145. package/dist/src/table/inspect.js +3 -1
  146. package/dist/src/table/inspect.js.map +1 -1
  147. package/dist/src/table/output.js +7 -11
  148. package/dist/src/table/output.js.map +1 -1
  149. package/dist/src/table/types.js.map +1 -1
  150. package/dist/src/tokens.js +1 -1
  151. package/dist/src/tokens.js.map +1 -1
  152. package/dist/src/utils.js +6 -11
  153. package/dist/src/utils.js.map +1 -1
  154. package/dist/src/walker.js +2 -4
  155. package/dist/src/walker.js.map +1 -1
  156. package/dist/src/workspace/analyze.js +4 -4
  157. package/dist/src/workspace/analyze.js.map +1 -1
  158. package/dist/src/workspace/bundle.d.ts +27 -0
  159. package/dist/src/workspace/bundle.js +157 -54
  160. package/dist/src/workspace/bundle.js.map +1 -1
  161. package/dist/src/workspace/command.js +31 -16
  162. package/dist/src/workspace/command.js.map +1 -1
  163. package/dist/src/workspace/describe-output.js +10 -9
  164. package/dist/src/workspace/describe-output.js.map +1 -1
  165. package/dist/src/workspace/describe.js +54 -47
  166. package/dist/src/workspace/describe.js.map +1 -1
  167. package/dist/src/workspace/documents.js +28 -8
  168. package/dist/src/workspace/documents.js.map +1 -1
  169. package/dist/src/workspace/prepare-runner.js.map +1 -1
  170. package/dist/src/workspace/prepare-types.js.map +1 -1
  171. package/dist/src/workspace/prepare.js +38 -19
  172. package/dist/src/workspace/prepare.js.map +1 -1
  173. package/dist/src/workspace/types.js +4 -2
  174. package/dist/src/workspace/types.js.map +1 -1
  175. package/package.json +57 -4
  176. package/scripts/postinstall.js +13 -9
  177. package/skills/occ/SKILL.md +77 -0
  178. package/skills/occ/reference/code.md +69 -0
  179. package/skills/occ/reference/commands.md +66 -0
  180. package/skills/occ/reference/documents.md +65 -0
  181. package/skills/occ/reference/git.md +55 -0
  182. package/skills/occ/reference/workspace.md +65 -0
@@ -0,0 +1,247 @@
1
+ import path from 'node:path';
2
+ import { createTokenizer, estimateTokenCount, resolveTokenizerName } from '../tokens.js';
3
+ import { buildDiffRangeArgs, GitError, gitVersion, resolveDiffRange, runGit, runGitRaw } from './client.js';
4
+ import { aggregateChurn, parseDiffPatchHunks, parseLogNumstatZ, parseLogRecords, parseNameStatusZ, parseNumstatZ, } from './parse.js';
5
+ const DEFAULT_NOISE_EXCLUDES = [
6
+ ':(exclude)package-lock.json',
7
+ ':(exclude)pnpm-lock.yaml',
8
+ ':(exclude)yarn.lock',
9
+ ':(exclude)*.min.js',
10
+ ':(exclude)*.map',
11
+ ':(exclude)dist/**',
12
+ ':(exclude)build/**',
13
+ ':(exclude)vendor/**',
14
+ ':(exclude)**/__generated__/**',
15
+ ':(exclude)*.snap',
16
+ ];
17
+ const LOG_FORMAT = 'tformat:%H%x1f%h%x1f%an%x1f%ae%x1f%aI%x1f%cI%x1f%s%x1f%b';
18
+ const LINE_LOG_FORMAT = 'tformat:%x1e%H%x1f%h%x1f%an%x1f%aI%x1f%s';
19
+ function repoRootFromOptions(options) {
20
+ return path.resolve(options.repoRoot ?? options.cwd ?? process.cwd());
21
+ }
22
+ function rangeResolutionOptions(options) {
23
+ const { maxBuffer: _maxBuffer, allowExitCodes: _allowExitCodes, ...rest } = options;
24
+ return rest;
25
+ }
26
+ function pathspecs(options, includeDefaultExcludes = true) {
27
+ const specs = [];
28
+ specs.push(...(options.paths ?? []));
29
+ if (includeDefaultExcludes)
30
+ specs.push(...DEFAULT_NOISE_EXCLUDES);
31
+ specs.push(...(options.excludePaths ?? []));
32
+ return specs;
33
+ }
34
+ function withPathspecs(args, specs) {
35
+ return [...args, '--', ...specs];
36
+ }
37
+ async function resolveRangeAndVersion(options) {
38
+ const repoRoot = repoRootFromOptions(options);
39
+ const rangeOptions = rangeResolutionOptions(options);
40
+ const range = await resolveDiffRange(rangeOptions);
41
+ const version = await gitVersion(repoRoot, rangeOptions).catch(() => undefined);
42
+ return { range, version, repoRoot };
43
+ }
44
+ function sumNumstat(stats) {
45
+ let added = 0;
46
+ let deleted = 0;
47
+ let binaryFiles = 0;
48
+ for (const stat of stats) {
49
+ if (stat.binary)
50
+ binaryFiles++;
51
+ added += stat.added ?? 0;
52
+ deleted += stat.deleted ?? 0;
53
+ }
54
+ return { added, deleted, binaryFiles };
55
+ }
56
+ function countPatchFiles(patch) {
57
+ return patch.split(/\r?\n/).filter(line => line.startsWith('diff --git ')).length;
58
+ }
59
+ function rangeSpec(range) {
60
+ if (range.base && range.head)
61
+ return `${range.base}..${range.head}`;
62
+ return range.head;
63
+ }
64
+ function toFileHistoryEntry(commit, added = null, deleted = null) {
65
+ return { ...commit, added, deleted };
66
+ }
67
+ function parseLineHistory(output) {
68
+ return output
69
+ .split('\x1e')
70
+ .map(record => record.trim())
71
+ .filter(Boolean)
72
+ .map(record => {
73
+ const [hash, shortHash, authorName, authorDate, subject] = record.split('\x1f');
74
+ return {
75
+ hash,
76
+ shortHash,
77
+ authorName,
78
+ authorEmail: '',
79
+ authorDate,
80
+ committerDate: authorDate,
81
+ subject,
82
+ added: null,
83
+ deleted: null,
84
+ };
85
+ });
86
+ }
87
+ export async function resolveGitRange(options = {}) {
88
+ return resolveDiffRange(options);
89
+ }
90
+ export async function getGitChangedFiles(options = {}) {
91
+ const { range, version, repoRoot } = await resolveRangeAndVersion(options);
92
+ const args = withPathspecs(['diff', '--no-color', '--name-status', '-M', '-z', ...buildDiffRangeArgs(range, version)], pathspecs(options));
93
+ const result = await runGitRaw(args, { ...options, repoRoot });
94
+ return parseNameStatusZ(result.stdout);
95
+ }
96
+ export async function getGitDiffSummary(options = {}) {
97
+ const { range, version, repoRoot } = await resolveRangeAndVersion(options);
98
+ const specs = pathspecs(options);
99
+ const fileResult = await runGitRaw(withPathspecs(['diff', '--no-color', '--name-status', '-M', '-z', ...buildDiffRangeArgs(range, version)], specs), { ...options, repoRoot });
100
+ const numstatResult = await runGitRaw(withPathspecs(['diff', '--no-color', '--numstat', '-M', '-z', ...buildDiffRangeArgs(range, version)], specs), { ...options, repoRoot });
101
+ const files = parseNameStatusZ(fileResult.stdout);
102
+ const numstat = parseNumstatZ(numstatResult.stdout);
103
+ const binaryByPath = new Set(numstat.filter(entry => entry.binary).map(entry => entry.path));
104
+ const enrichedFiles = files.map(file => (binaryByPath.has(file.path) ? { ...file, binary: true } : file));
105
+ const totals = sumNumstat(numstat);
106
+ return {
107
+ range,
108
+ files: enrichedFiles,
109
+ numstat,
110
+ totalAdded: totals.added,
111
+ totalDeleted: totals.deleted,
112
+ filesChanged: files.length,
113
+ binaryFiles: totals.binaryFiles,
114
+ };
115
+ }
116
+ export async function getGitDiffPatch(options = {}) {
117
+ const { range, version, repoRoot } = await resolveRangeAndVersion(options);
118
+ const specs = pathspecs(options);
119
+ const args = withPathspecs(['diff', '--no-color', ...buildDiffRangeArgs(range, version)], specs);
120
+ const tokenBudget = options.tokenBudget;
121
+ try {
122
+ const result = await runGit(args, { ...options, repoRoot });
123
+ const tokenizerName = resolveTokenizerName(options.tokenizer);
124
+ const tokenizer = tokenBudget ? await createTokenizer(tokenizerName) : undefined;
125
+ const fullPatch = result.stdout;
126
+ const fullTokens = tokenizer ? tokenizer.count(fullPatch) : estimateTokenCount(fullPatch);
127
+ const truncated = tokenBudget != null && fullTokens > tokenBudget;
128
+ const patch = truncated && tokenizer ? tokenizer.slice(fullPatch, 0, tokenBudget) : fullPatch;
129
+ const tokensUsed = tokenizer ? tokenizer.count(patch) : estimateTokenCount(patch);
130
+ const filesIncluded = countPatchFiles(patch);
131
+ const changedFiles = await getGitChangedFiles(rangeResolutionOptions(options)).catch(() => []);
132
+ return {
133
+ range,
134
+ patch,
135
+ truncated,
136
+ tokensUsed,
137
+ tokenBudget,
138
+ filesIncluded,
139
+ filesOmitted: Math.max(0, changedFiles.length - filesIncluded),
140
+ };
141
+ }
142
+ catch (error) {
143
+ if (error instanceof GitError && error.code === 'max-buffer') {
144
+ const changedFiles = await getGitChangedFiles(rangeResolutionOptions(options)).catch(() => []);
145
+ return {
146
+ range,
147
+ patch: '',
148
+ truncated: true,
149
+ tokensUsed: 0,
150
+ tokenBudget,
151
+ filesIncluded: 0,
152
+ filesOmitted: changedFiles.length,
153
+ };
154
+ }
155
+ throw error;
156
+ }
157
+ }
158
+ export async function getGitDiffHunks(options = {}) {
159
+ const { range, version, repoRoot } = await resolveRangeAndVersion(options);
160
+ const result = await runGit(withPathspecs(['diff', '--no-color', '--unified=0', ...buildDiffRangeArgs(range, version)], pathspecs(options)), { ...options, repoRoot });
161
+ return parseDiffPatchHunks(result.stdout, range);
162
+ }
163
+ export async function getGitDiffFunctionContext(options = {}) {
164
+ const { range, version, repoRoot } = await resolveRangeAndVersion(options);
165
+ const result = await runGit(withPathspecs(['diff', '--no-color', '-W', '--unified=3', ...buildDiffRangeArgs(range, version)], pathspecs(options)), { ...options, repoRoot });
166
+ return parseDiffPatchHunks(result.stdout, range, { includeLineText: true });
167
+ }
168
+ export async function getGitCommitHistory(options = {}) {
169
+ const { range, repoRoot } = await resolveRangeAndVersion(options);
170
+ const limit = options.limit ?? 50;
171
+ const args = ['log', '--no-color', '-z', `--format=${LOG_FORMAT}`, `--max-count=${limit + 1}`];
172
+ if (options.since)
173
+ args.push(`--since=${options.since}`);
174
+ const spec = rangeSpec(range);
175
+ if (spec)
176
+ args.push(spec);
177
+ const result = await runGitRaw(withPathspecs(args, pathspecs(options)), { ...options, repoRoot });
178
+ const commits = parseLogRecords(result.stdout);
179
+ const truncated = commits.length > limit;
180
+ return {
181
+ commits: commits.slice(0, limit),
182
+ total: Math.min(commits.length, limit),
183
+ truncated,
184
+ pathFilter: options.paths?.[0],
185
+ };
186
+ }
187
+ export async function getGitFileHistory(options) {
188
+ const repoRoot = repoRootFromOptions(options);
189
+ const limit = options.limit ?? 50;
190
+ if (options.lineRange) {
191
+ const lineArg = `${options.lineRange.start},${options.lineRange.end}:${options.path}`;
192
+ let result = await runGit(['log', '--no-color', '-L', lineArg, `--format=${LINE_LOG_FORMAT}`, `--max-count=${limit}`, 'HEAD'], { ...options, repoRoot }).catch(async (error) => {
193
+ if (error instanceof GitError && /has only \d+ lines/i.test(error.stderr ?? error.message)) {
194
+ return runGit([
195
+ 'log',
196
+ '--no-color',
197
+ '-L',
198
+ `${options.lineRange?.start},${options.lineRange?.start}:${options.path}`,
199
+ `--format=${LINE_LOG_FORMAT}`,
200
+ `--max-count=${limit}`,
201
+ 'HEAD',
202
+ ], { ...options, repoRoot });
203
+ }
204
+ throw error;
205
+ });
206
+ const entries = parseLineHistory(result.stdout).slice(0, limit);
207
+ return {
208
+ path: options.path,
209
+ lineRange: options.lineRange,
210
+ entries,
211
+ total: entries.length,
212
+ truncated: entries.length > limit,
213
+ };
214
+ }
215
+ const args = ['log', '--no-color', '-z', `--format=${LOG_FORMAT}`, `--max-count=${limit + 1}`];
216
+ if (options.follow)
217
+ args.push('--follow');
218
+ if (options.since)
219
+ args.push(`--since=${options.since}`);
220
+ args.push('HEAD');
221
+ const result = await runGitRaw(withPathspecs(args, [options.path]), { ...options, repoRoot });
222
+ const commits = parseLogRecords(result.stdout).map(commit => toFileHistoryEntry(commit));
223
+ const truncated = commits.length > limit;
224
+ return {
225
+ path: options.path,
226
+ entries: commits.slice(0, limit),
227
+ total: Math.min(commits.length, limit),
228
+ truncated,
229
+ };
230
+ }
231
+ export async function getGitChurnSummary(options = {}) {
232
+ const { range, repoRoot } = await resolveRangeAndVersion(options);
233
+ const args = ['log', '--no-color', '-z', `--format=${LOG_FORMAT}`, '--numstat'];
234
+ if (options.since)
235
+ args.push(`--since=${options.since}`);
236
+ const spec = rangeSpec(range);
237
+ if (spec)
238
+ args.push(spec);
239
+ const result = await runGitRaw(withPathspecs(args, pathspecs(options)), { ...options, repoRoot });
240
+ const records = parseLogNumstatZ(result.stdout);
241
+ const summary = aggregateChurn(records, range, options.sort ?? 'churn');
242
+ if (options.limit != null) {
243
+ return { ...summary, entries: summary.entries.slice(0, options.limit) };
244
+ }
245
+ return summary;
246
+ }
247
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/git/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { GitRange, GitRepoInfo } from './types.js';
2
+ export type GitErrorCode = 'git-missing' | 'not-a-repo' | 'bad-ref' | 'merge-base-failed' | 'timeout' | 'max-buffer' | 'git-failed' | 'not-implemented';
3
+ export declare class GitError extends Error {
4
+ readonly code: GitErrorCode;
5
+ readonly exitCode?: number;
6
+ readonly stderr?: string;
7
+ constructor(code: GitErrorCode, message: string, options?: {
8
+ cause?: unknown;
9
+ exitCode?: number;
10
+ stderr?: string;
11
+ });
12
+ }
13
+ export interface RunGitOptions {
14
+ cwd?: string;
15
+ repoRoot?: string;
16
+ signal?: AbortSignal;
17
+ timeoutMs?: number;
18
+ maxBuffer?: number;
19
+ allowExitCodes?: readonly number[];
20
+ }
21
+ export interface RunGitResult {
22
+ stdout: string;
23
+ stderr: string;
24
+ exitCode: number;
25
+ argv: string[];
26
+ cwd: string;
27
+ }
28
+ export interface RunGitRawResult {
29
+ stdout: Buffer;
30
+ stderr: string;
31
+ exitCode: number;
32
+ argv: string[];
33
+ cwd: string;
34
+ }
35
+ export declare const GIT_GLOBAL_ARGS: readonly ["--no-pager", "-c", "color.ui=false", "-c", "core.quotePath=false", "-c", "core.autocrlf=false", "--no-optional-locks"];
36
+ export declare function runGit(args: readonly string[], options?: RunGitOptions): Promise<RunGitResult>;
37
+ export declare function runGitRaw(args: readonly string[], options?: RunGitOptions): Promise<RunGitRawResult>;
38
+ export declare function preflightRepo(repoRoot?: string, options?: RunGitOptions): Promise<GitRepoInfo>;
39
+ export declare function gitVersion(repoRoot?: string, options?: RunGitOptions): Promise<string>;
40
+ export declare function detectDefaultBase(repoRoot?: string, options?: RunGitOptions): Promise<string | undefined>;
41
+ export declare function gitMergeBase(base: string, head?: string, options?: RunGitOptions): Promise<string>;
42
+ export interface ResolveDiffRangeOptions extends RunGitOptions {
43
+ base?: string;
44
+ head?: string;
45
+ staged?: boolean;
46
+ }
47
+ export declare function resolveDiffRange(options?: ResolveDiffRangeOptions): Promise<GitRange>;
48
+ export declare function buildDiffRangeArgs(range: GitRange, version?: string): string[];
@@ -0,0 +1,336 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { realpath } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { OccAbortError } from '../errors.js';
5
+ import { abortIfNeeded } from '../utils.js';
6
+ export class GitError extends Error {
7
+ code;
8
+ exitCode;
9
+ stderr;
10
+ constructor(code, message, options) {
11
+ super(message, options);
12
+ this.name = 'GitError';
13
+ this.code = code;
14
+ this.exitCode = options?.exitCode;
15
+ this.stderr = options?.stderr;
16
+ }
17
+ }
18
+ export const GIT_GLOBAL_ARGS = [
19
+ '--no-pager',
20
+ '-c',
21
+ 'color.ui=false',
22
+ '-c',
23
+ 'core.quotePath=false',
24
+ '-c',
25
+ 'core.autocrlf=false',
26
+ '--no-optional-locks',
27
+ ];
28
+ const DEFAULT_MAX_BUFFER = 64 * 1024 * 1024;
29
+ const DEFAULT_TIMEOUT_MS = 60_000;
30
+ const DEFAULT_HEAD = 'HEAD';
31
+ function resolveCwd(options) {
32
+ return path.resolve(options.repoRoot ?? options.cwd ?? process.cwd());
33
+ }
34
+ function firstStderrLine(stderr, fallback) {
35
+ const first = stderr
36
+ .split(/\r?\n/)
37
+ .map(line => line.trim())
38
+ .find(Boolean);
39
+ return first ?? fallback;
40
+ }
41
+ function isAbortError(error) {
42
+ return error.name === 'AbortError' || error.code === 'ABORT_ERR';
43
+ }
44
+ function classifyGitFailure(error, stderr) {
45
+ if (error.code === 'ENOENT')
46
+ return 'git-missing';
47
+ if (error.code === 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER')
48
+ return 'max-buffer';
49
+ if (error.killed)
50
+ return 'timeout';
51
+ if (/not a git repository/i.test(stderr))
52
+ return 'not-a-repo';
53
+ if (/bad revision|unknown revision|ambiguous argument|Needed a single revision/i.test(stderr))
54
+ return 'bad-ref';
55
+ return 'git-failed';
56
+ }
57
+ function toGitError(error, stderr) {
58
+ const code = classifyGitFailure(error, stderr);
59
+ const exitCode = typeof error.code === 'number' ? error.code : undefined;
60
+ return new GitError(code, firstStderrLine(stderr, error.message), {
61
+ cause: error,
62
+ exitCode,
63
+ stderr: stderr.trim(),
64
+ });
65
+ }
66
+ function normalizeStderr(stderr) {
67
+ return Buffer.isBuffer(stderr) ? stderr.toString('utf8') : stderr;
68
+ }
69
+ function isAllowedExit(code, allowedExitCodes) {
70
+ return code === 0 || (allowedExitCodes?.includes(code) ?? false);
71
+ }
72
+ function execGit(args, options, encoding) {
73
+ abortIfNeeded(options.signal);
74
+ const cwd = resolveCwd(options);
75
+ const argv = [...GIT_GLOBAL_ARGS, ...args];
76
+ const maxBuffer = options.maxBuffer ?? DEFAULT_MAX_BUFFER;
77
+ const timeout = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
78
+ return new Promise((resolve, reject) => {
79
+ execFile('git', argv, {
80
+ cwd,
81
+ maxBuffer,
82
+ timeout,
83
+ signal: options.signal,
84
+ encoding,
85
+ }, (error, stdout, stderr) => {
86
+ const stderrText = normalizeStderr(stderr);
87
+ if (!error) {
88
+ resolve({ stdout, stderr: stderrText, exitCode: 0, argv, cwd });
89
+ return;
90
+ }
91
+ if (isAbortError(error)) {
92
+ reject(new OccAbortError());
93
+ return;
94
+ }
95
+ const exitCode = typeof error.code === 'number' ? error.code : undefined;
96
+ if (exitCode != null && isAllowedExit(exitCode, options.allowExitCodes)) {
97
+ resolve({ stdout, stderr: stderrText, exitCode, argv, cwd });
98
+ return;
99
+ }
100
+ reject(toGitError(error, stderrText));
101
+ });
102
+ });
103
+ }
104
+ export async function runGit(args, options = {}) {
105
+ return execGit(args, options, 'utf8');
106
+ }
107
+ export async function runGitRaw(args, options = {}) {
108
+ return execGit(args, options, 'buffer');
109
+ }
110
+ function fallbackRepoInfo(repoRoot, gitVersionValue) {
111
+ const info = {
112
+ repoRoot: path.resolve(repoRoot),
113
+ isDirty: false,
114
+ shallow: false,
115
+ detached: false,
116
+ };
117
+ if (gitVersionValue)
118
+ info.gitVersion = gitVersionValue;
119
+ return info;
120
+ }
121
+ export async function preflightRepo(repoRoot = process.cwd(), options = {}) {
122
+ let version;
123
+ try {
124
+ version = await gitVersion(repoRoot, options);
125
+ }
126
+ catch {
127
+ return fallbackRepoInfo(repoRoot);
128
+ }
129
+ const baseOptions = { ...options, repoRoot };
130
+ const inside = await runGit(['rev-parse', '--is-inside-work-tree'], {
131
+ ...baseOptions,
132
+ allowExitCodes: [128],
133
+ }).catch(() => undefined);
134
+ if (!inside || inside.exitCode !== 0 || inside.stdout.trim() !== 'true') {
135
+ return fallbackRepoInfo(repoRoot, version);
136
+ }
137
+ const rootResult = await runGit(['rev-parse', '--show-toplevel'], baseOptions).catch(() => undefined);
138
+ const resolvedRoot = rootResult?.stdout.trim()
139
+ ? await realpath(rootResult.stdout.trim()).catch(() => path.resolve(rootResult.stdout.trim()))
140
+ : path.resolve(repoRoot);
141
+ const repoOptions = { ...options, repoRoot: resolvedRoot };
142
+ const headResult = await runGit(['rev-parse', '--verify', '--quiet', 'HEAD'], {
143
+ ...repoOptions,
144
+ allowExitCodes: [1],
145
+ }).catch(() => undefined);
146
+ const head = headResult?.exitCode === 0 ? headResult.stdout.trim() : undefined;
147
+ const branchResult = await runGit(['symbolic-ref', '--quiet', '--short', 'HEAD'], {
148
+ ...repoOptions,
149
+ allowExitCodes: [1],
150
+ }).catch(() => undefined);
151
+ const currentBranch = branchResult?.exitCode === 0 ? branchResult.stdout.trim() : undefined;
152
+ const detached = head != null && branchResult?.exitCode === 1;
153
+ const shallowResult = await runGit(['rev-parse', '--is-shallow-repository'], repoOptions).catch(() => undefined);
154
+ const shallow = shallowResult?.stdout.trim() === 'true';
155
+ const dirtyResult = await runGitRaw(['status', '--porcelain=v1', '-z'], {
156
+ ...repoOptions,
157
+ allowExitCodes: [128],
158
+ }).catch(() => undefined);
159
+ const isDirty = dirtyResult?.exitCode === 0 ? dirtyResult.stdout.length > 0 : false;
160
+ const defaultBranch = await detectDefaultBase(resolvedRoot, options).catch(() => undefined);
161
+ const info = {
162
+ repoRoot: resolvedRoot,
163
+ isDirty,
164
+ shallow,
165
+ detached,
166
+ gitVersion: version,
167
+ };
168
+ if (defaultBranch)
169
+ info.defaultBranch = defaultBranch;
170
+ if (head)
171
+ info.head = head;
172
+ if (currentBranch)
173
+ info.currentBranch = currentBranch;
174
+ return info;
175
+ }
176
+ export async function gitVersion(repoRoot = process.cwd(), options = {}) {
177
+ const result = await runGit(['version'], { ...options, repoRoot });
178
+ return result.stdout.trim();
179
+ }
180
+ async function verifyCommit(repoRoot, ref, options = {}) {
181
+ if (ref.startsWith('-')) {
182
+ throw new GitError('bad-ref', `Invalid ref "${ref}".`);
183
+ }
184
+ const result = await runGit(['rev-parse', '--verify', '--quiet', `${ref}^{commit}`], {
185
+ ...options,
186
+ repoRoot,
187
+ allowExitCodes: [1],
188
+ });
189
+ if (result.exitCode !== 0)
190
+ return undefined;
191
+ return result.stdout.trim() || undefined;
192
+ }
193
+ async function requireCommit(repoRoot, ref, options = {}) {
194
+ const resolved = await verifyCommit(repoRoot, ref, options);
195
+ if (!resolved)
196
+ throw new GitError('bad-ref', `Invalid ref "${ref}".`);
197
+ return resolved;
198
+ }
199
+ export async function detectDefaultBase(repoRoot = process.cwd(), options = {}) {
200
+ const originHead = await runGit(['symbolic-ref', '--quiet', '--short', 'refs/remotes/origin/HEAD'], {
201
+ ...options,
202
+ repoRoot,
203
+ allowExitCodes: [1],
204
+ }).catch(() => undefined);
205
+ const originHeadRef = originHead?.exitCode === 0 ? originHead.stdout.trim() : undefined;
206
+ if (originHeadRef && (await verifyCommit(repoRoot, originHeadRef, options)))
207
+ return originHeadRef;
208
+ for (const candidate of ['main', 'master', 'origin/main', 'origin/master', 'develop', 'trunk']) {
209
+ if (await verifyCommit(repoRoot, candidate, options))
210
+ return candidate;
211
+ }
212
+ const upstream = await runGit(['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{upstream}'], {
213
+ ...options,
214
+ repoRoot,
215
+ allowExitCodes: [128],
216
+ }).catch(() => undefined);
217
+ if (!upstream || upstream.exitCode !== 0)
218
+ return undefined;
219
+ const upstreamRef = upstream.stdout.trim();
220
+ const branch = await runGit(['symbolic-ref', '--quiet', '--short', 'HEAD'], {
221
+ ...options,
222
+ repoRoot,
223
+ allowExitCodes: [1],
224
+ }).catch(() => undefined);
225
+ const branchRemoteRef = branch?.exitCode === 0 ? `origin/${branch.stdout.trim()}` : undefined;
226
+ if (upstreamRef && upstreamRef !== branchRemoteRef && (await verifyCommit(repoRoot, upstreamRef, options))) {
227
+ return upstreamRef;
228
+ }
229
+ return undefined;
230
+ }
231
+ export async function gitMergeBase(base, head = DEFAULT_HEAD, options = {}) {
232
+ const repoRoot = resolveCwd(options);
233
+ await requireCommit(repoRoot, base, options);
234
+ await requireCommit(repoRoot, head, options);
235
+ const result = await runGit(['merge-base', base, head], {
236
+ ...options,
237
+ repoRoot,
238
+ allowExitCodes: [1],
239
+ });
240
+ const mergeBase = result.stdout.trim();
241
+ if (result.exitCode !== 0 || mergeBase.length === 0) {
242
+ throw new GitError('merge-base-failed', `Could not find a merge base for "${base}" and "${head}".`, {
243
+ exitCode: result.exitCode,
244
+ stderr: result.stderr.trim(),
245
+ });
246
+ }
247
+ return mergeBase;
248
+ }
249
+ function workingTreeRange() {
250
+ return { kind: 'working-tree', describe: 'working tree' };
251
+ }
252
+ function stagedRange(head) {
253
+ const range = { kind: 'staged', describe: 'staged' };
254
+ if (head) {
255
+ range.head = DEFAULT_HEAD;
256
+ range.resolvedHead = head;
257
+ }
258
+ return range;
259
+ }
260
+ export async function resolveDiffRange(options = {}) {
261
+ const repoRoot = resolveCwd(options);
262
+ const info = await preflightRepo(repoRoot, options);
263
+ if (!info.head && !info.currentBranch) {
264
+ throw new GitError('not-a-repo', 'Not a git repository.');
265
+ }
266
+ if (options.staged)
267
+ return stagedRange(info.head);
268
+ if (!info.head)
269
+ return workingTreeRange();
270
+ const explicitRange = options.base != null || options.head != null;
271
+ if (!explicitRange && info.isDirty)
272
+ return workingTreeRange();
273
+ const base = options.base ?? (await detectDefaultBase(info.repoRoot, options));
274
+ const head = options.head ?? DEFAULT_HEAD;
275
+ if (!base)
276
+ return workingTreeRange();
277
+ const resolvedBase = await requireCommit(info.repoRoot, base, options);
278
+ const resolvedHead = await requireCommit(info.repoRoot, head, options);
279
+ try {
280
+ const mergeBase = await gitMergeBase(base, head, { ...options, repoRoot: info.repoRoot });
281
+ return {
282
+ base,
283
+ head,
284
+ kind: 'three-dot',
285
+ mergeBase,
286
+ resolvedBase,
287
+ resolvedHead,
288
+ describe: `${base}...${head}`,
289
+ };
290
+ }
291
+ catch (error) {
292
+ if (!(error instanceof GitError) || error.code !== 'merge-base-failed')
293
+ throw error;
294
+ return {
295
+ base,
296
+ head,
297
+ kind: 'two-dot',
298
+ resolvedBase,
299
+ resolvedHead,
300
+ describe: `${base}..${head}`,
301
+ };
302
+ }
303
+ }
304
+ function parseGitVersion(version) {
305
+ const match = version?.match(/(\d+)\.(\d+)/);
306
+ if (!match)
307
+ return undefined;
308
+ return { major: Number.parseInt(match[1], 10), minor: Number.parseInt(match[2], 10) };
309
+ }
310
+ function supportsMergeBaseDiff(version) {
311
+ const parsed = parseGitVersion(version);
312
+ if (!parsed)
313
+ return true;
314
+ return parsed.major > 2 || (parsed.major === 2 && parsed.minor >= 30);
315
+ }
316
+ export function buildDiffRangeArgs(range, version) {
317
+ if (range.kind === 'working-tree')
318
+ return [];
319
+ if (range.kind === 'staged')
320
+ return ['--cached'];
321
+ if (range.kind === 'three-dot') {
322
+ if (supportsMergeBaseDiff(version) && range.base && range.head) {
323
+ return ['--merge-base', range.base, range.head];
324
+ }
325
+ if (range.mergeBase)
326
+ return [range.mergeBase, range.head ?? DEFAULT_HEAD];
327
+ }
328
+ if (range.base && range.head)
329
+ return [range.base, range.head];
330
+ if (range.resolvedBase && range.resolvedHead)
331
+ return [range.resolvedBase, range.resolvedHead];
332
+ if (range.head)
333
+ return [range.head];
334
+ return [];
335
+ }
336
+ //# sourceMappingURL=client.js.map