difit 4.0.0 → 4.0.2

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 (199) hide show
  1. package/README.ja.md +15 -14
  2. package/README.ko.md +15 -14
  3. package/README.md +15 -14
  4. package/README.zh.md +15 -14
  5. package/dist/cli/index.js +18 -0
  6. package/dist/cli/index.test.js +148 -38
  7. package/dist/cli/tuiDeprecation.d.ts +3 -0
  8. package/dist/cli/tuiDeprecation.js +16 -0
  9. package/dist/cli/tuiDeprecation.test.d.ts +1 -0
  10. package/dist/cli/tuiDeprecation.test.js +16 -0
  11. package/dist/cli/utils.d.ts +1 -0
  12. package/dist/cli/utils.js +17 -0
  13. package/dist/client/assets/_basePickBy-hOr-yGsE.js +1 -0
  14. package/dist/client/assets/_baseUniq-b7bzdUSn.js +1 -0
  15. package/dist/client/assets/arc-D65wG9gm.js +1 -0
  16. package/dist/client/assets/architecture-PBZL5I3N-DFdrPtRG.js +1 -0
  17. package/dist/client/assets/architectureDiagram-2XIMDMQ5-CXJTJFYJ.js +36 -0
  18. package/dist/client/assets/array-DOVTz2Mq.js +1 -0
  19. package/dist/client/assets/blockDiagram-WCTKOSBZ-B60owdAn.js +132 -0
  20. package/dist/client/assets/c4Diagram-IC4MRINW-4tg2D_Vt.js +10 -0
  21. package/dist/client/assets/channel-DogeU0Wo.js +1 -0
  22. package/dist/client/assets/chunk-4BX2VUAB-CW45MZFx.js +1 -0
  23. package/dist/client/assets/chunk-55IACEB6-Busc3sfI.js +1 -0
  24. package/dist/client/assets/chunk-7E7YKBS2-BVR-8Pma.js +1 -0
  25. package/dist/client/assets/chunk-7R4GIKGN-DneC7PwP.js +80 -0
  26. package/dist/client/assets/chunk-C72U2L5F-CJr98gus.js +1 -0
  27. package/dist/client/assets/chunk-EGIJ26TM-iD_CSqpR.js +1 -0
  28. package/dist/client/assets/{chunk-FMBD7UC4-CrKv7ndg.js → chunk-FMBD7UC4-BSsJVlRg.js} +2 -2
  29. package/dist/client/assets/chunk-GEFDOKGD-eDUrsRgt.js +2 -0
  30. package/dist/client/assets/chunk-GLR3WWYH-NUOKNaxd.js +2 -0
  31. package/dist/client/assets/chunk-HHEYEP7N-DhuxpkmW.js +1 -0
  32. package/dist/client/assets/chunk-JSJVCQXG-UCJub_Eo.js +1 -0
  33. package/dist/client/assets/chunk-KX2RTZJC-DrhxxMOx.js +1 -0
  34. package/dist/client/assets/chunk-KYZI473N-Brv52ZeO.js +53 -0
  35. package/dist/client/assets/chunk-L3YUKLVL-BkBigLhQ.js +1 -0
  36. package/dist/client/assets/chunk-MX3YWQON-DHRoNbgW.js +1 -0
  37. package/dist/client/assets/chunk-NQ4KR5QH-BZ86r2qK.js +220 -0
  38. package/dist/client/assets/chunk-O4XLMI2P-Sr33dk8c.js +7 -0
  39. package/dist/client/assets/chunk-OZEHJAEY-3F2ff7sj.js +1 -0
  40. package/dist/client/assets/chunk-PQ6SQG4A-C9acTu_E.js +1 -0
  41. package/dist/client/assets/chunk-PU5JKC2W-PQmA4K_y.js +70 -0
  42. package/dist/client/assets/chunk-QZHKN3VN-DMRW-mur.js +1 -0
  43. package/dist/client/assets/chunk-R5LLSJPH-ChexuO_S.js +1 -0
  44. package/dist/client/assets/chunk-WL4C6EOR-oxNV_hhM.js +189 -0
  45. package/dist/client/assets/chunk-XIRO2GV7-C9gOnffv.js +1 -0
  46. package/dist/client/assets/chunk-XPW4576I-CcqR6BsE.js +32 -0
  47. package/dist/client/assets/chunk-XZSTWKYB-C5JJ0TZR.js +94 -0
  48. package/dist/client/assets/chunk-YBOYWFTD-B6kAkNgH.js +1 -0
  49. package/dist/client/assets/classDiagram-VBA2DB6C-DlDUg6JI.js +1 -0
  50. package/dist/client/assets/classDiagram-v2-RAHNMMFH-BxzJfV1S.js +1 -0
  51. package/dist/client/assets/clone-DuY6BQEm.js +1 -0
  52. package/dist/client/assets/cose-bilkent-S5V4N54A-hlDud6Ym.js +1 -0
  53. package/dist/client/assets/cytoscape.esm-B3gzQ1NF.js +321 -0
  54. package/dist/client/assets/dagre-BwDYerGQ.js +1 -0
  55. package/dist/client/assets/dagre-KLK3FWXG-KnkMUlUE.js +4 -0
  56. package/dist/client/assets/defaultLocale-Ck2Xxk-C.js +1 -0
  57. package/dist/client/assets/diagram-E7M64L7V-DcTCIFUG.js +24 -0
  58. package/dist/client/assets/diagram-IFDJBPK2-COcDQunj.js +43 -0
  59. package/dist/client/assets/diagram-P4PSJMXO-DmgET9pD.js +24 -0
  60. package/dist/client/assets/dist-v55TM3-O.js +1 -0
  61. package/dist/client/assets/erDiagram-INFDFZHY-ByL02DP-.js +70 -0
  62. package/dist/client/assets/flowDiagram-PKNHOUZH-CW-lseYE.js +162 -0
  63. package/dist/client/assets/ganttDiagram-A5KZAMGK-BxLjKRld.js +292 -0
  64. package/dist/client/assets/gitGraph-HDMCJU4V-CjAGJiCH.js +1 -0
  65. package/dist/client/assets/gitGraphDiagram-K3NZZRJ6-DLEDjokx.js +65 -0
  66. package/dist/client/assets/graphlib-WkJoBgka.js +1 -0
  67. package/dist/client/assets/index-CizZxdOT.js +79 -0
  68. package/dist/client/assets/index-Cn4K2uvR.css +2 -0
  69. package/dist/client/assets/info-3K5VOQVL-CB6KpH1K.js +1 -0
  70. package/dist/client/assets/infoDiagram-LFFYTUFH-CnmYkyCb.js +2 -0
  71. package/dist/client/assets/init-Bft5Ffpj.js +1 -0
  72. package/dist/client/assets/isArrayLikeObject-icl0H0jo.js +1 -0
  73. package/dist/client/assets/isEmpty-Du8sNmkE.js +1 -0
  74. package/dist/client/assets/ishikawaDiagram-PHBUUO56-zycn1mVK.js +70 -0
  75. package/dist/client/assets/journeyDiagram-4ABVD52K-aRoH36nV.js +139 -0
  76. package/dist/client/assets/kanban-definition-K7BYSVSG-BGtGv5yb.js +89 -0
  77. package/dist/client/assets/katex-BJrMXEjr.js +261 -0
  78. package/dist/client/assets/line-Cm3ZuldI.js +1 -0
  79. package/dist/client/assets/linear-HJOLPv7E.js +1 -0
  80. package/dist/client/assets/math-CNhlSIO3.js +1 -0
  81. package/dist/client/assets/mermaid-parser.core-BvMqHn4b.js +4 -0
  82. package/dist/client/assets/mermaid.core-C4SvQTx9.js +11 -0
  83. package/dist/client/assets/mindmap-definition-YRQLILUH-B8jMe7ir.js +68 -0
  84. package/dist/client/assets/ordinal-DIg8h6NI.js +1 -0
  85. package/dist/client/assets/packet-RMMSAZCW-CzbC-tXD.js +1 -0
  86. package/dist/client/assets/path-DfRbCp9y.js +1 -0
  87. package/dist/client/assets/pie-UPGHQEXC-CmhYIo8p.js +1 -0
  88. package/dist/client/assets/pieDiagram-SKSYHLDU-CGWbtgxq.js +30 -0
  89. package/dist/client/assets/{prism-bash-DTkDXsAh.js → prism-bash-6uMTC0Q2.js} +1 -1
  90. package/dist/client/assets/prism-csharp-Dkc2OSmh.js +1 -0
  91. package/dist/client/assets/prism-dart-iZy_wlz-.js +1 -0
  92. package/dist/client/assets/prism-elixir-BIzI9WJK.js +1 -0
  93. package/dist/client/assets/prism-hcl-Bx2FGBKG.js +1 -0
  94. package/dist/client/assets/prism-java-DBXf7fH0.js +1 -0
  95. package/dist/client/assets/prism-markup-templating-DS0ksKLt.js +1 -0
  96. package/dist/client/assets/prism-perl-BlhPiMfT.js +1 -0
  97. package/dist/client/assets/prism-php-DVtOAJsW.js +1 -0
  98. package/dist/client/assets/{prism-protobuf-DiQ_z8B5.js → prism-protobuf-BUsrNVvv.js} +1 -1
  99. package/dist/client/assets/prism-ruby-Saes64I6.js +1 -0
  100. package/dist/client/assets/{prism-scala-BjNo2HkN.js → prism-scala-ANOINMog.js} +1 -1
  101. package/dist/client/assets/prism-solidity-C5Mx5y66.js +1 -0
  102. package/dist/client/assets/{prism-sql-AgAyy5H_.js → prism-sql-D5pwK0Dp.js} +1 -1
  103. package/dist/client/assets/{prism-vim-uciLQ2PQ.js → prism-vim-BSZSu-gX.js} +1 -1
  104. package/dist/client/assets/quadrantDiagram-337W2JSQ-CQ1QKsru.js +7 -0
  105. package/dist/client/assets/radar-KQ55EAFF-BCa9lsCc.js +1 -0
  106. package/dist/client/assets/requirementDiagram-Z7DCOOCP-Co1LyL5T.js +73 -0
  107. package/dist/client/assets/rough.esm-KjoEK0it.js +1 -0
  108. package/dist/client/assets/sankeyDiagram-WA2Y5GQK-BQVbT6bS.js +10 -0
  109. package/dist/client/assets/sequenceDiagram-2WXFIKYE-DGIEkdPm.js +145 -0
  110. package/dist/client/assets/src-DsmFf7gO.js +1 -0
  111. package/dist/client/assets/stateDiagram-RAJIS63D-DgjKbXnG.js +1 -0
  112. package/dist/client/assets/stateDiagram-v2-FVOUBMTO-gPrpjL74.js +1 -0
  113. package/dist/client/assets/timeline-definition-YZTLITO2-Dz2dVWjY.js +61 -0
  114. package/dist/client/assets/treemap-KZPCXAKY-DXiPfAB6.js +1 -0
  115. package/dist/client/assets/vennDiagram-LZ73GAT5-IIH5S1B6.js +34 -0
  116. package/dist/client/assets/xychartDiagram-JWTSCODW-DeYZhM2j.js +7 -0
  117. package/dist/client/index.html +2 -2
  118. package/dist/server/git-diff-tui.d.ts +1 -1
  119. package/dist/server/git-diff-tui.js +7 -5
  120. package/dist/server/git-diff-tui.test.d.ts +1 -0
  121. package/dist/server/git-diff-tui.test.js +60 -0
  122. package/dist/server/git-diff.d.ts +3 -1
  123. package/dist/server/git-diff.js +40 -3
  124. package/dist/server/git-diff.test.js +20 -0
  125. package/dist/server/server.d.ts +1 -0
  126. package/dist/server/server.js +4 -3
  127. package/dist/server/server.test.js +32 -0
  128. package/dist/tui/App.d.ts +1 -0
  129. package/dist/tui/App.js +2 -2
  130. package/dist/types/diff.d.ts +1 -0
  131. package/dist/utils/commentImports.js +3 -2
  132. package/dist/utils/createId.d.ts +1 -0
  133. package/dist/utils/createId.js +5 -0
  134. package/dist/utils/createId.test.d.ts +1 -0
  135. package/dist/utils/createId.test.js +48 -0
  136. package/package.json +5 -5
  137. package/dist/client/assets/_basePickBy-B9N-f0iT.js +0 -1
  138. package/dist/client/assets/_baseUniq-tbL7nVvN.js +0 -1
  139. package/dist/client/assets/arc-BOY-7mep.js +0 -1
  140. package/dist/client/assets/architectureDiagram-2XIMDMQ5-59AvHaSB.js +0 -36
  141. package/dist/client/assets/blockDiagram-WCTKOSBZ-DXIlumQk.js +0 -132
  142. package/dist/client/assets/c4Diagram-IC4MRINW-BbfZ0uRn.js +0 -10
  143. package/dist/client/assets/channel-cZXsTJxA.js +0 -1
  144. package/dist/client/assets/chunk-4BX2VUAB-l7rcB2IW.js +0 -1
  145. package/dist/client/assets/chunk-55IACEB6-CrZL3qv9.js +0 -1
  146. package/dist/client/assets/chunk-JSJVCQXG-DyBDhAEM.js +0 -1
  147. package/dist/client/assets/chunk-KX2RTZJC-By5mkZmU.js +0 -1
  148. package/dist/client/assets/chunk-NQ4KR5QH-C30p9xRx.js +0 -220
  149. package/dist/client/assets/chunk-QZHKN3VN-DVlhR2wU.js +0 -1
  150. package/dist/client/assets/chunk-WL4C6EOR-Cn7a6CO3.js +0 -189
  151. package/dist/client/assets/classDiagram-VBA2DB6C-B_coIPEy.js +0 -1
  152. package/dist/client/assets/classDiagram-v2-RAHNMMFH-B_coIPEy.js +0 -1
  153. package/dist/client/assets/clone-BjaT2HOk.js +0 -1
  154. package/dist/client/assets/cose-bilkent-S5V4N54A-LyauIk_9.js +0 -1
  155. package/dist/client/assets/cytoscape.esm-5J0xJHOV.js +0 -321
  156. package/dist/client/assets/dagre-KLK3FWXG-DRWb2KE3.js +0 -4
  157. package/dist/client/assets/defaultLocale-DX6XiGOO.js +0 -1
  158. package/dist/client/assets/diagram-E7M64L7V-ChT6mNWK.js +0 -24
  159. package/dist/client/assets/diagram-IFDJBPK2-CqbTduoP.js +0 -43
  160. package/dist/client/assets/diagram-P4PSJMXO-Bzv5Z3ri.js +0 -24
  161. package/dist/client/assets/erDiagram-INFDFZHY-CvXfUZ4L.js +0 -70
  162. package/dist/client/assets/flowDiagram-PKNHOUZH-CxmpNUKq.js +0 -162
  163. package/dist/client/assets/ganttDiagram-A5KZAMGK-9LpZCsg6.js +0 -292
  164. package/dist/client/assets/gitGraphDiagram-K3NZZRJ6-C6yZOrQJ.js +0 -65
  165. package/dist/client/assets/graph-bUZ7uHLW.js +0 -1
  166. package/dist/client/assets/index-BLNN1bfE.js +0 -98
  167. package/dist/client/assets/index-VxkpzDXr.css +0 -1
  168. package/dist/client/assets/infoDiagram-LFFYTUFH-Djdy3W21.js +0 -2
  169. package/dist/client/assets/init-Gi6I4Gst.js +0 -1
  170. package/dist/client/assets/ishikawaDiagram-PHBUUO56-oOdwCpeS.js +0 -70
  171. package/dist/client/assets/journeyDiagram-4ABVD52K-DTb_nGAw.js +0 -139
  172. package/dist/client/assets/kanban-definition-K7BYSVSG-CMtP7pHA.js +0 -89
  173. package/dist/client/assets/katex-C-M49wc6.js +0 -261
  174. package/dist/client/assets/layout-CXr5MatK.js +0 -1
  175. package/dist/client/assets/linear-pOMS9pjV.js +0 -1
  176. package/dist/client/assets/mermaid.core-DV5JJ1Ie.js +0 -249
  177. package/dist/client/assets/mindmap-definition-YRQLILUH-DN-sbonc.js +0 -68
  178. package/dist/client/assets/ordinal-Cboi1Yqb.js +0 -1
  179. package/dist/client/assets/pieDiagram-SKSYHLDU-tAHCkgh1.js +0 -30
  180. package/dist/client/assets/prism-csharp-5CQ0RcEE.js +0 -1
  181. package/dist/client/assets/prism-dart-MjriiaMt.js +0 -1
  182. package/dist/client/assets/prism-elixir-BSOTyVg2.js +0 -1
  183. package/dist/client/assets/prism-hcl-BYvi1mtM.js +0 -1
  184. package/dist/client/assets/prism-java-DMU2FM4X.js +0 -1
  185. package/dist/client/assets/prism-markup-templating-Ct1xsyfA.js +0 -1
  186. package/dist/client/assets/prism-perl-CpfvaEQk.js +0 -1
  187. package/dist/client/assets/prism-php-SC920LoD.js +0 -1
  188. package/dist/client/assets/prism-ruby-DZph-YiO.js +0 -1
  189. package/dist/client/assets/prism-solidity-qTLbmiAT.js +0 -1
  190. package/dist/client/assets/quadrantDiagram-337W2JSQ-B0wODmgR.js +0 -7
  191. package/dist/client/assets/requirementDiagram-Z7DCOOCP-A3aeHC06.js +0 -73
  192. package/dist/client/assets/sankeyDiagram-WA2Y5GQK-BWa6kZhG.js +0 -10
  193. package/dist/client/assets/sequenceDiagram-2WXFIKYE-Cx_COX9G.js +0 -145
  194. package/dist/client/assets/stateDiagram-RAJIS63D-BXGnN6rZ.js +0 -1
  195. package/dist/client/assets/stateDiagram-v2-FVOUBMTO-CMw3xNha.js +0 -1
  196. package/dist/client/assets/timeline-definition-YZTLITO2-DbqaUm9k.js +0 -61
  197. package/dist/client/assets/treemap-KZPCXAKY-CfEujPCR.js +0 -162
  198. package/dist/client/assets/vennDiagram-LZ73GAT5-CqJE8CAD.js +0 -34
  199. package/dist/client/assets/xychartDiagram-JWTSCODW-CfdDvzHC.js +0 -7
package/README.ja.md CHANGED
@@ -136,20 +136,21 @@ git diff --cached | difit -
136
136
 
137
137
  ## ⚙️ CLIオプション
138
138
 
139
- | フラグ | デフォルト | 説明 |
140
- | --------------------- | ---------- | --------------------------------------------------------------------------------- |
141
- | `<target>` | HEAD | コミットハッシュ、タグ、HEAD~n、ブランチ、または特別な引数 |
142
- | `[compare-with]` | - | 比較対象の2番目のコミット(2つの間のdiffを表示) |
143
- | `--pr <url>` | - | レビューするGitHub PRのURL(例:https://github.com/owner/repo/pull/123) |
144
- | `--comment <json>` | - | 起動時に初期コメントを注入(複数指定可。JSON object または array を受け付ける) |
145
- | `--port` | 4966 | 優先ポート。使用中の場合は+1にフォールバック |
146
- | `--host` | 127.0.0.1 | サーバーをバインドするホストアドレス(外部からアクセスしたい場合は0.0.0.0を指定) |
147
- | `--no-open` | false | ブラウザを自動的に開かない |
148
- | `--mode` | split | 表示モード。`unified`または`split` |
149
- | `--tui` | false | WebUIの代わりにターミナルUIを使用 |
150
- | `--clean` | false | 起動時に既存コメントと閲覧済みファイルをすべてクリア |
151
- | `--include-untracked` | false | diffにuntrackedファイルを自動的に含める(`.`または`working`のみ有効) |
152
- | `--keep-alive` | false | ブラウザ切断後もサーバーを終了せず起動したままにする(Ctrl+Cで手動停止) |
139
+ | フラグ | デフォルト | 説明 |
140
+ | --------------------- | --------------- | ------------------------------------------------------------------------------------------ |
141
+ | `<target>` | HEAD | コミットハッシュ、タグ、HEAD~n、ブランチ、または特別な引数 |
142
+ | `[compare-with]` | - | 比較対象の2番目のコミット(2つの間のdiffを表示) |
143
+ | `--pr <url>` | - | レビューするGitHub PRのURL(例:https://github.com/owner/repo/pull/123) |
144
+ | `--comment <json>` | - | 起動時に初期コメントを注入(複数指定可。JSON object または array を受け付ける) |
145
+ | `--port` | 4966 | 優先ポート。使用中の場合は+1にフォールバック |
146
+ | `--host` | 127.0.0.1 | サーバーをバインドするホストアドレス(外部からアクセスしたい場合は0.0.0.0を指定) |
147
+ | `--no-open` | false | ブラウザを自動的に開かない |
148
+ | `--mode` | split | 表示モード。`unified`または`split` |
149
+ | `--tui` (deprecated) | false | WebUIの代わりにターミナルUIを使用 |
150
+ | `--clean` | false | 起動時に既存コメントと閲覧済みファイルをすべてクリア |
151
+ | `--include-untracked` | false | diffにuntrackedファイルを自動的に含める(`.`または`working`のみ有効) |
152
+ | `--keep-alive` | false | ブラウザ切断後もサーバーを終了せず起動したままにする(Ctrl+Cで手動停止) |
153
+ | `--context <lines>` | Gitの既定値 (3) | 変更ごとの前後コンテキスト行数を制限(`0` は変更行のみ表示。`--pr` と stdin では使用不可) |
153
154
 
154
155
  ## 💬 コメントシステム
155
156
 
package/README.ko.md CHANGED
@@ -136,20 +136,21 @@ git diff --cached | difit -
136
136
 
137
137
  ## ⚙️ CLI 옵션
138
138
 
139
- | 플래그 | 기본값 | 설명 |
140
- | --------------------- | --------- | ----------------------------------------------------------------- |
141
- | `<target>` | HEAD | 커밋 해시, 태그, HEAD~n, 브랜치 또는 특수 인수 |
142
- | `[compare-with]` | - | 비교할 선택적 두 번째 커밋 (둘 사이의 diff 표시) |
143
- | `--pr <url>` | - | 검토할 GitHub PR URL (예: https://github.com/owner/repo/pull/123) |
144
- | `--comment <json>` | - | 초기 코멘트 주입 (반복 가능; JSON object 또는 array 허용) |
145
- | `--port` | 4966 | 선호 포트; 사용 중인 경우 +1로 대체 |
146
- | `--host` | 127.0.0.1 | 서버를 바인딩할 호스트 주소 (외부 액세스는 0.0.0.0 사용) |
147
- | `--no-open` | false | 브라우저를 자동으로 열지 않음 |
148
- | `--mode` | split | 표시 모드: `unified` 또는 `split` |
149
- | `--tui` | false | WebUI 대신 터미널 UI 모드 사용 |
150
- | `--clean` | false | 시작 시 모든 기존 코멘트와 열람된 파일 표시 초기화 |
151
- | `--include-untracked` | false | diff에 untracked 파일 자동 포함 (`.` 또는 `working`에서만 유효) |
152
- | `--keep-alive` | false | 브라우저 연결이 끊겨도 서버 유지 (Ctrl+C로 수동 종료) |
139
+ | 플래그 | 기본값 | 설명 |
140
+ | --------------------- | -------------- | --------------------------------------------------------------------------------------------- |
141
+ | `<target>` | HEAD | 커밋 해시, 태그, HEAD~n, 브랜치 또는 특수 인수 |
142
+ | `[compare-with]` | - | 비교할 선택적 두 번째 커밋 (둘 사이의 diff 표시) |
143
+ | `--pr <url>` | - | 검토할 GitHub PR URL (예: https://github.com/owner/repo/pull/123) |
144
+ | `--comment <json>` | - | 초기 코멘트 주입 (반복 가능; JSON object 또는 array 허용) |
145
+ | `--port` | 4966 | 선호 포트; 사용 중인 경우 +1로 대체 |
146
+ | `--host` | 127.0.0.1 | 서버를 바인딩할 호스트 주소 (외부 액세스는 0.0.0.0 사용) |
147
+ | `--no-open` | false | 브라우저를 자동으로 열지 않음 |
148
+ | `--mode` | split | 표시 모드: `unified` 또는 `split` |
149
+ | `--tui` (deprecated) | false | WebUI 대신 터미널 UI 모드 사용 |
150
+ | `--clean` | false | 시작 시 모든 기존 코멘트와 열람된 파일 표시 초기화 |
151
+ | `--include-untracked` | false | diff에 untracked 파일 자동 포함 (`.` 또는 `working`에서만 유효) |
152
+ | `--keep-alive` | false | 브라우저 연결이 끊겨도 서버 유지 (Ctrl+C로 수동 종료) |
153
+ | `--context <lines>` | Git 기본값 (3) | 변경 주변의 컨텍스트 줄 수를 제한 (`0`이면 변경된 줄만 표시, `--pr` 및 stdin에서는 사용 불가) |
153
154
 
154
155
  ## 💬 코멘트 시스템
155
156
 
package/README.md CHANGED
@@ -136,20 +136,21 @@ Stdin mode is selected with intent-first rules:
136
136
 
137
137
  ## ⚙️ CLI Options
138
138
 
139
- | Flag | Default | Description |
140
- | --------------------- | --------- | -------------------------------------------------------------------------- |
141
- | `<target>` | HEAD | Commit hash, tag, HEAD~n, branch, or special arguments |
142
- | `[compare-with]` | - | Optional second commit to compare with (shows diff between the two) |
143
- | `--pr <url>` | - | GitHub PR URL to review (e.g., https://github.com/owner/repo/pull/123) |
144
- | `--comment <json>` | - | Inject initial comments (repeatable; accepts a JSON object or array) |
145
- | `--port` | 4966 | Preferred port; falls back to +1 if occupied |
146
- | `--host` | 127.0.0.1 | Host address to bind server to (use 0.0.0.0 for external access) |
147
- | `--no-open` | false | Don't automatically open browser |
148
- | `--mode` | split | Display mode: `unified` or `split` |
149
- | `--tui` | false | Use terminal UI mode instead of WebUI |
150
- | `--clean` | false | Clear all existing comments and viewed files on startup |
151
- | `--include-untracked` | false | Automatically include untracked files in diff (only with `.` or `working`) |
152
- | `--keep-alive` | false | Keep server running after browser disconnects (stop manually with Ctrl+C) |
139
+ | Flag | Default | Description |
140
+ | --------------------- | --------------- | ------------------------------------------------------------------------------------------------------- |
141
+ | `<target>` | HEAD | Commit hash, tag, HEAD~n, branch, or special arguments |
142
+ | `[compare-with]` | - | Optional second commit to compare with (shows diff between the two) |
143
+ | `--pr <url>` | - | GitHub PR URL to review (e.g., https://github.com/owner/repo/pull/123) |
144
+ | `--comment <json>` | - | Inject initial comments (repeatable; accepts a JSON object or array) |
145
+ | `--port` | 4966 | Preferred port; falls back to +1 if occupied |
146
+ | `--host` | 127.0.0.1 | Host address to bind server to (use 0.0.0.0 for external access) |
147
+ | `--no-open` | false | Don't automatically open browser |
148
+ | `--mode` | split | Display mode: `unified` or `split` |
149
+ | `--tui` (deprecated) | false | Use terminal UI mode instead of WebUI |
150
+ | `--clean` | false | Clear all existing comments and viewed files on startup |
151
+ | `--include-untracked` | false | Automatically include untracked files in diff (only with `.` or `working`) |
152
+ | `--keep-alive` | false | Keep server running after browser disconnects (stop manually with Ctrl+C) |
153
+ | `--context <lines>` | git default (3) | Limit surrounding context lines per change (`0` shows changes only; not available with `--pr` or stdin) |
153
154
 
154
155
  ## 💬 Comment System
155
156
 
package/README.zh.md CHANGED
@@ -136,20 +136,21 @@ git diff --cached | difit -
136
136
 
137
137
  ## ⚙️ CLI 选项
138
138
 
139
- | 标志 | 默认值 | 描述 |
140
- | --------------------- | --------- | ---------------------------------------------------------------------- |
141
- | `<target>` | HEAD | 提交哈希、标签、HEAD~n、分支或特殊参数 |
142
- | `[compare-with]` | - | 要比较的可选第二个提交(显示两者之间的差异) |
143
- | `--pr <url>` | - | 要审查的 GitHub PR URL(例如:https://github.com/owner/repo/pull/123) |
144
- | `--comment <json>` | - | 注入初始评论(可重复指定;接受 JSON object 或 array) |
145
- | `--port` | 4966 | 首选端口;如果被占用则回退到 +1 |
146
- | `--host` | 127.0.0.1 | 绑定服务器的主机地址(使用 0.0.0.0 进行外部访问) |
147
- | `--no-open` | false | 不自动打开浏览器 |
148
- | `--mode` | split | 显示模式:`unified` 或 `split` |
149
- | `--tui` | false | 使用终端 UI 模式而不是 WebUI |
150
- | `--clean` | false | 启动时清除所有现有评论和已查看的文件 |
151
- | `--include-untracked` | false | 自动将 untracked 文件包含在 diff 中(仅在 `.` 或 `working` 时有效) |
152
- | `--keep-alive` | false | 浏览器断开后保持服务器运行(使用 Ctrl+C 手动停止) |
139
+ | 标志 | 默认值 | 描述 |
140
+ | --------------------- | -------------- | --------------------------------------------------------------------------------- |
141
+ | `<target>` | HEAD | 提交哈希、标签、HEAD~n、分支或特殊参数 |
142
+ | `[compare-with]` | - | 要比较的可选第二个提交(显示两者之间的差异) |
143
+ | `--pr <url>` | - | 要审查的 GitHub PR URL(例如:https://github.com/owner/repo/pull/123) |
144
+ | `--comment <json>` | - | 注入初始评论(可重复指定;接受 JSON object 或 array) |
145
+ | `--port` | 4966 | 首选端口;如果被占用则回退到 +1 |
146
+ | `--host` | 127.0.0.1 | 绑定服务器的主机地址(使用 0.0.0.0 进行外部访问) |
147
+ | `--no-open` | false | 不自动打开浏览器 |
148
+ | `--mode` | split | 显示模式:`unified` 或 `split` |
149
+ | `--tui` (deprecated) | false | 使用终端 UI 模式而不是 WebUI |
150
+ | `--clean` | false | 启动时清除所有现有评论和已查看的文件 |
151
+ | `--include-untracked` | false | 自动将 untracked 文件包含在 diff 中(仅在 `.` 或 `working` 时有效) |
152
+ | `--keep-alive` | false | 浏览器断开后保持服务器运行(使用 Ctrl+C 手动停止) |
153
+ | `--context <lines>` | Git 默认值 (3) | 限制每处变更周围的上下文行数(`0` 仅显示变更行;不可与 `--pr` 或 stdin 一起使用) |
153
154
 
154
155
  ## 💬 评论系统
155
156
 
package/dist/cli/index.js CHANGED
@@ -8,6 +8,7 @@ import { DiffMode } from '../types/watch.js';
8
8
  import { DEFAULT_DIFF_VIEW_MODE, normalizeDiffViewMode } from '../utils/diffMode.js';
9
9
  import { shouldReadStdin, findUntrackedFiles, markFilesIntentToAdd, promptUser, parseCommentOptions, validateDiffArguments, getGitRoot, } from './utils.js';
10
10
  import { getPrPatch, getPrCommentImports } from './github.js';
11
+ import { warnAboutTuiDeprecation } from './tuiDeprecation.js';
11
12
  function isSpecialArg(arg) {
12
13
  return arg === 'working' || arg === 'staged' || arg === '.';
13
14
  }
@@ -46,12 +47,18 @@ program
46
47
  .option('--clean', 'start with a clean slate by clearing all existing comments')
47
48
  .option('--include-untracked', 'automatically include untracked files in diff')
48
49
  .option('--keep-alive', 'keep server running even after browser disconnects')
50
+ .option('--context <lines>', 'number of context lines shown around each change', parseInt)
49
51
  .action(async (commitish, compareWith, options) => {
50
52
  try {
51
53
  let stdinDiff;
52
54
  let stdinReviewLabel = 'diff from stdin';
53
55
  let manualCommentImports = [];
54
56
  let commentImports = [];
57
+ if (options.context !== undefined &&
58
+ (!Number.isInteger(options.context) || options.context < 0)) {
59
+ console.error('Error: --context must be a non-negative integer');
60
+ process.exit(1);
61
+ }
55
62
  try {
56
63
  manualCommentImports = parseCommentOptions(options.comment);
57
64
  commentImports = manualCommentImports;
@@ -69,6 +76,10 @@ program
69
76
  console.error('Error: --pr option cannot be used with --tui');
70
77
  process.exit(1);
71
78
  }
79
+ if (options.context !== undefined) {
80
+ console.error('Error: --context option cannot be used with --pr');
81
+ process.exit(1);
82
+ }
72
83
  try {
73
84
  stdinDiff = getPrPatch(options.pr);
74
85
  stdinReviewLabel = options.pr;
@@ -94,6 +105,10 @@ program
94
105
  hasTuiOption: Boolean(options.tui),
95
106
  });
96
107
  if (readFromStdin) {
108
+ if (options.context !== undefined) {
109
+ console.error('Error: --context option cannot be used with stdin diff');
110
+ process.exit(1);
111
+ }
97
112
  // Read unified diff from stdin
98
113
  stdinDiff = await readStdin();
99
114
  if (!stdinDiff.trim()) {
@@ -166,6 +181,7 @@ program
166
181
  console.error('Try running the command directly in your terminal without piping.');
167
182
  process.exit(1);
168
183
  }
184
+ await warnAboutTuiDeprecation();
169
185
  // Dynamic import for TUI mode
170
186
  const { render } = await import('ink');
171
187
  const { default: TuiApp } = await import('../tui/App.js');
@@ -174,6 +190,7 @@ program
174
190
  baseCommitish,
175
191
  mode: options.mode,
176
192
  repoPath,
193
+ contextLines: options.context,
177
194
  }));
178
195
  return;
179
196
  }
@@ -191,6 +208,7 @@ program
191
208
  mode: options.mode,
192
209
  clearComments: options.clean,
193
210
  keepAlive: options.keepAlive,
211
+ contextLines: options.context,
194
212
  diffMode: determineDiffMode(targetCommitish, compareWith),
195
213
  repoPath,
196
214
  ...(commentImports.length > 0 ? { commentImports } : {}),
@@ -22,7 +22,7 @@ vi.mock('./github.js', () => ({
22
22
  }));
23
23
  const { simpleGit } = await import('simple-git');
24
24
  const { startServer } = await import('../server/server.js');
25
- const { promptUser, findUntrackedFiles, markFilesIntentToAdd, parseCommentOptions } = await import('./utils.js');
25
+ const { promptUser, findUntrackedFiles, markFilesIntentToAdd, parseCommentOptions, shouldReadStdin, } = await import('./utils.js');
26
26
  const { getPrPatch, getPrCommentImports } = await import('./github.js');
27
27
  describe('CLI index.ts', () => {
28
28
  let mockGit;
@@ -213,6 +213,11 @@ describe('CLI index.ts', () => {
213
213
  args: ['--keep-alive'],
214
214
  expectedOptions: { keepAlive: true },
215
215
  },
216
+ {
217
+ name: '--context option',
218
+ args: ['--context', '5'],
219
+ expectedOptions: { context: 5 },
220
+ },
216
221
  ])('$name', async ({ args, expectedOptions }) => {
217
222
  mockFindUntrackedFiles.mockResolvedValue([]);
218
223
  const program = new Command();
@@ -227,6 +232,7 @@ describe('CLI index.ts', () => {
227
232
  .option('--pr <url>', 'pr')
228
233
  .option('--clean', 'start with a clean slate by clearing all existing comments')
229
234
  .option('--keep-alive', 'keep server running even after browser disconnects')
235
+ .option('--context <lines>', 'context', parseInt)
230
236
  .action(async (commitish, _compareWith, options) => {
231
237
  let targetCommitish = commitish;
232
238
  let baseCommitish = commitish + '^';
@@ -239,6 +245,7 @@ describe('CLI index.ts', () => {
239
245
  mode: options.mode,
240
246
  clearComments: options.clean,
241
247
  keepAlive: options.keepAlive,
248
+ contextLines: options.context,
242
249
  });
243
250
  });
244
251
  await program.parseAsync([...args], { from: 'user' });
@@ -251,10 +258,91 @@ describe('CLI index.ts', () => {
251
258
  mode: expectedOptions.mode || 'split',
252
259
  clearComments: expectedOptions.clean,
253
260
  keepAlive: expectedOptions.keepAlive,
261
+ contextLines: expectedOptions.context,
254
262
  };
255
263
  expect(mockStartServer).toHaveBeenCalledWith(expectedCall);
256
264
  });
257
265
  });
266
+ describe('--context option', () => {
267
+ it('rejects negative values', async () => {
268
+ const program = new Command();
269
+ program
270
+ .argument('[commit-ish]', 'commit-ish', 'HEAD')
271
+ .argument('[compare-with]', 'compare-with')
272
+ .option('--context <lines>', 'context', parseInt)
273
+ .action(async (commitish, _compareWith, options) => {
274
+ if (options.context !== undefined &&
275
+ (!Number.isInteger(options.context) || options.context < 0)) {
276
+ console.error('Error: --context must be a non-negative integer');
277
+ process.exit(1);
278
+ return;
279
+ }
280
+ await startServer({
281
+ targetCommitish: commitish,
282
+ baseCommitish: `${commitish}^`,
283
+ contextLines: options.context,
284
+ });
285
+ });
286
+ await program.parseAsync(['--context', '-1'], { from: 'user' });
287
+ expect(console.error).toHaveBeenCalledWith('Error: --context must be a non-negative integer');
288
+ expect(process.exit).toHaveBeenCalledWith(1);
289
+ expect(mockStartServer).not.toHaveBeenCalled();
290
+ });
291
+ it('rejects --context with --pr', async () => {
292
+ const prUrl = 'https://github.com/owner/repo/pull/123';
293
+ const program = new Command();
294
+ program
295
+ .argument('[commit-ish]', 'commit-ish', 'HEAD')
296
+ .argument('[compare-with]', 'compare-with')
297
+ .option('--context <lines>', 'context', parseInt)
298
+ .option('--pr <url>', 'pr')
299
+ .action(async (_commitish, _compareWith, options) => {
300
+ if (options.pr && options.context !== undefined) {
301
+ console.error('Error: --context option cannot be used with --pr');
302
+ process.exit(1);
303
+ return;
304
+ }
305
+ await startServer({
306
+ stdinDiff: getPrPatch(options.pr),
307
+ contextLines: options.context,
308
+ });
309
+ });
310
+ await program.parseAsync(['--pr', prUrl, '--context', '3'], { from: 'user' });
311
+ expect(console.error).toHaveBeenCalledWith('Error: --context option cannot be used with --pr');
312
+ expect(process.exit).toHaveBeenCalledWith(1);
313
+ expect(mockGetPrPatch).not.toHaveBeenCalled();
314
+ expect(mockStartServer).not.toHaveBeenCalled();
315
+ });
316
+ it('rejects --context with stdin diff', async () => {
317
+ const program = new Command();
318
+ program
319
+ .argument('[commit-ish]', 'commit-ish', 'HEAD')
320
+ .argument('[compare-with]', 'compare-with')
321
+ .option('--context <lines>', 'context', parseInt)
322
+ .option('--tui', 'tui')
323
+ .action(async (commitish, _compareWith, options) => {
324
+ const readFromStdin = shouldReadStdin({
325
+ commitish,
326
+ hasPositionalArgs: program.args.length > 0,
327
+ hasPrOption: false,
328
+ hasTuiOption: Boolean(options.tui),
329
+ });
330
+ if (readFromStdin && options.context !== undefined) {
331
+ console.error('Error: --context option cannot be used with stdin diff');
332
+ process.exit(1);
333
+ return;
334
+ }
335
+ await startServer({
336
+ stdinDiff: 'diff --git a/file.ts b/file.ts',
337
+ contextLines: options.context,
338
+ });
339
+ });
340
+ await program.parseAsync(['-', '--context', '3'], { from: 'user' });
341
+ expect(console.error).toHaveBeenCalledWith('Error: --context option cannot be used with stdin diff');
342
+ expect(process.exit).toHaveBeenCalledWith(1);
343
+ expect(mockStartServer).not.toHaveBeenCalled();
344
+ });
345
+ });
258
346
  describe('Version option', () => {
259
347
  it('supports --version flag', async () => {
260
348
  const program = new Command();
@@ -1014,16 +1102,16 @@ describe('CLI index.ts', () => {
1014
1102
  describe('TUI mode', () => {
1015
1103
  let mockRender;
1016
1104
  let mockTuiApp;
1017
- beforeEach(async () => {
1018
- // Mock ink and TUI components
1105
+ const expectRenderedTuiProps = (props) => {
1106
+ expect(mockRender).toHaveBeenCalledTimes(1);
1107
+ expect(mockRender).toHaveBeenCalledWith({
1108
+ component: mockTuiApp,
1109
+ props,
1110
+ });
1111
+ };
1112
+ beforeEach(() => {
1019
1113
  mockRender = vi.fn();
1020
1114
  mockTuiApp = vi.fn();
1021
- vi.doMock('ink', async () => ({
1022
- render: mockRender,
1023
- }));
1024
- vi.doMock('../tui/App.js', async () => ({
1025
- default: mockTuiApp,
1026
- }));
1027
1115
  // Mock React.createElement for testing
1028
1116
  vi.spyOn(React, 'createElement').mockImplementation((component, props) => ({ component, props }));
1029
1117
  // Mock process.stdin.isTTY
@@ -1033,8 +1121,6 @@ describe('CLI index.ts', () => {
1033
1121
  });
1034
1122
  });
1035
1123
  afterEach(() => {
1036
- vi.doUnmock('ink');
1037
- vi.doUnmock('../tui/App.js');
1038
1124
  vi.restoreAllMocks();
1039
1125
  });
1040
1126
  it('passes arguments to TUI app correctly', async () => {
@@ -1055,8 +1141,8 @@ describe('CLI index.ts', () => {
1055
1141
  console.error('Error: TUI mode requires an interactive terminal (TTY).');
1056
1142
  process.exit(1);
1057
1143
  }
1058
- const { render } = await import('ink');
1059
- const { default: TuiApp } = await import('../tui/App.js');
1144
+ const render = mockRender;
1145
+ const TuiApp = mockTuiApp;
1060
1146
  render(React.createElement(TuiApp, {
1061
1147
  targetCommitish: commitish,
1062
1148
  baseCommitish: commitish + '^',
@@ -1065,13 +1151,43 @@ describe('CLI index.ts', () => {
1065
1151
  }
1066
1152
  });
1067
1153
  await program.parseAsync(['main', '--tui'], { from: 'user' });
1068
- expect(mockRender).toHaveBeenCalledWith({
1069
- component: mockTuiApp,
1070
- props: {
1071
- targetCommitish: 'main',
1072
- baseCommitish: 'main^',
1073
- mode: 'split',
1074
- },
1154
+ expectRenderedTuiProps({
1155
+ targetCommitish: 'main',
1156
+ baseCommitish: 'main^',
1157
+ mode: 'split',
1158
+ });
1159
+ });
1160
+ it('passes context option to TUI app', async () => {
1161
+ mockFindUntrackedFiles.mockResolvedValue([]);
1162
+ const program = new Command();
1163
+ program
1164
+ .argument('[commit-ish]', 'commit-ish', 'HEAD')
1165
+ .argument('[compare-with]', 'compare-with')
1166
+ .option('--port <port>', 'port', parseInt)
1167
+ .option('--host <host>', 'host', '')
1168
+ .option('--no-open', 'no-open')
1169
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
1170
+ .option('--context <lines>', 'context', parseInt)
1171
+ .option('--tui', 'tui')
1172
+ .option('--pr <url>', 'pr')
1173
+ .action(async (commitish, _compareWith, options) => {
1174
+ if (options.tui) {
1175
+ const render = mockRender;
1176
+ const TuiApp = mockTuiApp;
1177
+ render(React.createElement(TuiApp, {
1178
+ targetCommitish: commitish,
1179
+ baseCommitish: commitish + '^',
1180
+ mode: options.mode,
1181
+ contextLines: options.context,
1182
+ }));
1183
+ }
1184
+ });
1185
+ await program.parseAsync(['--tui', '--context', '2'], { from: 'user' });
1186
+ expectRenderedTuiProps({
1187
+ targetCommitish: 'HEAD',
1188
+ baseCommitish: 'HEAD^',
1189
+ mode: 'split',
1190
+ contextLines: 2,
1075
1191
  });
1076
1192
  });
1077
1193
  it('passes mode option to TUI app', async () => {
@@ -1092,8 +1208,8 @@ describe('CLI index.ts', () => {
1092
1208
  console.error('Error: TUI mode requires an interactive terminal (TTY).');
1093
1209
  process.exit(1);
1094
1210
  }
1095
- const { render } = await import('ink');
1096
- const { default: TuiApp } = await import('../tui/App.js');
1211
+ const render = mockRender;
1212
+ const TuiApp = mockTuiApp;
1097
1213
  render(React.createElement(TuiApp, {
1098
1214
  targetCommitish: commitish,
1099
1215
  baseCommitish: commitish + '^',
@@ -1102,13 +1218,10 @@ describe('CLI index.ts', () => {
1102
1218
  }
1103
1219
  });
1104
1220
  await program.parseAsync(['--tui', '--mode', 'unified'], { from: 'user' });
1105
- expect(mockRender).toHaveBeenCalledWith({
1106
- component: mockTuiApp,
1107
- props: {
1108
- targetCommitish: 'HEAD',
1109
- baseCommitish: 'HEAD^',
1110
- mode: 'unified',
1111
- },
1221
+ expectRenderedTuiProps({
1222
+ targetCommitish: 'HEAD',
1223
+ baseCommitish: 'HEAD^',
1224
+ mode: 'unified',
1112
1225
  });
1113
1226
  });
1114
1227
  it('handles special arguments with TUI mode', async () => {
@@ -1125,8 +1238,8 @@ describe('CLI index.ts', () => {
1125
1238
  .option('--pr <url>', 'pr')
1126
1239
  .action(async (commitish, _compareWith, options) => {
1127
1240
  if (options.tui) {
1128
- const { render } = await import('ink');
1129
- const { default: TuiApp } = await import('../tui/App.js');
1241
+ const render = mockRender;
1242
+ const TuiApp = mockTuiApp;
1130
1243
  let targetCommitish = commitish;
1131
1244
  let baseCommitish;
1132
1245
  if (commitish === 'working') {
@@ -1146,13 +1259,10 @@ describe('CLI index.ts', () => {
1146
1259
  }
1147
1260
  });
1148
1261
  await program.parseAsync(['working', '--tui', '--mode', 'unified'], { from: 'user' });
1149
- expect(mockRender).toHaveBeenCalledWith({
1150
- component: mockTuiApp,
1151
- props: {
1152
- targetCommitish: 'working',
1153
- baseCommitish: 'staged',
1154
- mode: 'unified',
1155
- },
1262
+ expectRenderedTuiProps({
1263
+ targetCommitish: 'working',
1264
+ baseCommitish: 'staged',
1265
+ mode: 'unified',
1156
1266
  });
1157
1267
  });
1158
1268
  it('rejects TUI mode in non-TTY environment', async () => {
@@ -0,0 +1,3 @@
1
+ export declare const TUI_DEPRECATION_NOTICE_LINES: string[];
2
+ export declare const TUI_DEPRECATION_PROMPT: string;
3
+ export declare function warnAboutTuiDeprecation(waitForEnterFn?: (message: string) => Promise<void>): Promise<void>;
@@ -0,0 +1,16 @@
1
+ import { waitForEnter } from './utils.js';
2
+ const TUI_DEPRECATION_ISSUES_URL = 'https://github.com/yoshiko-pg/difit/issues';
3
+ export const TUI_DEPRECATION_NOTICE_LINES = [
4
+ `⚠️ TUI mode will be removed in the next major release because ongoing implementation of core features is difficult. If you have feedback, please open an issue: ${TUI_DEPRECATION_ISSUES_URL}`,
5
+ `⚠️ tuiモードは継続的な主要機能の実装が難しいため次回のメジャーリリースで削除予定です。もしご意見がある場合はissueの起票をお願いします。 ${TUI_DEPRECATION_ISSUES_URL}`,
6
+ ];
7
+ export const TUI_DEPRECATION_PROMPT = [
8
+ 'Press Enter to start TUI mode.',
9
+ 'Enterを押すとtuiモードを起動します。',
10
+ ].join('\n');
11
+ export async function warnAboutTuiDeprecation(waitForEnterFn = waitForEnter) {
12
+ for (const line of TUI_DEPRECATION_NOTICE_LINES) {
13
+ console.warn(line);
14
+ }
15
+ await waitForEnterFn(`\n${TUI_DEPRECATION_PROMPT}\n`);
16
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ import { afterEach, describe, expect, it, vi } from 'vitest';
2
+ import { TUI_DEPRECATION_NOTICE_LINES, TUI_DEPRECATION_PROMPT, warnAboutTuiDeprecation, } from './tuiDeprecation.js';
3
+ describe('TUI deprecation warning', () => {
4
+ afterEach(() => {
5
+ vi.restoreAllMocks();
6
+ });
7
+ it('shows bilingual warnings and waits for Enter before continuing', async () => {
8
+ const consoleWarn = vi.spyOn(console, 'warn').mockImplementation(() => { });
9
+ const waitForEnter = vi.fn().mockResolvedValue(undefined);
10
+ await warnAboutTuiDeprecation(waitForEnter);
11
+ expect(consoleWarn).toHaveBeenNthCalledWith(1, TUI_DEPRECATION_NOTICE_LINES[0]);
12
+ expect(consoleWarn).toHaveBeenNthCalledWith(2, TUI_DEPRECATION_NOTICE_LINES[1]);
13
+ expect(waitForEnter).toHaveBeenCalledWith(`\n${TUI_DEPRECATION_PROMPT}\n`);
14
+ expect(consoleWarn.mock.invocationCallOrder[1]).toBeLessThan(waitForEnter.mock.invocationCallOrder[0]);
15
+ });
16
+ });
@@ -24,4 +24,5 @@ export declare function validateDiffArguments(targetCommitish: string, baseCommi
24
24
  export declare function findUntrackedFiles(git: SimpleGit): Promise<string[]>;
25
25
  export declare function markFilesIntentToAdd(git: SimpleGit, files: string[]): Promise<void>;
26
26
  export declare function promptUser(message: string): Promise<boolean>;
27
+ export declare function waitForEnter(message: string): Promise<void>;
27
28
  export {};
package/dist/cli/utils.js CHANGED
@@ -191,3 +191,20 @@ export async function promptUser(message) {
191
191
  const trimmed = answer.trim().toLowerCase();
192
192
  return trimmed === '' || ['y', 'yes'].includes(trimmed);
193
193
  }
194
+ export async function waitForEnter(message) {
195
+ const rl = createInterface({
196
+ input: process.stdin,
197
+ output: process.stdout,
198
+ });
199
+ try {
200
+ while (true) {
201
+ const answer = await rl.question(message);
202
+ if (answer.trim() === '') {
203
+ return;
204
+ }
205
+ }
206
+ }
207
+ finally {
208
+ rl.close();
209
+ }
210
+ }
@@ -0,0 +1 @@
1
+ import{A as e,B as t,C as n,E as r,H as i,M as a,U as o,V as s,k as c,p as l,w as u,z as d}from"./isArrayLikeObject-icl0H0jo.js";import{A as f,C as p,D as m,M as h,N as g,S as _,T as v,f as y,h as b,u as x,w as S}from"./_baseUniq-b7bzdUSn.js";var C=/\s/;function w(e){for(var t=e.length;t--&&C.test(e.charAt(t)););return t}var ee=/^\s+/;function T(e){return e&&e.slice(0,w(e)+1).replace(ee,``)}var E=NaN,D=/^[-+]0x[0-9a-f]+$/i,O=/^0b[01]+$/i,k=/^0o[0-7]+$/i,A=parseInt;function j(e){if(typeof e==`number`)return e;if(g(e))return E;if(t(e)){var n=typeof e.valueOf==`function`?e.valueOf():e;e=t(n)?n+``:n}if(typeof e!=`string`)return e===0?e:+e;e=T(e);var r=O.test(e);return r||k.test(e)?A(e.slice(2),r?2:8):D.test(e)?E:+e}var M=1/0,N=17976931348623157e292;function P(e){return e?(e=j(e),e===M||e===-M?(e<0?-1:1)*N:e===e?e:0):e===0?e:0}function F(e){var t=P(e),n=t%1;return t===t?n?t-n:t:0}function I(e){return e!=null&&e.length?_(e,1):[]}var L=Object.prototype,R=L.hasOwnProperty,z=r(function(t,r){t=Object(t);var i=-1,a=r.length,o=a>2?r[2]:void 0;for(o&&n(r[0],r[1],o)&&(a=1);++i<a;)for(var s=r[i],c=l(s),u=-1,d=c.length;++u<d;){var f=c[u],p=t[f];(p===void 0||e(p,L[f])&&!R.call(t,f))&&(t[f]=s[f])}return t});function B(e){var t=e==null?0:e.length;return t?e[t-1]:void 0}function V(e){return function(t,n,r){var i=Object(t);if(!u(t)){var a=y(n,3);t=m(t),n=function(e){return a(i[e],e,i)}}var o=e(t,n,r);return o>-1?i[a?t[o]:o]:void 0}}var H=Math.max;function U(e,t,n){var r=e==null?0:e.length;if(!r)return-1;var i=n==null?0:F(n);return i<0&&(i=H(r+i,0)),f(e,y(t,3),i)}var W=V(U);function G(e,t){var n=-1,r=u(e)?Array(e.length):[];return x(e,function(e,i,a){r[++n]=t(e,i,a)}),r}function K(e,t){return(s(e)?h:G)(e,y(t,3))}var q=Object.prototype.hasOwnProperty;function J(e,t){return e!=null&&q.call(e,t)}function Y(e,t){return e!=null&&b(e,t,J)}var X=`[object String]`;function Z(e){return typeof e==`string`||!s(e)&&i(e)&&o(e)==X}function Q(e,t){return e<t}function $(e,t,n){for(var r=-1,i=e.length;++r<i;){var a=e[r],o=t(a);if(o!=null&&(s===void 0?o===o&&!g(o):n(o,s)))var s=o,c=a}return c}function te(e){return e&&e.length?$(e,d,Q):void 0}function ne(e,n,r,i){if(!t(e))return e;n=v(n,e);for(var o=-1,s=n.length,l=s-1,u=e;u!=null&&++o<s;){var d=S(n[o]),f=r;if(d===`__proto__`||d===`constructor`||d===`prototype`)return e;if(o!=l){var p=u[d];f=i?i(p,d,u):void 0,f===void 0&&(f=t(p)?p:a(n[o+1])?[]:{})}c(u,d,f),u=u[d]}return e}function re(e,t,n){for(var r=-1,i=t.length,a={};++r<i;){var o=t[r],s=p(e,o);n(s,o)&&ne(a,v(o,e),s)}return a}export{Z as a,G as c,z as d,I as f,Q as i,W as l,P as m,te as n,Y as o,F as p,$ as r,K as s,re as t,B as u};
@@ -0,0 +1 @@
1
+ import{A as e,B as t,F as n,H as r,M as i,O as a,T as o,U as s,V as c,W as l,_ as u,a as d,b as f,c as p,d as m,g as h,h as g,i as _,k as v,l as y,n as ee,o as b,p as x,r as te,s as ne,u as re,v as ie,w as S,y as C,z as w}from"./isArrayLikeObject-icl0H0jo.js";import{i as ae,n as T,r as E}from"./isEmpty-Du8sNmkE.js";var oe=`[object Symbol]`;function D(e){return typeof e==`symbol`||r(e)&&s(e)==oe}function O(e,t){for(var n=-1,r=e==null?0:e.length,i=Array(r);++n<r;)i[n]=t(e[n],n,e);return i}var se=1/0,ce=l?l.prototype:void 0,le=ce?ce.toString:void 0;function ue(e){if(typeof e==`string`)return e;if(c(e))return O(e,ue)+``;if(D(e))return le?le.call(e):``;var t=e+``;return t==`0`&&1/e==-se?`-0`:t}function de(){}function fe(e,t){for(var n=-1,r=e==null?0:e.length;++n<r&&t(e[n],n,e)!==!1;);return e}function pe(e,t,n,r){for(var i=e.length,a=n+(r?1:-1);r?a--:++a<i;)if(t(e[a],a,e))return a;return-1}function me(e){return e!==e}function he(e,t,n){for(var r=n-1,i=e.length;++r<i;)if(e[r]===t)return r;return-1}function ge(e,t,n){return t===t?he(e,t,n):pe(e,me,n)}function _e(e,t){return!!(e!=null&&e.length)&&ge(e,t,0)>-1}function k(e){return S(e)?g(e):ae(e)}var ve=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,ye=/^\w*$/;function A(e,t){if(c(e))return!1;var n=typeof e;return n==`number`||n==`symbol`||n==`boolean`||e==null||D(e)?!0:ye.test(e)||!ve.test(e)||t!=null&&e in Object(t)}var be=500;function xe(e){var t=re(e,function(e){return n.size===be&&n.clear(),e}),n=t.cache;return t}var Se=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Ce=/\\(\\)?/g,we=xe(function(e){var t=[];return e.charCodeAt(0)===46&&t.push(``),e.replace(Se,function(e,n,r,i){t.push(r?i.replace(Ce,`$1`):n||e)}),t});function j(e){return e==null?``:ue(e)}function M(e,t){return c(e)?e:A(e,t)?[e]:we(j(e))}var Te=1/0;function N(e){if(typeof e==`string`||D(e))return e;var t=e+``;return t==`0`&&1/e==-Te?`-0`:t}function P(e,t){t=M(t,e);for(var n=0,r=t.length;e!=null&&n<r;)e=e[N(t[n++])];return n&&n==r?e:void 0}function Ee(e,t,n){var r=e==null?void 0:P(e,t);return r===void 0?n:r}function F(e,t){for(var n=-1,r=t.length,i=e.length;++n<r;)e[i+n]=t[n];return e}var I=l?l.isConcatSpreadable:void 0;function De(e){return c(e)||f(e)||!!(I&&e&&e[I])}function L(e,t,n,r,i){var a=-1,o=e.length;for(n||=De,i||=[];++a<o;){var s=e[a];t>0&&n(s)?t>1?L(s,t-1,n,r,i):F(i,s):r||(i[i.length]=s)}return i}function Oe(e,t,n,r){var i=-1,a=e==null?0:e.length;for(r&&a&&(n=e[++i]);++i<a;)n=t(n,e[i],i,e);return n}function ke(e,t){return e&&a(t,k(t),e)}function Ae(e,t){return e&&a(t,x(t),e)}function R(e,t){for(var n=-1,r=e==null?0:e.length,i=0,a=[];++n<r;){var o=e[n];t(o,n,e)&&(a[i++]=o)}return a}function z(){return[]}var je=Object.prototype.propertyIsEnumerable,B=Object.getOwnPropertySymbols,V=B?function(e){return e==null?[]:(e=Object(e),R(B(e),function(t){return je.call(e,t)}))}:z;function Me(e,t){return a(e,V(e),t)}var Ne=Object.getOwnPropertySymbols?function(e){for(var t=[];e;)F(t,V(e)),e=y(e);return t}:z;function Pe(e,t){return a(e,Ne(e),t)}function Fe(e,t,n){var r=t(e);return c(e)?r:F(r,n(e))}function H(e){return Fe(e,k,V)}function Ie(e){return Fe(e,x,Ne)}var Le=Object.prototype.hasOwnProperty;function Re(e){var t=e.length,n=new e.constructor(t);return t&&typeof e[0]==`string`&&Le.call(e,`index`)&&(n.index=e.index,n.input=e.input),n}function ze(e,t){var n=t?d(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}var Be=/\w*$/;function Ve(e){var t=new e.constructor(e.source,Be.exec(e));return t.lastIndex=e.lastIndex,t}var He=l?l.prototype:void 0,Ue=He?He.valueOf:void 0;function We(e){return Ue?Object(Ue.call(e)):{}}var Ge=`[object Boolean]`,Ke=`[object Date]`,qe=`[object Map]`,Je=`[object Number]`,Ye=`[object RegExp]`,Xe=`[object Set]`,Ze=`[object String]`,Qe=`[object Symbol]`,$e=`[object ArrayBuffer]`,et=`[object DataView]`,tt=`[object Float32Array]`,nt=`[object Float64Array]`,rt=`[object Int8Array]`,it=`[object Int16Array]`,at=`[object Int32Array]`,ot=`[object Uint8Array]`,st=`[object Uint8ClampedArray]`,ct=`[object Uint16Array]`,lt=`[object Uint32Array]`;function ut(e,t,n){var r=e.constructor;switch(t){case $e:return d(e);case Ge:case Ke:return new r(+e);case et:return ze(e,n);case tt:case nt:case rt:case it:case at:case ot:case st:case ct:case lt:return _(e,n);case qe:return new r;case Je:case Ze:return new r(e);case Ye:return Ve(e);case Xe:return new r;case Qe:return We(e)}}var dt=`[object Map]`;function ft(e){return r(e)&&T(e)==dt}var pt=u&&u.isMap,mt=pt?ie(pt):ft,ht=`[object Set]`;function gt(e){return r(e)&&T(e)==ht}var _t=u&&u.isSet,vt=_t?ie(_t):gt,yt=1,bt=2,xt=4,St=`[object Arguments]`,Ct=`[object Array]`,wt=`[object Boolean]`,Tt=`[object Date]`,Et=`[object Error]`,Dt=`[object Function]`,Ot=`[object GeneratorFunction]`,kt=`[object Map]`,At=`[object Number]`,jt=`[object Object]`,Mt=`[object RegExp]`,Nt=`[object Set]`,Pt=`[object String]`,Ft=`[object Symbol]`,It=`[object WeakMap]`,Lt=`[object ArrayBuffer]`,Rt=`[object DataView]`,zt=`[object Float32Array]`,Bt=`[object Float64Array]`,Vt=`[object Int8Array]`,Ht=`[object Int16Array]`,Ut=`[object Int32Array]`,Wt=`[object Uint8Array]`,Gt=`[object Uint8ClampedArray]`,Kt=`[object Uint16Array]`,qt=`[object Uint32Array]`,U={};U[St]=U[Ct]=U[Lt]=U[Rt]=U[wt]=U[Tt]=U[zt]=U[Bt]=U[Vt]=U[Ht]=U[Ut]=U[kt]=U[At]=U[jt]=U[Mt]=U[Nt]=U[Pt]=U[Ft]=U[Wt]=U[Gt]=U[Kt]=U[qt]=!0,U[Et]=U[Dt]=U[It]=!1;function W(e,r,i,a,o,s){var l,u=r&yt,d=r&bt,f=r&xt;if(i&&(l=o?i(e,a,o,s):i(e)),l!==void 0)return l;if(!t(e))return e;var m=c(e);if(m){if(l=Re(e),!u)return n(e,l)}else{var h=T(e),g=h==Dt||h==Ot;if(C(e))return ne(e,u);if(h==jt||h==St||g&&!o){if(l=d||g?{}:te(e),!u)return d?Pe(e,Ae(l,e)):Me(e,ke(l,e))}else{if(!U[h])return o?e:{};l=ut(e,h,u)}}s||=new p;var _=s.get(e);if(_)return _;s.set(e,l),vt(e)?e.forEach(function(t){l.add(W(t,r,i,t,e,s))}):mt(e)&&e.forEach(function(t,n){l.set(n,W(t,r,i,n,e,s))});var y=m?void 0:(f?d?Ie:H:d?x:k)(e);return fe(y||e,function(t,n){y&&(n=t,t=e[n]),v(l,n,W(t,r,i,n,e,s))}),l}var Jt=`__lodash_hash_undefined__`;function Yt(e){return this.__data__.set(e,Jt),this}function Xt(e){return this.__data__.has(e)}function G(e){var t=-1,n=e==null?0:e.length;for(this.__data__=new m;++t<n;)this.add(e[t])}G.prototype.add=G.prototype.push=Yt,G.prototype.has=Xt;function Zt(e,t){for(var n=-1,r=e==null?0:e.length;++n<r;)if(t(e[n],n,e))return!0;return!1}function K(e,t){return e.has(t)}var Qt=1,$t=2;function en(e,t,n,r,i,a){var o=n&Qt,s=e.length,c=t.length;if(s!=c&&!(o&&c>s))return!1;var l=a.get(e),u=a.get(t);if(l&&u)return l==t&&u==e;var d=-1,f=!0,p=n&$t?new G:void 0;for(a.set(e,t),a.set(t,e);++d<s;){var m=e[d],h=t[d];if(r)var g=o?r(h,m,d,t,e,a):r(m,h,d,e,t,a);if(g!==void 0){if(g)continue;f=!1;break}if(p){if(!Zt(t,function(e,t){if(!K(p,t)&&(m===e||i(m,e,n,r,a)))return p.push(t)})){f=!1;break}}else if(!(m===h||i(m,h,n,r,a))){f=!1;break}}return a.delete(e),a.delete(t),f}function tn(e){var t=-1,n=Array(e.size);return e.forEach(function(e,r){n[++t]=[r,e]}),n}function q(e){var t=-1,n=Array(e.size);return e.forEach(function(e){n[++t]=e}),n}var nn=1,rn=2,an=`[object Boolean]`,on=`[object Date]`,sn=`[object Error]`,cn=`[object Map]`,ln=`[object Number]`,un=`[object RegExp]`,dn=`[object Set]`,fn=`[object String]`,pn=`[object Symbol]`,mn=`[object ArrayBuffer]`,hn=`[object DataView]`,gn=l?l.prototype:void 0,J=gn?gn.valueOf:void 0;function _n(t,n,r,i,a,o,s){switch(r){case hn:if(t.byteLength!=n.byteLength||t.byteOffset!=n.byteOffset)return!1;t=t.buffer,n=n.buffer;case mn:return!(t.byteLength!=n.byteLength||!o(new b(t),new b(n)));case an:case on:case ln:return e(+t,+n);case sn:return t.name==n.name&&t.message==n.message;case un:case fn:return t==n+``;case cn:var c=tn;case dn:var l=i&nn;if(c||=q,t.size!=n.size&&!l)return!1;var u=s.get(t);if(u)return u==n;i|=rn,s.set(t,n);var d=en(c(t),c(n),i,a,o,s);return s.delete(t),d;case pn:if(J)return J.call(t)==J.call(n)}return!1}var vn=1,yn=Object.prototype.hasOwnProperty;function bn(e,t,n,r,i,a){var o=n&vn,s=H(e),c=s.length;if(c!=H(t).length&&!o)return!1;for(var l=c;l--;){var u=s[l];if(!(o?u in t:yn.call(t,u)))return!1}var d=a.get(e),f=a.get(t);if(d&&f)return d==t&&f==e;var p=!0;a.set(e,t),a.set(t,e);for(var m=o;++l<c;){u=s[l];var h=e[u],g=t[u];if(r)var _=o?r(g,h,u,t,e,a):r(h,g,u,e,t,a);if(!(_===void 0?h===g||i(h,g,n,r,a):_)){p=!1;break}m||=u==`constructor`}if(p&&!m){var v=e.constructor,y=t.constructor;v!=y&&`constructor`in e&&`constructor`in t&&!(typeof v==`function`&&v instanceof v&&typeof y==`function`&&y instanceof y)&&(p=!1)}return a.delete(e),a.delete(t),p}var xn=1,Sn=`[object Arguments]`,Cn=`[object Array]`,Y=`[object Object]`,wn=Object.prototype.hasOwnProperty;function Tn(e,t,n,r,i,a){var o=c(e),s=c(t),l=o?Cn:T(e),u=s?Cn:T(t);l=l==Sn?Y:l,u=u==Sn?Y:u;var d=l==Y,f=u==Y,m=l==u;if(m&&C(e)){if(!C(t))return!1;o=!0,d=!1}if(m&&!d)return a||=new p,o||h(e)?en(e,t,n,r,i,a):_n(e,t,l,n,r,i,a);if(!(n&xn)){var g=d&&wn.call(e,`__wrapped__`),_=f&&wn.call(t,`__wrapped__`);if(g||_){var v=g?e.value():e,y=_?t.value():t;return a||=new p,i(v,y,n,r,a)}}return m?(a||=new p,bn(e,t,n,r,i,a)):!1}function X(e,t,n,i,a){return e===t?!0:e==null||t==null||!r(e)&&!r(t)?e!==e&&t!==t:Tn(e,t,n,i,X,a)}var En=1,Dn=2;function On(e,t,n,r){var i=n.length,a=i,o=!r;if(e==null)return!a;for(e=Object(e);i--;){var s=n[i];if(o&&s[2]?s[1]!==e[s[0]]:!(s[0]in e))return!1}for(;++i<a;){s=n[i];var c=s[0],l=e[c],u=s[1];if(o&&s[2]){if(l===void 0&&!(c in e))return!1}else{var d=new p;if(r)var f=r(l,u,c,e,t,d);if(!(f===void 0?X(u,l,En|Dn,r,d):f))return!1}}return!0}function kn(e){return e===e&&!t(e)}function An(e){for(var t=k(e),n=t.length;n--;){var r=t[n],i=e[r];t[n]=[r,i,kn(i)]}return t}function Z(e,t){return function(n){return n==null?!1:n[e]===t&&(t!==void 0||e in Object(n))}}function jn(e){var t=An(e);return t.length==1&&t[0][2]?Z(t[0][0],t[0][1]):function(n){return n===e||On(n,e,t)}}function Mn(e,t){return e!=null&&t in Object(e)}function Nn(e,t,n){t=M(t,e);for(var r=-1,a=t.length,s=!1;++r<a;){var l=N(t[r]);if(!(s=e!=null&&n(e,l)))break;e=e[l]}return s||++r!=a?s:(a=e==null?0:e.length,!!a&&o(a)&&i(l,a)&&(c(e)||f(e)))}function Pn(e,t){return e!=null&&Nn(e,t,Mn)}var Fn=1,In=2;function Ln(e,t){return A(e)&&kn(t)?Z(N(e),t):function(n){var r=Ee(n,e);return r===void 0&&r===t?Pn(n,e):X(t,r,Fn|In)}}function Rn(e){return function(t){return t?.[e]}}function zn(e){return function(t){return P(t,e)}}function Bn(e){return A(e)?Rn(N(e)):zn(e)}function Q(e){return typeof e==`function`?e:e==null?w:typeof e==`object`?c(e)?Ln(e[0],e[1]):jn(e):Bn(e)}function Vn(e,t){return e&&ee(e,t,k)}function Hn(e,t){return function(n,r){if(n==null)return n;if(!S(n))return e(n,r);for(var i=n.length,a=t?i:-1,o=Object(n);(t?a--:++a<i)&&r(o[a],a,o)!==!1;);return n}}var $=Hn(Vn);function Un(e,t,n){for(var r=-1,i=e==null?0:e.length;++r<i;)if(n(t,e[r]))return!0;return!1}function Wn(e){return typeof e==`function`?e:w}function Gn(e,t){return(c(e)?fe:$)(e,Wn(t))}function Kn(e,t){var n=[];return $(e,function(e,r,i){t(e,r,i)&&n.push(e)}),n}function qn(e,t){return(c(e)?R:Kn)(e,Q(t,3))}function Jn(e,t){return O(t,function(t){return e[t]})}function Yn(e){return e==null?[]:Jn(e,k(e))}function Xn(e){return e===void 0}function Zn(e,t,n,r,i){return i(e,function(e,i,a){n=r?(r=!1,e):t(n,e,i,a)}),n}function Qn(e,t,n){var r=c(e)?Oe:Zn,i=arguments.length<3;return r(e,Q(t,4),n,i,$)}var $n=E&&1/q(new E([,-0]))[1]==1/0?function(e){return new E(e)}:de,er=200;function tr(e,t,n){var r=-1,i=_e,a=e.length,o=!0,s=[],c=s;if(n)o=!1,i=Un;else if(a>=er){var l=t?null:$n(e);if(l)return q(l);o=!1,i=K,c=new G}else c=t?[]:s;outer:for(;++r<a;){var u=e[r],d=t?t(u):u;if(u=n||u!==0?u:0,o&&d===d){for(var f=c.length;f--;)if(c[f]===d)continue outer;t&&c.push(d),s.push(u)}else i(c,d,n)||(c!==s&&c.push(d),s.push(u))}return s}export{pe as A,P as C,k as D,j as E,O as M,D as N,_e as O,L as S,M as T,Zt as _,qn as a,Ie as b,Wn as c,Vn as d,Q as f,K as g,Nn as h,Yn as i,de as j,ge as k,Un as l,Pn as m,Qn as n,Kn as o,Rn as p,Xn as r,Gn as s,tr as t,$ as u,G as v,N as w,R as x,W as y};