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
package/docs/pt/FAQ.md ADDED
@@ -0,0 +1,258 @@
1
+ [← Índice](./README.md) · [🇬🇧 English](../en/FAQ.md) · [✦ Constella](../../README.pt-BR.md)
2
+
3
+ # FAQ — Sinais da Nave de Controle ✦🌌
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ Respostas honestas para as perguntas que as pessoas realmente fazem antes (e depois) de lançar sua primeira empresa de agentes. Tudo aqui é fundamentado no código real — sem marketing, sem promessas vazias.
8
+
9
+ ---
10
+
11
+ ## Quando usar esta página
12
+
13
+ - Você está avaliando o Constella e quer saber o que é **real** vs. aspiracional.
14
+ - Você bateu numa decisão (qual run mode? modelos locais ou na nuvem? como limito gastos?) e quer a resposta curta e fundamentada.
15
+ - Você quer um índice rápido para a documentação mais profunda — cada resposta aponta para a página canônica.
16
+
17
+ ---
18
+
19
+ ## Como funciona (o modelo em 30 segundos) 🛰️
20
+
21
+ O Constella é uma **plataforma de controle local-first**. Ela roda uma pequena nave de serviços na sua máquina — um app web Next.js mais um worker em segundo plano — e a partir daí faz spawn de **agentes CLI reais** (`claude`, `codex` e outros) como subprocessos que leem, escrevem e entregam código dentro de um diretório de workspace isolado. O diretório em disco é a fonte da verdade; o banco SQLite é um índice sobre ele.
22
+
23
+ ```mermaid
24
+ flowchart LR
25
+ OP["Operador"] -->|chat / aprovação| WEB["App web (Next.js)"]
26
+ WEB --> DB[("SQLite · constella.db")]
27
+ WEB --> FS[["Diretório do workspace (jail de FS)"]]
28
+ WK["Worker (cron · watcher · Telegram)"] --> WEB
29
+ WK -->|spawn| CLI["CLI claude / codex"]
30
+ CLI --> FS
31
+ EXT["Host de IA externo (MCP / API)"] -.->|PAT| WEB
32
+ ```
33
+
34
+ ---
35
+
36
+ ## 1. Isso é real? 🌠
37
+
38
+ **Sim.** Os agentes não são mocks roteirizados. `src/server/adapters/cli.ts` faz spawn das CLIs `claude` (Claude Code) e `codex` instaladas localmente como subprocessos reais com `spawn(...)`, alimenta o prompt via stdin e extrai uso de tokens e custo **reais** da saída JSON delas:
39
+
40
+ - `runClaude()` roda `claude -p --output-format json …` e lê `is_error`, `result`, `usage` e `total_cost_usd` direto da CLI.
41
+ - Quando uma CLI não emite uso (ex.: modos headless de Hermes, Aider, Cursor) o custo é registrado como `0` — **zero honesto**, nunca um número inventado (`base()` e os comentários de cada runner deixam isso explícito).
42
+ - O diretório de trabalho (`cwd`) do agente é o workspace real da organização, então as edições caem em arquivos reais; a Team Room renderiza **diffs reais** extraídos das chamadas de ferramenta `Edit`/`Write` da CLI (`mapTool` no mesmo arquivo).
43
+
44
+ Não há chaves de API mantidas pelo Constella no caminho Claude/Codex — ele dirige seu **login/assinatura de CLI existente**.
45
+
46
+ → [AI_ARCHITECTURE](./AI_ARCHITECTURE.md) · [AGENTS](./AGENTS.md) · [ARCHITECTURE](./ARCHITECTURE.md)
47
+
48
+ ---
49
+
50
+ ## 2. Modelos locais ou na nuvem? 🪐
51
+
52
+ Ambos, dependendo da tarefa:
53
+
54
+ | Camada | Backend | Onde definido |
55
+ | --- | --- | --- |
56
+ | **Agentes de raciocínio / código** | CLIs na nuvem por padrão (`claude`, `codex`, mais Aider/OpenCode/Copilot/Cursor/Cline/Kilo) roteados pelos próprios logins | `src/server/adapters/cli.ts`, `CLI_MODELS` |
57
+ | **Modelos de chat locais** | Servidor de chat `llama.cpp` em `LLAMACPP_URL` (padrão `http://127.0.0.1:8082`), GGUF do catálogo `lmstudio-community` | `src/server/local-models.ts`, `src/data/model-catalog.ts` |
58
+ | **Embeddings de RAG** | Servidor de embeddings `llama.cpp` dedicado `CONSTELLA_EMBED_URL` (padrão `http://127.0.0.1:8083`), iniciado automaticamente no boot; com fallback para Ollama (`OLLAMA_URL`, `nomic-embed-text`) | `src/server/rag.ts` |
59
+
60
+ O catálogo de modelos é puxado de `models.dev` (`https://models.dev/api.json`, cacheado por 24h em `~/.constella/cache/models-dev.json`) com uma tabela offline `FALLBACK_MODELS` embutida. Antes de baixar um GGUF local, `detectHardware()` sonda CPU/RAM/GPU/VRAM e recomenda uma quantização (`Q5_K_M`/`Q4_K_M`/`Q4_0`) e uma contagem máxima de parâmetros que realmente caiba.
61
+
62
+ Então: **nuvem para o raciocínio pesado, local para embeddings/RAG (e chat local opcional).** Se nenhum backend de embedding estiver de pé, o RAG degrada para uma heurística por palavra-chave em vez de falhar.
63
+
64
+ → [MODELS](./MODELS.md) · [KB_RAG](./KB_RAG.md) · [MEMORY_RAG](./MEMORY_RAG.md)
65
+
66
+ ---
67
+
68
+ ## 3. Como controlo o custo? 🕳️
69
+
70
+ Dois tetos rígidos, ambos **aplicados no servidor no momento do dispatch** em `src/server/budget.ts`:
71
+
72
+ - **Teto diário por agente** — `agent.dailyCapUsd` (USD). Cada um dos 10 agentes semeados vem com um padrão sensato (ex.: Ada `15`, Linus `40`, Margaret `50`, Vannevar `10`). Altere com `setAgentDailyCap(agentId, usd)` na UI de Custos.
73
+ - **Teto mensal do workspace** — `budget.monthlyCapUsd` (USD), definido com `setMonthlyCap(usd)`.
74
+
75
+ O portão é `canDispatch(...)`:
76
+
77
+ ```ts
78
+ return spentTodayUsd < a.dailyCapUsd && monthlySpentUsd < b.monthlyCapUsd;
79
+ ```
80
+
81
+ Um agente só pode gastar se estiver **abaixo de ambos**: seu teto diário e o teto mensal do workspace. O teto também aparece no arquivo de persona de cada agente (`Stop at the daily budget cap ($<cap>).`), então o agente é avisado do seu próprio limite.
82
+
83
+ Outras alavancas de custo:
84
+
85
+ - Cada agente roda num tier que você escolhe (`opus`/`sonnet`/`haiku` para o Claude; modelos mais baratos reduzem o gasto).
86
+ - A pesquisa web (`WebSearch`/`WebFetch`) vem ligada por padrão, mas pode ser desligada (`CONSTELLA_WEB_RESEARCH=0`).
87
+ - As execuções têm timeout rígido (padrão `180s`) para que uma run travada não sangre o orçamento indefinidamente.
88
+
89
+ → [CONFIGURATION](./CONFIGURATION.md) · [AGENTS](./AGENTS.md)
90
+
91
+ ---
92
+
93
+ ## 4. Onde ficam meus dados? 🌌
94
+
95
+ Tudo permanece sob uma única raiz de runtime na sua máquina — não existe nuvem do Constella:
96
+
97
+ | Coisa | Localização |
98
+ | --- | --- |
99
+ | Raiz de runtime | `~/.constella` (sobrescreva com `CONSTELLA_HOME` ou `--path`) |
100
+ | Banco de dados | `<HOME>/constella.db` (`DATABASE_URL=file:<HOME>/constella.db`) |
101
+ | Workspace por organização | `~/.constella/organizations/<orgId>/workspace/` |
102
+ | Segredos | `<HOME>/.env`, gravado com modo `0o600` (chmod 600): `BETTER_AUTH_SECRET`, `CONSTELLA_VAULT_KEY`, `CONSTELLA_WORKER_SECRET` |
103
+ | Cache de modelos | `~/.constella/cache/models-dev.json` |
104
+ | Backups de update | `<HOME>/backups/<timestamp>/` |
105
+
106
+ O diretório do workspace é a **fonte da verdade** (`src/lib/fs-workspace.ts`); o SQLite o indexa. Cada organização é chaveada pelo seu `organization.id` estável, e todo acesso é isolado por `safe()` — sem traversal de caminho, sem vazamento entre organizações. Chaves de provedores e tokens são criptografados em repouso (AES-256-GCM) na tabela `vault`.
107
+
108
+ → [ARCHITECTURE](./ARCHITECTURE.md) · [SECURITY](./SECURITY.md) · [CONFIGURATION](./CONFIGURATION.md)
109
+
110
+ ---
111
+
112
+ ## 5. Posso rodar em várias máquinas? 🚀
113
+
114
+ Sim — dois padrões suportados, mais uma ressalva:
115
+
116
+ - **Modo portable** (`--portable`): a raiz de runtime fica num **pendrive USB** montado como raiz, carregado entre máquinas. Requer `>=32GB` livres (fatal abaixo disso); `>=32GB` está ok. Login (e-mail+senha) é obrigatório e ele faz bind em `0.0.0.0`.
117
+ - **Modo VPS** (`--vps`): o Constella roda em Docker num servidor e você o acessa pela sua **tailnet Tailscale**. Bind em `0.0.0.0`, login obrigatório.
118
+
119
+ Ressalva: as credenciais de assinatura da CLI (`~/.claude/.credentials.json`) ficam no host que roda os agentes. O Constella copia as credenciais Claude do operador para um diretório de config limpo por agente para que os agentes permaneçam logados (veja Q8), mas a **máquina host** ainda precisa de um login de CLI válido. O modo portable carrega os dados do Constella, não necessariamente a autenticação de cada CLI.
120
+
121
+ **Não há sincronização multi-máquina embutida de um mesmo workspace** — escolha um único host (VPS) ou carregue o pendrive (portable).
122
+
123
+ → [PORTABLE_MODE](./PORTABLE_MODE.md) · [VPS_MODE](./VPS_MODE.md)
124
+
125
+ ---
126
+
127
+ ## 6. Qual run mode devo escolher? 🛰️
128
+
129
+ São quatro (`src/lib/run-mode.ts`, `type RunMode = "start" | "auth" | "vps" | "portable"`):
130
+
131
+ | Modo | Login | Bind | Melhor para |
132
+ | --- | --- | --- | --- |
133
+ | `start` (padrão) | nenhum — operador automático `operator@constella.dev` / `operator123` | `127.0.0.1` | Uso local solo na sua própria máquina; agentes têm **acesso total** (instalar deps, rodar testes) |
134
+ | `auth` | e-mail + senha a cada sessão | `127.0.0.1` | Local, mas você quer um portão de login real |
135
+ | `vps` | e-mail + senha | `0.0.0.0` | Um servidor compartilhado via Tailscale, roda em Docker; agentes **enjaulados** apenas a edições |
136
+ | `portable` | e-mail + senha | `0.0.0.0` | Um USB que você carrega entre máquinas; agentes **enjaulados** |
137
+
138
+ ```mermaid
139
+ flowchart TD
140
+ Q{"Onde vai rodar?"}
141
+ Q -->|Minha máquina, só eu| START["start (sem login, agente com acesso total)"]
142
+ Q -->|Minha máquina, quero login| AUTH["auth"]
143
+ Q -->|Um servidor que acesso remotamente| VPS["vps (Docker + Tailscale)"]
144
+ Q -->|Um USB que carrego| PORT["portable"]
145
+ ```
146
+
147
+ O modo é armazenado em `organization.runMode`. No modo `start` os agentes rodam com `--permission-mode bypassPermissions` (total); em `vps`/`auth`/`portable` eles rodam `--permission-mode acceptEdits` (enjaulados). Sobrescreva com `CONSTELLA_AGENT_FULL_ACCESS=1|0`.
148
+
149
+ → [START_MODE](./START_MODE.md) · [AUTH_MODE](./AUTH_MODE.md) · [VPS_MODE](./VPS_MODE.md) · [PORTABLE_MODE](./PORTABLE_MODE.md)
150
+
151
+ ---
152
+
153
+ ## 7. IAs externas podem dirigir o Constella? (MCP / API) 🌠
154
+
155
+ **Sim — saída (outbound), com um Personal Access Token.**
156
+
157
+ - **API REST pública v1** (`src/app/api/v1/[[...path]]/route.ts`): autentique com `Authorization: Bearer cn_<token>` (um PAT, hasheado com SHA-256 na tabela `personalAccessToken`, com `scope` `read|write`). O cabeçalho opcional `X-Constella-Org` seleciona a organização. O rate limit é **120 req/min/token**. Leituras: `/me`, `/status`, `/review`, `/goals`, `/issues`, `/tasks`, `/specs`, `/kb?q=`. Escritas (escopo write): `/plan/approve`, `/plan/reject`, `/execution`, `/goals/:id/cancel`, `/goals/:id/archive`, `/work`, `/kb`.
158
+ - **Servidor MCP** (`scripts/mcp-server.mjs`): um servidor JSON-RPC sobre stdio autocontido (sem dependências) que mapeia essas rotas REST para ferramentas MCP (`constella_status`, `constella_review`, `constella_approve_plan`, `constella_new_work`, …). Aponte o Claude Desktop / Cursor / qualquer host MCP para ele com `CONSTELLA_PAT`, `CONSTELLA_BASE_URL` (padrão `http://localhost:3000`) e o opcional `CONSTELLA_ORG`.
159
+
160
+ Duas direções, não as confunda:
161
+
162
+ | Direção | O que significa | Mecanismo |
163
+ | --- | --- | --- |
164
+ | **Outbound (IA → Constella)** | Um host externo dirige sua empresa | API v1 / `scripts/mcp-server.mjs` + PAT |
165
+ | **Inbound (agente Constella → MCP externo)** | Os próprios agentes do Constella consomem um servidor MCP externo | A config `~/.claude` da própria CLI `claude` — **não** a tabela de plugins do app |
166
+
167
+ → [PUBLIC_API](./PUBLIC_API.md) · [MCP](./MCP.md) · [TELEGRAM](./TELEGRAM.md)
168
+
169
+ ---
170
+
171
+ ## 8. Como os agentes permanecem logados? 🛰️
172
+
173
+ Os agentes herdam o **login de CLI do seu operador**, não um conjunto separado de chaves. No caminho Claude:
174
+
175
+ - O Constella **não** redireciona `CLAUDE_CONFIG_DIR` (as credenciais de assinatura vivem ali — redirecioná-lo deslogaria o agente). Em vez disso, por padrão ele passa uma sobreposição de settings (`{ "disableAllHooks": true }`, gravada num arquivo temporário) para que o agente rode **vanilla** — independente dos seus hooks/plugins pessoais em `~/.claude` — mantendo a autenticação intacta (`vanillaSettingsArgs()`).
176
+ - Quando o file-locking ou o guard de comandos estão ligados, o Constella monta um diretório de config limpo por agente (`<HOME>/.agent-claude`) e **copia seu `~/.claude/.credentials.json`** para dentro dele, mantendo o agente logado e carregando apenas os hooks do próprio Constella (`agentClaudeDir()`). Se o arquivo de credenciais estiver ausente, ele **cai de volta para o vanilla** — o file-locking degrada, a autenticação nunca quebra.
177
+
178
+ CLIs roteadas por provedor (Aider, OpenCode, Copilot, Cursor, Cline, Kilo) autenticam pelo **próprio** login/config — o Constella as dirige, mas nunca guarda suas chaves. A UI mostra uma string de `LOGIN_HINTS` (ex.: `opencode auth login`) quando a autenticação não é detectada.
179
+
180
+ → [AGENTS](./AGENTS.md) · [MODELS](./MODELS.md) · [SECURITY](./SECURITY.md)
181
+
182
+ ---
183
+
184
+ ## 9. A UI do produto é multilíngue? 🌌
185
+
186
+ **A UI do produto é apenas em inglês, por regra.** `src/lib/i18n.ts` mantém o dicionário inglês `en` como as strings **fonte**; o dicionário português `pt` é um espelho reservado para o futuro e validado por paridade de chaves (`scripts/i18n-parity.mjs`). O encanamento de tradução existe (`useT()`, `getServerLang()`, cookie `cn-lang`, `user.lang`), mas o inglês é o idioma da UI entregue. Todo o código, strings de UI e até diálogos de confirmação são em inglês.
187
+
188
+ (Esta documentação é bilíngue — EN + PT-BR — mas isso é documentação, não o produto em execução.)
189
+
190
+ → [CONFIGURATION](./CONFIGURATION.md)
191
+
192
+ ---
193
+
194
+ ## 10. Passo a passo: da instalação à primeira mudança entregue
195
+
196
+ 1. **Instalar e iniciar** — `npx constella` (modo `start` padrão). → [INSTALLATION](./INSTALLATION.md)
197
+ 2. **Onboarding** — criar org + workspace, importar uma fonte (`new`/`github`/`local`/`mock`), montar `.claude/`, semear 10 agentes + skills + plugins. → [ONBOARDING](./ONBOARDING.md)
198
+ 3. **Definir orçamentos** — escolha um teto mensal de workspace e tetos diários por agente. → [CONFIGURATION](./CONFIGURATION.md)
199
+ 4. **Iniciar trabalho** — mande DM `@ada` "build X", ou `/new-work`. → [DM](./DM.md) · [WORKFLOW](./WORKFLOW.md)
200
+ 5. **Aprovar o plano** — revise o plano da CEO e `/approve`. → [GOALS_SPECS_ISSUES](./GOALS_SPECS_ISSUES.md)
201
+ 6. **Ver entregar** — os agentes executam, revisam, testam e (opcionalmente) dão push. → [TEAM_ROOM](./TEAM_ROOM.md)
202
+
203
+ ---
204
+
205
+ ## Estados possíveis (referência rápida)
206
+
207
+ | Objeto | Estados |
208
+ | --- | --- |
209
+ | Status do agente | `idle` · `working` · `review` · `blocked` |
210
+ | Saúde do agente | `alive` · `stale` · `down` |
211
+ | Goal | `active` · `cancelled` · `archived` · `done` |
212
+ | Coluna do issue | `todo` · `doing` · `blocked` · `review` · `done` |
213
+ | Escopo do PAT | `read` · `write` |
214
+ | Run mode | `start` · `auth` · `vps` · `portable` |
215
+ | Backend de embedding | Ollama → servidor embed llama.cpp → fallback por palavra-chave |
216
+
217
+ ---
218
+
219
+ ## Integrações relacionadas
220
+
221
+ - **Telegram** — controle remoto pelo celular via token de bot no vault; a Ada responde. → [TELEGRAM](./TELEGRAM.md)
222
+ - **GitHub** — PAT no vault (ou OAuth), commit/push e export de fonte limpa. → [GITHUB](./GITHUB.md)
223
+ - **MCP / API** — controle outbound a partir de hosts de IA externos. → [MCP](./MCP.md) · [PUBLIC_API](./PUBLIC_API.md)
224
+ - **Modelos locais** — servidores de chat + embed llama.cpp, catálogo GGUF. → [MODELS](./MODELS.md)
225
+
226
+ ---
227
+
228
+ ## Segurança em um parágrafo 🕳️
229
+
230
+ O workspace é um jail de FS (`safe()` — checagens léxicas + de symlink, sem traversal, raiz nunca deletada). Segredos são criptografados (AES-256-GCM, tabela `vault`) e higienizados (`scrubSecrets`) antes de qualquer ingestão na KB, envio ao Telegram ou log. Um guard de comandos destrutivos (`bin/guard-hook.mjs`, ligado por padrão) bloqueia shell catastrófico; um hook de file-lock opcional impede que agentes paralelos atropelem uns aos outros. A autenticação é better-auth com e-mail+senha, com 2FA TOTP e passkeys WebAuthn opcionais.
231
+
232
+ → [SECURITY](./SECURITY.md)
233
+
234
+ ---
235
+
236
+ ## Solução de problemas (FAQ-do-FAQ)
237
+
238
+ | Sintoma | Causa provável | Correção |
239
+ | --- | --- | --- |
240
+ | Run do agente falha com "no JSON output" | CLI `claude` não instalada/deslogada | Faça login no Claude Code; verifique com `claude --version` |
241
+ | Custos do agente aparecem como `0` | Aquela CLI não emite uso (headless Hermes/Aider/Cursor) | Esperado — é um zero honesto, não um bug |
242
+ | Respostas de RAG fracas/só por palavra-chave | Nenhum backend de embedding rodando | Garanta que o servidor embed llama.cpp (`:8083`) ou o Ollama (`:11434`) esteja de pé |
243
+ | API retorna `429` | Acima de `120 req/min` num token | Reduza a frequência; o limite reinicia a cada minuto |
244
+ | API retorna `403` numa escrita | Token tem escopo `read` | Crie um PAT com escopo `write` |
245
+ | Agente "fala como meu plugin" | Hooks `~/.claude` do operador vazaram | O `disableAllHooks` padrão deve evitar isso; confirme que não há override |
246
+ | Boot portable aborta | Menos de `32GB` livres no drive | Use um drive com ≥ 32 GB livres |
247
+
248
+ → [TROUBLESHOOTING](./TROUBLESHOOTING.md)
249
+
250
+ ---
251
+
252
+ ## Links relacionados
253
+
254
+ - [ARCHITECTURE](./ARCHITECTURE.md) · [AI_ARCHITECTURE](./AI_ARCHITECTURE.md) · [AGENTS](./AGENTS.md)
255
+ - [START_MODE](./START_MODE.md) · [AUTH_MODE](./AUTH_MODE.md) · [VPS_MODE](./VPS_MODE.md) · [PORTABLE_MODE](./PORTABLE_MODE.md)
256
+ - [CONFIGURATION](./CONFIGURATION.md) · [MODELS](./MODELS.md) · [KB_RAG](./KB_RAG.md) · [MEMORY_RAG](./MEMORY_RAG.md)
257
+ - [PUBLIC_API](./PUBLIC_API.md) · [MCP](./MCP.md) · [TELEGRAM](./TELEGRAM.md) · [GITHUB](./GITHUB.md)
258
+ - [SECURITY](./SECURITY.md) · [TROUBLESHOOTING](./TROUBLESHOOTING.md) · [INSTALLATION](./INSTALLATION.md)
@@ -0,0 +1,341 @@
1
+ [← Índice](./README.md) · [🇬🇧 English](../en/GITHUB.md) · [✦ Constella](../../README.pt-BR.md)
2
+
3
+ # GitHub 🛰️
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ A baía de lançamento que conecta o workspace de uma constelação a um remoto Git real. Daqui partem duas rotas de voo distintas: **Commit GitHub** (o workspace completo do plano de controle → o `origin` vinculado) e **Export Clean Source** (apenas o produto, sem a camada interna da Constella → um repositório separado). Ambas passam pela mesma comporta de varredura de segredos.
8
+
9
+ > Fonte da verdade: [`src/server/github.ts`](../../src/server/github.ts), [`src/server/prepare-deploy.ts`](../../src/server/prepare-deploy.ts), [`src/server/git-scan.ts`](../../src/server/git-scan.ts).
10
+
11
+ ---
12
+
13
+ ## 1. Quando usar 🌠
14
+
15
+ - Você conectou uma conta GitHub durante o onboarding (ou quer conectar/substituir uma agora).
16
+ - Um agente (ou você) terminou um trabalho e quer **histórico git local real** mais um **push para o remoto**.
17
+ - Você quer publicar **apenas o produto** — sem `.claude/`, docs de planejamento ou qualquer arquivo interno de controle — em um repositório público/separado.
18
+ - Você precisa garantir que nenhum segredo vazou antes que algo deixe a nave.
19
+
20
+ ---
21
+
22
+ ## 2. Como funciona 🌌
23
+
24
+ Todo workspace vive na raiz da organização em disco (`orgRoot(org.id)`). O módulo GitHub opera sobre esse diretório como um **repositório git normal**:
25
+
26
+ - `ensureRepo(cwd)` executa `git init -b main` no primeiro uso e cria um `.gitignore` padrão para que `git add -A` nunca prepare `node_modules/`, `.next/`, `dist/`, saída de build, `.env*`, `uploads/` ou `.testdev/`.
27
+ - A autenticação usa um **token do GitHub** resolvido por `ghToken(workspaceId, userId)`:
28
+ 1. **PAT no cofre** (`getSecret(workspaceId, "github_pat")`) — preferido.
29
+ 2. **Token de acesso OAuth** — o `account.accessToken` do GitHub do usuário (via better-auth), utilizável para git **somente** se o app OAuth recebeu o escopo `repo`.
30
+ - O token é **redatado de toda string capturada** (`redact()` divide pela string do token e a substitui por `***`), de modo que nunca pode vazar para uma notificação, o Inbox ou a UI.
31
+ - Todas as chamadas à API do GitHub passam por `ghApi(token, path)` contra `https://api.github.com` com timeout de 12s e `User-Agent: constella`.
32
+
33
+ ### As duas rotas de voo
34
+
35
+ | Rota | Função | Diretório de origem | Alvo | Remove a camada interna? | Estilo de push |
36
+ |------|--------|---------------------|------|--------------------------|----------------|
37
+ | **Commit GitHub** | `commitPush()` em `github.ts` | o workspace ao vivo (`orgRoot`) | o repositório `origin` **vinculado** | Não — faz commit de todo o workspace (menos o `.gitignore`) | `git push HEAD:<branch>` |
38
+ | **Export Clean Source** | `exportCleanSource()` em `prepare-deploy.ts` | uma árvore limpa em **temp** | um repositório **separado** (`owner/repo`) | Sim — só sobrevive o que passa por `isCleanProductPath` | `git push -f HEAD:<branch>` |
39
+
40
+ ---
41
+
42
+ ## 3. Fluxo principal 🚀
43
+
44
+ ### Conectar
45
+
46
+ ```
47
+ connectGitHub(pat)
48
+ → trim + checagem de tamanho
49
+ → GET https://api.github.com/user (verifica que o token de fato funciona; 401 → erro)
50
+ → apaga qualquer linha github_pat existente → putSecret(ws, "github_pat", token)
51
+ → vincula { login, repo: undefined, defaultBranch: undefined } em workspace.settings.github
52
+ ```
53
+
54
+ O vínculo de repositório é **limpo ao (re)conectar**, para que uma conta diferente não consiga dar push no repositório da conta anterior.
55
+
56
+ ### Vincular um repositório
57
+
58
+ ```
59
+ setRepo("owner/repo")
60
+ → normaliza (remove https://github.com/ e .git)
61
+ → ghToken() precisa alcançar GET /repos/owner/repo (404 → "o token não consegue acessá-lo")
62
+ → ensureRepo(cwd) → git remote add|set-url origin https://github.com/owner/repo.git
63
+ → persiste settings.github = { repo, defaultBranch }
64
+ ```
65
+
66
+ `createRepo({ name, private })` é um atalho: faz `POST` em `/user/repos` e então chama `setRepo` no novo nome completo.
67
+
68
+ ### Commit + push
69
+
70
+ `commitPush({ repo, branch, message, delegated?, force? })` executa três portões de segurança **antes** de tocar no git, então faz o commit e (opcionalmente) push / abre um PR. Veja [§4](#4-conceitos-chave-) e o diagrama em [§8](#8-diagramas-mermaid-).
71
+
72
+ ### Exportar código limpo
73
+
74
+ `exportCleanSource({ repo, token?, branch?, message? })` copia apenas o produto limpo para um diretório temporário, varre-o e faz force-push para um repositório **diferente**. Ele nunca toca no `origin` do próprio workspace.
75
+
76
+ ---
77
+
78
+ ## 4. Conceitos-chave 🪐
79
+
80
+ ### PAT vs token OAuth
81
+
82
+ | | PAT no cofre (`github_pat`) | OAuth `account.accessToken` |
83
+ |---|---|---|
84
+ | Armazenado onde | tabela `vault`, AES-256-GCM (`CONSTELLA_VAULT_KEY`) | linha `account` do better-auth |
85
+ | Definido por | `connectGitHub()` / onboarding | login OAuth do GitHub |
86
+ | Usado para git push? | Sim | Somente se receber o escopo `repo` |
87
+ | Precedência | **Primeiro** (preferido) | Fallback quando não há PAT |
88
+ | Por empresa | Sim — no cofre por `workspaceId` | Por conta de usuário |
89
+
90
+ `ghToken()` sempre retorna o PAT se presente, caso contrário o token OAuth, caso contrário `null` ("Connect GitHub first").
91
+
92
+ ### Vínculo do `setRepo` — o guarda por empresa
93
+
94
+ O repositório escolhido é registrado em `workspace.settings.github.repo` (e `defaultBranch`). Esse vínculo é verificado depois, na hora do commit, para que um agente jamais consiga dar push em um repositório que o token desta empresa não deveria alcançar. O vínculo **falha** se o token vinculado não conseguir `GET /repos/owner/repo`.
95
+
96
+ ### `refreshGitStatus` — reconciliando a árvore de trabalho
97
+
98
+ `file.gitStatus` nunca é preenchido pelo watcher; `refreshGitStatus()` executa o **real** `git status --porcelain -z --untracked-files=all` e reconcilia a tabela `file` para que os módulos GitHub + Code mostrem as mudanças reais.
99
+
100
+ - `-z` → caminhos **crus** separados por NUL (renames/copies consomem um campo extra de caminho antigo; nomes não-ASCII permanecem intactos).
101
+ - Cada entrada mapeia para um código de uma letra: `U` (não rastreado `?`), `D` (deletado), `A` (adicionado), senão `M` (modificado).
102
+ - Caminhos `.git/` e `node_modules/` são ignorados.
103
+ - Arquivos que não estão mais alterados têm seu `gitStatus` limpo de volta para `""`.
104
+ - Um lock em memória por workspace (Set `refreshing`) evita que duas renderizações concorrentes disputem a reconciliação e insiram linhas duplicadas.
105
+
106
+ ### Commit GitHub vs Export Clean Source
107
+
108
+ - **Commit GitHub** = histórico git local honesto do *workspace inteiro*, com push para o `origin` *vinculado*. A camada do plano de controle (`.claude/`, diretórios de planejamento) também entra no commit (faz parte do seu repositório privado).
109
+ - **Export Clean Source** = uma *árvore limpa* — apenas arquivos que passam por `isCleanProductPath()` — com force-push para um repositório *separado*. Este é o caminho para publicar o produto entregável sem expor as entranhas da Constella.
110
+
111
+ `isCleanProductPath(rel)` rejeita qualquer caminho cujo diretório de topo esteja em `DENY_TOP` (`.claude`, `DOCS`, `PO`, `Reports`, `specs`, `issues`, `mock`, `uploads`, `archives`, `.testdev`, `node_modules`, `.git`, `.next`, `dist`, `build`, `out`, `coverage`, `.cache`, `.turbo`, `vendor`), qualquer coisa sob `.constella`, e qualquer arquivo `SENSITIVE` (`.env*`, chaves privadas, `*.pem/.key/.p12/...`, JSON de credenciais, dumps/db/logs) — **exceto** templates de env inofensivos que casam com `ALLOW_ENV` (`.env.example|.sample|.template|.dist`).
112
+
113
+ ### Varredura de segredos — a comporta compartilhada
114
+
115
+ Ambas as rotas chamam `scanForSecrets(cwd)` de `git-scan.ts`. Ela varre os arquivos que *seriam* commitados (o conjunto de mudanças da árvore de trabalho; arquivos no gitignore já estão excluídos pelo `git status`).
116
+
117
+ - **Arquivos que nunca podem ser commitados** por nome: `.env*`, `id_rsa*`, `*.pem/.key/.p12/.pfx/.keystore/.jks/.ppk/.asc`, `credentials.json`, `service-account*.json`, `*.sql/.dump/.bak/.sqlite/.db`, `*.local`, `npm-debug.log` — exceto templates `ALLOW_FILE`.
118
+ - **Padrões de conteúdo de alta confiança**: chave de acesso AWS, token do GitHub, chave OpenAI/Anthropic, chave de API Google, token Slack, bloco de chave privada, JWT, URL de DB com credenciais, token de bot do Telegram, e um padrão genérico de segredo hardcoded.
119
+ - O padrão genérico é suprimido para **placeholders** óbvios (`your_`, `xxx`, `<...>`, `change_me`, `example`, `placeholder`, `***`, `dummy`, `todo`, `redacted`, `...`).
120
+ - As ocorrências são **redatadas** no preview (`primeiros4•••últimos2`).
121
+ - Arquivos acima de 2 MB e arquivos binários (contendo `\0`) são ignorados; a varredura limita-se a 3000 arquivos / 300 ocorrências.
122
+
123
+ ---
124
+
125
+ ## 5. Tabelas 🌌
126
+
127
+ ### `vault` (ref relevante)
128
+
129
+ | Coluna | Valor para o GitHub |
130
+ |--------|---------------------|
131
+ | `ref` | `github_pat` |
132
+ | `ciphertext` | texto cifrado AES-GCM do PAT |
133
+ | `iv` | IV por segredo |
134
+
135
+ ### `workspace.settings.github` (JSON)
136
+
137
+ | Campo | Significado |
138
+ |-------|-------------|
139
+ | `login` | nome de usuário GitHub da conta conectada |
140
+ | `repo` | `owner/repo` vinculado (o vínculo por empresa) |
141
+ | `defaultBranch` | branch padrão do repositório (vinda da API) |
142
+
143
+ ### `file.gitStatus`
144
+
145
+ | Código | Significado |
146
+ |--------|-------------|
147
+ | `""` | sem mudança |
148
+ | `M` | modificado |
149
+ | `A` | adicionado / novo preparado |
150
+ | `U` | não rastreado |
151
+ | `D` | deletado |
152
+
153
+ ### `deploy_run.lastExport` (definido por `exportCleanSource`)
154
+
155
+ | Campo | Significado |
156
+ |-------|-------------|
157
+ | `ok` | exportação bem-sucedida |
158
+ | `sha` | SHA curto do commit da árvore limpa |
159
+ | `copied` | número de arquivos limpos enviados |
160
+ | `repo` / `branch` | alvo da exportação |
161
+ | `at` | timestamp |
162
+
163
+ ### `PushResult` (retorno de `commitPush`)
164
+
165
+ | Campo | Significado |
166
+ |-------|-------------|
167
+ | `ok` | um commit real aconteceu |
168
+ | `committed` | commit local criado |
169
+ | `sha` | sha curto do HEAD |
170
+ | `pushed` | alcançou o remoto |
171
+ | `prUrl` | URL do PR (somente na rota delegada) |
172
+ | `nothing` | árvore de trabalho não tinha nada para commitar |
173
+ | `blocked` | um portão de segurança parou o commit |
174
+ | `secrets` | ocorrências da varredura de segredos quando bloqueado |
175
+
176
+ ---
177
+
178
+ ## 6. Passo a passo 🛰️
179
+
180
+ ### Commit do workspace para o repositório vinculado
181
+
182
+ 1. **Conecte** um PAT (`connectGitHub`) ou faça login com OAuth do GitHub (escopo `repo`).
183
+ 2. **Vincule** um repositório com `setRepo("owner/repo")` (ou `createRepo`).
184
+ 3. (Opcional) **Atualize** o status — `refreshGitStatus()` preenche a lista de mudanças; `draftCommitMessage()` propõe um assunto Conventional-Commit a partir das contagens de `A`/`M`/`D`.
185
+ 4. **Varra** sob demanda com `scanWorkspace()` (sem commit) para pré-visualizar ocorrências.
186
+ 5. **Commit + push** com `commitPush({ repo, branch, message })`. Passe `delegated: true` para também abrir um PR via `gh pr create --fill`. Passe `force: true` para contornar o portão de varredura de segredos *após revisão*.
187
+
188
+ ### Exportar apenas o produto
189
+
190
+ 1. Execute **Prepare Deploy** (ou `previewCleanExport()`) para ver a árvore limpa + uma varredura pré-exportação.
191
+ 2. Chame `exportCleanSource({ repo: "myorg/my-app-public" })` — ou `/export-source myorg/my-app-public` no chat.
192
+ 3. A árvore limpa é construída em um diretório temporário, varrida em busca de segredos, commitada e enviada com **force-push** para o repositório separado. `deploy_run.lastExport` registra o resultado.
193
+
194
+ ---
195
+
196
+ ## 7. Exemplos 🌠
197
+
198
+ ### Comandos de barra
199
+
200
+ ```
201
+ /github # atualiza o status do git, reporta a contagem de arquivos alterados (Werner)
202
+ /export-source myorg/app-pub # exporta o produto limpo para um repositório separado
203
+ /prepare-deploy # executa o pipeline completo de preparo para produção
204
+ ```
205
+
206
+ `/github` (tratado em `src/server/commands.ts`) chama `refreshGitStatus()` e posta a contagem de arquivos alterados pelo Werner (DevOps).
207
+
208
+ ### Mensagens do portão de commit (strings reais)
209
+
210
+ ```
211
+ Blocked: 2 potential secret(s)/sensitive file(s) in the change set. Resolve them or review before committing.
212
+ Origin (acme/app) doesn't match this company's configured repo (acme/app-2). Re-select the repo before committing.
213
+ committed locally — connect a GitHub PAT to push
214
+ ```
215
+
216
+ ### URL de push autenticada
217
+
218
+ `commitPush` reescreve o origin HTTPS para injetar o PAT apenas no momento do push:
219
+
220
+ ```
221
+ https://github.com/owner/repo.git
222
+ → https://x-access-token:<PAT>@github.com/owner/repo.git (usada no `git push`, redatada em todo o resto)
223
+ ```
224
+
225
+ ---
226
+
227
+ ## 8. Diagramas Mermaid 🪐
228
+
229
+ ### Commit GitHub vs Export Clean Source
230
+
231
+ ```mermaid
232
+ flowchart TD
233
+ subgraph WS["Workspace em disco (orgRoot)"]
234
+ A[".claude / DOCS / PO / specs / issues / mock"]
235
+ B["código do produto + README + .env.example"]
236
+ end
237
+
238
+ WS --> P{Qual rota?}
239
+
240
+ P -->|"Commit GitHub<br/>commitPush()"| G1["Portão 1: PAT para esta empresa?"]
241
+ G1 --> G2["Portão 2: origin == repo vinculado?"]
242
+ G2 --> G3["Portão 3: scanForSecrets()"]
243
+ G3 -->|"ocorrências"| BLK1["BLOQUEADO → Inbox + notifyOps"]
244
+ G3 -->|"limpo (ou force)"| C1["git add -A → commit → push HEAD:branch"]
245
+ C1 --> C2["delegated? gh pr create --fill"]
246
+ C1 --> ORIGIN["repo origin vinculado<br/>(workspace inteiro)"]
247
+
248
+ P -->|"Export Clean Source<br/>exportCleanSource()"| E1["buildCleanTree → dir temp<br/>(filtro isCleanProductPath)"]
249
+ E1 --> E2["git init + add -A"]
250
+ E2 --> E3["scanForSecrets() — portão final"]
251
+ E3 -->|"ocorrências"| BLK2["BLOQUEADO → Inbox + notifyOps"]
252
+ E3 -->|"limpo"| E4["commit → push -f HEAD:branch"]
253
+ E4 --> SEP["repositório separado<br/>(somente produto)"]
254
+ ```
255
+
256
+ ### Resolução de token
257
+
258
+ ```mermaid
259
+ flowchart LR
260
+ T["ghToken(ws, user)"] --> V{"vault github_pat?"}
261
+ V -->|sim| PAT["usa o PAT do cofre"]
262
+ V -->|não| OA{"conta OAuth do GitHub?"}
263
+ OA -->|sim| TOK["usa account.accessToken<br/>(precisa do escopo 'repo' para push)"]
264
+ OA -->|não| NULL["null → 'Connect GitHub first'"]
265
+ ```
266
+
267
+ ---
268
+
269
+ ## 9. Estados possíveis 🕳️
270
+
271
+ ### Portões de commit (em ordem)
272
+
273
+ | Portão | Gatilho | Resultado |
274
+ |--------|---------|-----------|
275
+ | **1. PAT configurado** | sem `github_pat` para este workspace | `blocked` — "GitHub isn't configured for this company" |
276
+ | **2. Repo vinculado + origin casa** | sem `settings.github.repo` / sem origin, ou divergência | `blocked` — re-selecione o repositório |
277
+ | **3. Varredura de segredos** | qualquer ocorrência (e `force` não definido) | `blocked`, `secrets[]`, card no Inbox + notificação aos operadores |
278
+
279
+ Após os portões passarem: `committed` → opcional `pushed` → opcional `prUrl`. Uma árvore de trabalho sem nada a commitar retorna `nothing: true`.
280
+
281
+ ### Rejeição de push
282
+
283
+ Um push rejeitado / non-fast-forward (`rejected | non-fast-forward | fetch first | merge conflict | failed to push`) **não** é descartado silenciosamente — ele gera um card `block` no Inbox ("Push rejected — \<repo\>") para que o operador faça pull + resolva.
284
+
285
+ ### Estados da exportação
286
+
287
+ | Estado | Causa |
288
+ |--------|-------|
289
+ | `ok: false, error: "Use the form owner/repo."` | alvo malformado |
290
+ | `ok: false, error: "...token can't access it."` | `GET /repos/...` retornou 404 |
291
+ | `blocked: true, secrets[]` | a varredura final encontrou um segredo |
292
+ | `ok: true, pushed: true, sha, copied` | force-push limpo concluído |
293
+ | `error: "Nothing to export yet..."` | `buildCleanTree` copiou 0 arquivos |
294
+
295
+ ---
296
+
297
+ ## 10. Integrações relacionadas 🌌
298
+
299
+ - **Vault** — armazena `github_pat` criptografado; veja [SECURITY](./SECURITY.md).
300
+ - **Inbox** — recebe cards `block` para ocorrências de segredos + rejeições de push; veja [INBOX](./INBOX.md).
301
+ - **Prepare Deploy** — o pipeline que faz build, valida e gate da exportação limpa; veja [PREPARE_DEPLOY](./PREPARE_DEPLOY.md) e [DEPLOY](./DEPLOY.md).
302
+ - **Agentes** — Werner (DevOps) é o agente padrão de deploy/commit; veja [AGENTS](./AGENTS.md).
303
+ - **Comandos de chat** — `/github`, `/export-source`, `/prepare-deploy`; veja [CHAT_COMMANDS](./CHAT_COMMANDS.md).
304
+ - **Onboarding** — import/conexão inicial do GitHub; veja [ONBOARDING](./ONBOARDING.md).
305
+
306
+ ---
307
+
308
+ ## 11. Segurança 🕳️
309
+
310
+ - **Token nunca registrado.** `redact()` remove o PAT de cada stdout/stderr capturado antes que chegue à UI, ao Inbox ou às notificações. A URL de push autenticada (`x-access-token:<PAT>@...`) só é construída em memória para a chamada do `git push`.
311
+ - **Isolamento por empresa.** O PAT fica no cofre por `workspaceId`; o vínculo é verificado contra o token; o Portão 2 do commit garante que `origin` seja igual ao repositório vinculado — você não consegue dar push no repositório de outra organização.
312
+ - **Varredura de segredos obrigatória.** O Portão 3 do commit e o portão final da exportação ambos executam `scanForSecrets`. A flag `force` só contorna a varredura do *commit* e destina-se a uso *pós-revisão*.
313
+ - **A exportação limpa remove as entranhas.** `isCleanProductPath` remove toda a camada de controle da Constella e todos os arquivos sensíveis antes que algo seja enviado a um repositório separado.
314
+ - **`.gitignore` seguro.** `ensureRepo` garante que deps/build/segredos nunca sejam preparados por `git add -A`.
315
+
316
+ Veja [SECURITY](./SECURITY.md) para o modelo completo de cofre + scrub.
317
+
318
+ ---
319
+
320
+ ## 12. Solução de problemas 🛰️
321
+
322
+ | Sintoma | Causa provável | Correção |
323
+ |---------|----------------|----------|
324
+ | "Connect GitHub first." | sem PAT e sem token OAuth | execute `connectGitHub` com um PAT de escopo `repo` |
325
+ | "Invalid token (401). ...needs the 'repo' scope." | PAT sem escopo `repo` ou errado | regenere com escopo `repo` |
326
+ | "Repo not found, or this company's token can't access it." | `GET /repos/owner/repo` 404 | confira o nome do repositório + se a conta do token tem acesso |
327
+ | "Origin (X) doesn't match this company's configured repo (Y)." | origin e vínculo divergiram | chame `setRepo` para re-vincular |
328
+ | Commit `blocked` com `secrets[]` | a varredura achou um segredo/arquivo sensível | remova-o (ou mova para `.env`), ou use `force` após revisão |
329
+ | "Push rejected — \<repo\>" no Inbox | o remoto avançou / conflito | faça pull + resolva, então push novamente |
330
+ | O módulo GitHub mostra "No changes" mas os arquivos mudaram | `file.gitStatus` não reconciliado | dispare `refreshGitStatus()` (botão Refresh / `/github`) |
331
+ | "committed locally — connect a GitHub PAT to push" | commit feito, sem credenciais para push | conecte um PAT |
332
+ | "Nothing to export yet..." | nenhum arquivo de produto limpo encontrado | adicione código do produto fora dos diretórios internos |
333
+
334
+ ---
335
+
336
+ ## 13. Links relacionados 🌠
337
+
338
+ - [PREPARE_DEPLOY](./PREPARE_DEPLOY.md) · [DEPLOY](./DEPLOY.md) · [PUBLISHING](./PUBLISHING.md)
339
+ - [SECURITY](./SECURITY.md) · [INBOX](./INBOX.md) · [CHAT_COMMANDS](./CHAT_COMMANDS.md)
340
+ - [AGENTS](./AGENTS.md) · [ONBOARDING](./ONBOARDING.md) · [CONFIGURATION](./CONFIGURATION.md)
341
+ - [✦ Voltar ao Índice da documentação](./README.md)