@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
package/README.md CHANGED
@@ -1,137 +1,384 @@
1
- <p align="center">
2
- <img src="https://avatars.githubusercontent.com/u/241520827?s=48&v=4" alt="nio" width="80" height="80" />
3
- </p>
1
+ # NIO-CLI
4
2
 
5
- <h1 align="center">nio-cli</h1>
3
+ **Orquestrador de ambientes de desenvolvimento.** Você escolhe um perfil,
4
+ responde um wizard, e a CLI — com auxílio de IA via MCP — materializa o ambiente:
5
+ toolchains, linguagens, frameworks, dotfiles, aliases e IDE. A entidade central é
6
+ a **Sessão**: um ambiente isolado, com UUID, persistido no Postgres.
6
7
 
7
- MCP server + CLI pra controlar o **NIO** (Nucleo Operacional de Inteligência) a partir do Claude Code, Codex CLI e GitHub Copilot.
8
+ > Documentação completa no terminal ou como página: `nio docs` · `nio docs --html --open`.
8
9
 
9
- ## O que faz
10
+ ---
10
11
 
11
- Permite ao assistente de IA:
12
+ ## Como funciona
12
13
 
13
- - Ler contexto do projeto (membros, sprint ativa, repositórios vinculados)
14
- - Listar, criar, atualizar, mover entre colunas e comentar tarefas
15
- - Bater ponto e cronometrar tempo em tarefas específicas
14
+ ```
15
+ você → nio (CLI) ──► nio-gateway ──► Postgres (login: senha + JWT, fator opcional)
16
+
17
+ ├──► SessionManager / EnvironmentBuilder (materializa toolchains, MCPs, dotfiles)
18
+
19
+ └──► opencode.json ──► OpenCode (operador de IA)
20
+ └── MCP `nio` (tools nio_*) ──► SessionManager ──► Postgres
21
+ ```
22
+
23
+ 1. **Você se autentica** (`nio register` / `nio login`). O `nio-gateway` — um
24
+ serviço HTTP loopback — verifica a senha (argon2id), dispara o 2º fator se
25
+ estiver ativo, e devolve um **JWT** salvo em `~/.nio/session.json`.
26
+ 2. **Você monta uma sessão** (`nio init`). O wizard pergunta perfil + recipe, e o
27
+ `EnvironmentBuilder` garante os toolchains, resolve os MCPs e grava o `config`
28
+ materializado na linha `sessions` do Postgres. A sessão é isolada, tem UUID e
29
+ pode ser reativada depois (`nio sessions`).
30
+ 3. **`nio ai` abre a interface NIO** — o Headroom (proxy de compressão, container
31
+ Docker, obrigatório), o `opencode serve` headless (`opencode/big-pickle`, MCP
32
+ `nio` + MCPs do perfil), e a UI do NIO em Ink (chat, sidebar, paleta `/`). Com
33
+ IDE, roda num terminal integrado dela. A partir daí o agente tem as tools
34
+ `nio_*` — criar/ativar sessão, re-materializar ambiente, delegar execução.
35
+
36
+ O **Postgres é a fonte da verdade** do domínio (usuários, sessões, trilha de
37
+ auth). A CLI e o gateway só falam com o banco que **você** configurar — não há
38
+ default, não há banco embutido.
39
+
40
+ ---
16
41
 
17
- ## Instalação (mac / linux / windows)
42
+ ## Instalação
18
43
 
19
- Precisa apenas de **Node.js 20+**. Instala como pacote global:
44
+ Precisa de **Node.js 20.12+**. Instala como pacote global:
20
45
 
21
46
  ```bash
22
47
  npm i -g @nio-cli/cli
23
48
  ```
24
49
 
25
- Pronto. Os comandos `nio` (CLI) e `nio-cli` (servidor MCP) ficam disponíveis no PATH em qualquer SO.
50
+ Ficam no PATH: `nio` (CLI), `nio-gateway` (serviço de auth), `nio-cli` e
51
+ `nio-lang` (servidores MCP).
52
+
53
+ ### Pré-requisitos de runtime
54
+
55
+ | Requisito | Pra quê | Como |
56
+ |---|---|---|
57
+ | **PostgreSQL** alcançável | fonte da verdade (sessões, usuários) | schema em `db/schema.sql` aplicado uma vez |
58
+ | **`JWT_SECRET`** (segredo do time) | assinar/validar as sessões | mesmo valor em toda máquina |
59
+ | **OpenCode** | operador de IA | o `nio init` oferece instalar (`npm i -g opencode-ai`) |
60
+ | **Docker** | obrigatório pro `nio ai` — roda o Headroom (proxy de compressão) | `docker compose version` |
61
+ | *(opcional)* provedor de SMS | 2º fator | `SMS_ENDPOINT_URL` + `SMS_AUTH_HEADER` + `SMS_BODY_TEMPLATE` |
62
+
63
+ ---
64
+
65
+ ## Configuração
66
+
67
+ **Você não precisa exportar nada no shell.** Rode `nio config setup` — o wizard
68
+ pede o `NIO_DATABASE_URL` (que o time te passa) e o `JWT_SECRET`, **testa a
69
+ conexão** e grava em `~/.nio/config.env` (chmod 600, nunca commitado). O `nio init`,
70
+ `nio register` e `nio login` disparam esse wizard sozinhos se a config faltar; se
71
+ estiver presente mas errada, param com uma mensagem dizendo exatamente o quê.
72
+
73
+ ```bash
74
+ nio config setup # wizard interativo (cola os valores, testa, salva)
75
+ nio config check # confere: completa? banco responde? (--json pra CI)
76
+ nio config path # ~/.nio/config.env
77
+ ```
78
+
79
+ A CLI carrega as variáveis nesta precedência (shell sempre vence os arquivos):
80
+
81
+ ```
82
+ env do shell > $NIO_ENV_FILE > ./.env > ~/.nio/config.env
83
+ ```
84
+
85
+ Conteúdo de `~/.nio/config.env` (o wizard gera; dá pra editar à mão):
86
+
87
+ ```bash
88
+ NIO_DATABASE_URL=postgres://usuario:senha@HOST:5432/nio_cli
89
+ # NIO_DATABASE_SSL=true # só se o banco exigir TLS (gerenciado/nuvem)
90
+ JWT_SECRET=<mesmo-valor-do-time>
91
+
92
+ # 2º fator (SMS) — opcional, só no lado do gateway
93
+ # SMS_ENDPOINT_URL=https://api.provedor.com/v2/sms
94
+ # SMS_AUTH_HEADER=X-API-TOKEN: seu-token
95
+ # SMS_BODY_TEMPLATE={"to":"{to}","message":"{text}"}
96
+ ```
97
+
98
+ > Alternativa pra time: gere o `~/.nio/config.env` uma vez e distribua o arquivo
99
+ > (é só `KEY=value`) — a CLI valida no primeiro comando.
100
+
101
+ | Variável | Prefixo | Lida por |
102
+ |---|---|---|
103
+ | `NIO_DATABASE_URL` / `NIO_DATABASE_SSL` | `NIO_` | tudo que toca o banco |
104
+ | `JWT_SECRET` / `JWT_EXPIRES_IN` | **sem** prefixo (segredo do time) | `nio-gateway` + `nio-cli` |
105
+ | `SMS_ENDPOINT_URL` / `SMS_AUTH_HEADER` / `SMS_BODY_TEMPLATE` / `SMS_FROM` | **sem** prefixo | `nio-gateway` |
106
+ | `NIO_GATEWAY_HOST` (default `127.0.0.1`) | `NIO_` | `nio-gateway` — `0.0.0.0` p/ Kong em container |
107
+ | `NIO_GATEWAY_URL` (default `http://127.0.0.1:3000`) | `NIO_` | a CLI acha o nio-gateway (Kong na frente = aponta :8000) |
108
+
109
+ O schema de conexão é sempre `postgres://…`; um destino inválido falha explícito,
110
+ nunca cai num default silencioso.
111
+
112
+ ---
113
+
114
+ ## Primeiros passos
115
+
116
+ Um comando só:
117
+
118
+ ```bash
119
+ nio # (ou `nio start`) — a esteira guiada
120
+ ```
121
+
122
+ A esteira detecta em que ponto você está e conduz — **config → gateway → login →
123
+ sessão → handoff pro OpenCode** —, perguntando antes de cada passo. Ela sobe o
124
+ `nio-gateway` sozinha se faltar. Se você sair no meio, ela imprime a linha exata
125
+ pra retomar (`nio start`); nada morre no silêncio.
126
+
127
+ Por dentro, é isto (cada um roda na mão também):
128
+
129
+ ```bash
130
+ nio config setup # cola NIO_DATABASE_URL + JWT_SECRET (o time te passa), testa, salva
131
+ nio-gateway # gateway de auth (a esteira sobe sozinha se faltar)
132
+ nio register # cria seu usuário na base compartilhada → cai no login
133
+ nio login # autentica (salva o JWT em ~/.nio/session.json)
134
+ nio security enable-2fa # (opcional) 2º fator
135
+ nio init # monta o ambiente da sessão → `nio ai` (Headroom + OpenCode, num terminal da IDE)
136
+ ```
137
+
138
+ O `nio-gateway` só é necessário pros comandos de auth (`login`/`logout`/
139
+ `verify-2fa`/`security`). Todo o resto — `init`, `sessions`, as tools MCP —
140
+ fala com o Postgres direto usando o JWT local. Rode `nio debug` a qualquer
141
+ momento pra ver o que está ok e o que falta.
142
+
143
+ ---
144
+
145
+ ## Arquitetura
146
+
147
+ Hexagonal. O núcleo não conhece IO; os adapters implementam os contratos.
148
+
149
+ ```
150
+ entrypoints: src/cli.ts (nio) src/gateway/index.ts (nio-gateway)
151
+ src/mcp-server.ts (nio-cli) src/mcp-server-lang.ts (nio-lang)
152
+ app: SessionManager · EnvironmentBuilder · DependencyWatcher · DockerManager
153
+ core/: types.ts (entidades + enums) + ports por domínio, sem IO:
154
+ repositories.ts · environment.ts · docker.ts · messaging.ts · lang.ts
155
+ adapters/: pg/ (Postgres) ide/ (vscode) pkg/ (npm,pip,…) docker/ sms/ skills/ lang/
156
+ profiles/: catálogo dos 6 perfis (fixos no fonte)
157
+ ```
158
+
159
+ - **Runtime:** Node 20.12+ é o alvo. Bun roda o projeto em dev, mas **nada**
160
+ depende de API exclusiva do Bun — só as equivalentes de `node:*`.
161
+ - **Build:** `tsc` puro → `dist/`. Sem bundler.
162
+ - **Banco:** `pg` + um `Pool` único (`src/adapters/pg/client.ts`). Sem Supabase,
163
+ sem PostgREST, sem `Bun.sql`.
164
+ - **Gateway:** `http.createServer` nativo, loopback, atrás do Kong OSS (opcional,
165
+ pra rate-limiting). JWT HS256, `jti` = id da `auth_session`. Trilha de auth em
166
+ stderr estruturado — nunca a senha nem o OTP em texto puro.
167
+ - **Contrato "nunca lança"** nos ports de IO (`ToolchainGateway`, `IdeGateway`,
168
+ `DockerGateway`, `SmsSender`): falha vira um resultado `{ status, error? }`.
169
+
170
+ Detalhes: [`docs/arch/`](docs/arch/) (uma `ARQUITETURA-*.md` por camada) e os
171
+ [ADRs](docs/adr/). Histórico cronológico: [`docs/PROGRESSO.md`](docs/PROGRESSO.md).
26
172
 
27
- ## Configurar em qualquer repo
173
+ ### Perfis
28
174
 
29
- Na raiz do repositório:
175
+ Fixos no fonte (`src/core/types.ts`) — novos perfis só entram alterando o código:
176
+
177
+ `fullstack` · `analyst` · `scientist` · `dba` · `qa` · `bi`
178
+
179
+ ---
180
+
181
+ ## Autenticação
30
182
 
31
183
  ```bash
32
- nio init
184
+ nio register # cria o usuário (user_cli), senha com hash argon2id
185
+ nio login # autentica via nio-gateway e salva o JWT em ~/.nio/session.json
186
+ nio whoami # mostra quem está logado (--json pra saída estável)
187
+ nio logout # revoga a auth_session no banco e limpa a sessão local
33
188
  ```
34
189
 
35
- Esse único comando faz tudo:
190
+ ### fator (SMS)
36
191
 
37
- 1. Pede o seu **PAT** do NOS se você ainda não está autenticado (fluxo de geração em migração — ver `docs/specs/auth/0002-cli-native-login.md`).
38
- 2. Lista os projetos do NOS e você escolhe um (ou cola o UUID).
39
- 3. (Opcional) Escolhe o repositório vinculado.
40
- 4. Escreve `nio.json` na raiz **e o adiciona ao `.gitignore`** (binding local, não versionado).
41
- 5. Mostra o contexto carregado pra você validar.
42
- 6. Pergunta quais clientes MCP configurar global ou por-repo.
192
+ Opt-in por conta. Com `auth_2` ativo, o `nio login` pede um código de 6 dígitos
193
+ por SMS; se o SMS não chega, vale um dos 10 **códigos de backup** (mostrados uma
194
+ vez no `enable-2fa`).
195
+
196
+ ```bash
197
+ nio security enable-2fa # cadastra o celular, confirma via SMS, mostra os backups
198
+ nio security status # ativo? número (mascarado)? quantos backups restam?
199
+ nio security disable-2fa
200
+ nio security regenerate-backup-codes
201
+ ```
43
202
 
44
- Reinicie o cliente de IA depois pra carregar as tools.
203
+ O gateway gera/valida o OTP em processo (sem Twilio, sem broker), guarda só o
204
+ **HMAC** do código (TTL 5 min, 3 tentativas, uso único) e manda o SMS por um
205
+ **adapter HTTP genérico**. Sem `SMS_ENDPOINT_URL` no ambiente, o login com
206
+ `auth_2` responde `503 "2FA não configurado"` — o login de 1 fator segue normal.
207
+ Detalhes: [spec 0004](docs/specs/auth/0004-login-2fa-sms-otp.md) ·
208
+ [ADR 0006](docs/adr/0006-2fa-sms-otp.md) ·
209
+ [`docs/arch/ARQUITETURA-GATEWAY.md`](docs/arch/ARQUITETURA-GATEWAY.md).
210
+
211
+ Pra testar sem SMS real, o repo traz um mock: `bun run dev:sms-echo` sobe um
212
+ endpoint local que imprime o código no terminal (aponte `SMS_ENDPOINT_URL` pra ele).
213
+
214
+ ---
215
+
216
+ ## Operador de IA (`nio ai`)
217
+
218
+ No fim do `nio init` a CLI sobe o **client de IA** da sessão — e o mesmo `nio ai`
219
+ retoma a qualquer momento. Ele:
220
+
221
+ 1. **Sobe o Headroom** — proxy de compressão de contexto em container Docker
222
+ (`headroom/docker-compose.yml`), **obrigatório** ([ADR 0007](docs/adr/0007-headroom-proxy-obrigatorio.md)).
223
+ Sem Docker, `nio ai` para com erro acionável (o `nio init` não morre — materializa
224
+ o ambiente e deixa a linha `nio ai` pra retomar). Manual: `nio docker headroom {up,down,status}`.
225
+ 2. **Aponta o provider pro Headroom** — grava `provider.opencode.options.baseURL`
226
+ no `~/.config/opencode/opencode.json` (junto do `model: opencode/big-pickle`,
227
+ do MCP `nio` e dos MCPs do perfil).
228
+ 3. **Sobe o `opencode serve` headless e abre a interface NIO** (Ink — chat
229
+ streamado, sidebar verde, paleta `/` com os comandos e capacidades do NIO). O
230
+ motor é o `opencode/big-pickle`; a casca é nossa. Se a sessão tem IDE (VS Code /
231
+ Cursor), o `nio init` grava um `.vscode/tasks.json` (task `NIO`, `runOn: folderOpen`)
232
+ e o `nio ai` sobe num **terminal integrado da IDE** — uma superfície, não duas.
233
+ Sem IDE, roda no terminal atual. Sem TTY / sem `opencode` → cai na TUI do OpenCode.
234
+
235
+ Ver [`docs/arch/ARQUITETURA-CLIENTE-IA.md`](docs/arch/ARQUITETURA-CLIENTE-IA.md) e
236
+ [`docs/arch/ARQUITETURA-CLIENTE-TUI.md`](docs/arch/ARQUITETURA-CLIENTE-TUI.md).
237
+
238
+ > A interface NIO (Ink) está na **fatia 2a** ([ADR 0008](docs/adr/0008-interface-nio-ink.md)).
239
+ > A paridade completa com o OpenCode (diff viewer, file tree, seletor de modelo…) é a 2b.
240
+ > Multi-cliente (OpenCode | Codex) e o ladder de failover entre modelos seguem
241
+ > parkeados em
242
+ > [`docs/arch/ARQUITETURA-CLIENTES-MULTI-FUTURO.md`](docs/arch/ARQUITETURA-CLIENTES-MULTI-FUTURO.md)
243
+ > ([ADR 0004](docs/adr/0004-operador-ia-unico.md)).
244
+
245
+ ---
45
246
 
46
247
  ## Comandos do CLI
47
248
 
48
- Operações do CLI, **sem o binário na frente** (declarado no cabeçalho da tabela). Tabela
49
- gerada da fonte por `bun run gen:docs`.
249
+ Operações do CLI, **sem o binário na frente** (declarado no cabeçalho da tabela).
250
+ Gerada da fonte por `npm run gen:docs`. Ajuda de qualquer comando: `nio <cmd> --help`.
50
251
 
51
252
  <!-- COMMANDS:START -->
52
- <!-- gerado por `bun run gen:docs` — não edite à mão. binário `nio`, 13 comandos. -->
253
+ <!-- gerado por `bun run gen:docs` — não edite à mão. binário `nio`, 42 comandos. -->
53
254
 
54
255
  | Comando | Descrição |
55
256
  | --- | --- |
257
+ | `ai` | Abre a interface NIO da sessão ativa (Headroom + opencode serve + Ink) |
258
+ | `ai status` | Estado do Headroom (proxy obrigatório do client de IA) |
56
259
  | `clean-legacy` | Remove commands/skills legados (substituídos) de ~/.claude e ~/.codex |
57
260
  | `completion [shell]` | Imprime o script de autocomplete (bash\|zsh\|fish). |
261
+ | `config` | Config compartilhada da equipe (~/.nio/config.env) |
262
+ | `config check` | Confere se a config está completa e o Postgres responde |
263
+ | `config path` | Imprime o caminho do arquivo de config |
264
+ | `config setup` | Wizard: cola os valores do time, testa a conexão e salva |
265
+ | `docker` | Camada Docker: MCP Gateway + Portainer, compose, debug e cluster (Swarm) |
266
+ | `docker cluster <action> [arg]` | Docker Swarm — stack `nio-cluster` (up\|down\|status\|scale) |
267
+ | `docker compose <action> [service]` | Wrapper sobre `docker compose` do projeto (up\|down\|restart\|ps\|logs) |
268
+ | `docker create` | Cria e sobe um container (wizard ou flags) |
269
+ | `docker debug [container]` | Coleta o contexto de um container e entrega o diagnóstico pro operador de IA |
270
+ | `docker headroom` | Proxy de compressão de contexto — obrigatório pro `nio ai` (ADR 0007) |
271
+ | `docker headroom down` | Derruba o container do Headroom |
272
+ | `docker headroom status` | O Headroom está no ar? |
273
+ | `docker headroom up` | Sobe o container do Headroom |
274
+ | `docker orquest [instruction]` | Orquestra os serviços do projeto via compose, dirigido pelo operador (linguagem natural) |
275
+ | `docker portainer` | Abre o Portainer no navegador |
276
+ | `docker toolkit` | Infra NIO: Docker MCP Gateway + Portainer (docker/docker-compose.yml) |
277
+ | `docker toolkit down` | Derruba a infra e desabilita o MCP no opencode.json |
278
+ | `docker toolkit status` | Estado dos containers + health dos endpoints |
279
+ | `docker toolkit up` | Sobe a infra e registra o gateway no opencode.json |
280
+ | `docs` | Documentação completa da CLI (terminal ou página com --html) |
58
281
  | `exec` | Delega a implementação a um agente headless num worktree e aguarda. |
59
282
  | `exec-status <jobId>` | Estado de um job de execução (`nio exec`), em JSON |
60
- | `init` | Cria nio.json no diretório atual vinculando a um projeto do NOS |
61
- | `login [pat]` | Salva o token de acesso pessoal (PAT) localmente |
62
- | `logout` | Remove credenciais locais |
283
+ | `init` | Cria nio.json no diretório atual e materializa o ambiente da sessão |
284
+ | `login` | Autentica via nio-gateway (túnel HTTP) e salva a sessão localmente (JWT) |
285
+ | `logout` | Encerra a sessão local e revoga a auth_session no banco |
63
286
  | `plan` | Roda o engine pensante sobre o projeto e escreve/refina o plan.md da raiz. |
287
+ | `register` | Cria um novo usuário no banco (user_cli) e já entra (login) |
288
+ | `security` | 2º fator do login (SMS OTP + códigos de backup) |
289
+ | `security disable-2fa` | Desativa o 2º fator |
290
+ | `security enable-2fa` | Ativa o 2º fator via SMS |
291
+ | `security regenerate-backup-codes` | Invalida os códigos de backup e gera 10 novos |
292
+ | `security status` | Mostra o estado do 2º fator |
64
293
  | `skills` | Skills, commands e agents do nio (lidos do repo aberto via cache) |
65
294
  | `skills status` | Lista os docs do repo de skills (cache local ~/.nio/skills) |
295
+ | `start` | Conduz a esteira: config → gateway → login → sessão → OpenCode |
66
296
  | `sync` | Instala/atualiza skills, commands e agents nos clientes configurados, a partir do bundle (idempotente); checa atualização do pacote |
67
297
  | `validate-plan` | Lê o plan.md da raiz e roda o engine pensante para julgar se o plano precisa de uma spec antes de implementar. |
68
298
  | `whoami` | Mostra o usuário autenticado |
69
299
  <!-- COMMANDS:END -->
70
300
 
301
+ ### Diagnóstico da própria CLI
302
+
303
+ ```bash
304
+ nio debug # bateria de checagens: nio.json, login, Postgres, sessão ativa,
305
+ # OpenCode no PATH, cache de skills — ✓ / ⚠ / ✗ com dica em cada
306
+ nio docs # documentação completa no terminal
307
+ nio docs --html # a mesma coisa como página (arte); --open abre no navegador
308
+ ```
309
+
71
310
  ### Autocomplete (tab)
72
311
 
73
- O `nio init` **oferece** ativar, e o `nio sync` **valida** e prompta se faltar. Pra
74
- ativar à mão, adicione ao rc do seu shell:
312
+ O `nio init` **oferece** ativar; o `nio sync` **valida** e prompta se faltar. À mão:
75
313
 
76
314
  ```bash
77
- # zsh (~/.zshrc)
78
- eval "$(nio completion zsh)"
79
- # bash (~/.bashrc)
80
- eval "$(nio completion bash)"
81
- # fish (~/.config/fish/config.fish)
82
- nio completion fish | source
315
+ eval "$(nio completion zsh)" # ~/.zshrc
316
+ eval "$(nio completion bash)" # ~/.bashrc
317
+ nio completion fish | source # ~/.config/fish/config.fish
83
318
  ```
84
319
 
85
- Recarregue o shell e `nio <tab>` passa a sugerir comandos, subcomandos e flags.
320
+ ---
86
321
 
87
- ## Tools disponíveis
322
+ ## Docker (`nio docker`)
88
323
 
89
- Operações do MCP, com o nome **sem o prefixo** (declarado por grupo — o prefixo vem de
90
- `src/brand.ts`). Tabela gerada da fonte por `bun run gen:docs`.
324
+ Camada de gerência de container metade wrapper determinístico sobre `docker`,
325
+ metade dirigida pelo operador de IA em linguagem natural (via o **Docker MCP
326
+ Gateway**). Roda em qualquer Docker Engine (não exige Docker Desktop). Ver
327
+ [`docs/arch/ARQUITETURA-DOCKER.md`](docs/arch/ARQUITETURA-DOCKER.md) ·
328
+ [ADR 0005](docs/adr/0005-camada-docker.md).
91
329
 
92
- <!-- TOOLS:START -->
93
- <!-- gerado por `bun run gen:docs` não edite à mão. 20 tools. -->
330
+ ```bash
331
+ nio docker toolkit up # sobe o MCP Gateway (127.0.0.1:8811/mcp) + Portainer (9443)
332
+ # e registra o gateway no opencode.json
333
+ nio docker compose up -f app/docker-compose.yml # wrapper sobre `docker compose` do projeto
334
+ nio docker create --image redis:7 --port 6379:6379
335
+ nio docker debug <container> # coleta ps/logs/inspect → operador analisa e propõe o fix
336
+ nio docker orquest "sobe api + worker + redis" # operador gera o compose e sobe (--dry-run mostra)
337
+ nio docker cluster up "api + worker + redis + postgres" # Docker Swarm (stack `nio-cluster`)
338
+ nio docker cluster status | scale api=3
339
+ nio docker portainer # abre a UI
340
+ ```
94
341
 
95
- ### Tools de produto prefixo `nos_`
342
+ `debug`/`orquest`/`cluster` exigem `nio login` + sessão ativa + `opencode` no
343
+ PATH. O estado do cluster fica em `sessions.config` (Postgres), validado contra
344
+ `docker stack services`.
96
345
 
97
- | Operação | O que faz |
98
- | --- | --- |
99
- | `comment_task` | Adiciona um comentário em uma tarefa. |
100
- | `create_task` | Cria uma nova tarefa no projeto atual. |
101
- | `end_allocation` | [ENCERRA O DIA] Bate ponto de SAÍDA do usuário e fecha qualquer task_allocation aberta. |
102
- | `end_task_allocation` | [PARA TIMER DE TASK] Para a task_allocation ativa. |
103
- | `get_active_allocation` | Retorna o estado atual de cronometragem do usuário: alocação ativa, task atual sendo cronometrada, e segmentos por task na alocação atual. |
104
- | `get_context` | Retorna o contexto completo do projeto NOS ativo: dados do projeto, repositórios, sprint ativa, membros e usuário autenticado. |
105
- | `get_task` | Retorna detalhes completos de uma tarefa: descrição, assignees, checklist, comentários, histórico recente, repositórios vinculados e labels. |
106
- | `list_my_allocations` | Lista alocações passadas do usuário (encerradas), ordenadas por data decrescente. |
107
- | `list_projects` | Lista os projetos do NOS aos quais você tem acesso. |
108
- | `list_tasks` | Lista tarefas do projeto atual, filtradas pelos parâmetros opcionais. |
109
- | `move_task` | Atalho pra mudar o status de uma tarefa (move entre colunas do Kanban). |
110
- | `record_delivery` | Registra uma ENTREGA do loop de build (um ticket concluído / PR aberto) na analítica de entrega do NOS. |
111
- | `set_project` | Define o projeto ativo da sessão (em memória, dura enquanto o servidor estiver rodando). |
112
- | `start_allocation` | Inicia uma alocação (bate o ponto) para o usuário atual. |
113
- | `start_task_allocation` | Começa a cronometrar tempo numa task específica. |
114
- | `update_task` | Atualiza campos de uma tarefa existente. |
346
+ ---
347
+
348
+ ## Tools MCP
349
+
350
+ O servidor `nio-cli` expõe as tools de ambiente v2 (todas passam pelo
351
+ `SessionManager` e exigem `nio login`):
352
+
353
+ <!-- TOOLS:START -->
354
+ <!-- gerado por `bun run gen:docs` não edite à mão. 10 tools. -->
115
355
 
116
356
  ### Tools que espelham o CLI — prefixo `nio_`
117
357
 
118
358
  | Operação | O que faz |
119
359
  | --- | --- |
120
360
  | `delegate_exec` | Delega a IMPLEMENTAÇÃO a um agente de execução novo (codex ou claude local, na assinatura — sem API) num worktree já criado pelo /implement. |
361
+ | `env_detect_deps` | Roda UM ciclo do watcher de dependências sobre a pasta da sessão: escaneia os manifests (package.json, requirements.txt, Cargo.toml), detecta o que está declarado mas não instalado e registra um evento por dependência nova (idempotente). |
362
+ | `env_materialize` | Re-materializa o ambiente de uma sessão existente a partir do seu perfil: garante os toolchains de novo, re-resolve os MCPs e reescreve o `config` em `sessions.config`. |
121
363
  | `exec_status` | Estado de uma execução delegada (`nio_delegate_exec`): running \| done \| failed, com o resumo do agente, os arquivos alterados e os checks determinísticos (tamanho, lint, build, testes). |
122
364
  | `plan` | Roda o engine PENSANTE (claude ou codex local, na assinatura — sem API) sobre a raiz do projeto e escreve/refina o `plan.md` de rascunho pré-SDD. |
365
+ | `profile_get` | Consulta o catálogo de perfis de ambiente (hardcoded na CLI). |
366
+ | `session_activate` | Ativa uma sessão de ambiente do usuário por id (o prefixo do UUID basta). |
367
+ | `session_create` | Cria uma sessão de ambiente pro usuário autenticado e materializa o perfil escolhido: garante os toolchains, resolve os MCPs e persiste o `config` em `sessions.config`. |
368
+ | `session_list` | Lista as sessões de ambiente do usuário autenticado (mais recentes primeiro), com id, nome, perfil, status e o `config` materializado. |
123
369
  | `validate_plan` | Lê o `plan.md` da raiz do projeto e roda o engine PENSANTE (claude ou codex local, na assinatura — sem API) para julgar se o plano é complexo o bastante para virar uma spec SDD antes de implementar. |
124
370
  <!-- TOOLS:END -->
125
371
 
126
- > **Escopo do projeto.** As tools de tarefa/alocação resolvem o projeto nesta ordem:
127
- > argumento `project_id` da chamada → projeto ativo da sessão (`set_project`) → default
128
- > opcional do binding de repo (`nio.json`/`NIO_PROJECT_ID`).
129
- >
130
- > O projeto ativo é **por sessão**: vive só em memória, no processo do servidor MCP, e
131
- > não é gravado em disco ao reiniciar volta ao default. No Cowork, onde não há binding
132
- > de repo, é sempre assim que se escolhe o projeto: `list_projects` → `set_project`.
133
- > (Como um processo do Claude Desktop pode ser compartilhado entre conversas, passe
134
- > `project_id` direto na chamada quando quiser garantir o escopo de uma conversa.)
372
+ ### Recipes de ambiente (repo NIO-SKILLS)
373
+
374
+ Além dos 6 perfis fixos, o repo `NIO-SKILLS-` pode carregar **recipes** em
375
+ `recipes/<slug>.md` — presets nomeados (`profile` + linguagens + frameworks +
376
+ MCPs + envVars/aliases) que **estendem** um perfil, editáveis sem release da CLI.
377
+ O `nio init` oferece a recipe depois do perfil; `nio_session_create` aceita
378
+ `{ recipe: "<slug>" }`. Merge determinístico (recipe vence em envVars/aliases;
379
+ união em linguagens/frameworks/MCPs).
380
+
381
+ ---
135
382
 
136
383
  ## Skills, commands e dependências
137
384
 
@@ -149,7 +396,7 @@ Overrides por ambiente:
149
396
  | --------------------- | ------------------------------------------------------------------ |
150
397
  | `NIO_SKILLS_DIR` | Aponta pra um checkout local do repo (dev) — vence tudo |
151
398
  | `NIO_SKILLS_REPO` | Outro `owner/repo` (default `hugoreiis12-png/NIO-SKILLS-`) |
152
- | `NOCLAF_SKILLS_REF` | Outra branch/tag (default `main`) |
399
+ | `NIO_SKILLS_REF` | Outra branch/tag (default `main`) |
153
400
 
154
401
  Cada cliente recebe no formato que entende:
155
402
 
@@ -159,7 +406,7 @@ Cada cliente recebe no formato que entende:
159
406
  | Codex CLI | `~/.codex/` | **dual-write**: cada command/skill vira uma **skill** (`skills/<id>/SKILL.md`, auto-selecionada) **e** um **custom prompt** (`prompts/<id>.md`, no menu `/prompts:<id>`) |
160
407
  | Cowork/Desktop | — | via **MCP prompts** + resources, servidos ao vivo (ignora `~/.claude`) |
161
408
 
162
- > Configurar o Codex grava `NOCLAF_CLIENT=codex` no `config.toml`, o que faz o servidor
409
+ > Configurar o Codex grava `NIO_CLIENT=codex` no `config.toml`, o que faz o servidor
163
410
  > provisionar pra `~/.codex` e filtrar os docs pelo surface `codex`. Reinicie o cliente
164
411
  > depois do sync pra carregar skills/prompts novos.
165
412
 
@@ -167,9 +414,7 @@ Cada cliente recebe no formato que entende:
167
414
  > que o app expõe como **slash-commands** no menu de conectores/"+" (ex.: digite `/` e
168
415
  > procure os itens do nio) — são **invocados manualmente**, não carregados sozinhos
169
416
  > como Agent Skills que o modelo detecta e usa por conta própria. Se não aparecerem:
170
- > feche o app de vez (Cmd+Q) e reabra, e confirme que o conector nio está conectado
171
- > (deve listar as tools `nos_*`). O processo do Cowork lê o mesmo cache `~/.nio/skills`
172
- > — se o `nio sync` populou, o conteúdo está lá.
417
+ > feche o app de vez (Cmd+Q) e reabra, e confirme que o conector nio está conectado.
173
418
 
174
419
  ### Visibilidade por cliente
175
420
 
@@ -192,59 +437,27 @@ Commands/skills podem depender de libs externas, declaradas como arquivos em
192
437
  - **instalador estruturado** (`npm:`, `skills:` = `npx skills add`, `git:`) → oferece
193
438
  rodar com `[y/N]` (comando montado a partir do campo validado, **sem shell**);
194
439
  - **`manual:`** (plugin de marketplace, passos no cliente, UI) → imprime os passos por
195
- cliente, com os comandos destacados. Ex.: o Ponytail é instalado por `/plugin` no Claude
196
- Code e `codex plugin …` + `/hooks` no Codex — a CLI não automatiza, só orienta.
197
-
198
- A string `install:` (se houver) é **só exibição** — nunca é executada.
199
-
200
- A CLI **detecta o que já está instalado** e mostra um selo verde `✓ instalada` (sem
201
- repetir descrição/passos): `npm` via `npm ls -g`, `git` pelo dir de destino, `skills`
202
- por marcador/probe. Pra deps `manual:` (plugins), declare `detect:` no frontmatter com
203
- um ou mais globs — suporta `~`, `*` e `**`, e segue symlinks (ok com dotfiles). Ex.: o
204
- Ponytail usa `detect: ~/.claude/plugins/**/ponytail`.
440
+ cliente, com os comandos destacados.
205
441
 
206
- ### Checagem de cliente
442
+ A string `install:` (se houver) é **só exibição** — nunca é executada. A CLI **detecta
443
+ o que já está instalado** e mostra um selo `✓ instalada` (via `npm ls -g`, dir de
444
+ destino, ou o `detect:` do frontmatter).
207
445
 
208
- Ao escolher um cliente no `init`, a CLI verifica se ele está de fato instalado na
209
- máquina. Se não estiver:
210
-
211
- - **CLIs** (Claude Code, Codex) → mostra e oferece rodar o instalador:
212
- `npm i -g @anthropic-ai/claude-code` · `npm i -g @openai/codex`;
213
- - **apps** (Claude Desktop/Cowork, VS Code) → mostra o link de download
214
- (ex.: https://claude.ai/download) — reabra o app depois de instalar.
446
+ ---
215
447
 
216
448
  ## Claude Desktop / Cowork
217
449
 
218
- Selecione **Cowork** na lista de clientes do `nio init` (ou rode de novo). Com o app
219
- instalado e você já logado (`nio login`), a CLI **ativa o conector direto** — escreve
220
- o `nio` no `claude_desktop_config.json` usando caminhos absolutos (`node` +
221
- `dist/mcp-server.js`) e `NOCLAF_CLIENT=cowork`. Reinicie o Claude Desktop pra carregar.
222
- O `nio sync` reafirma esse config (atualiza os paths se o node/pacote mudou de lugar).
223
-
224
- Não há projeto pra configurar: o Cowork não tem `nio.json` (sem working dir/repo),
225
- então o projeto é **escolhido por sessão** — peça pro assistente rodar `nos_list_projects`
226
- e depois `nos_set_project` com o id desejado.
450
+ Selecione **Cowork** na lista de clientes do `nio init`. Com o app instalado e você
451
+ logado (`nio login`), a CLI **ativa o conector direto** — escreve o `nio` no
452
+ `claude_desktop_config.json` com caminhos absolutos (`node` + `dist/mcp-server.js`)
453
+ e `NIO_CLIENT=cowork`. Reinicie o Claude Desktop pra carregar. O `nio sync` reafirma
454
+ esse config.
227
455
 
228
- ### Fallback: extensão `.mcpb`
456
+ **Fallback `.mcpb`:** se a escrita direta falhar, a CLI gera
457
+ `~/Downloads/nio-cli-<versão>.mcpb` e mostra os passos — Configurações → Extensões →
458
+ Configurações avançadas → "Extension Developer" → "Install Extension…".
229
459
 
230
- Se o app estiver instalado mas a escrita direta falhar, ou você não tiver login salvo, a
231
- CLI cai pro **fallback manual**: gera uma extensão `~/Downloads/nio-cli-<versão>.mcpb`
232
- e mostra os passos:
233
-
234
- **Configurações → Extensões → Configurações avançadas → seção "Extension Developer" →
235
- "Install Extension…"** → selecione o `.mcpb` → preencha **só o PAT**.
236
-
237
- Pela extensão a config não vem do `nio login`/`nio.json`, e sim do `user_config`,
238
- injetado como variável de ambiente:
239
-
240
- | Variável | Origem (`user_config`) | Sensível |
241
- | ------------ | ---------------------- | -------- |
242
- | `NOCLAF_PAT` | PAT (`noc_…`) | ✅ sim |
243
-
244
- > **Override de default (avançado, opcional).** Fora do Cowork, em CLIs de código, você
245
- > ainda pode definir `NIO_PROJECT_ID`/`NOCLAF_REPOSITORY_ID` no env do cliente MCP pra
246
- > fixar um projeto default — equivalente ao `nio.json`. O projeto da sessão
247
- > (`nos_set_project`) e o `project_id` por chamada sempre têm precedência sobre esse default.
460
+ ---
248
461
 
249
462
  ## Atualizando
250
463
 
@@ -252,29 +465,51 @@ injetado como variável de ambiente:
252
465
  npm i -g @nio-cli/cli@latest
253
466
  ```
254
467
 
255
- O `nio sync` **checa a versão publicada** no início e, se houver uma mais nova, mostra
256
- um aviso e **oferece atualizar ali mesmo** (roda `npm i -g @nio-cli/cli@latest` com sua
257
- confirmação; depois é rodar o sync de novo). Use `nio sync --yes` pra aceitar sem
258
- prompt. A CLI também avisa em background em qualquer comando (via `update-notifier`).
468
+ O `nio sync` **checa a versão publicada** no início e **oferece atualizar** ali mesmo
469
+ (com sua confirmação). `nio sync --yes` aceita sem prompt. A CLI também avisa em
470
+ background em qualquer comando (`update-notifier`).
471
+
472
+ ---
259
473
 
260
474
  ## Troubleshooting
261
475
 
262
- - **`nio-cli: command not found`** confirme o install global com `npm i -g @nio-cli/cli` e que `npm bin -g` está no PATH.
263
- - **Tools não aparecem no Claude Code** — reinicie o Claude Code depois do `nio init`. Confira com `/mcp` dentro dele.
264
- - **`Não autenticado`** — rode `nio init` (que faz login inline) ou `nio login`. No Cowork, confira se o **PAT** foi preenchido na extensão.
265
- - **`Nenhum projeto selecionado`** escolha o projeto da sessão: `nos_list_projects` `nos_set_project`. (Em CLI de código você também pode rodar `nio init` pra criar um `nio.json` default no repo.)
266
- - **Skills não aparecem no Cowork** elas chegam como **prompts MCP** (slash-commands no menu de conectores/"+"), não como skills autônomas. Feche o Claude Desktop de vez (Cmd+Q) e reabra; confirme o conector conectado (tools `nos_*` listadas).
267
- - **`Conteúdo de skills não encontrado`** — o cache `~/.nio/skills` está vazio (fetch falhou / offline). Rode `nio sync` com rede, ou defina `NIO_SKILLS_DIR` pra um checkout local. Confirme também que o repo de skills está público.
268
- - **`ENOENT mkdir` ao provisionar (dotfiles)** um symlink em `~/.claude` aponta pra um alvo inexistente. As versões atuais materializam o alvo automaticamente; se persistir, cheque o link.
269
- - **Sobraram comandos antigos** (`new-spec`, `apply-bug`, `init-sdd` como command…) rode `nio clean-legacy` (use `--dry-run` pra revisar antes) pra removê-los de `~/.claude` e `~/.codex`.
476
+ | Sintoma | Causa provável / o que fazer |
477
+ |---|---|
478
+ | `nio: command not found` | `npm i -g @nio-cli/cli` e confira `npm bin -g` no PATH |
479
+ | `Configuração necessária` / `NIO_DATABASE_URL não definida` | rode `nio config setup` (ou deixe o `nio init` abrir o wizard) |
480
+ | `Não consegui falar com o nio-gateway` | o `nio-gateway` não está no ar rode `nio-gateway &` |
481
+ | `Não autenticado` | `nio register` ( vez) e depois `nio login` |
482
+ | Erro de conexão com o banco | `ECONNREFUSED` = Postgres fora do ar / host errado; `password authentication failed` = credencial; erro de SSL = `NIO_DATABASE_SSL=true` |
483
+ | `2FA não configurado no servidor` (503) | faltam as `SMS_*` no ambiente do `nio-gateway` |
484
+ | Tools não aparecem no Claude Code | reinicie o cliente depois do `nio init`; cheque com `/mcp` |
485
+ | Skills não aparecem no Cowork | chegam como **prompts MCP** (slash-commands), não skills autônomas. Cmd+Q e reabra; confirme o conector |
486
+ | `Conteúdo de skills não encontrado` | cache `~/.nio/skills` vazio — rode `nio sync` com rede, ou `NIO_SKILLS_DIR` pra um checkout local |
487
+ | Sobraram comandos antigos | `nio clean-legacy` (`--dry-run` pra revisar antes) |
488
+
489
+ Sempre: `nio debug` mostra o estado de tudo com uma dica por item. E
490
+ `NIO_DEBUG=1 nio <cmd>` liga log verboso (`[nio:debug]` em stderr): `.env`
491
+ carregados, config resolvida, requests pro gateway, e stack trace completo nos erros.
492
+
493
+ O logo Matrix anima (chuva caindo) toda vez que aparece em terminal interativo.
494
+ `NIO_NO_ANIM=1` deixa ele sempre estático; fora de TTY (pipe/CI) já é estático.
495
+
496
+ ---
270
497
 
271
498
  ## Convenções
272
499
 
273
- - **Idioma**: UI/CLI em pt-BR. Código (variáveis, funções, tipos) em inglês.
274
- - **Backups**: qualquer escrita em arquivo de config existente gera `.bak.<timestamp>` ao lado.
500
+ - **Idioma:** UI/CLI em pt-BR. Código (variáveis, funções, tipos) em inglês.
501
+ - **Backups:** toda escrita em config existente gera `.bak.<timestamp>` ao lado.
275
502
  - **stdout reservado pro JSON-RPC** no MCP server — logs vão pra stderr.
503
+ - **Regra do hexágono:** `core/ports.ts` / `core/repositories.ts` não importam
504
+ driver de banco; os adapters (`adapters/*`) implementam os contratos.
505
+ - **Migrations:** fonte da verdade em `db/schema.sql`; deltas incrementais em
506
+ `db/migrations/NNNN_*.sql`, aplicados à mão (`psql -f`).
507
+
508
+ ---
276
509
 
277
510
  ## Versão
278
511
 
279
- v0.1.xfeature complete pra v1. Próximos passos: testes automatizados,
280
- suporte a múltiplos perfis de usuário.
512
+ **0.2.0**v1 da CLI fechada: auth (senha + 2º fator SMS), backend de sessões,
513
+ wizard de ambiente, tools MCP de ambiente, camada Docker e o gateway com Kong.
514
+ Nasceu de um cliente NOS/Supabase (v1), já removido. Histórico cronológico:
515
+ [`docs/PROGRESSO.md`](docs/PROGRESSO.md).