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,315 @@
1
+ [← Índice](./README.md) · [🇬🇧 English](../en/PUBLIC_API.md) · [✦ Constella](../../README.pt-BR.md)
2
+
3
+ # 🛰️ API Pública — pilotando a nave a partir da órbita
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ Uma superfície REST pequena e honesta (`/api/v1`) que permite a sistemas externos — scripts, jobs de CI, um celular ou um servidor MCP — ler o estado do projeto e guiar a constelação sem uma sessão de navegador. Uma única credencial bearer (um **Personal Access Token**), um único dispatcher, um único envelope de erro.
8
+
9
+ ---
10
+
11
+ ## Quando usar ✦
12
+
13
+ Use a API Pública quando quiser dirigir o Constella **de fora** da UI web:
14
+
15
+ - Um **pipeline de CI** que aprova um plano ou liga a execução 24/7 após um build verde.
16
+ - Um **script de celular / shell** que consulta a revisão matinal e as contagens.
17
+ - Um **host MCP** (Claude Desktop, Cursor, …) — o servidor MCP incluído (veja [MCP.md](./MCP.md)) é um wrapper fino, de saída, exatamente sobre estas rotas v1.
18
+ - Um **painel de status** que lista goals, issues, tasks ou specs.
19
+ - Perguntar à **Base de Conhecimento** de forma programática.
20
+
21
+ Se, em vez disso, você quiser que um host de IA externo *consuma* o Constella como ferramentas, você não chama estas rotas à mão — você aponta o servidor MCP para elas. As duas coisas são a mesma superfície vista de duas distâncias.
22
+
23
+ ---
24
+
25
+ ## Como funciona 🌌
26
+
27
+ A API inteira é **uma única rota catch-all dinâmica**: `src/app/api/v1/[[...path]]/route.ts`. Ela exporta apenas `GET` e `POST`; ambos afunilam para uma única função `dispatch()`, de modo que **autenticação, escopo, rate-limit e o envelope de resposta vivem em exatamente um lugar**.
28
+
29
+ As mutações **não** reinventam lógica. Elas reutilizam os mesmos cores sem-sessão que o controle remoto via Telegram usa:
30
+
31
+ - `approvePlanFor`, `setAuto247For`, `requestPlanChangesFor`, `reviewSummaryFor` → `src/server/plan-ops.ts`
32
+ - `cancelGoalFor`, `archiveGoalFor` → `src/server/work-ops.ts`
33
+ - `startNewWorkFor` → `src/server/planner-core.ts`
34
+ - `kbAnswer` → `src/server/kb.ts`
35
+ - Leituras estruturadas (`apiStatus`, `apiGoals`, `apiIssues`, `apiTasks`, `apiSpecs`) → `src/server/api/service.ts`
36
+
37
+ Não há **sessão nem cookie** nas rotas v1. A única credencial é o PAT. A rota também define `runtime = "nodejs"` e `dynamic = "force-dynamic"` (ela acessa o banco a cada requisição).
38
+
39
+ ### Envelope de resposta
40
+
41
+ Toda resposta é JSON com um formato uniforme:
42
+
43
+ | Campo | Tipo | Significado |
44
+ | ------- | --------- | ---------------------------------------- |
45
+ | `ok` | `boolean` | `true` em sucesso, `false` em erro |
46
+ | `data` | qualquer | presente quando `ok: true` |
47
+ | `error` | `string` | presente quando `ok: false` |
48
+
49
+ ```jsonc
50
+ // sucesso
51
+ { "ok": true, "data": { /* … */ } }
52
+ // erro
53
+ { "ok": false, "error": "this token has read scope; a write-scope token is required" }
54
+ ```
55
+
56
+ ---
57
+
58
+ ## Autenticação 🔑 — Personal Access Tokens (`cn_…`)
59
+
60
+ Um PAT é gerado na UI web (`createPAT` em `src/server/actions/profile-actions.ts`) e armazenado **com hash**, nunca em texto puro.
61
+
62
+ ```ts
63
+ // profile-actions.ts (geração)
64
+ const raw = "cn_" + randomBytes(24).toString("base64url");
65
+ const tokenHash = createHash("sha256").update(raw).digest("hex");
66
+ // armazenado: { tokenHash, prefix: raw.slice(0,7), scope, name, userId }
67
+ ```
68
+
69
+ Propriedades principais:
70
+
71
+ - **Formato** — `cn_` seguido de uma string base64 URL-safe (24 bytes aleatórios). A rota aceita `cn_[A-Za-z0-9_-]{8,}`.
72
+ - **Exibido uma vez** — o valor bruto `cn_…` é retornado por `createPAT` e exibido uma única vez. Apenas seu **hash SHA-256** (`tokenHash`) e um `prefix` de exibição de 7 caracteres (ex.: `cn_a1b2`) são persistidos na tabela `personalAccessToken`. Se você o perder, gere um novo.
73
+ - **Nunca registrado em log** — `authenticatePAT` apenas calcula o hash do token recebido e compara o hash; o token em texto puro nunca chega a uma linha de log.
74
+ - **Escopo** — `read` (padrão) ou `write`. Leituras são abertas a qualquer token válido; mutações exigem `write`.
75
+ - **Carimbo de uso** — toda chamada autenticada atualiza, em best-effort, o `lastUsedAt` (uma falha de escrita nunca bloqueia a autenticação).
76
+
77
+ ### O handshake (`authenticatePAT`)
78
+
79
+ `src/server/api/pat-auth.ts` roda a cada requisição:
80
+
81
+ 1. Faz parse de `Authorization: Bearer cn_…`. Mal-formado → **401** `missing or malformed bearer token`.
82
+ 2. Calcula o SHA-256 do token e o busca por `tokenHash`. Sem correspondência → **401** `invalid token`.
83
+ 3. Resolve a org do dono do token via `getActiveOrg(userId, X-Constella-Org)`. Isto é um **join de associação** — um valor de `X-Constella-Org` ao qual o usuário não pertence é *ignorado* (cai de volta na primeira org dele), então um token nunca pode ser apontado para um tenant alheio. Sem org → **404**.
84
+ 4. Org arquivada → **409** `organization is archived`.
85
+ 5. Resolve o workspace da org via `getWorkspace`. Nenhum → **404**.
86
+
87
+ Em caso de sucesso, a requisição carrega `{ userId, tokenId, scope, org, workspace }`.
88
+
89
+ ### `X-Constella-Org`
90
+
91
+ Header opcional. Se um usuário pertence a múltiplas organizações, defina `X-Constella-Org: <orgId>` para escolher sobre qual delas o token atua. Omitido (ou inválido) → a **primeira** org do usuário. A escolha é sempre validada através do join de associação.
92
+
93
+ ---
94
+
95
+ ## Limite de taxa 🪐
96
+
97
+ Uma **janela deslizante de 60 segundos**, em best-effort, indexada por `tokenId`, vive em memória no único processo de servidor Next:
98
+
99
+ ```ts
100
+ const RL_MAX = 120; // requisições por token por 60s
101
+ ```
102
+
103
+ Ultrapassá-lo retorna **429** `rate limit exceeded (120 req/min)`. Como o contador é em memória, um reinício do servidor o zera — aceitável para o design de operador único. Não há limite por IP nem header `Retry-After`.
104
+
105
+ ---
106
+
107
+ ## Fluxo de autorização 🌠
108
+
109
+ ```mermaid
110
+ flowchart TD
111
+ A["Requisição → /api/v1/…"] --> B{"Bearer cn_… presente e bem-formado?"}
112
+ B -- não --> E401["401 ausente/mal-formado"]
113
+ B -- sim --> C["sha256(token) → casar tokenHash"]
114
+ C -- sem match --> E401b["401 invalid token"]
115
+ C -- match --> D["getActiveOrg(userId, X-Constella-Org)\njoin de associação"]
116
+ D -- nenhuma --> E404["404 no organization"]
117
+ D -- arquivada --> E409["409 archived"]
118
+ D -- ok --> R{"rate limit\n(120/min)?"}
119
+ R -- excedido --> E429["429 rate limit"]
120
+ R -- ok --> M{"método + rota"}
121
+ M -- "GET" --> RD["serviços de leitura"]
122
+ M -- "POST (write?)" --> W{"scope == write?"}
123
+ W -- não --> E403["403 write scope required"]
124
+ W -- sim --> MUT["plan-ops / work-ops / planner-core"]
125
+ ```
126
+
127
+ ---
128
+
129
+ ## Endpoints 📡
130
+
131
+ A Base URL é o host do seu Constella, ex.: `http://localhost:3000/api/v1`. Todas as rotas exigem o header `Authorization`; rotas de escrita exigem adicionalmente um token de escopo `write`.
132
+
133
+ ### GET (escopo de leitura basta)
134
+
135
+ | Método | Caminho | Retorna |
136
+ | ------ | ------------------- | ---------------------------------------------------------------- |
137
+ | GET | `/api/v1` ou `/me` | `{ user, org{id,name}, workspace{id,name,slug}, scope }` |
138
+ | GET | `/api/v1/status` | contagens: goals, issues (`byCol`), tasks (`byCol`), resumo do plano |
139
+ | GET | `/api/v1/review` | `{ text }` — o resumo de revisão estilo mobile (`reviewSummaryFor`) |
140
+ | GET | `/api/v1/goals` | `[{ id, title, status, progress }]` |
141
+ | GET | `/api/v1/issues` | `[{ id, key, title, col, prio, points, moscow, approved }]` |
142
+ | GET | `/api/v1/tasks` | `[{ id, key, title, col, prio }]` |
143
+ | GET | `/api/v1/specs` | `[{ id, key, title, status, approved }]` |
144
+ | GET | `/api/v1/kb?q=…` | `{ text, sources }` — resposta da Base de Conhecimento (`kbAnswer`) |
145
+
146
+ ### POST (escopo de escrita, exceto `kb`)
147
+
148
+ | Método | Caminho | Corpo | Efeito |
149
+ | ------ | ----------------------------- | -------------------------- | --------------------------------------------------- |
150
+ | POST | `/api/v1/plan/approve` | — | Aprova o plano, enfileira tasks (`approvePlanFor`) |
151
+ | POST | `/api/v1/plan/reject` | `{ reason? }` | Devolve o plano com notas (`requestPlanChangesFor`) |
152
+ | POST | `/api/v1/execution` | `{ on?: boolean }` | Liga/desliga execução autônoma 24/7 (`setAuto247For`) — padrão `on:true` |
153
+ | POST | `/api/v1/work` | `{ brief, title? }` | Inicia uma nova unidade de trabalho (`startNewWorkFor`) |
154
+ | POST | `/api/v1/goals/{id}/cancel` | — | Cancela um goal (`cancelGoalFor`) |
155
+ | POST | `/api/v1/goals/{id}/archive` | — | Arquiva um goal (`archiveGoalFor`) |
156
+ | POST | `/api/v1/kb` | `{ q }` | Resposta da Base de Conhecimento — **quase-leitura, não exige escopo write** |
157
+
158
+ > `POST /api/v1/kb` é a exceção deliberada: não muta nada, então não exige um token `write`. Todo outro POST exige.
159
+
160
+ ---
161
+
162
+ ## Exemplos 🌠
163
+
164
+ Exporte seu token uma vez:
165
+
166
+ ```bash
167
+ export CN_TOKEN="cn_xxxxxxxxxxxxxxxxxxxxxxxx"
168
+ export CN_BASE="http://localhost:3000/api/v1"
169
+ ```
170
+
171
+ ### Quem sou eu
172
+
173
+ ```bash
174
+ curl -s "$CN_BASE/me" -H "Authorization: Bearer $CN_TOKEN"
175
+ # { "ok": true, "data": { "user": "…", "org": { "id": "…", "name": "Acme" },
176
+ # "workspace": { "id": "…", "name": "web", "slug": "web" }, "scope": "write" } }
177
+ ```
178
+
179
+ ### Status do projeto e revisão matinal
180
+
181
+ ```bash
182
+ curl -s "$CN_BASE/status" -H "Authorization: Bearer $CN_TOKEN"
183
+ curl -s "$CN_BASE/review" -H "Authorization: Bearer $CN_TOKEN"
184
+ ```
185
+
186
+ ### Listar boards
187
+
188
+ ```bash
189
+ curl -s "$CN_BASE/goals" -H "Authorization: Bearer $CN_TOKEN"
190
+ curl -s "$CN_BASE/issues" -H "Authorization: Bearer $CN_TOKEN"
191
+ curl -s "$CN_BASE/tasks" -H "Authorization: Bearer $CN_TOKEN"
192
+ curl -s "$CN_BASE/specs" -H "Authorization: Bearer $CN_TOKEN"
193
+ ```
194
+
195
+ ### Perguntar à Base de Conhecimento
196
+
197
+ ```bash
198
+ # Forma GET (query string)
199
+ curl -s "$CN_BASE/kb?q=como%20tratamos%20auth" -H "Authorization: Bearer $CN_TOKEN"
200
+
201
+ # Forma POST (corpo JSON) — também não exige escopo write
202
+ curl -s -X POST "$CN_BASE/kb" \
203
+ -H "Authorization: Bearer $CN_TOKEN" -H "Content-Type: application/json" \
204
+ -d '{"q":"como tratamos auth"}'
205
+ ```
206
+
207
+ ### Aprovar / rejeitar um plano (escopo write)
208
+
209
+ ```bash
210
+ curl -s -X POST "$CN_BASE/plan/approve" -H "Authorization: Bearer $CN_TOKEN"
211
+
212
+ curl -s -X POST "$CN_BASE/plan/reject" \
213
+ -H "Authorization: Bearer $CN_TOKEN" -H "Content-Type: application/json" \
214
+ -d '{"reason":"dividir a issue de auth em duas"}'
215
+ ```
216
+
217
+ ### Alternar execução 24/7 (escopo write)
218
+
219
+ ```bash
220
+ curl -s -X POST "$CN_BASE/execution" \
221
+ -H "Authorization: Bearer $CN_TOKEN" -H "Content-Type: application/json" \
222
+ -d '{"on":true}'
223
+ # { "ok": true, "data": { "auto247": true } }
224
+ ```
225
+
226
+ ### Lançar novo trabalho (escopo write) 🚀
227
+
228
+ ```bash
229
+ curl -s -X POST "$CN_BASE/work" \
230
+ -H "Authorization: Bearer $CN_TOKEN" -H "Content-Type: application/json" \
231
+ -d '{"title":"Reset de senha","brief":"Adicionar um fluxo de esqueci-a-senha com tokens por e-mail"}'
232
+ ```
233
+
234
+ ### Cancelar / arquivar um goal (escopo write) 🕳️
235
+
236
+ ```bash
237
+ curl -s -X POST "$CN_BASE/goals/$GOAL_ID/cancel" -H "Authorization: Bearer $CN_TOKEN"
238
+ curl -s -X POST "$CN_BASE/goals/$GOAL_ID/archive" -H "Authorization: Bearer $CN_TOKEN"
239
+ ```
240
+
241
+ ### Apontar um token para uma org específica
242
+
243
+ ```bash
244
+ curl -s "$CN_BASE/status" \
245
+ -H "Authorization: Bearer $CN_TOKEN" \
246
+ -H "X-Constella-Org: $ORG_ID"
247
+ ```
248
+
249
+ ---
250
+
251
+ ## Estados possíveis 🛰️
252
+
253
+ | HTTP | `error` | Causa |
254
+ | ---- | -------------------------------------------------------- | ---------------------------------------------------------- |
255
+ | 200 | — | sucesso (`ok: true`) |
256
+ | 400 | `missing ?q=` / `missing body.q` | consulta de KB sem pergunta |
257
+ | 400 | `could not start work` (ou mensagem do core) | `POST /work` com `brief` vazio |
258
+ | 401 | `missing or malformed bearer token` | sem `Authorization`, ou não é `Bearer cn_…` |
259
+ | 401 | `invalid token` | hash do token não está em `personalAccessToken` |
260
+ | 403 | `this token has read scope; a write-scope token is required` | rota de mutação com um token `read` |
261
+ | 404 | `no organization for this token's user` | dono do token não tem org |
262
+ | 404 | `no workspace for the organization` | org não tem workspace |
263
+ | 404 | `unknown GET /…` / `unknown POST /…` / `goal not found` | rota inválida ou goal inexistente |
264
+ | 409 | `organization is archived` | a org por trás do token está arquivada |
265
+ | 429 | `rate limit exceeded (120 req/min)` | mais de 120 requisições/token em 60s |
266
+ | 500 | (mensagem de erro) | exceção inesperada (capturada na borda `GET`/`POST`) |
267
+
268
+ ---
269
+
270
+ ## Integrações relacionadas 🌌
271
+
272
+ - **[MCP.md](./MCP.md)** — o servidor MCP de saída (`scripts/mcp-server.mjs`) é um wrapper stdio sobre exatamente estas rotas; um host de IA externo dirige o Constella através dele usando o mesmo PAT `cn_…`.
273
+ - **[TELEGRAM.md](./TELEGRAM.md)** — o controle remoto via Telegram compartilha os mesmíssimos cores sem-sessão (`plan-ops.ts`, `work-ops.ts`, `planner-core.ts`).
274
+ - **[CHAT_COMMANDS.md](./CHAT_COMMANDS.md)** — os comandos com barra mapeiam para as mesmas ações que você alcança via HTTP aqui.
275
+ - **[WORKFLOW.md](./WORKFLOW.md)** / **[GOALS_SPECS_ISSUES.md](./GOALS_SPECS_ISSUES.md)** — o ciclo de vida Goal → Spec → Issue → Plan sobre o qual `status`, `plan/approve` e `work` operam.
276
+
277
+ ---
278
+
279
+ ## Segurança 🕳️
280
+
281
+ - **Hash em repouso** — apenas o `tokenHash` SHA-256 e um `prefix` de exibição de 7 caracteres são armazenados; o `cn_…` bruto é exibido uma vez e nunca persistido ou registrado.
282
+ - **Isolamento de tenant** — `getActiveOrg` faz join através de `member`, então um token só pode atuar em orgs às quais seu dono pertence; um `X-Constella-Org` forjado é silenciosamente ignorado.
283
+ - **Portão de escopo** — toda mutação chama `needWrite()` e retorna **403** para tokens `read`. O único POST que pula isso é `/kb` (uma leitura pura).
284
+ - **Revogação** — `revokePAT` (UI de perfil) apaga a linha; a próxima requisição com aquele token recebe **401 invalid token**.
285
+ - **Sem vazamento de sessão** — as rotas v1 nunca leem cookies ou sessões; uma sessão de navegador roubada não pode ser reproduzida aqui, e um PAT roubado não alcança a UI web autenticada.
286
+ - **Transporte** — não há TLS embutido. Sob os modos `start`/`auth`, o servidor escuta em loopback (`127.0.0.1`); para `vps`/`portable` (bind `0.0.0.0`), coloque-o atrás de um proxy reverso TLS / tailnet e trate o PAT como uma senha. Veja [SECURITY.md](./SECURITY.md), [VPS_MODE.md](./VPS_MODE.md).
287
+
288
+ ---
289
+
290
+ ## Solução de problemas 🛠️
291
+
292
+ | Sintoma | Causa provável / correção |
293
+ | ----------------------------------------- | ---------------------------------------------------------------------------------- |
294
+ | `401 missing or malformed bearer token` | O header deve ser exatamente `Authorization: Bearer cn_…`; verifique espaço/aspas extras. |
295
+ | `401 invalid token` | Token revogado ou digitado errado. Gere um novo em **Profile → Personal Access Tokens**; é exibido uma vez. |
296
+ | `403 … write-scope token is required` | Você usou um token `read` numa mutação. Crie um token de escopo `write`. |
297
+ | `404 no organization` / `no workspace` | O usuário do token ainda não tem org/workspace — conclua o [ONBOARDING.md](./ONBOARDING.md). |
298
+ | `409 organization is archived` | Desarquive a org, ou use um token cuja org esteja ativa. |
299
+ | `429 rate limit exceeded` | Você cruzou 120 req/min para aquele token; reduza o ritmo (janela deslizante de 60s). |
300
+ | Dados da org errada retornados | Passe `X-Constella-Org: <orgId>`; um valor inválido cai de volta na primeira org. |
301
+ | `400 missing ?q=` / `missing body.q` | A KB precisa de uma pergunta não vazia — `?q=…` no GET, `{"q":"…"}` no POST. |
302
+ | Conexão recusada de outra máquina | Nos modos `start`/`auth` o servidor é apenas loopback; use `vps`/`portable` ou um proxy. |
303
+
304
+ ---
305
+
306
+ ## Links relacionados
307
+
308
+ - [MCP.md](./MCP.md) — servidor MCP de saída sobre estas rotas
309
+ - [TELEGRAM.md](./TELEGRAM.md) — controle remoto via Telegram (cores compartilhados)
310
+ - [CHAT_COMMANDS.md](./CHAT_COMMANDS.md) — comandos com barra
311
+ - [WORKFLOW.md](./WORKFLOW.md) — o ciclo de vida do trabalho
312
+ - [GOALS_SPECS_ISSUES.md](./GOALS_SPECS_ISSUES.md) — goals, specs, issues
313
+ - [SECURITY.md](./SECURITY.md) — vault, segredos, autenticação
314
+ - [VPS_MODE.md](./VPS_MODE.md) · [PORTABLE_MODE.md](./PORTABLE_MODE.md) — binds remoto / portátil
315
+ - [CONFIGURATION.md](./CONFIGURATION.md) — variáveis de ambiente e portas
@@ -0,0 +1,343 @@
1
+ [← Índice](./README.md) · [🇬🇧 English](../en/PUBLISHING.md) · [✦ Constella](../../README.pt-BR.md)
2
+
3
+ # 🚀 Publicação e Distribuição — lançando a nave do estaleiro
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ Publicar é como a nave-mãe deixa o estaleiro. Dois lançamentos acontecem, em duas direções: o **tarball do npm** leva o *runtime compilado* aos usuários finais, e o **espelho público no Git** leva a *árvore do produto* (docs, launcher, migrações — sem código-fonte) para `github.com/gabriel7silva/constella`. A árvore privada de desenvolvimento permanece em casa, em órbita, no remoto `dev`. ✦
8
+
9
+ > **Resumo** — Usuários finais recebem um runtime compilado e minificado, **nunca o `src/`**. O `npm publish` envia o `.next` pré-compilado; `scripts/publish-public.mjs --push` espelha uma árvore limpa, escaneada contra segredos e sem código-fonte para o repositório Git público. Ambos os canais se recusam a publicar segredos.
10
+
11
+ ---
12
+
13
+ ## Quando usar
14
+
15
+ | Você quer… | Use |
16
+ | --- | --- |
17
+ | Publicar uma nova versão no npm (usuários do `npx constella`) | `npm publish` (executa `prepublishOnly` → `prepack`) |
18
+ | Espelhar a árvore do produto no repositório Git público | `node scripts/publish-public.mjs --push` |
19
+ | Simular o espelho público (apenas escanear, sem push) | `node scripts/publish-public.mjs` |
20
+ | Verificar o tarball localmente antes de publicar | `npm pack` (executa `prepack` → `trim-next`) |
21
+ | Remover artefatos de dev de um build antes de empacotar | automático no `prepack`; manual: `node scripts/trim-next.mjs` |
22
+ | Remover arquivos de rascunho/mortos da raiz do repo | `npm run clean` (`scripts/clean-repo.mjs`) |
23
+
24
+ Esta página cobre os **dois canais de distribuição** e os portões que os protegem. Para o caminho de atualização do usuário, veja [UPDATE](./UPDATE.md). Para a maquinaria de varredura de segredos, veja [SECURITY](./SECURITY.md). Para fazer deploy de um *produto construído* (e não da própria Constella), veja [DEPLOY](./DEPLOY.md) e [PREPARE_DEPLOY](./PREPARE_DEPLOY.md).
25
+
26
+ ---
27
+
28
+ ## Como funciona 🌌
29
+
30
+ A Constella distribui por **dois canais** que compartilham um princípio: *publicar o produto, nunca o código-fonte.*
31
+
32
+ ```
33
+ ┌─────────────────── árvore de dev (privada) ────────────────────┐
34
+ │ src/ e2e/ tests playwright.config.ts drizzle/ bin/ │
35
+ │ .next/ (compilado) docs/ skills/ scripts/ *.config.mjs │
36
+ └────────────────────────────────────────────────────────────────┘
37
+ │ │
38
+ npm publish │ │ publish-public.mjs --push
39
+ (prepublishOnly → │ │ (árvore limpa + varredura)
40
+ prepack) ▼ ▼
41
+ ┌─────────────────────────────┐ ┌────────────────────────────────┐
42
+ │ registro npm: constella │ │ Git público: gabriel7silva/ │
43
+ │ tarball do runtime COMPILADO │ │ constella (espelho force-push) │
44
+ │ .next + bin + drizzle + docs │ │ docs + bin + drizzle + skills │
45
+ │ SEM src/ │ │ SEM src/, SEM .next, SEM segredo│
46
+ └─────────────────────────────┘ └────────────────────────────────┘
47
+ ```
48
+
49
+ 1. **Canal npm** — `npm publish` envia o runtime como um tarball. A allowlist `files` no `package.json` seleciona exatamente o que viaja; `prepublishOnly` valida a árvore; `prepack` (`trim-next.mjs`) remove os artefatos de dev do `.next`, de modo que os usuários finais recebam apenas o runtime de produção.
50
+ 2. **Canal Git** — `scripts/publish-public.mjs` constrói uma árvore filtrada em um índice git *temporário* (HEAD menos `src/`/testes, mais as migrações geradas em `drizzle/`), escaneia contra segredos exatamente esse conjunto e faz **force-push** dele como um commit-raiz novo para o remoto `public`. O `.next` compilado **não** viaja pelo git — ele chega aos usuários pelo tarball do npm.
51
+ 3. **Repositório duplo** — o remoto privado `dev` (`constella-Dev`) guarda todo o histórico do código-fonte; o remoto `public` (`constella`) é um espelho limpo e descartável, não um histórico compartilhado.
52
+
53
+ > Nenhum dos canais carrega o `src/`. O esquema chega aos usuários como SQL gerado em `drizzle/`, aplicado por `drizzle-kit migrate`. Veja [INSTALLATION](./INSTALLATION.md).
54
+
55
+ ---
56
+
57
+ ## Fluxo principal 🌠
58
+
59
+ ```mermaid
60
+ flowchart TD
61
+ subgraph DEV["Árvore de dev (este repo, remoto dev)"]
62
+ SRC["src/ + e2e/ + tests + configs"]
63
+ BUILT[".next (next build --webpack)"]
64
+ DRZ["drizzle/ (migrações SQL geradas)"]
65
+ SHIP["bin/ scripts/ skills/ docs/ *.config.mjs"]
66
+ end
67
+
68
+ SRC --> NPMHOOK
69
+ BUILT --> NPMHOOK
70
+ DRZ --> NPMHOOK
71
+ SHIP --> NPMHOOK
72
+
73
+ subgraph NPM["Canal npm — npm publish"]
74
+ NPMHOOK["prepublishOnly: drizzle-kit generate + validate (typecheck + parity + build)"]
75
+ PREPACK["prepack: trim-next.mjs remove .next/dev,cache,trace"]
76
+ TAR["allowlist files → tarball"]
77
+ NPMHOOK --> PREPACK --> TAR
78
+ end
79
+
80
+ SRC --> PUBHOOK
81
+ DRZ --> PUBHOOK
82
+ SHIP --> PUBHOOK
83
+
84
+ subgraph GIT["Canal Git — publish-public.mjs"]
85
+ PUBHOOK["ls-files menos EXCLUDE + force-add drizzle/"]
86
+ SCAN["varredura de segredos no conjunto exato"]
87
+ GATE{"findings == 0 ?"}
88
+ TREE["índice git temp → write-tree → commit-tree"]
89
+ PUSH["git push -f public commit:refs/heads/main"]
90
+ PUBHOOK --> SCAN --> GATE
91
+ GATE -- "não" --> ABORT["exit 1 — recusa"]
92
+ GATE -- "sim (--push)" --> TREE --> PUSH
93
+ end
94
+
95
+ TAR --> REG["registro npm: constella"]
96
+ PUSH --> PUB["espelho Git público"]
97
+ ```
98
+
99
+ ---
100
+
101
+ ## Conceitos-chave 🪐
102
+
103
+ ### A allowlist `files` (`package.json`)
104
+
105
+ O npm empacota **somente** o que `files` lista (mais alguns arquivos sempre incluídos). Essa é a única fonte de verdade para "o que um usuário final recebe":
106
+
107
+ ```json
108
+ "files": [
109
+ ".next", "bin", "scripts", "skills", "docs",
110
+ "drizzle", "next.config.mjs", "drizzle.config.mjs",
111
+ "README.md", "LICENSE", "CHANGELOG.md"
112
+ ]
113
+ ```
114
+
115
+ O `src/` está **ausente por design**. O comentário do package torna a intenção explícita:
116
+
117
+ > *"Ships the COMPILED build (`.next`) + generated migrations (`drizzle`) + the launcher — NOT `src/`. End users get a compiled, minified runtime, never the source. `next.config` is `.mjs` so `next start` needs no TypeScript at runtime (devDeps aren't installed for end users)."*
118
+
119
+ ### `prepack` → `trim-next.mjs`
120
+
121
+ O `prepack` roda em `npm pack` e `npm publish`, logo antes de o tarball ser construído. `scripts/trim-next.mjs` apaga as partes do `.next` que o `next start` **não** precisa:
122
+
123
+ | Removido de `.next/` | Por quê |
124
+ | --- | --- |
125
+ | `dev` | Saída do dev-server do Turbopack + um log de desenvolvimento de vários GB; regenerado por `next dev`. |
126
+ | `cache` | Cache de build; regenerado por `next build`. |
127
+ | `trace` | Arquivos de trace de build; desnecessários em runtime. |
128
+
129
+ Como a allowlist `files` reinclui o diretório `.next` **inteiro** (sobrepondo regras `.npmignore` aninhadas), apagar isso *em disco antes de empacotar* é a maneira confiável de manter o tarball pequeno e limpo. Se o `.next/` não existir, o script sai com código 0 e um aviso de skip.
130
+
131
+ ### `prepublishOnly` → `validate`
132
+
133
+ O `prepublishOnly` roda **apenas** no `npm publish` (não no `npm pack` simples). É o portão de publicação:
134
+
135
+ ```json
136
+ "prepublishOnly": "drizzle-kit generate --config drizzle.config.mjs && npm run validate"
137
+ ```
138
+
139
+ …onde `validate` é:
140
+
141
+ ```json
142
+ "validate": "npm run typecheck && npm run parity && npm run build"
143
+ ```
144
+
145
+ | Etapa | Comando | Garante |
146
+ | --- | --- | --- |
147
+ | Gerar migrações | `drizzle-kit generate` | `drizzle/` reflete o `schema.ts` atual antes de viajar. |
148
+ | Typecheck | `tsc --noEmit` | O código-fonte compila sem erros. |
149
+ | Paridade i18n | `node scripts/i18n-parity.mjs` | Chaves dos dicionários EN ↔ PT batem (veja [CONFIGURATION](./CONFIGURATION.md)). |
150
+ | Build | `next build --webpack` | Um `.next` novo e atual existe para ser empacotado. |
151
+
152
+ ### `publish-public.mjs` — o espelho Git limpo
153
+
154
+ `scripts/publish-public.mjs` produz o espelho Git **sem código-fonte**. Ele nunca roda automaticamente; você o invoca deliberadamente.
155
+
156
+ A constante que define todo o propósito:
157
+
158
+ ```js
159
+ const EXCLUDE = ["src", "playwright.config.ts", "e2e", "tests"];
160
+ ```
161
+
162
+ Fluxo dentro do script:
163
+
164
+ 1. **Garante que as migrações existem** — se `drizzle/` estiver ausente ou sem `.sql`, roda `npx drizzle-kit generate`. O repositório público envia essas migrações para que o usuário final construa um DB novo via `drizzle-kit migrate`.
165
+ 2. **Calcula o conjunto de publicação** — `git ls-files` (arquivos rastreados) menos `EXCLUDE`, **mais** os arquivos `drizzle/` em disco (ignorados pelo git no repo de dev, force-add na árvore pública). Deduplicado em `publishFiles`.
166
+ 3. **Escaneia contra segredos exatamente esse conjunto** — nomes de arquivos sensíveis + padrões inline de alta confiança (espelho de `src/server/git-scan.ts`). Qualquer achado → aborta.
167
+ 4. **Cinto e suspensório** — verifica explicitamente que nenhum arquivo `src/` escapou; se escapou, anexa um achado e aborta.
168
+ 5. **Simulação por padrão** — sem `--push`, imprime a contagem de arquivos e sai com 0. Com `--push`, continua.
169
+ 6. **Constrói a árvore filtrada** em um índice git temporário (`GIT_INDEX_FILE`): `git read-tree HEAD` → `git rm -r --cached` em cada caminho de `EXCLUDE` → `git add -f drizzle` → `git write-tree` → `git commit-tree` (um commit-raiz novo, sem histórico compartilhado).
170
+ 7. **Force-push** do objeto de commit para uma ref totalmente qualificada: `git push -f public <commit>:refs/heads/main`.
171
+
172
+ ### Regras da varredura de segredos (o portão de publicação)
173
+
174
+ O `publish-public.mjs` carrega um espelho inline do scanner do repositório. Ele bloqueia em **qualquer** achado:
175
+
176
+ | Categoria | Exemplos / intenção do padrão |
177
+ | --- | --- |
178
+ | **Arquivos** sensíveis | `.env` (e `.env.*` exceto `.example`/`.sample`/`.template`/`.dist`), `id_rsa`/`id_dsa`, `*.pem`/`*.key`/`*.p12`/`*.pfx`/`*.keystore`/`*.jks`/`*.ppk`/`*.asc`, `credentials*.json`, `service-account*.json`, `*.sql`/`*.dump`/`*.bak`/`*.sqlite*`/`*.db`, `npm-debug.log`, `*.local` |
179
+ | Exceções permitidas | `.env.example`/`.sample`/`.template`/`.dist`, `.env-example`; e `drizzle/*.sql` (migrações DDL, não dumps de DB) |
180
+ | Segredos inline | Chave AWS (`AKIA…`), token do GitHub (`gh[posru]_…`), PAT fine-grained do GitHub (`github_pat_…`), chave OpenAI/Anthropic (`sk-…`), chave Google API (`AIza…`), token Slack (`xox[baprs]-…`), bloco de chave privada (`-----BEGIN … PRIVATE KEY-----`), JWT (`eyJ…`), URL de DB com credenciais não-placeholder, token de bot do Telegram (`\d{6,}:…`) |
181
+ | Vazamento de fonte | qualquer caminho igual a `src` ou começando com `src/` |
182
+
183
+ > Arquivos escaneados são pulados se não forem texto (apenas `.js/.ts/.json/.md/.css/.yaml/.toml/.sh/.env/.txt/.html` são lidos) ou maiores que **512 KB**. Credenciais placeholder (`user`, `admin`, `changeme`, `xxx`, `your…`, `localhost`, …) **não** contam como segredo de URL de DB.
184
+
185
+ ### Repositório duplo (público vs dev) 🕳️
186
+
187
+ | Remoto | Repositório | Contém | Histórico |
188
+ | --- | --- | --- | --- |
189
+ | `dev` | `gabriel7silva/constella-Dev` | Árvore de fonte privada completa (`src/`, testes, e2e, histórico) | Real, preservado |
190
+ | `public` | `gabriel7silva/constella` | Apenas produto (docs, `bin/`, `drizzle/`, `skills/`, configs) | Descartável — sobrescrito por force-push |
191
+
192
+ O espelho público **não** é um alvo de colaboração com histórico compartilhado. Cada `--push` escreve um commit-raiz novo e sobrescreve o `main` à força. O desenvolvimento acontece contra `dev`; o tarball do npm é publicado separadamente de qualquer push git.
193
+
194
+ ---
195
+
196
+ ## Passo a passo 🛰️
197
+
198
+ ### Publicar uma nova versão npm
199
+
200
+ ```bash
201
+ # 1. Garanta que a árvore de trabalho está limpa e a versão foi incrementada no package.json.
202
+ # 2. Publique — prepublishOnly + prepack rodam automaticamente:
203
+ npm publish
204
+ # prepublishOnly: drizzle-kit generate && (typecheck + parity + build)
205
+ # prepack: trim-next.mjs remove .next/{dev,cache,trace}
206
+ # allowlist files: .next, bin, scripts, skills, docs, drizzle, configs, README, LICENSE, CHANGELOG
207
+ ```
208
+
209
+ > O `package.json` está atualmente com `"private": true` (a nota `//private`: *"Keep true until the npm account exists; flip to false (or remove) to publish."*). O npm se recusa a publicar um pacote privado até que essa flag seja removida. O `publishConfig.access` já é `"public"`.
210
+
211
+ Para verificar o conteúdo exato do tarball **sem** publicar:
212
+
213
+ ```bash
214
+ npm pack # roda prepack → trim-next; escreve constella-0.1.0.tgz
215
+ tar -tf constella-0.1.0.tgz | sort # inspecione o que seria enviado — confirme que não há src/
216
+ ```
217
+
218
+ ### Espelhar a árvore limpa no repositório Git público
219
+
220
+ ```bash
221
+ # Simulação — gera migrações se necessário, calcula o conjunto, escaneia segredos, imprime a contagem:
222
+ node scripts/publish-public.mjs
223
+ # ✓ Clean: <N> files to publish (no src/, no secrets). Migrations: <M> file(s).
224
+
225
+ # Push — constrói a árvore filtrada em um índice temp e faz force-push para o public main:
226
+ node scripts/publish-public.mjs --push
227
+ # ✓ Pushed. The npm tarball (with the prebuilt .next) is published separately via `npm publish`.
228
+ ```
229
+
230
+ ### Limpeza antes de qualquer canal
231
+
232
+ ```bash
233
+ npm run clean # scripts/clean-repo.mjs — remove artefatos de rascunho na raiz do repo
234
+ ```
235
+
236
+ O `clean-repo.mjs` é idempotente e conservador: ele só apaga um conjunto conhecido — `Constella App.html`, `extracted_design_system.css`, `tsconfig.tsbuildinfo` e `temp_*.{js,ts,jsx,tsx,html,css}` — nunca fonte ou config.
237
+
238
+ ---
239
+
240
+ ## Exemplos 🌠
241
+
242
+ **Uma simulação limpa:**
243
+
244
+ ```text
245
+ $ node scripts/publish-public.mjs
246
+ ✓ Clean: 412 files to publish (no src/, no secrets). Migrations: 7 file(s).
247
+
248
+ Dry run. To publish the clean compiled tree to the public repo, run:
249
+ node scripts/publish-public.mjs --push
250
+ ```
251
+
252
+ **Uma execução bloqueada (o portão fazendo seu trabalho):**
253
+
254
+ ```text
255
+ $ node scripts/publish-public.mjs
256
+ ✖ Refusing to publish — 2 potential secret/sensitive/source finding(s):
257
+ - docs/notes/scratch.md: Telegram bot token
258
+ - private.pem: sensitive file
259
+ ```
260
+
261
+ Nada é enviado; o script sai com `1`. Corrija os achados (mova-os para fora do conjunto de publicação, redija, ou adicione um caminho de allow legítimo) e re-execute a simulação até que reporte limpo.
262
+
263
+ **Trim durante um pack:**
264
+
265
+ ```text
266
+ $ npm pack
267
+ • trim-next: removed .next/dev
268
+ • trim-next: removed .next/cache
269
+ • trim-next: removed .next/trace
270
+ • trim-next: .next trimmed to the production runtime.
271
+ constella-0.1.0.tgz
272
+ ```
273
+
274
+ ---
275
+
276
+ ## Estados possíveis 🪐
277
+
278
+ | Estado | Canal | Significado | Saída |
279
+ | --- | --- | --- | --- |
280
+ | `Clean: N files to publish` | Git (simulação) | Conjunto calculado, sem achados; nada enviado | `0` |
281
+ | `Pushed` | Git (`--push`) | Árvore filtrada com force-push para `public main` | `0` |
282
+ | `Refusing to publish — N finding(s)` | Git | Um caminho de segredo/sensível/fonte foi detectado | `1` |
283
+ | `src/ leaked into the public tree` | Git | Um caminho `src/` escapou para o conjunto de publicação | `1` |
284
+ | `trim-next: no .next/ — nothing to trim` | npm (`prepack`) | Sem build presente; pula silenciosamente | `0` |
285
+ | `trim-next: .next trimmed…` | npm (`prepack`) | Dev/cache/trace removidos do build | `0` |
286
+ | `Generating DB migrations (drizzle/)…` | Git | `drizzle/` estava ausente; regenerado antes da varredura | continua |
287
+
288
+ ---
289
+
290
+ ## Integrações relacionadas 🛰️
291
+
292
+ | Integração | Relação com a publicação |
293
+ | --- | --- |
294
+ | **`drizzle-kit`** | `prepublishOnly` e `publish-public.mjs` regeneram as migrações em `drizzle/` para que o esquema viaje como SQL, não TypeScript. |
295
+ | **Scanner de segredos** (`src/server/git-scan.ts`) | `publish-public.mjs` embute um espelho de suas regras; o mesmo motor protege commits do [GITHUB](./GITHUB.md) e exports do [PREPARE_DEPLOY](./PREPARE_DEPLOY.md). |
296
+ | **Caminho de atualização** ([UPDATE](./UPDATE.md)) | Usuários puxam novas versões do registro npm para onde o tarball é publicado (`registry.npmjs.org/constella/latest`). |
297
+ | **Paridade i18n** ([CONFIGURATION](./CONFIGURATION.md)) | `validate` roda `i18n-parity.mjs`, bloqueando uma publicação se houver divergência de chaves EN ↔ PT. |
298
+
299
+ ---
300
+
301
+ ## Segurança 🕳️
302
+
303
+ Publicar é uma operação de alta confiança; o design assume que um erro *vai* acontecer e o detém no portão.
304
+
305
+ - **O código-fonte nunca viaja.** Ambos os canais excluem o `src/`. O espelho Git verifica duas vezes — `EXCLUDE` o filtra, e depois uma passagem final aborta se algum caminho `src/` sobreviveu.
306
+ - **A varredura de segredos recusa em qualquer achado.** `publish-public.mjs` bloqueia no **primeiro** match por arquivo, em 10 padrões inline + uma regra de nome de arquivo sensível. É deliberadamente conservador (limite de `512 KB` para arquivos de texto, tolerância a credenciais placeholder para evitar falsos positivos em docs).
307
+ - **`.env` e arquivos de DB são sensíveis por nome.** Eles são bloqueados mesmo que você nunca os tenha aberto — exceto a allowlist explícita (`.env.example`, etc.) e o DDL `drizzle/*.sql`.
308
+ - **O force-push é intencional.** O repositório público é um *espelho limpo*, não um histórico de colaboração. Ele não carrega `.next` nem segredos, então sobrescrevê-lo é seguro por construção.
309
+ - **O tarball é compilado.** Usuários finais rodam um `.next` minificado e migrações SQL aplicadas — sem fonte de aplicação legível, sem devDependencies.
310
+ - **Segredos vivem fora da árvore.** Segredos de runtime são persistidos em `<HOME>/.env` (`chmod 600`) e nunca no repositório; a chave do vault, o segredo do worker e o segredo de auth são gerados no primeiro boot. Veja [SECURITY](./SECURITY.md).
311
+
312
+ > O scanner é uma rede de segurança, não um substituto para disciplina. Mantenha segredos em `<HOME>/.env` e no vault, nunca em arquivos rastreados.
313
+
314
+ ---
315
+
316
+ ## Solução de problemas 🛰️
317
+
318
+ | Sintoma | Causa | Correção |
319
+ | --- | --- | --- |
320
+ | `Refusing to publish — N finding(s)` | Um arquivo rastreado/`drizzle` casou com uma regra de segredo ou nome sensível | Inspecione cada caminho listado; redija, remova do conjunto de publicação ou (em casos legítimos) confirme que se encaixa numa regra de allow. Re-execute a simulação. |
321
+ | `src/ leaked into the public tree` | Um caminho sob `src/` chegou ao conjunto de publicação | Isso deveria ser impossível via `EXCLUDE`; verifique que nada faz force-add de `src/` e re-execute. |
322
+ | `npm publish` aborta imediatamente | O `package.json` tem `"private": true` | Remova/altere `private` quando a conta npm existir (conforme a nota `//private`). |
323
+ | `trim-next: no .next/ — nothing to trim` e um tarball quebrado | Sem build antes de empacotar | Rode `npm run build` (ou confie no `prepublishOnly`, que faz build) antes do `npm pack`. |
324
+ | Push público falha num remoto vazio | Enviar um commit sem ref para `main` não consegue inferir a ref | Já tratado — o script envia `<commit>:refs/heads/main` explicitamente. |
325
+ | `git push -f public …` rejeitado | Remoto `public` ausente ou não autenticado | `git remote add public https://github.com/gabriel7silva/constella.git`; garanta que credenciais/`GIT_TERMINAL_PROMPT` permitam auth não-interativa. |
326
+ | Migrações ausentes no espelho | `drizzle/` estava vazio e o generate falhou | Rode `npm run db:generate` manualmente e inspecione o erro antes de re-executar. |
327
+ | Falha de paridade EN/PT no `validate` | Uma chave de dicionário existe em só um idioma | Corrija `src/lib/i18n.ts` para que as chaves EN ↔ PT batam; veja [CONFIGURATION](./CONFIGURATION.md). |
328
+
329
+ ---
330
+
331
+ ## Links relacionados
332
+
333
+ - [INSTALLATION](./INSTALLATION.md) — o que um usuário final realmente recebe e onde isso aterrissa.
334
+ - [UPDATE](./UPDATE.md) — como os usuários puxam novas versões publicadas.
335
+ - [SECURITY](./SECURITY.md) — o vault, a jaula de FS e o motor de varredura de segredos.
336
+ - [GITHUB](./GITHUB.md) — o caminho de commit/export que compartilha o scanner de segredos.
337
+ - [PREPARE_DEPLOY](./PREPARE_DEPLOY.md) · [DEPLOY](./DEPLOY.md) — enviar um *produto construído*, distinto de publicar a própria Constella.
338
+ - [CONFIGURATION](./CONFIGURATION.md) — paridade i18n e o portão de validação.
339
+ - [ARCHITECTURE](./ARCHITECTURE.md) — o runtime root e o modelo "o diretório é a verdade".
340
+
341
+ ---
342
+
343
+ <sub>✦ O estaleiro fica em silêncio, o lançamento é estrondoso. Publique o produto, guarde os blueprints. 🚀</sub>