constella 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (747) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +53 -0
  3. package/.next/build-manifest.json +20 -0
  4. package/.next/diagnostics/build-diagnostics.json +6 -0
  5. package/.next/diagnostics/framework.json +1 -0
  6. package/.next/export-marker.json +6 -0
  7. package/.next/images-manifest.json +68 -0
  8. package/.next/next-minimal-server.js.nft.json +1 -0
  9. package/.next/next-server.js.nft.json +1 -0
  10. package/.next/package.json +1 -0
  11. package/.next/prerender-manifest.json +36 -0
  12. package/.next/react-loadable-manifest.json +14 -0
  13. package/.next/required-server-files.js +343 -0
  14. package/.next/required-server-files.json +343 -0
  15. package/.next/routes-manifest.json +362 -0
  16. package/.next/server/app/(app)/activity/page.js +2 -0
  17. package/.next/server/app/(app)/activity/page.js.nft.json +1 -0
  18. package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -0
  19. package/.next/server/app/(app)/agents/[handle]/page.js +18 -0
  20. package/.next/server/app/(app)/agents/[handle]/page.js.nft.json +1 -0
  21. package/.next/server/app/(app)/agents/[handle]/page_client-reference-manifest.js +1 -0
  22. package/.next/server/app/(app)/code/page.js +2 -0
  23. package/.next/server/app/(app)/code/page.js.nft.json +1 -0
  24. package/.next/server/app/(app)/code/page_client-reference-manifest.js +1 -0
  25. package/.next/server/app/(app)/config/page.js +2 -0
  26. package/.next/server/app/(app)/config/page.js.nft.json +1 -0
  27. package/.next/server/app/(app)/config/page_client-reference-manifest.js +1 -0
  28. package/.next/server/app/(app)/costs/page.js +2 -0
  29. package/.next/server/app/(app)/costs/page.js.nft.json +1 -0
  30. package/.next/server/app/(app)/costs/page_client-reference-manifest.js +1 -0
  31. package/.next/server/app/(app)/cron/page.js +2 -0
  32. package/.next/server/app/(app)/cron/page.js.nft.json +1 -0
  33. package/.next/server/app/(app)/cron/page_client-reference-manifest.js +1 -0
  34. package/.next/server/app/(app)/dashboard/page.js +2 -0
  35. package/.next/server/app/(app)/dashboard/page.js.nft.json +1 -0
  36. package/.next/server/app/(app)/dashboard/page_client-reference-manifest.js +1 -0
  37. package/.next/server/app/(app)/docs/[id]/page.js +2 -0
  38. package/.next/server/app/(app)/docs/[id]/page.js.nft.json +1 -0
  39. package/.next/server/app/(app)/docs/[id]/page_client-reference-manifest.js +1 -0
  40. package/.next/server/app/(app)/docs/page.js +2 -0
  41. package/.next/server/app/(app)/docs/page.js.nft.json +1 -0
  42. package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -0
  43. package/.next/server/app/(app)/github/page.js +2 -0
  44. package/.next/server/app/(app)/github/page.js.nft.json +1 -0
  45. package/.next/server/app/(app)/github/page_client-reference-manifest.js +1 -0
  46. package/.next/server/app/(app)/goals/page.js +2 -0
  47. package/.next/server/app/(app)/goals/page.js.nft.json +1 -0
  48. package/.next/server/app/(app)/goals/page_client-reference-manifest.js +1 -0
  49. package/.next/server/app/(app)/inbox/page.js +2 -0
  50. package/.next/server/app/(app)/inbox/page.js.nft.json +1 -0
  51. package/.next/server/app/(app)/inbox/page_client-reference-manifest.js +1 -0
  52. package/.next/server/app/(app)/knowledge/page.js +3 -0
  53. package/.next/server/app/(app)/knowledge/page.js.nft.json +1 -0
  54. package/.next/server/app/(app)/knowledge/page_client-reference-manifest.js +1 -0
  55. package/.next/server/app/(app)/models/page.js +2 -0
  56. package/.next/server/app/(app)/models/page.js.nft.json +1 -0
  57. package/.next/server/app/(app)/models/page_client-reference-manifest.js +1 -0
  58. package/.next/server/app/(app)/notifications/page.js +2 -0
  59. package/.next/server/app/(app)/notifications/page.js.nft.json +1 -0
  60. package/.next/server/app/(app)/notifications/page_client-reference-manifest.js +1 -0
  61. package/.next/server/app/(app)/org/page.js +2 -0
  62. package/.next/server/app/(app)/org/page.js.nft.json +1 -0
  63. package/.next/server/app/(app)/org/page_client-reference-manifest.js +1 -0
  64. package/.next/server/app/(app)/organizations/page.js +2 -0
  65. package/.next/server/app/(app)/organizations/page.js.nft.json +1 -0
  66. package/.next/server/app/(app)/organizations/page_client-reference-manifest.js +1 -0
  67. package/.next/server/app/(app)/page.js +3 -0
  68. package/.next/server/app/(app)/page.js.nft.json +1 -0
  69. package/.next/server/app/(app)/page_client-reference-manifest.js +1 -0
  70. package/.next/server/app/(app)/planner/page.js +2 -0
  71. package/.next/server/app/(app)/planner/page.js.nft.json +1 -0
  72. package/.next/server/app/(app)/planner/page_client-reference-manifest.js +1 -0
  73. package/.next/server/app/(app)/plugins/page.js +2 -0
  74. package/.next/server/app/(app)/plugins/page.js.nft.json +1 -0
  75. package/.next/server/app/(app)/plugins/page_client-reference-manifest.js +1 -0
  76. package/.next/server/app/(app)/pm/page.js +2 -0
  77. package/.next/server/app/(app)/pm/page.js.nft.json +1 -0
  78. package/.next/server/app/(app)/pm/page_client-reference-manifest.js +1 -0
  79. package/.next/server/app/(app)/prepare-deploy/page.js +19 -0
  80. package/.next/server/app/(app)/prepare-deploy/page.js.nft.json +1 -0
  81. package/.next/server/app/(app)/prepare-deploy/page_client-reference-manifest.js +1 -0
  82. package/.next/server/app/(app)/profile/page.js +2 -0
  83. package/.next/server/app/(app)/profile/page.js.nft.json +1 -0
  84. package/.next/server/app/(app)/profile/page_client-reference-manifest.js +1 -0
  85. package/.next/server/app/(app)/pulse/page.js +2 -0
  86. package/.next/server/app/(app)/pulse/page.js.nft.json +1 -0
  87. package/.next/server/app/(app)/pulse/page_client-reference-manifest.js +1 -0
  88. package/.next/server/app/(app)/reports/[id]/page.js +3 -0
  89. package/.next/server/app/(app)/reports/[id]/page.js.nft.json +1 -0
  90. package/.next/server/app/(app)/reports/[id]/page_client-reference-manifest.js +1 -0
  91. package/.next/server/app/(app)/reports/page.js +5 -0
  92. package/.next/server/app/(app)/reports/page.js.nft.json +1 -0
  93. package/.next/server/app/(app)/reports/page_client-reference-manifest.js +1 -0
  94. package/.next/server/app/(app)/routines/page.js +2 -0
  95. package/.next/server/app/(app)/routines/page.js.nft.json +1 -0
  96. package/.next/server/app/(app)/routines/page_client-reference-manifest.js +1 -0
  97. package/.next/server/app/(app)/search/page.js +2 -0
  98. package/.next/server/app/(app)/search/page.js.nft.json +1 -0
  99. package/.next/server/app/(app)/search/page_client-reference-manifest.js +1 -0
  100. package/.next/server/app/(app)/security/page.js +2 -0
  101. package/.next/server/app/(app)/security/page.js.nft.json +1 -0
  102. package/.next/server/app/(app)/security/page_client-reference-manifest.js +1 -0
  103. package/.next/server/app/(app)/skills/page.js +18 -0
  104. package/.next/server/app/(app)/skills/page.js.nft.json +1 -0
  105. package/.next/server/app/(app)/skills/page_client-reference-manifest.js +1 -0
  106. package/.next/server/app/(app)/tasks/page.js +2 -0
  107. package/.next/server/app/(app)/tasks/page.js.nft.json +1 -0
  108. package/.next/server/app/(app)/tasks/page_client-reference-manifest.js +1 -0
  109. package/.next/server/app/(app)/test-dev/page.js +2 -0
  110. package/.next/server/app/(app)/test-dev/page.js.nft.json +1 -0
  111. package/.next/server/app/(app)/test-dev/page_client-reference-manifest.js +1 -0
  112. package/.next/server/app/(app)/update/page.js +2 -0
  113. package/.next/server/app/(app)/update/page.js.nft.json +1 -0
  114. package/.next/server/app/(app)/update/page_client-reference-manifest.js +1 -0
  115. package/.next/server/app/(auth)/login/page.js +2 -0
  116. package/.next/server/app/(auth)/login/page.js.nft.json +1 -0
  117. package/.next/server/app/(auth)/login/page_client-reference-manifest.js +1 -0
  118. package/.next/server/app/(auth)/onboarding/page.js +18 -0
  119. package/.next/server/app/(auth)/onboarding/page.js.nft.json +1 -0
  120. package/.next/server/app/(auth)/onboarding/page_client-reference-manifest.js +1 -0
  121. package/.next/server/app/_global-error/page.js +32 -0
  122. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  123. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
  124. package/.next/server/app/_global-error.html +1 -0
  125. package/.next/server/app/_global-error.meta +16 -0
  126. package/.next/server/app/_global-error.rsc +15 -0
  127. package/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
  128. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +5 -0
  129. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +5 -0
  130. package/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
  131. package/.next/server/app/_global-error.segments/_index.segment.rsc +6 -0
  132. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  133. package/.next/server/app/_not-found/page.js +2 -0
  134. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  135. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  136. package/.next/server/app/api/auth/[...all]/route.js +1 -0
  137. package/.next/server/app/api/auth/[...all]/route.js.nft.json +1 -0
  138. package/.next/server/app/api/auth/[...all]/route_client-reference-manifest.js +1 -0
  139. package/.next/server/app/api/cron/tick/route.js +52 -0
  140. package/.next/server/app/api/cron/tick/route.js.nft.json +1 -0
  141. package/.next/server/app/api/cron/tick/route_client-reference-manifest.js +1 -0
  142. package/.next/server/app/api/dev-login/route.js +1 -0
  143. package/.next/server/app/api/dev-login/route.js.nft.json +1 -0
  144. package/.next/server/app/api/dev-login/route_client-reference-manifest.js +1 -0
  145. package/.next/server/app/api/locks/acquire/route.js +1 -0
  146. package/.next/server/app/api/locks/acquire/route.js.nft.json +1 -0
  147. package/.next/server/app/api/locks/acquire/route_client-reference-manifest.js +1 -0
  148. package/.next/server/app/api/models/progress/route.js +1 -0
  149. package/.next/server/app/api/models/progress/route.js.nft.json +1 -0
  150. package/.next/server/app/api/models/progress/route_client-reference-manifest.js +1 -0
  151. package/.next/server/app/api/passkey/authenticate/options/route.js +1 -0
  152. package/.next/server/app/api/passkey/authenticate/options/route.js.nft.json +1 -0
  153. package/.next/server/app/api/passkey/authenticate/options/route_client-reference-manifest.js +1 -0
  154. package/.next/server/app/api/passkey/authenticate/verify/route.js +1 -0
  155. package/.next/server/app/api/passkey/authenticate/verify/route.js.nft.json +1 -0
  156. package/.next/server/app/api/passkey/authenticate/verify/route_client-reference-manifest.js +1 -0
  157. package/.next/server/app/api/passkey/register/options/route.js +1 -0
  158. package/.next/server/app/api/passkey/register/options/route.js.nft.json +1 -0
  159. package/.next/server/app/api/passkey/register/options/route_client-reference-manifest.js +1 -0
  160. package/.next/server/app/api/passkey/register/verify/route.js +1 -0
  161. package/.next/server/app/api/passkey/register/verify/route.js.nft.json +1 -0
  162. package/.next/server/app/api/passkey/register/verify/route_client-reference-manifest.js +1 -0
  163. package/.next/server/app/api/stream/route.js +4 -0
  164. package/.next/server/app/api/stream/route.js.nft.json +1 -0
  165. package/.next/server/app/api/stream/route_client-reference-manifest.js +1 -0
  166. package/.next/server/app/api/sync/file/route.js +2 -0
  167. package/.next/server/app/api/sync/file/route.js.nft.json +1 -0
  168. package/.next/server/app/api/sync/file/route_client-reference-manifest.js +1 -0
  169. package/.next/server/app/api/telegram/poll/route.js +15 -0
  170. package/.next/server/app/api/telegram/poll/route.js.nft.json +1 -0
  171. package/.next/server/app/api/telegram/poll/route_client-reference-manifest.js +1 -0
  172. package/.next/server/app/api/upload/route.js +1 -0
  173. package/.next/server/app/api/upload/route.js.nft.json +1 -0
  174. package/.next/server/app/api/upload/route_client-reference-manifest.js +1 -0
  175. package/.next/server/app/api/v1/[[...path]]/route.js +1 -0
  176. package/.next/server/app/api/v1/[[...path]]/route.js.nft.json +1 -0
  177. package/.next/server/app/api/v1/[[...path]]/route_client-reference-manifest.js +1 -0
  178. package/.next/server/app-paths-manifest.json +53 -0
  179. package/.next/server/chunks/1003.js +1 -0
  180. package/.next/server/chunks/127.js +26 -0
  181. package/.next/server/chunks/1388.js +1 -0
  182. package/.next/server/chunks/1408.js +21 -0
  183. package/.next/server/chunks/1572.js +1 -0
  184. package/.next/server/chunks/1591.js +24 -0
  185. package/.next/server/chunks/1619.js +188 -0
  186. package/.next/server/chunks/162.js +1 -0
  187. package/.next/server/chunks/1881.js +1 -0
  188. package/.next/server/chunks/1968.js +1 -0
  189. package/.next/server/chunks/2297.js +348 -0
  190. package/.next/server/chunks/2341.js +1 -0
  191. package/.next/server/chunks/2517.js +1 -0
  192. package/.next/server/chunks/2549.js +1 -0
  193. package/.next/server/chunks/259.js +14 -0
  194. package/.next/server/chunks/2599.js +1 -0
  195. package/.next/server/chunks/260.js +1 -0
  196. package/.next/server/chunks/2867.js +147 -0
  197. package/.next/server/chunks/3018.js +1 -0
  198. package/.next/server/chunks/3050.js +18 -0
  199. package/.next/server/chunks/3085.js +12 -0
  200. package/.next/server/chunks/3131.js +1 -0
  201. package/.next/server/chunks/3242.js +1 -0
  202. package/.next/server/chunks/3266.js +15 -0
  203. package/.next/server/chunks/3524.js +1 -0
  204. package/.next/server/chunks/3527.js +479 -0
  205. package/.next/server/chunks/3533.js +869 -0
  206. package/.next/server/chunks/3550.js +1 -0
  207. package/.next/server/chunks/3609.js +2 -0
  208. package/.next/server/chunks/3667.js +462 -0
  209. package/.next/server/chunks/3760.js +4 -0
  210. package/.next/server/chunks/4679.js +1 -0
  211. package/.next/server/chunks/4804.js +1 -0
  212. package/.next/server/chunks/4832.js +2 -0
  213. package/.next/server/chunks/4853.js +1 -0
  214. package/.next/server/chunks/4979.js +67 -0
  215. package/.next/server/chunks/5060.js +1 -0
  216. package/.next/server/chunks/5278.js +1 -0
  217. package/.next/server/chunks/5614.js +1 -0
  218. package/.next/server/chunks/5818.js +1 -0
  219. package/.next/server/chunks/6479.js +1 -0
  220. package/.next/server/chunks/6658.js +1 -0
  221. package/.next/server/chunks/6706.js +1 -0
  222. package/.next/server/chunks/6719.js +1 -0
  223. package/.next/server/chunks/678.js +1 -0
  224. package/.next/server/chunks/683.js +1 -0
  225. package/.next/server/chunks/6862.js +1 -0
  226. package/.next/server/chunks/6882.js +1 -0
  227. package/.next/server/chunks/7037.js +1 -0
  228. package/.next/server/chunks/7107.js +741 -0
  229. package/.next/server/chunks/73.js +17 -0
  230. package/.next/server/chunks/7327.js +1 -0
  231. package/.next/server/chunks/7514.js +1 -0
  232. package/.next/server/chunks/7622.js +1 -0
  233. package/.next/server/chunks/7778.js +1 -0
  234. package/.next/server/chunks/7912.js +1 -0
  235. package/.next/server/chunks/7949.js +1 -0
  236. package/.next/server/chunks/7971.js +1 -0
  237. package/.next/server/chunks/7989.js +1 -0
  238. package/.next/server/chunks/842.js +22 -0
  239. package/.next/server/chunks/8762.js +15 -0
  240. package/.next/server/chunks/8823.js +77 -0
  241. package/.next/server/chunks/9146.js +4 -0
  242. package/.next/server/chunks/9676.js +1 -0
  243. package/.next/server/chunks/9783.js +22 -0
  244. package/.next/server/chunks/9969.js +3 -0
  245. package/.next/server/functions-config-manifest.json +18 -0
  246. package/.next/server/instrumentation.js +1 -0
  247. package/.next/server/instrumentation.js.nft.json +1 -0
  248. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  249. package/.next/server/middleware-build-manifest.js +1 -0
  250. package/.next/server/middleware-manifest.json +6 -0
  251. package/.next/server/middleware-react-loadable-manifest.js +1 -0
  252. package/.next/server/middleware.js +18 -0
  253. package/.next/server/middleware.js.nft.json +1 -0
  254. package/.next/server/next-font-manifest.js +1 -0
  255. package/.next/server/next-font-manifest.json +1 -0
  256. package/.next/server/pages/500.html +1 -0
  257. package/.next/server/pages-manifest.json +3 -0
  258. package/.next/server/prefetch-hints.json +1 -0
  259. package/.next/server/server-reference-manifest.js +1 -0
  260. package/.next/server/server-reference-manifest.json +1 -0
  261. package/.next/server/webpack-runtime.js +1 -0
  262. package/.next/static/chunks/1858-339516f78a4b00da.js +1 -0
  263. package/.next/static/chunks/2320-fc8b39380e69d465.js +2 -0
  264. package/.next/static/chunks/23550918-ff694f70f4b0648c.js +1 -0
  265. package/.next/static/chunks/3219-ebb3c23be38c838d.js +1 -0
  266. package/.next/static/chunks/4263-adecb5b466380b6e.js +1 -0
  267. package/.next/static/chunks/5479-0cceab68cd0ca9c7.js +1 -0
  268. package/.next/static/chunks/5701-665b927b06158b76.js +1 -0
  269. package/.next/static/chunks/5920.6451a68b63918988.js +1 -0
  270. package/.next/static/chunks/6575-5c9139720bb0f5bf.js +4 -0
  271. package/.next/static/chunks/6834-4759af1ce7d95fb6.js +32 -0
  272. package/.next/static/chunks/7509.721cd47a931c5518.js +1 -0
  273. package/.next/static/chunks/8264-1ca011989ee2b231.js +1 -0
  274. package/.next/static/chunks/9219-4a39a98b5502d9d1.js +1 -0
  275. package/.next/static/chunks/9690-53d5222618cbeddb.js +1 -0
  276. package/.next/static/chunks/app/(app)/activity/page-3973534281ecea81.js +1 -0
  277. package/.next/static/chunks/app/(app)/agents/[handle]/page-83662a175c098282.js +1 -0
  278. package/.next/static/chunks/app/(app)/code/page-33979545192cd137.js +1 -0
  279. package/.next/static/chunks/app/(app)/config/page-9933aed1ca8a85c1.js +1 -0
  280. package/.next/static/chunks/app/(app)/costs/page-131c4dc580efcc19.js +1 -0
  281. package/.next/static/chunks/app/(app)/cron/page-53ea1aff998a87ca.js +1 -0
  282. package/.next/static/chunks/app/(app)/dashboard/page-deed83aaa9d0d447.js +1 -0
  283. package/.next/static/chunks/app/(app)/docs/[id]/page-38c993d73c0eab4f.js +1 -0
  284. package/.next/static/chunks/app/(app)/docs/page-bf463b55d0554e86.js +1 -0
  285. package/.next/static/chunks/app/(app)/error-988cd28480809861.js +1 -0
  286. package/.next/static/chunks/app/(app)/github/page-62678b4e82dfecb6.js +1 -0
  287. package/.next/static/chunks/app/(app)/goals/page-4adb426fe1c96106.js +1 -0
  288. package/.next/static/chunks/app/(app)/inbox/page-e347dc55ab467310.js +1 -0
  289. package/.next/static/chunks/app/(app)/knowledge/page-65393a045b4349be.js +1 -0
  290. package/.next/static/chunks/app/(app)/layout-7f65675705b011d8.js +1 -0
  291. package/.next/static/chunks/app/(app)/models/page-e01f1dd7e49a2951.js +1 -0
  292. package/.next/static/chunks/app/(app)/notifications/page-56548ac87aef00da.js +1 -0
  293. package/.next/static/chunks/app/(app)/org/page-699e6a6dc0db7d81.js +1 -0
  294. package/.next/static/chunks/app/(app)/organizations/page-36051a380a7e8eb7.js +1 -0
  295. package/.next/static/chunks/app/(app)/page-7d1011a566f81520.js +1 -0
  296. package/.next/static/chunks/app/(app)/planner/page-dab7ced94083373a.js +1 -0
  297. package/.next/static/chunks/app/(app)/plugins/page-5b5a1f53389be42e.js +1 -0
  298. package/.next/static/chunks/app/(app)/pm/page-0de5c08c0b227bb0.js +1 -0
  299. package/.next/static/chunks/app/(app)/prepare-deploy/page-e426038552df8d41.js +1 -0
  300. package/.next/static/chunks/app/(app)/profile/page-608dfcaf8aae0a69.js +1 -0
  301. package/.next/static/chunks/app/(app)/pulse/page-309ccaca91de1faa.js +1 -0
  302. package/.next/static/chunks/app/(app)/reports/[id]/page-53ea1aff998a87ca.js +1 -0
  303. package/.next/static/chunks/app/(app)/reports/page-68cdc6dcfa472d86.js +1 -0
  304. package/.next/static/chunks/app/(app)/routines/page-bcc55550b197a9fa.js +1 -0
  305. package/.next/static/chunks/app/(app)/search/page-5c5f67558d0dbf0d.js +1 -0
  306. package/.next/static/chunks/app/(app)/security/page-a7d41e36aa366b45.js +1 -0
  307. package/.next/static/chunks/app/(app)/skills/page-c5b21e89593b8336.js +1 -0
  308. package/.next/static/chunks/app/(app)/tasks/page-08ae079e3e54d2ce.js +1 -0
  309. package/.next/static/chunks/app/(app)/test-dev/page-633f82dfd9c3ce23.js +1 -0
  310. package/.next/static/chunks/app/(app)/update/page-4be019054351bfac.js +1 -0
  311. package/.next/static/chunks/app/(auth)/login/page-6e85d3377062acae.js +1 -0
  312. package/.next/static/chunks/app/(auth)/onboarding/page-ebb10c175abf3b85.js +1 -0
  313. package/.next/static/chunks/app/_global-error/page-23fe50a6bf589c97.js +1 -0
  314. package/.next/static/chunks/app/_not-found/page-dc38b02aebeab535.js +1 -0
  315. package/.next/static/chunks/app/api/auth/[...all]/route-23fe50a6bf589c97.js +1 -0
  316. package/.next/static/chunks/app/api/cron/tick/route-23fe50a6bf589c97.js +1 -0
  317. package/.next/static/chunks/app/api/dev-login/route-23fe50a6bf589c97.js +1 -0
  318. package/.next/static/chunks/app/api/locks/acquire/route-23fe50a6bf589c97.js +1 -0
  319. package/.next/static/chunks/app/api/models/progress/route-23fe50a6bf589c97.js +1 -0
  320. package/.next/static/chunks/app/api/passkey/authenticate/options/route-23fe50a6bf589c97.js +1 -0
  321. package/.next/static/chunks/app/api/passkey/authenticate/verify/route-23fe50a6bf589c97.js +1 -0
  322. package/.next/static/chunks/app/api/passkey/register/options/route-23fe50a6bf589c97.js +1 -0
  323. package/.next/static/chunks/app/api/passkey/register/verify/route-23fe50a6bf589c97.js +1 -0
  324. package/.next/static/chunks/app/api/stream/route-23fe50a6bf589c97.js +1 -0
  325. package/.next/static/chunks/app/api/sync/file/route-23fe50a6bf589c97.js +1 -0
  326. package/.next/static/chunks/app/api/telegram/poll/route-23fe50a6bf589c97.js +1 -0
  327. package/.next/static/chunks/app/api/upload/route-23fe50a6bf589c97.js +1 -0
  328. package/.next/static/chunks/app/api/v1/[[...path]]/route-23fe50a6bf589c97.js +1 -0
  329. package/.next/static/chunks/app/error-09899a13c38b6e89.js +1 -0
  330. package/.next/static/chunks/app/global-error-b8050d4d886f448c.js +1 -0
  331. package/.next/static/chunks/app/layout-ab9deed1e7e2e9df.js +1 -0
  332. package/.next/static/chunks/framework-4b2c6b6043dd203f.js +1 -0
  333. package/.next/static/chunks/main-722e16032e7764d1.js +5 -0
  334. package/.next/static/chunks/main-app-761880af2b6f1962.js +1 -0
  335. package/.next/static/chunks/next/dist/client/components/builtin/app-error-23fe50a6bf589c97.js +1 -0
  336. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-23fe50a6bf589c97.js +1 -0
  337. package/.next/static/chunks/next/dist/client/components/builtin/not-found-23fe50a6bf589c97.js +1 -0
  338. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-23fe50a6bf589c97.js +1 -0
  339. package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  340. package/.next/static/chunks/webpack-222e3894b78c67db.js +1 -0
  341. package/.next/static/css/0a9b5805594444e3.css +1 -0
  342. package/.next/static/yztMvBwyrWWkSqP6jfXoa/_buildManifest.js +1 -0
  343. package/.next/static/yztMvBwyrWWkSqP6jfXoa/_ssgManifest.js +1 -0
  344. package/.next/trace-build +1 -0
  345. package/.next/types/app/(app)/activity/page.ts +87 -0
  346. package/.next/types/app/(app)/agents/[handle]/page.ts +87 -0
  347. package/.next/types/app/(app)/code/page.ts +87 -0
  348. package/.next/types/app/(app)/config/page.ts +87 -0
  349. package/.next/types/app/(app)/costs/page.ts +87 -0
  350. package/.next/types/app/(app)/cron/page.ts +87 -0
  351. package/.next/types/app/(app)/dashboard/page.ts +87 -0
  352. package/.next/types/app/(app)/docs/[id]/page.ts +87 -0
  353. package/.next/types/app/(app)/docs/page.ts +87 -0
  354. package/.next/types/app/(app)/github/page.ts +87 -0
  355. package/.next/types/app/(app)/goals/page.ts +87 -0
  356. package/.next/types/app/(app)/inbox/page.ts +87 -0
  357. package/.next/types/app/(app)/knowledge/page.ts +87 -0
  358. package/.next/types/app/(app)/models/page.ts +87 -0
  359. package/.next/types/app/(app)/notifications/page.ts +87 -0
  360. package/.next/types/app/(app)/org/page.ts +87 -0
  361. package/.next/types/app/(app)/organizations/page.ts +87 -0
  362. package/.next/types/app/(app)/page.ts +87 -0
  363. package/.next/types/app/(app)/planner/page.ts +87 -0
  364. package/.next/types/app/(app)/plugins/page.ts +87 -0
  365. package/.next/types/app/(app)/pm/page.ts +87 -0
  366. package/.next/types/app/(app)/prepare-deploy/page.ts +87 -0
  367. package/.next/types/app/(app)/profile/page.ts +87 -0
  368. package/.next/types/app/(app)/pulse/page.ts +87 -0
  369. package/.next/types/app/(app)/reports/[id]/page.ts +87 -0
  370. package/.next/types/app/(app)/reports/page.ts +87 -0
  371. package/.next/types/app/(app)/routines/page.ts +87 -0
  372. package/.next/types/app/(app)/search/page.ts +87 -0
  373. package/.next/types/app/(app)/security/page.ts +87 -0
  374. package/.next/types/app/(app)/skills/page.ts +87 -0
  375. package/.next/types/app/(app)/tasks/page.ts +87 -0
  376. package/.next/types/app/(app)/test-dev/page.ts +87 -0
  377. package/.next/types/app/(app)/update/page.ts +87 -0
  378. package/.next/types/app/(auth)/login/page.ts +87 -0
  379. package/.next/types/app/(auth)/onboarding/page.ts +87 -0
  380. package/.next/types/app/api/auth/[...all]/route.ts +351 -0
  381. package/.next/types/app/api/cron/tick/route.ts +351 -0
  382. package/.next/types/app/api/dev-login/route.ts +351 -0
  383. package/.next/types/app/api/locks/acquire/route.ts +351 -0
  384. package/.next/types/app/api/models/progress/route.ts +351 -0
  385. package/.next/types/app/api/passkey/authenticate/options/route.ts +351 -0
  386. package/.next/types/app/api/passkey/authenticate/verify/route.ts +351 -0
  387. package/.next/types/app/api/passkey/register/options/route.ts +351 -0
  388. package/.next/types/app/api/passkey/register/verify/route.ts +351 -0
  389. package/.next/types/app/api/stream/route.ts +351 -0
  390. package/.next/types/app/api/sync/file/route.ts +351 -0
  391. package/.next/types/app/api/telegram/poll/route.ts +351 -0
  392. package/.next/types/app/api/upload/route.ts +351 -0
  393. package/.next/types/app/api/v1/[[...path]]/route.ts +351 -0
  394. package/.next/types/cache-life.d.ts +145 -0
  395. package/.next/types/link.d.ts +210 -0
  396. package/.next/types/package.json +1 -0
  397. package/.next/types/routes.d.ts +120 -0
  398. package/.next/types/validator.ts +511 -0
  399. package/CHANGELOG.md +312 -0
  400. package/LICENSE +21 -0
  401. package/README.md +382 -0
  402. package/README.pt-BR.md +391 -0
  403. package/bin/constella.mjs +329 -0
  404. package/bin/guard-hook.mjs +44 -0
  405. package/bin/lock-hook.mjs +49 -0
  406. package/bin/worker.mjs +142 -0
  407. package/docs/assets/arch-orbit.svg +56 -0
  408. package/docs/assets/blackhole.svg +37 -0
  409. package/docs/assets/divider-orbit.svg +23 -0
  410. package/docs/assets/hero-constella.svg +72 -0
  411. package/docs/en/AGENTS.md +279 -0
  412. package/docs/en/AI_ARCHITECTURE.md +373 -0
  413. package/docs/en/ARCHITECTURE.md +334 -0
  414. package/docs/en/AUTH_MODE.md +247 -0
  415. package/docs/en/CHAT_COMMANDS.md +305 -0
  416. package/docs/en/CONFIGURATION.md +340 -0
  417. package/docs/en/DEPLOY.md +331 -0
  418. package/docs/en/DM.md +297 -0
  419. package/docs/en/FAQ.md +258 -0
  420. package/docs/en/GITHUB.md +341 -0
  421. package/docs/en/GOALS_SPECS_ISSUES.md +303 -0
  422. package/docs/en/INBOX.md +340 -0
  423. package/docs/en/INSTALLATION.md +329 -0
  424. package/docs/en/KB_AGENT.md +305 -0
  425. package/docs/en/KB_RAG.md +356 -0
  426. package/docs/en/MCP.md +313 -0
  427. package/docs/en/MEMORY_RAG.md +289 -0
  428. package/docs/en/MODELS.md +341 -0
  429. package/docs/en/ONBOARDING.md +327 -0
  430. package/docs/en/PLUGINS.md +290 -0
  431. package/docs/en/PORTABLE_MODE.md +387 -0
  432. package/docs/en/PO_AGENT.md +379 -0
  433. package/docs/en/PREPARE_DEPLOY.md +308 -0
  434. package/docs/en/PROJECT_STACKS.md +258 -0
  435. package/docs/en/PUBLIC_API.md +315 -0
  436. package/docs/en/PUBLISHING.md +343 -0
  437. package/docs/en/README.md +95 -0
  438. package/docs/en/SECURITY.md +280 -0
  439. package/docs/en/SKILLS.md +349 -0
  440. package/docs/en/START_MODE.md +340 -0
  441. package/docs/en/SYNCED_BLOCKS.md +320 -0
  442. package/docs/en/TEAM_ROOM.md +285 -0
  443. package/docs/en/TELEGRAM.md +294 -0
  444. package/docs/en/TEST_DEV.md +321 -0
  445. package/docs/en/TROUBLESHOOTING.md +294 -0
  446. package/docs/en/UPDATE.md +301 -0
  447. package/docs/en/VPS_MODE.md +334 -0
  448. package/docs/en/WORKFLOW.md +321 -0
  449. package/docs/pt/AGENTS.md +279 -0
  450. package/docs/pt/AI_ARCHITECTURE.md +373 -0
  451. package/docs/pt/ARCHITECTURE.md +334 -0
  452. package/docs/pt/AUTH_MODE.md +247 -0
  453. package/docs/pt/CHAT_COMMANDS.md +307 -0
  454. package/docs/pt/CONFIGURATION.md +340 -0
  455. package/docs/pt/DEPLOY.md +331 -0
  456. package/docs/pt/DM.md +297 -0
  457. package/docs/pt/FAQ.md +258 -0
  458. package/docs/pt/GITHUB.md +341 -0
  459. package/docs/pt/GOALS_SPECS_ISSUES.md +303 -0
  460. package/docs/pt/INBOX.md +340 -0
  461. package/docs/pt/INSTALLATION.md +329 -0
  462. package/docs/pt/KB_AGENT.md +305 -0
  463. package/docs/pt/KB_RAG.md +356 -0
  464. package/docs/pt/MCP.md +313 -0
  465. package/docs/pt/MEMORY_RAG.md +289 -0
  466. package/docs/pt/MODELS.md +341 -0
  467. package/docs/pt/ONBOARDING.md +327 -0
  468. package/docs/pt/PLUGINS.md +290 -0
  469. package/docs/pt/PORTABLE_MODE.md +387 -0
  470. package/docs/pt/PO_AGENT.md +379 -0
  471. package/docs/pt/PREPARE_DEPLOY.md +308 -0
  472. package/docs/pt/PROJECT_STACKS.md +258 -0
  473. package/docs/pt/PUBLIC_API.md +315 -0
  474. package/docs/pt/PUBLISHING.md +343 -0
  475. package/docs/pt/README.md +95 -0
  476. package/docs/pt/SECURITY.md +280 -0
  477. package/docs/pt/SKILLS.md +349 -0
  478. package/docs/pt/START_MODE.md +340 -0
  479. package/docs/pt/SYNCED_BLOCKS.md +320 -0
  480. package/docs/pt/TEAM_ROOM.md +285 -0
  481. package/docs/pt/TELEGRAM.md +294 -0
  482. package/docs/pt/TEST_DEV.md +321 -0
  483. package/docs/pt/TROUBLESHOOTING.md +294 -0
  484. package/docs/pt/UPDATE.md +301 -0
  485. package/docs/pt/VPS_MODE.md +334 -0
  486. package/docs/pt/WORKFLOW.md +321 -0
  487. package/drizzle/0000_regular_nightshade.sql +644 -0
  488. package/drizzle/0001_mixed_zombie.sql +106 -0
  489. package/drizzle/meta/0000_snapshot.json +4650 -0
  490. package/drizzle/meta/0001_snapshot.json +5418 -0
  491. package/drizzle/meta/_journal.json +20 -0
  492. package/drizzle.config.mjs +16 -0
  493. package/next.config.mjs +18 -0
  494. package/package.json +130 -0
  495. package/scripts/clean-repo.mjs +20 -0
  496. package/scripts/dev-all.mjs +46 -0
  497. package/scripts/i18n-parity.mjs +57 -0
  498. package/scripts/mcp-server.mjs +100 -0
  499. package/scripts/postbuild.mjs +11 -0
  500. package/scripts/publish-public.mjs +116 -0
  501. package/scripts/start-all.mjs +45 -0
  502. package/scripts/trim-next.mjs +23 -0
  503. package/scripts/vps-install.sh +39 -0
  504. package/skills/CONTRIBUTING.md +122 -0
  505. package/skills/COVERAGE.md +129 -0
  506. package/skills/INDEX.json +3443 -0
  507. package/skills/README.md +57 -0
  508. package/skills/design/animation-motion/SKILL.md +60 -0
  509. package/skills/design/color-and-typography/SKILL.md +60 -0
  510. package/skills/design/css-techniques/SKILL.md +58 -0
  511. package/skills/design/design-systems/SKILL.md +60 -0
  512. package/skills/design/gradients/SKILL.md +59 -0
  513. package/skills/design/graphic-design-basics/SKILL.md +55 -0
  514. package/skills/design/microinteractions/SKILL.md +58 -0
  515. package/skills/design/responsive-layout/SKILL.md +59 -0
  516. package/skills/design/ui-ux-principles/SKILL.md +58 -0
  517. package/skills/engineering/architecture/api-design-rest-graphql/SKILL.md +67 -0
  518. package/skills/engineering/architecture/caching-strategies/SKILL.md +59 -0
  519. package/skills/engineering/architecture/data-modeling/SKILL.md +64 -0
  520. package/skills/engineering/architecture/message-queues-async/SKILL.md +58 -0
  521. package/skills/engineering/architecture/scalability-reliability/SKILL.md +62 -0
  522. package/skills/engineering/architecture/software-architecture-patterns/SKILL.md +56 -0
  523. package/skills/engineering/architecture/system-design-fundamentals/SKILL.md +56 -0
  524. package/skills/engineering/backend/auth-and-authorization/SKILL.md +62 -0
  525. package/skills/engineering/backend/backend-fundamentals/SKILL.md +65 -0
  526. package/skills/engineering/backend/observability-logging/SKILL.md +60 -0
  527. package/skills/engineering/frontend/accessibility-wcag/SKILL.md +57 -0
  528. package/skills/engineering/frontend/frontend-architecture/SKILL.md +65 -0
  529. package/skills/engineering/frontend/rendering-strategies-ssr-csr/SKILL.md +60 -0
  530. package/skills/engineering/frontend/state-management/SKILL.md +69 -0
  531. package/skills/engineering/performance/backend-performance/SKILL.md +69 -0
  532. package/skills/engineering/performance/database-query-optimization/SKILL.md +64 -0
  533. package/skills/engineering/performance/profiling-and-benchmarking/SKILL.md +60 -0
  534. package/skills/engineering/performance/web-performance-core-vitals/SKILL.md +72 -0
  535. package/skills/engineering/practices/clean-code/SKILL.md +61 -0
  536. package/skills/engineering/practices/code-optimization/SKILL.md +60 -0
  537. package/skills/engineering/practices/code-review-practices/SKILL.md +58 -0
  538. package/skills/engineering/practices/git-workflow/SKILL.md +62 -0
  539. package/skills/engineering/practices/refactoring/SKILL.md +58 -0
  540. package/skills/engineering/security/appsec-fundamentals/SKILL.md +70 -0
  541. package/skills/engineering/security/dependency-supply-chain/SKILL.md +77 -0
  542. package/skills/engineering/security/owasp-asvs/SKILL.md +54 -0
  543. package/skills/engineering/security/owasp-top-10/SKILL.md +63 -0
  544. package/skills/engineering/security/secrets-management/SKILL.md +58 -0
  545. package/skills/engineering/security/secure-auth-sessions/SKILL.md +56 -0
  546. package/skills/engineering/testing/tdd-and-coverage/SKILL.md +62 -0
  547. package/skills/engineering/testing/testing-strategy-pyramid/SKILL.md +56 -0
  548. package/skills/engineering/testing/unit-integration-e2e/SKILL.md +75 -0
  549. package/skills/languages/c/SKILL.md +74 -0
  550. package/skills/languages/clojure/SKILL.md +73 -0
  551. package/skills/languages/cpp/SKILL.md +75 -0
  552. package/skills/languages/csharp/SKILL.md +75 -0
  553. package/skills/languages/dart/SKILL.md +82 -0
  554. package/skills/languages/elixir/SKILL.md +74 -0
  555. package/skills/languages/erlang/SKILL.md +76 -0
  556. package/skills/languages/go/SKILL.md +83 -0
  557. package/skills/languages/haskell/SKILL.md +70 -0
  558. package/skills/languages/java/SKILL.md +71 -0
  559. package/skills/languages/javascript/SKILL.md +62 -0
  560. package/skills/languages/kotlin/SKILL.md +68 -0
  561. package/skills/languages/lua/SKILL.md +79 -0
  562. package/skills/languages/objectivec/SKILL.md +83 -0
  563. package/skills/languages/php/SKILL.md +74 -0
  564. package/skills/languages/python/SKILL.md +68 -0
  565. package/skills/languages/r/SKILL.md +70 -0
  566. package/skills/languages/ruby/SKILL.md +67 -0
  567. package/skills/languages/rust/SKILL.md +72 -0
  568. package/skills/languages/scala/SKILL.md +73 -0
  569. package/skills/languages/swift/SKILL.md +73 -0
  570. package/skills/languages/typescript/SKILL.md +69 -0
  571. package/skills/meta/authoring-agent-skills/SKILL.md +73 -0
  572. package/skills/meta/progressive-disclosure/SKILL.md +65 -0
  573. package/skills/meta/skill-frontmatter-spec/SKILL.md +65 -0
  574. package/skills/process/adr-technical-decisions/SKILL.md +59 -0
  575. package/skills/process/app-planning/SKILL.md +63 -0
  576. package/skills/process/architecture-before-code/SKILL.md +52 -0
  577. package/skills/process/breaking-work-into-sprints/SKILL.md +53 -0
  578. package/skills/process/idea-to-product/SKILL.md +50 -0
  579. package/skills/process/mocks-and-screen-flows/SKILL.md +52 -0
  580. package/skills/process/prioritization-moscow-rice/SKILL.md +64 -0
  581. package/skills/process/problem-framing/SKILL.md +51 -0
  582. package/skills/process/product-discovery/SKILL.md +53 -0
  583. package/skills/process/readme-generation/SKILL.md +90 -0
  584. package/skills/process/requirements-to-specs/SKILL.md +53 -0
  585. package/skills/process/research-official-docs/SKILL.md +58 -0
  586. package/skills/process/review-code-perf-security/SKILL.md +65 -0
  587. package/skills/process/security-by-design/SKILL.md +68 -0
  588. package/skills/process/specs-to-issues/SKILL.md +53 -0
  589. package/skills/process/testing-before-done/SKILL.md +61 -0
  590. package/skills/process/validating-ux-navigation/SKILL.md +63 -0
  591. package/skills/references/ai-attachments-ui/SKILL.md +66 -0
  592. package/skills/references/ai-in-browser-webllm/SKILL.md +74 -0
  593. package/skills/references/ai-tool-ui-patterns/SKILL.md +63 -0
  594. package/skills/references/component-patterns-gallery/SKILL.md +62 -0
  595. package/skills/references/gradient-resources/SKILL.md +66 -0
  596. package/skills/references/react-component-libraries/SKILL.md +61 -0
  597. package/skills/references/saas-landing-patterns/SKILL.md +67 -0
  598. package/skills/references/shadcn-tailwind-theming/SKILL.md +74 -0
  599. package/skills/references/vercel-ai-sdk-elements/SKILL.md +66 -0
  600. package/skills/references/web-animation-codrops/SKILL.md +68 -0
  601. package/skills/stacks/aiml/jupyter/SKILL.md +68 -0
  602. package/skills/stacks/aiml/keras/SKILL.md +77 -0
  603. package/skills/stacks/aiml/numpy/SKILL.md +69 -0
  604. package/skills/stacks/aiml/pandas/SKILL.md +72 -0
  605. package/skills/stacks/aiml/pytorch/SKILL.md +77 -0
  606. package/skills/stacks/aiml/scikit-learn/SKILL.md +74 -0
  607. package/skills/stacks/aiml/tensorflow/SKILL.md +79 -0
  608. package/skills/stacks/auth/auth0/SKILL.md +63 -0
  609. package/skills/stacks/auth/authjs/SKILL.md +69 -0
  610. package/skills/stacks/auth/clerk/SKILL.md +72 -0
  611. package/skills/stacks/auth/keycloak/SKILL.md +63 -0
  612. package/skills/stacks/auth/lucia/SKILL.md +56 -0
  613. package/skills/stacks/auth/passport/SKILL.md +70 -0
  614. package/skills/stacks/auth/supabase-auth/SKILL.md +66 -0
  615. package/skills/stacks/baas/amplify/SKILL.md +71 -0
  616. package/skills/stacks/baas/appwrite/SKILL.md +79 -0
  617. package/skills/stacks/baas/firebase/SKILL.md +73 -0
  618. package/skills/stacks/baas/heroku/SKILL.md +71 -0
  619. package/skills/stacks/backend/actix/SKILL.md +77 -0
  620. package/skills/stacks/backend/adonisjs/SKILL.md +65 -0
  621. package/skills/stacks/backend/aspnet-core/SKILL.md +75 -0
  622. package/skills/stacks/backend/codeigniter/SKILL.md +76 -0
  623. package/skills/stacks/backend/django/SKILL.md +62 -0
  624. package/skills/stacks/backend/express/SKILL.md +65 -0
  625. package/skills/stacks/backend/fastapi/SKILL.md +64 -0
  626. package/skills/stacks/backend/fastify/SKILL.md +64 -0
  627. package/skills/stacks/backend/fiber/SKILL.md +68 -0
  628. package/skills/stacks/backend/flask/SKILL.md +71 -0
  629. package/skills/stacks/backend/gin/SKILL.md +68 -0
  630. package/skills/stacks/backend/graphql/SKILL.md +70 -0
  631. package/skills/stacks/backend/hono/SKILL.md +64 -0
  632. package/skills/stacks/backend/koa/SKILL.md +63 -0
  633. package/skills/stacks/backend/laravel/SKILL.md +73 -0
  634. package/skills/stacks/backend/nestjs/SKILL.md +70 -0
  635. package/skills/stacks/backend/nginx/SKILL.md +77 -0
  636. package/skills/stacks/backend/phoenix/SKILL.md +68 -0
  637. package/skills/stacks/backend/rails/SKILL.md +67 -0
  638. package/skills/stacks/backend/spring/SKILL.md +70 -0
  639. package/skills/stacks/backend/spring-boot/SKILL.md +70 -0
  640. package/skills/stacks/backend/symfony/SKILL.md +77 -0
  641. package/skills/stacks/container/containerd/SKILL.md +75 -0
  642. package/skills/stacks/container/docker/SKILL.md +90 -0
  643. package/skills/stacks/container/podman/SKILL.md +93 -0
  644. package/skills/stacks/database/cassandra/SKILL.md +74 -0
  645. package/skills/stacks/database/cockroachdb/SKILL.md +69 -0
  646. package/skills/stacks/database/dynamodb/SKILL.md +62 -0
  647. package/skills/stacks/database/mariadb/SKILL.md +71 -0
  648. package/skills/stacks/database/mongodb/SKILL.md +71 -0
  649. package/skills/stacks/database/mysql/SKILL.md +72 -0
  650. package/skills/stacks/database/neon/SKILL.md +68 -0
  651. package/skills/stacks/database/planetscale/SKILL.md +70 -0
  652. package/skills/stacks/database/postgresql/SKILL.md +81 -0
  653. package/skills/stacks/database/redis/SKILL.md +78 -0
  654. package/skills/stacks/database/sqlite/SKILL.md +70 -0
  655. package/skills/stacks/database/supabase/SKILL.md +79 -0
  656. package/skills/stacks/dataviz/chart-js/SKILL.md +72 -0
  657. package/skills/stacks/dataviz/d3/SKILL.md +77 -0
  658. package/skills/stacks/dataviz/grafana/SKILL.md +69 -0
  659. package/skills/stacks/dataviz/plotly/SKILL.md +71 -0
  660. package/skills/stacks/frontend/alpine/SKILL.md +75 -0
  661. package/skills/stacks/frontend/angular/SKILL.md +75 -0
  662. package/skills/stacks/frontend/backbone/SKILL.md +82 -0
  663. package/skills/stacks/frontend/ember/SKILL.md +85 -0
  664. package/skills/stacks/frontend/htmx/SKILL.md +73 -0
  665. package/skills/stacks/frontend/lit/SKILL.md +76 -0
  666. package/skills/stacks/frontend/preact/SKILL.md +74 -0
  667. package/skills/stacks/frontend/qwik/SKILL.md +65 -0
  668. package/skills/stacks/frontend/react/SKILL.md +77 -0
  669. package/skills/stacks/frontend/solidjs/SKILL.md +75 -0
  670. package/skills/stacks/frontend/svelte/SKILL.md +70 -0
  671. package/skills/stacks/frontend/vue/SKILL.md +69 -0
  672. package/skills/stacks/infra/ansible/SKILL.md +76 -0
  673. package/skills/stacks/infra/aws/SKILL.md +66 -0
  674. package/skills/stacks/infra/azure/SKILL.md +72 -0
  675. package/skills/stacks/infra/circleci/SKILL.md +78 -0
  676. package/skills/stacks/infra/cloudflare/SKILL.md +65 -0
  677. package/skills/stacks/infra/fly-io/SKILL.md +63 -0
  678. package/skills/stacks/infra/gcp/SKILL.md +66 -0
  679. package/skills/stacks/infra/jenkins/SKILL.md +73 -0
  680. package/skills/stacks/infra/kubernetes/SKILL.md +64 -0
  681. package/skills/stacks/infra/netlify/SKILL.md +60 -0
  682. package/skills/stacks/infra/railway/SKILL.md +63 -0
  683. package/skills/stacks/infra/tailscale/SKILL.md +65 -0
  684. package/skills/stacks/infra/terraform/SKILL.md +75 -0
  685. package/skills/stacks/infra/vagrant/SKILL.md +70 -0
  686. package/skills/stacks/infra/vercel/SKILL.md +60 -0
  687. package/skills/stacks/meta/astro/SKILL.md +64 -0
  688. package/skills/stacks/meta/docusaurus/SKILL.md +71 -0
  689. package/skills/stacks/meta/eleventy/SKILL.md +69 -0
  690. package/skills/stacks/meta/gatsby/SKILL.md +63 -0
  691. package/skills/stacks/meta/hugo/SKILL.md +73 -0
  692. package/skills/stacks/meta/jekyll/SKILL.md +70 -0
  693. package/skills/stacks/meta/nextjs/SKILL.md +62 -0
  694. package/skills/stacks/meta/nuxt/SKILL.md +66 -0
  695. package/skills/stacks/meta/remix/SKILL.md +67 -0
  696. package/skills/stacks/meta/sveltekit/SKILL.md +70 -0
  697. package/skills/stacks/meta/vite/SKILL.md +63 -0
  698. package/skills/stacks/mobile/android/SKILL.md +77 -0
  699. package/skills/stacks/mobile/flutter/SKILL.md +77 -0
  700. package/skills/stacks/mobile/ionic/SKILL.md +72 -0
  701. package/skills/stacks/mobile/nativescript/SKILL.md +71 -0
  702. package/skills/stacks/mobile/react-native/SKILL.md +75 -0
  703. package/skills/stacks/mobile/xamarin/SKILL.md +73 -0
  704. package/skills/stacks/orm/diesel/SKILL.md +72 -0
  705. package/skills/stacks/orm/django-orm/SKILL.md +58 -0
  706. package/skills/stacks/orm/drizzle/SKILL.md +67 -0
  707. package/skills/stacks/orm/gorm/SKILL.md +73 -0
  708. package/skills/stacks/orm/knex/SKILL.md +64 -0
  709. package/skills/stacks/orm/mongoose/SKILL.md +64 -0
  710. package/skills/stacks/orm/prisma/SKILL.md +64 -0
  711. package/skills/stacks/orm/sequelize/SKILL.md +65 -0
  712. package/skills/stacks/orm/sqlalchemy/SKILL.md +71 -0
  713. package/skills/stacks/orm/typeorm/SKILL.md +70 -0
  714. package/skills/stacks/queue/bullmq/SKILL.md +69 -0
  715. package/skills/stacks/queue/celery/SKILL.md +68 -0
  716. package/skills/stacks/queue/kafka/SKILL.md +66 -0
  717. package/skills/stacks/queue/nats/SKILL.md +66 -0
  718. package/skills/stacks/queue/rabbitmq/SKILL.md +64 -0
  719. package/skills/stacks/queue/redis/SKILL.md +66 -0
  720. package/skills/stacks/runtime/beam/SKILL.md +72 -0
  721. package/skills/stacks/runtime/bun/SKILL.md +80 -0
  722. package/skills/stacks/runtime/deno/SKILL.md +74 -0
  723. package/skills/stacks/runtime/dotnet/SKILL.md +64 -0
  724. package/skills/stacks/runtime/jvm/SKILL.md +66 -0
  725. package/skills/stacks/runtime/node/SKILL.md +70 -0
  726. package/skills/stacks/runtime/pypy/SKILL.md +69 -0
  727. package/skills/stacks/runtime/python3/SKILL.md +70 -0
  728. package/skills/stacks/styling/bootstrap/SKILL.md +74 -0
  729. package/skills/stacks/styling/bulma/SKILL.md +80 -0
  730. package/skills/stacks/styling/chakra-ui/SKILL.md +61 -0
  731. package/skills/stacks/styling/css-modules/SKILL.md +54 -0
  732. package/skills/stacks/styling/mui/SKILL.md +60 -0
  733. package/skills/stacks/styling/sass/SKILL.md +63 -0
  734. package/skills/stacks/styling/shadcn-ui/SKILL.md +58 -0
  735. package/skills/stacks/styling/styled-components/SKILL.md +62 -0
  736. package/skills/stacks/styling/tailwind/SKILL.md +59 -0
  737. package/skills/stacks/styling/unocss/SKILL.md +64 -0
  738. package/skills/stacks/styling/vanilla-extract/SKILL.md +64 -0
  739. package/skills/stacks/styling/vuetify/SKILL.md +89 -0
  740. package/skills/stacks/testing/cypress/SKILL.md +68 -0
  741. package/skills/stacks/testing/jasmine/SKILL.md +67 -0
  742. package/skills/stacks/testing/jest/SKILL.md +67 -0
  743. package/skills/stacks/testing/mocha/SKILL.md +71 -0
  744. package/skills/stacks/testing/playwright/SKILL.md +68 -0
  745. package/skills/stacks/testing/puppeteer/SKILL.md +70 -0
  746. package/skills/stacks/testing/selenium/SKILL.md +70 -0
  747. package/skills/stacks/testing/vitest/SKILL.md +68 -0
@@ -0,0 +1,327 @@
1
+ [← Índice](./README.md) · [🇬🇧 English](../en/ONBOARDING.md) · [✦ Constella](../../README.pt-BR.md)
2
+
3
+ # Onboarding 🌌 — Acendendo uma Nova Constelação
4
+
5
+ O assistente de primeira execução que transforma um runtime vazio em uma empresa de agentes viva: cria a organização + workspace, monta a camada de controle `.claude/`, acende a constelação de dez agentes, semeia skills e plugins, opcionalmente importa um projeto existente e entrega o operador ao Planner do CEO.
6
+
7
+ ---
8
+
9
+ ## Quando usar
10
+
11
+ - **Na primeiríssima execução.** Sem organização ainda, [`requireWorkspace()`](../pt/ARCHITECTURE.md) redireciona para `/onboarding` automaticamente (`src/lib/workspace.ts`).
12
+ - **Forçando o assistente de novo.** Lance com `npx constella --onboarding` (ou o subcomando `onboard` / `onboarding`). O `bin/constella.mjs` define `CONSTELLA_FORCE_ONBOARDING=1`, que o `requireWorkspace()` respeita redirecionando para `/onboarding` mesmo quando já existe uma org.
13
+ - **Criando uma organização adicional** para um operador que já possui uma (o assistente mostra o botão Fechar apenas nesse caso).
14
+
15
+ > 🪐 O onboarding é uma *armadilha de disparo único*. No instante em que `completeOnboarding()` roda, ele chama `delete process.env.CONSTELLA_FORCE_ONBOARDING`, então o próximo `requireWorkspace()` não redireciona mais para cá.
16
+
17
+ ---
18
+
19
+ ## Como funciona
20
+
21
+ O onboarding é um assistente cliente de cinco passos (`src/app/(auth)/onboarding/page.tsx`) apoiado por uma única server action, `completeOnboarding()` em `src/server/onboarding.ts`. O assistente coleta a identidade da empresa, o cérebro do CEO (provider + model), um teste de conexão real, o stack do projeto e um brief / source — então a server action faz o trabalho pesado:
22
+
23
+ 1. Cria as linhas `organization` + `member` (owner) + `workspace`. O run mode ativo (`getRunMode()`) é gravado em `organization.runMode`.
24
+ 2. Opcionalmente registra um provider de fallback e guarda sua chave no vault.
25
+ 3. **Importa** material existente (repo do GitHub ou diretório local) *antes* do scaffold, para que o `README.md` importado sobreviva.
26
+ 4. **Monta** a camada de controle `.claude/` mais `DOCS/`, `PO/`, `Reports/`, `specs/`, `issues/` (`scaffoldWorkspace`).
27
+ 5. Apenas para um projeto realmente novo, escreve um **starter executável** (`scaffoldProjectStarter`).
28
+ 6. Persiste o descritor da fonte do projeto em `workspace.settings.source` (com `analyzed: false`).
29
+ 7. Cria os **dez agentes**, aplica as escolhas de CEO do operador na Ada e guarda o brief em `.claude/BRIEF.md`.
30
+ 8. Escreve quaisquer arquivos de mock anexados em `mock/`.
31
+ 9. Semeia as **skills** nativas + da biblioteca, reconcilia os vínculos por stack/role e cria os quatro **plugins** nativos.
32
+ 10. Marca a org como ativa na sessão e faz `redirect("/planner")`.
33
+
34
+ O **primeiro plano** (disparado depois, quando o operador clica em *Generate plan* no `/planner`) roda a análise arquivo-por-arquivo que produz `specs/SUPER-SPEC.md` — veja [Análise do primeiro plano](#análise-do-primeiro-plano--specssuper-specmd-) abaixo.
35
+
36
+ ---
37
+
38
+ ## Fluxo principal 🛰️
39
+
40
+ ```mermaid
41
+ flowchart TD
42
+ L["npx constella<br/>(sem org ainda)"] --> RW["requireWorkspace()"]
43
+ RW -->|sem org / FORCE=1| OB["assistente /onboarding"]
44
+ OB --> S0["1 · Empresa<br/>nome · missão · objetivo"]
45
+ S0 --> S1["2 · Cérebro do CEO<br/>provider + model"]
46
+ S1 --> S2["3 · Teste de conexão<br/>env → adapter → connection → model"]
47
+ S2 --> S3["4 · Stack do projeto<br/>17 categorias"]
48
+ S3 --> S4["5 · Brief & source<br/>new | github | local · mock · system prompt"]
49
+ S4 --> CO["completeOnboarding()"]
50
+ CO --> ORG["cria org + workspace + member"]
51
+ ORG --> IMP{"source?"}
52
+ IMP -->|github| GH["cloneRepoIntoWorkspace()"]
53
+ IMP -->|local| LD["copyLocalDirIntoWorkspace()"]
54
+ IMP -->|new| NEW["sem import"]
55
+ GH --> SCAF["scaffoldWorkspace()<br/>(preserveReadme se importado)"]
56
+ LD --> SCAF
57
+ NEW --> SCAF
58
+ SCAF --> ST{"tem material?"}
59
+ ST -->|não| STARTER["scaffoldProjectStarter()<br/>dev server executável"]
60
+ ST -->|sim| SKIP["starter suprimido"]
61
+ STARTER --> AG["cria 10 agentes · brief · skills · plugins"]
62
+ SKIP --> AG
63
+ AG --> RP["redirect('/planner')"]
64
+ RP --> GP["operador clica Generate plan"]
65
+ GP --> ANA{"hasMaterial && !analyzed?"}
66
+ ANA -->|sim| SS["analyzeExistingProject()<br/>→ specs/SUPER-SPEC.md"]
67
+ ANA -->|não| PLAN["rascunha specs + issues"]
68
+ SS --> PLAN
69
+ ```
70
+
71
+ ---
72
+
73
+ ## Os cinco passos do assistente 🌠
74
+
75
+ As chaves dos passos são fixas em `STEP_KEYS = ["company", "ceoModel", "connection", "stack", "brief"]`.
76
+
77
+ | # | Passo | O que o operador fornece | Obrigatório |
78
+ |---|---|---|---|
79
+ | 0 | **Empresa** | nome `company`, `mission`, `objective` | Os três |
80
+ | 1 | **Cérebro do CEO** | Escolhe um `provider` + `model` detectado (ou registra um com uma API key) | Um provider + model |
81
+ | 2 | **Teste de conexão** | Uma verificação real de quatro estágios: `checkSetupEnv` → `checkAdapter` → `testConnection` → `probeModel` | Tem que passar |
82
+ | 3 | **Stack do projeto** | Escolhe entre 17 categorias de stack (cards ou busca) | Opcional (qualquer/todas podem ficar `None`) |
83
+ | 4 | **Brief & source** | `source` do projeto (new/github/local), brief opcional, pasta de mock opcional, `systemPrompt` da Ada | `systemPrompt` + uma source pronta |
84
+
85
+ Alguns comportamentos notáveis do código:
86
+
87
+ - **A detecção de provider** roda na montagem (`detectProviders()`); o primeiro provider detectado + seu primeiro model são pré-selecionados.
88
+ - **O teste de conexão é real** — sem timers falsos. Cada estágio é uma sonda de verdade; um estágio que falha mostra seu erro e bloqueia o *Continuar*. O `adapter:model` verificado é cacheado (`testedKey`), então Voltar → Continuar não re-executa as checagens a menos que o provider ou model mude.
89
+ - **O stack** não tem auto-seleção; o operador escolhe cada categoria manualmente. Opções incompatíveis ficam desabilitadas (`incompat()`), e `stackNote()` traz uma dica.
90
+ - **Finalizar** empacota tudo (`source`, `provider`, `model`, `systemPrompt`, `briefText`/`briefName`, `mockFiles`, `providerCatalogId`/`providerKey` opcionais) em `completeOnboarding()`.
91
+
92
+ ---
93
+
94
+ ## Source do projeto: `new | github | local` 🕳️
95
+
96
+ O passo 5 escolhe de onde vem o produto. O campo `source` de `OnboardingInput` é um destes:
97
+
98
+ ```ts
99
+ source?:
100
+ | { type: "new" }
101
+ | { type: "github"; pat: string; repoFull: string; branch?: string; login?: string }
102
+ | { type: "local"; path: string };
103
+ ```
104
+
105
+ | Source | Função de import | Efeito | README |
106
+ |---|---|---|---|
107
+ | `new` | nenhuma | Projeto novo; um **starter executável** é montado | `README.md` gerado é escrito |
108
+ | `github` | `cloneRepoIntoWorkspace()` | Clona raso `owner/repo` no workspace, guarda o PAT no vault como `github_pat`, aponta o `origin` para a URL **limpa** (sem token) | README próprio do repo preservado |
109
+ | `local` | `copyLocalDirIntoWorkspace()` | Copia um snapshot de um diretório local absoluto para o workspace | README próprio do repo preservado |
110
+
111
+ Mais uma quarta source implícita: **mock** — quando `source.type === "new"` *e* `mockFiles` estão anexados, `sourceMeta.type` vira `"mock"`.
112
+
113
+ ### Regras de import (de `onboarding-import.ts`)
114
+
115
+ - Diretórios pesados/de dependências são pulados (`HEAVY_DIRS`); `.git`, `.env*` (mas **não** `.env.example`/`.sample`), `.DS_Store`, binários e arquivos grandes demais (> 512 KB cada) são pulados.
116
+ - O import local é limitado a `DEFAULT_MAX_FILES = 4000` arquivos; `DEFAULT_MAX_BYTES = 512 * 1024`.
117
+ - Toda escrita passa por `writeWorkspaceFile()` → `safe()` (jaulada por caminho; travessia rejeitada).
118
+ - O clone do GitHub usa `git clone --depth 1 --single-branch` (`--branch` opcional) em um diretório temporário com uma URL transitória `x-access-token:<pat>@github.com`, depois copia para dentro e aponta o `origin` para `https://github.com/<owner>/<repo>.git`. O token é **redigido** de toda string retornada/logada.
119
+ - `validateLocalDir(path)` (server action via `scanLocalDir`) verifica que o caminho é absoluto e um diretório real com arquivos importáveis; retorna um `fileCount` + uma `sample` de 8 arquivos (sem vazar conteúdo).
120
+
121
+ ### `preserveReadme` — por que o README importado vence
122
+
123
+ Após o import, `completeOnboarding()` computa `importedReadme = readWorkspaceFile(orgId, "README.md") != null` e passa `preserveReadme` para `scaffoldWorkspace()`. Em `workspaceFiles()` o `README.md` gerado só é adicionado quando `!c.preserveReadme`, então um repo importado mantém seu **próprio** README enquanto a camada de controle `.claude/` se assenta por cima.
124
+
125
+ ---
126
+
127
+ ## O starter executável (apenas projetos realmente novos) 🚀
128
+
129
+ Quando não há **material** (`hasMaterial = sourceMeta.type !== "new" || hasMock` é `false`), `scaffoldProjectStarter()` escreve um app real e configurado que sobe um dev server de imediato — para que o [Test Dev](../pt/TEST_DEV.md) possa pré-visualizá-lo já e os agentes construam o produto *por cima* dele. O starter é escrito **somente-se-ausente**, então edições dos agentes nunca são sobrescritas, e ele **não** faz parte de `workspaceFiles()` (então `bootstrapWorkspace`/`rerenderMissionDocs` nunca podem sobrescrever código de produto).
130
+
131
+ O template é escolhido por `pickStarter(stack)` em `src/data/project-starter.ts`. A precedência da seleção: meta-framework → estático/sem-framework explícito → baseline Vite pelo frontend → framework de backend → fallback de linguagem → o servidor Node `static` sempre-inicializável.
132
+
133
+ ### Ids de starter (`StarterId`)
134
+
135
+ | `StarterId` | Escolhido quando (exemplos) | Sobe com |
136
+ |---|---|---|
137
+ | `next` | `meta = "Next.js"` | `next dev` |
138
+ | `vite-react` | `frontend = "React"` (ou fallback de linguagem TS/JS) | `vite` |
139
+ | `vite-vue` | `frontend = "Vue"` | `vite` |
140
+ | `vite-svelte` | `frontend = "Svelte"` ou `meta = "SvelteKit"` | `vite` |
141
+ | `node-express` | `backend = "Express"` | `node server.js` |
142
+ | `node-fastify` | `backend = "Fastify"` | `node server.js` |
143
+ | `node-koa` | `backend = "Koa"` | `node server.js` |
144
+ | `node-hono` | `backend = "Hono"` | `node server.js` |
145
+ | `node-nest` | `backend = "NestJS"` | `tsx watch src/main.ts` |
146
+ | `fastapi` | `backend = "FastAPI"` | `uvicorn` |
147
+ | `flask` | `backend = "Flask"` ou `language = "Python"` | `python main.py` |
148
+ | `django` | `backend = "Django"` | `manage.py` |
149
+ | `go-http` | `language = "Go"` | `net/http` |
150
+ | `go-gin` | `backend = "Gin"` | `gin` |
151
+ | `rust-axum` | `language = "Rust"` | `axum` |
152
+ | `rust-actix` | `backend = "Actix"` | `actix-web` |
153
+ | `static` | `HTML/CSS`, `Vanilla JS`, `Static (no framework)`, ou qualquer coisa desconhecida | `http` puro do Node |
154
+
155
+ > 🌠 O template `static` é o **fallback universal**: o Node está sempre presente, então todo projeto sobe *alguma coisa* independentemente do stack.
156
+
157
+ Cada starter traz uma landing page temática e autocontida (paleta determinística por empresa via `paletteFor()`), um `.gitignore`, um `.env.example` e um servidor ciente de `PORT` ligado a `127.0.0.1`. A página diz "Your AI team is building **\<objective\>** on top of this starter."
158
+
159
+ ---
160
+
161
+ ## Análise do primeiro plano → `specs/SUPER-SPEC.md` 🌌
162
+
163
+ Quando o projeto tem material (repo importado, dir local copiado, mock anexado **ou** um projeto detectado em disco), o **primeiro** plano não salta direto para as specs. Em `src/server/planner-core.ts`:
164
+
165
+ ```ts
166
+ const hasMaterial = srcType !== "new" || mockFiles.length > 0 || !!detectProject(org.id);
167
+ if (!isNewWork && hasMaterial && !wsSettings.source?.analyzed) {
168
+ await analyzeExistingProject({ orgId, wsId, ada, binary, model });
169
+ // → marca settings.source.analyzed = true
170
+ }
171
+ ```
172
+
173
+ `analyzeExistingProject()` (`src/server/analyze.ts`) roda uma **passagem de agente real** como Ada (`cwd = workspace`, lê os arquivos literalmente), transmitida ao canal `planner`, que escreve/sobrescreve `specs/SUPER-SPEC.md`. Roda **uma vez por projeto** — protegida por `settings.source.analyzed`. O agente é instruído a ler em ordem: docs → manifests/config → código arquivo-por-arquivo (pulando `node_modules`, `dist`, `build`, `.next`, `.git`, `vendor`), depois escrever estas seções:
174
+
175
+ `## Overview & purpose` · `## Architecture & layers` · `## Tech stack & dependencies` · `## Directory / module map` · `## Frontend` · `## Backend` · `## Data model & database` · `## Auth & security` · `## Integrations / external services` · `## Business rules & key flows` · `## What is mock/stubbed vs real` · `## Gaps to make it production-real`.
176
+
177
+ O enquadramento crucial: a Constella **estende** exatamente o sistema existente — deve apontar qual UI/UX, comportamento e identidade visual **preservar** e onde **adicionar** backend/dados/integrações reais; nunca constrói um segundo protótipo separado. O planner do CEO então lê `specs/SUPER-SPEC.md` por completo antes de rascunhar specs e issues, e o `runner` injeta o mesmo enquadramento de "estender o código existente" em cada tarefa (`src/server/runner.ts`). Se o agente esquecer de escrever o arquivo, `analyzeExistingProject()` escreve o texto do resumo final como o super spec, então o entregável sempre existe.
178
+
179
+ ---
180
+
181
+ ## O que `completeOnboarding()` cria 🪐
182
+
183
+ | Artefato | Onde | Notas |
184
+ |---|---|---|
185
+ | `organization` | DB | `runMode` de `getRunMode()` |
186
+ | `member` | DB | role `owner` |
187
+ | `workspace` | DB | `mission`, `objective`, `stack`; `settings.source` + `settings.github` opcional |
188
+ | Camada de controle `.claude/` | disco | org/workspace/permissions/memory/routing/index/CLAUDE.md/settings.json |
189
+ | Starter do projeto | disco | apenas quando sem material (`scaffoldProjectStarter`) |
190
+ | 10 agentes | DB | Ada `working`, demais `idle`; health `alive` |
191
+ | Overrides de CEO da Ada | DB + `.claude/agents/ada/Agent.md` | `adapter`, `model`, system prompt |
192
+ | `.claude/BRIEF.md` | disco | quando `briefText` é fornecido |
193
+ | arquivos de `mock/` | disco | até 200 arquivos + um `mock/README.md` gerado |
194
+ | `budget` | DB | `monthlyCapUsd: 400` |
195
+ | `plan` | DB | `stage: 4` |
196
+ | Skills nativas + da biblioteca | DB + disco | 6 skills procedurais + toda a biblioteca de skills; `reconcileStackRoleSkills()` vincula por stack/role |
197
+ | 4 plugins nativos | DB | GitHub, Telegram, Vault (habilitados), Web Search (desligado por padrão) |
198
+ | Org ativa na sessão | DB | depois `redirect("/planner")` |
199
+
200
+ ### Os dez agentes
201
+
202
+ | Handle | Nome | Função | Reporta a | Model | Teto diário (USD) | Tier |
203
+ |---|---|---|---|---|---|---|
204
+ | `ada` | Ada | CEO | — | opus¹ | 15 | critical |
205
+ | `linus` | Linus | CTO | `ada` | sonnet | 40 | critical |
206
+ | `donald` | Donald | Product Owner | `ada` | haiku | 20 | heavy |
207
+ | `margaret` | Margaret | Backend | `linus` | sonnet | 50 | heavy |
208
+ | `grace` | Grace | Frontend | `linus` | sonnet | 45 | heavy |
209
+ | `edsger` | Edsger | QA | `linus` | haiku | 25 | heavy |
210
+ | `werner` | Werner | DevOps | `linus` | haiku | 20 | heavy |
211
+ | `barbara` | Barbara | Docs | `ada` | haiku | 15 | light |
212
+ | `whitfield` | Whitfield | CyberSec | `linus` | opus | 30 | critical |
213
+ | `vannevar` | Vannevar | Knowledge | `ada` | haiku | 10 | light |
214
+
215
+ ¹ O arquivo de persona da Ada usa `sonnet` por padrão, mas a escolha de cérebro-do-CEO do operador (`provider`/`model`) o sobrescreve durante o onboarding. Os tetos diários são limites em USD; o workspace também recebe um orçamento `monthlyCapUsd: 400`.
216
+
217
+ ---
218
+
219
+ ## Passo a passo (operador) ✦
220
+
221
+ 1. **Lançar.** `npx constella` (ou `--onboarding` para forçar o assistente).
222
+ 2. **Empresa.** Informe o nome da empresa, missão e objetivo. Os três são obrigatórios.
223
+ 3. **Cérebro do CEO.** Escolha um provider + model detectado, ou expanda *Registrar* para adicionar um com um id de model e API key.
224
+ 4. **Teste de conexão.** Acompanhe os quatro testes reais passarem. Corrija qualquer estágio falho antes de continuar.
225
+ 5. **Stack.** Navegue pelos cards das 17 categorias (ou busque) e escolha o que se aplica; deixe o resto como `None`.
226
+ 6. **Brief & source.** Escolha `new`, `github` (cole um PAT → liste repos → escolha um) ou `local` (digite um caminho absoluto → Validar). Opcionalmente cole um brief e/ou anexe uma pasta de mock. Edite o system prompt da Ada.
227
+ 7. **Entregar.** Clique no botão de finalizar. O assistente chama `completeOnboarding()` e redireciona para `/planner`.
228
+ 8. **Gerar plano.** No Planner, clique em *Generate plan* para disparar o ritual do CEO (e, para projetos importados/mock, a análise de super-spec de uma vez).
229
+
230
+ ---
231
+
232
+ ## Exemplos
233
+
234
+ **Forçar o assistente pela CLI:**
235
+
236
+ ```bash
237
+ npx constella --onboarding
238
+ # ou o subcomando explícito
239
+ npx constella onboard
240
+ ```
241
+
242
+ **Importar um repo do GitHub no onboarding** — o assistente envia:
243
+
244
+ ```ts
245
+ source = { type: "github", pat: "ghp_…", repoFull: "acme/web-app", branch: "main", login: "acme" }
246
+ ```
247
+
248
+ → `cloneRepoIntoWorkspace()` clona raso `acme/web-app`, guarda o PAT no vault, define `origin` para a URL limpa, e `preserveReadme` mantém o README do repo.
249
+
250
+ **Importar um diretório local:**
251
+
252
+ ```ts
253
+ source = { type: "local", path: "C:\\Users\\voce\\projeto" }
254
+ ```
255
+
256
+ → `validateLocalDir()` confirma, depois `copyLocalDirIntoWorkspace()` faz snapshot de até 4000 arquivos (pulando deps/segredos/binários).
257
+
258
+ ---
259
+
260
+ ## Estados possíveis 🕳️
261
+
262
+ | Estado | Significado | Onde |
263
+ |---|---|---|
264
+ | `CONSTELLA_FORCE_ONBOARDING=1` | Assistente forçado; limpo no primeiro `completeOnboarding()` | `bin/constella.mjs`, `workspace.ts`, `onboarding.ts` |
265
+ | `source.type = new` | Projeto novo; starter executável montado | `workspace.settings.source` |
266
+ | `source.type = github\|local\|mock` | Material importado; starter suprimido | `workspace.settings.source` |
267
+ | `source.analyzed = false` | O primeiro plano rodará a análise de super-spec | `workspace.settings.source` |
268
+ | `source.analyzed = true` | Análise feita; o planner lê `specs/SUPER-SPEC.md` | definido por `planner-core.ts` |
269
+ | import falhou | Logado no console; org criada mesmo assim; `sourceMeta` recomputado pelo que chegou | `onboarding.ts` |
270
+ | status do agente | Ada `working`, o resto `idle`; health `alive` | tabela `agent` |
271
+
272
+ ---
273
+
274
+ ## Integrações relacionadas 🛰️
275
+
276
+ - **[Project stacks](../pt/PROJECT_STACKS.md)** — o `stack` escolhido dirige o template do starter e o vínculo de skills.
277
+ - **[Skills](../pt/SKILLS.md)** — `seedLibrarySkills` + `reconcileStackRoleSkills` vinculam cada agente às skills que seu stack e função precisam.
278
+ - **[Plugins](../pt/PLUGINS.md)** — GitHub, Telegram, Vault e Web Search são criados como plugins nativos.
279
+ - **[GitHub](../pt/GITHUB.md)** — import de repo, guarda do PAT no vault e limpeza do `origin`.
280
+ - **[Models](../pt/MODELS.md)** — detecção de provider/model e o teste de conexão.
281
+ - **[Workflow](../pt/WORKFLOW.md)** / **[Goals, specs & issues](../pt/GOALS_SPECS_ISSUES.md)** — o que o primeiro plano produz após o onboarding.
282
+ - **[Test Dev](../pt/TEST_DEV.md)** — sobe o starter executável para uma pré-visualização imediata.
283
+
284
+ ---
285
+
286
+ ## Segurança 🔒
287
+
288
+ - **Jaula de caminho.** Todo arquivo importado é escrito através de `writeWorkspaceFile()` → `safe()` (checagens léxicas + de symlink; travessia rejeitada; caminhos começando com `..` pulados).
289
+ - **Higiene de token.** O PAT do GitHub é usado apenas transitoriamente na URL de clone, depois o `origin` é resetado para a `https://github.com/<owner>/<repo>.git` limpa; o token é redigido de todas as strings retornadas/logadas e guardado no vault como `github_pat` (AES-256-GCM via o [Vault](../pt/SECURITY.md)).
290
+ - **Pulando segredos no import.** `.env`, `.env.local`, `.env.development`, `.env.production` e `.DS_Store` nunca são copiados (`.env.example`/`.sample` são mantidos); binários e arquivos grandes demais são pulados.
291
+ - **Estado vazio honesto.** Nenhum goal/task/spec/issue falso é semeado — os boards começam realmente vazios; artefatos reais vêm do ritual do CEO e das execuções de agentes.
292
+ - **Permissões ligadas ao modo.** O `runMode` da org/workspace (de `getRunMode()`) determina o modo de permissão de agente que o runner aplica depois (`bypassPermissions` no `start`, `acceptEdits` caso contrário) — veja [Segurança](../pt/SECURITY.md).
293
+
294
+ ---
295
+
296
+ ## Solução de problemas
297
+
298
+ | Sintoma | Causa provável | Correção |
299
+ |---|---|---|
300
+ | O assistente reabre após finalizar | `CONSTELLA_FORCE_ONBOARDING` ainda definido no ambiente | É limpo no processo no primeiro `completeOnboarding()`; remova a flag `--onboarding` / desfaça a env var ao relançar |
301
+ | *Continuar* desabilitado no passo de teste | Uma checagem real falhou (`env`/`adapter`/`connection`/`model`) | Leia o erro inline; corrija o provider/CLI/API key, depois re-selecione o provider para re-verificar |
302
+ | GitHub *List repos* falha | PAT inválido/expirado ou sem escopo `repo` | Use um token válido; `githubReposForToken()` retorna a string de erro |
303
+ | Local *Validate* falha | Caminho não absoluto, não é um diretório, ou vazio | `scanLocalDir()` exige um caminho absoluto para um diretório com arquivos importáveis |
304
+ | Repo importado mostra o README gerado | `preserveReadme` não disparou (sem `README.md` de topo no import) | Adicione um `README.md` à source; caso contrário o gerado é esperado |
305
+ | Sem `specs/SUPER-SPEC.md` após Generate plan | Projeto sem material, ou `source.analyzed` já era `true` | A análise só roda uma vez, e só com material; cheque `workspace.settings.source` |
306
+ | Starter não criado | O projeto tinha material (`hasMaterial`) | Por design — os agentes estendem o material importado/mock em vez disso |
307
+
308
+ ---
309
+
310
+ ## Links relacionados
311
+
312
+ - [Instalação](./INSTALLATION.md)
313
+ - [Configuração](./CONFIGURATION.md)
314
+ - [Arquitetura](./ARCHITECTURE.md)
315
+ - [Arquitetura de IA](./AI_ARCHITECTURE.md)
316
+ - [Agentes](./AGENTS.md)
317
+ - [Workflow](./WORKFLOW.md)
318
+ - [Goals, specs & issues](./GOALS_SPECS_ISSUES.md)
319
+ - [Project stacks](./PROJECT_STACKS.md)
320
+ - [Skills](./SKILLS.md)
321
+ - [Plugins](./PLUGINS.md)
322
+ - [Models](./MODELS.md)
323
+ - [GitHub](./GITHUB.md)
324
+ - [Test Dev](./TEST_DEV.md)
325
+ - [Segurança](./SECURITY.md)
326
+ - [Solução de problemas](./TROUBLESHOOTING.md)
327
+ - [FAQ](./FAQ.md)
@@ -0,0 +1,290 @@
1
+ [← Índice](./README.md) · [🇬🇧 English](../en/PLUGINS.md) · [✦ Constella](../../README.pt-BR.md)
2
+
3
+ # 🛰️ Plugins — Baias de Acoplagem para Capacidades
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ Um **plugin** no Constella é uma entrada de catálogo com escopo por workspace que nomeia uma capacidade com a qual a constelação de agentes pode se acoplar: GitHub, Telegram, o Vault, Web Search. A linha do plugin é um registro e um interruptor — o comportamento *real* vive em módulos dedicados, controlados por suas próprias configurações, segredos e variáveis de ambiente.
8
+
9
+ > Modelo mental: plugins são as **baias de acoplagem** da nave central. A baia diz que uma capacidade *existe* e se a porta dela está aberta (`enabled`). O motor ao qual a baia leva (o motor do GitHub, o relé do Telegram, o Vault) é cabeado em outro lugar.
10
+
11
+ ---
12
+
13
+ ## Quando usar 🌌
14
+
15
+ - Você quer ver, de relance, quais **integrações nativas** este workspace traz.
16
+ - Você quer ligar ou desligar o interruptor de catálogo de uma capacidade (`togglePlugin`).
17
+ - Você está registrando um placeholder para uma extensão de terceiros que pretende cabear depois (`installPlugin` — **PARCIAL / mock**, veja abaixo).
18
+ - Você precisa distinguir **plugins** de **Skills** (conhecimento do agente) e de **servidores MCP externos** (ferramentas que a CLI `claude` consome). As três camadas são distintas — veja a seção [Plugins vs Skills vs MCP externo](#plugins-vs-skills-vs-mcp-externo-).
19
+
20
+ Se você procura *habilidades de agente* (conhecimento em nível de prompt que molda como um agente trabalha), isso é **Skills**, não plugins — veja [SKILLS.md](./SKILLS.md).
21
+
22
+ ---
23
+
24
+ ## Como funciona 🪐
25
+
26
+ Existe exatamente uma tabela e três server actions. Nada além disso — a superfície é deliberadamente minúscula.
27
+
28
+ ### A tabela `plugin`
29
+
30
+ Fonte: `src/db/schema.ts`.
31
+
32
+ ```ts
33
+ export const plugin = sqliteTable("plugin", {
34
+ id: text("id").primaryKey(),
35
+ workspaceId: text("workspace_id").notNull().references(() => workspace.id, { onDelete: "cascade" }),
36
+ name: text("name").notNull(),
37
+ description: text("description").notNull().default(""),
38
+ enabled: integer("enabled", { mode: "boolean" }).notNull().default(false),
39
+ native: integer("native", { mode: "boolean" }).notNull().default(false),
40
+ });
41
+ ```
42
+
43
+ | Coluna | Tipo | Padrão | Significado |
44
+ |---------------|-----------|--------|-------------|
45
+ | `id` | text PK | — | UUID (`randomUUID()`). |
46
+ | `workspaceId` | text FK | — | Workspace dono; `ON DELETE CASCADE` — plugins morrem com o workspace. |
47
+ | `name` | text | — | Nome de exibição (`"GitHub"`, `"Telegram"`, …). |
48
+ | `description` | text | `""` | Descrição de uma linha exibida no grid. |
49
+ | `enabled` | boolean | `false`| Interruptor da porta da baia. `installPlugin` cria linhas novas como `true`; algumas linhas nativas nascem `false`. |
50
+ | `native` | boolean | `false`| `true` = criado pelo onboarding; não pode ser removido pela UI. |
51
+
52
+ Cada linha tem escopo em um único `workspaceId`. Não existe registro global de plugins — cada workspace tem sua própria constelação de baias de acoplagem.
53
+
54
+ ### Server actions
55
+
56
+ Fonte: `src/server/actions/plugin-actions.ts` (um `togglePlugin` irmão também existe em `src/server/modules.ts`).
57
+
58
+ | Action | Assinatura | O que faz |
59
+ |--------|-----------|-----------|
60
+ | `togglePlugin` | `(id: string, enabled: boolean)` | Define `plugin.enabled` para uma linha com escopo no workspace atual, e então `revalidatePath("/plugins")`. |
61
+ | `installPlugin` | `(name: string, description = "")` | **PARCIAL / mock.** Insere uma nova linha não-nativa (`enabled: true`, `native: false`) nomeada a partir da URL/nome. **Não** baixa, verifica, isola em sandbox nem cabeia nada. Retorna `{ ok }`. |
62
+ | `removePlugin` | `(id: string)` | Apaga uma linha — mas a cláusula `WHERE` inclui `eq(plugin.native, false)`, então **plugins nativos nunca podem ser removidos**. |
63
+
64
+ Toda action chama `requireWorkspace()` primeiro, então todas as escritas são isoladas por workspace e autenticadas.
65
+
66
+ ---
67
+
68
+ ## Fluxo principal 🌠
69
+
70
+ ```mermaid
71
+ flowchart TD
72
+ OB["Onboarding<br/>completeOnboarding()"] -->|"cria 4 linhas nativas"| TBL[("tabela plugin<br/>escopo por workspace")]
73
+ UI["página /plugins<br/>PluginGrid"] -->|"interruptor toggle"| TOGGLE["togglePlugin(id, enabled)"]
74
+ UI -->|"Install from URL"| INSTALL["installPlugin(name)<br/>PARCIAL / mock"]
75
+ UI -->|"Remove (só não-nativo)"| REMOVE["removePlugin(id)"]
76
+ TOGGLE --> TBL
77
+ INSTALL --> TBL
78
+ REMOVE --> TBL
79
+ TBL -. "apenas catálogo" .-> ENG["Motores reais<br/>github.ts · telegram.ts · vault.ts · cli.ts web research"]
80
+ ENG -.->|"controlados por SUAS PRÓPRIAS settings/segredos/env"| AGENTS["Constelação de agentes"]
81
+ ```
82
+
83
+ A aresta tracejada é a nuance importante: a tabela `plugin` é uma **camada de catálogo e exibição**. Os motores de capacidade reais são cabeados por seus próprios módulos e são controlados por sua própria configuração — não por `plugin.enabled`. Virar o interruptor do plugin GitHub não, por si só, define um repositório nem armazena um token; isso acontece na integração do GitHub (`src/server/github.ts`). Veja [Plugins nativos](#plugins-nativos-).
84
+
85
+ ---
86
+
87
+ ## Conceitos-chave 🕳️
88
+
89
+ - **Escopo por workspace.** Todo plugin pertence a um workspace; não há armazenamento de plugins compartilhado/global.
90
+ - **Nativo vs instalado.** Linhas `native: true` são criadas pelo onboarding e são permanentes (a UI esconde o botão de remover; `removePlugin` as ignora). Linhas `native: false` vêm de `installPlugin` e podem ser removidas.
91
+ - **Catálogo, não portão.** `enabled` é um interruptor de registro e um sinal de UI. As integrações nativas impõem a própria ativação por meio de segredos e settings — ex.: GitHub precisa de um `github_pat` no vault ou de token OAuth, Telegram precisa de um `telegram_bot_token` no vault, Web Search é controlado por `CONSTELLA_WEB_RESEARCH` / `settings.agents.webResearch` por workspace.
92
+ - **`installPlugin` é um placeholder.** Ele é honesto sobre ser um mock: o comentário no código diz *"mock — just registers it disabled"* e a descrição cai no padrão `"Installed from URL"`. Nenhum código busca, valida ou executa a URL.
93
+
94
+ ---
95
+
96
+ ## Plugins nativos 🚀
97
+
98
+ Criados uma vez durante o onboarding. Fonte: `src/server/modules.ts`:
99
+
100
+ ```ts
101
+ const plugins: [string, string, boolean][] = [
102
+ ["GitHub", "Commit, push & open PRs from the workspace.", true],
103
+ ["Telegram", "Route reports and alerts to a channel.", true],
104
+ ["Vault", "Encrypted secret storage for provider keys.", true],
105
+ ["Web Search", "Let agents look things up while planning.", false],
106
+ ];
107
+ ```
108
+
109
+ | Plugin | `enabled` inicial | Motor real | Controlado por | Docs |
110
+ |--------|-------------------|------------|----------------|------|
111
+ | **GitHub** | `true` | `src/server/github.ts` (`setRepo`, `refreshGitStatus`, commit/push, `scanForSecrets`) | `github_pat` no vault (preferido) ou `account.accessToken` OAuth; `settings.github.repo` | [GITHUB.md](./GITHUB.md) |
112
+ | **Telegram** | `true` | `src/server/telegram.ts` (`pollTelegram` no cron tick, allowlist, menu de comandos) | `telegram_bot_token` no vault; allowlist de chat/usuário | [TELEGRAM.md](./TELEGRAM.md) |
113
+ | **Vault** | `true` | `src/lib/vault.ts` (AES-256-GCM, tabela `vault`) | `CONSTELLA_VAULT_KEY` | [SECURITY.md](./SECURITY.md) |
114
+ | **Web Search** | `false` | `src/server/adapters/cli.ts` (`--allowedTools WebSearch WebFetch`) | `CONSTELLA_WEB_RESEARCH` (padrão ON) e `settings.agents.webResearch` por workspace | [AGENTS.md](./AGENTS.md) |
115
+
116
+ > Nota sobre Web Search: a linha do plugin nasce `enabled: false`, mas a capacidade subjacente de web research está **ON por padrão** na camada do agente (`webResearchOn()` retorna true a menos que `CONSTELLA_WEB_RESEARCH=0` ou a setting do workspace desative). Esta é a prova mais clara de que a linha do plugin é uma **entrada de catálogo, não o portão real** — o interruptor de verdade é a variável de ambiente / setting do workspace que o runner empurra via `setWebResearch` antes de cada spawn.
117
+
118
+ ---
119
+
120
+ ## Tabelas 🌌
121
+
122
+ ### `plugin` (já coberta acima)
123
+
124
+ A única tabela desta funcionalidade. Veja [A tabela `plugin`](#a-tabela-plugin).
125
+
126
+ ### Onde vive o estado real da capacidade (para contraste)
127
+
128
+ | Capacidade | Tabela / armazenamento de estado | Não fica em `plugin` |
129
+ |------------|----------------------------------|----------------------|
130
+ | Token / repo do GitHub | `vault` (`github_pat`), `workspace.settings.github` | ✓ |
131
+ | Token / offset / allowlist do Telegram | `vault` (`telegram_bot_token`), `workspace.settings.telegram` | ✓ |
132
+ | Chave do Vault | env `CONSTELLA_VAULT_KEY`, tabela `vault` | ✓ |
133
+ | Flag de web research | env `CONSTELLA_WEB_RESEARCH`, `settings.agents.webResearch` | ✓ |
134
+
135
+ ---
136
+
137
+ ## Plugins vs Skills vs MCP externo 🪐
138
+
139
+ Três camadas que as pessoas costumam confundir. Elas são genuinamente diferentes:
140
+
141
+ ```mermaid
142
+ flowchart LR
143
+ subgraph "Plugins (este doc)"
144
+ P[("tabela plugin<br/>catálogo de integrações")]
145
+ end
146
+ subgraph "Skills"
147
+ S[("tabelas skill / agentSkill<br/>.claude/skills/*.md")]
148
+ end
149
+ subgraph "MCP externo"
150
+ M["config ~/.claude da CLI claude<br/>mcpServers — FORA da tabela plugin"]
151
+ end
152
+ P -. "nomeia integrações<br/>(GitHub/Telegram/Vault/Web Search)" .-> ENG["Motores reais + segredos"]
153
+ S -. "molda como os agentes trabalham<br/>(conhecimento em nível de prompt)" .-> AG["Persona do agente"]
154
+ M -. "adiciona ferramentas que a CLI claude pode chamar" .-> AG
155
+ ```
156
+
157
+ | Camada | O que é | Onde fica armazenada | Cabeada por |
158
+ |--------|---------|----------------------|-------------|
159
+ | **Plugins** | Um catálogo de integrações nativas (este doc) | tabela `plugin` (por workspace) | `plugin-actions.ts`; trabalho real em `github.ts` / `telegram.ts` / `vault.ts` / `cli.ts` |
160
+ | **Skills** | Arquivos de conhecimento que moldam *como* um agente trabalha | tabelas `skill` / `agentSkill`, `.claude/skills/<name>.md` no disco | `src/server/skills-library.ts` — veja [SKILLS.md](./SKILLS.md) |
161
+ | **MCP externo** | Servidores MCP de terceiros que a **CLI `claude` consome como ferramentas** | config `~/.claude` do operador (`mcpServers`) — **não** a tabela `plugin` | A própria CLI `claude` vanilla; veja [MCP.md](./MCP.md) |
162
+
163
+ Dois esclarecimentos cruciais:
164
+
165
+ 1. **O servidor MCP do próprio Constella é a direção OUTBOUND.** `scripts/mcp-server.mjs` permite que um host *externo* (Claude Desktop, Cursor) dirija o Constella via MCP. Isso está documentado em [MCP.md](./MCP.md) e [PUBLIC_API.md](./PUBLIC_API.md). Não tem nada a ver com a tabela `plugin`.
166
+ 2. **Agentes do Constella consumindo servidores MCP externos** acontece pela configuração `~/.claude` da própria CLI `claude` vanilla — novamente **não** pela tabela `plugin`. (E note: agentes da empresa rodam *vanilla* com os hooks do operador desativados, conforme `src/server/adapters/cli.ts`, para que plugins/hooks pessoais do operador, propensos a vazamento, não contaminem as execuções dos agentes.)
167
+
168
+ ---
169
+
170
+ ## Passo a passo 🛰️
171
+
172
+ ### Ligar/desligar um plugin nativo
173
+
174
+ 1. Abra a página **Plugins** (`/plugins`).
175
+ 2. Clique no interruptor de uma linha. A UI chama `togglePlugin(p.id, !p.enabled)`.
176
+ 3. `plugin.enabled` vira para aquele workspace; a página revalida.
177
+ 4. Lembre: para integrações nativas, o portão *operante* é a própria configuração da integração (token / env / setting), não este interruptor.
178
+
179
+ ### "Instalar" um plugin placeholder (PARCIAL)
180
+
181
+ 1. Clique em **Install from URL** na topbar.
182
+ 2. O `window.prompt` do navegador pede uma URL ou nome (texto placeholder: `github.com/acme/slack-bridge`).
183
+ 3. `installPlugin(url.trim())` insere uma linha não-nativa, `enabled: true`, `description: "Installed from URL"`.
184
+ 4. Nada é baixado nem cabeado. A linha é apenas um marcador — **isto é um mock** (veja [Estados possíveis](#estados-possíveis-)).
185
+
186
+ ### Remover um plugin instalado
187
+
188
+ 1. Linhas não-nativas mostram um botão **Remove** (linhas nativas não).
189
+ 2. Clique nele → `removePlugin(p.id)`.
190
+ 3. O delete é protegido por `eq(plugin.native, false)`, então nem uma chamada forjada consegue apagar uma linha nativa.
191
+
192
+ ---
193
+
194
+ ## Exemplos 🌠
195
+
196
+ ### Toggle programático (server action)
197
+
198
+ ```ts
199
+ import { togglePlugin } from "@/server/actions/plugin-actions";
200
+
201
+ // Desliga o interruptor de catálogo do GitHub no workspace atual.
202
+ await togglePlugin(githubPluginId, false);
203
+ // NOTA: isto NÃO remove o repo nem o token — veja github.ts.
204
+ ```
205
+
206
+ ### Registrar um placeholder (install mock)
207
+
208
+ ```ts
209
+ import { installPlugin } from "@/server/actions/plugin-actions";
210
+
211
+ const res = await installPlugin("github.com/acme/slack-bridge");
212
+ // res => { ok: true }
213
+ // Uma linha não-nativa aparece em /plugins, enabled, descrição "Installed from URL".
214
+ // Nenhum código de bridge roda — é um marcador de catálogo.
215
+ ```
216
+
217
+ ### O que um workspace recém-onboardado contém
218
+
219
+ | name | description | enabled | native |
220
+ |------|-------------|---------|--------|
221
+ | GitHub | Commit, push & open PRs from the workspace. | true | true |
222
+ | Telegram | Route reports and alerts to a channel. | true | true |
223
+ | Vault | Encrypted secret storage for provider keys. | true | true |
224
+ | Web Search | Let agents look things up while planning. | false | true |
225
+
226
+ ---
227
+
228
+ ## Estados possíveis 🕳️
229
+
230
+ | Estado | `native` | `enabled` | Removível? | Origem |
231
+ |--------|----------|-----------|------------|--------|
232
+ | Nativo, ligado | `true` | `true` | Não | seed do onboarding |
233
+ | Nativo, desligado | `true` | `false` | Não | seed do onboarding (ex.: Web Search) ou `togglePlugin` |
234
+ | Instalado (mock), ligado | `false` | `true` | Sim | `installPlugin` |
235
+ | Instalado, desligado | `false` | `false` | Sim | `installPlugin` + `togglePlugin` |
236
+
237
+ **Maturidade da funcionalidade:**
238
+
239
+ - `togglePlugin` — **real.** Persiste, tem escopo, revalida.
240
+ - `removePlugin` — **real.** Protegido para que nativos sobrevivam.
241
+ - `installPlugin` — **PARCIAL (mock).** Apenas registra uma linha. Não há fetch, verificação, sandbox nem cabeamento em runtime da extensão nomeada. Trate linhas instaladas como marcadores até que isso seja totalmente implementado.
242
+
243
+ ---
244
+
245
+ ## Integrações relacionadas 🪐
246
+
247
+ Os plugins nativos são rótulos finos sobre subsistemas reais documentados em outro lugar:
248
+
249
+ - **GitHub** → [GITHUB.md](./GITHUB.md) (commit/push, cabeamento de repo, escaneamento de segredos).
250
+ - **Telegram** → [TELEGRAM.md](./TELEGRAM.md) (bot token, allowlist, menu de comandos, polling).
251
+ - **Vault** → [SECURITY.md](./SECURITY.md) (armazenamento de segredos AES-256-GCM).
252
+ - **Web Search** → [AGENTS.md](./AGENTS.md) (web research do agente via `--allowedTools WebSearch WebFetch`).
253
+ - **MCP (outbound + externo)** → [MCP.md](./MCP.md) e [PUBLIC_API.md](./PUBLIC_API.md).
254
+
255
+ ---
256
+
257
+ ## Segurança 🛰️
258
+
259
+ - **Isolamento por workspace.** Toda action chama `requireWorkspace()` e restringe seu `WHERE` por `workspaceId`, então um workspace não pode ler nem mutar plugins de outro.
260
+ - **Imutabilidade de nativos.** A cláusula `eq(plugin.native, false)` em `removePlugin` impede a remoção de integrações nativas mesmo via requisição forjada.
261
+ - **Sem execução de código a partir de `installPlugin`.** Como o caminho de install é um mock, *atualmente não há* superfície de ataque de download/execução de código por ele. Quando for construído, a URL nomeada precisará ser buscada, escaneada e isolada em sandbox — não presuma que uma linha instalada é segura para executar hoje.
262
+ - **Segredos nunca vivem aqui.** Tokens e chaves ficam no `vault` criptografado (`CONSTELLA_VAULT_KEY`) e em `workspace.settings`, nunca na tabela `plugin`. A linha de catálogo não carrega material secreto.
263
+ - **Agentes rodam vanilla.** Plugins/hooks do `~/.claude` do operador são desativados nas execuções dos agentes da empresa (`src/server/adapters/cli.ts`), então os plugins pessoais do Claude do operador não podem alterar silenciosamente o comportamento do agente. Este é um conceito de "plugin" totalmente diferente — plugins da CLI do operador, não linhas de plugin do Constella.
264
+
265
+ ---
266
+
267
+ ## Solução de problemas 🕳️
268
+
269
+ | Sintoma | Causa provável | Correção |
270
+ |---------|----------------|----------|
271
+ | Ligar o GitHub não fez nada | `enabled` é uma flag de catálogo, não o portão | Configure o repo e o token em [GITHUB.md](./GITHUB.md). |
272
+ | Web Search mostra `enabled: false` mas os agentes ainda pesquisam | Web research está ON por padrão na camada do agente | Desative via `CONSTELLA_WEB_RESEARCH=0` ou `settings.agents.webResearch=false` — veja [AGENTS.md](./AGENTS.md). |
273
+ | Plugin instalado "não faz nada" | `installPlugin` é um mock (apenas registra uma linha) | Esperado — funcionalidade PARCIAL; a extensão nomeada não é cabeada. |
274
+ | Botão Remove sumiu em uma linha | A linha é `native: true` | Plugins nativos são permanentes por design; use o toggle. |
275
+ | Página Plugins vazia | Sem linhas para este workspace (raro; onboarding cria 4) | Reconfira o workspace; linhas nativas são criadas por `completeOnboarding`. |
276
+ | Quero que agentes usem uma ferramenta MCP externa | Isso é configurado na CLI `claude` em `~/.claude`, não aqui | Veja [MCP.md](./MCP.md). |
277
+
278
+ ---
279
+
280
+ ## Links relacionados 🌌
281
+
282
+ - [SKILLS.md](./SKILLS.md) — camada de conhecimento do agente (não é o mesmo que plugins)
283
+ - [MCP.md](./MCP.md) — servidor MCP do Constella + consumo de MCP externo
284
+ - [GITHUB.md](./GITHUB.md) — o motor da integração com o GitHub
285
+ - [TELEGRAM.md](./TELEGRAM.md) — o motor do relé do Telegram
286
+ - [SECURITY.md](./SECURITY.md) — o Vault e o tratamento de segredos
287
+ - [AGENTS.md](./AGENTS.md) — agentes e web research
288
+ - [PUBLIC_API.md](./PUBLIC_API.md) — superfície REST v1 sobre a qual o MCP mapeia
289
+ - [ARCHITECTURE.md](./ARCHITECTURE.md) — onde os plugins ficam no control plane
290
+ - [CONFIGURATION.md](./CONFIGURATION.md) — variáveis de ambiente e settings do workspace