@nio-cli/cli 0.1.0 → 0.3.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 (425) hide show
  1. package/README.md +374 -139
  2. package/dist/adapters/docker/docker-gateway.js +100 -0
  3. package/dist/adapters/docker/docker-gateway.js.map +1 -0
  4. package/dist/adapters/ide/ide-gateway.js +50 -0
  5. package/dist/adapters/ide/ide-gateway.js.map +1 -0
  6. package/dist/adapters/lang/knowledge-store.js +97 -0
  7. package/dist/adapters/lang/knowledge-store.js.map +1 -0
  8. package/dist/adapters/lang/language-catalog.js +86 -0
  9. package/dist/adapters/lang/language-catalog.js.map +1 -0
  10. package/dist/adapters/lang/package-map.js +98 -0
  11. package/dist/adapters/lang/package-map.js.map +1 -0
  12. package/dist/adapters/lang/project-detector.js +40 -0
  13. package/dist/adapters/lang/project-detector.js.map +1 -0
  14. package/dist/adapters/lang/repos.js +8 -0
  15. package/dist/adapters/lang/repos.js.map +1 -0
  16. package/dist/adapters/lang/scaffold-gateway.js +135 -0
  17. package/dist/adapters/lang/scaffold-gateway.js.map +1 -0
  18. package/dist/adapters/lang/vendor.js +52 -0
  19. package/dist/adapters/lang/vendor.js.map +1 -0
  20. package/dist/adapters/pg/auth-session-repository.js +41 -0
  21. package/dist/adapters/pg/auth-session-repository.js.map +1 -0
  22. package/dist/adapters/pg/client.js +74 -0
  23. package/dist/adapters/pg/client.js.map +1 -0
  24. package/dist/adapters/pg/dependency-event-repository.js +40 -0
  25. package/dist/adapters/pg/dependency-event-repository.js.map +1 -0
  26. package/dist/adapters/pg/login-challenge-repository.js +54 -0
  27. package/dist/adapters/pg/login-challenge-repository.js.map +1 -0
  28. package/dist/adapters/pg/session-repository.js +70 -0
  29. package/dist/adapters/pg/session-repository.js.map +1 -0
  30. package/dist/adapters/pg/user-repository.js +71 -0
  31. package/dist/adapters/pg/user-repository.js.map +1 -0
  32. package/dist/adapters/pkg/toolchain-gateway.js +35 -0
  33. package/dist/adapters/pkg/toolchain-gateway.js.map +1 -0
  34. package/dist/adapters/skills/recipe-catalog.js +84 -0
  35. package/dist/adapters/skills/recipe-catalog.js.map +1 -0
  36. package/dist/adapters/sms/http-generic.js +50 -0
  37. package/dist/adapters/sms/http-generic.js.map +1 -0
  38. package/dist/app/ai-client.js +44 -0
  39. package/dist/app/ai-client.js.map +1 -0
  40. package/dist/app/dependency-watcher.js +87 -0
  41. package/dist/app/dependency-watcher.js.map +1 -0
  42. package/dist/app/docker-manager.js +113 -0
  43. package/dist/app/docker-manager.js.map +1 -0
  44. package/dist/app/environment-builder.js +73 -0
  45. package/dist/app/environment-builder.js.map +1 -0
  46. package/dist/app/language-configurator.js +30 -0
  47. package/dist/app/language-configurator.js.map +1 -0
  48. package/dist/app/session-manager.js +124 -0
  49. package/dist/app/session-manager.js.map +1 -0
  50. package/dist/brand.js +3 -61
  51. package/dist/brand.js.map +1 -1
  52. package/dist/cli/commands/agents.js +30 -0
  53. package/dist/cli/commands/agents.js.map +1 -0
  54. package/dist/cli/commands/ai.js +61 -0
  55. package/dist/cli/commands/ai.js.map +1 -0
  56. package/dist/cli/commands/auth.js +149 -96
  57. package/dist/cli/commands/auth.js.map +1 -1
  58. package/dist/cli/commands/clean.js +1 -13
  59. package/dist/cli/commands/clean.js.map +1 -1
  60. package/dist/cli/commands/command.js +58 -0
  61. package/dist/cli/commands/command.js.map +1 -0
  62. package/dist/cli/commands/completion.js +0 -3
  63. package/dist/cli/commands/completion.js.map +1 -1
  64. package/dist/cli/commands/config.js +43 -0
  65. package/dist/cli/commands/config.js.map +1 -0
  66. package/dist/cli/commands/debug.js +102 -0
  67. package/dist/cli/commands/debug.js.map +1 -0
  68. package/dist/cli/commands/deps.js +94 -0
  69. package/dist/cli/commands/deps.js.map +1 -0
  70. package/dist/cli/commands/docker.js +385 -0
  71. package/dist/cli/commands/docker.js.map +1 -0
  72. package/dist/cli/commands/docs/content.js +219 -0
  73. package/dist/cli/commands/docs/content.js.map +1 -0
  74. package/dist/cli/commands/docs/dynamic.js +42 -0
  75. package/dist/cli/commands/docs/dynamic.js.map +1 -0
  76. package/dist/cli/commands/docs/html.js +108 -0
  77. package/dist/cli/commands/docs/html.js.map +1 -0
  78. package/dist/cli/commands/docs/terminal.js +42 -0
  79. package/dist/cli/commands/docs/terminal.js.map +1 -0
  80. package/dist/cli/commands/docs.js +34 -0
  81. package/dist/cli/commands/docs.js.map +1 -0
  82. package/dist/cli/commands/exec.js +2 -7
  83. package/dist/cli/commands/exec.js.map +1 -1
  84. package/dist/cli/commands/init/auth-step.js +10 -45
  85. package/dist/cli/commands/init/auth-step.js.map +1 -1
  86. package/dist/cli/commands/init/clients-step.js +12 -39
  87. package/dist/cli/commands/init/clients-step.js.map +1 -1
  88. package/dist/cli/commands/init/context-step.js +7 -33
  89. package/dist/cli/commands/init/context-step.js.map +1 -1
  90. package/dist/cli/commands/init/handoff.js +20 -0
  91. package/dist/cli/commands/init/handoff.js.map +1 -0
  92. package/dist/cli/commands/init/index.js +164 -34
  93. package/dist/cli/commands/init/index.js.map +1 -1
  94. package/dist/cli/commands/init/lang-step.js +40 -0
  95. package/dist/cli/commands/init/lang-step.js.map +1 -0
  96. package/dist/cli/commands/init/profile-step.js +43 -0
  97. package/dist/cli/commands/init/profile-step.js.map +1 -0
  98. package/dist/cli/commands/init/provision-step.js +8 -23
  99. package/dist/cli/commands/init/provision-step.js.map +1 -1
  100. package/dist/cli/commands/init/recipe-step.js +18 -0
  101. package/dist/cli/commands/init/recipe-step.js.map +1 -0
  102. package/dist/cli/commands/lang.js +27 -0
  103. package/dist/cli/commands/lang.js.map +1 -0
  104. package/dist/cli/commands/open.js +59 -0
  105. package/dist/cli/commands/open.js.map +1 -0
  106. package/dist/cli/commands/plan.js +2 -6
  107. package/dist/cli/commands/plan.js.map +1 -1
  108. package/dist/cli/commands/security.js +143 -0
  109. package/dist/cli/commands/security.js.map +1 -0
  110. package/dist/cli/commands/sessions.js +92 -0
  111. package/dist/cli/commands/sessions.js.map +1 -0
  112. package/dist/cli/commands/skills.js +1 -1
  113. package/dist/cli/commands/skills.js.map +1 -1
  114. package/dist/cli/commands/start.js +8 -0
  115. package/dist/cli/commands/start.js.map +1 -0
  116. package/dist/cli/commands/sync.js +52 -58
  117. package/dist/cli/commands/sync.js.map +1 -1
  118. package/dist/cli/commands/validate-plan.js +2 -6
  119. package/dist/cli/commands/validate-plan.js.map +1 -1
  120. package/dist/cli/copy/auth.json +9 -2
  121. package/dist/cli/copy/init.json +2 -6
  122. package/dist/cli/copy.js +0 -8
  123. package/dist/cli/copy.js.map +1 -1
  124. package/dist/cli/flows/clients.js +3 -94
  125. package/dist/cli/flows/clients.js.map +1 -1
  126. package/dist/cli/flows/completion.js +1 -6
  127. package/dist/cli/flows/completion.js.map +1 -1
  128. package/dist/cli/flows/dependencies.js +1 -18
  129. package/dist/cli/flows/dependencies.js.map +1 -1
  130. package/dist/cli/flows/onboarding.js +116 -0
  131. package/dist/cli/flows/onboarding.js.map +1 -0
  132. package/dist/cli/flows/sections.js +2 -10
  133. package/dist/cli/flows/sections.js.map +1 -1
  134. package/dist/cli/flows/user-config.js +5 -10
  135. package/dist/cli/flows/user-config.js.map +1 -1
  136. package/dist/cli/program.js +58 -0
  137. package/dist/cli/program.js.map +1 -0
  138. package/dist/cli/ui/render.js +2 -53
  139. package/dist/cli/ui/render.js.map +1 -1
  140. package/dist/cli/ui/report.js +0 -13
  141. package/dist/cli/ui/report.js.map +1 -1
  142. package/dist/cli.js +27 -31
  143. package/dist/cli.js.map +1 -1
  144. package/dist/config.js +27 -56
  145. package/dist/config.js.map +1 -1
  146. package/dist/core/docker.js +2 -0
  147. package/dist/core/docker.js.map +1 -0
  148. package/dist/core/environment.js +2 -0
  149. package/dist/core/environment.js.map +1 -0
  150. package/dist/core/lang.js +11 -0
  151. package/dist/core/lang.js.map +1 -0
  152. package/dist/core/messaging.js +2 -0
  153. package/dist/core/messaging.js.map +1 -0
  154. package/dist/core/repositories.js +2 -0
  155. package/dist/core/repositories.js.map +1 -0
  156. package/dist/core/types.js +0 -5
  157. package/dist/core/types.js.map +1 -1
  158. package/dist/gateway/config.js +13 -0
  159. package/dist/gateway/config.js.map +1 -0
  160. package/dist/gateway/edge-filter.js +55 -0
  161. package/dist/gateway/edge-filter.js.map +1 -0
  162. package/dist/gateway/index.js +176 -0
  163. package/dist/gateway/index.js.map +1 -0
  164. package/dist/gateway/middleware/auth.js +34 -0
  165. package/dist/gateway/middleware/auth.js.map +1 -0
  166. package/dist/gateway/services/login.js +112 -0
  167. package/dist/gateway/services/login.js.map +1 -0
  168. package/dist/gateway/services/security.js +99 -0
  169. package/dist/gateway/services/security.js.map +1 -0
  170. package/dist/lib/auth/backup-codes.js +46 -0
  171. package/dist/lib/auth/backup-codes.js.map +1 -0
  172. package/dist/lib/auth/gateway-client.js +86 -0
  173. package/dist/lib/auth/gateway-client.js.map +1 -0
  174. package/dist/lib/auth/gateway-process.js +54 -0
  175. package/dist/lib/auth/gateway-process.js.map +1 -0
  176. package/dist/lib/auth/gateway-token.js +26 -0
  177. package/dist/lib/auth/gateway-token.js.map +1 -0
  178. package/dist/lib/auth/nio-config.js +147 -0
  179. package/dist/lib/auth/nio-config.js.map +1 -0
  180. package/dist/lib/auth/otp.js +23 -0
  181. package/dist/lib/auth/otp.js.map +1 -0
  182. package/dist/lib/auth/password.js +23 -0
  183. package/dist/lib/auth/password.js.map +1 -0
  184. package/dist/lib/auth/session-store.js +49 -0
  185. package/dist/lib/auth/session-store.js.map +1 -0
  186. package/dist/lib/clients/autopull.js +8 -0
  187. package/dist/lib/clients/autopull.js.map +1 -0
  188. package/dist/lib/{client-configs.js → clients/client-configs.js} +113 -34
  189. package/dist/lib/clients/client-configs.js.map +1 -0
  190. package/dist/lib/clients/client-install.js +20 -0
  191. package/dist/lib/clients/client-install.js.map +1 -0
  192. package/dist/lib/{harness.js → clients/harness.js} +1 -16
  193. package/dist/lib/clients/harness.js.map +1 -0
  194. package/dist/lib/{hooks.js → clients/hooks.js} +5 -31
  195. package/dist/lib/clients/hooks.js.map +1 -0
  196. package/dist/lib/{targets.js → clients/targets.js} +17 -53
  197. package/dist/lib/clients/targets.js.map +1 -0
  198. package/dist/lib/colors.js +0 -24
  199. package/dist/lib/colors.js.map +1 -1
  200. package/dist/lib/cowork-extension.js +2 -25
  201. package/dist/lib/cowork-extension.js.map +1 -1
  202. package/dist/lib/debug.js +6 -0
  203. package/dist/lib/debug.js.map +1 -0
  204. package/dist/lib/{dependencies.js → deps/dependencies.js} +1 -26
  205. package/dist/lib/deps/dependencies.js.map +1 -0
  206. package/dist/lib/deps/dependency-install-project.js +27 -0
  207. package/dist/lib/deps/dependency-install-project.js.map +1 -0
  208. package/dist/lib/{dependency-install.js → deps/dependency-install.js} +10 -35
  209. package/dist/lib/deps/dependency-install.js.map +1 -0
  210. package/dist/lib/deps/dependency-installed.js +64 -0
  211. package/dist/lib/deps/dependency-installed.js.map +1 -0
  212. package/dist/lib/deps/dependency-scan.js +100 -0
  213. package/dist/lib/deps/dependency-scan.js.map +1 -0
  214. package/dist/lib/docker.js +50 -0
  215. package/dist/lib/docker.js.map +1 -0
  216. package/dist/lib/dotfiles.js +57 -0
  217. package/dist/lib/dotfiles.js.map +1 -0
  218. package/dist/lib/{exec-delegate.js → exec/exec-delegate.js} +4 -13
  219. package/dist/lib/exec/exec-delegate.js.map +1 -0
  220. package/dist/lib/{exec-engines.js → exec/exec-engines.js} +1 -10
  221. package/dist/lib/exec/exec-engines.js.map +1 -0
  222. package/dist/lib/{plan-delegate.js → exec/plan-delegate.js} +1 -7
  223. package/dist/lib/exec/plan-delegate.js.map +1 -0
  224. package/dist/lib/{validate-plan-delegate.js → exec/validate-plan-delegate.js} +2 -7
  225. package/dist/lib/exec/validate-plan-delegate.js.map +1 -0
  226. package/dist/lib/headroom.js +44 -0
  227. package/dist/lib/headroom.js.map +1 -0
  228. package/dist/lib/ide-tasks.js +54 -0
  229. package/dist/lib/ide-tasks.js.map +1 -0
  230. package/dist/lib/load-env.js +44 -0
  231. package/dist/lib/load-env.js.map +1 -0
  232. package/dist/lib/open-url.js +9 -0
  233. package/dist/lib/open-url.js.map +1 -0
  234. package/dist/lib/prompts.js +0 -13
  235. package/dist/lib/prompts.js.map +1 -1
  236. package/dist/lib/{provision-apply.js → provision/provision-apply.js} +4 -30
  237. package/dist/lib/provision/provision-apply.js.map +1 -0
  238. package/dist/lib/{provision-collect.js → provision/provision-collect.js} +0 -9
  239. package/dist/lib/provision/provision-collect.js.map +1 -0
  240. package/dist/lib/{provision.js → provision/provision.js} +4 -17
  241. package/dist/lib/provision/provision.js.map +1 -0
  242. package/dist/lib/{patterns.js → skills/patterns.js} +0 -13
  243. package/dist/lib/skills/patterns.js.map +1 -0
  244. package/dist/lib/{rules.js → skills/rules.js} +0 -22
  245. package/dist/lib/skills/rules.js.map +1 -0
  246. package/dist/lib/skills/sections.js +58 -0
  247. package/dist/lib/skills/sections.js.map +1 -0
  248. package/dist/lib/{skill-serve.js → skills/skill-serve.js} +1 -26
  249. package/dist/lib/skills/skill-serve.js.map +1 -0
  250. package/dist/lib/{skills-cache.js → skills/skills-cache.js} +15 -21
  251. package/dist/lib/skills/skills-cache.js.map +1 -0
  252. package/dist/lib/{skills.js → skills/skills.js} +3 -49
  253. package/dist/lib/skills/skills.js.map +1 -0
  254. package/dist/lib/spinner.js.map +1 -0
  255. package/dist/lib/telemetry.js +3 -20
  256. package/dist/lib/telemetry.js.map +1 -1
  257. package/dist/lib/version-check.js +0 -20
  258. package/dist/lib/version-check.js.map +1 -1
  259. package/dist/matrix-logo.js +43 -21
  260. package/dist/matrix-logo.js.map +1 -1
  261. package/dist/mcp-server-lang.js +39 -0
  262. package/dist/mcp-server-lang.js.map +1 -0
  263. package/dist/mcp-server.js +37 -41
  264. package/dist/mcp-server.js.map +1 -1
  265. package/dist/profiles/analyst.js +10 -0
  266. package/dist/profiles/analyst.js.map +1 -0
  267. package/dist/profiles/bi.js +9 -0
  268. package/dist/profiles/bi.js.map +1 -0
  269. package/dist/profiles/dba.js +21 -0
  270. package/dist/profiles/dba.js.map +1 -0
  271. package/dist/profiles/fullstack.js +9 -0
  272. package/dist/profiles/fullstack.js.map +1 -0
  273. package/dist/profiles/index.js +39 -0
  274. package/dist/profiles/index.js.map +1 -0
  275. package/dist/profiles/mcps.js +23 -0
  276. package/dist/profiles/mcps.js.map +1 -0
  277. package/dist/profiles/qa.js +10 -0
  278. package/dist/profiles/qa.js.map +1 -0
  279. package/dist/profiles/scientist.js +9 -0
  280. package/dist/profiles/scientist.js.map +1 -0
  281. package/dist/profiles/toolchains.js +9 -0
  282. package/dist/profiles/toolchains.js.map +1 -0
  283. package/dist/tools/delegate-exec.js +2 -2
  284. package/dist/tools/delegate-exec.js.map +1 -1
  285. package/dist/tools/env-detect-deps.js +54 -0
  286. package/dist/tools/env-detect-deps.js.map +1 -0
  287. package/dist/tools/env-materialize.js +43 -0
  288. package/dist/tools/env-materialize.js.map +1 -0
  289. package/dist/tools/exec-status.js +1 -1
  290. package/dist/tools/exec-status.js.map +1 -1
  291. package/dist/tools/index.js +12 -32
  292. package/dist/tools/index.js.map +1 -1
  293. package/dist/tools/lang-recipe.js +31 -0
  294. package/dist/tools/lang-recipe.js.map +1 -0
  295. package/dist/tools/lang-reference.js +34 -0
  296. package/dist/tools/lang-reference.js.map +1 -0
  297. package/dist/tools/plan.js +2 -2
  298. package/dist/tools/plan.js.map +1 -1
  299. package/dist/tools/profile-get.js +57 -0
  300. package/dist/tools/profile-get.js.map +1 -0
  301. package/dist/tools/session-activate.js +35 -0
  302. package/dist/tools/session-activate.js.map +1 -0
  303. package/dist/tools/session-create.js +83 -0
  304. package/dist/tools/session-create.js.map +1 -0
  305. package/dist/tools/session-list.js +29 -0
  306. package/dist/tools/session-list.js.map +1 -0
  307. package/dist/tools/session-shared.js +25 -0
  308. package/dist/tools/session-shared.js.map +1 -0
  309. package/dist/tools/validate-plan.js +2 -2
  310. package/dist/tools/validate-plan.js.map +1 -1
  311. package/dist/tui/app.js +116 -0
  312. package/dist/tui/app.js.map +1 -0
  313. package/dist/tui/components.js +0 -0
  314. package/dist/tui/components.js.map +1 -0
  315. package/dist/tui/debug.js +17 -0
  316. package/dist/tui/debug.js.map +1 -0
  317. package/dist/tui/index.js +2 -0
  318. package/dist/tui/index.js.map +1 -0
  319. package/dist/tui/launch.js +64 -0
  320. package/dist/tui/launch.js.map +1 -0
  321. package/dist/tui/markdown.js +40 -0
  322. package/dist/tui/markdown.js.map +1 -0
  323. package/dist/tui/opencode.js +28 -0
  324. package/dist/tui/opencode.js.map +1 -0
  325. package/dist/tui/palette-source.js +71 -0
  326. package/dist/tui/palette-source.js.map +1 -0
  327. package/dist/tui/palette.js +100 -0
  328. package/dist/tui/palette.js.map +1 -0
  329. package/dist/tui/state.js +105 -0
  330. package/dist/tui/state.js.map +1 -0
  331. package/dist/tui/theme.js +14 -0
  332. package/dist/tui/theme.js.map +1 -0
  333. package/docker/docker-compose.yml +44 -0
  334. package/headroom/docker-compose.yml +27 -0
  335. package/package.json +40 -16
  336. package/dist/adapters/supabase/allocation-gateway.js +0 -236
  337. package/dist/adapters/supabase/allocation-gateway.js.map +0 -1
  338. package/dist/adapters/supabase/analytics-gateway.js +0 -18
  339. package/dist/adapters/supabase/analytics-gateway.js.map +0 -1
  340. package/dist/adapters/supabase/client.js +0 -96
  341. package/dist/adapters/supabase/client.js.map +0 -1
  342. package/dist/adapters/supabase/context-gateway.js +0 -23
  343. package/dist/adapters/supabase/context-gateway.js.map +0 -1
  344. package/dist/adapters/supabase/gateway.js +0 -18
  345. package/dist/adapters/supabase/gateway.js.map +0 -1
  346. package/dist/adapters/supabase/task-gateway.js +0 -450
  347. package/dist/adapters/supabase/task-gateway.js.map +0 -1
  348. package/dist/auth.js +0 -118
  349. package/dist/auth.js.map +0 -1
  350. package/dist/cli/commands/init/project-step.js +0 -105
  351. package/dist/cli/commands/init/project-step.js.map +0 -1
  352. package/dist/constants.js +0 -9
  353. package/dist/constants.js.map +0 -1
  354. package/dist/core/ports.js +0 -2
  355. package/dist/core/ports.js.map +0 -1
  356. package/dist/database.types.js +0 -11
  357. package/dist/database.types.js.map +0 -1
  358. package/dist/lib/active-project.js +0 -28
  359. package/dist/lib/active-project.js.map +0 -1
  360. package/dist/lib/autopull.js +0 -13
  361. package/dist/lib/autopull.js.map +0 -1
  362. package/dist/lib/client-configs.js.map +0 -1
  363. package/dist/lib/client-install.js +0 -40
  364. package/dist/lib/client-install.js.map +0 -1
  365. package/dist/lib/dependencies.js.map +0 -1
  366. package/dist/lib/dependency-install.js.map +0 -1
  367. package/dist/lib/exec-delegate.js.map +0 -1
  368. package/dist/lib/exec-engines.js.map +0 -1
  369. package/dist/lib/harness.js.map +0 -1
  370. package/dist/lib/hooks.js.map +0 -1
  371. package/dist/lib/patterns.js.map +0 -1
  372. package/dist/lib/plan-delegate.js.map +0 -1
  373. package/dist/lib/project-context.js +0 -151
  374. package/dist/lib/project-context.js.map +0 -1
  375. package/dist/lib/provision-apply.js.map +0 -1
  376. package/dist/lib/provision-collect.js.map +0 -1
  377. package/dist/lib/provision.js.map +0 -1
  378. package/dist/lib/require-config.js +0 -32
  379. package/dist/lib/require-config.js.map +0 -1
  380. package/dist/lib/rules.js.map +0 -1
  381. package/dist/lib/sections.js +0 -89
  382. package/dist/lib/sections.js.map +0 -1
  383. package/dist/lib/skill-serve.js.map +0 -1
  384. package/dist/lib/skills-cache.js.map +0 -1
  385. package/dist/lib/skills.js.map +0 -1
  386. package/dist/lib/targets.js.map +0 -1
  387. package/dist/lib/task-history.js +0 -15
  388. package/dist/lib/task-history.js.map +0 -1
  389. package/dist/lib/validate-plan-delegate.js.map +0 -1
  390. package/dist/session-factory.js +0 -19
  391. package/dist/session-factory.js.map +0 -1
  392. package/dist/spinner.js.map +0 -1
  393. package/dist/tools/comment-task.js +0 -72
  394. package/dist/tools/comment-task.js.map +0 -1
  395. package/dist/tools/create-task.js +0 -129
  396. package/dist/tools/create-task.js.map +0 -1
  397. package/dist/tools/end-allocation.js +0 -38
  398. package/dist/tools/end-allocation.js.map +0 -1
  399. package/dist/tools/end-task-allocation.js +0 -37
  400. package/dist/tools/end-task-allocation.js.map +0 -1
  401. package/dist/tools/get-active-allocation.js +0 -69
  402. package/dist/tools/get-active-allocation.js.map +0 -1
  403. package/dist/tools/get-context.js +0 -48
  404. package/dist/tools/get-context.js.map +0 -1
  405. package/dist/tools/get-task.js +0 -137
  406. package/dist/tools/get-task.js.map +0 -1
  407. package/dist/tools/list-my-allocations.js +0 -71
  408. package/dist/tools/list-my-allocations.js.map +0 -1
  409. package/dist/tools/list-projects.js +0 -38
  410. package/dist/tools/list-projects.js.map +0 -1
  411. package/dist/tools/list-tasks.js +0 -93
  412. package/dist/tools/list-tasks.js.map +0 -1
  413. package/dist/tools/move-task.js +0 -82
  414. package/dist/tools/move-task.js.map +0 -1
  415. package/dist/tools/record-delivery.js +0 -71
  416. package/dist/tools/record-delivery.js.map +0 -1
  417. package/dist/tools/set-project.js +0 -52
  418. package/dist/tools/set-project.js.map +0 -1
  419. package/dist/tools/start-allocation.js +0 -32
  420. package/dist/tools/start-allocation.js.map +0 -1
  421. package/dist/tools/start-task-allocation.js +0 -75
  422. package/dist/tools/start-task-allocation.js.map +0 -1
  423. package/dist/tools/update-task.js +0 -139
  424. package/dist/tools/update-task.js.map +0 -1
  425. /package/dist/{spinner.js → lib/spinner.js} +0 -0
@@ -0,0 +1,100 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { parse as parseToml } from 'smol-toml';
4
+ export const MANIFESTS = [
5
+ { file: 'package.json', type: 'npm' },
6
+ { file: 'requirements.txt', type: 'pip' },
7
+ { file: 'Cargo.toml', type: 'cargo' },
8
+ ];
9
+ const NPM_DEP_KEYS = [
10
+ 'dependencies',
11
+ 'devDependencies',
12
+ 'peerDependencies',
13
+ 'optionalDependencies',
14
+ ];
15
+ export function parsePackageJson(content) {
16
+ let obj;
17
+ try {
18
+ obj = JSON.parse(content);
19
+ }
20
+ catch {
21
+ return [];
22
+ }
23
+ const names = new Set();
24
+ for (const key of NPM_DEP_KEYS) {
25
+ const map = obj[key];
26
+ if (map && typeof map === 'object') {
27
+ for (const name of Object.keys(map))
28
+ names.add(name);
29
+ }
30
+ }
31
+ return [...names];
32
+ }
33
+ export function parseRequirementsTxt(content) {
34
+ const names = new Set();
35
+ for (const raw of content.split(/\r?\n/)) {
36
+ const line = raw.trim();
37
+ if (!line || line.startsWith('#') || line.startsWith('-'))
38
+ continue;
39
+ const name = line.split(/[[<>=!~;\s]/)[0]?.trim();
40
+ if (!name)
41
+ continue;
42
+ if (name.includes(':') || name.includes('/'))
43
+ continue;
44
+ names.add(name);
45
+ }
46
+ return [...names];
47
+ }
48
+ const CARGO_DEP_TABLES = ['dependencies', 'dev-dependencies', 'build-dependencies'];
49
+ export function parseCargoToml(content) {
50
+ let obj;
51
+ try {
52
+ obj = parseToml(content);
53
+ }
54
+ catch {
55
+ return [];
56
+ }
57
+ const names = new Set();
58
+ for (const table of CARGO_DEP_TABLES) {
59
+ const map = obj[table];
60
+ if (map && typeof map === 'object') {
61
+ for (const name of Object.keys(map))
62
+ names.add(name);
63
+ }
64
+ }
65
+ return [...names];
66
+ }
67
+ function parseByFile(file, content) {
68
+ switch (file) {
69
+ case 'package.json':
70
+ return parsePackageJson(content);
71
+ case 'requirements.txt':
72
+ return parseRequirementsTxt(content);
73
+ case 'Cargo.toml':
74
+ return parseCargoToml(content);
75
+ default:
76
+ return null;
77
+ }
78
+ }
79
+ export function scanContent(file, content) {
80
+ const entry = MANIFESTS.find((m) => m.file === file);
81
+ const names = parseByFile(file, content);
82
+ if (!entry || !names)
83
+ return [];
84
+ return names.map((name) => ({ name, type: entry.type, filePath: file }));
85
+ }
86
+ export function scanProject(projectPath) {
87
+ const found = [];
88
+ for (const { file } of MANIFESTS) {
89
+ let content;
90
+ try {
91
+ content = readFileSync(join(projectPath, file), 'utf8');
92
+ }
93
+ catch {
94
+ continue;
95
+ }
96
+ found.push(...scanContent(file, content));
97
+ }
98
+ return found;
99
+ }
100
+ //# sourceMappingURL=dependency-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-scan.js","sourceRoot":"","sources":["../../../src/lib/deps/dependency-scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { connect } from 'node:net';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { join } from 'node:path';
5
+ import { env } from '../brand.js';
6
+ import { isBinaryInstalled } from './clients/client-install.js';
7
+ export const DOCKER_MCP_PORT = Number(env('DOCKER_MCP_PORT')?.trim()) || 8811;
8
+ export const DOCKER_MCP_URL = env('DOCKER_MCP_URL')?.trim() || `http://127.0.0.1:${DOCKER_MCP_PORT}/mcp`;
9
+ export const PORTAINER_PORT = Number(env('PORTAINER_PORT')?.trim()) || 9443;
10
+ export const PORTAINER_URL = env('PORTAINER_URL')?.trim() || `https://127.0.0.1:${PORTAINER_PORT}`;
11
+ export const CLUSTER_STACK = 'nio-cluster';
12
+ export function infraComposePath() {
13
+ return join(fileURLToPath(new URL('../..', import.meta.url)), 'docker', 'docker-compose.yml');
14
+ }
15
+ export function dockerAvailable() {
16
+ if (!isBinaryInstalled('docker'))
17
+ return false;
18
+ const res = spawnSync('docker', ['compose', 'version'], { stdio: 'ignore', timeout: 5000 });
19
+ return !res.error && res.status === 0;
20
+ }
21
+ export function swarmActive() {
22
+ const res = spawnSync('docker', ['info', '--format', '{{.Swarm.LocalNodeState}}'], {
23
+ encoding: 'utf8',
24
+ timeout: 5000,
25
+ });
26
+ return !res.error && res.status === 0 && res.stdout.trim() === 'active';
27
+ }
28
+ export function unreachableDocker() {
29
+ return new Error('Docker não encontrado (ou `docker compose` indisponível). Instale o Docker Engine/Desktop ' +
30
+ 'e confirme com `docker compose version` antes de usar `nio docker`.');
31
+ }
32
+ export function portOpen(port, host = '127.0.0.1') {
33
+ return new Promise((resolve) => {
34
+ const socket = connect({ host, port, timeout: 2000 });
35
+ const done = (ok) => {
36
+ socket.destroy();
37
+ resolve(ok);
38
+ };
39
+ socket.once('connect', () => done(true));
40
+ socket.once('timeout', () => done(false));
41
+ socket.once('error', () => done(false));
42
+ });
43
+ }
44
+ export function mcpGatewayHealthy() {
45
+ return portOpen(DOCKER_MCP_PORT);
46
+ }
47
+ export function portainerHealthy() {
48
+ return portOpen(PORTAINER_PORT);
49
+ }
50
+ //# sourceMappingURL=docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/lib/docker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { homePath } from '../brand.js';
4
+ const START = '# >>> nio managed >>>';
5
+ const END = '# <<< nio managed <<<';
6
+ const NOTE = '# Gerado pelo `nio init` — não edite à mão (regenerado a cada init).';
7
+ function shQuote(v) {
8
+ return `'${v.replace(/'/g, `'\\''`)}'`;
9
+ }
10
+ function pwshQuote(v) {
11
+ return `'${v.replace(/'/g, "''")}'`;
12
+ }
13
+ function renderSh(input) {
14
+ const lines = [];
15
+ for (const [k, v] of Object.entries(input.envVars ?? {}))
16
+ lines.push(`export ${k}=${shQuote(v)}`);
17
+ for (const [name, cmd] of Object.entries(input.aliases ?? {}))
18
+ lines.push(`alias ${name}=${shQuote(cmd)}`);
19
+ return lines.join('\n');
20
+ }
21
+ function renderPwsh(input) {
22
+ const lines = [];
23
+ for (const [k, v] of Object.entries(input.envVars ?? {}))
24
+ lines.push(`$env:${k} = ${pwshQuote(v)}`);
25
+ for (const [name, cmd] of Object.entries(input.aliases ?? {}))
26
+ lines.push(`function ${name} { ${cmd} @args }`);
27
+ return lines.join('\n');
28
+ }
29
+ function upsertBlock(path, body) {
30
+ const block = `${START}\n${NOTE}\n${body}\n${END}`;
31
+ const existing = existsSync(path) ? readFileSync(path, 'utf-8') : '';
32
+ const stripped = existing.replace(new RegExp(`${START}[\\s\\S]*?${END}\\n?`, 'g'), '').trimEnd();
33
+ const next = stripped ? `${stripped}\n\n${block}\n` : `${block}\n`;
34
+ mkdirSync(dirname(path), { recursive: true });
35
+ writeFileSync(path, next);
36
+ }
37
+ function isEmpty(input) {
38
+ return (Object.keys(input.envVars ?? {}).length === 0 && Object.keys(input.aliases ?? {}).length === 0);
39
+ }
40
+ export function writeManagedDotfiles(input, opts = {}) {
41
+ const dir = opts.dir ?? homePath();
42
+ const shPath = join(dir, 'profile.sh');
43
+ const psPath = join(dir, 'profile.ps1');
44
+ if (isEmpty(input)) {
45
+ return [
46
+ { path: shPath, shell: 'sh', status: 'skipped' },
47
+ { path: psPath, shell: 'pwsh', status: 'skipped' },
48
+ ];
49
+ }
50
+ upsertBlock(shPath, renderSh(input));
51
+ upsertBlock(psPath, renderPwsh(input));
52
+ return [
53
+ { path: shPath, shell: 'sh', status: 'written' },
54
+ { path: psPath, shell: 'pwsh', status: 'written' },
55
+ ];
56
+ }
57
+ //# sourceMappingURL=dotfiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dotfiles.js","sourceRoot":"","sources":["../../src/lib/dotfiles.ts"],"names":[],"mappings":"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"}
@@ -2,9 +2,9 @@ import { spawn, spawnSync } from 'node:child_process';
2
2
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
3
  import { join } from 'node:path';
4
4
  import { randomUUID } from 'node:crypto';
5
- import { skillsDir } from './skills.js';
6
- import { homePath } from '../brand.js';
7
- import { HARNESS_RULES_REL, HARNESS_PATTERNS_REL } from './harness.js';
5
+ import { skillsDir } from '../skills/skills.js';
6
+ import { homePath } from '../../brand.js';
7
+ import { HARNESS_RULES_REL, HARNESS_PATTERNS_REL } from '../clients/harness.js';
8
8
  import { DEFAULT_ENGINE, engineArgs, engineMissingError, resolveEngineBin, } from './exec-engines.js';
9
9
  const jobs = new Map();
10
10
  function jobsDir() {
@@ -13,7 +13,6 @@ function jobsDir() {
13
13
  function jobPath(id) {
14
14
  return join(jobsDir(), `${id}.json`);
15
15
  }
16
- /** Persiste o job — o servidor MCP pode reiniciar entre chamadas. */
17
16
  function save(job) {
18
17
  jobs.set(job.id, job);
19
18
  try {
@@ -21,7 +20,6 @@ function save(job) {
21
20
  writeFileSync(jobPath(job.id), JSON.stringify(job, null, 2) + '\n', 'utf8');
22
21
  }
23
22
  catch {
24
- /* best-effort */
25
23
  }
26
24
  return job;
27
25
  }
@@ -36,7 +34,6 @@ export function getJob(id) {
36
34
  return null;
37
35
  }
38
36
  }
39
- /** Preâmbulo que ancora o agente de execução no harness do repo. */
40
37
  function buildPrompt(instruction) {
41
38
  return [
42
39
  'Implemente a tarefa abaixo NESTE worktree.',
@@ -48,7 +45,6 @@ function buildPrompt(instruction) {
48
45
  instruction,
49
46
  ].join('\n');
50
47
  }
51
- /** Roda o hook de tamanho (mesma lógica do commit) sobre o que está staged. */
52
48
  function checkSize(worktree) {
53
49
  let script;
54
50
  try {
@@ -69,7 +65,6 @@ function checkSize(worktree) {
69
65
  return { ok: true, output: 'python3 ausente — pulado' };
70
66
  return { ok: r.status === 0, output: (r.stderr || '').trim() || 'ok' };
71
67
  }
72
- /** Scripts de qualidade que existem no package.json. */
73
68
  function npmScripts(worktree) {
74
69
  try {
75
70
  const pkg = JSON.parse(readFileSync(join(worktree, 'package.json'), 'utf8'));
@@ -91,7 +86,6 @@ function changedFiles(worktree) {
91
86
  .map((l) => l.slice(3).trim())
92
87
  .filter(Boolean);
93
88
  }
94
- /** Checks determinísticos — sem LLM, pra o Opus não gastar ciclo com o mecânico. */
95
89
  function runChecks(worktree) {
96
90
  const checks = { size: checkSize(worktree) };
97
91
  for (const s of npmScripts(worktree))
@@ -111,7 +105,7 @@ function spawnEngine(job, bin, prompt, opts = {}) {
111
105
  const s = d.toString();
112
106
  out += s;
113
107
  if (opts.echo)
114
- process.stderr.write(s); // stdout fica pro JSON final
108
+ process.stderr.write(s);
115
109
  };
116
110
  child.stdout.on('data', collect);
117
111
  child.stderr.on('data', collect);
@@ -138,7 +132,6 @@ function newJob(worktree, engine) {
138
132
  startedAt: new Date().toISOString(),
139
133
  };
140
134
  }
141
- /** Prepara o job: resolve o binário e persiste. Devolve o job já falho se não achar. */
142
135
  function prepare(worktree, engine) {
143
136
  const job = newJob(worktree, engine);
144
137
  const bin = resolveEngineBin(engine);
@@ -147,7 +140,6 @@ function prepare(worktree, engine) {
147
140
  }
148
141
  return { job, bin: save(job) && bin };
149
142
  }
150
- /** Background: devolve na hora (uso do MCP, que é processo longo). */
151
143
  export function startExec(opts) {
152
144
  const p = prepare(opts.worktree, opts.engine ?? DEFAULT_ENGINE);
153
145
  if ('state' in p)
@@ -155,7 +147,6 @@ export function startExec(opts) {
155
147
  spawnEngine(p.job, p.bin, buildPrompt(opts.instruction), { onDone: () => undefined });
156
148
  return p.job;
157
149
  }
158
- /** Bloqueante: aguarda o fim (uso do CLI, que é processo curto). `echo` streama pro stderr. */
159
150
  export function runExec(opts) {
160
151
  return new Promise((resolve) => {
161
152
  const p = prepare(opts.worktree, opts.engine ?? DEFAULT_ENGINE);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec-delegate.js","sourceRoot":"","sources":["../../../src/lib/exec/exec-delegate.ts"],"names":[],"mappings":"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"}
@@ -2,16 +2,10 @@ import { existsSync } from 'node:fs';
2
2
  import { spawnSync } from 'node:child_process';
3
3
  import { homedir } from 'node:os';
4
4
  import { join } from 'node:path';
5
- import { envName } from '../brand.js';
6
- /**
7
- * Registro central dos engines da delegação headless. É o **único** lugar que conhece
8
- * nome de binário, candidatos de PATH e flags. Adicionar engine = adicionar uma entrada.
9
- */
5
+ import { envName } from '../../brand.js';
10
6
  export const ENGINES = ['codex', 'claude'];
11
7
  export const DEFAULT_ENGINE = 'codex';
12
- /** Planejar pede raciocínio; executar pede velocidade — daí o default por verbo. */
13
8
  export const PLAN_ENGINE = 'claude';
14
- // O MCP é spawnado por app GUI, com PATH mínimo — daí a busca em locais conhecidos.
15
9
  function knownPaths(bin, ...extra) {
16
10
  return [
17
11
  join(homedir(), '.local', 'bin', bin),
@@ -41,7 +35,6 @@ const SPECS = {
41
35
  export function isEngine(value) {
42
36
  return typeof value === 'string' && ENGINES.includes(value);
43
37
  }
44
- /** Normaliza o valor pedido; ausente → default do verbo; inválido → `null` (o caller reporta). */
45
38
  export function parseEngine(value, fallback = DEFAULT_ENGINE) {
46
39
  if (value === undefined || value === null || value === '')
47
40
  return fallback;
@@ -50,7 +43,6 @@ export function parseEngine(value, fallback = DEFAULT_ENGINE) {
50
43
  export function engineMissingError(engine) {
51
44
  return SPECS[engine].missing;
52
45
  }
53
- /** Args headless do engine; `NIO_<ENGINE>_ARGS` sobrescreve (prompt vai no fim). */
54
46
  export function engineArgs(engine, prompt) {
55
47
  const spec = SPECS[engine];
56
48
  const override = process.env[spec.argsEnv];
@@ -58,7 +50,6 @@ export function engineArgs(engine, prompt) {
58
50
  return [...override.trim().split(/\s+/), prompt];
59
51
  return spec.args(prompt);
60
52
  }
61
- /** Acha o binário: override de env, depois PATH, depois os candidatos conhecidos. */
62
53
  export function resolveEngineBin(engine) {
63
54
  const spec = SPECS[engine];
64
55
  const override = process.env[spec.binEnv];
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec-engines.js","sourceRoot":"","sources":["../../../src/lib/exec/exec-engines.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,7 @@ import { spawn } from 'node:child_process';
2
2
  import { readFileSync, renameSync, writeFileSync } from 'node:fs';
3
3
  import { join } from 'node:path';
4
4
  import { PLAN_ENGINE, engineArgs, engineMissingError, resolveEngineBin, } from './exec-engines.js';
5
- import { HARNESS_RULES_REL } from './harness.js';
6
- /** Semente pré-SDD: estrutura mínima pro engine preencher na primeira rodada. */
5
+ import { HARNESS_RULES_REL } from '../clients/harness.js';
7
6
  export const PLAN_TEMPLATE = [
8
7
  '# Plano',
9
8
  '',
@@ -25,7 +24,6 @@ export const PLAN_TEMPLATE = [
25
24
  export function planPath(project) {
26
25
  return join(project, 'plan.md');
27
26
  }
28
- /** Base do refino: conteúdo atual do `plan.md`, ou o template quando ainda não existe. */
29
27
  export function planBase(project) {
30
28
  try {
31
29
  const current = readFileSync(planPath(project), 'utf8');
@@ -35,7 +33,6 @@ export function planBase(project) {
35
33
  return PLAN_TEMPLATE;
36
34
  }
37
35
  }
38
- /** Preâmbulo de planejamento: ancora no harness e proíbe explicitamente escrever código. */
39
36
  export function buildPlanPrompt(instruction, base) {
40
37
  return [
41
38
  'Você está RASCUNHANDO/REFINANDO um plano — não implemente nada.',
@@ -51,13 +48,11 @@ export function buildPlanPrompt(instruction, base) {
51
48
  base,
52
49
  ].join('\n');
53
50
  }
54
- /** O engine às vezes embrulha a resposta em ```markdown — o arquivo não quer a cerca. */
55
51
  export function stripFence(text) {
56
52
  const t = text.trim();
57
53
  const m = /^```[a-zA-Z]*\n([\s\S]*?)\n?```$/.exec(t);
58
54
  return (m ? m[1] : t).trim();
59
55
  }
60
- /** Write-then-rename: o plano anterior sobrevive até a escrita concluir. */
61
56
  function writeAtomic(project, content) {
62
57
  const target = planPath(project);
63
58
  const tmp = `${target}.tmp`;
@@ -88,7 +83,6 @@ function spawnPlan(bin, engine, prompt, project, echo) {
88
83
  });
89
84
  });
90
85
  }
91
- /** Bloqueante: roda o engine pensante e escreve o `plan.md`. `echo` streama log no stderr. */
92
86
  export function runPlan(opts) {
93
87
  const engine = opts.engine ?? PLAN_ENGINE;
94
88
  const bin = resolveEngineBin(engine);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-delegate.js","sourceRoot":"","sources":["../../../src/lib/exec/plan-delegate.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,11 @@
1
1
  import { spawn } from 'node:child_process';
2
- import { brand } from '../brand.js';
2
+ import { brand } from '../../brand.js';
3
3
  import { readFileSync } from 'node:fs';
4
4
  import { planPath, stripFence } from './plan-delegate.js';
5
5
  import { PLAN_ENGINE, engineArgs, engineMissingError, resolveEngineBin, } from './exec-engines.js';
6
- import { HARNESS_RULES_REL } from './harness.js';
6
+ import { HARNESS_RULES_REL } from '../clients/harness.js';
7
7
  const SLUG_MAX = 50;
8
8
  const SLUG_FALLBACK = 'plan';
9
- /** Slug git-safe do título do plano p/ o Studio nomear o worktree; degenerado → fallback. Puro. */
10
9
  export function suggestSlug(plan) {
11
10
  const heading = /^#{1,6}\s+(.+?)\s*$/m.exec(plan)?.[1];
12
11
  const title = (heading ?? plan.split('\n').find((l) => l.trim()) ?? '').trim();
@@ -23,14 +22,12 @@ export function suggestSlug(plan) {
23
22
  export function planMissingError(project) {
24
23
  return `plan.md não encontrado em ${project} — rode \`${brand.name} plan\` antes de validar`;
25
24
  }
26
- /** Lê o `plan.md` da raiz; ausente/vazio dispara — o caller vira em erro tratado. */
27
25
  export function readPlan(project) {
28
26
  const content = readFileSync(planPath(project), 'utf8');
29
27
  if (!content.trim())
30
28
  throw new Error('plan.md vazio');
31
29
  return content;
32
30
  }
33
- /** Preâmbulo de triagem: ancora no harness e pede veredito + justificativa parseáveis. */
34
31
  export function buildValidatePrompt(plan) {
35
32
  return [
36
33
  'Você está TRIANDO um plano — não implemente nada, não escreva código, não edite arquivos.',
@@ -47,7 +44,6 @@ export function buildValidatePrompt(plan) {
47
44
  plan,
48
45
  ].join('\n');
49
46
  }
50
- /** Normaliza a resposta do engine em `{ needsSpec, reason }`; ambíguo → dispara. */
51
47
  export function parseVerdict(text) {
52
48
  const clean = stripFence(text);
53
49
  const m = /^[ \t]*VERDICT:[ \t]*(yes|no)\b[ \t]*(.*)$/im.exec(clean);
@@ -86,7 +82,6 @@ function spawnValidate(bin, engine, prompt, project, echo) {
86
82
  });
87
83
  });
88
84
  }
89
- /** Bloqueante: lê o plano, roda o engine pensante e devolve o veredito. `echo` streama log. */
90
85
  export async function runValidatePlan(opts) {
91
86
  const engine = opts.engine ?? PLAN_ENGINE;
92
87
  let plan;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-plan-delegate.js","sourceRoot":"","sources":["../../../src/lib/exec/validate-plan-delegate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { join } from 'node:path';
4
+ import { env } from '../brand.js';
5
+ import { dockerAvailable, portOpen } from './docker.js';
6
+ import { dlog } from './debug.js';
7
+ export const HEADROOM_PORT = Number(env('HEADROOM_PORT')?.trim()) || 8787;
8
+ export const HEADROOM_URL = env('HEADROOM_URL')?.trim() || `http://127.0.0.1:${HEADROOM_PORT}/v1`;
9
+ export const HEADROOM_URL_CONTAINER = `http://host.docker.internal:${HEADROOM_PORT}/v1`;
10
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
11
+ export function headroomComposePath() {
12
+ return join(fileURLToPath(new URL('../..', import.meta.url)), 'headroom', 'docker-compose.yml');
13
+ }
14
+ export function headroomHealthy() {
15
+ return portOpen(HEADROOM_PORT);
16
+ }
17
+ export async function ensureHeadroomRunning() {
18
+ if (await headroomHealthy())
19
+ return { ok: true, started: false };
20
+ if (!dockerAvailable()) {
21
+ return {
22
+ ok: false,
23
+ started: false,
24
+ error: 'Docker não encontrado (ou `docker compose` indisponível). O Headroom roda em ' +
25
+ 'container e é obrigatório pro client de IA — instale/inicie o Docker Engine/Desktop.',
26
+ };
27
+ }
28
+ dlog('subindo o Headroom:', headroomComposePath());
29
+ const res = spawnSync('docker', ['compose', '-f', headroomComposePath(), 'up', '-d'], { stdio: 'ignore', env: { ...process.env, NIO_HEADROOM_PORT: String(HEADROOM_PORT) } });
30
+ if (res.status !== 0) {
31
+ return { ok: false, started: false, error: '`docker compose -f headroom/... up -d` saiu != 0.' };
32
+ }
33
+ for (let i = 0; i < 60; i++) {
34
+ await sleep(500);
35
+ if (await headroomHealthy())
36
+ return { ok: true, started: true };
37
+ }
38
+ return { ok: false, started: false, error: 'o container subiu mas o Headroom não respondeu em ~30s.' };
39
+ }
40
+ export function headroomCompose(args) {
41
+ const res = spawnSync('docker', ['compose', '-f', headroomComposePath(), ...args], { stdio: 'inherit', env: { ...process.env, NIO_HEADROOM_PORT: String(HEADROOM_PORT) } });
42
+ return res.status ?? 1;
43
+ }
44
+ //# sourceMappingURL=headroom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headroom.js","sourceRoot":"","sources":["../../src/lib/headroom.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGlC,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC;AAG1E,MAAM,CAAC,MAAM,YAAY,GACvB,GAAG,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,IAAI,oBAAoB,aAAa,KAAK,CAAC;AAGxE,MAAM,CAAC,MAAM,sBAAsB,GAAG,+BAA+B,aAAa,KAAK,CAAC;AAExF,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAGnF,MAAM,UAAU,mBAAmB;IAEjC,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC;AAClG,CAAC;AAGD,MAAM,UAAU,eAAe;IAC7B,OAAO,QAAQ,CAAC,aAAa,CAAC,CAAC;AACjC,CAAC;AAaD,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,IAAI,MAAM,eAAe,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAEjE,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,KAAK;YACd,KAAK,EACH,+EAA+E;gBAC/E,sFAAsF;SACzF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,qBAAqB,EAAE,mBAAmB,EAAE,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,SAAS,CACnB,QAAQ,EACR,CAAC,SAAS,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,EACpD,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,CACvF,CAAC;IACF,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mDAAmD,EAAE,CAAC;IACnG,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,MAAM,eAAe,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAClE,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,yDAAyD,EAAE,CAAC;AACzG,CAAC;AAGD,MAAM,UAAU,eAAe,CAAC,IAAc;IAC5C,MAAM,GAAG,GAAG,SAAS,CACnB,QAAQ,EACR,CAAC,SAAS,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,GAAG,IAAI,CAAC,EACjD,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,CACxF,CAAC;IACF,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { backupFile, readJson, writeJson } from './file-merge.js';
4
+ import { ensureGitignored } from '../config.js';
5
+ const TASK_LABEL = 'NIO';
6
+ function nioTask() {
7
+ return {
8
+ label: TASK_LABEL,
9
+ type: 'shell',
10
+ command: 'nio ai',
11
+ isBackground: true,
12
+ problemMatcher: [],
13
+ presentation: { reveal: 'always', panel: 'dedicated', focus: true, clear: true },
14
+ runOptions: { runOn: 'folderOpen' },
15
+ };
16
+ }
17
+ function mergeJson(path, patch) {
18
+ const created = !existsSync(path);
19
+ const cur = created ? {} : (readJson(path) ?? {});
20
+ if (!created)
21
+ backupFile(path);
22
+ writeJson(path, patch(cur));
23
+ return created;
24
+ }
25
+ export function writeIdeAutostartTask(projectPath) {
26
+ const dir = join(projectPath, '.vscode');
27
+ const tasksPath = join(dir, 'tasks.json');
28
+ const settingsPath = join(dir, 'settings.json');
29
+ const createdTasks = mergeJson(tasksPath, (cur) => {
30
+ const tasks = Array.isArray(cur.tasks) ? cur.tasks : [];
31
+ if (tasks.some((t) => t.label === TASK_LABEL))
32
+ return { version: '2.0.0', ...cur, tasks };
33
+ return { version: '2.0.0', ...cur, tasks: [...tasks, nioTask()] };
34
+ });
35
+ mergeJson(settingsPath, (cur) => ({ ...cur, 'task.allowAutomaticTasks': 'on' }));
36
+ if (createdTasks) {
37
+ ensureGitignored('.vscode/tasks.json', projectPath);
38
+ ensureGitignored('.vscode/settings.json', projectPath);
39
+ }
40
+ return { created: createdTasks };
41
+ }
42
+ export function removeIdeAutostartTask(projectPath) {
43
+ const tasksPath = join(projectPath, '.vscode', 'tasks.json');
44
+ if (!existsSync(tasksPath))
45
+ return;
46
+ const cur = readJson(tasksPath) ?? {};
47
+ const tasks = Array.isArray(cur.tasks) ? cur.tasks : [];
48
+ const kept = tasks.filter((t) => t.label !== TASK_LABEL);
49
+ if (kept.length === tasks.length)
50
+ return;
51
+ backupFile(tasksPath);
52
+ writeJson(tasksPath, { ...cur, tasks: kept });
53
+ }
54
+ //# sourceMappingURL=ide-tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ide-tasks.js","sourceRoot":"","sources":["../../src/lib/ide-tasks.ts"],"names":[],"mappings":"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"}