nikcli 0.0.6

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 (602) hide show
  1. package/.turbo/turbo-typecheck.log +1 -0
  2. package/AGENTS.md +27 -0
  3. package/Dockerfile +18 -0
  4. package/README.md +15 -0
  5. package/bin/nikcli +84 -0
  6. package/config.json +13 -0
  7. package/docs/tailscale-mobile/01-tailscale-setup.md +94 -0
  8. package/docs/tailscale-mobile/02-host-setup.md +115 -0
  9. package/docs/tailscale-mobile/03-phone-and-serve.md +134 -0
  10. package/docs/tailscale-mobile/README.md +59 -0
  11. package/examples/README.md +54 -0
  12. package/package.json +147 -0
  13. package/parsers-config.ts +253 -0
  14. package/script/build.ts +179 -0
  15. package/script/postinstall.mjs +125 -0
  16. package/script/publish-registries.ts +187 -0
  17. package/script/publish.ts +100 -0
  18. package/script/schema.ts +47 -0
  19. package/script/seed-e2e.ts +50 -0
  20. package/sequential-prancing-forest.md +373 -0
  21. package/src/acp/README.md +164 -0
  22. package/src/acp/agent.ts +1303 -0
  23. package/src/acp/session.ts +105 -0
  24. package/src/acp/types.ts +22 -0
  25. package/src/agent/agent.ts +528 -0
  26. package/src/agent/generate.txt +32 -0
  27. package/src/agent/prompt/compaction.txt +14 -0
  28. package/src/agent/prompt/explore.txt +18 -0
  29. package/src/agent/prompt/summary.txt +11 -0
  30. package/src/agent/prompt/title.txt +44 -0
  31. package/src/auth/index.ts +73 -0
  32. package/src/bun/index.ts +119 -0
  33. package/src/bun/registry.ts +54 -0
  34. package/src/bus/bus-event.ts +43 -0
  35. package/src/bus/global.ts +10 -0
  36. package/src/bus/index.ts +105 -0
  37. package/src/chatbot/handlers.ts +150 -0
  38. package/src/chatbot/index.ts +132 -0
  39. package/src/cli/bootstrap.ts +17 -0
  40. package/src/cli/cmd/acp.ts +69 -0
  41. package/src/cli/cmd/ads.ts +377 -0
  42. package/src/cli/cmd/agent.ts +259 -0
  43. package/src/cli/cmd/auth.ts +400 -0
  44. package/src/cli/cmd/chatbot.ts +420 -0
  45. package/src/cli/cmd/cmd.ts +7 -0
  46. package/src/cli/cmd/companion.ts +81 -0
  47. package/src/cli/cmd/connectors.ts +593 -0
  48. package/src/cli/cmd/debug/agent.ts +166 -0
  49. package/src/cli/cmd/debug/config.ts +16 -0
  50. package/src/cli/cmd/debug/file.ts +97 -0
  51. package/src/cli/cmd/debug/index.ts +48 -0
  52. package/src/cli/cmd/debug/lsp.ts +52 -0
  53. package/src/cli/cmd/debug/ripgrep.ts +87 -0
  54. package/src/cli/cmd/debug/scrap.ts +16 -0
  55. package/src/cli/cmd/debug/skill.ts +16 -0
  56. package/src/cli/cmd/debug/snapshot.ts +52 -0
  57. package/src/cli/cmd/export.ts +88 -0
  58. package/src/cli/cmd/generate.ts +38 -0
  59. package/src/cli/cmd/github.ts +412 -0
  60. package/src/cli/cmd/image-model.ts +128 -0
  61. package/src/cli/cmd/import.ts +201 -0
  62. package/src/cli/cmd/lovable.ts +128 -0
  63. package/src/cli/cmd/mcp.ts +738 -0
  64. package/src/cli/cmd/mobile.ts +223 -0
  65. package/src/cli/cmd/models.ts +77 -0
  66. package/src/cli/cmd/plug.ts +231 -0
  67. package/src/cli/cmd/pr.ts +104 -0
  68. package/src/cli/cmd/rag-model.ts +167 -0
  69. package/src/cli/cmd/remote.ts +416 -0
  70. package/src/cli/cmd/run.ts +589 -0
  71. package/src/cli/cmd/serve.ts +51 -0
  72. package/src/cli/cmd/session.ts +133 -0
  73. package/src/cli/cmd/speak-model.ts +204 -0
  74. package/src/cli/cmd/stats.ts +402 -0
  75. package/src/cli/cmd/tui/app.tsx +841 -0
  76. package/src/cli/cmd/tui/attach.ts +31 -0
  77. package/src/cli/cmd/tui/component/border.tsx +75 -0
  78. package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
  79. package/src/cli/cmd/tui/component/dialog-command.tsx +172 -0
  80. package/src/cli/cmd/tui/component/dialog-config.tsx +291 -0
  81. package/src/cli/cmd/tui/component/dialog-connectors.tsx +440 -0
  82. package/src/cli/cmd/tui/component/dialog-image-model.tsx +97 -0
  83. package/src/cli/cmd/tui/component/dialog-mcp.tsx +86 -0
  84. package/src/cli/cmd/tui/component/dialog-model.tsx +234 -0
  85. package/src/cli/cmd/tui/component/dialog-provider.tsx +260 -0
  86. package/src/cli/cmd/tui/component/dialog-rag-model.tsx +217 -0
  87. package/src/cli/cmd/tui/component/dialog-remote.tsx +489 -0
  88. package/src/cli/cmd/tui/component/dialog-session-list.tsx +170 -0
  89. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
  90. package/src/cli/cmd/tui/component/dialog-settings/index.tsx +59 -0
  91. package/src/cli/cmd/tui/component/dialog-settings/prompt.tsx +40 -0
  92. package/src/cli/cmd/tui/component/dialog-settings/sidebar.tsx +39 -0
  93. package/src/cli/cmd/tui/component/dialog-settings/spinner.tsx +62 -0
  94. package/src/cli/cmd/tui/component/dialog-settings/ui.tsx +58 -0
  95. package/src/cli/cmd/tui/component/dialog-skills.tsx +117 -0
  96. package/src/cli/cmd/tui/component/dialog-speak-model.tsx +304 -0
  97. package/src/cli/cmd/tui/component/dialog-stash.tsx +87 -0
  98. package/src/cli/cmd/tui/component/dialog-status.tsx +165 -0
  99. package/src/cli/cmd/tui/component/dialog-tag.tsx +44 -0
  100. package/src/cli/cmd/tui/component/dialog-theme-create.tsx +717 -0
  101. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +52 -0
  102. package/src/cli/cmd/tui/component/dialog-workspace-list.tsx +350 -0
  103. package/src/cli/cmd/tui/component/error-component.tsx +91 -0
  104. package/src/cli/cmd/tui/component/logo.tsx +103 -0
  105. package/src/cli/cmd/tui/component/plugin-route-missing.tsx +14 -0
  106. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +669 -0
  107. package/src/cli/cmd/tui/component/prompt/frecency.tsx +89 -0
  108. package/src/cli/cmd/tui/component/prompt/history.tsx +108 -0
  109. package/src/cli/cmd/tui/component/prompt/index.tsx +2165 -0
  110. package/src/cli/cmd/tui/component/prompt/stash.tsx +63 -0
  111. package/src/cli/cmd/tui/component/spinner.tsx +24 -0
  112. package/src/cli/cmd/tui/component/startup-loading.tsx +63 -0
  113. package/src/cli/cmd/tui/component/table/markdown-table.tsx +267 -0
  114. package/src/cli/cmd/tui/component/table-db/db/connections.ts +75 -0
  115. package/src/cli/cmd/tui/component/table-db/db/db-connection.ts +223 -0
  116. package/src/cli/cmd/tui/component/table-db/db/db-preview.ts +202 -0
  117. package/src/cli/cmd/tui/component/table-db/db/factory.ts +77 -0
  118. package/src/cli/cmd/tui/component/table-db/db/index.ts +9 -0
  119. package/src/cli/cmd/tui/component/table-db/db/mysql-connection.ts +330 -0
  120. package/src/cli/cmd/tui/component/table-db/db/postgres-connection.ts +338 -0
  121. package/src/cli/cmd/tui/component/table-db/db/sqlite-connection.ts +302 -0
  122. package/src/cli/cmd/tui/component/table-db/db/types.ts +108 -0
  123. package/src/cli/cmd/tui/component/table-db/table/dbedit-hooks.ts +74 -0
  124. package/src/cli/cmd/tui/component/table-db/table/index.ts +15 -0
  125. package/src/cli/cmd/tui/component/table-db/table/table-events.ts +54 -0
  126. package/src/cli/cmd/tui/component/table-db/table/table-formatters.ts +191 -0
  127. package/src/cli/cmd/tui/component/table-db/table/table-hooks.ts +105 -0
  128. package/src/cli/cmd/tui/component/table-db/table/table-keyboard-handler.ts +255 -0
  129. package/src/cli/cmd/tui/component/table-db/table/table-layout-engine.ts +208 -0
  130. package/src/cli/cmd/tui/component/table-db/table/table-renderable.ts +486 -0
  131. package/src/cli/cmd/tui/component/table-db/table/table-selection-manager.ts +136 -0
  132. package/src/cli/cmd/tui/component/table-db/table/table-state.ts +198 -0
  133. package/src/cli/cmd/tui/component/table-db/table/types.ts +69 -0
  134. package/src/cli/cmd/tui/component/table-db/ui/db-visualizer.tsx +71 -0
  135. package/src/cli/cmd/tui/component/table-db/ui/index.ts +2 -0
  136. package/src/cli/cmd/tui/component/table-db/ui/table-renderer.ts +607 -0
  137. package/src/cli/cmd/tui/component/textarea-keybindings.ts +73 -0
  138. package/src/cli/cmd/tui/component/tips.tsx +195 -0
  139. package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
  140. package/src/cli/cmd/tui/context/args.tsx +14 -0
  141. package/src/cli/cmd/tui/context/directory.ts +13 -0
  142. package/src/cli/cmd/tui/context/exit.tsx +24 -0
  143. package/src/cli/cmd/tui/context/helper.tsx +25 -0
  144. package/src/cli/cmd/tui/context/keybind.tsx +102 -0
  145. package/src/cli/cmd/tui/context/kv.tsx +52 -0
  146. package/src/cli/cmd/tui/context/local.tsx +458 -0
  147. package/src/cli/cmd/tui/context/plugin-keybinds.ts +41 -0
  148. package/src/cli/cmd/tui/context/prompt.tsx +18 -0
  149. package/src/cli/cmd/tui/context/route.tsx +54 -0
  150. package/src/cli/cmd/tui/context/sdk.tsx +128 -0
  151. package/src/cli/cmd/tui/context/server.tsx +8 -0
  152. package/src/cli/cmd/tui/context/sync.tsx +510 -0
  153. package/src/cli/cmd/tui/context/theme/abyss.json +233 -0
  154. package/src/cli/cmd/tui/context/theme/apple.json +235 -0
  155. package/src/cli/cmd/tui/context/theme/arctic.json +232 -0
  156. package/src/cli/cmd/tui/context/theme/aura.json +69 -0
  157. package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
  158. package/src/cli/cmd/tui/context/theme/ayuai.json +229 -0
  159. package/src/cli/cmd/tui/context/theme/blood.json +229 -0
  160. package/src/cli/cmd/tui/context/theme/carbonfox.json +248 -0
  161. package/src/cli/cmd/tui/context/theme/catmoe.json +235 -0
  162. package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +233 -0
  163. package/src/cli/cmd/tui/context/theme/catppuccin-latte.json +233 -0
  164. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +233 -0
  165. package/src/cli/cmd/tui/context/theme/catppuccin.json +259 -0
  166. package/src/cli/cmd/tui/context/theme/charcoal.json +230 -0
  167. package/src/cli/cmd/tui/context/theme/chromatic.json +235 -0
  168. package/src/cli/cmd/tui/context/theme/cobalt2.json +228 -0
  169. package/src/cli/cmd/tui/context/theme/cosmic.json +234 -0
  170. package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
  171. package/src/cli/cmd/tui/context/theme/cyber.json +235 -0
  172. package/src/cli/cmd/tui/context/theme/dawnfox.json +229 -0
  173. package/src/cli/cmd/tui/context/theme/dimension.json +235 -0
  174. package/src/cli/cmd/tui/context/theme/dracula-official.json +222 -0
  175. package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
  176. package/src/cli/cmd/tui/context/theme/dream.json +235 -0
  177. package/src/cli/cmd/tui/context/theme/duo.json +235 -0
  178. package/src/cli/cmd/tui/context/theme/dusk.json +235 -0
  179. package/src/cli/cmd/tui/context/theme/ebony.json +232 -0
  180. package/src/cli/cmd/tui/context/theme/equilibrium.json +232 -0
  181. package/src/cli/cmd/tui/context/theme/ethereal.json +235 -0
  182. package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
  183. package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
  184. package/src/cli/cmd/tui/context/theme/fusion.json +235 -0
  185. package/src/cli/cmd/tui/context/theme/ghost.json +235 -0
  186. package/src/cli/cmd/tui/context/theme/github-dark.json +229 -0
  187. package/src/cli/cmd/tui/context/theme/github-dimmed.json +231 -0
  188. package/src/cli/cmd/tui/context/theme/github-light.json +229 -0
  189. package/src/cli/cmd/tui/context/theme/github.json +233 -0
  190. package/src/cli/cmd/tui/context/theme/glass.json +235 -0
  191. package/src/cli/cmd/tui/context/theme/gold.json +235 -0
  192. package/src/cli/cmd/tui/context/theme/gone.json +234 -0
  193. package/src/cli/cmd/tui/context/theme/greyscale.json +229 -0
  194. package/src/cli/cmd/tui/context/theme/gruvbox.json +242 -0
  195. package/src/cli/cmd/tui/context/theme/hacker.json +229 -0
  196. package/src/cli/cmd/tui/context/theme/holo.json +235 -0
  197. package/src/cli/cmd/tui/context/theme/ink.json +235 -0
  198. package/src/cli/cmd/tui/context/theme/jet.json +233 -0
  199. package/src/cli/cmd/tui/context/theme/kanagawa.json +227 -0
  200. package/src/cli/cmd/tui/context/theme/lavender.json +236 -0
  201. package/src/cli/cmd/tui/context/theme/lightph.json +235 -0
  202. package/src/cli/cmd/tui/context/theme/lucent-orng.json +237 -0
  203. package/src/cli/cmd/tui/context/theme/material-ocean.json +230 -0
  204. package/src/cli/cmd/tui/context/theme/material.json +235 -0
  205. package/src/cli/cmd/tui/context/theme/matrix.json +227 -0
  206. package/src/cli/cmd/tui/context/theme/mercury.json +245 -0
  207. package/src/cli/cmd/tui/context/theme/midnight.json +235 -0
  208. package/src/cli/cmd/tui/context/theme/modern.json +235 -0
  209. package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
  210. package/src/cli/cmd/tui/context/theme/muted.json +229 -0
  211. package/src/cli/cmd/tui/context/theme/neon.json +229 -0
  212. package/src/cli/cmd/tui/context/theme/neonfusion.json +235 -0
  213. package/src/cli/cmd/tui/context/theme/neutral.json +235 -0
  214. package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
  215. package/src/cli/cmd/tui/context/theme/nikcli.json +245 -0
  216. package/src/cli/cmd/tui/context/theme/nord.json +223 -0
  217. package/src/cli/cmd/tui/context/theme/nordic.json +235 -0
  218. package/src/cli/cmd/tui/context/theme/nova.json +235 -0
  219. package/src/cli/cmd/tui/context/theme/obsidian.json +234 -0
  220. package/src/cli/cmd/tui/context/theme/one-dark.json +231 -0
  221. package/src/cli/cmd/tui/context/theme/one-pro.json +229 -0
  222. package/src/cli/cmd/tui/context/theme/onyx.json +233 -0
  223. package/src/cli/cmd/tui/context/theme/orng.json +249 -0
  224. package/src/cli/cmd/tui/context/theme/osaka-jade.json +240 -0
  225. package/src/cli/cmd/tui/context/theme/oxocarbon.json +229 -0
  226. package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
  227. package/src/cli/cmd/tui/context/theme/poimandres.json +230 -0
  228. package/src/cli/cmd/tui/context/theme/prism.json +235 -0
  229. package/src/cli/cmd/tui/context/theme/radiant.json +235 -0
  230. package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
  231. package/src/cli/cmd/tui/context/theme/shadow.json +235 -0
  232. package/src/cli/cmd/tui/context/theme/silicon.json +235 -0
  233. package/src/cli/cmd/tui/context/theme/slate.json +233 -0
  234. package/src/cli/cmd/tui/context/theme/soft.json +235 -0
  235. package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
  236. package/src/cli/cmd/tui/context/theme/spectrum.json +235 -0
  237. package/src/cli/cmd/tui/context/theme/starlight.json +233 -0
  238. package/src/cli/cmd/tui/context/theme/sunrise.json +235 -0
  239. package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
  240. package/src/cli/cmd/tui/context/theme/tech.json +235 -0
  241. package/src/cli/cmd/tui/context/theme/tokyonight-storm.json +245 -0
  242. package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
  243. package/src/cli/cmd/tui/context/theme/vapor.json +235 -0
  244. package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
  245. package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
  246. package/src/cli/cmd/tui/context/theme/vivid.json +232 -0
  247. package/src/cli/cmd/tui/context/theme/void.json +235 -0
  248. package/src/cli/cmd/tui/context/theme/vscode.json +235 -0
  249. package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
  250. package/src/cli/cmd/tui/context/theme/zinc.json +236 -0
  251. package/src/cli/cmd/tui/context/theme.tsx +1303 -0
  252. package/src/cli/cmd/tui/event.ts +48 -0
  253. package/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx +152 -0
  254. package/src/cli/cmd/tui/feature-plugins/home/tips.tsx +50 -0
  255. package/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx +63 -0
  256. package/src/cli/cmd/tui/feature-plugins/sidebar/files.tsx +62 -0
  257. package/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx +93 -0
  258. package/src/cli/cmd/tui/feature-plugins/sidebar/lsp.tsx +66 -0
  259. package/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx +96 -0
  260. package/src/cli/cmd/tui/feature-plugins/sidebar/todo.tsx +48 -0
  261. package/src/cli/cmd/tui/feature-plugins/system/plugins.tsx +288 -0
  262. package/src/cli/cmd/tui/plugin/api.tsx +407 -0
  263. package/src/cli/cmd/tui/plugin/index.ts +3 -0
  264. package/src/cli/cmd/tui/plugin/internal.ts +25 -0
  265. package/src/cli/cmd/tui/plugin/runtime.ts +1048 -0
  266. package/src/cli/cmd/tui/plugin/slots.tsx +61 -0
  267. package/src/cli/cmd/tui/routes/home.tsx +153 -0
  268. package/src/cli/cmd/tui/routes/session/dbedit.tsx +474 -0
  269. package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +65 -0
  270. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +110 -0
  271. package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +105 -0
  272. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
  273. package/src/cli/cmd/tui/routes/session/footer.tsx +75 -0
  274. package/src/cli/cmd/tui/routes/session/header.tsx +177 -0
  275. package/src/cli/cmd/tui/routes/session/index.tsx +2280 -0
  276. package/src/cli/cmd/tui/routes/session/permission.tsx +540 -0
  277. package/src/cli/cmd/tui/routes/session/question.tsx +435 -0
  278. package/src/cli/cmd/tui/routes/session/sidebar.tsx +313 -0
  279. package/src/cli/cmd/tui/thread.ts +174 -0
  280. package/src/cli/cmd/tui/ui/dialog-alert.tsx +57 -0
  281. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +83 -0
  282. package/src/cli/cmd/tui/ui/dialog-export-options.tsx +204 -0
  283. package/src/cli/cmd/tui/ui/dialog-help.tsx +38 -0
  284. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +102 -0
  285. package/src/cli/cmd/tui/ui/dialog-select.tsx +389 -0
  286. package/src/cli/cmd/tui/ui/dialog.tsx +180 -0
  287. package/src/cli/cmd/tui/ui/link.tsx +34 -0
  288. package/src/cli/cmd/tui/ui/spinner.ts +368 -0
  289. package/src/cli/cmd/tui/ui/toast.tsx +138 -0
  290. package/src/cli/cmd/tui/util/clipboard.ts +154 -0
  291. package/src/cli/cmd/tui/util/editor.ts +32 -0
  292. package/src/cli/cmd/tui/util/signal.ts +7 -0
  293. package/src/cli/cmd/tui/util/terminal.ts +114 -0
  294. package/src/cli/cmd/tui/util/transcript.ts +98 -0
  295. package/src/cli/cmd/tui/win32.ts +110 -0
  296. package/src/cli/cmd/tui/worker.ts +156 -0
  297. package/src/cli/cmd/uninstall.ts +357 -0
  298. package/src/cli/cmd/upgrade.ts +72 -0
  299. package/src/cli/cmd/web.ts +87 -0
  300. package/src/cli/cmd/workspace-serve.ts +16 -0
  301. package/src/cli/error.ts +57 -0
  302. package/src/cli/network.ts +55 -0
  303. package/src/cli/remote/index.ts +36 -0
  304. package/src/cli/remote/notifications.ts +104 -0
  305. package/src/cli/remote/qr-renderer.ts +86 -0
  306. package/src/cli/remote/remote-service.ts +757 -0
  307. package/src/cli/remote/session-manager.ts +284 -0
  308. package/src/cli/remote/subagent-hooks.ts +151 -0
  309. package/src/cli/remote/types.ts +121 -0
  310. package/src/cli/ui.ts +96 -0
  311. package/src/cli/upgrade.ts +25 -0
  312. package/src/command/index.ts +174 -0
  313. package/src/command/template/initialize.txt +10 -0
  314. package/src/command/template/review.txt +99 -0
  315. package/src/config/config.ts +1760 -0
  316. package/src/config/markdown.ts +88 -0
  317. package/src/config/migrate-tui-config.ts +155 -0
  318. package/src/config/paths.ts +174 -0
  319. package/src/config/tui-schema.ts +36 -0
  320. package/src/config/tui.ts +209 -0
  321. package/src/connectors/api/base.ts +75 -0
  322. package/src/connectors/api/figma.ts +103 -0
  323. package/src/connectors/api/github.ts +247 -0
  324. package/src/connectors/api/lovable.ts +126 -0
  325. package/src/connectors/api/slack.ts +137 -0
  326. package/src/connectors/auth.ts +68 -0
  327. package/src/connectors/cache.ts +119 -0
  328. package/src/connectors/credentials.ts +81 -0
  329. package/src/connectors/index.ts +202 -0
  330. package/src/connectors/registry.ts +358 -0
  331. package/src/docs/context.ts +120 -0
  332. package/src/docs/library.ts +189 -0
  333. package/src/env/index.ts +26 -0
  334. package/src/file/ignore.ts +83 -0
  335. package/src/file/index.ts +411 -0
  336. package/src/file/ripgrep.ts +402 -0
  337. package/src/file/time.ts +65 -0
  338. package/src/file/watcher.ts +127 -0
  339. package/src/flag/flag.ts +128 -0
  340. package/src/format/formatter.ts +356 -0
  341. package/src/format/index.ts +137 -0
  342. package/src/global/index.ts +57 -0
  343. package/src/id/id.ts +83 -0
  344. package/src/ide/index.ts +76 -0
  345. package/src/index.ts +184 -0
  346. package/src/installation/index.ts +246 -0
  347. package/src/lsp/client.ts +250 -0
  348. package/src/lsp/index.ts +483 -0
  349. package/src/lsp/language.ts +119 -0
  350. package/src/lsp/server.ts +2046 -0
  351. package/src/mcp/auth.ts +121 -0
  352. package/src/mcp/index.ts +860 -0
  353. package/src/mcp/oauth-callback.ts +198 -0
  354. package/src/mcp/oauth-provider.ts +148 -0
  355. package/src/mobile/auth.ts +97 -0
  356. package/src/mobile/github-repo.ts +185 -0
  357. package/src/patch/index.ts +631 -0
  358. package/src/permission/arity.ts +150 -0
  359. package/src/permission/dbedit.ts +236 -0
  360. package/src/permission/index.ts +210 -0
  361. package/src/permission/next.ts +287 -0
  362. package/src/plugin/codex.ts +493 -0
  363. package/src/plugin/copilot.ts +261 -0
  364. package/src/plugin/index.ts +714 -0
  365. package/src/plugin/install.ts +379 -0
  366. package/src/plugin/meta.ts +165 -0
  367. package/src/plugin/shared.ts +188 -0
  368. package/src/project/bootstrap.ts +35 -0
  369. package/src/project/instance.ts +84 -0
  370. package/src/project/project.ts +373 -0
  371. package/src/project/state.ts +66 -0
  372. package/src/project/vcs.ts +76 -0
  373. package/src/prompt/stash-store.ts +93 -0
  374. package/src/provider/auth.ts +147 -0
  375. package/src/provider/models-macro.ts +22 -0
  376. package/src/provider/models.ts +216 -0
  377. package/src/provider/provider.ts +1483 -0
  378. package/src/provider/sdk/openai-compatible/src/README.md +5 -0
  379. package/src/provider/sdk/openai-compatible/src/index.ts +2 -0
  380. package/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +100 -0
  381. package/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +303 -0
  382. package/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts +22 -0
  383. package/src/provider/sdk/openai-compatible/src/responses/openai-config.ts +18 -0
  384. package/src/provider/sdk/openai-compatible/src/responses/openai-error.ts +22 -0
  385. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts +207 -0
  386. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +1732 -0
  387. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts +177 -0
  388. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts +1 -0
  389. package/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts +88 -0
  390. package/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts +128 -0
  391. package/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts +115 -0
  392. package/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts +65 -0
  393. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts +104 -0
  394. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts +103 -0
  395. package/src/provider/transform.ts +828 -0
  396. package/src/pty/index.ts +241 -0
  397. package/src/question/index.ts +171 -0
  398. package/src/rag/chunk.ts +43 -0
  399. package/src/rag/embed.ts +179 -0
  400. package/src/rag/index.ts +376 -0
  401. package/src/rag/storage.ts +76 -0
  402. package/src/scheduler/index.ts +61 -0
  403. package/src/server/error.ts +36 -0
  404. package/src/server/event.ts +7 -0
  405. package/src/server/mdns.ts +59 -0
  406. package/src/server/routes/chatbot.ts +205 -0
  407. package/src/server/routes/companion.ts +729 -0
  408. package/src/server/routes/config.ts +92 -0
  409. package/src/server/routes/connectors.ts +121 -0
  410. package/src/server/routes/dbedit.ts +76 -0
  411. package/src/server/routes/experimental.ts +210 -0
  412. package/src/server/routes/file.ts +197 -0
  413. package/src/server/routes/global.ts +135 -0
  414. package/src/server/routes/mcp.ts +225 -0
  415. package/src/server/routes/mobile.ts +2044 -0
  416. package/src/server/routes/permission.ts +68 -0
  417. package/src/server/routes/project.ts +82 -0
  418. package/src/server/routes/provider.ts +235 -0
  419. package/src/server/routes/pty.ts +169 -0
  420. package/src/server/routes/question.ts +98 -0
  421. package/src/server/routes/session.ts +968 -0
  422. package/src/server/routes/tui.ts +379 -0
  423. package/src/server/routes/workspace.ts +104 -0
  424. package/src/server/server.ts +761 -0
  425. package/src/server/ssh.ts +207 -0
  426. package/src/session/auth.ts +402 -0
  427. package/src/session/compaction.ts +253 -0
  428. package/src/session/generate.ts +38 -0
  429. package/src/session/index.ts +598 -0
  430. package/src/session/llm.ts +273 -0
  431. package/src/session/message-v2.ts +836 -0
  432. package/src/session/message.ts +189 -0
  433. package/src/session/processor.ts +408 -0
  434. package/src/session/prompt/anthropic-20250930.txt +165 -0
  435. package/src/session/prompt/anthropic.txt +105 -0
  436. package/src/session/prompt/anthropic_spoof.txt +1 -0
  437. package/src/session/prompt/beast.txt +147 -0
  438. package/src/session/prompt/build-switch.txt +5 -0
  439. package/src/session/prompt/codex_header.txt +79 -0
  440. package/src/session/prompt/copilot-gpt-5.txt +143 -0
  441. package/src/session/prompt/gemini.txt +155 -0
  442. package/src/session/prompt/max-steps.txt +16 -0
  443. package/src/session/prompt/plan-reminder-anthropic.txt +67 -0
  444. package/src/session/prompt/plan.txt +25 -0
  445. package/src/session/prompt/qwen.txt +108 -0
  446. package/src/session/prompt.ts +1942 -0
  447. package/src/session/retry.ts +90 -0
  448. package/src/session/revert.ts +120 -0
  449. package/src/session/stats.ts +404 -0
  450. package/src/session/status.ts +84 -0
  451. package/src/session/summary.ts +184 -0
  452. package/src/session/system.ts +195 -0
  453. package/src/session/toast.tsx +105 -0
  454. package/src/session/todo.ts +258 -0
  455. package/src/session/uninstall.ts +357 -0
  456. package/src/share/share-next.ts +421 -0
  457. package/src/share/share.ts +92 -0
  458. package/src/shell/shell.ts +65 -0
  459. package/src/skill/index.ts +1 -0
  460. package/src/skill/skill.ts +232 -0
  461. package/src/snapshot/index.ts +297 -0
  462. package/src/storage/storage.ts +227 -0
  463. package/src/tool/apply_patch.ts +288 -0
  464. package/src/tool/apply_patch.txt +33 -0
  465. package/src/tool/bash.ts +252 -0
  466. package/src/tool/bash.txt +115 -0
  467. package/src/tool/batch.ts +175 -0
  468. package/src/tool/batch.txt +24 -0
  469. package/src/tool/codesearch.ts +132 -0
  470. package/src/tool/codesearch.txt +12 -0
  471. package/src/tool/context_collect.ts +152 -0
  472. package/src/tool/context_collect.txt +9 -0
  473. package/src/tool/context_diagnostics.ts +81 -0
  474. package/src/tool/context_diagnostics.txt +5 -0
  475. package/src/tool/context_related.ts +117 -0
  476. package/src/tool/context_related.txt +5 -0
  477. package/src/tool/context_search.ts +108 -0
  478. package/src/tool/context_search.txt +8 -0
  479. package/src/tool/db-diff.ts +434 -0
  480. package/src/tool/db-table.txt +15 -0
  481. package/src/tool/docs_add.ts +50 -0
  482. package/src/tool/docs_add.txt +5 -0
  483. package/src/tool/docs_context.ts +56 -0
  484. package/src/tool/docs_context.txt +4 -0
  485. package/src/tool/docs_gap_report.ts +79 -0
  486. package/src/tool/docs_gap_report.txt +7 -0
  487. package/src/tool/docs_load.ts +41 -0
  488. package/src/tool/docs_load.txt +4 -0
  489. package/src/tool/docs_request.ts +129 -0
  490. package/src/tool/docs_request.txt +7 -0
  491. package/src/tool/docs_search.ts +51 -0
  492. package/src/tool/docs_search.txt +6 -0
  493. package/src/tool/docs_unload.ts +38 -0
  494. package/src/tool/docs_unload.txt +5 -0
  495. package/src/tool/edit.ts +614 -0
  496. package/src/tool/edit.txt +10 -0
  497. package/src/tool/external-directory.ts +32 -0
  498. package/src/tool/generate_image.ts +174 -0
  499. package/src/tool/generate_image.txt +12 -0
  500. package/src/tool/glob.ts +79 -0
  501. package/src/tool/glob.txt +6 -0
  502. package/src/tool/grep.ts +153 -0
  503. package/src/tool/grep.txt +8 -0
  504. package/src/tool/invalid.ts +17 -0
  505. package/src/tool/ls.ts +116 -0
  506. package/src/tool/ls.txt +1 -0
  507. package/src/tool/lsp.ts +96 -0
  508. package/src/tool/lsp.txt +19 -0
  509. package/src/tool/memory_search.ts +141 -0
  510. package/src/tool/memory_search.txt +8 -0
  511. package/src/tool/multiedit.ts +46 -0
  512. package/src/tool/multiedit.txt +41 -0
  513. package/src/tool/plan-enter.txt +14 -0
  514. package/src/tool/plan-exit.txt +13 -0
  515. package/src/tool/plan.ts +130 -0
  516. package/src/tool/question.ts +33 -0
  517. package/src/tool/question.txt +10 -0
  518. package/src/tool/rag_index.ts +77 -0
  519. package/src/tool/rag_index.txt +10 -0
  520. package/src/tool/rag_reset.ts +26 -0
  521. package/src/tool/rag_reset.txt +4 -0
  522. package/src/tool/rag_search.ts +62 -0
  523. package/src/tool/rag_search.txt +6 -0
  524. package/src/tool/rag_status.ts +45 -0
  525. package/src/tool/rag_status.txt +4 -0
  526. package/src/tool/read.ts +203 -0
  527. package/src/tool/read.txt +12 -0
  528. package/src/tool/registry.ts +214 -0
  529. package/src/tool/skill.ts +169 -0
  530. package/src/tool/skill.txt +3 -0
  531. package/src/tool/smart_docs.ts +74 -0
  532. package/src/tool/smart_docs.txt +7 -0
  533. package/src/tool/speak/elevenlabs.ts +201 -0
  534. package/src/tool/speak/openrouter.ts +240 -0
  535. package/src/tool/speak/provider.ts +83 -0
  536. package/src/tool/speak.ts +440 -0
  537. package/src/tool/task.ts +194 -0
  538. package/src/tool/task.txt +60 -0
  539. package/src/tool/todo.ts +53 -0
  540. package/src/tool/todoread.txt +14 -0
  541. package/src/tool/todowrite.txt +167 -0
  542. package/src/tool/tool.ts +87 -0
  543. package/src/tool/tree.ts +218 -0
  544. package/src/tool/tree.txt +8 -0
  545. package/src/tool/truncation.ts +106 -0
  546. package/src/tool/use-connector.ts +47 -0
  547. package/src/tool/voice.ts +188 -0
  548. package/src/tool/webfetch.ts +205 -0
  549. package/src/tool/webfetch.txt +13 -0
  550. package/src/tool/websearch.ts +150 -0
  551. package/src/tool/websearch.txt +14 -0
  552. package/src/tool/write.ts +80 -0
  553. package/src/tool/write.txt +8 -0
  554. package/src/util/archive.ts +16 -0
  555. package/src/util/color.ts +19 -0
  556. package/src/util/context.ts +25 -0
  557. package/src/util/defer.ts +12 -0
  558. package/src/util/error.ts +77 -0
  559. package/src/util/eventloop.ts +20 -0
  560. package/src/util/filesystem.ts +125 -0
  561. package/src/util/flock.ts +329 -0
  562. package/src/util/fn.ts +11 -0
  563. package/src/util/format.ts +20 -0
  564. package/src/util/hash.ts +7 -0
  565. package/src/util/iife.ts +3 -0
  566. package/src/util/keybind.ts +103 -0
  567. package/src/util/lazy.ts +18 -0
  568. package/src/util/locale.ts +81 -0
  569. package/src/util/lock.ts +98 -0
  570. package/src/util/log.ts +180 -0
  571. package/src/util/network.ts +9 -0
  572. package/src/util/process.ts +15 -0
  573. package/src/util/queue.ts +32 -0
  574. package/src/util/record.ts +3 -0
  575. package/src/util/rpc.ts +66 -0
  576. package/src/util/scrap.ts +10 -0
  577. package/src/util/signal.ts +12 -0
  578. package/src/util/timeout.ts +14 -0
  579. package/src/util/token.ts +7 -0
  580. package/src/util/wildcard.ts +56 -0
  581. package/src/workspace/adaptors/index.ts +271 -0
  582. package/src/workspace/adaptors/types.ts +14 -0
  583. package/src/workspace/adaptors/worktree.ts +31 -0
  584. package/src/workspace/config.ts +19 -0
  585. package/src/workspace/index.ts +223 -0
  586. package/src/workspace/session-proxy-middleware.ts +97 -0
  587. package/src/workspace/sse.ts +66 -0
  588. package/src/workspace/workspace-context.ts +23 -0
  589. package/src/workspace/workspace-server/routes.ts +33 -0
  590. package/src/workspace/workspace-server/server.ts +47 -0
  591. package/src/worktree/index.ts +487 -0
  592. package/sst-env.d.ts +10 -0
  593. package/test/benchmark.test.ts +121 -0
  594. package/test/build-optimizations.test.ts +124 -0
  595. package/test/id-benchmark.test.ts +132 -0
  596. package/test/optimizations.test.ts +302 -0
  597. package/test/preload.ts +1 -0
  598. package/test/solidjs-benchmark.test.ts +262 -0
  599. package/test/solidjs-optimizations.test.ts +259 -0
  600. package/test/tui-benchmark.test.ts +230 -0
  601. package/test/wildcard-benchmark.test.ts +180 -0
  602. package/tsconfig.json +26 -0
@@ -0,0 +1,128 @@
1
+ function truthy(key: string) {
2
+ const value = process.env[key]?.toLowerCase()
3
+ return value === "true" || value === "1"
4
+ }
5
+
6
+ export namespace Flag {
7
+ export const NIKCLI_AUTO_SHARE = truthy("NIKCLI_AUTO_SHARE")
8
+ export const NIKCLI_GIT_BASH_PATH = process.env["NIKCLI_GIT_BASH_PATH"]
9
+ export const NIKCLI_CONFIG = process.env["NIKCLI_CONFIG"]
10
+ export declare const NIKCLI_CONFIG_DIR: string | undefined
11
+ export const NIKCLI_CONFIG_CONTENT = process.env["NIKCLI_CONFIG_CONTENT"]
12
+ export const NIKCLI_DISABLE_AUTOUPDATE = truthy("NIKCLI_DISABLE_AUTOUPDATE")
13
+ export const NIKCLI_DISABLE_PRUNE = truthy("NIKCLI_DISABLE_PRUNE")
14
+ export const NIKCLI_DISABLE_TERMINAL_TITLE = truthy("NIKCLI_DISABLE_TERMINAL_TITLE")
15
+ export const NIKCLI_PERMISSION = process.env["NIKCLI_PERMISSION"]
16
+ export const NIKCLI_DISABLE_DEFAULT_PLUGINS = truthy("NIKCLI_DISABLE_DEFAULT_PLUGINS")
17
+ export const NIKCLI_DISABLE_LSP_DOWNLOAD = truthy("NIKCLI_DISABLE_LSP_DOWNLOAD")
18
+ export const NIKCLI_ENABLE_EXPERIMENTAL_MODELS = truthy("NIKCLI_ENABLE_EXPERIMENTAL_MODELS")
19
+ export const NIKCLI_DISABLE_AUTOCOMPACT = truthy("NIKCLI_DISABLE_AUTOCOMPACT")
20
+ export const NIKCLI_DISABLE_MODELS_FETCH = truthy("NIKCLI_DISABLE_MODELS_FETCH")
21
+ export const NIKCLI_DISABLE_CLAUDE_CODE = truthy("NIKCLI_DISABLE_CLAUDE_CODE")
22
+ export const NIKCLI_DISABLE_CLAUDE_CODE_PROMPT =
23
+ NIKCLI_DISABLE_CLAUDE_CODE || truthy("NIKCLI_DISABLE_CLAUDE_CODE_PROMPT")
24
+ export const NIKCLI_DISABLE_CLAUDE_CODE_SKILLS =
25
+ NIKCLI_DISABLE_CLAUDE_CODE || truthy("NIKCLI_DISABLE_CLAUDE_CODE_SKILLS")
26
+ export const NIKCLI_DISABLE_EXTERNAL_SKILLS =
27
+ NIKCLI_DISABLE_CLAUDE_CODE_SKILLS || truthy("NIKCLI_DISABLE_EXTERNAL_SKILLS")
28
+ export declare const NIKCLI_DISABLE_PROJECT_CONFIG: boolean
29
+ export const NIKCLI_FAKE_VCS = process.env["NIKCLI_FAKE_VCS"]
30
+ export const NIKCLI_CLIENT = process.env["NIKCLI_CLIENT"] ?? "cli"
31
+ export const NIKCLI_SERVER_PASSWORD = process.env["NIKCLI_SERVER_PASSWORD"]
32
+ export const NIKCLI_SERVER_USERNAME = process.env["NIKCLI_SERVER_USERNAME"]
33
+ export const NIKCLI_SERVER_TAILSCALE_AUTH = truthy("NIKCLI_SERVER_TAILSCALE_AUTH")
34
+ export const NIKCLI_SERVER_TAILSCALE_USERS = process.env["NIKCLI_SERVER_TAILSCALE_USERS"]
35
+
36
+ // SSH Server
37
+ export const NIKCLI_SERVER_SSH_ENABLED = truthy("NIKCLI_SERVER_SSH_ENABLED")
38
+ export const NIKCLI_SERVER_SSH_PORT = parseInt(process.env["NIKCLI_SERVER_SSH_PORT"] ?? "2222")
39
+ export const NIKCLI_SERVER_SSH_HOST = process.env["NIKCLI_SERVER_SSH_HOST"] ?? "0.0.0.0"
40
+
41
+ // Connectors
42
+ export const NIKCLI_FIGMA_TOKEN = process.env["NIKCLI_FIGMA_TOKEN"]
43
+ export const NIKCLI_SLACK_BOT_TOKEN = process.env["NIKCLI_SLACK_BOT_TOKEN"]
44
+ export const NIKCLI_GITHUB_TOKEN = process.env["NIKCLI_GITHUB_TOKEN"]
45
+ export const NIKCLI_GITHUB_OAUTH_CLIENT_ID = process.env["NIKCLI_GITHUB_OAUTH_CLIENT_ID"] ?? process.env["GITHUB_CLIENT_ID_CONSOLE"] ?? process.env["GITHUB_CLIENT_ID"] ?? undefined
46
+ export const NIKCLI_LOVABLE_TOKEN = process.env["NIKCLI_LOVABLE_TOKEN"] ?? process.env["NIKCLI_LOVABLE_API_KEY"]
47
+ export const NIKCLI_LOVABLE_API_KEY = process.env["NIKCLI_LOVABLE_API_KEY"]
48
+
49
+ // Notifications
50
+ export const NIKCLI_SLACK_CHANNEL =
51
+ process.env["NIKCLI_SLACK_CHANNEL"] ?? process.env["SLACK_DEFAULT_CHANNEL"] ?? process.env["SLACK_CHANNEL"]
52
+ export const NIKCLI_DISCORD_WEBHOOK_URL =
53
+ process.env["NIKCLI_DISCORD_WEBHOOK_URL"] ?? process.env["DISCORD_WEBHOOK_URL"]
54
+ export const NIKCLI_TODO_NOTIFICATIONS = truthy("NIKCLI_TODO_NOTIFICATIONS")
55
+ export const NIKCLI_SLACK_TASK_NOTIFICATIONS =
56
+ truthy("NIKCLI_SLACK_TASK_NOTIFICATIONS") || truthy("SLACK_TASK_NOTIFICATIONS")
57
+ export const NIKCLI_DISCORD_TASK_NOTIFICATIONS =
58
+ truthy("NIKCLI_DISCORD_TASK_NOTIFICATIONS") || truthy("DISCORD_TASK_NOTIFICATIONS")
59
+
60
+ // TUI plugin system
61
+ export declare const NIKCLI_TUI_CONFIG: string | undefined
62
+ export const NIKCLI_PURE = truthy("NIKCLI_PURE")
63
+ export const NIKCLI_PLUGIN_META_FILE = process.env["NIKCLI_PLUGIN_META_FILE"]
64
+
65
+ // Experimental
66
+ export const NIKCLI_EXPERIMENTAL = truthy("NIKCLI_EXPERIMENTAL")
67
+ export const NIKCLI_EXPERIMENTAL_FILEWATCHER = truthy("NIKCLI_EXPERIMENTAL_FILEWATCHER")
68
+ export const NIKCLI_EXPERIMENTAL_DISABLE_FILEWATCHER = truthy("NIKCLI_EXPERIMENTAL_DISABLE_FILEWATCHER")
69
+ export const NIKCLI_EXPERIMENTAL_ICON_DISCOVERY = NIKCLI_EXPERIMENTAL || truthy("NIKCLI_EXPERIMENTAL_ICON_DISCOVERY")
70
+ export const NIKCLI_EXPERIMENTAL_DISABLE_COPY_ON_SELECT = truthy("NIKCLI_EXPERIMENTAL_DISABLE_COPY_ON_SELECT")
71
+ export const NIKCLI_ENABLE_EXA =
72
+ truthy("NIKCLI_ENABLE_EXA") || NIKCLI_EXPERIMENTAL || truthy("NIKCLI_EXPERIMENTAL_EXA")
73
+ export const NIKCLI_EXPERIMENTAL_BASH_MAX_OUTPUT_LENGTH = number("NIKCLI_EXPERIMENTAL_BASH_MAX_OUTPUT_LENGTH")
74
+ export const NIKCLI_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS = number("NIKCLI_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS")
75
+ export const NIKCLI_EXPERIMENTAL_OUTPUT_TOKEN_MAX = number("NIKCLI_EXPERIMENTAL_OUTPUT_TOKEN_MAX")
76
+ export const NIKCLI_EXPERIMENTAL_OXFMT = NIKCLI_EXPERIMENTAL || truthy("NIKCLI_EXPERIMENTAL_OXFMT")
77
+ export const NIKCLI_EXPERIMENTAL_LSP_TY = truthy("NIKCLI_EXPERIMENTAL_LSP_TY")
78
+ export const NIKCLI_EXPERIMENTAL_LSP_TOOL = NIKCLI_EXPERIMENTAL || truthy("NIKCLI_EXPERIMENTAL_LSP_TOOL")
79
+ export const NIKCLI_DISABLE_FILETIME_CHECK = truthy("NIKCLI_DISABLE_FILETIME_CHECK")
80
+ export const NIKCLI_EXPERIMENTAL_PLAN_MODE = NIKCLI_EXPERIMENTAL || truthy("NIKCLI_EXPERIMENTAL_PLAN_MODE")
81
+ export const NIKCLI_EXPERIMENTAL_WORKSPACES_TUI = NIKCLI_EXPERIMENTAL || truthy("NIKCLI_EXPERIMENTAL_WORKSPACES_TUI")
82
+ export const NIKCLI_EXPERIMENTAL_SECURITY_TOOL = NIKCLI_EXPERIMENTAL || truthy("NIKCLI_EXPERIMENTAL_SECURITY_TOOL")
83
+
84
+ function number(key: string) {
85
+ const value = process.env[key]
86
+ if (!value) return undefined
87
+ const parsed = Number(value)
88
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined
89
+ }
90
+ }
91
+
92
+ // Dynamic getter for NIKCLI_DISABLE_PROJECT_CONFIG
93
+ Object.defineProperty(Flag, "NIKCLI_DISABLE_PROJECT_CONFIG", {
94
+ get() {
95
+ return truthy("NIKCLI_DISABLE_PROJECT_CONFIG")
96
+ },
97
+ enumerable: true,
98
+ configurable: false,
99
+ })
100
+
101
+ // Dynamic getter for NIKCLI_CONFIG_DIR
102
+ Object.defineProperty(Flag, "NIKCLI_CONFIG_DIR", {
103
+ get() {
104
+ return process.env["NIKCLI_CONFIG_DIR"]
105
+ },
106
+ enumerable: true,
107
+ configurable: false,
108
+ })
109
+
110
+ Object.defineProperty(Flag, "NIKCLI_TUI_CONFIG", {
111
+ get() {
112
+ return process.env["NIKCLI_TUI_CONFIG"]
113
+ },
114
+ enumerable: true,
115
+ configurable: false,
116
+ })
117
+
118
+ Object.defineProperty(Flag, "NIKCLI_GITHUB_OAUTH_CLIENT_ID", {
119
+ get() {
120
+ return (
121
+ process.env["NIKCLI_GITHUB_OAUTH_CLIENT_ID"] ??
122
+ process.env["GITHUB_CLIENT_ID_CONSOLE"] ??
123
+ process.env["GITHUB_CLIENT_ID"]
124
+ )
125
+ },
126
+ enumerable: true,
127
+ configurable: false,
128
+ })
@@ -0,0 +1,356 @@
1
+ import { readableStreamToText } from "bun"
2
+ import { BunProc } from "../bun"
3
+ import { Instance } from "../project/instance"
4
+ import { Filesystem } from "../util/filesystem"
5
+ import { Flag } from "@/flag/flag"
6
+
7
+ export interface Info {
8
+ name: string
9
+ command: string[]
10
+ environment?: Record<string, string>
11
+ extensions: string[]
12
+ enabled(): Promise<boolean>
13
+ }
14
+
15
+ export const gofmt: Info = {
16
+ name: "gofmt",
17
+ command: ["gofmt", "-w", "$FILE"],
18
+ extensions: [".go"],
19
+ async enabled() {
20
+ return Bun.which("gofmt") !== null
21
+ },
22
+ }
23
+
24
+ export const mix: Info = {
25
+ name: "mix",
26
+ command: ["mix", "format", "$FILE"],
27
+ extensions: [".ex", ".exs", ".eex", ".heex", ".leex", ".neex", ".sface"],
28
+ async enabled() {
29
+ return Bun.which("mix") !== null
30
+ },
31
+ }
32
+
33
+ export const prettier: Info = {
34
+ name: "prettier",
35
+ command: [BunProc.which(), "x", "prettier", "--write", "$FILE"],
36
+ environment: {
37
+ BUN_BE_BUN: "1",
38
+ },
39
+ extensions: [
40
+ ".js",
41
+ ".jsx",
42
+ ".mjs",
43
+ ".cjs",
44
+ ".ts",
45
+ ".tsx",
46
+ ".mts",
47
+ ".cts",
48
+ ".html",
49
+ ".htm",
50
+ ".css",
51
+ ".scss",
52
+ ".sass",
53
+ ".less",
54
+ ".vue",
55
+ ".svelte",
56
+ ".json",
57
+ ".jsonc",
58
+ ".yaml",
59
+ ".yml",
60
+ ".toml",
61
+ ".xml",
62
+ ".md",
63
+ ".mdx",
64
+ ".graphql",
65
+ ".gql",
66
+ ],
67
+ async enabled() {
68
+ const items = await Filesystem.findUp("package.json", Instance.directory, Instance.worktree)
69
+ for (const item of items) {
70
+ const json = await Bun.file(item).json()
71
+ if (json.dependencies?.prettier) return true
72
+ if (json.devDependencies?.prettier) return true
73
+ }
74
+ return false
75
+ },
76
+ }
77
+
78
+ export const oxfmt: Info = {
79
+ name: "oxfmt",
80
+ command: [BunProc.which(), "x", "oxfmt", "$FILE"],
81
+ environment: {
82
+ BUN_BE_BUN: "1",
83
+ },
84
+ extensions: [".js", ".jsx", ".mjs", ".cjs", ".ts", ".tsx", ".mts", ".cts"],
85
+ async enabled() {
86
+ if (!Flag.NIKCLI_EXPERIMENTAL_OXFMT) return false
87
+ const items = await Filesystem.findUp("package.json", Instance.directory, Instance.worktree)
88
+ for (const item of items) {
89
+ const json = await Bun.file(item).json()
90
+ if (json.dependencies?.oxfmt) return true
91
+ if (json.devDependencies?.oxfmt) return true
92
+ }
93
+ return false
94
+ },
95
+ }
96
+
97
+ export const biome: Info = {
98
+ name: "biome",
99
+ command: [BunProc.which(), "x", "@biomejs/biome", "check", "--write", "$FILE"],
100
+ environment: {
101
+ BUN_BE_BUN: "1",
102
+ },
103
+ extensions: [
104
+ ".js",
105
+ ".jsx",
106
+ ".mjs",
107
+ ".cjs",
108
+ ".ts",
109
+ ".tsx",
110
+ ".mts",
111
+ ".cts",
112
+ ".html",
113
+ ".htm",
114
+ ".css",
115
+ ".scss",
116
+ ".sass",
117
+ ".less",
118
+ ".vue",
119
+ ".svelte",
120
+ ".json",
121
+ ".jsonc",
122
+ ".yaml",
123
+ ".yml",
124
+ ".toml",
125
+ ".xml",
126
+ ".md",
127
+ ".mdx",
128
+ ".graphql",
129
+ ".gql",
130
+ ],
131
+ async enabled() {
132
+ const configs = ["biome.json", "biome.jsonc"]
133
+ for (const config of configs) {
134
+ const found = await Filesystem.findUp(config, Instance.directory, Instance.worktree)
135
+ if (found.length > 0) {
136
+ return true
137
+ }
138
+ }
139
+ return false
140
+ },
141
+ }
142
+
143
+ export const zig: Info = {
144
+ name: "zig",
145
+ command: ["zig", "fmt", "$FILE"],
146
+ extensions: [".zig", ".zon"],
147
+ async enabled() {
148
+ return Bun.which("zig") !== null
149
+ },
150
+ }
151
+
152
+ export const clang: Info = {
153
+ name: "clang-format",
154
+ command: ["clang-format", "-i", "$FILE"],
155
+ extensions: [".c", ".cc", ".cpp", ".cxx", ".c++", ".h", ".hh", ".hpp", ".hxx", ".h++", ".ino", ".C", ".H"],
156
+ async enabled() {
157
+ const items = await Filesystem.findUp(".clang-format", Instance.directory, Instance.worktree)
158
+ return items.length > 0
159
+ },
160
+ }
161
+
162
+ export const ktlint: Info = {
163
+ name: "ktlint",
164
+ command: ["ktlint", "-F", "$FILE"],
165
+ extensions: [".kt", ".kts"],
166
+ async enabled() {
167
+ return Bun.which("ktlint") !== null
168
+ },
169
+ }
170
+
171
+ export const ruff: Info = {
172
+ name: "ruff",
173
+ command: ["ruff", "format", "$FILE"],
174
+ extensions: [".py", ".pyi"],
175
+ async enabled() {
176
+ if (!Bun.which("ruff")) return false
177
+ const configs = ["pyproject.toml", "ruff.toml", ".ruff.toml"]
178
+ for (const config of configs) {
179
+ const found = await Filesystem.findUp(config, Instance.directory, Instance.worktree)
180
+ if (found.length > 0) {
181
+ if (config === "pyproject.toml") {
182
+ const content = await Bun.file(found[0]).text()
183
+ if (content.includes("[tool.ruff]")) return true
184
+ } else {
185
+ return true
186
+ }
187
+ }
188
+ }
189
+ const deps = ["requirements.txt", "pyproject.toml", "Pipfile"]
190
+ for (const dep of deps) {
191
+ const found = await Filesystem.findUp(dep, Instance.directory, Instance.worktree)
192
+ if (found.length > 0) {
193
+ const content = await Bun.file(found[0]).text()
194
+ if (content.includes("ruff")) return true
195
+ }
196
+ }
197
+ return false
198
+ },
199
+ }
200
+
201
+ export const rlang: Info = {
202
+ name: "air",
203
+ command: ["air", "format", "$FILE"],
204
+ extensions: [".R"],
205
+ async enabled() {
206
+ const airPath = Bun.which("air")
207
+ if (airPath == null) return false
208
+
209
+ try {
210
+ const proc = Bun.spawn(["air", "--help"], {
211
+ stdout: "pipe",
212
+ stderr: "pipe",
213
+ })
214
+ await proc.exited
215
+ const output = await readableStreamToText(proc.stdout)
216
+
217
+ const firstLine = output.split("\n")[0]
218
+ const hasR = firstLine.includes("R language")
219
+ const hasFormatter = firstLine.includes("formatter")
220
+ return hasR && hasFormatter
221
+ } catch (error) {
222
+ return false
223
+ }
224
+ },
225
+ }
226
+
227
+ export const uvformat: Info = {
228
+ name: "uv",
229
+ command: ["uv", "format", "--", "$FILE"],
230
+ extensions: [".py", ".pyi"],
231
+ async enabled() {
232
+ if (await ruff.enabled()) return false
233
+ if (Bun.which("uv") !== null) {
234
+ const proc = Bun.spawn(["uv", "format", "--help"], { stderr: "pipe", stdout: "pipe" })
235
+ const code = await proc.exited
236
+ return code === 0
237
+ }
238
+ return false
239
+ },
240
+ }
241
+
242
+ export const rubocop: Info = {
243
+ name: "rubocop",
244
+ command: ["rubocop", "--autocorrect", "$FILE"],
245
+ extensions: [".rb", ".rake", ".gemspec", ".ru"],
246
+ async enabled() {
247
+ return Bun.which("rubocop") !== null
248
+ },
249
+ }
250
+
251
+ export const standardrb: Info = {
252
+ name: "standardrb",
253
+ command: ["standardrb", "--fix", "$FILE"],
254
+ extensions: [".rb", ".rake", ".gemspec", ".ru"],
255
+ async enabled() {
256
+ return Bun.which("standardrb") !== null
257
+ },
258
+ }
259
+
260
+ export const htmlbeautifier: Info = {
261
+ name: "htmlbeautifier",
262
+ command: ["htmlbeautifier", "$FILE"],
263
+ extensions: [".erb", ".html.erb"],
264
+ async enabled() {
265
+ return Bun.which("htmlbeautifier") !== null
266
+ },
267
+ }
268
+
269
+ export const dart: Info = {
270
+ name: "dart",
271
+ command: ["dart", "format", "$FILE"],
272
+ extensions: [".dart"],
273
+ async enabled() {
274
+ return Bun.which("dart") !== null
275
+ },
276
+ }
277
+
278
+ export const ocamlformat: Info = {
279
+ name: "ocamlformat",
280
+ command: ["ocamlformat", "-i", "$FILE"],
281
+ extensions: [".ml", ".mli"],
282
+ async enabled() {
283
+ if (!Bun.which("ocamlformat")) return false
284
+ const items = await Filesystem.findUp(".ocamlformat", Instance.directory, Instance.worktree)
285
+ return items.length > 0
286
+ },
287
+ }
288
+
289
+ export const terraform: Info = {
290
+ name: "terraform",
291
+ command: ["terraform", "fmt", "$FILE"],
292
+ extensions: [".tf", ".tfvars"],
293
+ async enabled() {
294
+ return Bun.which("terraform") !== null
295
+ },
296
+ }
297
+
298
+ export const latexindent: Info = {
299
+ name: "latexindent",
300
+ command: ["latexindent", "-w", "-s", "$FILE"],
301
+ extensions: [".tex"],
302
+ async enabled() {
303
+ return Bun.which("latexindent") !== null
304
+ },
305
+ }
306
+
307
+ export const gleam: Info = {
308
+ name: "gleam",
309
+ command: ["gleam", "format", "$FILE"],
310
+ extensions: [".gleam"],
311
+ async enabled() {
312
+ return Bun.which("gleam") !== null
313
+ },
314
+ }
315
+
316
+ export const shfmt: Info = {
317
+ name: "shfmt",
318
+ command: ["shfmt", "-w", "$FILE"],
319
+ extensions: [".sh", ".bash"],
320
+ async enabled() {
321
+ return Bun.which("shfmt") !== null
322
+ },
323
+ }
324
+
325
+ export const nixfmt: Info = {
326
+ name: "nixfmt",
327
+ command: ["nixfmt", "$FILE"],
328
+ extensions: [".nix"],
329
+ async enabled() {
330
+ return Bun.which("nixfmt") !== null
331
+ },
332
+ }
333
+
334
+ export const rustfmt: Info = {
335
+ name: "rustfmt",
336
+ command: ["rustfmt", "$FILE"],
337
+ extensions: [".rs"],
338
+ async enabled() {
339
+ return Bun.which("rustfmt") !== null
340
+ },
341
+ }
342
+
343
+ export const pint: Info = {
344
+ name: "pint",
345
+ command: ["./vendor/bin/pint", "$FILE"],
346
+ extensions: [".php"],
347
+ async enabled() {
348
+ const items = await Filesystem.findUp("composer.json", Instance.directory, Instance.worktree)
349
+ for (const item of items) {
350
+ const json = await Bun.file(item).json()
351
+ if (json.require?.["laravel/pint"]) return true
352
+ if (json["require-dev"]?.["laravel/pint"]) return true
353
+ }
354
+ return false
355
+ },
356
+ }
@@ -0,0 +1,137 @@
1
+ import { Bus } from "../bus"
2
+ import { File } from "../file"
3
+ import { Log } from "../util/log"
4
+ import path from "path"
5
+ import z from "zod"
6
+
7
+ import * as Formatter from "./formatter"
8
+ import { Config } from "../config/config"
9
+ import { mergeDeep } from "remeda"
10
+ import { Instance } from "../project/instance"
11
+
12
+ export namespace Format {
13
+ const log = Log.create({ service: "format" })
14
+
15
+ export const Status = z
16
+ .object({
17
+ name: z.string(),
18
+ extensions: z.string().array(),
19
+ enabled: z.boolean(),
20
+ })
21
+ .meta({
22
+ ref: "FormatterStatus",
23
+ })
24
+ export type Status = z.infer<typeof Status>
25
+
26
+ const state = Instance.state(async () => {
27
+ const enabled: Record<string, boolean> = {}
28
+ const cfg = await Config.get()
29
+
30
+ const formatters: Record<string, Formatter.Info> = {}
31
+ if (cfg.formatter === false) {
32
+ log.info("all formatters are disabled")
33
+ return {
34
+ enabled,
35
+ formatters,
36
+ }
37
+ }
38
+
39
+ for (const item of Object.values(Formatter)) {
40
+ formatters[item.name] = item
41
+ }
42
+ for (const [name, item] of Object.entries(cfg.formatter ?? {})) {
43
+ if (item.disabled) {
44
+ delete formatters[name]
45
+ continue
46
+ }
47
+ const result: Formatter.Info = mergeDeep(formatters[name] ?? {}, {
48
+ command: [],
49
+ extensions: [],
50
+ ...item,
51
+ })
52
+
53
+ if (result.command.length === 0) continue
54
+
55
+ result.enabled = async () => true
56
+ result.name = name
57
+ formatters[name] = result
58
+ }
59
+
60
+ return {
61
+ enabled,
62
+ formatters,
63
+ }
64
+ })
65
+
66
+ async function isEnabled(item: Formatter.Info) {
67
+ const s = await state()
68
+ let status = s.enabled[item.name]
69
+ if (status === undefined) {
70
+ status = await item.enabled()
71
+ s.enabled[item.name] = status
72
+ }
73
+ return status
74
+ }
75
+
76
+ async function getFormatter(ext: string) {
77
+ const formatters = await state().then((x) => x.formatters)
78
+ const result = []
79
+ for (const item of Object.values(formatters)) {
80
+ log.info("checking", { name: item.name, ext })
81
+ if (!item.extensions.includes(ext)) continue
82
+ if (!(await isEnabled(item))) continue
83
+ log.info("enabled", { name: item.name, ext })
84
+ result.push(item)
85
+ }
86
+ return result
87
+ }
88
+
89
+ export async function status() {
90
+ const s = await state()
91
+ const result: Status[] = []
92
+ for (const formatter of Object.values(s.formatters)) {
93
+ const enabled = await isEnabled(formatter)
94
+ result.push({
95
+ name: formatter.name,
96
+ extensions: formatter.extensions,
97
+ enabled,
98
+ })
99
+ }
100
+ return result
101
+ }
102
+
103
+ export function init() {
104
+ log.info("init")
105
+ Bus.subscribe(File.Event.Edited, async (payload) => {
106
+ const file = payload.properties.file
107
+ log.info("formatting", { file })
108
+ const ext = path.extname(file)
109
+
110
+ for (const item of await getFormatter(ext)) {
111
+ log.info("running", { command: item.command })
112
+ try {
113
+ const proc = Bun.spawn({
114
+ cmd: item.command.map((x) => x.replace("$FILE", file)),
115
+ cwd: Instance.directory,
116
+ env: { ...process.env, ...item.environment },
117
+ stdout: "ignore",
118
+ stderr: "ignore",
119
+ })
120
+ const exit = await proc.exited
121
+ if (exit !== 0)
122
+ log.error("failed", {
123
+ command: item.command,
124
+ ...item.environment,
125
+ })
126
+ } catch (error) {
127
+ log.error("failed to format file", {
128
+ error,
129
+ command: item.command,
130
+ ...item.environment,
131
+ file,
132
+ })
133
+ }
134
+ }
135
+ })
136
+ }
137
+ }
@@ -0,0 +1,57 @@
1
+ import fs from "fs/promises"
2
+ import { xdgData, xdgCache, xdgConfig, xdgState } from "xdg-basedir"
3
+ import path from "path"
4
+ import os from "os"
5
+
6
+ const app = "nikcli"
7
+
8
+ const data = path.join(xdgData!, app)
9
+ const cache = path.join(xdgCache!, app)
10
+ const config = path.join(xdgConfig!, app)
11
+ const state = path.join(xdgState!, app)
12
+
13
+ export namespace Global {
14
+ export const Path = {
15
+ get home() {
16
+ return process.env.NIKCLI_TEST_HOME || os.homedir()
17
+ },
18
+ data,
19
+ bin: path.join(data, "bin"),
20
+ log: path.join(data, "log"),
21
+ cache,
22
+ config,
23
+ state,
24
+ get modelsDevUrl() {
25
+ return process.env.NIKCLI_MODELS_URL || "https://models.dev"
26
+ },
27
+ }
28
+ }
29
+
30
+ await Promise.all([
31
+ fs.mkdir(Global.Path.data, { recursive: true }),
32
+ fs.mkdir(Global.Path.config, { recursive: true }),
33
+ fs.mkdir(Global.Path.state, { recursive: true }),
34
+ fs.mkdir(Global.Path.log, { recursive: true }),
35
+ fs.mkdir(Global.Path.bin, { recursive: true }),
36
+ ])
37
+
38
+ const CACHE_VERSION = "18"
39
+
40
+ const version = await Bun.file(path.join(Global.Path.cache, "version"))
41
+ .text()
42
+ .catch(() => "0")
43
+
44
+ if (version !== CACHE_VERSION) {
45
+ try {
46
+ const contents = await fs.readdir(Global.Path.cache)
47
+ await Promise.all(
48
+ contents.map((item) =>
49
+ fs.rm(path.join(Global.Path.cache, item), {
50
+ recursive: true,
51
+ force: true,
52
+ }),
53
+ ),
54
+ )
55
+ } catch (e) {}
56
+ await Bun.file(path.join(Global.Path.cache, "version")).write(CACHE_VERSION)
57
+ }