difit 4.0.2 → 4.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 (110) hide show
  1. package/README.ja.md +1 -0
  2. package/README.ko.md +1 -0
  3. package/README.md +1 -0
  4. package/README.zh.md +1 -0
  5. package/dist/cli/index.js +38 -28
  6. package/dist/cli/index.test.js +162 -77
  7. package/dist/client/assets/architecture-PBZL5I3N-DUNTzy9d.js +1 -0
  8. package/dist/client/assets/{architectureDiagram-2XIMDMQ5-CXJTJFYJ.js → architectureDiagram-2XIMDMQ5-BOmef_aT.js} +1 -1
  9. package/dist/client/assets/{blockDiagram-WCTKOSBZ-B60owdAn.js → blockDiagram-WCTKOSBZ-CuovjbLp.js} +1 -1
  10. package/dist/client/assets/{c4Diagram-IC4MRINW-4tg2D_Vt.js → c4Diagram-IC4MRINW-l2hgU0UG.js} +1 -1
  11. package/dist/client/assets/channel-BBMOf_Bn.js +1 -0
  12. package/dist/client/assets/{chunk-4BX2VUAB-CW45MZFx.js → chunk-4BX2VUAB-Bh2XMPGo.js} +1 -1
  13. package/dist/client/assets/{chunk-55IACEB6-Busc3sfI.js → chunk-55IACEB6-r9BRoqNs.js} +1 -1
  14. package/dist/client/assets/{chunk-7E7YKBS2-BVR-8Pma.js → chunk-7E7YKBS2-BUy3or4g.js} +1 -1
  15. package/dist/client/assets/{chunk-7R4GIKGN-DneC7PwP.js → chunk-7R4GIKGN-C7ClNgvP.js} +1 -1
  16. package/dist/client/assets/{chunk-C72U2L5F-CJr98gus.js → chunk-C72U2L5F-_P9RrDdo.js} +1 -1
  17. package/dist/client/assets/{chunk-EGIJ26TM-iD_CSqpR.js → chunk-EGIJ26TM-D-xQ2sZ-.js} +1 -1
  18. package/dist/client/assets/{chunk-FMBD7UC4-BSsJVlRg.js → chunk-FMBD7UC4-OuP8NjEM.js} +1 -1
  19. package/dist/client/assets/{chunk-GEFDOKGD-eDUrsRgt.js → chunk-GEFDOKGD-noJ9o8LM.js} +1 -1
  20. package/dist/client/assets/chunk-GLR3WWYH-DVK9OjRZ.js +2 -0
  21. package/dist/client/assets/chunk-HHEYEP7N-C1QyKuQs.js +1 -0
  22. package/dist/client/assets/{chunk-JSJVCQXG-UCJub_Eo.js → chunk-JSJVCQXG-2AjhqYcu.js} +1 -1
  23. package/dist/client/assets/{chunk-KX2RTZJC-DrhxxMOx.js → chunk-KX2RTZJC-tMPTaDcx.js} +1 -1
  24. package/dist/client/assets/{chunk-KYZI473N-Brv52ZeO.js → chunk-KYZI473N-CGwu81pT.js} +1 -1
  25. package/dist/client/assets/{chunk-L3YUKLVL-BkBigLhQ.js → chunk-L3YUKLVL-DFNfIVVw.js} +1 -1
  26. package/dist/client/assets/{chunk-MX3YWQON-DHRoNbgW.js → chunk-MX3YWQON-BnSlIBhe.js} +1 -1
  27. package/dist/client/assets/{chunk-NQ4KR5QH-BZ86r2qK.js → chunk-NQ4KR5QH-CpfTlpaZ.js} +1 -1
  28. package/dist/client/assets/{chunk-O4XLMI2P-Sr33dk8c.js → chunk-O4XLMI2P-BDGKGscp.js} +1 -1
  29. package/dist/client/assets/{chunk-OZEHJAEY-3F2ff7sj.js → chunk-OZEHJAEY-3OAEqm17.js} +1 -1
  30. package/dist/client/assets/{chunk-PQ6SQG4A-C9acTu_E.js → chunk-PQ6SQG4A-DfQjNfPX.js} +1 -1
  31. package/dist/client/assets/{chunk-PU5JKC2W-PQmA4K_y.js → chunk-PU5JKC2W-DRiL1iN6.js} +1 -1
  32. package/dist/client/assets/chunk-QZHKN3VN-DBD5yPlw.js +1 -0
  33. package/dist/client/assets/{chunk-R5LLSJPH-ChexuO_S.js → chunk-R5LLSJPH-dkcbq1pR.js} +1 -1
  34. package/dist/client/assets/{chunk-WL4C6EOR-oxNV_hhM.js → chunk-WL4C6EOR-BeCB6d6F.js} +1 -1
  35. package/dist/client/assets/{chunk-XIRO2GV7-C9gOnffv.js → chunk-XIRO2GV7-BxmEO1Vi.js} +1 -1
  36. package/dist/client/assets/{chunk-XPW4576I-CcqR6BsE.js → chunk-XPW4576I-jm7TiixU.js} +1 -1
  37. package/dist/client/assets/{chunk-XZSTWKYB-C5JJ0TZR.js → chunk-XZSTWKYB-BGKYCy46.js} +1 -1
  38. package/dist/client/assets/{chunk-YBOYWFTD-B6kAkNgH.js → chunk-YBOYWFTD-C9faLjdm.js} +1 -1
  39. package/dist/client/assets/classDiagram-VBA2DB6C-Depk8rxx.js +1 -0
  40. package/dist/client/assets/classDiagram-v2-RAHNMMFH-DHvQPm8y.js +1 -0
  41. package/dist/client/assets/{cose-bilkent-S5V4N54A-hlDud6Ym.js → cose-bilkent-S5V4N54A-BWD5TWFn.js} +1 -1
  42. package/dist/client/assets/{dagre-BwDYerGQ.js → dagre-Dd1VxucU.js} +1 -1
  43. package/dist/client/assets/{dagre-KLK3FWXG-KnkMUlUE.js → dagre-KLK3FWXG-BJFTyMud.js} +1 -1
  44. package/dist/client/assets/{diagram-E7M64L7V-DcTCIFUG.js → diagram-E7M64L7V-eWdHIl72.js} +1 -1
  45. package/dist/client/assets/{diagram-IFDJBPK2-COcDQunj.js → diagram-IFDJBPK2-C1-sqK0o.js} +1 -1
  46. package/dist/client/assets/{diagram-P4PSJMXO-DmgET9pD.js → diagram-P4PSJMXO-DHeUNvSg.js} +1 -1
  47. package/dist/client/assets/{dist-v55TM3-O.js → dist-FLbYR5UU.js} +1 -1
  48. package/dist/client/assets/{erDiagram-INFDFZHY-ByL02DP-.js → erDiagram-INFDFZHY-CX8FAWmU.js} +1 -1
  49. package/dist/client/assets/{flowDiagram-PKNHOUZH-CW-lseYE.js → flowDiagram-PKNHOUZH-DgBnUaHH.js} +1 -1
  50. package/dist/client/assets/{ganttDiagram-A5KZAMGK-BxLjKRld.js → ganttDiagram-A5KZAMGK-C331HQ-y.js} +1 -1
  51. package/dist/client/assets/gitGraph-HDMCJU4V-DPGoIMlm.js +1 -0
  52. package/dist/client/assets/{gitGraphDiagram-K3NZZRJ6-DLEDjokx.js → gitGraphDiagram-K3NZZRJ6-zEXLThxN.js} +1 -1
  53. package/dist/client/assets/index-BGPkswtu.js +79 -0
  54. package/dist/client/assets/{index-Cn4K2uvR.css → index-Cq_APK7Y.css} +1 -1
  55. package/dist/client/assets/info-3K5VOQVL-CYdIfRwG.js +1 -0
  56. package/dist/client/assets/{infoDiagram-LFFYTUFH-CnmYkyCb.js → infoDiagram-LFFYTUFH-CKx11_2a.js} +1 -1
  57. package/dist/client/assets/{ishikawaDiagram-PHBUUO56-zycn1mVK.js → ishikawaDiagram-PHBUUO56-BlZMQgOe.js} +1 -1
  58. package/dist/client/assets/{journeyDiagram-4ABVD52K-aRoH36nV.js → journeyDiagram-4ABVD52K-C3p_p4rn.js} +1 -1
  59. package/dist/client/assets/{kanban-definition-K7BYSVSG-BGtGv5yb.js → kanban-definition-K7BYSVSG-4XJPQF50.js} +1 -1
  60. package/dist/client/assets/{line-Cm3ZuldI.js → line-Bb6xn3n_.js} +1 -1
  61. package/dist/client/assets/{linear-HJOLPv7E.js → linear-BPttYRJr.js} +1 -1
  62. package/dist/client/assets/{mermaid-parser.core-BvMqHn4b.js → mermaid-parser.core-CjY9NqXx.js} +2 -2
  63. package/dist/client/assets/{mermaid.core-C4SvQTx9.js → mermaid.core-B0ynITdC.js} +3 -3
  64. package/dist/client/assets/{mindmap-definition-YRQLILUH-B8jMe7ir.js → mindmap-definition-YRQLILUH-Dya2e4tr.js} +1 -1
  65. package/dist/client/assets/packet-RMMSAZCW-D7vTTuAT.js +1 -0
  66. package/dist/client/assets/pie-UPGHQEXC-ptFuye_f.js +1 -0
  67. package/dist/client/assets/{pieDiagram-SKSYHLDU-CGWbtgxq.js → pieDiagram-SKSYHLDU-MZ74L9cN.js} +1 -1
  68. package/dist/client/assets/{quadrantDiagram-337W2JSQ-CQ1QKsru.js → quadrantDiagram-337W2JSQ-Da_T39nG.js} +1 -1
  69. package/dist/client/assets/radar-KQ55EAFF-BR1_ZPLF.js +1 -0
  70. package/dist/client/assets/{requirementDiagram-Z7DCOOCP-Co1LyL5T.js → requirementDiagram-Z7DCOOCP-DzlKWGt3.js} +1 -1
  71. package/dist/client/assets/{sankeyDiagram-WA2Y5GQK-BQVbT6bS.js → sankeyDiagram-WA2Y5GQK-BPketwK-.js} +1 -1
  72. package/dist/client/assets/{sequenceDiagram-2WXFIKYE-DGIEkdPm.js → sequenceDiagram-2WXFIKYE-geDrMLZ_.js} +1 -1
  73. package/dist/client/assets/{src-DsmFf7gO.js → src-BuTVwZtT.js} +1 -1
  74. package/dist/client/assets/{stateDiagram-RAJIS63D-DgjKbXnG.js → stateDiagram-RAJIS63D-DOLTjnid.js} +1 -1
  75. package/dist/client/assets/stateDiagram-v2-FVOUBMTO-BIjVI5d6.js +1 -0
  76. package/dist/client/assets/{timeline-definition-YZTLITO2-Dz2dVWjY.js → timeline-definition-YZTLITO2-Cy6Qm4Pd.js} +1 -1
  77. package/dist/client/assets/treemap-KZPCXAKY-Bw93Vsua.js +1 -0
  78. package/dist/client/assets/{vennDiagram-LZ73GAT5-IIH5S1B6.js → vennDiagram-LZ73GAT5-UUQN9akd.js} +1 -1
  79. package/dist/client/assets/{xychartDiagram-JWTSCODW-DeYZhM2j.js → xychartDiagram-JWTSCODW-DiTicxdS.js} +1 -1
  80. package/dist/client/index.html +2 -2
  81. package/dist/server/git-diff-tui.d.ts +2 -2
  82. package/dist/server/git-diff-tui.js +12 -7
  83. package/dist/server/git-diff-tui.test.js +18 -2
  84. package/dist/server/git-diff.d.ts +3 -2
  85. package/dist/server/git-diff.js +29 -6
  86. package/dist/server/git-diff.test.js +52 -3
  87. package/dist/server/server.d.ts +2 -3
  88. package/dist/server/server.js +80 -55
  89. package/dist/server/server.test.js +110 -60
  90. package/dist/tui/App.d.ts +2 -2
  91. package/dist/tui/App.js +4 -3
  92. package/dist/types/diff.d.ts +8 -0
  93. package/dist/utils/diffSelection.d.ts +6 -0
  94. package/dist/utils/diffSelection.js +30 -0
  95. package/package.json +1 -1
  96. package/dist/client/assets/architecture-PBZL5I3N-DFdrPtRG.js +0 -1
  97. package/dist/client/assets/channel-DogeU0Wo.js +0 -1
  98. package/dist/client/assets/chunk-GLR3WWYH-NUOKNaxd.js +0 -2
  99. package/dist/client/assets/chunk-HHEYEP7N-DhuxpkmW.js +0 -1
  100. package/dist/client/assets/chunk-QZHKN3VN-DMRW-mur.js +0 -1
  101. package/dist/client/assets/classDiagram-VBA2DB6C-DlDUg6JI.js +0 -1
  102. package/dist/client/assets/classDiagram-v2-RAHNMMFH-BxzJfV1S.js +0 -1
  103. package/dist/client/assets/gitGraph-HDMCJU4V-CjAGJiCH.js +0 -1
  104. package/dist/client/assets/index-CizZxdOT.js +0 -79
  105. package/dist/client/assets/info-3K5VOQVL-CB6KpH1K.js +0 -1
  106. package/dist/client/assets/packet-RMMSAZCW-CzbC-tXD.js +0 -1
  107. package/dist/client/assets/pie-UPGHQEXC-CmhYIo8p.js +0 -1
  108. package/dist/client/assets/radar-KQ55EAFF-BCa9lsCc.js +0 -1
  109. package/dist/client/assets/stateDiagram-v2-FVOUBMTO-gPrpjL74.js +0 -1
  110. package/dist/client/assets/treemap-KZPCXAKY-DXiPfAB6.js +0 -1
package/README.ja.md CHANGED
@@ -140,6 +140,7 @@ git diff --cached | difit -
140
140
  | --------------------- | --------------- | ------------------------------------------------------------------------------------------ |
141
141
  | `<target>` | HEAD | コミットハッシュ、タグ、HEAD~n、ブランチ、または特別な引数 |
142
142
  | `[compare-with]` | - | 比較対象の2番目のコミット(2つの間のdiffを表示) |
143
+ | `--merge-base` | false | diff 計算前に `git merge-base` で基準側を解決する(Git revision モード専用) |
143
144
  | `--pr <url>` | - | レビューするGitHub PRのURL(例:https://github.com/owner/repo/pull/123) |
144
145
  | `--comment <json>` | - | 起動時に初期コメントを注入(複数指定可。JSON object または array を受け付ける) |
145
146
  | `--port` | 4966 | 優先ポート。使用中の場合は+1にフォールバック |
package/README.ko.md CHANGED
@@ -140,6 +140,7 @@ git diff --cached | difit -
140
140
  | --------------------- | -------------- | --------------------------------------------------------------------------------------------- |
141
141
  | `<target>` | HEAD | 커밋 해시, 태그, HEAD~n, 브랜치 또는 특수 인수 |
142
142
  | `[compare-with]` | - | 비교할 선택적 두 번째 커밋 (둘 사이의 diff 표시) |
143
+ | `--merge-base` | false | diff 전에 `git merge-base` 로 기준 쪽을 해석 (Git revision 모드 전용) |
143
144
  | `--pr <url>` | - | 검토할 GitHub PR URL (예: https://github.com/owner/repo/pull/123) |
144
145
  | `--comment <json>` | - | 초기 코멘트 주입 (반복 가능; JSON object 또는 array 허용) |
145
146
  | `--port` | 4966 | 선호 포트; 사용 중인 경우 +1로 대체 |
package/README.md CHANGED
@@ -140,6 +140,7 @@ Stdin mode is selected with intent-first rules:
140
140
  | --------------------- | --------------- | ------------------------------------------------------------------------------------------------------- |
141
141
  | `<target>` | HEAD | Commit hash, tag, HEAD~n, branch, or special arguments |
142
142
  | `[compare-with]` | - | Optional second commit to compare with (shows diff between the two) |
143
+ | `--merge-base` | false | Resolve the base revision with `git merge-base` before diffing (Git revision mode only) |
143
144
  | `--pr <url>` | - | GitHub PR URL to review (e.g., https://github.com/owner/repo/pull/123) |
144
145
  | `--comment <json>` | - | Inject initial comments (repeatable; accepts a JSON object or array) |
145
146
  | `--port` | 4966 | Preferred port; falls back to +1 if occupied |
package/README.zh.md CHANGED
@@ -140,6 +140,7 @@ git diff --cached | difit -
140
140
  | --------------------- | -------------- | --------------------------------------------------------------------------------- |
141
141
  | `<target>` | HEAD | 提交哈希、标签、HEAD~n、分支或特殊参数 |
142
142
  | `[compare-with]` | - | 要比较的可选第二个提交(显示两者之间的差异) |
143
+ | `--merge-base` | false | 在 diff 前先用 `git merge-base` 解析基准 revision(仅限 Git revision 模式) |
143
144
  | `--pr <url>` | - | 要审查的 GitHub PR URL(例如:https://github.com/owner/repo/pull/123) |
144
145
  | `--comment <json>` | - | 注入初始评论(可重复指定;接受 JSON object 或 array) |
145
146
  | `--port` | 4966 | 首选端口;如果被占用则回退到 +1 |
package/dist/cli/index.js CHANGED
@@ -4,6 +4,7 @@ import React from 'react';
4
4
  import { simpleGit } from 'simple-git';
5
5
  import pkg from '../../package.json' with { type: 'json' };
6
6
  import { startServer } from '../server/server.js';
7
+ import { createDiffSelection } from '../utils/diffSelection.js';
7
8
  import { DiffMode } from '../types/watch.js';
8
9
  import { DEFAULT_DIFF_VIEW_MODE, normalizeDiffViewMode } from '../utils/diffMode.js';
9
10
  import { shouldReadStdin, findUntrackedFiles, markFilesIntentToAdd, promptUser, parseCommentOptions, validateDiffArguments, getGitRoot, } from './utils.js';
@@ -12,7 +13,24 @@ import { warnAboutTuiDeprecation } from './tuiDeprecation.js';
12
13
  function isSpecialArg(arg) {
13
14
  return arg === 'working' || arg === 'staged' || arg === '.';
14
15
  }
15
- function determineDiffMode(targetCommitish, compareWith) {
16
+ function resolveDiffSelection(commitish, compareWith, mergeBase) {
17
+ let baseCommitish;
18
+ if (compareWith) {
19
+ baseCommitish = compareWith;
20
+ }
21
+ else if (commitish === 'working') {
22
+ baseCommitish = 'staged';
23
+ }
24
+ else if (isSpecialArg(commitish)) {
25
+ baseCommitish = 'HEAD';
26
+ }
27
+ else {
28
+ baseCommitish = commitish + '^';
29
+ }
30
+ return createDiffSelection(baseCommitish, commitish, mergeBase ? 'merge-base' : undefined);
31
+ }
32
+ function determineDiffMode(selection, compareWith) {
33
+ const { targetCommitish } = selection;
16
34
  // If comparing specific commits/branches (not involving HEAD), no watching needed
17
35
  // Exception: allow watching when targetCommitish is '.' even with compareWith
18
36
  if (compareWith && targetCommitish !== 'HEAD' && targetCommitish !== '.') {
@@ -48,6 +66,7 @@ program
48
66
  .option('--include-untracked', 'automatically include untracked files in diff')
49
67
  .option('--keep-alive', 'keep server running even after browser disconnects')
50
68
  .option('--context <lines>', 'number of context lines shown around each change', parseInt)
69
+ .option('--merge-base', 'resolve the base revision with git merge-base before diffing (Git revision mode only)')
51
70
  .action(async (commitish, compareWith, options) => {
52
71
  try {
53
72
  let stdinDiff;
@@ -72,6 +91,10 @@ program
72
91
  console.error('Error: --pr option cannot be used with positional arguments');
73
92
  process.exit(1);
74
93
  }
94
+ if (options.mergeBase) {
95
+ console.error('Error: --merge-base option cannot be used with --pr');
96
+ process.exit(1);
97
+ }
75
98
  if (options.tui) {
76
99
  console.error('Error: --pr option cannot be used with --tui');
77
100
  process.exit(1);
@@ -109,6 +132,10 @@ program
109
132
  console.error('Error: --context option cannot be used with stdin diff');
110
133
  process.exit(1);
111
134
  }
135
+ if (options.mergeBase) {
136
+ console.error('Error: --merge-base option cannot be used with stdin diff');
137
+ process.exit(1);
138
+ }
112
139
  // Read unified diff from stdin
113
140
  stdinDiff = await readStdin();
114
141
  if (!stdinDiff.trim()) {
@@ -146,27 +173,12 @@ program
146
173
  // If not in a git repository, fall back to process.cwd()
147
174
  repoPath = undefined;
148
175
  }
149
- // Determine target and base commitish
150
- let targetCommitish = commitish;
151
- let baseCommitish;
152
- if (compareWith) {
153
- // If compareWith is provided, use it as base
154
- baseCommitish = compareWith;
155
- }
156
- else {
157
- // Handle special arguments
158
- if (commitish === 'working') {
159
- // working compares working directory with staging area
160
- baseCommitish = 'staged';
161
- }
162
- else if (isSpecialArg(commitish)) {
163
- baseCommitish = 'HEAD';
164
- }
165
- else {
166
- baseCommitish = commitish + '^';
167
- }
176
+ const selection = resolveDiffSelection(commitish, compareWith, options.mergeBase);
177
+ if (options.mergeBase && isSpecialArg(selection.baseCommitish)) {
178
+ console.error(`Error: --merge-base requires a commit-ish base, but resolved base was "${selection.baseCommitish}"`);
179
+ process.exit(1);
168
180
  }
169
- if (commitish === 'working' || commitish === '.') {
181
+ if (selection.targetCommitish === 'working' || selection.targetCommitish === '.') {
170
182
  const git = simpleGit(repoPath);
171
183
  await handleUntrackedFiles(git, options.includeUntracked);
172
184
  }
@@ -186,22 +198,20 @@ program
186
198
  const { render } = await import('ink');
187
199
  const { default: TuiApp } = await import('../tui/App.js');
188
200
  render(React.createElement(TuiApp, {
189
- targetCommitish,
190
- baseCommitish,
201
+ selection,
191
202
  mode: options.mode,
192
203
  repoPath,
193
204
  contextLines: options.context,
194
205
  }));
195
206
  return;
196
207
  }
197
- const validation = validateDiffArguments(targetCommitish, compareWith);
208
+ const validation = validateDiffArguments(selection.targetCommitish, compareWith);
198
209
  if (!validation.valid) {
199
210
  console.error(`Error: ${validation.error}`);
200
211
  process.exit(1);
201
212
  }
202
213
  const { url, port, isEmpty } = await startServer({
203
- targetCommitish,
204
- baseCommitish,
214
+ selection,
205
215
  preferredPort: options.port,
206
216
  host: options.host,
207
217
  openBrowser: options.open,
@@ -209,12 +219,12 @@ program
209
219
  clearComments: options.clean,
210
220
  keepAlive: options.keepAlive,
211
221
  contextLines: options.context,
212
- diffMode: determineDiffMode(targetCommitish, compareWith),
222
+ diffMode: determineDiffMode(selection, compareWith),
213
223
  repoPath,
214
224
  ...(commentImports.length > 0 ? { commentImports } : {}),
215
225
  });
216
226
  console.log(`\n🚀 difit server started on ${url}`);
217
- console.log(`📋 Reviewing: ${targetCommitish}`);
227
+ console.log(`📋 Reviewing: ${selection.targetCommitish}`);
218
228
  if (options.keepAlive) {
219
229
  console.log('🔒 Keep-alive mode: server will stay running after browser disconnects');
220
230
  }