@nio-cli/cli 0.1.0 → 0.2.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 (382) hide show
  1. package/README.md +332 -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/dependency-watcher.js +87 -0
  39. package/dist/app/dependency-watcher.js.map +1 -0
  40. package/dist/app/docker-manager.js +110 -0
  41. package/dist/app/docker-manager.js.map +1 -0
  42. package/dist/app/environment-builder.js +73 -0
  43. package/dist/app/environment-builder.js.map +1 -0
  44. package/dist/app/language-configurator.js +30 -0
  45. package/dist/app/language-configurator.js.map +1 -0
  46. package/dist/app/session-manager.js +124 -0
  47. package/dist/app/session-manager.js.map +1 -0
  48. package/dist/brand.js +3 -61
  49. package/dist/brand.js.map +1 -1
  50. package/dist/cli/commands/agents.js +30 -0
  51. package/dist/cli/commands/agents.js.map +1 -0
  52. package/dist/cli/commands/auth.js +122 -90
  53. package/dist/cli/commands/auth.js.map +1 -1
  54. package/dist/cli/commands/clean.js +1 -13
  55. package/dist/cli/commands/clean.js.map +1 -1
  56. package/dist/cli/commands/command.js +58 -0
  57. package/dist/cli/commands/command.js.map +1 -0
  58. package/dist/cli/commands/completion.js +0 -3
  59. package/dist/cli/commands/completion.js.map +1 -1
  60. package/dist/cli/commands/config.js +41 -0
  61. package/dist/cli/commands/config.js.map +1 -0
  62. package/dist/cli/commands/debug.js +93 -0
  63. package/dist/cli/commands/debug.js.map +1 -0
  64. package/dist/cli/commands/deps.js +94 -0
  65. package/dist/cli/commands/deps.js.map +1 -0
  66. package/dist/cli/commands/docker.js +360 -0
  67. package/dist/cli/commands/docker.js.map +1 -0
  68. package/dist/cli/commands/docs/content.js +199 -0
  69. package/dist/cli/commands/docs/content.js.map +1 -0
  70. package/dist/cli/commands/docs/dynamic.js +42 -0
  71. package/dist/cli/commands/docs/dynamic.js.map +1 -0
  72. package/dist/cli/commands/docs/html.js +108 -0
  73. package/dist/cli/commands/docs/html.js.map +1 -0
  74. package/dist/cli/commands/docs/terminal.js +42 -0
  75. package/dist/cli/commands/docs/terminal.js.map +1 -0
  76. package/dist/cli/commands/docs.js +34 -0
  77. package/dist/cli/commands/docs.js.map +1 -0
  78. package/dist/cli/commands/exec.js +2 -7
  79. package/dist/cli/commands/exec.js.map +1 -1
  80. package/dist/cli/commands/init/auth-step.js +9 -45
  81. package/dist/cli/commands/init/auth-step.js.map +1 -1
  82. package/dist/cli/commands/init/clients-step.js +12 -39
  83. package/dist/cli/commands/init/clients-step.js.map +1 -1
  84. package/dist/cli/commands/init/context-step.js +7 -33
  85. package/dist/cli/commands/init/context-step.js.map +1 -1
  86. package/dist/cli/commands/init/index.js +177 -33
  87. package/dist/cli/commands/init/index.js.map +1 -1
  88. package/dist/cli/commands/init/lang-step.js +40 -0
  89. package/dist/cli/commands/init/lang-step.js.map +1 -0
  90. package/dist/cli/commands/init/profile-step.js +43 -0
  91. package/dist/cli/commands/init/profile-step.js.map +1 -0
  92. package/dist/cli/commands/init/provision-step.js +8 -23
  93. package/dist/cli/commands/init/provision-step.js.map +1 -1
  94. package/dist/cli/commands/init/recipe-step.js +18 -0
  95. package/dist/cli/commands/init/recipe-step.js.map +1 -0
  96. package/dist/cli/commands/lang.js +27 -0
  97. package/dist/cli/commands/lang.js.map +1 -0
  98. package/dist/cli/commands/open.js +51 -0
  99. package/dist/cli/commands/open.js.map +1 -0
  100. package/dist/cli/commands/plan.js +2 -6
  101. package/dist/cli/commands/plan.js.map +1 -1
  102. package/dist/cli/commands/security.js +143 -0
  103. package/dist/cli/commands/security.js.map +1 -0
  104. package/dist/cli/commands/sessions.js +92 -0
  105. package/dist/cli/commands/sessions.js.map +1 -0
  106. package/dist/cli/commands/skills.js +1 -1
  107. package/dist/cli/commands/skills.js.map +1 -1
  108. package/dist/cli/commands/sync.js +52 -58
  109. package/dist/cli/commands/sync.js.map +1 -1
  110. package/dist/cli/commands/validate-plan.js +2 -6
  111. package/dist/cli/commands/validate-plan.js.map +1 -1
  112. package/dist/cli/copy/auth.json +9 -2
  113. package/dist/cli/copy/init.json +2 -6
  114. package/dist/cli/copy.js +0 -8
  115. package/dist/cli/copy.js.map +1 -1
  116. package/dist/cli/flows/clients.js +3 -94
  117. package/dist/cli/flows/clients.js.map +1 -1
  118. package/dist/cli/flows/completion.js +1 -6
  119. package/dist/cli/flows/completion.js.map +1 -1
  120. package/dist/cli/flows/dependencies.js +1 -18
  121. package/dist/cli/flows/dependencies.js.map +1 -1
  122. package/dist/cli/flows/sections.js +2 -10
  123. package/dist/cli/flows/sections.js.map +1 -1
  124. package/dist/cli/flows/user-config.js +5 -10
  125. package/dist/cli/flows/user-config.js.map +1 -1
  126. package/dist/cli/ui/render.js +2 -53
  127. package/dist/cli/ui/render.js.map +1 -1
  128. package/dist/cli/ui/report.js +0 -13
  129. package/dist/cli/ui/report.js.map +1 -1
  130. package/dist/cli.js +23 -0
  131. package/dist/cli.js.map +1 -1
  132. package/dist/config.js +27 -56
  133. package/dist/config.js.map +1 -1
  134. package/dist/core/docker.js +2 -0
  135. package/dist/core/docker.js.map +1 -0
  136. package/dist/core/environment.js +2 -0
  137. package/dist/core/environment.js.map +1 -0
  138. package/dist/core/lang.js +11 -0
  139. package/dist/core/lang.js.map +1 -0
  140. package/dist/core/messaging.js +2 -0
  141. package/dist/core/messaging.js.map +1 -0
  142. package/dist/core/repositories.js +2 -0
  143. package/dist/core/repositories.js.map +1 -0
  144. package/dist/core/types.js +0 -5
  145. package/dist/core/types.js.map +1 -1
  146. package/dist/gateway/config.js +14 -0
  147. package/dist/gateway/config.js.map +1 -0
  148. package/dist/gateway/edge-filter.js +55 -0
  149. package/dist/gateway/edge-filter.js.map +1 -0
  150. package/dist/gateway/index.js +176 -0
  151. package/dist/gateway/index.js.map +1 -0
  152. package/dist/gateway/middleware/auth.js +34 -0
  153. package/dist/gateway/middleware/auth.js.map +1 -0
  154. package/dist/gateway/services/login.js +112 -0
  155. package/dist/gateway/services/login.js.map +1 -0
  156. package/dist/gateway/services/security.js +99 -0
  157. package/dist/gateway/services/security.js.map +1 -0
  158. package/dist/lib/auth/backup-codes.js +46 -0
  159. package/dist/lib/auth/backup-codes.js.map +1 -0
  160. package/dist/lib/auth/gateway-client.js +106 -0
  161. package/dist/lib/auth/gateway-client.js.map +1 -0
  162. package/dist/lib/auth/gateway-token.js +26 -0
  163. package/dist/lib/auth/gateway-token.js.map +1 -0
  164. package/dist/lib/auth/nio-config.js +138 -0
  165. package/dist/lib/auth/nio-config.js.map +1 -0
  166. package/dist/lib/auth/otp.js +23 -0
  167. package/dist/lib/auth/otp.js.map +1 -0
  168. package/dist/lib/auth/password.js +23 -0
  169. package/dist/lib/auth/password.js.map +1 -0
  170. package/dist/lib/auth/session-store.js +49 -0
  171. package/dist/lib/auth/session-store.js.map +1 -0
  172. package/dist/lib/clients/autopull.js +8 -0
  173. package/dist/lib/clients/autopull.js.map +1 -0
  174. package/dist/lib/{client-configs.js → clients/client-configs.js} +99 -34
  175. package/dist/lib/clients/client-configs.js.map +1 -0
  176. package/dist/lib/clients/client-install.js +20 -0
  177. package/dist/lib/clients/client-install.js.map +1 -0
  178. package/dist/lib/{harness.js → clients/harness.js} +1 -16
  179. package/dist/lib/clients/harness.js.map +1 -0
  180. package/dist/lib/{hooks.js → clients/hooks.js} +5 -31
  181. package/dist/lib/clients/hooks.js.map +1 -0
  182. package/dist/lib/{targets.js → clients/targets.js} +17 -53
  183. package/dist/lib/clients/targets.js.map +1 -0
  184. package/dist/lib/colors.js +0 -24
  185. package/dist/lib/colors.js.map +1 -1
  186. package/dist/lib/cowork-extension.js +2 -25
  187. package/dist/lib/cowork-extension.js.map +1 -1
  188. package/dist/lib/{dependencies.js → deps/dependencies.js} +1 -26
  189. package/dist/lib/deps/dependencies.js.map +1 -0
  190. package/dist/lib/deps/dependency-install-project.js +27 -0
  191. package/dist/lib/deps/dependency-install-project.js.map +1 -0
  192. package/dist/lib/{dependency-install.js → deps/dependency-install.js} +10 -35
  193. package/dist/lib/deps/dependency-install.js.map +1 -0
  194. package/dist/lib/deps/dependency-installed.js +64 -0
  195. package/dist/lib/deps/dependency-installed.js.map +1 -0
  196. package/dist/lib/deps/dependency-scan.js +100 -0
  197. package/dist/lib/deps/dependency-scan.js.map +1 -0
  198. package/dist/lib/docker.js +50 -0
  199. package/dist/lib/docker.js.map +1 -0
  200. package/dist/lib/dotfiles.js +57 -0
  201. package/dist/lib/dotfiles.js.map +1 -0
  202. package/dist/lib/{exec-delegate.js → exec/exec-delegate.js} +4 -13
  203. package/dist/lib/exec/exec-delegate.js.map +1 -0
  204. package/dist/lib/{exec-engines.js → exec/exec-engines.js} +1 -10
  205. package/dist/lib/exec/exec-engines.js.map +1 -0
  206. package/dist/lib/{plan-delegate.js → exec/plan-delegate.js} +1 -7
  207. package/dist/lib/exec/plan-delegate.js.map +1 -0
  208. package/dist/lib/{validate-plan-delegate.js → exec/validate-plan-delegate.js} +2 -7
  209. package/dist/lib/exec/validate-plan-delegate.js.map +1 -0
  210. package/dist/lib/load-env.js +15 -0
  211. package/dist/lib/load-env.js.map +1 -0
  212. package/dist/lib/open-url.js +9 -0
  213. package/dist/lib/open-url.js.map +1 -0
  214. package/dist/lib/prompts.js +0 -13
  215. package/dist/lib/prompts.js.map +1 -1
  216. package/dist/lib/{provision-apply.js → provision/provision-apply.js} +4 -30
  217. package/dist/lib/provision/provision-apply.js.map +1 -0
  218. package/dist/lib/{provision-collect.js → provision/provision-collect.js} +0 -9
  219. package/dist/lib/provision/provision-collect.js.map +1 -0
  220. package/dist/lib/{provision.js → provision/provision.js} +4 -17
  221. package/dist/lib/provision/provision.js.map +1 -0
  222. package/dist/lib/{patterns.js → skills/patterns.js} +0 -13
  223. package/dist/lib/skills/patterns.js.map +1 -0
  224. package/dist/lib/{rules.js → skills/rules.js} +0 -22
  225. package/dist/lib/skills/rules.js.map +1 -0
  226. package/dist/lib/skills/sections.js +58 -0
  227. package/dist/lib/skills/sections.js.map +1 -0
  228. package/dist/lib/{skill-serve.js → skills/skill-serve.js} +1 -26
  229. package/dist/lib/skills/skill-serve.js.map +1 -0
  230. package/dist/lib/{skills-cache.js → skills/skills-cache.js} +15 -21
  231. package/dist/lib/skills/skills-cache.js.map +1 -0
  232. package/dist/lib/{skills.js → skills/skills.js} +3 -49
  233. package/dist/lib/skills/skills.js.map +1 -0
  234. package/dist/lib/spinner.js.map +1 -0
  235. package/dist/lib/telemetry.js +3 -20
  236. package/dist/lib/telemetry.js.map +1 -1
  237. package/dist/lib/version-check.js +0 -20
  238. package/dist/lib/version-check.js.map +1 -1
  239. package/dist/matrix-logo.js +0 -10
  240. package/dist/matrix-logo.js.map +1 -1
  241. package/dist/mcp-server-lang.js +39 -0
  242. package/dist/mcp-server-lang.js.map +1 -0
  243. package/dist/mcp-server.js +37 -41
  244. package/dist/mcp-server.js.map +1 -1
  245. package/dist/profiles/analyst.js +10 -0
  246. package/dist/profiles/analyst.js.map +1 -0
  247. package/dist/profiles/bi.js +9 -0
  248. package/dist/profiles/bi.js.map +1 -0
  249. package/dist/profiles/dba.js +21 -0
  250. package/dist/profiles/dba.js.map +1 -0
  251. package/dist/profiles/fullstack.js +9 -0
  252. package/dist/profiles/fullstack.js.map +1 -0
  253. package/dist/profiles/index.js +39 -0
  254. package/dist/profiles/index.js.map +1 -0
  255. package/dist/profiles/mcps.js +23 -0
  256. package/dist/profiles/mcps.js.map +1 -0
  257. package/dist/profiles/qa.js +10 -0
  258. package/dist/profiles/qa.js.map +1 -0
  259. package/dist/profiles/scientist.js +9 -0
  260. package/dist/profiles/scientist.js.map +1 -0
  261. package/dist/profiles/toolchains.js +9 -0
  262. package/dist/profiles/toolchains.js.map +1 -0
  263. package/dist/tools/delegate-exec.js +2 -2
  264. package/dist/tools/delegate-exec.js.map +1 -1
  265. package/dist/tools/env-detect-deps.js +54 -0
  266. package/dist/tools/env-detect-deps.js.map +1 -0
  267. package/dist/tools/env-materialize.js +43 -0
  268. package/dist/tools/env-materialize.js.map +1 -0
  269. package/dist/tools/exec-status.js +1 -1
  270. package/dist/tools/exec-status.js.map +1 -1
  271. package/dist/tools/index.js +12 -32
  272. package/dist/tools/index.js.map +1 -1
  273. package/dist/tools/lang-recipe.js +31 -0
  274. package/dist/tools/lang-recipe.js.map +1 -0
  275. package/dist/tools/lang-reference.js +34 -0
  276. package/dist/tools/lang-reference.js.map +1 -0
  277. package/dist/tools/plan.js +2 -2
  278. package/dist/tools/plan.js.map +1 -1
  279. package/dist/tools/profile-get.js +57 -0
  280. package/dist/tools/profile-get.js.map +1 -0
  281. package/dist/tools/session-activate.js +35 -0
  282. package/dist/tools/session-activate.js.map +1 -0
  283. package/dist/tools/session-create.js +83 -0
  284. package/dist/tools/session-create.js.map +1 -0
  285. package/dist/tools/session-list.js +29 -0
  286. package/dist/tools/session-list.js.map +1 -0
  287. package/dist/tools/session-shared.js +25 -0
  288. package/dist/tools/session-shared.js.map +1 -0
  289. package/dist/tools/validate-plan.js +2 -2
  290. package/dist/tools/validate-plan.js.map +1 -1
  291. package/docker/docker-compose.yml +44 -0
  292. package/package.json +30 -16
  293. package/dist/adapters/supabase/allocation-gateway.js +0 -236
  294. package/dist/adapters/supabase/allocation-gateway.js.map +0 -1
  295. package/dist/adapters/supabase/analytics-gateway.js +0 -18
  296. package/dist/adapters/supabase/analytics-gateway.js.map +0 -1
  297. package/dist/adapters/supabase/client.js +0 -96
  298. package/dist/adapters/supabase/client.js.map +0 -1
  299. package/dist/adapters/supabase/context-gateway.js +0 -23
  300. package/dist/adapters/supabase/context-gateway.js.map +0 -1
  301. package/dist/adapters/supabase/gateway.js +0 -18
  302. package/dist/adapters/supabase/gateway.js.map +0 -1
  303. package/dist/adapters/supabase/task-gateway.js +0 -450
  304. package/dist/adapters/supabase/task-gateway.js.map +0 -1
  305. package/dist/auth.js +0 -118
  306. package/dist/auth.js.map +0 -1
  307. package/dist/cli/commands/init/project-step.js +0 -105
  308. package/dist/cli/commands/init/project-step.js.map +0 -1
  309. package/dist/constants.js +0 -9
  310. package/dist/constants.js.map +0 -1
  311. package/dist/core/ports.js +0 -2
  312. package/dist/core/ports.js.map +0 -1
  313. package/dist/database.types.js +0 -11
  314. package/dist/database.types.js.map +0 -1
  315. package/dist/lib/active-project.js +0 -28
  316. package/dist/lib/active-project.js.map +0 -1
  317. package/dist/lib/autopull.js +0 -13
  318. package/dist/lib/autopull.js.map +0 -1
  319. package/dist/lib/client-configs.js.map +0 -1
  320. package/dist/lib/client-install.js +0 -40
  321. package/dist/lib/client-install.js.map +0 -1
  322. package/dist/lib/dependencies.js.map +0 -1
  323. package/dist/lib/dependency-install.js.map +0 -1
  324. package/dist/lib/exec-delegate.js.map +0 -1
  325. package/dist/lib/exec-engines.js.map +0 -1
  326. package/dist/lib/harness.js.map +0 -1
  327. package/dist/lib/hooks.js.map +0 -1
  328. package/dist/lib/patterns.js.map +0 -1
  329. package/dist/lib/plan-delegate.js.map +0 -1
  330. package/dist/lib/project-context.js +0 -151
  331. package/dist/lib/project-context.js.map +0 -1
  332. package/dist/lib/provision-apply.js.map +0 -1
  333. package/dist/lib/provision-collect.js.map +0 -1
  334. package/dist/lib/provision.js.map +0 -1
  335. package/dist/lib/require-config.js +0 -32
  336. package/dist/lib/require-config.js.map +0 -1
  337. package/dist/lib/rules.js.map +0 -1
  338. package/dist/lib/sections.js +0 -89
  339. package/dist/lib/sections.js.map +0 -1
  340. package/dist/lib/skill-serve.js.map +0 -1
  341. package/dist/lib/skills-cache.js.map +0 -1
  342. package/dist/lib/skills.js.map +0 -1
  343. package/dist/lib/targets.js.map +0 -1
  344. package/dist/lib/task-history.js +0 -15
  345. package/dist/lib/task-history.js.map +0 -1
  346. package/dist/lib/validate-plan-delegate.js.map +0 -1
  347. package/dist/session-factory.js +0 -19
  348. package/dist/session-factory.js.map +0 -1
  349. package/dist/spinner.js.map +0 -1
  350. package/dist/tools/comment-task.js +0 -72
  351. package/dist/tools/comment-task.js.map +0 -1
  352. package/dist/tools/create-task.js +0 -129
  353. package/dist/tools/create-task.js.map +0 -1
  354. package/dist/tools/end-allocation.js +0 -38
  355. package/dist/tools/end-allocation.js.map +0 -1
  356. package/dist/tools/end-task-allocation.js +0 -37
  357. package/dist/tools/end-task-allocation.js.map +0 -1
  358. package/dist/tools/get-active-allocation.js +0 -69
  359. package/dist/tools/get-active-allocation.js.map +0 -1
  360. package/dist/tools/get-context.js +0 -48
  361. package/dist/tools/get-context.js.map +0 -1
  362. package/dist/tools/get-task.js +0 -137
  363. package/dist/tools/get-task.js.map +0 -1
  364. package/dist/tools/list-my-allocations.js +0 -71
  365. package/dist/tools/list-my-allocations.js.map +0 -1
  366. package/dist/tools/list-projects.js +0 -38
  367. package/dist/tools/list-projects.js.map +0 -1
  368. package/dist/tools/list-tasks.js +0 -93
  369. package/dist/tools/list-tasks.js.map +0 -1
  370. package/dist/tools/move-task.js +0 -82
  371. package/dist/tools/move-task.js.map +0 -1
  372. package/dist/tools/record-delivery.js +0 -71
  373. package/dist/tools/record-delivery.js.map +0 -1
  374. package/dist/tools/set-project.js +0 -52
  375. package/dist/tools/set-project.js.map +0 -1
  376. package/dist/tools/start-allocation.js +0 -32
  377. package/dist/tools/start-allocation.js.map +0 -1
  378. package/dist/tools/start-task-allocation.js +0 -75
  379. package/dist/tools/start-task-allocation.js.map +0 -1
  380. package/dist/tools/update-task.js +0 -139
  381. package/dist/tools/update-task.js.map +0 -1
  382. /package/dist/{spinner.js → lib/spinner.js} +0 -0
package/README.md CHANGED
@@ -1,66 +1,259 @@
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. **A CLI registra o MCP `nio`** no `opencode.json` e entrega o terminal pro
31
+ **OpenCode** (operador de IA fixo, modelo `opencode/big-pickle`). A partir daí
32
+ o agente tem as tools `nio_*` — criar/ativar sessão, re-materializar ambiente,
33
+ detectar dependências, delegar execução.
34
+
35
+ O **Postgres é a fonte da verdade** do domínio (usuários, sessões, trilha de
36
+ auth). A CLI e o gateway só falam com o banco que **você** configurar — não há
37
+ default, não há banco embutido.
38
+
39
+ ---
16
40
 
17
- ## Instalação (mac / linux / windows)
41
+ ## Instalação
18
42
 
19
- Precisa apenas de **Node.js 20+**. Instala como pacote global:
43
+ Precisa de **Node.js 20.12+**. Instala como pacote global:
20
44
 
21
45
  ```bash
22
46
  npm i -g @nio-cli/cli
23
47
  ```
24
48
 
25
- Pronto. Os comandos `nio` (CLI) e `nio-cli` (servidor MCP) ficam disponíveis no PATH em qualquer SO.
49
+ Ficam no PATH: `nio` (CLI), `nio-gateway` (serviço de auth), `nio-cli` e
50
+ `nio-lang` (servidores MCP).
51
+
52
+ ### Pré-requisitos de runtime
53
+
54
+ | Requisito | Pra quê | Como |
55
+ |---|---|---|
56
+ | **PostgreSQL** alcançável | fonte da verdade (sessões, usuários) | schema em `db/schema.sql` aplicado uma vez |
57
+ | **`JWT_SECRET`** (segredo do time) | assinar/validar as sessões | mesmo valor em toda máquina |
58
+ | **OpenCode** | operador de IA | o `nio init` oferece instalar (`npm i -g opencode-ai`) |
59
+ | *(opcional)* provedor de SMS | 2º fator | `SMS_ENDPOINT_URL` + `SMS_AUTH_HEADER` + `SMS_BODY_TEMPLATE` |
60
+
61
+ ---
62
+
63
+ ## Configuração
64
+
65
+ **Você não precisa exportar nada no shell.** Rode `nio config setup` — o wizard
66
+ pede o `NIO_DATABASE_URL` (que o time te passa) e o `JWT_SECRET`, **testa a
67
+ conexão** e grava em `~/.nio/config.env` (chmod 600, nunca commitado). O `nio init`,
68
+ `nio register` e `nio login` disparam esse wizard sozinhos se a config faltar; se
69
+ estiver presente mas errada, param com uma mensagem dizendo exatamente o quê.
70
+
71
+ ```bash
72
+ nio config setup # wizard interativo (cola os valores, testa, salva)
73
+ nio config check # confere: completa? banco responde? (--json pra CI)
74
+ nio config path # ~/.nio/config.env
75
+ ```
76
+
77
+ A CLI carrega as variáveis nesta precedência (shell sempre vence os arquivos):
78
+
79
+ ```
80
+ env do shell > $NIO_ENV_FILE > ./.env > ~/.nio/config.env
81
+ ```
82
+
83
+ Conteúdo de `~/.nio/config.env` (o wizard gera; dá pra editar à mão):
84
+
85
+ ```bash
86
+ NIO_DATABASE_URL=postgres://usuario:senha@HOST:5432/nio_cli
87
+ # NIO_DATABASE_SSL=true # só se o banco exigir TLS (gerenciado/nuvem)
88
+ JWT_SECRET=<mesmo-valor-do-time>
89
+
90
+ # 2º fator (SMS) — opcional, só no lado do gateway
91
+ # SMS_ENDPOINT_URL=https://api.provedor.com/v2/sms
92
+ # SMS_AUTH_HEADER=X-API-TOKEN: seu-token
93
+ # SMS_BODY_TEMPLATE={"to":"{to}","message":"{text}"}
94
+ ```
95
+
96
+ > Alternativa pra time: gere o `~/.nio/config.env` uma vez e distribua o arquivo
97
+ > (é só `KEY=value`) — a CLI valida no primeiro comando.
98
+
99
+ | Variável | Prefixo | Lida por |
100
+ |---|---|---|
101
+ | `NIO_DATABASE_URL` / `NIO_DATABASE_SSL` | `NIO_` | tudo que toca o banco |
102
+ | `JWT_SECRET` / `JWT_EXPIRES_IN` | **sem** prefixo (segredo do time) | `nio-gateway` + `nio-cli` |
103
+ | `SMS_ENDPOINT_URL` / `SMS_AUTH_HEADER` / `SMS_BODY_TEMPLATE` / `SMS_FROM` | **sem** prefixo | `nio-gateway` |
104
+ | `NIO_GATEWAY_HOST` (default `127.0.0.1`) | `NIO_` | `nio-gateway` — `0.0.0.0` p/ Kong em container |
105
+ | `NIO_GATEWAY_URL` (default `http://127.0.0.1:8000`) | `NIO_` | a CLI, pra achar o gateway/Kong |
106
+
107
+ O schema de conexão é sempre `postgres://…`; um destino inválido falha explícito,
108
+ nunca cai num default silencioso.
109
+
110
+ ---
111
+
112
+ ## Primeiros passos
113
+
114
+ ```bash
115
+ nio config setup # cola NIO_DATABASE_URL + JWT_SECRET (o time te passa), testa, salva
116
+ nio-gateway & # gateway de auth no ar (precisa pro login/logout/2FA)
117
+ nio register # cria seu usuário na base compartilhada
118
+ nio login # autentica (salva o JWT em ~/.nio/session.json)
119
+ nio security enable-2fa # (opcional) 2º fator
120
+ nio init # monta o ambiente da sessão neste diretório
121
+ ```
122
+
123
+ Se você pular o `nio config setup`, o próprio `nio register`/`init` abre o wizard.
124
+
125
+ O `nio-gateway` só é necessário pros comandos de auth (`login`/`logout`/
126
+ `verify-2fa`/`security`). Todo o resto — `init`, `sessions`, as tools MCP —
127
+ fala com o Postgres direto usando o JWT local. Rode `nio debug` a qualquer
128
+ momento pra ver o que está ok e o que falta.
129
+
130
+ ---
131
+
132
+ ## Arquitetura
133
+
134
+ Hexagonal. O núcleo não conhece IO; os adapters implementam os contratos.
135
+
136
+ ```
137
+ entrypoints: src/cli.ts (nio) src/gateway/index.ts (nio-gateway)
138
+ src/mcp-server.ts (nio-cli) src/mcp-server-lang.ts (nio-lang)
139
+ app: SessionManager · EnvironmentBuilder · DependencyWatcher · DockerManager
140
+ core/: types.ts / session.ts (entidades) + ports.ts / repositories.ts
141
+ / environment.ts / docker.ts / messaging.ts (interfaces, sem IO)
142
+ adapters/: pg/ (Postgres) ide/ (vscode) pkg/ (npm,pip,…) docker/ sms/ skills/
143
+ profiles/: catálogo dos 6 perfis (fixos no fonte)
144
+ ```
145
+
146
+ - **Runtime:** Node 20.12+ é o alvo. Bun roda o projeto em dev, mas **nada**
147
+ depende de API exclusiva do Bun — só as equivalentes de `node:*`.
148
+ - **Build:** `tsc` puro → `dist/`. Sem bundler.
149
+ - **Banco:** `pg` + um `Pool` único (`src/adapters/pg/client.ts`). Sem Supabase,
150
+ sem PostgREST, sem `Bun.sql`.
151
+ - **Gateway:** `http.createServer` nativo, loopback, atrás do Kong OSS (opcional,
152
+ pra rate-limiting). JWT HS256, `jti` = id da `auth_session`. Trilha de auth em
153
+ stderr estruturado — nunca a senha nem o OTP em texto puro.
154
+ - **Contrato "nunca lança"** nos ports de IO (`ToolchainGateway`, `IdeGateway`,
155
+ `DockerGateway`, `SmsSender`): falha vira um resultado `{ status, error? }`.
156
+
157
+ Detalhes: [`docs/arch/`](docs/arch/) (uma `ARQUITETURA-*.md` por camada) e os
158
+ [ADRs](docs/adr/). Histórico cronológico: [`docs/PROGRESSO.md`](docs/PROGRESSO.md).
26
159
 
27
- ## Configurar em qualquer repo
160
+ ### Perfis
28
161
 
29
- Na raiz do repositório:
162
+ Fixos no fonte (`src/core/session.ts`) — novos perfis só entram alterando o código:
163
+
164
+ `fullstack` · `analyst` · `scientist` · `dba` · `qa` · `bi`
165
+
166
+ ---
167
+
168
+ ## Autenticação
169
+
170
+ ```bash
171
+ nio register # cria o usuário (user_cli), senha com hash argon2id
172
+ nio login # autentica via nio-gateway e salva o JWT em ~/.nio/session.json
173
+ nio whoami # mostra quem está logado (--json pra saída estável)
174
+ nio logout # revoga a auth_session no banco e limpa a sessão local
175
+ ```
176
+
177
+ ### 2º fator (SMS)
178
+
179
+ Opt-in por conta. Com `auth_2` ativo, o `nio login` pede um código de 6 dígitos
180
+ por SMS; se o SMS não chega, vale um dos 10 **códigos de backup** (mostrados uma
181
+ vez no `enable-2fa`).
30
182
 
31
183
  ```bash
32
- nio init
184
+ nio security enable-2fa # cadastra o celular, confirma via SMS, mostra os backups
185
+ nio security status # ativo? número (mascarado)? quantos backups restam?
186
+ nio security disable-2fa
187
+ nio security regenerate-backup-codes
33
188
  ```
34
189
 
35
- Esse único comando faz tudo:
190
+ O gateway gera/valida o OTP em processo (sem Twilio, sem broker), guarda só o
191
+ **HMAC** do código (TTL 5 min, 3 tentativas, uso único) e manda o SMS por um
192
+ **adapter HTTP genérico**. Sem `SMS_ENDPOINT_URL` no ambiente, o login com
193
+ `auth_2` responde `503 "2FA não configurado"` — o login de 1 fator segue normal.
194
+ Detalhes: [spec 0004](docs/specs/auth/0004-login-2fa-sms-otp.md) ·
195
+ [ADR 0006](docs/adr/0006-2fa-sms-otp.md) ·
196
+ [`docs/arch/ARQUITETURA-GATEWAY.md`](docs/arch/ARQUITETURA-GATEWAY.md).
197
+
198
+ Pra testar sem SMS real, o repo traz um mock: `bun run dev:sms-echo` sobe um
199
+ endpoint local que imprime o código no terminal (aponte `SMS_ENDPOINT_URL` pra ele).
200
+
201
+ ---
36
202
 
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.
203
+ ## Operador de IA
43
204
 
44
- Reinicie o cliente de IA depois pra carregar as tools.
205
+ No fim do `nio init`, a CLI entrega o terminal pro operador de IA fixo:
206
+ **OpenCode** rodando `opencode/big-pickle` (default gravado no
207
+ `~/.config/opencode/opencode.json`, junto do MCP `nio` e dos MCPs do perfil). Ver
208
+ [`docs/arch/ARQUITETURA-CLIENTE-IA.md`](docs/arch/ARQUITETURA-CLIENTE-IA.md).
209
+
210
+ > Multi-cliente (OpenCode | Codex), proxy de compressão de contexto e ladder de
211
+ > failover entre modelos são **feature futura** — desenho parkeado em
212
+ > [`docs/arch/ARQUITETURA-CLIENTES-MULTI-FUTURO.md`](docs/arch/ARQUITETURA-CLIENTES-MULTI-FUTURO.md)
213
+ > ([ADR 0004](docs/adr/0004-operador-ia-unico.md)).
214
+
215
+ ---
45
216
 
46
217
  ## Comandos do CLI
47
218
 
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`.
219
+ Operações do CLI, **sem o binário na frente** (declarado no cabeçalho da tabela).
220
+ Gerada da fonte por `npm run gen:docs`. Ajuda de qualquer comando: `nio <cmd> --help`.
50
221
 
51
222
  <!-- COMMANDS:START -->
52
- <!-- gerado por `bun run gen:docs` — não edite à mão. binário `nio`, 13 comandos. -->
223
+ <!-- gerado por `bun run gen:docs` — não edite à mão. binário `nio`, 35 comandos. -->
53
224
 
54
225
  | Comando | Descrição |
55
226
  | --- | --- |
56
227
  | `clean-legacy` | Remove commands/skills legados (substituídos) de ~/.claude e ~/.codex |
57
228
  | `completion [shell]` | Imprime o script de autocomplete (bash\|zsh\|fish). |
229
+ | `config` | Config compartilhada da equipe (~/.nio/config.env) |
230
+ | `config check` | Confere se a config está completa e o Postgres responde |
231
+ | `config path` | Imprime o caminho do arquivo de config |
232
+ | `config setup` | Wizard: cola os valores do time, testa a conexão e salva |
233
+ | `docker` | Camada Docker: MCP Gateway + Portainer, compose, debug e cluster (Swarm) |
234
+ | `docker cluster <action> [arg]` | Docker Swarm — stack `nio-cluster` (up\|down\|status\|scale) |
235
+ | `docker compose <action> [service]` | Wrapper sobre `docker compose` do projeto (up\|down\|restart\|ps\|logs) |
236
+ | `docker create` | Cria e sobe um container (wizard ou flags) |
237
+ | `docker debug [container]` | Coleta o contexto de um container e entrega o diagnóstico pro operador de IA |
238
+ | `docker orquest [instruction]` | Orquestra os serviços do projeto via compose, dirigido pelo operador (linguagem natural) |
239
+ | `docker portainer` | Abre o Portainer no navegador |
240
+ | `docker toolkit` | Infra NIO: Docker MCP Gateway + Portainer (docker/docker-compose.yml) |
241
+ | `docker toolkit down` | Derruba a infra e desabilita o MCP no opencode.json |
242
+ | `docker toolkit status` | Estado dos containers + health dos endpoints |
243
+ | `docker toolkit up` | Sobe a infra e registra o gateway no opencode.json |
244
+ | `docs` | Documentação completa da CLI (terminal ou página com --html) |
58
245
  | `exec` | Delega a implementação a um agente headless num worktree e aguarda. |
59
246
  | `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 |
247
+ | `init` | Cria nio.json no diretório atual e materializa o ambiente da sessão |
248
+ | `login` | Autentica via nio-gateway (túnel HTTP) e salva a sessão localmente (JWT) |
249
+ | `logout` | Encerra a sessão local e revoga a auth_session no banco |
63
250
  | `plan` | Roda o engine pensante sobre o projeto e escreve/refina o plan.md da raiz. |
251
+ | `register` | Cria um novo usuário no banco (user_cli) |
252
+ | `security` | 2º fator do login (SMS OTP + códigos de backup) |
253
+ | `security disable-2fa` | Desativa o 2º fator |
254
+ | `security enable-2fa` | Ativa o 2º fator via SMS |
255
+ | `security regenerate-backup-codes` | Invalida os códigos de backup e gera 10 novos |
256
+ | `security status` | Mostra o estado do 2º fator |
64
257
  | `skills` | Skills, commands e agents do nio (lidos do repo aberto via cache) |
65
258
  | `skills status` | Lista os docs do repo de skills (cache local ~/.nio/skills) |
66
259
  | `sync` | Instala/atualiza skills, commands e agents nos clientes configurados, a partir do bundle (idempotente); checa atualização do pacote |
@@ -68,70 +261,87 @@ gerada da fonte por `bun run gen:docs`.
68
261
  | `whoami` | Mostra o usuário autenticado |
69
262
  <!-- COMMANDS:END -->
70
263
 
264
+ ### Diagnóstico da própria CLI
265
+
266
+ ```bash
267
+ nio debug # bateria de checagens: nio.json, login, Postgres, sessão ativa,
268
+ # OpenCode no PATH, cache de skills — ✓ / ⚠ / ✗ com dica em cada
269
+ nio docs # documentação completa no terminal
270
+ nio docs --html # a mesma coisa como página (arte); --open abre no navegador
271
+ ```
272
+
71
273
  ### Autocomplete (tab)
72
274
 
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:
275
+ O `nio init` **oferece** ativar; o `nio sync` **valida** e prompta se faltar. À mão:
75
276
 
76
277
  ```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
278
+ eval "$(nio completion zsh)" # ~/.zshrc
279
+ eval "$(nio completion bash)" # ~/.bashrc
280
+ nio completion fish | source # ~/.config/fish/config.fish
83
281
  ```
84
282
 
85
- Recarregue o shell e `nio <tab>` passa a sugerir comandos, subcomandos e flags.
283
+ ---
86
284
 
87
- ## Tools disponíveis
285
+ ## Docker (`nio docker`)
88
286
 
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`.
287
+ Camada de gerência de container metade wrapper determinístico sobre `docker`,
288
+ metade dirigida pelo operador de IA em linguagem natural (via o **Docker MCP
289
+ Gateway**). Roda em qualquer Docker Engine (não exige Docker Desktop). Ver
290
+ [`docs/arch/ARQUITETURA-DOCKER.md`](docs/arch/ARQUITETURA-DOCKER.md) ·
291
+ [ADR 0005](docs/adr/0005-camada-docker.md).
91
292
 
92
- <!-- TOOLS:START -->
93
- <!-- gerado por `bun run gen:docs` não edite à mão. 20 tools. -->
293
+ ```bash
294
+ nio docker toolkit up # sobe o MCP Gateway (127.0.0.1:8811/mcp) + Portainer (9443)
295
+ # e registra o gateway no opencode.json
296
+ nio docker compose up -f app/docker-compose.yml # wrapper sobre `docker compose` do projeto
297
+ nio docker create --image redis:7 --port 6379:6379
298
+ nio docker debug <container> # coleta ps/logs/inspect → operador analisa e propõe o fix
299
+ nio docker orquest "sobe api + worker + redis" # operador gera o compose e sobe (--dry-run mostra)
300
+ nio docker cluster up "api + worker + redis + postgres" # Docker Swarm (stack `nio-cluster`)
301
+ nio docker cluster status | scale api=3
302
+ nio docker portainer # abre a UI
303
+ ```
94
304
 
95
- ### Tools de produto prefixo `nos_`
305
+ `debug`/`orquest`/`cluster` exigem `nio login` + sessão ativa + `opencode` no
306
+ PATH. O estado do cluster fica em `sessions.config` (Postgres), validado contra
307
+ `docker stack services`.
96
308
 
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. |
309
+ ---
310
+
311
+ ## Tools MCP
312
+
313
+ O servidor `nio-cli` expõe as tools de ambiente v2 (todas passam pelo
314
+ `SessionManager` e exigem `nio login`):
315
+
316
+ <!-- TOOLS:START -->
317
+ <!-- gerado por `bun run gen:docs` não edite à mão. 10 tools. -->
115
318
 
116
319
  ### Tools que espelham o CLI — prefixo `nio_`
117
320
 
118
321
  | Operação | O que faz |
119
322
  | --- | --- |
120
323
  | `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. |
324
+ | `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). |
325
+ | `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
326
  | `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
327
  | `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. |
328
+ | `profile_get` | Consulta o catálogo de perfis de ambiente (hardcoded na CLI). |
329
+ | `session_activate` | Ativa uma sessão de ambiente do usuário por id (o prefixo do UUID basta). |
330
+ | `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`. |
331
+ | `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
332
  | `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
333
  <!-- TOOLS:END -->
125
334
 
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.)
335
+ ### Recipes de ambiente (repo NIO-SKILLS)
336
+
337
+ Além dos 6 perfis fixos, o repo `NIO-SKILLS-` pode carregar **recipes** em
338
+ `recipes/<slug>.md` — presets nomeados (`profile` + linguagens + frameworks +
339
+ MCPs + envVars/aliases) que **estendem** um perfil, editáveis sem release da CLI.
340
+ O `nio init` oferece a recipe depois do perfil; `nio_session_create` aceita
341
+ `{ recipe: "<slug>" }`. Merge determinístico (recipe vence em envVars/aliases;
342
+ união em linguagens/frameworks/MCPs).
343
+
344
+ ---
135
345
 
136
346
  ## Skills, commands e dependências
137
347
 
@@ -149,7 +359,7 @@ Overrides por ambiente:
149
359
  | --------------------- | ------------------------------------------------------------------ |
150
360
  | `NIO_SKILLS_DIR` | Aponta pra um checkout local do repo (dev) — vence tudo |
151
361
  | `NIO_SKILLS_REPO` | Outro `owner/repo` (default `hugoreiis12-png/NIO-SKILLS-`) |
152
- | `NOCLAF_SKILLS_REF` | Outra branch/tag (default `main`) |
362
+ | `NIO_SKILLS_REF` | Outra branch/tag (default `main`) |
153
363
 
154
364
  Cada cliente recebe no formato que entende:
155
365
 
@@ -159,7 +369,7 @@ Cada cliente recebe no formato que entende:
159
369
  | 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
370
  | Cowork/Desktop | — | via **MCP prompts** + resources, servidos ao vivo (ignora `~/.claude`) |
161
371
 
162
- > Configurar o Codex grava `NOCLAF_CLIENT=codex` no `config.toml`, o que faz o servidor
372
+ > Configurar o Codex grava `NIO_CLIENT=codex` no `config.toml`, o que faz o servidor
163
373
  > provisionar pra `~/.codex` e filtrar os docs pelo surface `codex`. Reinicie o cliente
164
374
  > depois do sync pra carregar skills/prompts novos.
165
375
 
@@ -167,9 +377,7 @@ Cada cliente recebe no formato que entende:
167
377
  > que o app expõe como **slash-commands** no menu de conectores/"+" (ex.: digite `/` e
168
378
  > procure os itens do nio) — são **invocados manualmente**, não carregados sozinhos
169
379
  > 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á.
380
+ > feche o app de vez (Cmd+Q) e reabra, e confirme que o conector nio está conectado.
173
381
 
174
382
  ### Visibilidade por cliente
175
383
 
@@ -192,59 +400,27 @@ Commands/skills podem depender de libs externas, declaradas como arquivos em
192
400
  - **instalador estruturado** (`npm:`, `skills:` = `npx skills add`, `git:`) → oferece
193
401
  rodar com `[y/N]` (comando montado a partir do campo validado, **sem shell**);
194
402
  - **`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`.
205
-
206
- ### Checagem de cliente
403
+ cliente, com os comandos destacados.
207
404
 
208
- Ao escolher um cliente no `init`, a CLI verifica se ele está de fato instalado na
209
- máquina. Se não estiver:
405
+ A string `install:` (se houver) é **só exibição** nunca é executada. A CLI **detecta
406
+ o que está instalado** e mostra um selo `✓ instalada` (via `npm ls -g`, dir de
407
+ destino, ou o `detect:` do frontmatter).
210
408
 
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.
409
+ ---
215
410
 
216
411
  ## Claude Desktop / Cowork
217
412
 
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).
413
+ Selecione **Cowork** na lista de clientes do `nio init`. Com o app instalado e você
414
+ logado (`nio login`), a CLI **ativa o conector direto** — escreve o `nio` no
415
+ `claude_desktop_config.json` com caminhos absolutos (`node` + `dist/mcp-server.js`)
416
+ e `NIO_CLIENT=cowork`. Reinicie o Claude Desktop pra carregar. O `nio sync` reafirma
417
+ esse config.
223
418
 
224
- Não 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.
419
+ **Fallback `.mcpb`:** se a escrita direta falhar, a CLI gera
420
+ `~/Downloads/nio-cli-<versão>.mcpb` e mostra os passosConfigurações Extensões
421
+ Configurações avançadas "Extension Developer" "Install Extension…".
227
422
 
228
- ### Fallback: extensão `.mcpb`
229
-
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.
423
+ ---
248
424
 
249
425
  ## Atualizando
250
426
 
@@ -252,29 +428,46 @@ injetado como variável de ambiente:
252
428
  npm i -g @nio-cli/cli@latest
253
429
  ```
254
430
 
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`).
431
+ O `nio sync` **checa a versão publicada** no início e **oferece atualizar** ali mesmo
432
+ (com sua confirmação). `nio sync --yes` aceita sem prompt. A CLI também avisa em
433
+ background em qualquer comando (`update-notifier`).
434
+
435
+ ---
259
436
 
260
437
  ## Troubleshooting
261
438
 
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`.
439
+ | Sintoma | Causa provável / o que fazer |
440
+ |---|---|
441
+ | `nio: command not found` | `npm i -g @nio-cli/cli` e confira `npm bin -g` no PATH |
442
+ | `Configuração necessária` / `NIO_DATABASE_URL não definida` | rode `nio config setup` (ou deixe o `nio init` abrir o wizard) |
443
+ | `Não consegui falar com o nio-gateway` | o `nio-gateway` não está no ar rode `nio-gateway &` |
444
+ | `Não autenticado` | `nio register` ( vez) e depois `nio login` |
445
+ | 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` |
446
+ | `2FA não configurado no servidor` (503) | faltam as `SMS_*` no ambiente do `nio-gateway` |
447
+ | Tools não aparecem no Claude Code | reinicie o cliente depois do `nio init`; cheque com `/mcp` |
448
+ | Skills não aparecem no Cowork | chegam como **prompts MCP** (slash-commands), não skills autônomas. Cmd+Q e reabra; confirme o conector |
449
+ | `Conteúdo de skills não encontrado` | cache `~/.nio/skills` vazio — rode `nio sync` com rede, ou `NIO_SKILLS_DIR` pra um checkout local |
450
+ | Sobraram comandos antigos | `nio clean-legacy` (`--dry-run` pra revisar antes) |
451
+
452
+ Sempre: `nio debug` mostra o estado de tudo com uma dica por item.
453
+
454
+ ---
270
455
 
271
456
  ## Convenções
272
457
 
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.
458
+ - **Idioma:** UI/CLI em pt-BR. Código (variáveis, funções, tipos) em inglês.
459
+ - **Backups:** toda escrita em config existente gera `.bak.<timestamp>` ao lado.
275
460
  - **stdout reservado pro JSON-RPC** no MCP server — logs vão pra stderr.
461
+ - **Regra do hexágono:** `core/ports.ts` / `core/repositories.ts` não importam
462
+ driver de banco; os adapters (`adapters/*`) implementam os contratos.
463
+ - **Migrations:** fonte da verdade em `db/schema.sql`; deltas incrementais em
464
+ `db/migrations/NNNN_*.sql`, aplicados à mão (`psql -f`).
465
+
466
+ ---
276
467
 
277
468
  ## Versão
278
469
 
279
- v0.1.xfeature complete pra v1. Próximos passos: testes automatizados,
280
- suporte a múltiplos perfis de usuário.
470
+ **0.2.0**v1 da CLI fechada: auth (senha + 2º fator SMS), backend de sessões,
471
+ wizard de ambiente, tools MCP de ambiente, camada Docker e o gateway com Kong.
472
+ Nasceu de um cliente NOS/Supabase (v1), já removido. Histórico cronológico:
473
+ [`docs/PROGRESSO.md`](docs/PROGRESSO.md).