@gguf/coder 0.3.0 → 0.3.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 (414) hide show
  1. package/.editorconfig +16 -0
  2. package/.env.example +63 -0
  3. package/.gitattributes +1 -0
  4. package/.semgrepignore +19 -0
  5. package/coder-dummy-file.ts +52 -0
  6. package/coder.config.example.json +59 -0
  7. package/coder.config.json +13 -0
  8. package/color_picker.html +36 -0
  9. package/package.json +2 -14
  10. package/scripts/extract-changelog.js +73 -0
  11. package/scripts/fetch-models.js +143 -0
  12. package/scripts/test.sh +40 -0
  13. package/scripts/update-homebrew-formula.sh +125 -0
  14. package/scripts/update-nix-version.sh +157 -0
  15. package/source/ai-sdk-client/AISDKClient.spec.ts +117 -0
  16. package/source/ai-sdk-client/AISDKClient.ts +155 -0
  17. package/source/ai-sdk-client/chat/chat-handler.spec.ts +121 -0
  18. package/source/ai-sdk-client/chat/chat-handler.ts +276 -0
  19. package/source/ai-sdk-client/chat/streaming-handler.spec.ts +173 -0
  20. package/source/ai-sdk-client/chat/streaming-handler.ts +110 -0
  21. package/source/ai-sdk-client/chat/tool-processor.spec.ts +92 -0
  22. package/source/ai-sdk-client/chat/tool-processor.ts +70 -0
  23. package/source/ai-sdk-client/converters/message-converter.spec.ts +220 -0
  24. package/source/ai-sdk-client/converters/message-converter.ts +113 -0
  25. package/source/ai-sdk-client/converters/tool-converter.spec.ts +90 -0
  26. package/source/ai-sdk-client/converters/tool-converter.ts +46 -0
  27. package/source/ai-sdk-client/error-handling/error-extractor.spec.ts +55 -0
  28. package/source/ai-sdk-client/error-handling/error-extractor.ts +15 -0
  29. package/source/ai-sdk-client/error-handling/error-parser.spec.ts +169 -0
  30. package/source/ai-sdk-client/error-handling/error-parser.ts +161 -0
  31. package/source/ai-sdk-client/index.ts +7 -0
  32. package/source/ai-sdk-client/providers/provider-factory.spec.ts +71 -0
  33. package/source/ai-sdk-client/providers/provider-factory.ts +41 -0
  34. package/source/ai-sdk-client/types.ts +9 -0
  35. package/source/ai-sdk-client-empty-message.spec.ts +141 -0
  36. package/source/ai-sdk-client-error-handling.spec.ts +186 -0
  37. package/source/ai-sdk-client-maxretries.spec.ts +114 -0
  38. package/source/ai-sdk-client-preparestep.spec.ts +279 -0
  39. package/source/app/App.spec.tsx +32 -0
  40. package/source/app/App.tsx +480 -0
  41. package/source/app/components/AppContainer.spec.tsx +96 -0
  42. package/source/app/components/AppContainer.tsx +56 -0
  43. package/source/app/components/ChatInterface.spec.tsx +163 -0
  44. package/source/app/components/ChatInterface.tsx +144 -0
  45. package/source/app/components/ModalSelectors.spec.tsx +141 -0
  46. package/source/app/components/ModalSelectors.tsx +135 -0
  47. package/source/app/helpers.spec.ts +97 -0
  48. package/source/app/helpers.ts +63 -0
  49. package/source/app/index.ts +4 -0
  50. package/source/app/types.ts +39 -0
  51. package/source/app/utils/appUtils.ts +294 -0
  52. package/source/app/utils/conversationState.ts +310 -0
  53. package/source/app.spec.tsx +244 -0
  54. package/source/cli.spec.ts +73 -0
  55. package/source/cli.tsx +51 -0
  56. package/source/client-factory.spec.ts +48 -0
  57. package/source/client-factory.ts +178 -0
  58. package/source/command-parser.spec.ts +127 -0
  59. package/source/command-parser.ts +36 -0
  60. package/source/commands/checkpoint.spec.tsx +277 -0
  61. package/source/commands/checkpoint.tsx +366 -0
  62. package/source/commands/clear.tsx +22 -0
  63. package/source/commands/custom-commands.tsx +121 -0
  64. package/source/commands/exit.ts +21 -0
  65. package/source/commands/export.spec.tsx +131 -0
  66. package/source/commands/export.tsx +79 -0
  67. package/source/commands/help.tsx +120 -0
  68. package/source/commands/index.ts +17 -0
  69. package/source/commands/init.tsx +339 -0
  70. package/source/commands/lsp-command.spec.tsx +281 -0
  71. package/source/commands/lsp.tsx +120 -0
  72. package/source/commands/mcp-command.spec.tsx +313 -0
  73. package/source/commands/mcp.tsx +162 -0
  74. package/source/commands/model-database.spec.tsx +758 -0
  75. package/source/commands/model-database.tsx +418 -0
  76. package/source/commands/model.ts +12 -0
  77. package/source/commands/provider.ts +12 -0
  78. package/source/commands/setup-config.tsx +16 -0
  79. package/source/commands/simple-commands.spec.tsx +175 -0
  80. package/source/commands/status.ts +12 -0
  81. package/source/commands/theme.ts +12 -0
  82. package/source/commands/update.spec.tsx +261 -0
  83. package/source/commands/update.tsx +201 -0
  84. package/source/commands/usage.spec.tsx +495 -0
  85. package/source/commands/usage.tsx +100 -0
  86. package/source/commands.spec.ts +436 -0
  87. package/source/commands.ts +83 -0
  88. package/source/components/assistant-message.spec.tsx +796 -0
  89. package/source/components/assistant-message.tsx +34 -0
  90. package/source/components/bash-execution-indicator.tsx +21 -0
  91. package/source/components/cancelling-indicator.tsx +16 -0
  92. package/source/components/chat-queue.spec.tsx +83 -0
  93. package/source/components/chat-queue.tsx +36 -0
  94. package/source/components/checkpoint-display.spec.tsx +219 -0
  95. package/source/components/checkpoint-display.tsx +126 -0
  96. package/source/components/checkpoint-selector.spec.tsx +173 -0
  97. package/source/components/checkpoint-selector.tsx +173 -0
  98. package/source/components/development-mode-indicator.spec.tsx +268 -0
  99. package/source/components/development-mode-indicator.tsx +38 -0
  100. package/source/components/message-box.spec.tsx +427 -0
  101. package/source/components/message-box.tsx +87 -0
  102. package/source/components/model-selector.tsx +132 -0
  103. package/source/components/provider-selector.tsx +75 -0
  104. package/source/components/random-spinner.tsx +19 -0
  105. package/source/components/security-disclaimer.tsx +73 -0
  106. package/source/components/status-connection-display.spec.tsx +133 -0
  107. package/source/components/status.tsx +267 -0
  108. package/source/components/theme-selector.tsx +126 -0
  109. package/source/components/tool-confirmation.tsx +190 -0
  110. package/source/components/tool-execution-indicator.tsx +33 -0
  111. package/source/components/tool-message.tsx +85 -0
  112. package/source/components/ui/titled-box.spec.tsx +207 -0
  113. package/source/components/ui/titled-box.tsx +57 -0
  114. package/source/components/usage/progress-bar.spec.tsx +398 -0
  115. package/source/components/usage/progress-bar.tsx +30 -0
  116. package/source/components/usage/usage-display.spec.tsx +780 -0
  117. package/source/components/usage/usage-display.tsx +291 -0
  118. package/source/components/user-input.spec.tsx +327 -0
  119. package/source/components/user-input.tsx +533 -0
  120. package/source/components/user-message.spec.tsx +230 -0
  121. package/source/components/user-message.tsx +84 -0
  122. package/source/components/welcome-message.tsx +76 -0
  123. package/source/config/env-substitution.ts +65 -0
  124. package/source/config/index.spec.ts +171 -0
  125. package/source/config/index.ts +154 -0
  126. package/source/config/paths.spec.ts +241 -0
  127. package/source/config/paths.ts +55 -0
  128. package/source/config/preferences.ts +51 -0
  129. package/source/config/themes.ts +315 -0
  130. package/source/constants.ts +130 -0
  131. package/source/context/mode-context.spec.ts +79 -0
  132. package/source/context/mode-context.ts +24 -0
  133. package/source/custom-commands/executor.spec.ts +142 -0
  134. package/source/custom-commands/executor.ts +64 -0
  135. package/source/custom-commands/loader.spec.ts +314 -0
  136. package/source/custom-commands/loader.ts +153 -0
  137. package/source/custom-commands/parser.ts +196 -0
  138. package/source/hooks/chat-handler/conversation/conversation-loop.spec.ts +39 -0
  139. package/source/hooks/chat-handler/conversation/conversation-loop.tsx +511 -0
  140. package/source/hooks/chat-handler/conversation/tool-executor.spec.ts +50 -0
  141. package/source/hooks/chat-handler/conversation/tool-executor.tsx +109 -0
  142. package/source/hooks/chat-handler/index.ts +12 -0
  143. package/source/hooks/chat-handler/state/streaming-state.spec.ts +26 -0
  144. package/source/hooks/chat-handler/state/streaming-state.ts +19 -0
  145. package/source/hooks/chat-handler/types.ts +38 -0
  146. package/source/hooks/chat-handler/useChatHandler.spec.tsx +321 -0
  147. package/source/hooks/chat-handler/useChatHandler.tsx +194 -0
  148. package/source/hooks/chat-handler/utils/context-checker.spec.ts +60 -0
  149. package/source/hooks/chat-handler/utils/context-checker.tsx +73 -0
  150. package/source/hooks/chat-handler/utils/message-helpers.spec.ts +42 -0
  151. package/source/hooks/chat-handler/utils/message-helpers.tsx +36 -0
  152. package/source/hooks/chat-handler/utils/tool-filters.spec.ts +109 -0
  153. package/source/hooks/chat-handler/utils/tool-filters.ts +64 -0
  154. package/source/hooks/useAppHandlers.tsx +291 -0
  155. package/source/hooks/useAppInitialization.tsx +422 -0
  156. package/source/hooks/useAppState.tsx +311 -0
  157. package/source/hooks/useDirectoryTrust.tsx +98 -0
  158. package/source/hooks/useInputState.ts +414 -0
  159. package/source/hooks/useModeHandlers.tsx +302 -0
  160. package/source/hooks/useNonInteractiveMode.ts +140 -0
  161. package/source/hooks/useTerminalWidth.tsx +81 -0
  162. package/source/hooks/useTheme.ts +18 -0
  163. package/source/hooks/useToolHandler.tsx +349 -0
  164. package/source/hooks/useUIState.ts +61 -0
  165. package/source/init/agents-template-generator.ts +421 -0
  166. package/source/init/existing-rules-extractor.ts +319 -0
  167. package/source/init/file-scanner.spec.ts +227 -0
  168. package/source/init/file-scanner.ts +238 -0
  169. package/source/init/framework-detector.ts +382 -0
  170. package/source/init/language-detector.ts +269 -0
  171. package/source/init/project-analyzer.spec.ts +231 -0
  172. package/source/init/project-analyzer.ts +458 -0
  173. package/source/lsp/index.ts +31 -0
  174. package/source/lsp/lsp-client.spec.ts +508 -0
  175. package/source/lsp/lsp-client.ts +487 -0
  176. package/source/lsp/lsp-manager.spec.ts +477 -0
  177. package/source/lsp/lsp-manager.ts +419 -0
  178. package/source/lsp/protocol.spec.ts +502 -0
  179. package/source/lsp/protocol.ts +360 -0
  180. package/source/lsp/server-discovery.spec.ts +654 -0
  181. package/source/lsp/server-discovery.ts +515 -0
  182. package/source/markdown-parser/html-entities.spec.ts +88 -0
  183. package/source/markdown-parser/html-entities.ts +45 -0
  184. package/source/markdown-parser/index.spec.ts +281 -0
  185. package/source/markdown-parser/index.ts +126 -0
  186. package/source/markdown-parser/table-parser.spec.ts +133 -0
  187. package/source/markdown-parser/table-parser.ts +114 -0
  188. package/source/markdown-parser/utils.spec.ts +70 -0
  189. package/source/markdown-parser/utils.ts +13 -0
  190. package/source/mcp/mcp-client.spec.ts +81 -0
  191. package/source/mcp/mcp-client.ts +625 -0
  192. package/source/mcp/transport-factory.spec.ts +406 -0
  193. package/source/mcp/transport-factory.ts +312 -0
  194. package/source/message-handler.ts +67 -0
  195. package/source/model-database/database-engine.spec.ts +494 -0
  196. package/source/model-database/database-engine.ts +50 -0
  197. package/source/model-database/model-database.spec.ts +363 -0
  198. package/source/model-database/model-database.ts +91 -0
  199. package/source/model-database/model-engine.spec.ts +447 -0
  200. package/source/model-database/model-engine.ts +65 -0
  201. package/source/model-database/model-fetcher.spec.ts +583 -0
  202. package/source/model-database/model-fetcher.ts +330 -0
  203. package/source/models/index.ts +1 -0
  204. package/source/models/models-cache.spec.ts +214 -0
  205. package/source/models/models-cache.ts +78 -0
  206. package/source/models/models-dev-client.spec.ts +379 -0
  207. package/source/models/models-dev-client.ts +329 -0
  208. package/source/models/models-types.ts +68 -0
  209. package/source/prompt-history.ts +155 -0
  210. package/source/security/command-injection.spec.ts +240 -0
  211. package/source/services/checkpoint-manager.spec.ts +523 -0
  212. package/source/services/checkpoint-manager.ts +466 -0
  213. package/source/services/file-snapshot.spec.ts +569 -0
  214. package/source/services/file-snapshot.ts +220 -0
  215. package/source/test-utils/render-with-theme.tsx +48 -0
  216. package/source/tokenization/index.ts +1 -0
  217. package/source/tokenization/tokenizer-factory.spec.ts +170 -0
  218. package/source/tokenization/tokenizer-factory.ts +125 -0
  219. package/source/tokenization/tokenizers/anthropic-tokenizer.spec.ts +200 -0
  220. package/source/tokenization/tokenizers/anthropic-tokenizer.ts +43 -0
  221. package/source/tokenization/tokenizers/fallback-tokenizer.spec.ts +236 -0
  222. package/source/tokenization/tokenizers/fallback-tokenizer.ts +26 -0
  223. package/source/tokenization/tokenizers/llama-tokenizer.spec.ts +224 -0
  224. package/source/tokenization/tokenizers/llama-tokenizer.ts +41 -0
  225. package/source/tokenization/tokenizers/openai-tokenizer.spec.ts +184 -0
  226. package/source/tokenization/tokenizers/openai-tokenizer.ts +57 -0
  227. package/source/tool-calling/index.ts +5 -0
  228. package/source/tool-calling/json-parser.spec.ts +639 -0
  229. package/source/tool-calling/json-parser.ts +247 -0
  230. package/source/tool-calling/tool-parser.spec.ts +395 -0
  231. package/source/tool-calling/tool-parser.ts +120 -0
  232. package/source/tool-calling/xml-parser.spec.ts +662 -0
  233. package/source/tool-calling/xml-parser.ts +289 -0
  234. package/source/tools/execute-bash.spec.tsx +353 -0
  235. package/source/tools/execute-bash.tsx +219 -0
  236. package/source/tools/execute-function.spec.ts +130 -0
  237. package/source/tools/fetch-url.spec.tsx +342 -0
  238. package/source/tools/fetch-url.tsx +172 -0
  239. package/source/tools/find-files.spec.tsx +924 -0
  240. package/source/tools/find-files.tsx +293 -0
  241. package/source/tools/index.ts +102 -0
  242. package/source/tools/lsp-get-diagnostics.tsx +192 -0
  243. package/source/tools/needs-approval.spec.ts +282 -0
  244. package/source/tools/read-file.spec.tsx +801 -0
  245. package/source/tools/read-file.tsx +387 -0
  246. package/source/tools/search-file-contents.spec.tsx +1273 -0
  247. package/source/tools/search-file-contents.tsx +293 -0
  248. package/source/tools/string-replace.spec.tsx +730 -0
  249. package/source/tools/string-replace.tsx +548 -0
  250. package/source/tools/tool-manager.ts +210 -0
  251. package/source/tools/tool-registry.spec.ts +415 -0
  252. package/source/tools/tool-registry.ts +228 -0
  253. package/source/tools/web-search.tsx +223 -0
  254. package/source/tools/write-file.spec.tsx +559 -0
  255. package/source/tools/write-file.tsx +228 -0
  256. package/source/types/app.ts +37 -0
  257. package/source/types/checkpoint.ts +48 -0
  258. package/source/types/commands.ts +46 -0
  259. package/source/types/components.ts +27 -0
  260. package/source/types/config.ts +103 -0
  261. package/source/types/core-connection-status.spec.ts +67 -0
  262. package/source/types/core.ts +181 -0
  263. package/source/types/hooks.ts +50 -0
  264. package/source/types/index.ts +12 -0
  265. package/source/types/markdown-parser.ts +11 -0
  266. package/source/types/mcp.ts +52 -0
  267. package/source/types/system.ts +16 -0
  268. package/source/types/tokenization.ts +41 -0
  269. package/source/types/ui.ts +40 -0
  270. package/source/types/usage.ts +58 -0
  271. package/source/types/utils.ts +16 -0
  272. package/source/usage/calculator.spec.ts +385 -0
  273. package/source/usage/calculator.ts +104 -0
  274. package/source/usage/storage.spec.ts +703 -0
  275. package/source/usage/storage.ts +238 -0
  276. package/source/usage/tracker.spec.ts +456 -0
  277. package/source/usage/tracker.ts +102 -0
  278. package/source/utils/atomic-deletion.spec.ts +194 -0
  279. package/source/utils/atomic-deletion.ts +127 -0
  280. package/source/utils/bounded-map.spec.ts +300 -0
  281. package/source/utils/bounded-map.ts +193 -0
  282. package/source/utils/checkpoint-utils.spec.ts +222 -0
  283. package/source/utils/checkpoint-utils.ts +92 -0
  284. package/source/utils/error-formatter.spec.ts +169 -0
  285. package/source/utils/error-formatter.ts +194 -0
  286. package/source/utils/file-autocomplete.spec.ts +173 -0
  287. package/source/utils/file-autocomplete.ts +196 -0
  288. package/source/utils/file-cache.spec.ts +309 -0
  289. package/source/utils/file-cache.ts +195 -0
  290. package/source/utils/file-content-loader.spec.ts +180 -0
  291. package/source/utils/file-content-loader.ts +179 -0
  292. package/source/utils/file-mention-handler.spec.ts +261 -0
  293. package/source/utils/file-mention-handler.ts +84 -0
  294. package/source/utils/file-mention-parser.spec.ts +182 -0
  295. package/source/utils/file-mention-parser.ts +170 -0
  296. package/source/utils/fuzzy-matching.spec.ts +149 -0
  297. package/source/utils/fuzzy-matching.ts +146 -0
  298. package/source/utils/indentation-normalizer.spec.ts +216 -0
  299. package/source/utils/indentation-normalizer.ts +76 -0
  300. package/source/utils/installation-detector.spec.ts +178 -0
  301. package/source/utils/installation-detector.ts +153 -0
  302. package/source/utils/logging/config.spec.ts +311 -0
  303. package/source/utils/logging/config.ts +210 -0
  304. package/source/utils/logging/console-facade.spec.ts +184 -0
  305. package/source/utils/logging/console-facade.ts +384 -0
  306. package/source/utils/logging/correlation.spec.ts +679 -0
  307. package/source/utils/logging/correlation.ts +474 -0
  308. package/source/utils/logging/formatters.spec.ts +464 -0
  309. package/source/utils/logging/formatters.ts +207 -0
  310. package/source/utils/logging/health-monitor/alerts/alert-manager.spec.ts +93 -0
  311. package/source/utils/logging/health-monitor/alerts/alert-manager.ts +79 -0
  312. package/source/utils/logging/health-monitor/checks/configuration-check.spec.ts +56 -0
  313. package/source/utils/logging/health-monitor/checks/configuration-check.ts +43 -0
  314. package/source/utils/logging/health-monitor/checks/logging-check.spec.ts +56 -0
  315. package/source/utils/logging/health-monitor/checks/logging-check.ts +58 -0
  316. package/source/utils/logging/health-monitor/checks/memory-check.spec.ts +100 -0
  317. package/source/utils/logging/health-monitor/checks/memory-check.ts +78 -0
  318. package/source/utils/logging/health-monitor/checks/performance-check.spec.ts +56 -0
  319. package/source/utils/logging/health-monitor/checks/performance-check.ts +56 -0
  320. package/source/utils/logging/health-monitor/checks/request-check.spec.ts +56 -0
  321. package/source/utils/logging/health-monitor/checks/request-check.ts +76 -0
  322. package/source/utils/logging/health-monitor/core/health-check-runner.spec.ts +70 -0
  323. package/source/utils/logging/health-monitor/core/health-check-runner.ts +138 -0
  324. package/source/utils/logging/health-monitor/core/health-monitor.spec.ts +58 -0
  325. package/source/utils/logging/health-monitor/core/health-monitor.ts +344 -0
  326. package/source/utils/logging/health-monitor/core/scoring.spec.ts +65 -0
  327. package/source/utils/logging/health-monitor/core/scoring.ts +91 -0
  328. package/source/utils/logging/health-monitor/index.ts +15 -0
  329. package/source/utils/logging/health-monitor/instances.ts +48 -0
  330. package/source/utils/logging/health-monitor/middleware/http-middleware.spec.ts +141 -0
  331. package/source/utils/logging/health-monitor/middleware/http-middleware.ts +75 -0
  332. package/source/utils/logging/health-monitor/types.ts +126 -0
  333. package/source/utils/logging/index.spec.ts +284 -0
  334. package/source/utils/logging/index.ts +236 -0
  335. package/source/utils/logging/integration.spec.ts +441 -0
  336. package/source/utils/logging/log-method-factory.spec.ts +573 -0
  337. package/source/utils/logging/log-method-factory.ts +233 -0
  338. package/source/utils/logging/log-query/aggregation/aggregator.spec.ts +277 -0
  339. package/source/utils/logging/log-query/aggregation/aggregator.ts +159 -0
  340. package/source/utils/logging/log-query/aggregation/facet-generator.spec.ts +159 -0
  341. package/source/utils/logging/log-query/aggregation/facet-generator.ts +47 -0
  342. package/source/utils/logging/log-query/index.ts +23 -0
  343. package/source/utils/logging/log-query/query/filter-predicates.spec.ts +247 -0
  344. package/source/utils/logging/log-query/query/filter-predicates.ts +154 -0
  345. package/source/utils/logging/log-query/query/query-builder.spec.ts +182 -0
  346. package/source/utils/logging/log-query/query/query-builder.ts +151 -0
  347. package/source/utils/logging/log-query/query/query-engine.spec.ts +214 -0
  348. package/source/utils/logging/log-query/query/query-engine.ts +45 -0
  349. package/source/utils/logging/log-query/storage/circular-buffer.spec.ts +143 -0
  350. package/source/utils/logging/log-query/storage/circular-buffer.ts +75 -0
  351. package/source/utils/logging/log-query/storage/index-manager.spec.ts +150 -0
  352. package/source/utils/logging/log-query/storage/index-manager.ts +71 -0
  353. package/source/utils/logging/log-query/storage/log-storage.spec.ts +257 -0
  354. package/source/utils/logging/log-query/storage/log-storage.ts +80 -0
  355. package/source/utils/logging/log-query/types.ts +163 -0
  356. package/source/utils/logging/log-query/utils/helpers.spec.ts +263 -0
  357. package/source/utils/logging/log-query/utils/helpers.ts +72 -0
  358. package/source/utils/logging/log-query/utils/sorting.spec.ts +182 -0
  359. package/source/utils/logging/log-query/utils/sorting.ts +61 -0
  360. package/source/utils/logging/logger-provider.spec.ts +262 -0
  361. package/source/utils/logging/logger-provider.ts +362 -0
  362. package/source/utils/logging/performance.spec.ts +209 -0
  363. package/source/utils/logging/performance.ts +757 -0
  364. package/source/utils/logging/pino-logger.spec.ts +425 -0
  365. package/source/utils/logging/pino-logger.ts +514 -0
  366. package/source/utils/logging/redaction.spec.ts +490 -0
  367. package/source/utils/logging/redaction.ts +267 -0
  368. package/source/utils/logging/request-tracker.spec.ts +1198 -0
  369. package/source/utils/logging/request-tracker.ts +803 -0
  370. package/source/utils/logging/transports.spec.ts +505 -0
  371. package/source/utils/logging/transports.ts +305 -0
  372. package/source/utils/logging/types.ts +216 -0
  373. package/source/utils/message-builder.spec.ts +179 -0
  374. package/source/utils/message-builder.ts +101 -0
  375. package/source/utils/message-queue.tsx +486 -0
  376. package/source/utils/paste-detection.spec.ts +69 -0
  377. package/source/utils/paste-detection.ts +124 -0
  378. package/source/utils/paste-roundtrip.spec.ts +442 -0
  379. package/source/utils/paste-utils.spec.ts +128 -0
  380. package/source/utils/paste-utils.ts +52 -0
  381. package/source/utils/programming-language-helper.spec.ts +74 -0
  382. package/source/utils/programming-language-helper.ts +32 -0
  383. package/source/utils/prompt-assembly.spec.ts +221 -0
  384. package/source/utils/prompt-processor.ts +173 -0
  385. package/source/utils/tool-args-parser.spec.ts +136 -0
  386. package/source/utils/tool-args-parser.ts +54 -0
  387. package/source/utils/tool-cancellation.spec.ts +230 -0
  388. package/source/utils/tool-cancellation.ts +28 -0
  389. package/source/utils/tool-result-display.spec.tsx +469 -0
  390. package/source/utils/tool-result-display.tsx +90 -0
  391. package/source/utils/update-checker.spec.ts +383 -0
  392. package/source/utils/update-checker.ts +183 -0
  393. package/source/wizard/config-wizard.spec.tsx +103 -0
  394. package/source/wizard/config-wizard.tsx +382 -0
  395. package/source/wizard/steps/location-step.spec.tsx +186 -0
  396. package/source/wizard/steps/location-step.tsx +147 -0
  397. package/source/wizard/steps/mcp-step.spec.tsx +607 -0
  398. package/source/wizard/steps/mcp-step.tsx +632 -0
  399. package/source/wizard/steps/provider-step.spec.tsx +342 -0
  400. package/source/wizard/steps/provider-step.tsx +957 -0
  401. package/source/wizard/steps/summary-step.spec.tsx +749 -0
  402. package/source/wizard/steps/summary-step.tsx +228 -0
  403. package/source/wizard/templates/mcp-templates.spec.ts +613 -0
  404. package/source/wizard/templates/mcp-templates.ts +570 -0
  405. package/source/wizard/templates/provider-templates.spec.ts +152 -0
  406. package/source/wizard/templates/provider-templates.ts +485 -0
  407. package/source/wizard/utils/fetch-cloud-models.spec.ts +428 -0
  408. package/source/wizard/utils/fetch-cloud-models.ts +223 -0
  409. package/source/wizard/utils/fetch-local-models.spec.ts +297 -0
  410. package/source/wizard/utils/fetch-local-models.ts +192 -0
  411. package/source/wizard/validation-array.spec.ts +264 -0
  412. package/source/wizard/validation.spec.ts +373 -0
  413. package/source/wizard/validation.ts +232 -0
  414. package/source/app/prompts/main-prompt.md +0 -122
package/.editorconfig ADDED
@@ -0,0 +1,16 @@
1
+ root = true
2
+
3
+ [*]
4
+ indent_style = tab
5
+ end_of_line = lf
6
+ charset = utf-8
7
+ trim_trailing_whitespace = true
8
+ insert_final_newline = true
9
+
10
+ [*.yml]
11
+ indent_style = space
12
+ indent_size = 2
13
+
14
+ [*.nix]
15
+ indent_style = space
16
+ indent_size = 2
package/.env.example ADDED
@@ -0,0 +1,63 @@
1
+ # Environment Variables for Coder
2
+ #
3
+ # 1. Copy this file to .env and fill in your actual values
4
+ # 2. Reference variables in agents.config.json using $VAR_NAME syntax
5
+ #
6
+ # Example in agents.config.json:
7
+ # {
8
+ # "coder": {
9
+ # "providers": [{
10
+ # "apiKey": "$OPENROUTER_API_KEY",
11
+ # "models": ["$FALLBACK_MODEL"]
12
+ # }]
13
+ # }
14
+ # }
15
+
16
+ # API Keys for AI Providers
17
+ OPENROUTER_API_KEY=your-openrouter-api-key-here
18
+ ZAI_AUTH_TOKEN=your-zai-api-key-here
19
+ ZAI_CODING_AUTH_TOKEN=your-zai-coding-api-key-here
20
+ OPENAI_API_KEY=your-openai-api-key-here
21
+
22
+ # Installation method override (npm, homebrew, nix, unknown)
23
+ # Used for testing and debugging installation detection
24
+ # CODER_INSTALL_METHOD=npm
25
+
26
+ # Model Names (optional)
27
+ FALLBACK_MODEL=your-fallback-model-name
28
+
29
+ # Custom Directory Locations (optional)
30
+ # Override default config directory location
31
+ # Default: macOS: ~/Library/Preferences/coder
32
+ # Linux: ~/.config/coder
33
+ # Windows: %APPDATA%\coder
34
+ CODER_CONFIG_DIR=/custom/path/to/config
35
+
36
+ # Override default app data directory location
37
+ # Default: macOS: ~/Library/Application Support/coder
38
+ # Linux: ~/.local/share/coder (or $XDG_DATA_HOME/coder)
39
+ # Windows: %APPDATA%\coder
40
+ CODER_DATA_DIR=/custom/path/to/data
41
+
42
+ # Cross-platform data directory override (mainly for testing)
43
+ # Takes precedence over platform-specific defaults
44
+ XDG_DATA_HOME=/custom/xdg/data
45
+
46
+ # Logging Configuration (optional)
47
+ CODER_LOG_LEVEL=debug
48
+ CODER_LOG_TO_FILE=true
49
+ CODER_LOG_TO_CONSOLE=true
50
+ CODER_LOG_DIR=/custom/path/to/logs
51
+ CODER_LOG_TRANSPORTS=default
52
+
53
+ # Disable file logging entirely (optional)
54
+ # CODER_LOG_DISABLE_FILE=true
55
+
56
+ # Correlation Configuration (optional)
57
+ CODER_CORRELATION_DEBUG=false
58
+ CODER_CORRELATION_ENABLED=true
59
+ CODER_CORRELATION_LEGACY_FALLBACK=false
60
+
61
+ # MCP Server Environment Variables
62
+ GITHUB_TOKEN=your-github-token
63
+ GITHUB_PAT=your-github-personal-access-token
package/.gitattributes ADDED
@@ -0,0 +1 @@
1
+ * text=auto eol=lf
package/.semgrepignore ADDED
@@ -0,0 +1,19 @@
1
+ # Exclude test files from security scanning (not production code)
2
+ **/*.spec.ts
3
+ **/*.spec.tsx
4
+ **/*.test.ts
5
+ **/*.test.tsx
6
+
7
+ # Exclude test directories
8
+ **/test/**
9
+ **/tests/**
10
+ **/__tests__/**
11
+
12
+ # Exclude configuration and build files
13
+ **/.husky/**
14
+ **/dist/**
15
+ **/build/**
16
+ **/node_modules/**
17
+
18
+ # Exclude TypeScript declaration files
19
+ **/*.d.ts
@@ -0,0 +1,52 @@
1
+ // A simple file to give to models to test Coder's functionality
2
+
3
+ export function greet(name: string): string {
4
+ return `Hello ${name}!`;
5
+ }
6
+
7
+ export function add(a: number, b: number): number {
8
+ return a + b;
9
+ }
10
+
11
+ export function multiply(x: number, y: number): number {
12
+ return x * y;
13
+ }
14
+
15
+ // More functions to make a medium-sized file
16
+
17
+ export function subtract(a: number, b: number): number {
18
+ return a - b;
19
+ }
20
+
21
+ export function divide(a: number, b: number): number {
22
+ if (b === 0) {
23
+ throw new Error('Division by zero');
24
+ }
25
+ return a / b;
26
+ }
27
+
28
+ export function power(base: number, exponent: number): number {
29
+ return Math.pow(base, exponent);
30
+ }
31
+
32
+ export function sqrt(n: number): number {
33
+ return Math.sqrt(n);
34
+ }
35
+
36
+ export function abs(n: number): number {
37
+ return Math.abs(n);
38
+ }
39
+
40
+ export function round(n: number): number {
41
+ return Math.round(n);
42
+ }
43
+
44
+ export function floor(n: number): number {
45
+ return Math.floor(n);
46
+ }
47
+
48
+ export function ceil(n: number): number {
49
+ return Math.ceil(n);
50
+ }
51
+
52
+ // End of test file
@@ -0,0 +1,59 @@
1
+ {
2
+ "coder": {
3
+ "providers": [
4
+ {
5
+ "name": "OpenRouter",
6
+ "baseUrl": "https://openrouter.ai/api/v1",
7
+ "apiKey": "your-openrouter-api-key-here",
8
+ "models": ["openai/gpt-4o-mini", "anthropic/claude-3-haiku"]
9
+ },
10
+ {
11
+ "name": "GitHub Models",
12
+ "baseUrl": "https://models.github.ai/inference",
13
+ "apiKey": "your-github-token-here",
14
+ "models": ["openai/gpt-4o-mini", "openai/gpt-4o"]
15
+ },
16
+ {
17
+ "name": "Local Ollama",
18
+ "baseUrl": "http://localhost:11434/v1",
19
+ "models": ["llama3.2", "qwen2.5-coder"]
20
+ },
21
+ {
22
+ "name": "OpenAI Compatible",
23
+ "baseUrl": "http://localhost:1234/v1",
24
+ "apiKey": "optional-api-key-if-needed",
25
+ "models": ["local-model-1", "local-model-2"]
26
+ },
27
+ {
28
+ "name": "Z.ai",
29
+ "baseUrl": "https://api.z.ai/api/paas/v4/",
30
+ "apiKey": "your-z.ai-api-key",
31
+ "models": ["glm-4.7", "glm-4.5", "glm-4.5-air"]
32
+ },
33
+ {
34
+ "name": "Z.ai Coding Subscription",
35
+ "baseUrl": "https://api.z.ai/api/coding/paas/v4/",
36
+ "apiKey": "your-z.ai-coding-api-key",
37
+ "models": ["glm-4.7", "glm-4.5", "glm-4.5-air"]
38
+ }
39
+ ],
40
+ "mcpServers": [
41
+ {
42
+ "name": "filesystem",
43
+ "command": "npx",
44
+ "args": [
45
+ "@modelcontextprotocol/server-filesystem",
46
+ "/path/to/allowed/directory"
47
+ ]
48
+ },
49
+ {
50
+ "name": "github",
51
+ "command": "npx",
52
+ "args": ["@modelcontextprotocol/server-github"],
53
+ "env": {
54
+ "GITHUB_TOKEN": "your-github-token"
55
+ }
56
+ }
57
+ ]
58
+ }
59
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "coder": {
3
+ "providers": [
4
+ {
5
+ "name": "lmstudio",
6
+ "models": [
7
+ "openai/gpt-oss-20b"
8
+ ],
9
+ "baseUrl": "http://localhost:1234/v1"
10
+ }
11
+ ]
12
+ }
13
+ }
@@ -0,0 +1,36 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <title>Random Color Picker</title>
6
+ <style>
7
+ body {
8
+ transition: background-color 0.5s;
9
+ font-family: Arial, sans-serif;
10
+ display: flex;
11
+ justify-content: center;
12
+ align-items: center;
13
+ height: 100vh;
14
+ margin: 0;
15
+ }
16
+ button {
17
+ padding: 1rem 2rem;
18
+ font-size: 1.2rem;
19
+ cursor: pointer;
20
+ }
21
+ </style>
22
+ </head>
23
+ <body>
24
+ <button id="pick">Pick Random Color</button>
25
+ <script>
26
+ function randomHex() {
27
+ const hex = Math.floor(Math.random()*0xFFFFFF).toString(16);
28
+ return '#' + ('000000' + hex).slice(-6);
29
+ }
30
+
31
+ document.getElementById('pick').addEventListener('click', () => {
32
+ document.body.style.backgroundColor = randomHex();
33
+ });
34
+ </script>
35
+ </body>
36
+ </html>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gguf/coder",
3
3
  "main": "dist/cli.js",
4
- "version": "0.3.0",
4
+ "version": "0.3.1",
5
5
  "description": "Coder",
6
6
  "keywords": [
7
7
  "ai",
@@ -21,13 +21,9 @@
21
21
  "build": "tsc && tsc-alias",
22
22
  "dev": "tsc --watch",
23
23
  "start": "node dist/cli.js",
24
- "prepublishOnly": "pnpm run build",
24
+ "prepublishOnly": "npm run build",
25
25
  "prepare": "husky"
26
26
  },
27
- "files": [
28
- "dist",
29
- "source/app/prompts/main-prompt.md"
30
- ],
31
27
  "dependencies": {
32
28
  "@ai-sdk/openai-compatible": "2.0.0-beta.57",
33
29
  "@anthropic-ai/tokenizer": "^0.0.4",
@@ -70,13 +66,5 @@
70
66
  "tsc-alias": "^1.8.16",
71
67
  "tsx": "^4.20.6",
72
68
  "typescript": "^5.0.3"
73
- },
74
- "pnpm": {
75
- "overrides": {
76
- "glob@>=10.2.0 <10.5.0": ">=10.5.0",
77
- "js-yaml@<3.14.2": ">=3.14.2",
78
- "js-yaml@>=4.0.0 <4.1.1": ">=4.1.1",
79
- "jws@<3.2.3": ">=3.2.3"
80
- }
81
69
  }
82
70
  }
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Extract changelog section for a specific version from CHANGELOG.md
5
+ * Usage: node scripts/extract-changelog.js [version]
6
+ * If no version is provided, reads from package.json
7
+ */
8
+
9
+ import {readFileSync} from 'fs';
10
+ import {dirname, join} from 'path';
11
+ import {fileURLToPath} from 'url';
12
+
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = dirname(__filename);
15
+ const rootDir = join(__dirname, '..');
16
+
17
+ // Get version from command line arg or package.json
18
+ let version = process.argv[2];
19
+ if (!version) {
20
+ const packageJson = JSON.parse(
21
+ readFileSync(join(rootDir, 'package.json'), 'utf-8'),
22
+ );
23
+ version = packageJson.version;
24
+ }
25
+
26
+ // Read CHANGELOG.md
27
+ let changelogContent;
28
+ try {
29
+ changelogContent = readFileSync(join(rootDir, 'CHANGELOG.md'), 'utf-8');
30
+ } catch (error) {
31
+ console.error('Error reading CHANGELOG.md:', error.message);
32
+ process.exit(1);
33
+ }
34
+
35
+ // Extract section for this version
36
+ // Support multiple formats:
37
+ // 1. ## [version] - date (Keep a Changelog format)
38
+ // 2. ## version (simple heading)
39
+ // 3. # version (simple heading with single #)
40
+ const versionPatterns = [
41
+ // Pattern 1: ## [version] or ## version
42
+ new RegExp(
43
+ `##+ \\[?${version.replace(
44
+ /\./g,
45
+ '\\.',
46
+ )}\\]?.*?\\n([\\s\\S]*?)(?=\\n##+ |$)`,
47
+ ),
48
+ // Pattern 2: # version
49
+ new RegExp(
50
+ `#+ ${version.replace(/\./g, '\\.')}.*?\\n([\\s\\S]*?)(?=\\n#+ |$)`,
51
+ ),
52
+ ];
53
+
54
+ let match = null;
55
+ for (const pattern of versionPatterns) {
56
+ match = changelogContent.match(pattern);
57
+ if (match) break;
58
+ }
59
+
60
+ if (!match) {
61
+ console.error(`No changelog entry found for version ${version}`);
62
+ console.error(
63
+ 'Please add a changelog entry in CHANGELOG.md with one of these formats:',
64
+ );
65
+ console.error(`## [${version}] - ${new Date().toISOString().split('T')[0]}`);
66
+ console.error(`or`);
67
+ console.error(`# ${version}`);
68
+ process.exit(1);
69
+ }
70
+
71
+ // Output the changelog section (trim leading/trailing whitespace)
72
+ const changelogSection = match[1].trim();
73
+ console.log(changelogSection);
@@ -0,0 +1,143 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Post-install script to fetch and cache models.dev data
5
+ * This script runs after npm/pnpm install to ensure fresh model metadata
6
+ */
7
+
8
+ import * as fs from 'node:fs';
9
+ import * as path from 'node:path';
10
+ import {request} from 'undici';
11
+ import {xdgCache} from 'xdg-basedir';
12
+
13
+ const MODELS_DEV_API_URL = 'https://models.dev/api.json';
14
+ const CACHE_EXPIRATION_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
15
+
16
+ // Get cache directory
17
+ const DEFAULT_CACHE_DIR =
18
+ process.platform === 'darwin'
19
+ ? path.join(process.env.HOME || '~', 'Library', 'Caches')
20
+ : path.join(process.env.HOME || '~', '.cache');
21
+
22
+ const cacheBase = xdgCache || DEFAULT_CACHE_DIR;
23
+ const cacheDir = path.join(cacheBase, 'coder');
24
+ const cacheFilePath = path.join(cacheDir, 'models.json');
25
+
26
+ /**
27
+ * Fetch models data from models.dev
28
+ */
29
+ async function fetchModels() {
30
+ console.log('Fetching model metadata from models.dev...');
31
+
32
+ try {
33
+ const response = await request(MODELS_DEV_API_URL, {
34
+ method: 'GET',
35
+ headersTimeout: 10000,
36
+ bodyTimeout: 30000,
37
+ });
38
+
39
+ if (response.statusCode !== 200) {
40
+ throw new Error(`HTTP ${response.statusCode}`);
41
+ }
42
+
43
+ const data = await response.body.json();
44
+
45
+ // Count models for logging
46
+ let totalModels = 0;
47
+ for (const provider of Object.values(data)) {
48
+ totalModels += Object.keys(provider.models).length;
49
+ }
50
+
51
+ console.log(
52
+ `✅ Successfully fetched ${totalModels} models from ${
53
+ Object.keys(data).length
54
+ } providers`,
55
+ );
56
+
57
+ return data;
58
+ } catch (error) {
59
+ console.warn('⚠️ Failed to fetch models.dev data:', error.message);
60
+ return null;
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Ensure cache directory exists
66
+ */
67
+ function ensureCacheDir() {
68
+ if (!fs.existsSync(cacheDir)) {
69
+ fs.mkdirSync(cacheDir, {recursive: true});
70
+ }
71
+ }
72
+
73
+ /**
74
+ * Write data to cache
75
+ */
76
+ function writeCache(data) {
77
+ try {
78
+ ensureCacheDir();
79
+
80
+ const cached = {
81
+ data,
82
+ fetchedAt: Date.now(),
83
+ expiresAt: Date.now() + CACHE_EXPIRATION_MS,
84
+ };
85
+
86
+ fs.writeFileSync(cacheFilePath, JSON.stringify(cached, null, 2), 'utf-8');
87
+ console.log(`💾 Cached to: ${cacheFilePath}`);
88
+ } catch (error) {
89
+ console.warn('⚠️ Failed to write cache:', error.message);
90
+ }
91
+ }
92
+
93
+ /**
94
+ * Check if existing cache is valid
95
+ */
96
+ function isCacheValid() {
97
+ try {
98
+ if (!fs.existsSync(cacheFilePath)) {
99
+ return false;
100
+ }
101
+
102
+ const content = fs.readFileSync(cacheFilePath, 'utf-8');
103
+ const cached = JSON.parse(content);
104
+
105
+ return Date.now() < cached.expiresAt;
106
+ } catch {
107
+ return false;
108
+ }
109
+ }
110
+
111
+ /**
112
+ * Main execution
113
+ */
114
+ async function main() {
115
+ // Skip if in CI environment (don't spam models.dev API)
116
+ if (process.env.CI === 'true') {
117
+ console.log('ℹ️ Skipping models.dev fetch in CI environment');
118
+ return;
119
+ }
120
+
121
+ // Check if cache is still valid
122
+ if (isCacheValid()) {
123
+ console.log('✅ Models cache is still valid, skipping fetch');
124
+ return;
125
+ }
126
+
127
+ // Fetch and cache models data
128
+ const data = await fetchModels();
129
+
130
+ if (data) {
131
+ writeCache(data);
132
+ } else {
133
+ console.log('ℹ️ Installation will continue without model metadata cache');
134
+ console.log('ℹ️ Model metadata will be fetched on first use');
135
+ }
136
+ }
137
+
138
+ // Run the script
139
+ main().catch(error => {
140
+ // Don't fail the installation if this script fails
141
+ console.error('⚠️ Post-install script error:', error.message);
142
+ process.exit(0); // Exit with success to not break installation
143
+ });
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Test script that runs all test:all commands
4
+ # Exit on first error
5
+ set -e
6
+
7
+ echo "🧪 Running all tests..."
8
+ echo ""
9
+
10
+ echo "📝 Checking code formatting..."
11
+ pnpm test:format
12
+ echo ""
13
+ echo "✅ Format check passed"
14
+ echo ""
15
+
16
+ echo "🔍 Checking TypeScript types..."
17
+ pnpm test:types
18
+ echo ""
19
+ echo "✅ Type check passed"
20
+ echo ""
21
+
22
+ echo "🔎 Running linter..."
23
+ pnpm test:lint
24
+ echo ""
25
+ echo "✅ Lint check passed"
26
+ echo ""
27
+
28
+ echo "🧩 Running AVA tests..."
29
+ pnpm test:ava
30
+ echo ""
31
+ echo "✅ AVA tests passed"
32
+ echo ""
33
+
34
+ echo "🗑️ Checking for unused code..."
35
+ pnpm test:knip
36
+ echo ""
37
+ echo "✅ Knip check passed"
38
+ echo ""
39
+
40
+ echo "✅ Everything passes!"
@@ -0,0 +1,125 @@
1
+ #!/usr/bin/env bash
2
+ # Update Homebrew formula version and SHA256 hash for a new release
3
+ # Usage: ./scripts/update-homebrew-formula.sh <version>
4
+ # Example: ./scripts/update-homebrew-formula.sh 1.15.0
5
+
6
+ set -e
7
+
8
+ VERSION=$1
9
+ # FORMULA_FILE="Formula/coder.rb"
10
+ NPM_PACKAGE="@gguf/coder"
11
+
12
+ # Color codes for output
13
+ RED='\033[0;31m'
14
+ GREEN='\033[0;32m'
15
+ YELLOW='\033[1;33m'
16
+ NC='\033[0m' # No Color
17
+
18
+ if [ -z "$VERSION" ]; then
19
+ echo -e "${RED}Error: Version number required${NC}"
20
+ echo "Usage: $0 <version>"
21
+ echo "Example: $0 1.15.0"
22
+ exit 1
23
+ fi
24
+
25
+ echo -e "${YELLOW}Updating Homebrew formula to version ${VERSION}...${NC}"
26
+ echo ""
27
+
28
+ # Step 1: Update version in formula file
29
+ echo "Step 1: Updating version number in ${FORMULA_FILE}..."
30
+ NPM_URL="https://registry.npmjs.org/${NPM_PACKAGE}/-/coder-${VERSION}.tgz"
31
+
32
+ if [[ "$OSTYPE" == "darwin"* ]]; then
33
+ # macOS requires -i '' for in-place editing
34
+ sed -i '' "s|url \"https://registry.npmjs.org/${NPM_PACKAGE}/-/coder-.*\.tgz\"|url \"${NPM_URL}\"|" "$FORMULA_FILE"
35
+ else
36
+ # Linux
37
+ sed -i "s|url \"https://registry.npmjs.org/${NPM_PACKAGE}/-/coder-.*\.tgz\"|url \"${NPM_URL}\"|" "$FORMULA_FILE"
38
+ fi
39
+
40
+ # Step 2: Download tarball and calculate SHA256
41
+ echo "Step 2: Downloading tarball from NPM..."
42
+ echo "URL: ${NPM_URL}"
43
+
44
+ TEMP_FILE=$(mktemp)
45
+ trap "rm -f ${TEMP_FILE}" EXIT
46
+
47
+ if ! curl -sSL "${NPM_URL}" -o "${TEMP_FILE}"; then
48
+ echo -e "${RED}Error: Failed to download tarball from NPM${NC}"
49
+ echo "Please verify that version ${VERSION} has been published to NPM"
50
+ echo "Check: https://www.npmjs.com/package/${NPM_PACKAGE}"
51
+ exit 1
52
+ fi
53
+
54
+ echo "Step 3: Calculating SHA256 hash..."
55
+ if command -v shasum >/dev/null 2>&1; then
56
+ # macOS and some Linux systems
57
+ SHA256=$(shasum -a 256 "${TEMP_FILE}" | awk '{print $1}')
58
+ elif command -v sha256sum >/dev/null 2>&1; then
59
+ # Most Linux systems
60
+ SHA256=$(sha256sum "${TEMP_FILE}" | awk '{print $1}')
61
+ else
62
+ echo -e "${RED}Error: Neither shasum nor sha256sum found${NC}"
63
+ echo "Please install one of these tools to calculate SHA256 hashes"
64
+ exit 1
65
+ fi
66
+
67
+ if [ -z "$SHA256" ]; then
68
+ echo -e "${RED}Error: Failed to calculate SHA256 hash${NC}"
69
+ exit 1
70
+ fi
71
+
72
+ echo -e "${GREEN}Found hash: ${SHA256}${NC}"
73
+ echo ""
74
+
75
+ # Step 4: Update formula with real hash
76
+ echo "Step 4: Updating formula with calculated hash..."
77
+ if [[ "$OSTYPE" == "darwin"* ]]; then
78
+ sed -i '' "s/sha256 \".*\"/sha256 \"${SHA256}\"/" "$FORMULA_FILE"
79
+ else
80
+ sed -i "s/sha256 \".*\"/sha256 \"${SHA256}\"/" "$FORMULA_FILE"
81
+ fi
82
+
83
+ # Step 5: Validate formula syntax
84
+ echo "Step 5: Validating formula syntax..."
85
+ if ! ruby -c "$FORMULA_FILE" > /dev/null 2>&1; then
86
+ echo -e "${RED}✗ Formula has syntax errors${NC}"
87
+ ruby -c "$FORMULA_FILE"
88
+ exit 1
89
+ fi
90
+
91
+ echo -e "${GREEN}✓ Formula syntax is valid${NC}"
92
+
93
+ # Step 6: Audit formula (if brew is available)
94
+ if command -v brew >/dev/null 2>&1; then
95
+ echo "Step 6: Auditing formula with Homebrew..."
96
+ # Note: brew audit with path doesn't work in current Homebrew versions
97
+ # This is a known limitation, so we skip it for now
98
+ echo -e "${YELLOW}Note: Automated brew audit is not available for local formulae${NC}"
99
+ echo -e "${YELLOW}Manual audit will be required after pushing to repository${NC}"
100
+ else
101
+ echo -e "${YELLOW}Step 6: Skipping brew audit (brew not installed)${NC}"
102
+ fi
103
+
104
+ echo ""
105
+ echo -e "${GREEN}════════════════════════════════════════════════${NC}"
106
+ echo -e "${GREEN}Success! Homebrew formula updated to v${VERSION}${NC}"
107
+ echo -e "${GREEN}════════════════════════════════════════════════${NC}"
108
+ echo ""
109
+ echo "Changes made to: ${FORMULA_FILE}"
110
+ echo ""
111
+ echo "Formula details:"
112
+ echo " Version: ${VERSION}"
113
+ echo " URL: ${NPM_URL}"
114
+ echo " SHA256: ${SHA256}"
115
+ echo ""
116
+ echo "Next steps:"
117
+ echo " 1. Review the changes: git diff ${FORMULA_FILE}"
118
+ echo " 2. Commit: git add ${FORMULA_FILE}"
119
+ echo " 3. Commit: git commit -m 'chore: update homebrew formula to v${VERSION}'"
120
+ echo " 4. Push: git push"
121
+ echo ""
122
+ echo "To test the formula locally:"
123
+ echo " 1. brew tap mochiyaki/coder https://github.com/mochiyaki/coder"
124
+ echo " 2. brew install coder"
125
+ echo " 3. coder --help"