@kolisachint/hoocode-agent 0.1.0

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 (729) hide show
  1. package/CHANGELOG.md +4175 -0
  2. package/README.md +306 -0
  3. package/bin/hoocode.js +15 -0
  4. package/dist/bun/cli.d.ts +3 -0
  5. package/dist/bun/cli.d.ts.map +1 -0
  6. package/dist/bun/cli.js +9 -0
  7. package/dist/bun/cli.js.map +1 -0
  8. package/dist/bun/register-bedrock.d.ts +2 -0
  9. package/dist/bun/register-bedrock.d.ts.map +1 -0
  10. package/dist/bun/register-bedrock.js +4 -0
  11. package/dist/bun/register-bedrock.js.map +1 -0
  12. package/dist/bun/restore-sandbox-env.d.ts +13 -0
  13. package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
  14. package/dist/bun/restore-sandbox-env.js +32 -0
  15. package/dist/bun/restore-sandbox-env.js.map +1 -0
  16. package/dist/cli/args.d.ts +53 -0
  17. package/dist/cli/args.d.ts.map +1 -0
  18. package/dist/cli/args.js +341 -0
  19. package/dist/cli/args.js.map +1 -0
  20. package/dist/cli/config-selector.d.ts +14 -0
  21. package/dist/cli/config-selector.d.ts.map +1 -0
  22. package/dist/cli/config-selector.js +31 -0
  23. package/dist/cli/config-selector.js.map +1 -0
  24. package/dist/cli/file-processor.d.ts +15 -0
  25. package/dist/cli/file-processor.d.ts.map +1 -0
  26. package/dist/cli/file-processor.js +83 -0
  27. package/dist/cli/file-processor.js.map +1 -0
  28. package/dist/cli/initial-message.d.ts +18 -0
  29. package/dist/cli/initial-message.d.ts.map +1 -0
  30. package/dist/cli/initial-message.js +22 -0
  31. package/dist/cli/initial-message.js.map +1 -0
  32. package/dist/cli/list-models.d.ts +9 -0
  33. package/dist/cli/list-models.d.ts.map +1 -0
  34. package/dist/cli/list-models.js +98 -0
  35. package/dist/cli/list-models.js.map +1 -0
  36. package/dist/cli/session-picker.d.ts +9 -0
  37. package/dist/cli/session-picker.d.ts.map +1 -0
  38. package/dist/cli/session-picker.js +35 -0
  39. package/dist/cli/session-picker.js.map +1 -0
  40. package/dist/cli.d.ts +3 -0
  41. package/dist/cli.d.ts.map +1 -0
  42. package/dist/cli.js +21 -0
  43. package/dist/cli.js.map +1 -0
  44. package/dist/config.d.ts +92 -0
  45. package/dist/config.d.ts.map +1 -0
  46. package/dist/config.js +400 -0
  47. package/dist/config.js.map +1 -0
  48. package/dist/core/agent-session-runtime.d.ts +117 -0
  49. package/dist/core/agent-session-runtime.d.ts.map +1 -0
  50. package/dist/core/agent-session-runtime.js +300 -0
  51. package/dist/core/agent-session-runtime.js.map +1 -0
  52. package/dist/core/agent-session-services.d.ts +86 -0
  53. package/dist/core/agent-session-services.d.ts.map +1 -0
  54. package/dist/core/agent-session-services.js +117 -0
  55. package/dist/core/agent-session-services.js.map +1 -0
  56. package/dist/core/agent-session.d.ts +595 -0
  57. package/dist/core/agent-session.d.ts.map +1 -0
  58. package/dist/core/agent-session.js +2521 -0
  59. package/dist/core/agent-session.js.map +1 -0
  60. package/dist/core/auth-guidance.d.ts +5 -0
  61. package/dist/core/auth-guidance.d.ts.map +1 -0
  62. package/dist/core/auth-guidance.js +21 -0
  63. package/dist/core/auth-guidance.js.map +1 -0
  64. package/dist/core/auth-storage.d.ts +141 -0
  65. package/dist/core/auth-storage.d.ts.map +1 -0
  66. package/dist/core/auth-storage.js +441 -0
  67. package/dist/core/auth-storage.js.map +1 -0
  68. package/dist/core/bash-executor.d.ts +32 -0
  69. package/dist/core/bash-executor.d.ts.map +1 -0
  70. package/dist/core/bash-executor.js +111 -0
  71. package/dist/core/bash-executor.js.map +1 -0
  72. package/dist/core/compaction/branch-summarization.d.ts +88 -0
  73. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  74. package/dist/core/compaction/branch-summarization.js +243 -0
  75. package/dist/core/compaction/branch-summarization.js.map +1 -0
  76. package/dist/core/compaction/compaction.d.ts +121 -0
  77. package/dist/core/compaction/compaction.d.ts.map +1 -0
  78. package/dist/core/compaction/compaction.js +615 -0
  79. package/dist/core/compaction/compaction.js.map +1 -0
  80. package/dist/core/compaction/index.d.ts +7 -0
  81. package/dist/core/compaction/index.d.ts.map +1 -0
  82. package/dist/core/compaction/index.js +7 -0
  83. package/dist/core/compaction/index.js.map +1 -0
  84. package/dist/core/compaction/utils.d.ts +38 -0
  85. package/dist/core/compaction/utils.d.ts.map +1 -0
  86. package/dist/core/compaction/utils.js +153 -0
  87. package/dist/core/compaction/utils.js.map +1 -0
  88. package/dist/core/defaults.d.ts +3 -0
  89. package/dist/core/defaults.d.ts.map +1 -0
  90. package/dist/core/defaults.js +2 -0
  91. package/dist/core/defaults.js.map +1 -0
  92. package/dist/core/diagnostics.d.ts +15 -0
  93. package/dist/core/diagnostics.d.ts.map +1 -0
  94. package/dist/core/diagnostics.js +2 -0
  95. package/dist/core/diagnostics.js.map +1 -0
  96. package/dist/core/event-bus.d.ts +9 -0
  97. package/dist/core/event-bus.d.ts.map +1 -0
  98. package/dist/core/event-bus.js +25 -0
  99. package/dist/core/event-bus.js.map +1 -0
  100. package/dist/core/exec.d.ts +29 -0
  101. package/dist/core/exec.d.ts.map +1 -0
  102. package/dist/core/exec.js +75 -0
  103. package/dist/core/exec.js.map +1 -0
  104. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  105. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  106. package/dist/core/export-html/ansi-to-html.js +249 -0
  107. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  108. package/dist/core/export-html/index.d.ts +37 -0
  109. package/dist/core/export-html/index.d.ts.map +1 -0
  110. package/dist/core/export-html/index.js +224 -0
  111. package/dist/core/export-html/index.js.map +1 -0
  112. package/dist/core/export-html/template.css +1066 -0
  113. package/dist/core/export-html/template.html +55 -0
  114. package/dist/core/export-html/template.js +1834 -0
  115. package/dist/core/export-html/tool-renderer.d.ts +34 -0
  116. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  117. package/dist/core/export-html/tool-renderer.js +108 -0
  118. package/dist/core/export-html/tool-renderer.js.map +1 -0
  119. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  120. package/dist/core/export-html/vendor/marked.min.js +6 -0
  121. package/dist/core/extensions/index.d.ts +12 -0
  122. package/dist/core/extensions/index.d.ts.map +1 -0
  123. package/dist/core/extensions/index.js +9 -0
  124. package/dist/core/extensions/index.js.map +1 -0
  125. package/dist/core/extensions/loader.d.ts +24 -0
  126. package/dist/core/extensions/loader.d.ts.map +1 -0
  127. package/dist/core/extensions/loader.js +491 -0
  128. package/dist/core/extensions/loader.js.map +1 -0
  129. package/dist/core/extensions/runner.d.ts +159 -0
  130. package/dist/core/extensions/runner.d.ts.map +1 -0
  131. package/dist/core/extensions/runner.js +824 -0
  132. package/dist/core/extensions/runner.js.map +1 -0
  133. package/dist/core/extensions/types.d.ts +1173 -0
  134. package/dist/core/extensions/types.d.ts.map +1 -0
  135. package/dist/core/extensions/types.js +45 -0
  136. package/dist/core/extensions/types.js.map +1 -0
  137. package/dist/core/extensions/wrapper.d.ts +20 -0
  138. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  139. package/dist/core/extensions/wrapper.js +22 -0
  140. package/dist/core/extensions/wrapper.js.map +1 -0
  141. package/dist/core/footer-data-provider.d.ts +52 -0
  142. package/dist/core/footer-data-provider.d.ts.map +1 -0
  143. package/dist/core/footer-data-provider.js +310 -0
  144. package/dist/core/footer-data-provider.js.map +1 -0
  145. package/dist/core/index.d.ts +12 -0
  146. package/dist/core/index.d.ts.map +1 -0
  147. package/dist/core/index.js +12 -0
  148. package/dist/core/index.js.map +1 -0
  149. package/dist/core/keybindings.d.ts +353 -0
  150. package/dist/core/keybindings.d.ts.map +1 -0
  151. package/dist/core/keybindings.js +295 -0
  152. package/dist/core/keybindings.js.map +1 -0
  153. package/dist/core/messages.d.ts +77 -0
  154. package/dist/core/messages.d.ts.map +1 -0
  155. package/dist/core/messages.js +123 -0
  156. package/dist/core/messages.js.map +1 -0
  157. package/dist/core/model-registry.d.ts +150 -0
  158. package/dist/core/model-registry.d.ts.map +1 -0
  159. package/dist/core/model-registry.js +728 -0
  160. package/dist/core/model-registry.js.map +1 -0
  161. package/dist/core/model-resolver.d.ts +110 -0
  162. package/dist/core/model-resolver.d.ts.map +1 -0
  163. package/dist/core/model-resolver.js +495 -0
  164. package/dist/core/model-resolver.js.map +1 -0
  165. package/dist/core/output-guard.d.ts +6 -0
  166. package/dist/core/output-guard.d.ts.map +1 -0
  167. package/dist/core/output-guard.js +59 -0
  168. package/dist/core/output-guard.js.map +1 -0
  169. package/dist/core/package-manager.d.ts +198 -0
  170. package/dist/core/package-manager.d.ts.map +1 -0
  171. package/dist/core/package-manager.js +1975 -0
  172. package/dist/core/package-manager.js.map +1 -0
  173. package/dist/core/prompt-templates.d.ts +52 -0
  174. package/dist/core/prompt-templates.d.ts.map +1 -0
  175. package/dist/core/prompt-templates.js +250 -0
  176. package/dist/core/prompt-templates.js.map +1 -0
  177. package/dist/core/provider-display-names.d.ts +2 -0
  178. package/dist/core/provider-display-names.d.ts.map +1 -0
  179. package/dist/core/provider-display-names.js +33 -0
  180. package/dist/core/provider-display-names.js.map +1 -0
  181. package/dist/core/resolve-config-value.d.ts +23 -0
  182. package/dist/core/resolve-config-value.d.ts.map +1 -0
  183. package/dist/core/resolve-config-value.js +126 -0
  184. package/dist/core/resolve-config-value.js.map +1 -0
  185. package/dist/core/resource-loader.d.ts +194 -0
  186. package/dist/core/resource-loader.d.ts.map +1 -0
  187. package/dist/core/resource-loader.js +727 -0
  188. package/dist/core/resource-loader.js.map +1 -0
  189. package/dist/core/sdk.d.ts +107 -0
  190. package/dist/core/sdk.d.ts.map +1 -0
  191. package/dist/core/sdk.js +282 -0
  192. package/dist/core/sdk.js.map +1 -0
  193. package/dist/core/session-cwd.d.ts +19 -0
  194. package/dist/core/session-cwd.d.ts.map +1 -0
  195. package/dist/core/session-cwd.js +38 -0
  196. package/dist/core/session-cwd.js.map +1 -0
  197. package/dist/core/session-manager.d.ts +333 -0
  198. package/dist/core/session-manager.d.ts.map +1 -0
  199. package/dist/core/session-manager.js +1109 -0
  200. package/dist/core/session-manager.js.map +1 -0
  201. package/dist/core/settings-manager.d.ts +261 -0
  202. package/dist/core/settings-manager.d.ts.map +1 -0
  203. package/dist/core/settings-manager.js +783 -0
  204. package/dist/core/settings-manager.js.map +1 -0
  205. package/dist/core/skills.d.ts +60 -0
  206. package/dist/core/skills.d.ts.map +1 -0
  207. package/dist/core/skills.js +404 -0
  208. package/dist/core/skills.js.map +1 -0
  209. package/dist/core/slash-commands.d.ts +14 -0
  210. package/dist/core/slash-commands.d.ts.map +1 -0
  211. package/dist/core/slash-commands.js +25 -0
  212. package/dist/core/slash-commands.js.map +1 -0
  213. package/dist/core/source-info.d.ts +18 -0
  214. package/dist/core/source-info.d.ts.map +1 -0
  215. package/dist/core/source-info.js +19 -0
  216. package/dist/core/source-info.js.map +1 -0
  217. package/dist/core/system-prompt.d.ts +28 -0
  218. package/dist/core/system-prompt.d.ts.map +1 -0
  219. package/dist/core/system-prompt.js +120 -0
  220. package/dist/core/system-prompt.js.map +1 -0
  221. package/dist/core/telemetry.d.ts +3 -0
  222. package/dist/core/telemetry.d.ts.map +1 -0
  223. package/dist/core/telemetry.js +9 -0
  224. package/dist/core/telemetry.js.map +1 -0
  225. package/dist/core/timings.d.ts +8 -0
  226. package/dist/core/timings.d.ts.map +1 -0
  227. package/dist/core/timings.js +31 -0
  228. package/dist/core/timings.js.map +1 -0
  229. package/dist/core/tools/bash.d.ts +68 -0
  230. package/dist/core/tools/bash.d.ts.map +1 -0
  231. package/dist/core/tools/bash.js +335 -0
  232. package/dist/core/tools/bash.js.map +1 -0
  233. package/dist/core/tools/edit-diff.d.ts +85 -0
  234. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  235. package/dist/core/tools/edit-diff.js +338 -0
  236. package/dist/core/tools/edit-diff.js.map +1 -0
  237. package/dist/core/tools/edit.d.ts +49 -0
  238. package/dist/core/tools/edit.d.ts.map +1 -0
  239. package/dist/core/tools/edit.js +324 -0
  240. package/dist/core/tools/edit.js.map +1 -0
  241. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  242. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  243. package/dist/core/tools/file-mutation-queue.js +37 -0
  244. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  245. package/dist/core/tools/find.d.ts +35 -0
  246. package/dist/core/tools/find.d.ts.map +1 -0
  247. package/dist/core/tools/find.js +298 -0
  248. package/dist/core/tools/find.js.map +1 -0
  249. package/dist/core/tools/grep.d.ts +37 -0
  250. package/dist/core/tools/grep.d.ts.map +1 -0
  251. package/dist/core/tools/grep.js +304 -0
  252. package/dist/core/tools/grep.js.map +1 -0
  253. package/dist/core/tools/index.d.ts +40 -0
  254. package/dist/core/tools/index.d.ts.map +1 -0
  255. package/dist/core/tools/index.js +112 -0
  256. package/dist/core/tools/index.js.map +1 -0
  257. package/dist/core/tools/ls.d.ts +37 -0
  258. package/dist/core/tools/ls.d.ts.map +1 -0
  259. package/dist/core/tools/ls.js +169 -0
  260. package/dist/core/tools/ls.js.map +1 -0
  261. package/dist/core/tools/output-accumulator.d.ts +50 -0
  262. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  263. package/dist/core/tools/output-accumulator.js +178 -0
  264. package/dist/core/tools/output-accumulator.js.map +1 -0
  265. package/dist/core/tools/path-utils.d.ts +8 -0
  266. package/dist/core/tools/path-utils.d.ts.map +1 -0
  267. package/dist/core/tools/path-utils.js +81 -0
  268. package/dist/core/tools/path-utils.js.map +1 -0
  269. package/dist/core/tools/read.d.ts +35 -0
  270. package/dist/core/tools/read.d.ts.map +1 -0
  271. package/dist/core/tools/read.js +289 -0
  272. package/dist/core/tools/read.js.map +1 -0
  273. package/dist/core/tools/render-utils.d.ts +21 -0
  274. package/dist/core/tools/render-utils.d.ts.map +1 -0
  275. package/dist/core/tools/render-utils.js +49 -0
  276. package/dist/core/tools/render-utils.js.map +1 -0
  277. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  278. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  279. package/dist/core/tools/tool-definition-wrapper.js +34 -0
  280. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  281. package/dist/core/tools/truncate.d.ts +70 -0
  282. package/dist/core/tools/truncate.d.ts.map +1 -0
  283. package/dist/core/tools/truncate.js +205 -0
  284. package/dist/core/tools/truncate.js.map +1 -0
  285. package/dist/core/tools/write.d.ts +26 -0
  286. package/dist/core/tools/write.d.ts.map +1 -0
  287. package/dist/core/tools/write.js +213 -0
  288. package/dist/core/tools/write.js.map +1 -0
  289. package/dist/extensions/core/hoo-core.d.ts +103 -0
  290. package/dist/extensions/core/hoo-core.d.ts.map +1 -0
  291. package/dist/extensions/core/hoo-core.js +606 -0
  292. package/dist/extensions/core/hoo-core.js.map +1 -0
  293. package/dist/index.d.ts +28 -0
  294. package/dist/index.d.ts.map +1 -0
  295. package/dist/index.js +41 -0
  296. package/dist/index.js.map +1 -0
  297. package/dist/init.d.ts +2 -0
  298. package/dist/init.d.ts.map +1 -0
  299. package/dist/init.js +78 -0
  300. package/dist/init.js.map +1 -0
  301. package/dist/main.d.ts +12 -0
  302. package/dist/main.d.ts.map +1 -0
  303. package/dist/main.js +583 -0
  304. package/dist/main.js.map +1 -0
  305. package/dist/migrations.d.ts +33 -0
  306. package/dist/migrations.d.ts.map +1 -0
  307. package/dist/migrations.js +281 -0
  308. package/dist/migrations.js.map +1 -0
  309. package/dist/modes/index.d.ts +9 -0
  310. package/dist/modes/index.d.ts.map +1 -0
  311. package/dist/modes/index.js +8 -0
  312. package/dist/modes/index.js.map +1 -0
  313. package/dist/modes/interactive/assets/clankolas.png +0 -0
  314. package/dist/modes/interactive/components/armin.d.ts +34 -0
  315. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  316. package/dist/modes/interactive/components/armin.js +333 -0
  317. package/dist/modes/interactive/components/armin.js.map +1 -0
  318. package/dist/modes/interactive/components/assistant-message.d.ts +20 -0
  319. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  320. package/dist/modes/interactive/components/assistant-message.js +121 -0
  321. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  322. package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  323. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  324. package/dist/modes/interactive/components/bash-execution.js +175 -0
  325. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  326. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  327. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  328. package/dist/modes/interactive/components/bordered-loader.js +54 -0
  329. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  330. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  331. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  332. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  333. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  334. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  335. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  336. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  337. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  338. package/dist/modes/interactive/components/config-selector.d.ts +71 -0
  339. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  340. package/dist/modes/interactive/components/config-selector.js +503 -0
  341. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  342. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  343. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  344. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  345. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  346. package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  347. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  348. package/dist/modes/interactive/components/custom-editor.js +70 -0
  349. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  350. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  351. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  352. package/dist/modes/interactive/components/custom-message.js +79 -0
  353. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  354. package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  355. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  356. package/dist/modes/interactive/components/daxnuts.js +140 -0
  357. package/dist/modes/interactive/components/daxnuts.js.map +1 -0
  358. package/dist/modes/interactive/components/diff.d.ts +12 -0
  359. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  360. package/dist/modes/interactive/components/diff.js +133 -0
  361. package/dist/modes/interactive/components/diff.js.map +1 -0
  362. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  363. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  364. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  365. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  366. package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  367. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
  368. package/dist/modes/interactive/components/earendil-announcement.js +40 -0
  369. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
  370. package/dist/modes/interactive/components/extension-editor.d.ts +20 -0
  371. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  372. package/dist/modes/interactive/components/extension-editor.js +111 -0
  373. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  374. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  375. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  376. package/dist/modes/interactive/components/extension-input.js +61 -0
  377. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  378. package/dist/modes/interactive/components/extension-selector.d.ts +24 -0
  379. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  380. package/dist/modes/interactive/components/extension-selector.js +78 -0
  381. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  382. package/dist/modes/interactive/components/footer.d.ts +27 -0
  383. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  384. package/dist/modes/interactive/components/footer.js +201 -0
  385. package/dist/modes/interactive/components/footer.js.map +1 -0
  386. package/dist/modes/interactive/components/index.d.ts +32 -0
  387. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  388. package/dist/modes/interactive/components/index.js +33 -0
  389. package/dist/modes/interactive/components/index.js.map +1 -0
  390. package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  391. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  392. package/dist/modes/interactive/components/keybinding-hints.js +36 -0
  393. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  394. package/dist/modes/interactive/components/login-dialog.d.ts +46 -0
  395. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  396. package/dist/modes/interactive/components/login-dialog.js +160 -0
  397. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  398. package/dist/modes/interactive/components/model-selector.d.ts +47 -0
  399. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  400. package/dist/modes/interactive/components/model-selector.js +278 -0
  401. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  402. package/dist/modes/interactive/components/oauth-selector.d.ts +31 -0
  403. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  404. package/dist/modes/interactive/components/oauth-selector.js +165 -0
  405. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  406. package/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
  407. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  408. package/dist/modes/interactive/components/scoped-models-selector.js +290 -0
  409. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  410. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  411. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  412. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  413. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  414. package/dist/modes/interactive/components/session-selector.d.ts +96 -0
  415. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  416. package/dist/modes/interactive/components/session-selector.js +861 -0
  417. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  418. package/dist/modes/interactive/components/settings-selector.d.ts +67 -0
  419. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  420. package/dist/modes/interactive/components/settings-selector.js +375 -0
  421. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  422. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  423. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  424. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  425. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  426. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  427. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  428. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  429. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  430. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  431. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  432. package/dist/modes/interactive/components/theme-selector.js +50 -0
  433. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  434. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  435. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  436. package/dist/modes/interactive/components/thinking-selector.js +51 -0
  437. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  438. package/dist/modes/interactive/components/tool-execution.d.ts +63 -0
  439. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  440. package/dist/modes/interactive/components/tool-execution.js +295 -0
  441. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  442. package/dist/modes/interactive/components/tree-selector.d.ts +89 -0
  443. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  444. package/dist/modes/interactive/components/tree-selector.js +1093 -0
  445. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  446. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  447. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  448. package/dist/modes/interactive/components/user-message-selector.js +114 -0
  449. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  450. package/dist/modes/interactive/components/user-message.d.ts +10 -0
  451. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  452. package/dist/modes/interactive/components/user-message.js +29 -0
  453. package/dist/modes/interactive/components/user-message.js.map +1 -0
  454. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  455. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  456. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  457. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  458. package/dist/modes/interactive/interactive-mode.d.ts +357 -0
  459. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  460. package/dist/modes/interactive/interactive-mode.js +4558 -0
  461. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  462. package/dist/modes/interactive/theme/dark.json +85 -0
  463. package/dist/modes/interactive/theme/light.json +84 -0
  464. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  465. package/dist/modes/interactive/theme/theme.d.ts +81 -0
  466. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  467. package/dist/modes/interactive/theme/theme.js +971 -0
  468. package/dist/modes/interactive/theme/theme.js.map +1 -0
  469. package/dist/modes/print-mode.d.ts +28 -0
  470. package/dist/modes/print-mode.d.ts.map +1 -0
  471. package/dist/modes/print-mode.js +131 -0
  472. package/dist/modes/print-mode.js.map +1 -0
  473. package/dist/modes/rpc/jsonl.d.ts +17 -0
  474. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  475. package/dist/modes/rpc/jsonl.js +49 -0
  476. package/dist/modes/rpc/jsonl.js.map +1 -0
  477. package/dist/modes/rpc/rpc-client.d.ts +224 -0
  478. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  479. package/dist/modes/rpc/rpc-client.js +410 -0
  480. package/dist/modes/rpc/rpc-client.js.map +1 -0
  481. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  482. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  483. package/dist/modes/rpc/rpc-mode.js +601 -0
  484. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  485. package/dist/modes/rpc/rpc-types.d.ts +419 -0
  486. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  487. package/dist/modes/rpc/rpc-types.js +8 -0
  488. package/dist/modes/rpc/rpc-types.js.map +1 -0
  489. package/dist/package-manager-cli.d.ts +4 -0
  490. package/dist/package-manager-cli.d.ts.map +1 -0
  491. package/dist/package-manager-cli.js +460 -0
  492. package/dist/package-manager-cli.js.map +1 -0
  493. package/dist/utils/changelog.d.ts +21 -0
  494. package/dist/utils/changelog.d.ts.map +1 -0
  495. package/dist/utils/changelog.js +87 -0
  496. package/dist/utils/changelog.js.map +1 -0
  497. package/dist/utils/child-process.d.ts +12 -0
  498. package/dist/utils/child-process.d.ts.map +1 -0
  499. package/dist/utils/child-process.js +86 -0
  500. package/dist/utils/child-process.js.map +1 -0
  501. package/dist/utils/clipboard-image.d.ts +11 -0
  502. package/dist/utils/clipboard-image.d.ts.map +1 -0
  503. package/dist/utils/clipboard-image.js +245 -0
  504. package/dist/utils/clipboard-image.js.map +1 -0
  505. package/dist/utils/clipboard-native.d.ts +8 -0
  506. package/dist/utils/clipboard-native.d.ts.map +1 -0
  507. package/dist/utils/clipboard-native.js +14 -0
  508. package/dist/utils/clipboard-native.js.map +1 -0
  509. package/dist/utils/clipboard.d.ts +2 -0
  510. package/dist/utils/clipboard.d.ts.map +1 -0
  511. package/dist/utils/clipboard.js +117 -0
  512. package/dist/utils/clipboard.js.map +1 -0
  513. package/dist/utils/exif-orientation.d.ts +5 -0
  514. package/dist/utils/exif-orientation.d.ts.map +1 -0
  515. package/dist/utils/exif-orientation.js +158 -0
  516. package/dist/utils/exif-orientation.js.map +1 -0
  517. package/dist/utils/frontmatter.d.ts +8 -0
  518. package/dist/utils/frontmatter.d.ts.map +1 -0
  519. package/dist/utils/frontmatter.js +26 -0
  520. package/dist/utils/frontmatter.js.map +1 -0
  521. package/dist/utils/fs-watch.d.ts +5 -0
  522. package/dist/utils/fs-watch.d.ts.map +1 -0
  523. package/dist/utils/fs-watch.js +25 -0
  524. package/dist/utils/fs-watch.js.map +1 -0
  525. package/dist/utils/git.d.ts +26 -0
  526. package/dist/utils/git.d.ts.map +1 -0
  527. package/dist/utils/git.js +163 -0
  528. package/dist/utils/git.js.map +1 -0
  529. package/dist/utils/hoocode-user-agent.d.ts +2 -0
  530. package/dist/utils/hoocode-user-agent.d.ts.map +1 -0
  531. package/dist/utils/hoocode-user-agent.js +5 -0
  532. package/dist/utils/hoocode-user-agent.js.map +1 -0
  533. package/dist/utils/image-convert.d.ts +9 -0
  534. package/dist/utils/image-convert.d.ts.map +1 -0
  535. package/dist/utils/image-convert.js +39 -0
  536. package/dist/utils/image-convert.js.map +1 -0
  537. package/dist/utils/image-resize.d.ts +36 -0
  538. package/dist/utils/image-resize.d.ts.map +1 -0
  539. package/dist/utils/image-resize.js +137 -0
  540. package/dist/utils/image-resize.js.map +1 -0
  541. package/dist/utils/mime.d.ts +2 -0
  542. package/dist/utils/mime.d.ts.map +1 -0
  543. package/dist/utils/mime.js +26 -0
  544. package/dist/utils/mime.js.map +1 -0
  545. package/dist/utils/paths.d.ts +16 -0
  546. package/dist/utils/paths.d.ts.map +1 -0
  547. package/dist/utils/paths.js +50 -0
  548. package/dist/utils/paths.js.map +1 -0
  549. package/dist/utils/photon.d.ts +21 -0
  550. package/dist/utils/photon.d.ts.map +1 -0
  551. package/dist/utils/photon.js +121 -0
  552. package/dist/utils/photon.js.map +1 -0
  553. package/dist/utils/shell.d.ts +30 -0
  554. package/dist/utils/shell.d.ts.map +1 -0
  555. package/dist/utils/shell.js +190 -0
  556. package/dist/utils/shell.js.map +1 -0
  557. package/dist/utils/sleep.d.ts +5 -0
  558. package/dist/utils/sleep.d.ts.map +1 -0
  559. package/dist/utils/sleep.js +17 -0
  560. package/dist/utils/sleep.js.map +1 -0
  561. package/dist/utils/tools-manager.d.ts +3 -0
  562. package/dist/utils/tools-manager.d.ts.map +1 -0
  563. package/dist/utils/tools-manager.js +256 -0
  564. package/dist/utils/tools-manager.js.map +1 -0
  565. package/dist/utils/version-check.d.ts +14 -0
  566. package/dist/utils/version-check.d.ts.map +1 -0
  567. package/dist/utils/version-check.js +84 -0
  568. package/dist/utils/version-check.js.map +1 -0
  569. package/docs/compaction.md +394 -0
  570. package/docs/custom-provider.md +646 -0
  571. package/docs/development.md +71 -0
  572. package/docs/docs.json +148 -0
  573. package/docs/extensions.md +2596 -0
  574. package/docs/images/doom-extension.png +0 -0
  575. package/docs/images/exy.png +0 -0
  576. package/docs/images/interactive-mode.png +0 -0
  577. package/docs/images/tree-view.png +0 -0
  578. package/docs/index.md +70 -0
  579. package/docs/json.md +82 -0
  580. package/docs/keybindings.md +197 -0
  581. package/docs/models.md +474 -0
  582. package/docs/packages.md +223 -0
  583. package/docs/prompt-templates.md +88 -0
  584. package/docs/providers.md +243 -0
  585. package/docs/quickstart.md +142 -0
  586. package/docs/rpc.md +1407 -0
  587. package/docs/sdk.md +1149 -0
  588. package/docs/session-format.md +412 -0
  589. package/docs/sessions.md +137 -0
  590. package/docs/settings.md +279 -0
  591. package/docs/shell-aliases.md +13 -0
  592. package/docs/skills.md +232 -0
  593. package/docs/terminal-setup.md +106 -0
  594. package/docs/termux.md +127 -0
  595. package/docs/themes.md +295 -0
  596. package/docs/tmux.md +61 -0
  597. package/docs/tui.md +918 -0
  598. package/docs/usage.md +277 -0
  599. package/docs/windows.md +17 -0
  600. package/examples/README.md +25 -0
  601. package/examples/extensions/README.md +208 -0
  602. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  603. package/examples/extensions/bash-spawn-hook.ts +30 -0
  604. package/examples/extensions/bookmark.ts +50 -0
  605. package/examples/extensions/border-status-editor.ts +150 -0
  606. package/examples/extensions/built-in-tool-renderer.ts +249 -0
  607. package/examples/extensions/claude-rules.ts +86 -0
  608. package/examples/extensions/commands.ts +72 -0
  609. package/examples/extensions/confirm-destructive.ts +59 -0
  610. package/examples/extensions/custom-compaction.ts +127 -0
  611. package/examples/extensions/custom-footer.ts +64 -0
  612. package/examples/extensions/custom-header.ts +73 -0
  613. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  614. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  615. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  616. package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
  617. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  618. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  619. package/examples/extensions/dirty-repo-guard.ts +56 -0
  620. package/examples/extensions/doom-overlay/README.md +46 -0
  621. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  622. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  623. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  624. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  625. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  626. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  627. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  628. package/examples/extensions/doom-overlay/index.ts +74 -0
  629. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  630. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  631. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  632. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  633. package/examples/extensions/dynamic-resources/index.ts +15 -0
  634. package/examples/extensions/dynamic-tools.ts +74 -0
  635. package/examples/extensions/event-bus.ts +43 -0
  636. package/examples/extensions/file-trigger.ts +41 -0
  637. package/examples/extensions/git-checkpoint.ts +53 -0
  638. package/examples/extensions/github-issue-autocomplete.ts +185 -0
  639. package/examples/extensions/handoff.ts +191 -0
  640. package/examples/extensions/hello.ts +26 -0
  641. package/examples/extensions/hidden-thinking-label.ts +53 -0
  642. package/examples/extensions/inline-bash.ts +94 -0
  643. package/examples/extensions/input-transform.ts +43 -0
  644. package/examples/extensions/interactive-shell.ts +196 -0
  645. package/examples/extensions/mac-system-theme.ts +47 -0
  646. package/examples/extensions/message-renderer.ts +59 -0
  647. package/examples/extensions/minimal-mode.ts +426 -0
  648. package/examples/extensions/modal-editor.ts +85 -0
  649. package/examples/extensions/model-status.ts +31 -0
  650. package/examples/extensions/notify.ts +55 -0
  651. package/examples/extensions/overlay-qa-tests.ts +1348 -0
  652. package/examples/extensions/overlay-test.ts +150 -0
  653. package/examples/extensions/permission-gate.ts +34 -0
  654. package/examples/extensions/pirate.ts +47 -0
  655. package/examples/extensions/plan-mode/README.md +65 -0
  656. package/examples/extensions/plan-mode/index.ts +340 -0
  657. package/examples/extensions/plan-mode/utils.ts +168 -0
  658. package/examples/extensions/preset.ts +436 -0
  659. package/examples/extensions/prompt-customizer.ts +97 -0
  660. package/examples/extensions/protected-paths.ts +30 -0
  661. package/examples/extensions/provider-payload.ts +18 -0
  662. package/examples/extensions/qna.ts +122 -0
  663. package/examples/extensions/question.ts +264 -0
  664. package/examples/extensions/questionnaire.ts +427 -0
  665. package/examples/extensions/rainbow-editor.ts +88 -0
  666. package/examples/extensions/reload-runtime.ts +37 -0
  667. package/examples/extensions/rpc-demo.ts +118 -0
  668. package/examples/extensions/sandbox/index.ts +321 -0
  669. package/examples/extensions/sandbox/package-lock.json +92 -0
  670. package/examples/extensions/sandbox/package.json +19 -0
  671. package/examples/extensions/send-user-message.ts +97 -0
  672. package/examples/extensions/session-name.ts +27 -0
  673. package/examples/extensions/shutdown-command.ts +63 -0
  674. package/examples/extensions/snake.ts +343 -0
  675. package/examples/extensions/space-invaders.ts +560 -0
  676. package/examples/extensions/ssh.ts +220 -0
  677. package/examples/extensions/status-line.ts +32 -0
  678. package/examples/extensions/structured-output.ts +65 -0
  679. package/examples/extensions/subagent/README.md +172 -0
  680. package/examples/extensions/subagent/agents/planner.md +37 -0
  681. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  682. package/examples/extensions/subagent/agents/scout.md +50 -0
  683. package/examples/extensions/subagent/agents/worker.md +24 -0
  684. package/examples/extensions/subagent/agents.ts +126 -0
  685. package/examples/extensions/subagent/index.ts +987 -0
  686. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  687. package/examples/extensions/subagent/prompts/implement.md +10 -0
  688. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  689. package/examples/extensions/summarize.ts +206 -0
  690. package/examples/extensions/system-prompt-header.ts +17 -0
  691. package/examples/extensions/tic-tac-toe.ts +1008 -0
  692. package/examples/extensions/timed-confirm.ts +70 -0
  693. package/examples/extensions/titlebar-spinner.ts +58 -0
  694. package/examples/extensions/todo.ts +297 -0
  695. package/examples/extensions/tool-override.ts +144 -0
  696. package/examples/extensions/tools.ts +141 -0
  697. package/examples/extensions/trigger-compact.ts +50 -0
  698. package/examples/extensions/truncated-tool.ts +195 -0
  699. package/examples/extensions/widget-placement.ts +9 -0
  700. package/examples/extensions/with-deps/index.ts +32 -0
  701. package/examples/extensions/with-deps/package-lock.json +31 -0
  702. package/examples/extensions/with-deps/package.json +22 -0
  703. package/examples/extensions/working-indicator.ts +123 -0
  704. package/examples/extensions/working-message-test.ts +25 -0
  705. package/examples/rpc-extension-ui.ts +640 -0
  706. package/examples/sdk/01-minimal.ts +22 -0
  707. package/examples/sdk/02-custom-model.ts +49 -0
  708. package/examples/sdk/03-custom-prompt.ts +62 -0
  709. package/examples/sdk/04-skills.ts +55 -0
  710. package/examples/sdk/05-tools.ts +44 -0
  711. package/examples/sdk/06-extensions.ts +90 -0
  712. package/examples/sdk/07-context-files.ts +42 -0
  713. package/examples/sdk/08-prompt-templates.ts +51 -0
  714. package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
  715. package/examples/sdk/10-settings.ts +53 -0
  716. package/examples/sdk/11-sessions.ts +48 -0
  717. package/examples/sdk/12-full-control.ts +73 -0
  718. package/examples/sdk/13-session-runtime.ts +67 -0
  719. package/examples/sdk/README.md +147 -0
  720. package/package.json +121 -0
  721. package/templates/default-config.json +33 -0
  722. package/templates/modes/agent/system.md +10 -0
  723. package/templates/modes/ask/system.md +10 -0
  724. package/templates/modes/build/system.md +9 -0
  725. package/templates/modes/debug/system.md +10 -0
  726. package/templates/modes/plan/system.md +15 -0
  727. package/templates/profiles/data/context.md +7 -0
  728. package/templates/profiles/default/context.md +6 -0
  729. package/templates/profiles/devops/context.md +7 -0
package/README.md ADDED
@@ -0,0 +1,306 @@
1
+ # HooCode
2
+
3
+ An AI coding agent for the terminal. Extend it with modes, profiles, MCP servers, and per-project
4
+ instructions — without forking internals.
5
+
6
+ [![npm](https://img.shields.io/npm/v/@kolisachint/hoocode-agent?style=flat-square)](https://www.npmjs.com/package/@kolisachint/hoocode-agent)
7
+
8
+ ---
9
+
10
+ ## Install
11
+
12
+ ```sh
13
+ npm install -g @kolisachint/hoocode-agent
14
+ ```
15
+
16
+ Requires Node.js 20.6 or later.
17
+
18
+ ---
19
+
20
+ ## Quick start
21
+
22
+ ```sh
23
+ # Launch interactive session (defaults to build mode)
24
+ hoocode
25
+
26
+ # Ask a question without editing anything
27
+ hoocode /mode ask
28
+
29
+ # Start planning a feature
30
+ hoocode /mode plan
31
+ ```
32
+
33
+ On first run, `~/.hoocode/` is bootstrapped with a default config, all five mode
34
+ prompts, and the three built-in profile contexts.
35
+
36
+ ---
37
+
38
+ ## Modes
39
+
40
+ Modes control what the agent is allowed to do. Switch with `/mode <name>` or run
41
+ `hoocode /mode` to see the current mode.
42
+
43
+ | Mode | Intent | File writes | Shell |
44
+ |------|--------|-------------|-------|
45
+ | `ask` | Read-only Q&A | No | Read-only |
46
+ | `plan` | Explore and write a plan | `.hoocode/plan.md` only | Read-only |
47
+ | `build` | Implement carefully, one step at a time | Yes | Guarded |
48
+ | `agent` | Multi-step autonomy within guardrails | Yes | Auto-allowed |
49
+ | `debug` | Root-cause analysis, no modifications | No | Read-only |
50
+
51
+ ### Mode details
52
+
53
+ **ask** — Answers questions, traces logic, compares approaches. Refuses edits and state-changing
54
+ commands. Cite files and line numbers.
55
+
56
+ **plan** — Explores the codebase, drafts a complete plan, and writes it to `.hoocode/plan.md`.
57
+ The plan has sections: Goal, Files to modify, New files, Tests, Verification. When done it
58
+ tells you to run `/approve`.
59
+
60
+ **build** — Reads before editing, shows diffs before non-trivial changes, asks for confirmation
61
+ before destructive operations, runs tests after every logical unit.
62
+
63
+ **agent** — Uses auto-allowed tools without per-call prompts. Reports progress every few steps.
64
+ Stops and asks if it hits genuine ambiguity. Outputs a summary on completion.
65
+
66
+ **debug** — Gathers evidence, reproduces the bug, traces the call path, states the root cause
67
+ in one sentence, and describes the fix — but does not apply it. Switch to `/mode build` to apply.
68
+
69
+ ---
70
+
71
+ ## Profiles
72
+
73
+ Profiles inject domain-specific rules into the system prompt. HooCode auto-detects the right
74
+ profile from file markers in your project root, or you can pin one with `/profile <name>`.
75
+
76
+ ### Built-in profiles
77
+
78
+ **default** — General full-stack. Match existing patterns, prefer the smallest change,
79
+ assume Node.js / TypeScript / npm workspaces / vitest.
80
+
81
+ **data** — BigQuery / SQL. Dry-run before mutating statements, no `SELECT *` on large tables,
82
+ inspect schema first, validate join keys and cardinality.
83
+
84
+ **devops** — Infrastructure. Never run `terraform apply` or `kubectl delete` without showing
85
+ the plan first, prefer declarative config, never hardcode secrets, every change needs a
86
+ rollback strategy.
87
+
88
+ ### Auto-detection markers
89
+
90
+ | File present | Profile selected |
91
+ |--------------|-----------------|
92
+ | `dbt_project.yml` | data |
93
+ | `*.sql` | data |
94
+ | `terraform.tf` | devops |
95
+ | `.github/workflows` | devops |
96
+ | `Dockerfile` | devops |
97
+ | `docker-compose.yml` | devops |
98
+ | `k8s/` | devops |
99
+
100
+ ---
101
+
102
+ ## Plan workflow
103
+
104
+ ```sh
105
+ # 1. Switch to plan mode
106
+ hoocode /mode plan
107
+
108
+ # 2. Describe the feature
109
+ > Add a /health endpoint that returns { status: "ok", version } as JSON
110
+
111
+ # Agent explores the codebase and writes .hoocode/plan.md
112
+
113
+ # 3. Review the plan
114
+ cat .hoocode/plan.md
115
+
116
+ # 4. Approve — switches to build mode and executes the plan step by step
117
+ hoocode /approve
118
+ ```
119
+
120
+ The plan file lives at `.hoocode/plan.md` and has these sections:
121
+
122
+ ```
123
+ ## Goal
124
+ ## Files to modify
125
+ ## New files
126
+ ## Tests
127
+ ## Verification
128
+ ```
129
+
130
+ Add `.hoocode/` to your `.gitignore` to keep plans and local overrides out of version control:
131
+
132
+ ```
133
+ .hoocode/
134
+ ```
135
+
136
+ ---
137
+
138
+ ## Config directory
139
+
140
+ ```
141
+ ~/.hoocode/
142
+ ├── config.json # Global defaults (mode, profile, auto-allow lists, LLM providers)
143
+ ├── agent/ # Session state written by the agent
144
+ ├── modes/ # Mode system prompts (one dir per mode)
145
+ │ ├── ask/system.md
146
+ │ ├── plan/system.md
147
+ │ ├── build/system.md
148
+ │ ├── agent/system.md
149
+ │ └── debug/system.md
150
+ ├── profiles/ # Profile context files (one dir per profile)
151
+ │ ├── default/context.md
152
+ │ ├── data/context.md
153
+ │ └── devops/context.md
154
+ ├── mcp-servers/ # MCP server configs (one JSON file per server)
155
+ └── extensions/ # Global extensions
156
+ ```
157
+
158
+ Edit any `.md` file to customise a mode or profile for all your projects.
159
+
160
+ ---
161
+
162
+ ## Project-local overrides
163
+
164
+ Drop a `.hoocode/` directory in your project root.
165
+
166
+ ### `.hoocode/config.json` — per-project config
167
+
168
+ Overrides global defaults for this project only. Scalar fields win; `auto_allow` arrays
169
+ are unioned.
170
+
171
+ ```json
172
+ {
173
+ "active_mode": "build",
174
+ "active_profile": "devops",
175
+ "modes": {
176
+ "build": { "auto_allow": ["bash"] }
177
+ }
178
+ }
179
+ ```
180
+
181
+ ### `.hoocode/agents.md` — per-project instructions
182
+
183
+ Appended to the system prompt after the mode and profile layers. Use it to describe project
184
+ conventions, forbidden patterns, or team rules.
185
+
186
+ ```markdown
187
+ This is a Go monorepo. All new packages go in internal/. Run `make test` not `go test ./...`.
188
+ Never commit directly to main — always open a PR.
189
+ ```
190
+
191
+ ### Merge order (lowest → highest priority)
192
+
193
+ 1. `~/.hoocode/config.json` — global defaults
194
+ 2. `.hoocode/config.json` — project overrides (scalar fields win; `auto_allow` arrays unioned)
195
+ 3. `before_agent_start` — mode + profile + agents.md injected into system prompt
196
+
197
+ ---
198
+
199
+ ## Permission gate
200
+
201
+ Before running `bash`, `edit`, or `write` in interactive sessions, HooCode prompts:
202
+
203
+ ```
204
+ Allow: $ npm test
205
+ Yes (once)
206
+ No (block)
207
+ Always (add to auto-allow for this mode)
208
+ ```
209
+
210
+ Selecting **Always** writes the tool name into `modes.<active_mode>.auto_allow` in
211
+ `~/.hoocode/config.json`. It applies globally. Use `.hoocode/config.json` to set
212
+ project-scoped auto-allow lists instead.
213
+
214
+ ---
215
+
216
+ ## MCP servers
217
+
218
+ Drop a JSON config file in `~/.hoocode/mcp-servers/` (global) or `.hoocode/mcp-servers/`
219
+ (project-local). HooCode connects on session start and registers each server's tools automatically.
220
+
221
+ ```json
222
+ {
223
+ "name": "my-db-tools",
224
+ "command": "npx",
225
+ "args": ["-y", "my-mcp-server"],
226
+ "env": {
227
+ "DATABASE_URL": "postgres://localhost/mydb"
228
+ }
229
+ }
230
+ ```
231
+
232
+ Tool names are registered as `mcp_<server-name>_<tool-name>`.
233
+
234
+ ---
235
+
236
+ ## Custom modes and profiles
237
+
238
+ Add a new mode:
239
+
240
+ ```sh
241
+ mkdir -p ~/.hoocode/modes/review
242
+ cat > ~/.hoocode/modes/review/system.md << 'EOF'
243
+ You are in **review mode** — code review only.
244
+
245
+ Read the diff or files provided. Comment on correctness, style, security, and test coverage.
246
+ Do not apply fixes. Summarise findings at the end.
247
+ EOF
248
+ hoocode /mode review
249
+ ```
250
+
251
+ Add a new profile:
252
+
253
+ ```sh
254
+ mkdir -p ~/.hoocode/profiles/rust
255
+ cat > ~/.hoocode/profiles/rust/context.md << 'EOF'
256
+ **Profile: Rust**
257
+ - Run `cargo clippy` before suggesting fixes.
258
+ - Prefer `Result<T, E>` over `unwrap()`.
259
+ - Check `Cargo.toml` for existing dependencies before adding new ones.
260
+ EOF
261
+ hoocode /profile rust
262
+ ```
263
+
264
+ ---
265
+
266
+ ## Extensions
267
+
268
+ HooCode loads TypeScript extensions at startup. Extensions can register tools, commands,
269
+ and event handlers.
270
+
271
+ ```ts
272
+ // .hoocode/my-extension.ts
273
+ import type { ExtensionAPI } from "@kolisachint/hoocode-agent";
274
+
275
+ export default function (pi: ExtensionAPI) {
276
+ pi.registerTool({
277
+ name: "my_tool",
278
+ description: "Does something useful",
279
+ parameters: Type.Object({ input: Type.String() }),
280
+ async execute(_id, { input }) {
281
+ return { content: [{ type: "text", text: `You said: ${input}` }] };
282
+ },
283
+ });
284
+ }
285
+ ```
286
+
287
+ ---
288
+
289
+ ## Standalone binary (optional)
290
+
291
+ Install `pkg` to build a self-contained binary that does not require Node.js:
292
+
293
+ ```sh
294
+ npm install -g pkg
295
+ cd packages/coding-agent
296
+ npm run build:binary
297
+ ```
298
+
299
+ The binary is written to `dist/hoocode`. The `build:binary` script in `package.json`
300
+ already sets `pkg.targets` for macOS, Linux, and Windows x64.
301
+
302
+ ---
303
+
304
+ ## License
305
+
306
+ MIT
package/bin/hoocode.js ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ import { fileURLToPath } from "url";
3
+ import { dirname, join } from "path";
4
+
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = dirname(__filename);
7
+ const distDir = join(__dirname, "..", "dist");
8
+
9
+ const { initConfig } = await import(join(distDir, "init.js"));
10
+ await initConfig();
11
+
12
+ const { default: hooCore } = await import(join(distDir, "extensions", "core", "hoo-core.js"));
13
+ const { main } = await import(join(distDir, "main.js"));
14
+
15
+ await main(process.argv.slice(2), { extensionFactories: [hooCore] });
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/bun/cli.ts"],"names":[],"mappings":"","sourcesContent":["#!/usr/bin/env node\nimport { APP_NAME } from \"../config.js\";\n\nprocess.title = APP_NAME;\nprocess.emitWarning = (() => {}) as typeof process.emitWarning;\n\nimport { restoreSandboxEnv } from \"./restore-sandbox-env.js\";\n\nrestoreSandboxEnv();\n\nawait import(\"./register-bedrock.js\");\nawait import(\"../cli.js\");\n"]}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import { APP_NAME } from "../config.js";
3
+ process.title = APP_NAME;
4
+ process.emitWarning = (() => { });
5
+ import { restoreSandboxEnv } from "./restore-sandbox-env.js";
6
+ restoreSandboxEnv();
7
+ await import("./register-bedrock.js");
8
+ await import("../cli.js");
9
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bun/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC;AACzB,OAAO,CAAC,WAAW,GAAG,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAA+B,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,iBAAiB,EAAE,CAAC;AAEpB,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;AACtC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\nimport { APP_NAME } from \"../config.js\";\n\nprocess.title = APP_NAME;\nprocess.emitWarning = (() => {}) as typeof process.emitWarning;\n\nimport { restoreSandboxEnv } from \"./restore-sandbox-env.js\";\n\nrestoreSandboxEnv();\n\nawait import(\"./register-bedrock.js\");\nawait import(\"../cli.js\");\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=register-bedrock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-bedrock.d.ts","sourceRoot":"","sources":["../../src/bun/register-bedrock.ts"],"names":[],"mappings":"","sourcesContent":["import { setBedrockProviderModule } from \"@kolisachint/hoocode-ai\";\nimport { bedrockProviderModule } from \"@kolisachint/hoocode-ai/bedrock-provider\";\n\nsetBedrockProviderModule(bedrockProviderModule);\n"]}
@@ -0,0 +1,4 @@
1
+ import { setBedrockProviderModule } from "@kolisachint/hoocode-ai";
2
+ import { bedrockProviderModule } from "@kolisachint/hoocode-ai/bedrock-provider";
3
+ setBedrockProviderModule(bedrockProviderModule);
4
+ //# sourceMappingURL=register-bedrock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-bedrock.js","sourceRoot":"","sources":["../../src/bun/register-bedrock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AAEjF,wBAAwB,CAAC,qBAAqB,CAAC,CAAC","sourcesContent":["import { setBedrockProviderModule } from \"@kolisachint/hoocode-ai\";\nimport { bedrockProviderModule } from \"@kolisachint/hoocode-ai/bedrock-provider\";\n\nsetBedrockProviderModule(bedrockProviderModule);\n"]}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Workaround for https://github.com/oven-sh/bun/issues/27802
3
+ *
4
+ * Bun compiled binaries have an empty `process.env` when running inside
5
+ * sandbox environments (e.g. nono on Linux/macOS). On Linux we can recover
6
+ * the environment from `/proc/self/environ`.
7
+ */
8
+ /**
9
+ * Restore environment variables from `/proc/self/environ` when running
10
+ * inside a sandbox where Bun's `process.env` is empty.
11
+ */
12
+ export declare function restoreSandboxEnv(): void;
13
+ //# sourceMappingURL=restore-sandbox-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore-sandbox-env.d.ts","sourceRoot":"","sources":["../../src/bun/restore-sandbox-env.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAiBxC","sourcesContent":["/**\n * Workaround for https://github.com/oven-sh/bun/issues/27802\n *\n * Bun compiled binaries have an empty `process.env` when running inside\n * sandbox environments (e.g. nono on Linux/macOS). On Linux we can recover\n * the environment from `/proc/self/environ`.\n */\n\nimport { readFileSync } from \"node:fs\";\n\n/**\n * Restore environment variables from `/proc/self/environ` when running\n * inside a sandbox where Bun's `process.env` is empty.\n */\nexport function restoreSandboxEnv(): void {\n\tif (!process.versions?.bun) return;\n\n\t// If process.env already has entries, nothing to fix.\n\tif (Object.keys(process.env).length > 0) return;\n\n\ttry {\n\t\tconst data = readFileSync(\"/proc/self/environ\", \"utf-8\");\n\t\tfor (const entry of data.split(\"\\0\")) {\n\t\t\tconst idx = entry.indexOf(\"=\");\n\t\t\tif (idx > 0) {\n\t\t\t\tprocess.env[entry.slice(0, idx)] = entry.slice(idx + 1);\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// /proc/self/environ may not be readable; ignore.\n\t}\n}\n"]}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Workaround for https://github.com/oven-sh/bun/issues/27802
3
+ *
4
+ * Bun compiled binaries have an empty `process.env` when running inside
5
+ * sandbox environments (e.g. nono on Linux/macOS). On Linux we can recover
6
+ * the environment from `/proc/self/environ`.
7
+ */
8
+ import { readFileSync } from "node:fs";
9
+ /**
10
+ * Restore environment variables from `/proc/self/environ` when running
11
+ * inside a sandbox where Bun's `process.env` is empty.
12
+ */
13
+ export function restoreSandboxEnv() {
14
+ if (!process.versions?.bun)
15
+ return;
16
+ // If process.env already has entries, nothing to fix.
17
+ if (Object.keys(process.env).length > 0)
18
+ return;
19
+ try {
20
+ const data = readFileSync("/proc/self/environ", "utf-8");
21
+ for (const entry of data.split("\0")) {
22
+ const idx = entry.indexOf("=");
23
+ if (idx > 0) {
24
+ process.env[entry.slice(0, idx)] = entry.slice(idx + 1);
25
+ }
26
+ }
27
+ }
28
+ catch {
29
+ // /proc/self/environ may not be readable; ignore.
30
+ }
31
+ }
32
+ //# sourceMappingURL=restore-sandbox-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore-sandbox-env.js","sourceRoot":"","sources":["../../src/bun/restore-sandbox-env.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;;GAGG;AACH,MAAM,UAAU,iBAAiB,GAAS;IACzC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG;QAAE,OAAO;IAEnC,sDAAsD;IACtD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO;IAEhD,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,YAAY,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;QACzD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACzD,CAAC;QACF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,kDAAkD;IACnD,CAAC;AAAA,CACD","sourcesContent":["/**\n * Workaround for https://github.com/oven-sh/bun/issues/27802\n *\n * Bun compiled binaries have an empty `process.env` when running inside\n * sandbox environments (e.g. nono on Linux/macOS). On Linux we can recover\n * the environment from `/proc/self/environ`.\n */\n\nimport { readFileSync } from \"node:fs\";\n\n/**\n * Restore environment variables from `/proc/self/environ` when running\n * inside a sandbox where Bun's `process.env` is empty.\n */\nexport function restoreSandboxEnv(): void {\n\tif (!process.versions?.bun) return;\n\n\t// If process.env already has entries, nothing to fix.\n\tif (Object.keys(process.env).length > 0) return;\n\n\ttry {\n\t\tconst data = readFileSync(\"/proc/self/environ\", \"utf-8\");\n\t\tfor (const entry of data.split(\"\\0\")) {\n\t\t\tconst idx = entry.indexOf(\"=\");\n\t\t\tif (idx > 0) {\n\t\t\t\tprocess.env[entry.slice(0, idx)] = entry.slice(idx + 1);\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// /proc/self/environ may not be readable; ignore.\n\t}\n}\n"]}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * CLI argument parsing and help display
3
+ */
4
+ import type { ThinkingLevel } from "@kolisachint/hoocode-agent-core";
5
+ import type { ExtensionFlag } from "../core/extensions/types.js";
6
+ export type Mode = "text" | "json" | "rpc";
7
+ export interface Args {
8
+ provider?: string;
9
+ model?: string;
10
+ apiKey?: string;
11
+ systemPrompt?: string;
12
+ appendSystemPrompt?: string[];
13
+ thinking?: ThinkingLevel;
14
+ continue?: boolean;
15
+ resume?: boolean;
16
+ help?: boolean;
17
+ version?: boolean;
18
+ mode?: Mode;
19
+ noSession?: boolean;
20
+ session?: string;
21
+ fork?: string;
22
+ sessionDir?: string;
23
+ models?: string[];
24
+ tools?: string[];
25
+ noTools?: boolean;
26
+ noBuiltinTools?: boolean;
27
+ extensions?: string[];
28
+ noExtensions?: boolean;
29
+ print?: boolean;
30
+ export?: string;
31
+ noSkills?: boolean;
32
+ skills?: string[];
33
+ promptTemplates?: string[];
34
+ noPromptTemplates?: boolean;
35
+ themes?: string[];
36
+ noThemes?: boolean;
37
+ noContextFiles?: boolean;
38
+ listModels?: string | true;
39
+ offline?: boolean;
40
+ verbose?: boolean;
41
+ messages: string[];
42
+ fileArgs: string[];
43
+ /** Unknown flags (potentially extension flags) - map of flag name to value */
44
+ unknownFlags: Map<string, boolean | string>;
45
+ diagnostics: Array<{
46
+ type: "warning" | "error";
47
+ message: string;
48
+ }>;
49
+ }
50
+ export declare function isValidThinkingLevel(level: string): level is ThinkingLevel;
51
+ export declare function parseArgs(args: string[]): Args;
52
+ export declare function printHelp(extensionFlags?: ExtensionFlag[]): void;
53
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAE3C,MAAM,WAAW,IAAI;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8EAA8E;IAC9E,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC;IAC5C,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE;AAID,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,aAAa,CAE1E;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkI9C;AAED,wBAAgB,SAAS,CAAC,cAAc,CAAC,EAAE,aAAa,EAAE,GAAG,IAAI,CAmKhE","sourcesContent":["/**\n * CLI argument parsing and help display\n */\n\nimport type { ThinkingLevel } from \"@kolisachint/hoocode-agent-core\";\nimport chalk from \"chalk\";\nimport { APP_NAME, CONFIG_DIR_NAME, ENV_AGENT_DIR, ENV_SESSION_DIR } from \"../config.js\";\nimport type { ExtensionFlag } from \"../core/extensions/types.js\";\n\nexport type Mode = \"text\" | \"json\" | \"rpc\";\n\nexport interface Args {\n\tprovider?: string;\n\tmodel?: string;\n\tapiKey?: string;\n\tsystemPrompt?: string;\n\tappendSystemPrompt?: string[];\n\tthinking?: ThinkingLevel;\n\tcontinue?: boolean;\n\tresume?: boolean;\n\thelp?: boolean;\n\tversion?: boolean;\n\tmode?: Mode;\n\tnoSession?: boolean;\n\tsession?: string;\n\tfork?: string;\n\tsessionDir?: string;\n\tmodels?: string[];\n\ttools?: string[];\n\tnoTools?: boolean;\n\tnoBuiltinTools?: boolean;\n\textensions?: string[];\n\tnoExtensions?: boolean;\n\tprint?: boolean;\n\texport?: string;\n\tnoSkills?: boolean;\n\tskills?: string[];\n\tpromptTemplates?: string[];\n\tnoPromptTemplates?: boolean;\n\tthemes?: string[];\n\tnoThemes?: boolean;\n\tnoContextFiles?: boolean;\n\tlistModels?: string | true;\n\toffline?: boolean;\n\tverbose?: boolean;\n\tmessages: string[];\n\tfileArgs: string[];\n\t/** Unknown flags (potentially extension flags) - map of flag name to value */\n\tunknownFlags: Map<string, boolean | string>;\n\tdiagnostics: Array<{ type: \"warning\" | \"error\"; message: string }>;\n}\n\nconst VALID_THINKING_LEVELS = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"] as const;\n\nexport function isValidThinkingLevel(level: string): level is ThinkingLevel {\n\treturn VALID_THINKING_LEVELS.includes(level as ThinkingLevel);\n}\n\nexport function parseArgs(args: string[]): Args {\n\tconst result: Args = {\n\t\tmessages: [],\n\t\tfileArgs: [],\n\t\tunknownFlags: new Map(),\n\t\tdiagnostics: [],\n\t};\n\n\tfor (let i = 0; i < args.length; i++) {\n\t\tconst arg = args[i];\n\n\t\tif (arg === \"--help\" || arg === \"-h\") {\n\t\t\tresult.help = true;\n\t\t} else if (arg === \"--version\" || arg === \"-v\") {\n\t\t\tresult.version = true;\n\t\t} else if (arg === \"--mode\" && i + 1 < args.length) {\n\t\t\tconst mode = args[++i];\n\t\t\tif (mode === \"text\" || mode === \"json\" || mode === \"rpc\") {\n\t\t\t\tresult.mode = mode;\n\t\t\t}\n\t\t} else if (arg === \"--continue\" || arg === \"-c\") {\n\t\t\tresult.continue = true;\n\t\t} else if (arg === \"--resume\" || arg === \"-r\") {\n\t\t\tresult.resume = true;\n\t\t} else if (arg === \"--provider\" && i + 1 < args.length) {\n\t\t\tresult.provider = args[++i];\n\t\t} else if (arg === \"--model\" && i + 1 < args.length) {\n\t\t\tresult.model = args[++i];\n\t\t} else if (arg === \"--api-key\" && i + 1 < args.length) {\n\t\t\tresult.apiKey = args[++i];\n\t\t} else if (arg === \"--system-prompt\" && i + 1 < args.length) {\n\t\t\tresult.systemPrompt = args[++i];\n\t\t} else if (arg === \"--append-system-prompt\" && i + 1 < args.length) {\n\t\t\tresult.appendSystemPrompt = result.appendSystemPrompt ?? [];\n\t\t\tresult.appendSystemPrompt.push(args[++i]);\n\t\t} else if (arg === \"--no-session\") {\n\t\t\tresult.noSession = true;\n\t\t} else if (arg === \"--session\" && i + 1 < args.length) {\n\t\t\tresult.session = args[++i];\n\t\t} else if (arg === \"--fork\" && i + 1 < args.length) {\n\t\t\tresult.fork = args[++i];\n\t\t} else if (arg === \"--session-dir\" && i + 1 < args.length) {\n\t\t\tresult.sessionDir = args[++i];\n\t\t} else if (arg === \"--models\" && i + 1 < args.length) {\n\t\t\tresult.models = args[++i].split(\",\").map((s) => s.trim());\n\t\t} else if (arg === \"--no-tools\" || arg === \"-nt\") {\n\t\t\tresult.noTools = true;\n\t\t} else if (arg === \"--no-builtin-tools\" || arg === \"-nbt\") {\n\t\t\tresult.noBuiltinTools = true;\n\t\t} else if ((arg === \"--tools\" || arg === \"-t\") && i + 1 < args.length) {\n\t\t\tresult.tools = args[++i]\n\t\t\t\t.split(\",\")\n\t\t\t\t.map((s) => s.trim())\n\t\t\t\t.filter((name) => name.length > 0);\n\t\t} else if (arg === \"--thinking\" && i + 1 < args.length) {\n\t\t\tconst level = args[++i];\n\t\t\tif (isValidThinkingLevel(level)) {\n\t\t\t\tresult.thinking = level;\n\t\t\t} else {\n\t\t\t\tresult.diagnostics.push({\n\t\t\t\t\ttype: \"warning\",\n\t\t\t\t\tmessage: `Invalid thinking level \"${level}\". Valid values: ${VALID_THINKING_LEVELS.join(\", \")}`,\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (arg === \"--print\" || arg === \"-p\") {\n\t\t\tresult.print = true;\n\t\t\tconst next = args[i + 1];\n\t\t\tif (next !== undefined && !next.startsWith(\"@\") && (!next.startsWith(\"-\") || next.startsWith(\"---\"))) {\n\t\t\t\tresult.messages.push(next);\n\t\t\t\ti++;\n\t\t\t}\n\t\t} else if (arg === \"--export\" && i + 1 < args.length) {\n\t\t\tresult.export = args[++i];\n\t\t} else if ((arg === \"--extension\" || arg === \"-e\") && i + 1 < args.length) {\n\t\t\tresult.extensions = result.extensions ?? [];\n\t\t\tresult.extensions.push(args[++i]);\n\t\t} else if (arg === \"--no-extensions\" || arg === \"-ne\") {\n\t\t\tresult.noExtensions = true;\n\t\t} else if (arg === \"--skill\" && i + 1 < args.length) {\n\t\t\tresult.skills = result.skills ?? [];\n\t\t\tresult.skills.push(args[++i]);\n\t\t} else if (arg === \"--prompt-template\" && i + 1 < args.length) {\n\t\t\tresult.promptTemplates = result.promptTemplates ?? [];\n\t\t\tresult.promptTemplates.push(args[++i]);\n\t\t} else if (arg === \"--theme\" && i + 1 < args.length) {\n\t\t\tresult.themes = result.themes ?? [];\n\t\t\tresult.themes.push(args[++i]);\n\t\t} else if (arg === \"--no-skills\" || arg === \"-ns\") {\n\t\t\tresult.noSkills = true;\n\t\t} else if (arg === \"--no-prompt-templates\" || arg === \"-np\") {\n\t\t\tresult.noPromptTemplates = true;\n\t\t} else if (arg === \"--no-themes\") {\n\t\t\tresult.noThemes = true;\n\t\t} else if (arg === \"--no-context-files\" || arg === \"-nc\") {\n\t\t\tresult.noContextFiles = true;\n\t\t} else if (arg === \"--list-models\") {\n\t\t\t// Check if next arg is a search pattern (not a flag or file arg)\n\t\t\tif (i + 1 < args.length && !args[i + 1].startsWith(\"-\") && !args[i + 1].startsWith(\"@\")) {\n\t\t\t\tresult.listModels = args[++i];\n\t\t\t} else {\n\t\t\t\tresult.listModels = true;\n\t\t\t}\n\t\t} else if (arg === \"--verbose\") {\n\t\t\tresult.verbose = true;\n\t\t} else if (arg === \"--offline\") {\n\t\t\tresult.offline = true;\n\t\t} else if (arg.startsWith(\"@\")) {\n\t\t\tresult.fileArgs.push(arg.slice(1)); // Remove @ prefix\n\t\t} else if (arg.startsWith(\"--\")) {\n\t\t\tconst eqIndex = arg.indexOf(\"=\");\n\t\t\tif (eqIndex !== -1) {\n\t\t\t\tresult.unknownFlags.set(arg.slice(2, eqIndex), arg.slice(eqIndex + 1));\n\t\t\t} else {\n\t\t\t\tconst flagName = arg.slice(2);\n\t\t\t\tconst next = args[i + 1];\n\t\t\t\tif (next !== undefined && !next.startsWith(\"-\") && !next.startsWith(\"@\")) {\n\t\t\t\t\tresult.unknownFlags.set(flagName, next);\n\t\t\t\t\ti++;\n\t\t\t\t} else {\n\t\t\t\t\tresult.unknownFlags.set(flagName, true);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (arg.startsWith(\"-\") && !arg.startsWith(\"--\")) {\n\t\t\tresult.diagnostics.push({ type: \"error\", message: `Unknown option: ${arg}` });\n\t\t} else if (!arg.startsWith(\"-\")) {\n\t\t\tresult.messages.push(arg);\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function printHelp(extensionFlags?: ExtensionFlag[]): void {\n\tconst extensionFlagsText =\n\t\textensionFlags && extensionFlags.length > 0\n\t\t\t? `\\n${chalk.bold(\"Extension CLI Flags:\")}\\n${extensionFlags\n\t\t\t\t\t.map((flag) => {\n\t\t\t\t\t\tconst value = flag.type === \"string\" ? \" <value>\" : \"\";\n\t\t\t\t\t\tconst description = flag.description ?? `Registered by ${flag.extensionPath}`;\n\t\t\t\t\t\treturn ` --${flag.name}${value}`.padEnd(30) + description;\n\t\t\t\t\t})\n\t\t\t\t\t.join(\"\\n\")}\\n`\n\t\t\t: \"\";\n\tconsole.log(`${chalk.bold(APP_NAME)} - AI coding assistant with read, bash, edit, write tools\n\n${chalk.bold(\"Usage:\")}\n ${APP_NAME} [options] [@files...] [messages...]\n\n${chalk.bold(\"Commands:\")}\n ${APP_NAME} install <source> [-l] Install extension source and add to settings\n ${APP_NAME} remove <source> [-l] Remove extension source from settings\n ${APP_NAME} uninstall <source> [-l] Alias for remove\n ${APP_NAME} update [source|self|pi] Update pi and installed extensions\n ${APP_NAME} list List installed extensions from settings\n ${APP_NAME} config Open TUI to enable/disable package resources\n ${APP_NAME} <command> --help Show help for install/remove/uninstall/update/list\n\n${chalk.bold(\"Options:\")}\n --provider <name> Provider name (default: google)\n --model <pattern> Model pattern or ID (supports \"provider/id\" and optional \":<thinking>\")\n --api-key <key> API key (defaults to env vars)\n --system-prompt <text> System prompt (default: coding assistant prompt)\n --append-system-prompt <text> Append text or file contents to the system prompt (can be used multiple times)\n --mode <mode> Output mode: text (default), json, or rpc\n --print, -p Non-interactive mode: process prompt and exit\n --continue, -c Continue previous session\n --resume, -r Select a session to resume\n --session <path|id> Use specific session file or partial UUID\n --fork <path|id> Fork specific session file or partial UUID into a new session\n --session-dir <dir> Directory for session storage and lookup\n --no-session Don't save session (ephemeral)\n --models <patterns> Comma-separated model patterns for Ctrl+P cycling\n Supports globs (anthropic/*, *sonnet*) and fuzzy matching\n --no-tools, -nt Disable all tools by default (built-in and extension)\n --no-builtin-tools, -nbt Disable built-in tools by default but keep extension/custom tools enabled\n --tools, -t <tools> Comma-separated allowlist of tool names to enable\n Applies to built-in, extension, and custom tools\n --thinking <level> Set thinking level: off, minimal, low, medium, high, xhigh\n --extension, -e <path> Load an extension file (can be used multiple times)\n --no-extensions, -ne Disable extension discovery (explicit -e paths still work)\n --skill <path> Load a skill file or directory (can be used multiple times)\n --no-skills, -ns Disable skills discovery and loading\n --prompt-template <path> Load a prompt template file or directory (can be used multiple times)\n --no-prompt-templates, -np Disable prompt template discovery and loading\n --theme <path> Load a theme file or directory (can be used multiple times)\n --no-themes Disable theme discovery and loading\n --no-context-files, -nc Disable AGENTS.md and CLAUDE.md discovery and loading\n --export <file> Export session file to HTML and exit\n --list-models [search] List available models (with optional fuzzy search)\n --verbose Force verbose startup (overrides quietStartup setting)\n --offline Disable startup network operations (same as HOOCODE_OFFLINE=1)\n --help, -h Show this help\n --version, -v Show version number\n\nExtensions can register additional flags (e.g., --plan from plan-mode extension).${extensionFlagsText}\n\n${chalk.bold(\"Examples:\")}\n # Interactive mode\n ${APP_NAME}\n\n # Interactive mode with initial prompt\n ${APP_NAME} \"List all .ts files in src/\"\n\n # Include files in initial message\n ${APP_NAME} @prompt.md @image.png \"What color is the sky?\"\n\n # Non-interactive mode (process and exit)\n ${APP_NAME} -p \"List all .ts files in src/\"\n\n # Multiple messages (interactive)\n ${APP_NAME} \"Read package.json\" \"What dependencies do we have?\"\n\n # Continue previous session\n ${APP_NAME} --continue \"What did we discuss?\"\n\n # Use different model\n ${APP_NAME} --provider openai --model gpt-4o-mini \"Help me refactor this code\"\n\n # Use model with provider prefix (no --provider needed)\n ${APP_NAME} --model openai/gpt-4o \"Help me refactor this code\"\n\n # Use model with thinking level shorthand\n ${APP_NAME} --model sonnet:high \"Solve this complex problem\"\n\n # Limit model cycling to specific models\n ${APP_NAME} --models claude-sonnet,claude-haiku,gpt-4o\n\n # Limit to a specific provider with glob pattern\n ${APP_NAME} --models \"github-copilot/*\"\n\n # Cycle models with fixed thinking levels\n ${APP_NAME} --models sonnet:high,haiku:low\n\n # Start with a specific thinking level\n ${APP_NAME} --thinking high \"Solve this complex problem\"\n\n # Read-only mode (no file modifications possible)\n ${APP_NAME} --tools read,grep,find,ls -p \"Review the code in src/\"\n\n # Export a session file to HTML\n ${APP_NAME} --export ~/${CONFIG_DIR_NAME}/agent/sessions/--path--/session.jsonl\n ${APP_NAME} --export session.jsonl output.html\n\n${chalk.bold(\"Environment Variables:\")}\n ANTHROPIC_API_KEY - Anthropic Claude API key\n ANTHROPIC_OAUTH_TOKEN - Anthropic OAuth token (alternative to API key)\n OPENAI_API_KEY - OpenAI GPT API key\n AZURE_OPENAI_API_KEY - Azure OpenAI API key\n AZURE_OPENAI_BASE_URL - Azure OpenAI/Cognitive Services base URL (e.g. https://{resource}.openai.azure.com)\n AZURE_OPENAI_RESOURCE_NAME - Azure OpenAI resource name (alternative to base URL)\n AZURE_OPENAI_API_VERSION - Azure OpenAI API version (default: v1)\n AZURE_OPENAI_DEPLOYMENT_NAME_MAP - Azure OpenAI model=deployment map (comma-separated)\n DEEPSEEK_API_KEY - DeepSeek API key\n GEMINI_API_KEY - Google Gemini API key\n GROQ_API_KEY - Groq API key\n CEREBRAS_API_KEY - Cerebras API key\n XAI_API_KEY - xAI Grok API key\n FIREWORKS_API_KEY - Fireworks API key\n TOGETHER_API_KEY - Together AI API key\n OPENROUTER_API_KEY - OpenRouter API key\n AI_GATEWAY_API_KEY - Vercel AI Gateway API key\n ZAI_API_KEY - ZAI API key\n MISTRAL_API_KEY - Mistral API key\n MINIMAX_API_KEY - MiniMax API key\n MOONSHOT_API_KEY - Moonshot AI API key\n OPENCODE_API_KEY - OpenCode Zen/OpenCode Go API key\n KIMI_API_KEY - Kimi For Coding API key\n CLOUDFLARE_API_KEY - Cloudflare API token (Workers AI and AI Gateway)\n CLOUDFLARE_ACCOUNT_ID - Cloudflare account id (required for both)\n CLOUDFLARE_GATEWAY_ID - Cloudflare AI Gateway slug (required for AI Gateway)\n XIAOMI_API_KEY - Xiaomi MiMo API key (api.xiaomimimo.com billing)\n XIAOMI_TOKEN_PLAN_CN_API_KEY - Xiaomi MiMo Token Plan API key (China region)\n XIAOMI_TOKEN_PLAN_AMS_API_KEY - Xiaomi MiMo Token Plan API key (Amsterdam region)\n XIAOMI_TOKEN_PLAN_SGP_API_KEY - Xiaomi MiMo Token Plan API key (Singapore region)\n AWS_PROFILE - AWS profile for Amazon Bedrock\n AWS_ACCESS_KEY_ID - AWS access key for Amazon Bedrock\n AWS_SECRET_ACCESS_KEY - AWS secret key for Amazon Bedrock\n AWS_BEARER_TOKEN_BEDROCK - Bedrock API key (bearer token)\n AWS_REGION - AWS region for Amazon Bedrock (e.g., us-east-1)\n ${ENV_AGENT_DIR.padEnd(32)} - Config directory (default: ~/${CONFIG_DIR_NAME}/agent)\n ${ENV_SESSION_DIR.padEnd(32)} - Session storage directory (overridden by --session-dir)\n HOOCODE_PACKAGE_DIR - Override package directory (for Nix/Guix store paths). Legacy: PI_PACKAGE_DIR\n HOOCODE_OFFLINE - Disable startup network operations when set to 1/true/yes. Legacy: PI_OFFLINE\n HOOCODE_TELEMETRY - Override install telemetry when set to 1/true/yes or 0/false/no. Legacy: PI_TELEMETRY\n HOOCODE_SHARE_VIEWER_URL - Base URL for /share command (default: https://pi.dev/session/). Legacy: PI_SHARE_VIEWER_URL\n\n${chalk.bold(\"Built-in Tool Names:\")}\n read - Read file contents\n bash - Execute bash commands\n edit - Edit files with find/replace\n write - Write files (creates/overwrites)\n grep - Search file contents (read-only, off by default)\n find - Find files by glob pattern (read-only, off by default)\n ls - List directory contents (read-only, off by default)\n`);\n}\n"]}