gitx.do 0.0.2 → 0.0.3

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 (237) hide show
  1. package/dist/cli/commands/blame.d.ts +259 -0
  2. package/dist/cli/commands/blame.d.ts.map +1 -0
  3. package/dist/cli/commands/blame.js +609 -0
  4. package/dist/cli/commands/blame.js.map +1 -0
  5. package/dist/cli/commands/branch.d.ts +249 -0
  6. package/dist/cli/commands/branch.d.ts.map +1 -0
  7. package/dist/cli/commands/branch.js +693 -0
  8. package/dist/cli/commands/branch.js.map +1 -0
  9. package/dist/cli/commands/commit.d.ts +182 -0
  10. package/dist/cli/commands/commit.d.ts.map +1 -0
  11. package/dist/cli/commands/commit.js +437 -0
  12. package/dist/cli/commands/commit.js.map +1 -0
  13. package/dist/cli/commands/diff.d.ts +464 -0
  14. package/dist/cli/commands/diff.d.ts.map +1 -0
  15. package/dist/cli/commands/diff.js +958 -0
  16. package/dist/cli/commands/diff.js.map +1 -0
  17. package/dist/cli/commands/log.d.ts +239 -0
  18. package/dist/cli/commands/log.d.ts.map +1 -0
  19. package/dist/cli/commands/log.js +535 -0
  20. package/dist/cli/commands/log.js.map +1 -0
  21. package/dist/cli/commands/review.d.ts +457 -0
  22. package/dist/cli/commands/review.d.ts.map +1 -0
  23. package/dist/cli/commands/review.js +533 -0
  24. package/dist/cli/commands/review.js.map +1 -0
  25. package/dist/cli/commands/status.d.ts +269 -0
  26. package/dist/cli/commands/status.d.ts.map +1 -0
  27. package/dist/cli/commands/status.js +493 -0
  28. package/dist/cli/commands/status.js.map +1 -0
  29. package/dist/cli/commands/web.d.ts +199 -0
  30. package/dist/cli/commands/web.d.ts.map +1 -0
  31. package/dist/cli/commands/web.js +696 -0
  32. package/dist/cli/commands/web.js.map +1 -0
  33. package/dist/cli/fs-adapter.d.ts +656 -0
  34. package/dist/cli/fs-adapter.d.ts.map +1 -0
  35. package/dist/cli/fs-adapter.js +1179 -0
  36. package/dist/cli/fs-adapter.js.map +1 -0
  37. package/dist/cli/index.d.ts +387 -0
  38. package/dist/cli/index.d.ts.map +1 -0
  39. package/dist/cli/index.js +523 -0
  40. package/dist/cli/index.js.map +1 -0
  41. package/dist/cli/ui/components/DiffView.d.ts +7 -0
  42. package/dist/cli/ui/components/DiffView.d.ts.map +1 -0
  43. package/dist/cli/ui/components/DiffView.js +11 -0
  44. package/dist/cli/ui/components/DiffView.js.map +1 -0
  45. package/dist/cli/ui/components/ErrorDisplay.d.ts +6 -0
  46. package/dist/cli/ui/components/ErrorDisplay.d.ts.map +1 -0
  47. package/dist/cli/ui/components/ErrorDisplay.js +11 -0
  48. package/dist/cli/ui/components/ErrorDisplay.js.map +1 -0
  49. package/dist/cli/ui/components/FuzzySearch.d.ts +9 -0
  50. package/dist/cli/ui/components/FuzzySearch.d.ts.map +1 -0
  51. package/dist/cli/ui/components/FuzzySearch.js +12 -0
  52. package/dist/cli/ui/components/FuzzySearch.js.map +1 -0
  53. package/dist/cli/ui/components/LoadingSpinner.d.ts +6 -0
  54. package/dist/cli/ui/components/LoadingSpinner.d.ts.map +1 -0
  55. package/dist/cli/ui/components/LoadingSpinner.js +10 -0
  56. package/dist/cli/ui/components/LoadingSpinner.js.map +1 -0
  57. package/dist/cli/ui/components/NavigationList.d.ts +9 -0
  58. package/dist/cli/ui/components/NavigationList.d.ts.map +1 -0
  59. package/dist/cli/ui/components/NavigationList.js +11 -0
  60. package/dist/cli/ui/components/NavigationList.js.map +1 -0
  61. package/dist/cli/ui/components/ScrollableContent.d.ts +8 -0
  62. package/dist/cli/ui/components/ScrollableContent.d.ts.map +1 -0
  63. package/dist/cli/ui/components/ScrollableContent.js +11 -0
  64. package/dist/cli/ui/components/ScrollableContent.js.map +1 -0
  65. package/dist/cli/ui/components/index.d.ts +7 -0
  66. package/dist/cli/ui/components/index.d.ts.map +1 -0
  67. package/dist/cli/ui/components/index.js +9 -0
  68. package/dist/cli/ui/components/index.js.map +1 -0
  69. package/dist/cli/ui/terminal-ui.d.ts +52 -0
  70. package/dist/cli/ui/terminal-ui.d.ts.map +1 -0
  71. package/dist/cli/ui/terminal-ui.js +121 -0
  72. package/dist/cli/ui/terminal-ui.js.map +1 -0
  73. package/dist/durable-object/object-store.d.ts +401 -23
  74. package/dist/durable-object/object-store.d.ts.map +1 -1
  75. package/dist/durable-object/object-store.js +414 -25
  76. package/dist/durable-object/object-store.js.map +1 -1
  77. package/dist/durable-object/schema.d.ts +188 -0
  78. package/dist/durable-object/schema.d.ts.map +1 -1
  79. package/dist/durable-object/schema.js +160 -0
  80. package/dist/durable-object/schema.js.map +1 -1
  81. package/dist/durable-object/wal.d.ts +336 -31
  82. package/dist/durable-object/wal.d.ts.map +1 -1
  83. package/dist/durable-object/wal.js +272 -27
  84. package/dist/durable-object/wal.js.map +1 -1
  85. package/dist/index.d.ts +379 -3
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +379 -7
  88. package/dist/index.js.map +1 -1
  89. package/dist/mcp/adapter.d.ts +579 -38
  90. package/dist/mcp/adapter.d.ts.map +1 -1
  91. package/dist/mcp/adapter.js +426 -33
  92. package/dist/mcp/adapter.js.map +1 -1
  93. package/dist/mcp/sandbox.d.ts +532 -29
  94. package/dist/mcp/sandbox.d.ts.map +1 -1
  95. package/dist/mcp/sandbox.js +389 -22
  96. package/dist/mcp/sandbox.js.map +1 -1
  97. package/dist/mcp/sdk-adapter.d.ts +478 -56
  98. package/dist/mcp/sdk-adapter.d.ts.map +1 -1
  99. package/dist/mcp/sdk-adapter.js +346 -44
  100. package/dist/mcp/sdk-adapter.js.map +1 -1
  101. package/dist/mcp/tools.d.ts +445 -30
  102. package/dist/mcp/tools.d.ts.map +1 -1
  103. package/dist/mcp/tools.js +363 -33
  104. package/dist/mcp/tools.js.map +1 -1
  105. package/dist/ops/blame.d.ts +424 -21
  106. package/dist/ops/blame.d.ts.map +1 -1
  107. package/dist/ops/blame.js +303 -20
  108. package/dist/ops/blame.js.map +1 -1
  109. package/dist/ops/branch.d.ts +583 -32
  110. package/dist/ops/branch.d.ts.map +1 -1
  111. package/dist/ops/branch.js +365 -23
  112. package/dist/ops/branch.js.map +1 -1
  113. package/dist/ops/commit-traversal.d.ts +164 -24
  114. package/dist/ops/commit-traversal.d.ts.map +1 -1
  115. package/dist/ops/commit-traversal.js +68 -2
  116. package/dist/ops/commit-traversal.js.map +1 -1
  117. package/dist/ops/commit.d.ts +387 -53
  118. package/dist/ops/commit.d.ts.map +1 -1
  119. package/dist/ops/commit.js +249 -29
  120. package/dist/ops/commit.js.map +1 -1
  121. package/dist/ops/merge-base.d.ts +195 -21
  122. package/dist/ops/merge-base.d.ts.map +1 -1
  123. package/dist/ops/merge-base.js +122 -12
  124. package/dist/ops/merge-base.js.map +1 -1
  125. package/dist/ops/merge.d.ts +600 -130
  126. package/dist/ops/merge.d.ts.map +1 -1
  127. package/dist/ops/merge.js +408 -60
  128. package/dist/ops/merge.js.map +1 -1
  129. package/dist/ops/tag.d.ts +67 -2
  130. package/dist/ops/tag.d.ts.map +1 -1
  131. package/dist/ops/tag.js +42 -1
  132. package/dist/ops/tag.js.map +1 -1
  133. package/dist/ops/tree-builder.d.ts +102 -6
  134. package/dist/ops/tree-builder.d.ts.map +1 -1
  135. package/dist/ops/tree-builder.js +30 -5
  136. package/dist/ops/tree-builder.js.map +1 -1
  137. package/dist/ops/tree-diff.d.ts +50 -2
  138. package/dist/ops/tree-diff.d.ts.map +1 -1
  139. package/dist/ops/tree-diff.js +50 -2
  140. package/dist/ops/tree-diff.js.map +1 -1
  141. package/dist/pack/delta.d.ts +211 -39
  142. package/dist/pack/delta.d.ts.map +1 -1
  143. package/dist/pack/delta.js +232 -46
  144. package/dist/pack/delta.js.map +1 -1
  145. package/dist/pack/format.d.ts +390 -28
  146. package/dist/pack/format.d.ts.map +1 -1
  147. package/dist/pack/format.js +344 -33
  148. package/dist/pack/format.js.map +1 -1
  149. package/dist/pack/full-generation.d.ts +313 -28
  150. package/dist/pack/full-generation.d.ts.map +1 -1
  151. package/dist/pack/full-generation.js +238 -19
  152. package/dist/pack/full-generation.js.map +1 -1
  153. package/dist/pack/generation.d.ts +346 -23
  154. package/dist/pack/generation.d.ts.map +1 -1
  155. package/dist/pack/generation.js +269 -21
  156. package/dist/pack/generation.js.map +1 -1
  157. package/dist/pack/index.d.ts +407 -86
  158. package/dist/pack/index.d.ts.map +1 -1
  159. package/dist/pack/index.js +351 -70
  160. package/dist/pack/index.js.map +1 -1
  161. package/dist/refs/branch.d.ts +517 -71
  162. package/dist/refs/branch.d.ts.map +1 -1
  163. package/dist/refs/branch.js +410 -26
  164. package/dist/refs/branch.js.map +1 -1
  165. package/dist/refs/storage.d.ts +610 -57
  166. package/dist/refs/storage.d.ts.map +1 -1
  167. package/dist/refs/storage.js +481 -29
  168. package/dist/refs/storage.js.map +1 -1
  169. package/dist/refs/tag.d.ts +677 -67
  170. package/dist/refs/tag.d.ts.map +1 -1
  171. package/dist/refs/tag.js +497 -30
  172. package/dist/refs/tag.js.map +1 -1
  173. package/dist/storage/lru-cache.d.ts +556 -53
  174. package/dist/storage/lru-cache.d.ts.map +1 -1
  175. package/dist/storage/lru-cache.js +439 -36
  176. package/dist/storage/lru-cache.js.map +1 -1
  177. package/dist/storage/object-index.d.ts +483 -38
  178. package/dist/storage/object-index.d.ts.map +1 -1
  179. package/dist/storage/object-index.js +388 -22
  180. package/dist/storage/object-index.js.map +1 -1
  181. package/dist/storage/r2-pack.d.ts +957 -94
  182. package/dist/storage/r2-pack.d.ts.map +1 -1
  183. package/dist/storage/r2-pack.js +756 -48
  184. package/dist/storage/r2-pack.js.map +1 -1
  185. package/dist/tiered/cdc-pipeline.d.ts +1610 -38
  186. package/dist/tiered/cdc-pipeline.d.ts.map +1 -1
  187. package/dist/tiered/cdc-pipeline.js +1131 -22
  188. package/dist/tiered/cdc-pipeline.js.map +1 -1
  189. package/dist/tiered/migration.d.ts +903 -41
  190. package/dist/tiered/migration.d.ts.map +1 -1
  191. package/dist/tiered/migration.js +646 -24
  192. package/dist/tiered/migration.js.map +1 -1
  193. package/dist/tiered/parquet-writer.d.ts +944 -47
  194. package/dist/tiered/parquet-writer.d.ts.map +1 -1
  195. package/dist/tiered/parquet-writer.js +667 -39
  196. package/dist/tiered/parquet-writer.js.map +1 -1
  197. package/dist/tiered/read-path.d.ts +728 -34
  198. package/dist/tiered/read-path.d.ts.map +1 -1
  199. package/dist/tiered/read-path.js +310 -27
  200. package/dist/tiered/read-path.js.map +1 -1
  201. package/dist/types/objects.d.ts +457 -0
  202. package/dist/types/objects.d.ts.map +1 -1
  203. package/dist/types/objects.js +305 -4
  204. package/dist/types/objects.js.map +1 -1
  205. package/dist/types/storage.d.ts +407 -35
  206. package/dist/types/storage.d.ts.map +1 -1
  207. package/dist/types/storage.js +27 -3
  208. package/dist/types/storage.js.map +1 -1
  209. package/dist/utils/hash.d.ts +133 -12
  210. package/dist/utils/hash.d.ts.map +1 -1
  211. package/dist/utils/hash.js +133 -12
  212. package/dist/utils/hash.js.map +1 -1
  213. package/dist/utils/sha1.d.ts +102 -9
  214. package/dist/utils/sha1.d.ts.map +1 -1
  215. package/dist/utils/sha1.js +114 -11
  216. package/dist/utils/sha1.js.map +1 -1
  217. package/dist/wire/capabilities.d.ts +896 -88
  218. package/dist/wire/capabilities.d.ts.map +1 -1
  219. package/dist/wire/capabilities.js +566 -62
  220. package/dist/wire/capabilities.js.map +1 -1
  221. package/dist/wire/pkt-line.d.ts +293 -15
  222. package/dist/wire/pkt-line.d.ts.map +1 -1
  223. package/dist/wire/pkt-line.js +251 -15
  224. package/dist/wire/pkt-line.js.map +1 -1
  225. package/dist/wire/receive-pack.d.ts +814 -64
  226. package/dist/wire/receive-pack.d.ts.map +1 -1
  227. package/dist/wire/receive-pack.js +542 -41
  228. package/dist/wire/receive-pack.js.map +1 -1
  229. package/dist/wire/smart-http.d.ts +575 -97
  230. package/dist/wire/smart-http.d.ts.map +1 -1
  231. package/dist/wire/smart-http.js +337 -46
  232. package/dist/wire/smart-http.js.map +1 -1
  233. package/dist/wire/upload-pack.d.ts +492 -98
  234. package/dist/wire/upload-pack.d.ts.map +1 -1
  235. package/dist/wire/upload-pack.js +347 -59
  236. package/dist/wire/upload-pack.js.map +1 -1
  237. package/package.json +1 -1
@@ -0,0 +1,609 @@
1
+ /**
2
+ * @fileoverview Git Blame Command
3
+ *
4
+ * This module implements the `gitx blame` command which shows what revision
5
+ * and author last modified each line of a file. Features include:
6
+ * - Line-by-line attribution to commits and authors
7
+ * - Line range filtering
8
+ * - Rename tracking (-C flag)
9
+ * - Syntax highlighting support via Shiki
10
+ * - Binary file detection
11
+ *
12
+ * @module cli/commands/blame
13
+ *
14
+ * @example
15
+ * // Blame entire file
16
+ * const result = await getBlame(adapter, 'src/index.ts')
17
+ * for (const line of result.lines) {
18
+ * console.log(formatBlameLine(line))
19
+ * }
20
+ *
21
+ * @example
22
+ * // Blame specific line range
23
+ * const result = await getBlame(adapter, 'src/index.ts', { lineRange: '10,20' })
24
+ */
25
+ import { parseCommit, parseTree } from '../../types/objects';
26
+ // ============================================================================
27
+ // Helper Functions
28
+ // ============================================================================
29
+ const decoder = new TextDecoder();
30
+ /**
31
+ * Check if content is likely binary (contains null bytes)
32
+ */
33
+ function isBinaryContent(data) {
34
+ const checkLength = Math.min(data.length, 8000);
35
+ for (let i = 0; i < checkLength; i++) {
36
+ if (data[i] === 0)
37
+ return true;
38
+ }
39
+ return false;
40
+ }
41
+ /**
42
+ * Split content into lines
43
+ */
44
+ function splitLines(content) {
45
+ if (content === '')
46
+ return [];
47
+ const lines = content.split('\n');
48
+ if (lines.length > 0 && lines[lines.length - 1] === '') {
49
+ lines.pop();
50
+ }
51
+ return lines.map(line => line.replace(/\r$/, ''));
52
+ }
53
+ /**
54
+ * Get file extension from path
55
+ */
56
+ function getExtension(filePath) {
57
+ const lastDot = filePath.lastIndexOf('.');
58
+ if (lastDot === -1)
59
+ return '';
60
+ return filePath.slice(lastDot + 1).toLowerCase();
61
+ }
62
+ /**
63
+ * Map file extension to language name
64
+ */
65
+ function extensionToLanguage(ext) {
66
+ const mapping = {
67
+ 'js': 'javascript',
68
+ 'ts': 'typescript',
69
+ 'tsx': 'typescript',
70
+ 'jsx': 'javascript',
71
+ 'py': 'python',
72
+ 'rb': 'ruby',
73
+ 'go': 'go',
74
+ 'rs': 'rust',
75
+ 'java': 'java',
76
+ 'c': 'c',
77
+ 'cpp': 'cpp',
78
+ 'h': 'c',
79
+ 'hpp': 'cpp',
80
+ 'cs': 'csharp',
81
+ 'php': 'php',
82
+ 'sh': 'bash',
83
+ 'bash': 'bash',
84
+ 'zsh': 'bash',
85
+ 'json': 'json',
86
+ 'yaml': 'yaml',
87
+ 'yml': 'yaml',
88
+ 'md': 'markdown',
89
+ 'html': 'html',
90
+ 'css': 'css',
91
+ 'scss': 'scss',
92
+ 'sql': 'sql',
93
+ 'xml': 'xml'
94
+ };
95
+ return mapping[ext] || 'text';
96
+ }
97
+ /**
98
+ * Parse a commit object from raw data
99
+ */
100
+ function parseCommitObject(obj) {
101
+ // Build the full git object format: "commit <size>\0<data>"
102
+ const header = new TextEncoder().encode(`commit ${obj.data.length}\0`);
103
+ const fullData = new Uint8Array(header.length + obj.data.length);
104
+ fullData.set(header);
105
+ fullData.set(obj.data, header.length);
106
+ return parseCommit(fullData);
107
+ }
108
+ /**
109
+ * Parse a tree object from raw data
110
+ */
111
+ function parseTreeObject(obj) {
112
+ const header = new TextEncoder().encode(`tree ${obj.data.length}\0`);
113
+ const fullData = new Uint8Array(header.length + obj.data.length);
114
+ fullData.set(header);
115
+ fullData.set(obj.data, header.length);
116
+ return parseTree(fullData);
117
+ }
118
+ /**
119
+ * Get file content at a specific commit
120
+ */
121
+ async function getFileAtCommit(adapter, commitSha, filePath) {
122
+ const commitObj = await adapter.getObject(commitSha);
123
+ if (!commitObj || commitObj.type !== 'commit')
124
+ return null;
125
+ const commit = parseCommitObject(commitObj);
126
+ // Navigate through tree to find file
127
+ const pathParts = filePath.split('/');
128
+ let currentTreeSha = commit.tree;
129
+ for (let i = 0; i < pathParts.length; i++) {
130
+ const treeObj = await adapter.getObject(currentTreeSha);
131
+ if (!treeObj || treeObj.type !== 'tree')
132
+ return null;
133
+ const tree = parseTreeObject(treeObj);
134
+ const entry = tree.entries.find(e => e.name === pathParts[i]);
135
+ if (!entry)
136
+ return null;
137
+ if (i === pathParts.length - 1) {
138
+ // Final part - should be a blob
139
+ const blobObj = await adapter.getObject(entry.sha);
140
+ if (!blobObj || blobObj.type !== 'blob')
141
+ return null;
142
+ return blobObj.data;
143
+ }
144
+ else {
145
+ // Intermediate part - should be a tree
146
+ if (entry.mode !== '040000')
147
+ return null;
148
+ currentTreeSha = entry.sha;
149
+ }
150
+ }
151
+ return null;
152
+ }
153
+ /**
154
+ * Get the blob SHA for a file at a specific commit
155
+ */
156
+ async function getFileBlobSha(adapter, commitSha, filePath) {
157
+ const commitObj = await adapter.getObject(commitSha);
158
+ if (!commitObj || commitObj.type !== 'commit')
159
+ return null;
160
+ const commit = parseCommitObject(commitObj);
161
+ // Navigate through tree to find file
162
+ const pathParts = filePath.split('/');
163
+ let currentTreeSha = commit.tree;
164
+ for (let i = 0; i < pathParts.length; i++) {
165
+ const treeObj = await adapter.getObject(currentTreeSha);
166
+ if (!treeObj || treeObj.type !== 'tree')
167
+ return null;
168
+ const tree = parseTreeObject(treeObj);
169
+ const entry = tree.entries.find(e => e.name === pathParts[i]);
170
+ if (!entry)
171
+ return null;
172
+ if (i === pathParts.length - 1) {
173
+ return entry.sha;
174
+ }
175
+ else {
176
+ if (entry.mode !== '040000')
177
+ return null;
178
+ currentTreeSha = entry.sha;
179
+ }
180
+ }
181
+ return null;
182
+ }
183
+ /**
184
+ * Find a file in a commit tree by its blob SHA (for rename detection)
185
+ */
186
+ async function findFileByBlobSha(adapter, commitSha, targetBlobSha) {
187
+ const commitObj = await adapter.getObject(commitSha);
188
+ if (!commitObj || commitObj.type !== 'commit')
189
+ return null;
190
+ const commit = parseCommitObject(commitObj);
191
+ // Search tree for a file with the matching blob SHA
192
+ async function searchTree(treeSha, prefix) {
193
+ const treeObj = await adapter.getObject(treeSha);
194
+ if (!treeObj || treeObj.type !== 'tree')
195
+ return null;
196
+ const tree = parseTreeObject(treeObj);
197
+ for (const entry of tree.entries) {
198
+ const entryPath = prefix ? `${prefix}/${entry.name}` : entry.name;
199
+ if (entry.mode === '040000') {
200
+ // It's a directory - recurse
201
+ const found = await searchTree(entry.sha, entryPath);
202
+ if (found)
203
+ return found;
204
+ }
205
+ else {
206
+ // It's a file - check SHA
207
+ if (entry.sha === targetBlobSha) {
208
+ return entryPath;
209
+ }
210
+ }
211
+ }
212
+ return null;
213
+ }
214
+ return searchTree(commit.tree, '');
215
+ }
216
+ /**
217
+ * Compute line mapping between parent and child versions using LCS
218
+ */
219
+ function computeLineMapping(oldLines, newLines) {
220
+ const mapping = new Map();
221
+ const m = oldLines.length;
222
+ const n = newLines.length;
223
+ if (m === 0 || n === 0)
224
+ return mapping;
225
+ // Create LCS table
226
+ const dp = Array(m + 1).fill(null).map(() => Array(n + 1).fill(0));
227
+ for (let i = 1; i <= m; i++) {
228
+ for (let j = 1; j <= n; j++) {
229
+ if (oldLines[i - 1] === newLines[j - 1]) {
230
+ dp[i][j] = dp[i - 1][j - 1] + 1;
231
+ }
232
+ else {
233
+ dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
234
+ }
235
+ }
236
+ }
237
+ // Backtrack to find matching lines
238
+ let i = m, j = n;
239
+ while (i > 0 && j > 0) {
240
+ if (oldLines[i - 1] === newLines[j - 1]) {
241
+ mapping.set(i - 1, j - 1);
242
+ i--;
243
+ j--;
244
+ }
245
+ else if (dp[i - 1][j] > dp[i][j - 1]) {
246
+ i--;
247
+ }
248
+ else {
249
+ j--;
250
+ }
251
+ }
252
+ return mapping;
253
+ }
254
+ // ============================================================================
255
+ // Blame Command Implementation
256
+ // ============================================================================
257
+ /**
258
+ * Execute the blame command from the CLI.
259
+ *
260
+ * @description Parses command-line arguments and displays blame annotations
261
+ * for the specified file. This is the entry point for the `gitx blame` command.
262
+ *
263
+ * @param ctx - Command context containing cwd, args, options, and output functions
264
+ * @returns Promise that resolves when output is complete
265
+ * @throws {Error} Always throws "Not implemented" - command not yet implemented
266
+ *
267
+ * @example
268
+ * // CLI usage
269
+ * // gitx blame src/index.ts
270
+ * // gitx blame -L 10,20 src/index.ts
271
+ * // gitx blame -C src/renamed-file.ts
272
+ */
273
+ export async function blameCommand(ctx) {
274
+ throw new Error('Not implemented');
275
+ }
276
+ /**
277
+ * Get blame annotations for a file.
278
+ *
279
+ * @description Computes blame annotations for each line of a file by walking
280
+ * the commit history. For each line, identifies the commit and author that
281
+ * last modified it. Supports line range filtering and rename tracking.
282
+ *
283
+ * The algorithm:
284
+ * 1. Gets the current file content at HEAD
285
+ * 2. Initializes all lines as attributed to HEAD
286
+ * 3. Walks backward through commit history
287
+ * 4. Uses LCS (Longest Common Subsequence) to map lines between commits
288
+ * 5. Updates line attribution when a line exists in a parent commit
289
+ *
290
+ * @param adapter - Filesystem adapter for reading git objects
291
+ * @param filePath - Path to the file to blame (relative to repo root)
292
+ * @param options - Blame options for filtering and behavior
293
+ * @returns Promise resolving to blame result with line annotations
294
+ * @throws {Error} If file path contains null character
295
+ * @throws {Error} If HEAD cannot be resolved (empty repository)
296
+ * @throws {Error} If HEAD commit cannot be read
297
+ * @throws {Error} If file does not exist in repository
298
+ * @throws {Error} If line range is invalid (end before start, exceeds file length)
299
+ *
300
+ * @example
301
+ * // Blame entire file
302
+ * const result = await getBlame(adapter, 'src/index.ts')
303
+ * console.log(`File has ${result.lines.length} lines`)
304
+ *
305
+ * @example
306
+ * // Blame specific line range
307
+ * const result = await getBlame(adapter, 'src/index.ts', { lineRange: '10,20' })
308
+ *
309
+ * @example
310
+ * // Blame with rename tracking
311
+ * const result = await getBlame(adapter, 'src/new-name.ts', { followRenames: true })
312
+ * if (result.originalPath) {
313
+ * console.log(`File was renamed from ${result.originalPath}`)
314
+ * }
315
+ *
316
+ * @example
317
+ * // Handle binary files
318
+ * const result = await getBlame(adapter, 'assets/image.png')
319
+ * if (result.isBinary) {
320
+ * console.log(result.message) // "binary file - cannot show line-by-line blame"
321
+ * console.log(`Last modified by: ${result.fileCommit?.author}`)
322
+ * }
323
+ */
324
+ export async function getBlame(adapter, filePath, options = {}) {
325
+ // Validate file path
326
+ if (filePath.includes('\0')) {
327
+ throw new Error('Invalid file path: contains null character');
328
+ }
329
+ // Resolve HEAD to get current commit
330
+ const headResolved = await adapter.resolveRef('HEAD');
331
+ if (!headResolved) {
332
+ throw new Error('Cannot resolve HEAD: repository may be empty');
333
+ }
334
+ const headCommitSha = headResolved.sha;
335
+ // Get the commit object
336
+ const commitObj = await adapter.getObject(headCommitSha);
337
+ if (!commitObj || commitObj.type !== 'commit') {
338
+ throw new Error(`Cannot read HEAD commit: ${headCommitSha}`);
339
+ }
340
+ const headCommit = parseCommitObject(commitObj);
341
+ // Get file content at HEAD
342
+ const fileContent = await getFileAtCommit(adapter, headCommitSha, filePath);
343
+ if (fileContent === null) {
344
+ throw new Error(`File not found: ${filePath} does not exist in repository`);
345
+ }
346
+ // Check for binary file
347
+ if (isBinaryContent(fileContent)) {
348
+ return {
349
+ path: filePath,
350
+ lines: [],
351
+ isBinary: true,
352
+ message: 'binary file - cannot show line-by-line blame',
353
+ fileCommit: {
354
+ sha: headCommitSha,
355
+ author: headCommit.author.name,
356
+ date: new Date(headCommit.author.timestamp * 1000)
357
+ }
358
+ };
359
+ }
360
+ // Parse file content
361
+ const contentStr = decoder.decode(fileContent);
362
+ const lines = splitLines(contentStr);
363
+ // Handle empty file
364
+ if (lines.length === 0) {
365
+ return {
366
+ path: filePath,
367
+ lines: [],
368
+ isBinary: false
369
+ };
370
+ }
371
+ // Parse and validate line range
372
+ let startLine = 1;
373
+ let endLine = lines.length;
374
+ if (options.lineRange) {
375
+ const range = parseLineRange(options.lineRange);
376
+ if (range.end < range.start) {
377
+ throw new Error(`Invalid line range: end (${range.end}) is before start (${range.start})`);
378
+ }
379
+ if (range.end > lines.length) {
380
+ throw new Error(`Invalid line range: end (${range.end}) exceeds file length (${lines.length})`);
381
+ }
382
+ startLine = range.start;
383
+ endLine = range.end;
384
+ }
385
+ // Initialize blame info for each line
386
+ const blameInfo = lines.map((content, idx) => ({
387
+ commitSha: headCommitSha,
388
+ shortSha: headCommitSha.substring(0, 8),
389
+ author: headCommit.author.name,
390
+ authorEmail: headCommit.author.email,
391
+ date: new Date(headCommit.author.timestamp * 1000),
392
+ lineNumber: idx + 1,
393
+ originalLineNumber: idx + 1,
394
+ content
395
+ }));
396
+ // Track rename history
397
+ let currentPath = filePath;
398
+ let originalPathFound;
399
+ // Walk through commit history to attribute lines
400
+ const commitQueue = [];
401
+ // Initialize with HEAD's parents
402
+ if (headCommit.parents.length > 0) {
403
+ const identityMapping = new Map();
404
+ for (let i = 0; i < lines.length; i++) {
405
+ identityMapping.set(i, i);
406
+ }
407
+ for (const parentSha of headCommit.parents) {
408
+ commitQueue.push({
409
+ sha: parentSha,
410
+ lines: lines,
411
+ path: currentPath,
412
+ lineMapping: identityMapping,
413
+ childSha: headCommitSha
414
+ });
415
+ }
416
+ }
417
+ const visitedCommits = new Set();
418
+ visitedCommits.add(headCommitSha);
419
+ while (commitQueue.length > 0) {
420
+ const item = commitQueue.shift();
421
+ const { sha: parentSha, lines: childLines, path: childPath, lineMapping: childToOriginal, childSha } = item;
422
+ if (visitedCommits.has(parentSha))
423
+ continue;
424
+ visitedCommits.add(parentSha);
425
+ // Get parent commit
426
+ const parentCommitObj = await adapter.getObject(parentSha);
427
+ if (!parentCommitObj || parentCommitObj.type !== 'commit')
428
+ continue;
429
+ const parentCommit = parseCommitObject(parentCommitObj);
430
+ // Check for renames if followRenames is enabled
431
+ let pathInParent = childPath;
432
+ if (options.followRenames) {
433
+ // Check if file exists at current path in parent
434
+ const contentAtPath = await getFileAtCommit(adapter, parentSha, childPath);
435
+ if (contentAtPath === null) {
436
+ // File doesn't exist at this path - try to find it by blob SHA (rename detection)
437
+ const childBlobSha = await getFileBlobSha(adapter, childSha, childPath);
438
+ if (childBlobSha) {
439
+ const renamedPath = await findFileByBlobSha(adapter, parentSha, childBlobSha);
440
+ if (renamedPath) {
441
+ pathInParent = renamedPath;
442
+ if (!originalPathFound)
443
+ originalPathFound = renamedPath;
444
+ }
445
+ }
446
+ }
447
+ }
448
+ // Get parent file content
449
+ const parentContent = await getFileAtCommit(adapter, parentSha, pathInParent);
450
+ if (!parentContent) {
451
+ // File doesn't exist in parent - all remaining lines are from child commit
452
+ continue;
453
+ }
454
+ if (isBinaryContent(parentContent))
455
+ continue;
456
+ const parentContentStr = decoder.decode(parentContent);
457
+ const parentLines = splitLines(parentContentStr);
458
+ // Compute line mapping between parent and child
459
+ const mapping = computeLineMapping(parentLines, childLines);
460
+ // Update blame for lines that came from parent
461
+ for (const [parentIdx, childIdx] of mapping) {
462
+ for (const [origIdx, mappedChildIdx] of childToOriginal) {
463
+ if (mappedChildIdx === childIdx) {
464
+ // This line exists in parent - attribute to parent
465
+ blameInfo[origIdx].commitSha = parentSha;
466
+ blameInfo[origIdx].shortSha = parentSha.substring(0, 8);
467
+ blameInfo[origIdx].author = parentCommit.author.name;
468
+ blameInfo[origIdx].authorEmail = parentCommit.author.email;
469
+ blameInfo[origIdx].date = new Date(parentCommit.author.timestamp * 1000);
470
+ blameInfo[origIdx].originalLineNumber = parentIdx + 1;
471
+ // Track original path when following renames
472
+ if (pathInParent !== childPath) {
473
+ blameInfo[origIdx].originalPath = pathInParent;
474
+ }
475
+ }
476
+ }
477
+ }
478
+ // Build new mapping from original indices to parent indices
479
+ const newMapping = new Map();
480
+ for (const [origIdx, childIdx] of childToOriginal) {
481
+ for (const [parentIdx, mappedChildIdx] of mapping) {
482
+ if (mappedChildIdx === childIdx) {
483
+ newMapping.set(origIdx, parentIdx);
484
+ break;
485
+ }
486
+ }
487
+ }
488
+ // Add parent's parents to queue
489
+ if (parentCommit.parents.length > 0 && newMapping.size > 0) {
490
+ for (const grandparentSha of parentCommit.parents) {
491
+ commitQueue.push({
492
+ sha: grandparentSha,
493
+ lines: parentLines,
494
+ path: pathInParent,
495
+ lineMapping: newMapping,
496
+ childSha: parentSha
497
+ });
498
+ }
499
+ }
500
+ }
501
+ // Filter to requested line range
502
+ let resultLines = blameInfo;
503
+ if (options.lineRange) {
504
+ resultLines = blameInfo.filter(l => l.lineNumber >= startLine && l.lineNumber <= endLine);
505
+ }
506
+ // Build result
507
+ const result = {
508
+ path: filePath,
509
+ lines: resultLines,
510
+ isBinary: false
511
+ };
512
+ // Add original path if found through rename tracking
513
+ if (originalPathFound) {
514
+ result.originalPath = originalPathFound;
515
+ }
516
+ // Handle syntax highlighting
517
+ if (options.highlight) {
518
+ const ext = getExtension(filePath);
519
+ const language = extensionToLanguage(ext);
520
+ result.language = language;
521
+ result.theme = options.theme || 'github-dark';
522
+ result.highlighted = resultLines.map(l => l.content); // Placeholder - actual highlighting would use Shiki
523
+ }
524
+ return result;
525
+ }
526
+ /**
527
+ * Format a blame line annotation for display.
528
+ *
529
+ * @description Formats a single blame line in a human-readable format similar
530
+ * to git blame output: `<sha> (<author> <date>) <content>`
531
+ *
532
+ * @param annotation - The blame line annotation to format
533
+ * @param options - Formatting options
534
+ * @param options.showOriginalLineNumber - If true, shows both original and current line numbers
535
+ * @returns Formatted string for display
536
+ *
537
+ * @example
538
+ * const formatted = formatBlameLine(annotation)
539
+ * // Output: "abc12345 (John Doe 2024-01-15) const x = 1"
540
+ *
541
+ * @example
542
+ * // With original line numbers (for renamed files)
543
+ * const formatted = formatBlameLine(annotation, { showOriginalLineNumber: true })
544
+ * // Output: "abc12345 (John Doe 2024-01-15 10 12) const x = 1"
545
+ */
546
+ export function formatBlameLine(annotation, options = {}) {
547
+ const { shortSha, author, date, lineNumber, originalLineNumber, content } = annotation;
548
+ // Format date as YYYY-MM-DD or similar
549
+ const dateStr = date.toISOString().substring(0, 10);
550
+ // Pad author to fixed width
551
+ const authorStr = author.padEnd(15).substring(0, 15);
552
+ let result = `${shortSha} (${authorStr} ${dateStr}`;
553
+ if (options.showOriginalLineNumber) {
554
+ result += ` ${originalLineNumber.toString().padStart(4)} ${lineNumber.toString().padStart(4)}`;
555
+ }
556
+ result += `) ${content}`;
557
+ return result;
558
+ }
559
+ /**
560
+ * Parse a line range string into start and end values.
561
+ *
562
+ * @description Parses line range specifications used with the -L flag.
563
+ * Supports two formats:
564
+ * - Absolute: "start,end" (e.g., "10,20" for lines 10-20)
565
+ * - Relative: "start,+count" (e.g., "10,+5" for lines 10-15)
566
+ *
567
+ * @param rangeStr - Line range string in "start,end" or "start,+count" format
568
+ * @returns Parsed line range with start and end (1-indexed, inclusive)
569
+ * @throws {Error} If format is invalid (not two comma-separated values)
570
+ * @throws {Error} If start line is not a valid number
571
+ * @throws {Error} If end line or offset is not a valid number
572
+ *
573
+ * @example
574
+ * // Absolute range
575
+ * const range = parseLineRange('10,20')
576
+ * console.log(range) // { start: 10, end: 20 }
577
+ *
578
+ * @example
579
+ * // Relative range
580
+ * const range = parseLineRange('10,+5')
581
+ * console.log(range) // { start: 10, end: 15 }
582
+ */
583
+ export function parseLineRange(rangeStr) {
584
+ const parts = rangeStr.split(',');
585
+ if (parts.length !== 2) {
586
+ throw new Error(`Invalid line range format: ${rangeStr}`);
587
+ }
588
+ const start = parseInt(parts[0], 10);
589
+ if (isNaN(start)) {
590
+ throw new Error(`Invalid start line: ${parts[0]}`);
591
+ }
592
+ let end;
593
+ if (parts[1].startsWith('+')) {
594
+ // Relative offset: start + offset
595
+ const offset = parseInt(parts[1].slice(1), 10);
596
+ if (isNaN(offset)) {
597
+ throw new Error(`Invalid line offset: ${parts[1]}`);
598
+ }
599
+ end = start + offset;
600
+ }
601
+ else {
602
+ end = parseInt(parts[1], 10);
603
+ if (isNaN(end)) {
604
+ throw new Error(`Invalid end line: ${parts[1]}`);
605
+ }
606
+ }
607
+ return { start, end };
608
+ }
609
+ //# sourceMappingURL=blame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blame.js","sourceRoot":"","sources":["../../../src/cli/commands/blame.ts"],"names":[],"mappings":"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"}