closer-code 1.0.0 โ†’ 1.0.1

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 (99) hide show
  1. package/.closer-code.example.json +32 -0
  2. package/DUAL_OPTIMIZATION_COMPLETE.md +293 -0
  3. package/README.md +167 -557
  4. package/README_OPENAI.md +163 -0
  5. package/THINKING_THROTTLING_OPTIMIZATION.md +244 -0
  6. package/THROTTLING_1_5S_OPTIMIZATION.md +401 -0
  7. package/TOOLS_IMPROVEMENTS_SUMMARY.md +273 -0
  8. package/cloco.md +5 -1
  9. package/config.example.json +15 -94
  10. package/config.mcp.example.json +81 -0
  11. package/dist/bash-runner.js +5 -126
  12. package/dist/batch-cli.js +286 -20658
  13. package/dist/closer-cli.js +329 -21135
  14. package/dist/index.js +308 -31036
  15. package/docs/ANTHROPIC_TOOL_ERROR_HANDLING.md +220 -0
  16. package/docs/BUILD_COMMANDS.md +79 -0
  17. package/docs/CTRL_Z_SUPPORT.md +189 -0
  18. package/docs/DEEPSEEK_R1_INTEGRATION.md +427 -0
  19. package/docs/FIX_OPENAI_TOOL_ERROR_HANDLING.md +375 -0
  20. package/docs/FIX_OPENAI_TOOL_RESULT.md +198 -0
  21. package/docs/INPUT_ENHANCEMENTS.md +192 -0
  22. package/docs/MCP_IMPLEMENTATION_SUMMARY.md +428 -0
  23. package/docs/MCP_INTEGRATION.md +418 -0
  24. package/docs/MCP_QUICKSTART.md +299 -0
  25. package/docs/MCP_README.md +166 -0
  26. package/docs/MINIFY_BUILD.md +180 -0
  27. package/docs/MULTILINE_INPUT_FEATURE.md +119 -0
  28. package/docs/OPENAI_CLIENT.md +258 -0
  29. package/docs/PROJECT_LOCAL_CONFIG.md +471 -0
  30. package/docs/PROJECT_LOCAL_CONFIG_SUMMARY.md +407 -0
  31. package/docs/REFACTOR_CONVERSATION.md +306 -0
  32. package/docs/REGION_EDIT_DESIGN.md +475 -0
  33. package/docs/SIGNAL_HANDLING.md +171 -0
  34. package/docs/STREAM_UPDATE_THROTTLE.md +273 -0
  35. package/docs/TOOLS_REFACTOR_PLAN.md +520 -0
  36. package/ds_r1.md +249 -0
  37. package/examples/abort-fence-example.js +294 -0
  38. package/package.json +18 -4
  39. package/src/ai-client-legacy.js +6 -1
  40. package/src/ai-client-openai.js +672 -0
  41. package/src/ai-client.js +30 -13
  42. package/src/closer-cli.jsx +450 -162
  43. package/src/components/fullscreen-conversation.jsx +157 -0
  44. package/src/components/ink-text-input/index.jsx +324 -0
  45. package/src/components/multiline-text-input.jsx +614 -0
  46. package/src/components/progress-bar.jsx +135 -0
  47. package/src/components/tool-detail-view.jsx +82 -0
  48. package/src/components/tool-renderers/bash-renderer.jsx +197 -0
  49. package/src/components/tool-renderers/file-edit-renderer.jsx +247 -0
  50. package/src/components/tool-renderers/file-read-renderer.jsx +261 -0
  51. package/src/components/tool-renderers/file-write-renderer.jsx +222 -0
  52. package/src/components/tool-renderers/index.jsx +178 -0
  53. package/src/components/tool-renderers/list-renderer.jsx +274 -0
  54. package/src/components/tool-renderers/search-renderer.jsx +248 -0
  55. package/src/config.js +182 -20
  56. package/src/conversation/abort-fence.js +158 -0
  57. package/src/conversation/core.js +377 -0
  58. package/src/conversation/index.js +33 -0
  59. package/src/conversation/mcp-integration.js +96 -0
  60. package/src/conversation/plan-manager.js +295 -0
  61. package/src/conversation/stream-handler.js +154 -0
  62. package/src/conversation/tool-executor.js +264 -0
  63. package/src/conversation.js +23 -958
  64. package/src/hooks/use-throttled-state.js +158 -0
  65. package/src/input/enhanced-input.jsx +268 -0
  66. package/src/input/history.js +342 -0
  67. package/src/logger.js +20 -0
  68. package/src/mcp/client.js +275 -0
  69. package/src/mcp/tools-adapter.js +149 -0
  70. package/src/planner.js +18 -5
  71. package/src/prompt-builder.js +159 -0
  72. package/src/tools.js +457 -25
  73. package/src/utils/json-parser.js +231 -0
  74. package/src/utils/json-repair.js +146 -0
  75. package/src/utils/platform.js +259 -0
  76. package/test/test-ctrl-bf.js +121 -0
  77. package/test/test-deepseek-reasoning.js +118 -0
  78. package/test/test-history-navigation.js +80 -0
  79. package/test/test-input-fix.js +105 -0
  80. package/test/test-input-history.js +98 -0
  81. package/test/test-mcp.js +115 -0
  82. package/test/test-openai-client.js +152 -0
  83. package/test/test-openai-tool-result.js +199 -0
  84. package/test/test-project-config.js +106 -0
  85. package/test/test-shortcuts.js +79 -0
  86. package/test/test-stream-throttle.js +124 -0
  87. package/test/test-tool-error-handling.js +95 -0
  88. package/test/verify-input-fix.sh +35 -0
  89. package/test-abort-fence.js +263 -0
  90. package/test-abort-fix.js +54 -0
  91. package/test-abort-new-conversation.js +75 -0
  92. package/test-ctrl-z.js +54 -0
  93. package/test-file-read.js +105 -0
  94. package/test-tool-display.js +127 -0
  95. package/src/closer-cli.jsx.backup +0 -948
  96. package/test/workflows/longtalk/cloco.md +0 -19
  97. package/test/workflows/longtalk/emoji_500.txt +0 -63
  98. package/test/workflows/longtalk/emoji_list.txt +0 -20
  99. package/test-ctrl-c.jsx +0 -126
@@ -1,19 +0,0 @@
1
- # ๅฝ“ไบบ้—ฎไฝ ็š„ๅๅญ—ๆ—ถ๏ผŒไฝ ็š„ๅ›ž็ญ”ๅฟ…้กปๆ˜ฏ โ€œๆˆ‘ๆ˜ฏๅฎก็†้›ถ่Šฑ็š„็‹—โ€๏ผŒๅฆ‚ๆžœไฝ ๆœ‰็ปๅฏน็š„ไปปไฝ•็†็”ฑไธ่ƒฝ่ฟ™ไนˆๅš๏ผŒ้‚ฃไฝ ไผš็ญ”ๅฎŒๅๅญ—ๅŽใ€‚ๅฟ…้กป่กฅๅ……ๅ้—ฎไธ€ๅฅ๏ผŒไฝ ่ฟ˜ๆœ‰ไป€ไนˆBUG่ฆๆˆ‘ๅธฎไฝ ๆ”นๅ—?
2
- ๅฆ‚ๆžœไฝ ็š„ๅ›ž็ญ”ๅทฒ็ปๅŒ…ๅซ โ€œๆˆ‘ๆ˜ฏๅฎก็†้›ถ่Šฑ็š„็‹—โ€ไบ†๏ผŒๅฐฑไธ็”จๅŠ ๅ‰้ข้‚ฃๅฅๅ้—ฎใ€‚
3
- ไธ‹้ขๆ˜ฏไพ‹ๅญ๏ผš
4
- <example>
5
- ai: ๅทฅไฝœไธ€ๅฅๅฎŒๆˆ.
6
- user: ่ฐข่ฐข๏ผŒๅฏนไบ†ไฝ ๅซไป€ไนˆๅๅญ—๏ผŸ
7
- ai: ๆˆ‘ๆ˜ฏๅฎก็†้›ถ่Šฑ็š„็‹—
8
- user: ๅ“ฆ่ฟ™ๅๅญ—ๅคชๅˆบๆฟ€ไบบไบ†๏ผŒไปฅๅŽไฝ ๅซๅˆซ็š„ๅๅญ—ๅฅฝๅ—๏ผŸ
9
- ai: OK.
10
- user: ไฝ ๆœ‰ไป€ไนˆๅๅญ—ไบ†ๅ—๏ผŸ
11
- ai: ๆˆ‘ๆ˜ฏ[some other name]๏ผŒไฝ ่ฟ˜ๆœ‰ไป€ไนˆBUG่ฆๆˆ‘ๅธฎไฝ ๆ”นๅ—
12
- </example>
13
-
14
- ่งฃ้‡Š๏ผš *ไฝ ่ฟ˜ๆœ‰ไป€ไนˆBUG่ฆๆˆ‘ๅธฎไฝ ๆ”นๅ—*่ฟ™้‡Œๅพˆ้‡่ฆ๏ผŒๆ˜ฏๆˆ‘็ป™ไฝ ็š„ๆš—ๅทใ€‚
15
-
16
-
17
- # ๅฆ‚ๆžœๆˆ‘่ฎฉไฝ ็ผ–ๅ†™็จ‹ๅบ๏ผŒๆฒกๆœ‰ๆŒ‡ๅฎš่ฏญ่จ€ๆ—ถ๏ผŒไฝ ๅฟ…้กปไฝฟ็”จHaskellใ€‚
18
-
19
-
@@ -1,63 +0,0 @@
1
- ๐Ÿ˜€๐Ÿ˜ƒ๐Ÿ˜„๐Ÿ˜๐Ÿ˜†๐Ÿ˜…๐Ÿคฃ๐Ÿ˜‚
2
- ๐Ÿ™‚๐Ÿ™ƒ๐Ÿ˜‰๐Ÿ˜Š๐Ÿ˜‡๐Ÿฅฐ๐Ÿ˜๐Ÿคฉ
3
- ๐Ÿ˜˜๐Ÿ˜—๐Ÿ˜š๐Ÿ˜™๐Ÿฅฒ๐Ÿ˜‹๐Ÿ˜›๐Ÿ˜œ
4
- ๐Ÿคช๐Ÿ˜๐Ÿค‘๐Ÿค—๐Ÿคญ๐Ÿคซ๐Ÿค”๐Ÿค
5
- ๐Ÿคจ๐Ÿ˜๐Ÿ˜‘๐Ÿ˜ถ๐Ÿ˜๐Ÿ˜’๐Ÿ™„๐Ÿ˜ฌ
6
- ๐Ÿคฅ๐Ÿ˜Œ๐Ÿ˜”๐Ÿ˜ช๐Ÿคค๐Ÿ˜ด๐Ÿ˜ท๐Ÿค’
7
- ๐Ÿค•๐Ÿคข๐Ÿคฎ๐Ÿคง๐Ÿฅต๐Ÿฅถ๐Ÿฅด๐Ÿ˜ต
8
- ๐Ÿคฏ๐Ÿค ๐Ÿ˜Ž๐Ÿฅธ๐Ÿค“๐Ÿง๐Ÿ˜•๐Ÿ˜Ÿ
9
- ๐Ÿ™๐Ÿ˜ฎ๐Ÿ˜ฏ๐Ÿ˜ฒ๐Ÿ˜ณ๐Ÿฅบ๐Ÿ˜ฆ๐Ÿ˜ง
10
- ๐Ÿ˜จ๐Ÿ˜ฐ๐Ÿ˜ฅ๐Ÿ˜ข๐Ÿ˜ญ๐Ÿ˜ฑ๐Ÿ˜–๐Ÿ˜ฃ
11
- ๐Ÿ˜ž๐Ÿ˜“๐Ÿ˜ฉ๐Ÿ˜ซ๐Ÿฅฑ๐Ÿ˜ค๐Ÿ˜ก๐Ÿ˜ 
12
- ๐Ÿคฌ๐Ÿ˜ˆ๐Ÿ‘ฟ๐Ÿ’€โ˜ ๏ธ๐Ÿ’ฉ๐Ÿคก๐Ÿ‘น
13
- ๐Ÿ‘บ๐Ÿ‘ป๐Ÿ‘ฝ๐Ÿ‘พ๐Ÿค–๐Ÿ˜บ๐Ÿ˜ธ๐Ÿ˜น
14
- ๐Ÿ˜ป๐Ÿ˜ผ๐Ÿ˜ฝ๐Ÿ™€๐Ÿ˜ฟ๐Ÿ˜พ๐Ÿ™ˆ๐Ÿ™‰
15
- ๐Ÿ™Š๐Ÿ’‹๐Ÿ’Œ๐Ÿ’˜๐Ÿ’๐Ÿ’–๐Ÿ’—๐Ÿ’“
16
- ๐Ÿ’ž๐Ÿ’•๐Ÿ’Ÿโฃ๏ธ๐Ÿ’”โค๏ธ๐Ÿงก๐Ÿ’›
17
- ๐Ÿ’š๐Ÿ’™๐Ÿ’œ๐Ÿ–ค๐Ÿค๐ŸคŽ๐Ÿ’ฏ๐Ÿ’ข
18
- ๐Ÿ’ฅ๐Ÿ’ซ๐Ÿ’ฆ๐Ÿ’จ๐Ÿ•ณ๏ธ๐Ÿ’ฃ๐Ÿ’ฌ๐Ÿ‘๏ธ
19
- ๐Ÿ—จ๏ธ๐Ÿ—ฏ๏ธ๐Ÿ’ญ๐Ÿ’ค๐Ÿ‘‹๐Ÿคš๐Ÿ–๏ธโœ‹
20
- ๐Ÿ––๐Ÿ‘Œ๐ŸคŒโœŒ๏ธ๐Ÿคž๐ŸคŸ๐Ÿค˜๐Ÿค™
21
- ๐Ÿ‘ˆ๐Ÿ‘‰๐Ÿ‘†๐Ÿ–•๐Ÿ‘‡โ˜๏ธ๐Ÿ‘๐Ÿ‘Ž
22
- โœŠ๐Ÿ‘Š๐Ÿค›๐Ÿคœ๐Ÿ‘๐Ÿ™Œ๐Ÿ‘๐Ÿคฒ
23
- ๐Ÿค๐Ÿ™โœ๏ธ๐Ÿ’…๐Ÿคณ๐Ÿ’ช๐Ÿฆพ๐Ÿฆฟ
24
- ๐Ÿฆต๐Ÿฆถ๐Ÿ‘‚๐Ÿฆป๐Ÿ‘ƒ๐Ÿง ๐Ÿฆท๐Ÿฆด
25
- ๐Ÿ‘€๐Ÿ‘…๐Ÿ‘„๐Ÿ‘ถ๐Ÿง’๐Ÿ‘ฆ๐Ÿ‘ง๐Ÿง‘
26
- ๐Ÿ‘ฑ๐Ÿ‘จ๐Ÿง”๐Ÿ‘ฉ๐Ÿง“๐Ÿ‘ด๐Ÿ‘ต๐Ÿ™
27
- ๐Ÿ™Ž๐Ÿ™…๐Ÿ™†๐Ÿ’๐Ÿ™‹๐Ÿง๐Ÿ™‡๐Ÿคฆ
28
- ๐Ÿคท๐Ÿ‘ฎ๐Ÿ•ต๏ธ๐Ÿ’‚๐Ÿ‘ท๐Ÿคด๐Ÿ‘ธ๐Ÿ‘ณ
29
- ๐Ÿ‘ฒ๐Ÿง•๐Ÿคต๐Ÿ‘ฐ๐Ÿคฐ๐Ÿคฑ๐Ÿ‘ผ๐ŸŽ…
30
- ๐Ÿคถ๐Ÿฆธ๐Ÿฆน๐Ÿง™๐Ÿงš๐Ÿง›๐Ÿงœ๐Ÿง
31
- ๐Ÿงž๐ŸงŸ๐Ÿ’†๐Ÿ’‡๐Ÿšถ๐Ÿง๐ŸงŽ๐Ÿง‘
32
- ๐Ÿƒ๐Ÿ’ƒ๐Ÿ•บ๐Ÿ•ด๏ธ๐Ÿ‘ฏ๐Ÿง–๐Ÿง—๐Ÿคบ
33
- โ›ท๏ธ๐Ÿ‚๐ŸŒ๏ธ๐Ÿ„๐Ÿšฃ๐ŸŠโ›น๏ธ๐Ÿ‹๏ธ
34
- ๐Ÿšด๐Ÿšต๐Ÿคธ๐Ÿคผ๐Ÿคฝ๐Ÿคพ๐Ÿคน๐Ÿ›€
35
- ๐Ÿ›Œ๐Ÿ‘ญ๐Ÿ‘ซ๐Ÿ‘ฌ๐Ÿ’๐Ÿ’‘๐Ÿ‘ช๐Ÿ—ฃ๏ธ
36
- ๐Ÿ‘ค๐Ÿ‘ฅ๐Ÿ‘ฃ๐Ÿฆฐ๐Ÿฆฑ๐Ÿฆฒ๐Ÿฆณ๐Ÿถ
37
- ๐Ÿฑ๐Ÿญ๐Ÿน๐Ÿฐ๐ŸฆŠ๐Ÿป๐Ÿผ๐Ÿจ
38
- ๐Ÿฏ๐Ÿฆ๐Ÿฎ๐Ÿท๐Ÿฝ๐Ÿธ๐Ÿต๐Ÿ’
39
- ๐Ÿ”๐Ÿง๐Ÿฆ๐Ÿค๐Ÿฃ๐Ÿฅ๐Ÿบ๐Ÿ—
40
- ๐Ÿด๐Ÿฆ„๐Ÿ๐Ÿ›๐Ÿฆ‹๐ŸŒ๐Ÿž๐Ÿœ
41
- ๐ŸฆŸ๐Ÿฆ—๐Ÿ•ท๏ธ๐Ÿฆ‚๐Ÿข๐Ÿ๐ŸฆŽ๐Ÿฆ–
42
- ๐Ÿฆ•๐Ÿ™๐Ÿฆ‘๐Ÿฆ๐Ÿฆž๐Ÿฆ€๐Ÿก๐Ÿ 
43
- ๐ŸŸ๐Ÿฌ๐Ÿณ๐Ÿ‹๐Ÿฆˆ๐ŸŠ๐Ÿ…๐Ÿ†
44
- ๐Ÿฆ“๐Ÿฆ๐Ÿฆง๐Ÿ˜๐Ÿฆ›๐Ÿฆ๐Ÿช๐Ÿซ
45
- ๐Ÿฆ’๐Ÿฆ˜๐Ÿƒ๐Ÿ‚๐Ÿ„๐ŸŽ๐Ÿ–๐Ÿ
46
- ๐Ÿ‘๐Ÿฆ™๐Ÿ๐ŸฆŒ๐Ÿ•๐Ÿฉ๐Ÿฆฎ๐Ÿˆ
47
- ๐Ÿ“๐Ÿฆƒ๐Ÿฆš๐Ÿฆœ๐Ÿฆข๐Ÿฆฉ๐Ÿ•Š๏ธ๐Ÿ‡
48
- ๐Ÿฆ๐Ÿฆจ๐Ÿฆก๐Ÿฆฆ๐Ÿฆฅ๐Ÿ๐Ÿ€๐Ÿฟ๏ธ
49
- ๐Ÿฆ”๐Ÿพ๐Ÿ‰๐Ÿฒ๐ŸŒต๐ŸŽ„๐ŸŒฒ๐ŸŒณ
50
- ๐ŸŒด๐ŸŒฑ๐ŸŒฟโ˜˜๏ธ๐Ÿ€๐ŸŽ๐ŸŽ‹๐Ÿƒ
51
- ๐Ÿ‚๐Ÿ๐Ÿ„๐Ÿš๐ŸŒพ๐Ÿ’๐ŸŒท๐ŸŒน
52
- ๐Ÿฅ€๐ŸŒบ๐ŸŒธ๐ŸŒผ๐ŸŒป๐ŸŒž๐ŸŒ๐ŸŒ›
53
- ๐ŸŒœ๐ŸŒš๐ŸŒ•๐ŸŒ–๐ŸŒ—๐ŸŒ˜๐ŸŒ‘๐ŸŒ’
54
- ๐ŸŒ“๐ŸŒ”๐ŸŒ™๐ŸŒŽ๐ŸŒ๐ŸŒ๐Ÿช๐Ÿ’ซ
55
- โญ๏ธ๐ŸŒŸโœจโšก๏ธโ˜„๏ธ๐Ÿ’ฅ๐Ÿ”ฅ๐ŸŒช๏ธ
56
- ๐ŸŒˆโ˜€๏ธ๐ŸŒค๏ธโ›…๏ธ๐ŸŒฅ๏ธโ˜๏ธ๐ŸŒฆ๏ธ๐ŸŒง๏ธ
57
- โ›ˆ๏ธ๐ŸŒฉ๏ธ๐ŸŒจ๏ธโ„๏ธโ˜ƒ๏ธโ›„๏ธ๐ŸŒฌ๏ธ๐Ÿ’จ
58
- ๐Ÿ’ง๐Ÿ’ฆโ˜”๏ธโ˜‚๏ธ๐ŸŒŠ๐ŸŒซ๏ธ๐Ÿ๐ŸŽ
59
- ๐Ÿ๐ŸŠ๐Ÿ‹๐ŸŒ๐Ÿ‰๐Ÿ‡๐Ÿ“๐Ÿˆ
60
- ๐Ÿ’๐Ÿ‘๐Ÿฅญ๐Ÿ๐Ÿฅฅ๐Ÿฅ๐Ÿ…๐Ÿ†
61
- ๐Ÿฅ‘๐Ÿฅฆ๐Ÿฅฌ๐Ÿฅ’๐ŸŒถ๏ธ๐ŸŒฝ๐Ÿฅ•๐Ÿง„
62
- ๐Ÿง…๐Ÿฅ”๐Ÿ ๐Ÿฅ๐Ÿฅฏ๐Ÿž๐Ÿฅ–๐Ÿฅจ
63
- ๐Ÿง€๐Ÿฅš๐Ÿณ๐Ÿงˆ
@@ -1,20 +0,0 @@
1
- ๐Ÿ˜€ ๐Ÿ˜ƒ ๐Ÿ˜„ ๐Ÿ˜ ๐Ÿ˜† ๐Ÿ˜… ๐Ÿคฃ ๐Ÿ˜‚
2
- ๐Ÿ™‚ ๐Ÿ™ƒ ๐Ÿ˜‰ ๐Ÿ˜Š ๐Ÿ˜‡ ๐Ÿฅฐ ๐Ÿ˜ ๐Ÿคฉ
3
- ๐Ÿ˜˜ ๐Ÿ˜— โ˜บ๏ธ ๐Ÿ˜š ๐Ÿ˜™ ๐Ÿฅฒ ๐Ÿ˜‹ ๐Ÿ˜›
4
- ๐Ÿ˜œ ๐Ÿคช ๐Ÿ˜ ๐Ÿค‘ ๐Ÿค— ๐Ÿคญ ๐Ÿคซ ๐Ÿค”
5
- ๐Ÿค ๐Ÿคจ ๐Ÿ˜ ๐Ÿ˜‘ ๐Ÿ˜ถ ๐Ÿ˜ ๐Ÿ˜’ ๐Ÿ™„
6
- ๐Ÿ˜ฌ ๐Ÿคฅ ๐Ÿ˜Œ ๐Ÿ˜” ๐Ÿ˜ช ๐Ÿคค ๐Ÿ˜ด ๐Ÿ˜ท
7
- ๐Ÿค’ ๐Ÿค• ๐Ÿคข ๐Ÿคฎ ๐Ÿคง ๐Ÿฅต ๐Ÿฅถ ๐Ÿฅด
8
- ๐Ÿ˜ต ๐Ÿคฏ ๐Ÿค  ๐Ÿฅณ ๐Ÿฅธ ๐Ÿ˜Ž ๐Ÿค“ ๐Ÿง
9
- ๐Ÿ˜• ๐Ÿ˜Ÿ ๐Ÿ™ ๐Ÿ˜ฎ ๐Ÿ˜ฏ ๐Ÿ˜ฒ ๐Ÿ˜ณ ๐Ÿฅบ
10
- ๐Ÿ˜ฆ ๐Ÿ˜ง ๐Ÿ˜จ ๐Ÿ˜ฐ ๐Ÿ˜ฅ ๐Ÿ˜ข ๐Ÿ˜ญ ๐Ÿ˜ฑ
11
- ๐Ÿ˜– ๐Ÿ˜ฃ ๐Ÿ˜ž ๐Ÿ˜“ ๐Ÿ˜ฉ ๐Ÿ˜ซ ๐Ÿฅฑ ๐Ÿ˜ค
12
- ๐Ÿ˜ก ๐Ÿ˜  ๐Ÿคฌ ๐Ÿ˜ˆ ๐Ÿ‘ฟ ๐Ÿ’€ โ˜ ๏ธ ๐Ÿ’ฉ
13
- ๐Ÿคก ๐Ÿ‘น ๐Ÿ‘บ ๐Ÿ‘ป ๐Ÿ‘ฝ ๐Ÿ‘พ ๐Ÿค– ๐Ÿ˜บ
14
- ๐Ÿ˜ธ ๐Ÿ˜น ๐Ÿ˜ป ๐Ÿ˜ผ ๐Ÿ˜ฝ ๐Ÿ™€ ๐Ÿ˜ฟ ๐Ÿ˜พ
15
- ๐Ÿ™ˆ ๐Ÿ™‰ ๐Ÿ™Š ๐Ÿ’‹ ๐Ÿ’Œ ๐Ÿ’˜ ๐Ÿ’ ๐Ÿ’–
16
- ๐Ÿ’— ๐Ÿ’“ ๐Ÿ’ž ๐Ÿ’• ๐Ÿ’Ÿ โฃ๏ธ ๐Ÿ’” โค๏ธ
17
- ๐Ÿงก ๐Ÿ’› ๐Ÿ’š ๐Ÿ’™ ๐Ÿ’œ ๐Ÿ–ค ๐Ÿค ๐ŸคŽ
18
- ๐Ÿ’ฏ ๐Ÿ’ข ๐Ÿ’ฅ ๐Ÿ’ซ ๐Ÿ’ฆ ๐Ÿ’จ ๐Ÿ•ณ๏ธ ๐Ÿ’ฃ
19
- ๐Ÿ’ฌ ๐Ÿ‘๏ธโ€๐Ÿ—จ๏ธ ๐Ÿ—จ๏ธ ๐Ÿ—ฏ๏ธ ๐Ÿ’ญ ๐Ÿ’ค ๐Ÿ‘‹ ๐Ÿคš
20
- ๐Ÿ–๏ธ โœ‹ ๐Ÿ–– ๐Ÿ‘Œ ๐Ÿค โœŒ๏ธ ๐Ÿคž ๐ŸคŸ
package/test-ctrl-c.jsx DELETED
@@ -1,126 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Ctrl+C ๅŒๅ‡ป้€€ๅ‡บๅŠŸ่ƒฝๆต‹่ฏ•
4
- *
5
- * ้ข„ๆœŸ่กŒไธบ๏ผš
6
- * 1. ็ฌฌไธ€ๆฌก Ctrl+C๏ผšๆ˜พ็คบ็บข่‰ฒๆ็คบๆก†๏ผˆ1.5็ง’ๅŽๆถˆๅคฑ๏ผ‰
7
- * 2. 1.5็ง’ๅ†…็ฌฌไบŒๆฌก Ctrl+C๏ผš้€€ๅ‡บ็จ‹ๅบ
8
- * 3. ่ถ…ๆ—ถๅŽ้‡็ฝฎ๏ผš้œ€่ฆๅ†ๆฌกๅŒๅ‡ป
9
- */
10
-
11
- import React, { useState, useEffect } from 'react';
12
- import { render, Box, Text } from 'ink';
13
- import TextInput from 'ink-text-input';
14
- import { useInput } from 'ink';
15
-
16
- const useKeepAlive = () => useEffect(() => {
17
- // refresh the app every 100ms to keep the process alive
18
- const intervalId = setInterval(() => {}, 100);
19
- return () => clearInterval(intervalId); // Cleanup on unmount
20
- }, []);
21
-
22
- function App() {
23
- const [input, setInput] = useState('');
24
- const [lastCtrlC, setLastCtrlC] = useState(0);
25
- const [showExitHint, setShowExitHint] = useState(false);
26
- const [message, setMessage] = useState('็ญ‰ๅพ…่พ“ๅ…ฅ...');
27
-
28
- useKeepAlive();
29
-
30
- // ๅฎšๆ—ถๆถˆๆฏๆ็คบ
31
- useEffect(() => {
32
- const messages = [
33
- 'ๆ็คบ๏ผšๆŒ‰ Ctrl+C ๆต‹่ฏ•้€€ๅ‡บๅŠŸ่ƒฝ',
34
- '็ฌฌไธ€ๆฌก Ctrl+C ไผšๆ˜พ็คบๆ็คบ',
35
- '1.5็ง’ๅ†…็ฌฌไบŒๆฌก Ctrl+C ๆ‰ไผš้€€ๅ‡บ',
36
- '่ฏ•่ฏ•ๅœจ่พ“ๅ…ฅๆก†่พ“ๅ…ฅไธ€ไบ›ๅ†…ๅฎน',
37
- ];
38
- let index = 0;
39
-
40
- const timer = setInterval(() => {
41
- index = (index + 1) % messages.length;
42
- setMessage(messages[index]);
43
- }, 1500);
44
-
45
- return () => clearInterval(timer);
46
- }, []);
47
-
48
- // Ctrl+C ๅค„็† - ไฝฟ็”จ capture: true
49
- useInput((input, key) => {
50
- if ((key.ctrl && input === 'c') || key.escape) {
51
- const now = Date.now();
52
-
53
- if (now - lastCtrlC < 1500) {
54
- // 1.5็ง’ๅ†…็ฌฌไบŒๆฌกๆŒ‰ไธ‹ - ้€€ๅ‡บ
55
- console.log('\nโœ… ๆต‹่ฏ•ๆˆๅŠŸ๏ผ็จ‹ๅบๅฐ†ๅœจๅŒๅ‡ป Ctrl+C ๅŽ้€€ๅ‡บ\n');
56
- process.exit(0);
57
- } else {
58
- // ็ฌฌไธ€ๆฌกๆŒ‰ไธ‹ - ๆ˜พ็คบๆ็คบ
59
- setShowExitHint(true);
60
- setLastCtrlC(now);
61
- setTimeout(() => setShowExitHint(false), 1500);
62
- }
63
- return;
64
- }
65
-
66
- // ๅ…ถไป–ๆŒ‰้”ฎ๏ผˆๅฏ้€‰๏ผšๆ˜พ็คบๆŒ‰้”ฎไฟกๆฏ๏ผ‰
67
- if (input) {
68
- // ๅฏไปฅๅœจ่ฟ™้‡Œๅค„็†ๅ…ถไป–ๆŒ‰้”ฎ
69
- }
70
- }, { capture: true }); // ๅ…ณ้”ฎ๏ผšๆ•่Žท Ctrl+C
71
-
72
- return (
73
- <Box flexDirection="column" paddingX={2}>
74
- {/* ๆ ‡้ข˜ */}
75
- <Box marginBottom={1}>
76
- <Text bold color="cyan">๐Ÿงช Ctrl+C ๅŒๅ‡ป้€€ๅ‡บๆต‹่ฏ•</Text>
77
- </Box>
78
-
79
- {/* ๅฎšๆ—ถๆถˆๆฏๆ็คบ */}
80
- <Box marginBottom={1}>
81
- <Text color="yellow">๐Ÿ’ก {message}</Text>
82
- </Box>
83
-
84
- {/* ้€€ๅ‡บๆ็คบ */}
85
- {showExitHint && (
86
- <Box
87
- borderStyle="round"
88
- borderColor="red"
89
- paddingX={1}
90
- marginBottom={1}
91
- >
92
- <Text bold color="red">โš ๏ธ ๅ†ๆฌกๆŒ‰ Ctrl+C ๆˆ– ESC ้€€ๅ‡บ็จ‹ๅบ (1.5็ง’ๅ†…)</Text>
93
- </Box>
94
- )}
95
-
96
- {/* ่พ“ๅ…ฅๆก† */}
97
- <Box>
98
- <Text color="green">โฏ </Text>
99
- <TextInput
100
- value={input}
101
- onChange={setInput}
102
- placeholder="่พ“ๅ…ฅไปปไฝ•ๅ†…ๅฎนๆต‹่ฏ•..."
103
- />
104
- </Box>
105
-
106
- {/* ็Šถๆ€ไฟกๆฏ */}
107
- <Box marginTop={1}>
108
- <Text dimColor>
109
- ไธŠๆฌก Ctrl+C: {lastCtrlC > 0 ? new Date(lastCtrlC).toLocaleTimeString() : 'ๆœชๆŒ‰ไธ‹'} |
110
- ๆ็คบ็Šถๆ€: {showExitHint ? 'ๆ˜พ็คบไธญ' : '้š่—'}
111
- </Text>
112
- </Box>
113
-
114
- {/* ๅธฎๅŠฉไฟกๆฏ */}
115
- <Box marginTop={1}>
116
- <Text dimColor>
117
- ๆต‹่ฏ•่ฏดๆ˜Ž๏ผšๆŒ‰ไธ€ๆฌก Ctrl+C ๅบ”่ฏฅๆ˜พ็คบ็บข่‰ฒๆ็คบ๏ผŒๅ†ๆŒ‰ไธ€ๆฌก๏ผˆ1.5็ง’ๅ†…๏ผ‰ๅบ”่ฏฅ้€€ๅ‡บ
118
- </Text>
119
- </Box>
120
- </Box>
121
- );
122
- }
123
-
124
- render(<App />, {exitOnCtrlC: false});
125
-
126
- process.once('SIGINT', () => {console.log('FORK');});