chad-code 1.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 (338) hide show
  1. package/AGENTS.md +27 -0
  2. package/Dockerfile +18 -0
  3. package/README.md +15 -0
  4. package/README.npm.md +64 -0
  5. package/bin/chad-code +84 -0
  6. package/bunfig.toml +7 -0
  7. package/eslint.config.js +29 -0
  8. package/package.json +107 -0
  9. package/parsers-config.ts +253 -0
  10. package/script/build.ts +167 -0
  11. package/script/postinstall.mjs +122 -0
  12. package/script/publish-registries.ts +187 -0
  13. package/script/publish.ts +93 -0
  14. package/script/schema.ts +47 -0
  15. package/src/acp/README.md +164 -0
  16. package/src/acp/agent.ts +1086 -0
  17. package/src/acp/session.ts +101 -0
  18. package/src/acp/types.ts +22 -0
  19. package/src/agent/agent.ts +253 -0
  20. package/src/agent/generate.txt +75 -0
  21. package/src/agent/prompt/compaction.txt +12 -0
  22. package/src/agent/prompt/explore.txt +18 -0
  23. package/src/agent/prompt/summary.txt +11 -0
  24. package/src/agent/prompt/title.txt +36 -0
  25. package/src/auth/index.ts +70 -0
  26. package/src/bun/index.ts +130 -0
  27. package/src/bus/bus-event.ts +43 -0
  28. package/src/bus/global.ts +10 -0
  29. package/src/bus/index.ts +105 -0
  30. package/src/cli/bootstrap.ts +17 -0
  31. package/src/cli/cmd/acp.ts +69 -0
  32. package/src/cli/cmd/agent.ts +257 -0
  33. package/src/cli/cmd/auth.ts +132 -0
  34. package/src/cli/cmd/cmd.ts +7 -0
  35. package/src/cli/cmd/debug/agent.ts +28 -0
  36. package/src/cli/cmd/debug/config.ts +15 -0
  37. package/src/cli/cmd/debug/file.ts +91 -0
  38. package/src/cli/cmd/debug/index.ts +45 -0
  39. package/src/cli/cmd/debug/lsp.ts +48 -0
  40. package/src/cli/cmd/debug/ripgrep.ts +83 -0
  41. package/src/cli/cmd/debug/scrap.ts +15 -0
  42. package/src/cli/cmd/debug/skill.ts +15 -0
  43. package/src/cli/cmd/debug/snapshot.ts +48 -0
  44. package/src/cli/cmd/export.ts +88 -0
  45. package/src/cli/cmd/generate.ts +38 -0
  46. package/src/cli/cmd/github.ts +32 -0
  47. package/src/cli/cmd/import.ts +98 -0
  48. package/src/cli/cmd/mcp.ts +670 -0
  49. package/src/cli/cmd/models.ts +42 -0
  50. package/src/cli/cmd/pr.ts +112 -0
  51. package/src/cli/cmd/run.ts +374 -0
  52. package/src/cli/cmd/serve.ts +16 -0
  53. package/src/cli/cmd/session.ts +135 -0
  54. package/src/cli/cmd/stats.ts +402 -0
  55. package/src/cli/cmd/tui/app.tsx +705 -0
  56. package/src/cli/cmd/tui/attach.ts +32 -0
  57. package/src/cli/cmd/tui/component/border.tsx +21 -0
  58. package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
  59. package/src/cli/cmd/tui/component/dialog-command.tsx +124 -0
  60. package/src/cli/cmd/tui/component/dialog-mcp.tsx +86 -0
  61. package/src/cli/cmd/tui/component/dialog-model.tsx +232 -0
  62. package/src/cli/cmd/tui/component/dialog-provider.tsx +228 -0
  63. package/src/cli/cmd/tui/component/dialog-session-list.tsx +115 -0
  64. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
  65. package/src/cli/cmd/tui/component/dialog-stash.tsx +86 -0
  66. package/src/cli/cmd/tui/component/dialog-status.tsx +162 -0
  67. package/src/cli/cmd/tui/component/dialog-tag.tsx +44 -0
  68. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +50 -0
  69. package/src/cli/cmd/tui/component/did-you-know.tsx +85 -0
  70. package/src/cli/cmd/tui/component/logo.tsx +43 -0
  71. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +654 -0
  72. package/src/cli/cmd/tui/component/prompt/history.tsx +108 -0
  73. package/src/cli/cmd/tui/component/prompt/index.tsx +1078 -0
  74. package/src/cli/cmd/tui/component/prompt/stash.tsx +101 -0
  75. package/src/cli/cmd/tui/component/textarea-keybindings.ts +73 -0
  76. package/src/cli/cmd/tui/component/tips.ts +92 -0
  77. package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
  78. package/src/cli/cmd/tui/context/args.tsx +14 -0
  79. package/src/cli/cmd/tui/context/directory.ts +13 -0
  80. package/src/cli/cmd/tui/context/exit.tsx +23 -0
  81. package/src/cli/cmd/tui/context/helper.tsx +25 -0
  82. package/src/cli/cmd/tui/context/keybind.tsx +101 -0
  83. package/src/cli/cmd/tui/context/kv.tsx +49 -0
  84. package/src/cli/cmd/tui/context/local.tsx +392 -0
  85. package/src/cli/cmd/tui/context/prompt.tsx +18 -0
  86. package/src/cli/cmd/tui/context/route.tsx +46 -0
  87. package/src/cli/cmd/tui/context/sdk.tsx +75 -0
  88. package/src/cli/cmd/tui/context/sync.tsx +384 -0
  89. package/src/cli/cmd/tui/context/theme/aura.json +69 -0
  90. package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
  91. package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +233 -0
  92. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +233 -0
  93. package/src/cli/cmd/tui/context/theme/catppuccin.json +112 -0
  94. package/src/cli/cmd/tui/context/theme/chad.json +245 -0
  95. package/src/cli/cmd/tui/context/theme/cobalt2.json +228 -0
  96. package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
  97. package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
  98. package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
  99. package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
  100. package/src/cli/cmd/tui/context/theme/github.json +233 -0
  101. package/src/cli/cmd/tui/context/theme/gruvbox.json +95 -0
  102. package/src/cli/cmd/tui/context/theme/kanagawa.json +77 -0
  103. package/src/cli/cmd/tui/context/theme/lucent-orng.json +227 -0
  104. package/src/cli/cmd/tui/context/theme/material.json +235 -0
  105. package/src/cli/cmd/tui/context/theme/matrix.json +77 -0
  106. package/src/cli/cmd/tui/context/theme/mercury.json +252 -0
  107. package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
  108. package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
  109. package/src/cli/cmd/tui/context/theme/nord.json +223 -0
  110. package/src/cli/cmd/tui/context/theme/one-dark.json +84 -0
  111. package/src/cli/cmd/tui/context/theme/orng.json +245 -0
  112. package/src/cli/cmd/tui/context/theme/osaka-jade.json +93 -0
  113. package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
  114. package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
  115. package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
  116. package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
  117. package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
  118. package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
  119. package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
  120. package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
  121. package/src/cli/cmd/tui/context/theme.tsx +1137 -0
  122. package/src/cli/cmd/tui/event.ts +46 -0
  123. package/src/cli/cmd/tui/routes/home.tsx +138 -0
  124. package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +64 -0
  125. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +109 -0
  126. package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +26 -0
  127. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
  128. package/src/cli/cmd/tui/routes/session/footer.tsx +88 -0
  129. package/src/cli/cmd/tui/routes/session/header.tsx +125 -0
  130. package/src/cli/cmd/tui/routes/session/index.tsx +1814 -0
  131. package/src/cli/cmd/tui/routes/session/permission.tsx +416 -0
  132. package/src/cli/cmd/tui/routes/session/sidebar.tsx +318 -0
  133. package/src/cli/cmd/tui/spawn.ts +48 -0
  134. package/src/cli/cmd/tui/thread.ts +111 -0
  135. package/src/cli/cmd/tui/ui/dialog-alert.tsx +57 -0
  136. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +83 -0
  137. package/src/cli/cmd/tui/ui/dialog-export-options.tsx +204 -0
  138. package/src/cli/cmd/tui/ui/dialog-help.tsx +38 -0
  139. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +77 -0
  140. package/src/cli/cmd/tui/ui/dialog-select.tsx +345 -0
  141. package/src/cli/cmd/tui/ui/dialog.tsx +171 -0
  142. package/src/cli/cmd/tui/ui/link.tsx +28 -0
  143. package/src/cli/cmd/tui/ui/spinner.ts +368 -0
  144. package/src/cli/cmd/tui/ui/toast.tsx +100 -0
  145. package/src/cli/cmd/tui/util/clipboard.ts +127 -0
  146. package/src/cli/cmd/tui/util/editor.ts +32 -0
  147. package/src/cli/cmd/tui/util/signal.ts +7 -0
  148. package/src/cli/cmd/tui/util/terminal.ts +114 -0
  149. package/src/cli/cmd/tui/util/transcript.ts +98 -0
  150. package/src/cli/cmd/tui/worker.ts +68 -0
  151. package/src/cli/cmd/uninstall.ts +344 -0
  152. package/src/cli/cmd/upgrade.ts +67 -0
  153. package/src/cli/cmd/web.ts +73 -0
  154. package/src/cli/error.ts +56 -0
  155. package/src/cli/network.ts +53 -0
  156. package/src/cli/ui.ts +87 -0
  157. package/src/cli/upgrade.ts +25 -0
  158. package/src/command/index.ts +131 -0
  159. package/src/command/template/initialize.txt +10 -0
  160. package/src/command/template/review.txt +97 -0
  161. package/src/config/config.ts +1124 -0
  162. package/src/config/markdown.ts +41 -0
  163. package/src/env/index.ts +26 -0
  164. package/src/file/ignore.ts +83 -0
  165. package/src/file/index.ts +411 -0
  166. package/src/file/ripgrep.ts +402 -0
  167. package/src/file/time.ts +64 -0
  168. package/src/file/watcher.ts +117 -0
  169. package/src/flag/flag.ts +52 -0
  170. package/src/format/formatter.ts +359 -0
  171. package/src/format/index.ts +137 -0
  172. package/src/global/index.ts +55 -0
  173. package/src/id/id.ts +73 -0
  174. package/src/ide/index.ts +77 -0
  175. package/src/index.ts +159 -0
  176. package/src/installation/index.ts +198 -0
  177. package/src/lsp/client.ts +252 -0
  178. package/src/lsp/index.ts +485 -0
  179. package/src/lsp/language.ts +119 -0
  180. package/src/lsp/server.ts +2023 -0
  181. package/src/mcp/auth.ts +135 -0
  182. package/src/mcp/index.ts +874 -0
  183. package/src/mcp/oauth-callback.ts +200 -0
  184. package/src/mcp/oauth-provider.ts +154 -0
  185. package/src/patch/index.ts +622 -0
  186. package/src/permission/arity.ts +163 -0
  187. package/src/permission/index.ts +210 -0
  188. package/src/permission/next.ts +268 -0
  189. package/src/plugin/index.ts +106 -0
  190. package/src/project/bootstrap.ts +31 -0
  191. package/src/project/instance.ts +78 -0
  192. package/src/project/project.ts +263 -0
  193. package/src/project/state.ts +65 -0
  194. package/src/project/vcs.ts +76 -0
  195. package/src/provider/auth.ts +143 -0
  196. package/src/provider/models-macro.ts +4 -0
  197. package/src/provider/models.ts +77 -0
  198. package/src/provider/provider.ts +516 -0
  199. package/src/provider/transform.ts +114 -0
  200. package/src/pty/index.ts +212 -0
  201. package/src/server/error.ts +36 -0
  202. package/src/server/mdns.ts +57 -0
  203. package/src/server/project.ts +79 -0
  204. package/src/server/server.ts +2866 -0
  205. package/src/server/tui.ts +71 -0
  206. package/src/session/compaction.ts +225 -0
  207. package/src/session/index.ts +469 -0
  208. package/src/session/llm.ts +213 -0
  209. package/src/session/message-v2.ts +742 -0
  210. package/src/session/message.ts +189 -0
  211. package/src/session/processor.ts +402 -0
  212. package/src/session/prompt/anthropic-20250930.txt +166 -0
  213. package/src/session/prompt/anthropic.txt +105 -0
  214. package/src/session/prompt/anthropic_spoof.txt +1 -0
  215. package/src/session/prompt/beast.txt +147 -0
  216. package/src/session/prompt/build-switch.txt +5 -0
  217. package/src/session/prompt/codex.txt +318 -0
  218. package/src/session/prompt/copilot-gpt-5.txt +143 -0
  219. package/src/session/prompt/gemini.txt +155 -0
  220. package/src/session/prompt/max-steps.txt +16 -0
  221. package/src/session/prompt/plan-reminder-anthropic.txt +67 -0
  222. package/src/session/prompt/plan.txt +26 -0
  223. package/src/session/prompt/qwen.txt +109 -0
  224. package/src/session/prompt.ts +1621 -0
  225. package/src/session/retry.ts +90 -0
  226. package/src/session/revert.ts +108 -0
  227. package/src/session/status.ts +76 -0
  228. package/src/session/summary.ts +194 -0
  229. package/src/session/system.ts +108 -0
  230. package/src/session/todo.ts +37 -0
  231. package/src/share/share-next.ts +194 -0
  232. package/src/share/share.ts +23 -0
  233. package/src/shell/shell.ts +67 -0
  234. package/src/skill/index.ts +1 -0
  235. package/src/skill/skill.ts +124 -0
  236. package/src/snapshot/index.ts +197 -0
  237. package/src/storage/storage.ts +226 -0
  238. package/src/tool/bash.ts +262 -0
  239. package/src/tool/bash.txt +116 -0
  240. package/src/tool/batch.ts +175 -0
  241. package/src/tool/batch.txt +24 -0
  242. package/src/tool/codesearch.ts +132 -0
  243. package/src/tool/codesearch.txt +12 -0
  244. package/src/tool/edit.ts +655 -0
  245. package/src/tool/edit.txt +10 -0
  246. package/src/tool/glob.ts +75 -0
  247. package/src/tool/glob.txt +6 -0
  248. package/src/tool/grep.ts +132 -0
  249. package/src/tool/grep.txt +8 -0
  250. package/src/tool/invalid.ts +17 -0
  251. package/src/tool/ls.ts +119 -0
  252. package/src/tool/ls.txt +1 -0
  253. package/src/tool/lsp.ts +94 -0
  254. package/src/tool/lsp.txt +19 -0
  255. package/src/tool/multiedit.ts +46 -0
  256. package/src/tool/multiedit.txt +41 -0
  257. package/src/tool/patch.ts +210 -0
  258. package/src/tool/patch.txt +1 -0
  259. package/src/tool/read.ts +191 -0
  260. package/src/tool/read.txt +12 -0
  261. package/src/tool/registry.ts +137 -0
  262. package/src/tool/skill.ts +77 -0
  263. package/src/tool/task.ts +167 -0
  264. package/src/tool/task.txt +60 -0
  265. package/src/tool/todo.ts +53 -0
  266. package/src/tool/todoread.txt +14 -0
  267. package/src/tool/todowrite.txt +167 -0
  268. package/src/tool/tool.ts +73 -0
  269. package/src/tool/webfetch.ts +182 -0
  270. package/src/tool/webfetch.txt +13 -0
  271. package/src/tool/websearch.ts +144 -0
  272. package/src/tool/websearch.txt +11 -0
  273. package/src/tool/write.ts +84 -0
  274. package/src/tool/write.txt +8 -0
  275. package/src/util/archive.ts +16 -0
  276. package/src/util/color.ts +19 -0
  277. package/src/util/context.ts +25 -0
  278. package/src/util/defer.ts +12 -0
  279. package/src/util/eventloop.ts +20 -0
  280. package/src/util/filesystem.ts +83 -0
  281. package/src/util/fn.ts +11 -0
  282. package/src/util/iife.ts +3 -0
  283. package/src/util/keybind.ts +102 -0
  284. package/src/util/lazy.ts +18 -0
  285. package/src/util/locale.ts +81 -0
  286. package/src/util/lock.ts +98 -0
  287. package/src/util/log.ts +180 -0
  288. package/src/util/queue.ts +32 -0
  289. package/src/util/rpc.ts +42 -0
  290. package/src/util/scrap.ts +10 -0
  291. package/src/util/signal.ts +12 -0
  292. package/src/util/timeout.ts +14 -0
  293. package/src/util/token.ts +7 -0
  294. package/src/util/wildcard.ts +54 -0
  295. package/src/worktree/index.ts +217 -0
  296. package/sst-env.d.ts +9 -0
  297. package/test/agent/agent.test.ts +448 -0
  298. package/test/bun.test.ts +53 -0
  299. package/test/cli/github-action.test.ts +129 -0
  300. package/test/cli/github-remote.test.ts +80 -0
  301. package/test/cli/tui/transcript.test.ts +297 -0
  302. package/test/config/agent-color.test.ts +66 -0
  303. package/test/config/config.test.ts +870 -0
  304. package/test/config/markdown.test.ts +89 -0
  305. package/test/file/ignore.test.ts +10 -0
  306. package/test/file/path-traversal.test.ts +115 -0
  307. package/test/fixture/fixture.ts +45 -0
  308. package/test/fixture/lsp/fake-lsp-server.js +77 -0
  309. package/test/ide/ide.test.ts +82 -0
  310. package/test/keybind.test.ts +421 -0
  311. package/test/lsp/client.test.ts +95 -0
  312. package/test/mcp/headers.test.ts +153 -0
  313. package/test/patch/patch.test.ts +348 -0
  314. package/test/permission/arity.test.ts +33 -0
  315. package/test/permission/next.test.ts +652 -0
  316. package/test/preload.ts +63 -0
  317. package/test/project/project.test.ts +120 -0
  318. package/test/provider/amazon-bedrock.test.ts +236 -0
  319. package/test/provider/provider.test.ts +2127 -0
  320. package/test/provider/transform.test.ts +980 -0
  321. package/test/server/session-select.test.ts +78 -0
  322. package/test/session/compaction.test.ts +251 -0
  323. package/test/session/message-v2.test.ts +570 -0
  324. package/test/session/retry.test.ts +131 -0
  325. package/test/session/revert-compact.test.ts +285 -0
  326. package/test/session/session.test.ts +71 -0
  327. package/test/skill/skill.test.ts +185 -0
  328. package/test/snapshot/snapshot.test.ts +939 -0
  329. package/test/tool/__snapshots__/tool.test.ts.snap +9 -0
  330. package/test/tool/bash.test.ts +232 -0
  331. package/test/tool/grep.test.ts +109 -0
  332. package/test/tool/patch.test.ts +261 -0
  333. package/test/tool/read.test.ts +167 -0
  334. package/test/util/iife.test.ts +36 -0
  335. package/test/util/lazy.test.ts +50 -0
  336. package/test/util/timeout.test.ts +21 -0
  337. package/test/util/wildcard.test.ts +55 -0
  338. package/tsconfig.json +16 -0
@@ -0,0 +1,167 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import solidPlugin from "../node_modules/@opentui/solid/scripts/solid-plugin"
4
+ import path from "path"
5
+ import fs from "fs"
6
+ import { $ } from "bun"
7
+ import { fileURLToPath } from "url"
8
+
9
+ const __filename = fileURLToPath(import.meta.url)
10
+ const __dirname = path.dirname(__filename)
11
+ const dir = path.resolve(__dirname, "..")
12
+
13
+ process.chdir(dir)
14
+
15
+ import pkg from "../package.json"
16
+ import { Script } from "@opencode-ai/script"
17
+
18
+ const singleFlag = process.argv.includes("--single")
19
+ const baselineFlag = process.argv.includes("--baseline")
20
+ const skipInstall = process.argv.includes("--skip-install")
21
+
22
+ const allTargets: {
23
+ os: string
24
+ arch: "arm64" | "x64"
25
+ abi?: "musl"
26
+ avx2?: false
27
+ }[] = [
28
+ {
29
+ os: "linux",
30
+ arch: "arm64",
31
+ },
32
+ {
33
+ os: "linux",
34
+ arch: "x64",
35
+ },
36
+ {
37
+ os: "linux",
38
+ arch: "x64",
39
+ avx2: false,
40
+ },
41
+ {
42
+ os: "linux",
43
+ arch: "arm64",
44
+ abi: "musl",
45
+ },
46
+ {
47
+ os: "linux",
48
+ arch: "x64",
49
+ abi: "musl",
50
+ },
51
+ {
52
+ os: "linux",
53
+ arch: "x64",
54
+ abi: "musl",
55
+ avx2: false,
56
+ },
57
+ {
58
+ os: "darwin",
59
+ arch: "arm64",
60
+ },
61
+ {
62
+ os: "darwin",
63
+ arch: "x64",
64
+ },
65
+ {
66
+ os: "darwin",
67
+ arch: "x64",
68
+ avx2: false,
69
+ },
70
+ {
71
+ os: "win32",
72
+ arch: "x64",
73
+ },
74
+ {
75
+ os: "win32",
76
+ arch: "x64",
77
+ avx2: false,
78
+ },
79
+ ]
80
+
81
+ const targets = singleFlag
82
+ ? allTargets.filter((item) => {
83
+ if (item.os !== process.platform || item.arch !== process.arch) {
84
+ return false
85
+ }
86
+
87
+ // When building for the current platform, prefer a single native binary by default.
88
+ // Baseline binaries require additional Bun artifacts and can be flaky to download.
89
+ if (item.avx2 === false) {
90
+ return baselineFlag
91
+ }
92
+
93
+ return true
94
+ })
95
+ : allTargets
96
+
97
+ await $`rm -rf dist`
98
+
99
+ const binaries: Record<string, string> = {}
100
+ if (!skipInstall) {
101
+ await $`bun install --os="*" --cpu="*" @opentui/core@${pkg.dependencies["@opentui/core"]}`
102
+ await $`bun install --os="*" --cpu="*" @parcel/watcher@${pkg.dependencies["@parcel/watcher"]}`
103
+ }
104
+ for (const item of targets) {
105
+ const name = [
106
+ pkg.name,
107
+ // changing to win32 flags npm for some reason
108
+ item.os === "win32" ? "windows" : item.os,
109
+ item.arch,
110
+ item.avx2 === false ? "baseline" : undefined,
111
+ item.abi === undefined ? undefined : item.abi,
112
+ ]
113
+ .filter(Boolean)
114
+ .join("-")
115
+ console.log(`building ${name}`)
116
+ await $`mkdir -p dist/${name}/bin`
117
+
118
+ const parserWorker = fs.realpathSync(path.resolve(dir, "./node_modules/@opentui/core/parser.worker.js"))
119
+ const workerPath = "./src/cli/cmd/tui/worker.ts"
120
+
121
+ // Use platform-specific bunfs root path based on target OS
122
+ const bunfsRoot = item.os === "win32" ? "B:/~BUN/root/" : "/$bunfs/root/"
123
+ const workerRelativePath = path.relative(dir, parserWorker).replaceAll("\\", "/")
124
+
125
+ await Bun.build({
126
+ conditions: ["browser"],
127
+ tsconfig: "./tsconfig.json",
128
+ plugins: [solidPlugin],
129
+ sourcemap: "external",
130
+ compile: {
131
+ autoloadBunfig: false,
132
+ autoloadDotenv: false,
133
+ //@ts-ignore (bun types aren't up to date)
134
+ autoloadTsconfig: true,
135
+ autoloadPackageJson: true,
136
+ target: name.replace(pkg.name, "bun") as any,
137
+ outfile: `dist/${name}/bin/chad-code`,
138
+ execArgv: [`--user-agent=chad-code/${Script.version}`, "--"],
139
+ windows: {},
140
+ },
141
+ entrypoints: ["./src/index.ts", parserWorker, workerPath],
142
+ define: {
143
+ OPENCODE_VERSION: `'${Script.version}'`,
144
+ OTUI_TREE_SITTER_WORKER_PATH: bunfsRoot + workerRelativePath,
145
+ OPENCODE_WORKER_PATH: workerPath,
146
+ OPENCODE_CHANNEL: `'${Script.channel}'`,
147
+ OPENCODE_LIBC: item.os === "linux" ? `'${item.abi ?? "glibc"}'` : "",
148
+ },
149
+ })
150
+
151
+ await $`rm -rf ./dist/${name}/bin/tui`
152
+ await Bun.file(`dist/${name}/package.json`).write(
153
+ JSON.stringify(
154
+ {
155
+ name,
156
+ version: Script.version,
157
+ os: [item.os],
158
+ cpu: [item.arch],
159
+ },
160
+ null,
161
+ 2,
162
+ ),
163
+ )
164
+ binaries[name] = Script.version
165
+ }
166
+
167
+ export { binaries }
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env node
2
+
3
+ import fs from "fs"
4
+ import path from "path"
5
+ import os from "os"
6
+ import { fileURLToPath } from "url"
7
+ import { createRequire } from "module"
8
+
9
+ const __dirname = path.dirname(fileURLToPath(import.meta.url))
10
+ const require = createRequire(import.meta.url)
11
+
12
+ function detectPlatformAndArch() {
13
+ // Map platform names
14
+ let platform
15
+ switch (os.platform()) {
16
+ case "darwin":
17
+ platform = "darwin"
18
+ break
19
+ case "linux":
20
+ platform = "linux"
21
+ break
22
+ case "win32":
23
+ platform = "windows"
24
+ break
25
+ default:
26
+ platform = os.platform()
27
+ break
28
+ }
29
+
30
+ // Map architecture names
31
+ let arch
32
+ switch (os.arch()) {
33
+ case "x64":
34
+ arch = "x64"
35
+ break
36
+ case "arm64":
37
+ arch = "arm64"
38
+ break
39
+ case "arm":
40
+ arch = "arm"
41
+ break
42
+ default:
43
+ arch = os.arch()
44
+ break
45
+ }
46
+
47
+ return { platform, arch }
48
+ }
49
+
50
+ function findBinary() {
51
+ const { platform, arch } = detectPlatformAndArch()
52
+ const packageName = `chad-code-${platform}-${arch}`
53
+ const binaryName = platform === "windows" ? "chad-code.exe" : "chad-code"
54
+
55
+ try {
56
+ // Use require.resolve to find the package
57
+ const packageJsonPath = require.resolve(`${packageName}/package.json`)
58
+ const packageDir = path.dirname(packageJsonPath)
59
+ const binaryPath = path.join(packageDir, "bin", binaryName)
60
+
61
+ if (!fs.existsSync(binaryPath)) {
62
+ throw new Error(`Binary not found at ${binaryPath}`)
63
+ }
64
+
65
+ return { binaryPath, binaryName }
66
+ } catch (error) {
67
+ throw new Error(`Could not find package ${packageName}: ${error.message}`)
68
+ }
69
+ }
70
+
71
+ function prepareBinDirectory(binaryName) {
72
+ const binDir = path.join(__dirname, "bin")
73
+ const targetPath = path.join(binDir, binaryName)
74
+
75
+ // Ensure bin directory exists
76
+ if (!fs.existsSync(binDir)) {
77
+ fs.mkdirSync(binDir, { recursive: true })
78
+ }
79
+
80
+ // Remove existing binary/symlink if it exists
81
+ if (fs.existsSync(targetPath)) {
82
+ fs.unlinkSync(targetPath)
83
+ }
84
+
85
+ return { binDir, targetPath }
86
+ }
87
+
88
+ function symlinkBinary(sourcePath, binaryName) {
89
+ const { targetPath } = prepareBinDirectory(binaryName)
90
+
91
+ fs.symlinkSync(sourcePath, targetPath)
92
+ console.log(`chad-code binary symlinked: ${targetPath} -> ${sourcePath}`)
93
+
94
+ // Verify the file exists after operation
95
+ if (!fs.existsSync(targetPath)) {
96
+ throw new Error(`Failed to symlink binary to ${targetPath}`)
97
+ }
98
+ }
99
+
100
+ async function main() {
101
+ try {
102
+ if (os.platform() === "win32") {
103
+ // On Windows, the .exe is already included in the package and bin field points to it
104
+ // No postinstall setup needed
105
+ console.log("Windows detected: binary setup not needed (using packaged .exe)")
106
+ return
107
+ }
108
+
109
+ const { binaryPath, binaryName } = findBinary()
110
+ symlinkBinary(binaryPath, binaryName)
111
+ } catch (error) {
112
+ console.error("Failed to setup chad-code binary:", error.message)
113
+ process.exit(1)
114
+ }
115
+ }
116
+
117
+ try {
118
+ main()
119
+ } catch (error) {
120
+ console.error("Postinstall script error:", error.message)
121
+ process.exit(0)
122
+ }
@@ -0,0 +1,187 @@
1
+ #!/usr/bin/env bun
2
+ import { $ } from "bun"
3
+ import { Script } from "@opencode-ai/script"
4
+
5
+ if (!Script.preview) {
6
+ // Calculate SHA values
7
+ const arm64Sha = await $`sha256sum ./dist/opencode-linux-arm64.tar.gz | cut -d' ' -f1`.text().then((x) => x.trim())
8
+ const x64Sha = await $`sha256sum ./dist/opencode-linux-x64.tar.gz | cut -d' ' -f1`.text().then((x) => x.trim())
9
+ const macX64Sha = await $`sha256sum ./dist/opencode-darwin-x64.zip | cut -d' ' -f1`.text().then((x) => x.trim())
10
+ const macArm64Sha = await $`sha256sum ./dist/opencode-darwin-arm64.zip | cut -d' ' -f1`.text().then((x) => x.trim())
11
+
12
+ const [pkgver, _subver = ""] = Script.version.split(/(-.*)/, 2)
13
+
14
+ // arch
15
+ const binaryPkgbuild = [
16
+ "# Maintainer: dax",
17
+ "# Maintainer: adam",
18
+ "",
19
+ "pkgname='opencode-bin'",
20
+ `pkgver=${pkgver}`,
21
+ `_subver=${_subver}`,
22
+ "options=('!debug' '!strip')",
23
+ "pkgrel=1",
24
+ "pkgdesc='The AI coding agent built for the terminal.'",
25
+ "url='https://github.com/anomalyco/opencode'",
26
+ "arch=('aarch64' 'x86_64')",
27
+ "license=('MIT')",
28
+ "provides=('opencode')",
29
+ "conflicts=('opencode')",
30
+ "depends=('ripgrep')",
31
+ "",
32
+ `source_aarch64=("\${pkgname}_\${pkgver}_aarch64.tar.gz::https://github.com/anomalyco/opencode/releases/download/v\${pkgver}\${_subver}/opencode-linux-arm64.tar.gz")`,
33
+ `sha256sums_aarch64=('${arm64Sha}')`,
34
+
35
+ `source_x86_64=("\${pkgname}_\${pkgver}_x86_64.tar.gz::https://github.com/anomalyco/opencode/releases/download/v\${pkgver}\${_subver}/opencode-linux-x64.tar.gz")`,
36
+ `sha256sums_x86_64=('${x64Sha}')`,
37
+ "",
38
+ "package() {",
39
+ ' install -Dm755 ./opencode "${pkgdir}/usr/bin/opencode"',
40
+ "}",
41
+ "",
42
+ ].join("\n")
43
+
44
+ // Source-based PKGBUILD for opencode
45
+ const sourcePkgbuild = [
46
+ "# Maintainer: dax",
47
+ "# Maintainer: adam",
48
+ "",
49
+ "pkgname='opencode'",
50
+ `pkgver=${pkgver}`,
51
+ `_subver=${_subver}`,
52
+ "options=('!debug' '!strip')",
53
+ "pkgrel=1",
54
+ "pkgdesc='The AI coding agent built for the terminal.'",
55
+ "url='https://github.com/anomalyco/opencode'",
56
+ "arch=('aarch64' 'x86_64')",
57
+ "license=('MIT')",
58
+ "provides=('opencode')",
59
+ "conflicts=('opencode-bin')",
60
+ "depends=('ripgrep')",
61
+ "makedepends=('git' 'bun' 'go')",
62
+ "",
63
+ `source=("opencode-\${pkgver}.tar.gz::https://github.com/anomalyco/opencode/archive/v\${pkgver}\${_subver}.tar.gz")`,
64
+ `sha256sums=('SKIP')`,
65
+ "",
66
+ "build() {",
67
+ ` cd "opencode-\${pkgver}"`,
68
+ ` bun install`,
69
+ " cd ./packages/opencode",
70
+ ` OPENCODE_CHANNEL=latest OPENCODE_VERSION=${pkgver} bun run ./script/build.ts --single`,
71
+ "}",
72
+ "",
73
+ "package() {",
74
+ ` cd "opencode-\${pkgver}/packages/opencode"`,
75
+ ' mkdir -p "${pkgdir}/usr/bin"',
76
+ ' target_arch="x64"',
77
+ ' case "$CARCH" in',
78
+ ' x86_64) target_arch="x64" ;;',
79
+ ' aarch64) target_arch="arm64" ;;',
80
+ ' *) printf "unsupported architecture: %s\\n" "$CARCH" >&2 ; return 1 ;;',
81
+ " esac",
82
+ ' libc=""',
83
+ " if command -v ldd >/dev/null 2>&1; then",
84
+ " if ldd --version 2>&1 | grep -qi musl; then",
85
+ ' libc="-musl"',
86
+ " fi",
87
+ " fi",
88
+ ' if [ -z "$libc" ] && ls /lib/ld-musl-* >/dev/null 2>&1; then',
89
+ ' libc="-musl"',
90
+ " fi",
91
+ ' base=""',
92
+ ' if [ "$target_arch" = "x64" ]; then',
93
+ " if ! grep -qi avx2 /proc/cpuinfo 2>/dev/null; then",
94
+ ' base="-baseline"',
95
+ " fi",
96
+ " fi",
97
+ ' bin="dist/opencode-linux-${target_arch}${base}${libc}/bin/opencode"',
98
+ ' if [ ! -f "$bin" ]; then',
99
+ ' printf "unable to find binary for %s%s%s\\n" "$target_arch" "$base" "$libc" >&2',
100
+ " return 1",
101
+ " fi",
102
+ ' install -Dm755 "$bin" "${pkgdir}/usr/bin/opencode"',
103
+ "}",
104
+ "",
105
+ ].join("\n")
106
+
107
+ for (const [pkg, pkgbuild] of [
108
+ ["opencode-bin", binaryPkgbuild],
109
+ ["opencode", sourcePkgbuild],
110
+ ]) {
111
+ for (let i = 0; i < 30; i++) {
112
+ try {
113
+ await $`rm -rf ./dist/aur-${pkg}`
114
+ await $`git clone ssh://aur@aur.archlinux.org/${pkg}.git ./dist/aur-${pkg}`
115
+ await $`cd ./dist/aur-${pkg} && git checkout master`
116
+ await Bun.file(`./dist/aur-${pkg}/PKGBUILD`).write(pkgbuild)
117
+ await $`cd ./dist/aur-${pkg} && makepkg --printsrcinfo > .SRCINFO`
118
+ await $`cd ./dist/aur-${pkg} && git add PKGBUILD .SRCINFO`
119
+ await $`cd ./dist/aur-${pkg} && git commit -m "Update to v${Script.version}"`
120
+ await $`cd ./dist/aur-${pkg} && git push`
121
+ break
122
+ } catch (e) {
123
+ continue
124
+ }
125
+ }
126
+ }
127
+
128
+ // Homebrew formula
129
+ const homebrewFormula = [
130
+ "# typed: false",
131
+ "# frozen_string_literal: true",
132
+ "",
133
+ "# This file was generated by GoReleaser. DO NOT EDIT.",
134
+ "class Opencode < Formula",
135
+ ` desc "The AI coding agent built for the terminal."`,
136
+ ` homepage "https://github.com/anomalyco/opencode"`,
137
+ ` version "${Script.version.split("-")[0]}"`,
138
+ "",
139
+ ` depends_on "ripgrep"`,
140
+ "",
141
+ " on_macos do",
142
+ " if Hardware::CPU.intel?",
143
+ ` url "https://github.com/anomalyco/opencode/releases/download/v${Script.version}/opencode-darwin-x64.zip"`,
144
+ ` sha256 "${macX64Sha}"`,
145
+ "",
146
+ " def install",
147
+ ' bin.install "opencode"',
148
+ " end",
149
+ " end",
150
+ " if Hardware::CPU.arm?",
151
+ ` url "https://github.com/anomalyco/opencode/releases/download/v${Script.version}/opencode-darwin-arm64.zip"`,
152
+ ` sha256 "${macArm64Sha}"`,
153
+ "",
154
+ " def install",
155
+ ' bin.install "opencode"',
156
+ " end",
157
+ " end",
158
+ " end",
159
+ "",
160
+ " on_linux do",
161
+ " if Hardware::CPU.intel? and Hardware::CPU.is_64_bit?",
162
+ ` url "https://github.com/anomalyco/opencode/releases/download/v${Script.version}/opencode-linux-x64.tar.gz"`,
163
+ ` sha256 "${x64Sha}"`,
164
+ " def install",
165
+ ' bin.install "opencode"',
166
+ " end",
167
+ " end",
168
+ " if Hardware::CPU.arm? and Hardware::CPU.is_64_bit?",
169
+ ` url "https://github.com/anomalyco/opencode/releases/download/v${Script.version}/opencode-linux-arm64.tar.gz"`,
170
+ ` sha256 "${arm64Sha}"`,
171
+ " def install",
172
+ ' bin.install "opencode"',
173
+ " end",
174
+ " end",
175
+ " end",
176
+ "end",
177
+ "",
178
+ "",
179
+ ].join("\n")
180
+
181
+ await $`rm -rf ./dist/homebrew-tap`
182
+ await $`git clone https://${process.env["GITHUB_TOKEN"]}@github.com/sst/homebrew-tap.git ./dist/homebrew-tap`
183
+ await Bun.file("./dist/homebrew-tap/opencode.rb").write(homebrewFormula)
184
+ await $`cd ./dist/homebrew-tap && git add opencode.rb`
185
+ await $`cd ./dist/homebrew-tap && git commit -m "Update to v${Script.version}"`
186
+ await $`cd ./dist/homebrew-tap && git push`
187
+ }
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env bun
2
+ import { $ } from "bun"
3
+ import pkg from "../package.json"
4
+ import { Script } from "@opencode-ai/script"
5
+ import { fileURLToPath } from "url"
6
+
7
+ const dir = fileURLToPath(new URL("..", import.meta.url))
8
+ process.chdir(dir)
9
+
10
+ const { binaries } = await import("./build.ts")
11
+ {
12
+ const name = `${pkg.name}-${process.platform}-${process.arch}`
13
+ console.log(`smoke test: running dist/${name}/bin/chad-code --version`)
14
+ await $`./dist/${name}/bin/chad-code --version`
15
+ }
16
+
17
+ await $`mkdir -p ./dist/${pkg.name}`
18
+ await $`cp -r ./bin ./dist/${pkg.name}/bin`
19
+ await $`cp ./script/postinstall.mjs ./dist/${pkg.name}/postinstall.mjs`
20
+ await $`cp ./README.npm.md ./dist/${pkg.name}/README.md`
21
+
22
+ await Bun.file(`./dist/${pkg.name}/package.json`).write(
23
+ JSON.stringify(
24
+ {
25
+ name: pkg.name,
26
+ version: Script.version,
27
+ description: "AI-powered coding assistant for your terminal",
28
+ license: "MIT",
29
+ keywords: [
30
+ "ai",
31
+ "coding",
32
+ "assistant",
33
+ "cli",
34
+ "terminal",
35
+ "code-generation",
36
+ "developer-tools",
37
+ "chad",
38
+ "llm",
39
+ ],
40
+ homepage: "https://corethink.ai",
41
+ repository: {
42
+ type: "git",
43
+ url: "https://github.com/corethink-ai/corethink-code",
44
+ },
45
+ bugs: {
46
+ url: "https://github.com/corethink-ai/corethink-code/issues",
47
+ },
48
+ bin: {
49
+ [pkg.name]: `./bin/${pkg.name}`,
50
+ },
51
+ scripts: {
52
+ postinstall: "bun ./postinstall.mjs || node ./postinstall.mjs",
53
+ },
54
+ preferGlobal: true,
55
+ optionalDependencies: binaries,
56
+ },
57
+ null,
58
+ 2,
59
+ ),
60
+ )
61
+
62
+ const tags = [Script.channel]
63
+
64
+ const tasks = Object.entries(binaries).map(async ([name]) => {
65
+ if (process.platform !== "win32") {
66
+ await $`chmod -R 755 .`.cwd(`./dist/${name}`)
67
+ }
68
+ await $`bun pm pack`.cwd(`./dist/${name}`)
69
+ for (const tag of tags) {
70
+ await $`npm publish *.tgz --access public --tag ${tag}`.cwd(`./dist/${name}`)
71
+ }
72
+ })
73
+ await Promise.all(tasks)
74
+ for (const tag of tags) {
75
+ await $`cd ./dist/${pkg.name} && bun pm pack && npm publish *.tgz --access public --tag ${tag}`
76
+ }
77
+
78
+ if (!Script.preview) {
79
+ // Create archives for GitHub release
80
+ for (const key of Object.keys(binaries)) {
81
+ if (key.includes("linux")) {
82
+ await $`tar -czf ../../${key}.tar.gz *`.cwd(`dist/${key}/bin`)
83
+ } else {
84
+ await $`zip -r ../../${key}.zip *`.cwd(`dist/${key}/bin`)
85
+ }
86
+ }
87
+
88
+ const image = "ghcr.io/corethink-ai/chad-code"
89
+ const platforms = "linux/amd64,linux/arm64"
90
+ const tags = [`${image}:${Script.version}`, `${image}:latest`]
91
+ const tagFlags = tags.flatMap((t) => ["-t", t])
92
+ await $`docker buildx build --platform ${platforms} ${tagFlags} --push .`
93
+ }
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { z } from "zod"
4
+ import { Config } from "../src/config/config"
5
+
6
+ const file = process.argv[2]
7
+ console.log(file)
8
+
9
+ const result = z.toJSONSchema(Config.Info, {
10
+ io: "input", // Generate input shape (treats optional().default() as not required)
11
+ /**
12
+ * We'll use the `default` values of the field as the only value in `examples`.
13
+ * This will ensure no docs are needed to be read, as the configuration is
14
+ * self-documenting.
15
+ *
16
+ * See https://json-schema.org/draft/2020-12/draft-bhutton-json-schema-validation-00#rfc.section.9.5
17
+ */
18
+ override(ctx) {
19
+ const schema = ctx.jsonSchema
20
+
21
+ // Preserve strictness: set additionalProperties: false for objects
22
+ if (schema && typeof schema === "object" && schema.type === "object" && schema.additionalProperties === undefined) {
23
+ schema.additionalProperties = false
24
+ }
25
+
26
+ // Add examples and default descriptions for string fields with defaults
27
+ if (schema && typeof schema === "object" && "type" in schema && schema.type === "string" && schema?.default) {
28
+ if (!schema.examples) {
29
+ schema.examples = [schema.default]
30
+ }
31
+
32
+ schema.description = [schema.description || "", `default: \`${schema.default}\``]
33
+ .filter(Boolean)
34
+ .join("\n\n")
35
+ .trim()
36
+ }
37
+ },
38
+ }) as Record<string, unknown> & {
39
+ allowComments?: boolean
40
+ allowTrailingCommas?: boolean
41
+ }
42
+
43
+ // used for json lsps since config supports jsonc
44
+ result.allowComments = true
45
+ result.allowTrailingCommas = true
46
+
47
+ await Bun.write(file, JSON.stringify(result, null, 2))