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,321 @@
1
+ [← Índice](./README.md) · [🇬🇧 English](../en/TEST_DEV.md) · [✦ Constella](../../README.pt-BR.md)
2
+
3
+ # Test Dev 🛰️ — pilotando o produto antes do lançamento
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ O Test Dev sobe o **produto que os agentes estão construindo** (não a nave Constella em si), o dirige com um navegador headless e relata o que viu: erros de console, crashes de página, requisições que falharam, segredos vazados e um punhado de sondagens de segurança. Ele é ao mesmo tempo um **console do operador** (a tela `/test-dev`) e um **portão autônomo** que o loop de trabalho atravessa antes de uma tarefa ser marcada como `done`.
8
+
9
+ > Mapa estelar: o produto é uma pequena sonda em órbita. O Test Dev é a passagem de telemetria — pilotamos, observamos os instrumentos e só liberamos para a próxima etapa se nada crítico acender. Um boot que nunca alcança a órbita é `inconclusive`, nunca um falso `fail`.
10
+
11
+ ---
12
+
13
+ ## Quando usar 🌌
14
+
15
+ - **Operador, sob demanda** — abra o módulo **Test Dev** (rota `/test-dev`) ou digite `/test-dev` na Team Room / em uma DM para rodar a validação contra o app em execução.
16
+ - **Autonomamente, como portão** — quando um agente termina uma tarefa de *código*, o loop de trabalho sobe o projeto (portão de boot) e, se houver servidor no ar, roda o Test Dev como um segundo portão antes da tarefa poder pousar em `done`.
17
+ - **Como parte da preparação de deploy** — `runDeployPipeline` chama `ensureBootable` em sua etapa `validateBuild`, reutilizando a mesma maquinaria do dev server (veja [PREPARE_DEPLOY.md](./PREPARE_DEPLOY.md)).
18
+
19
+ Use sempre que quiser um sinal *real* de que o app ainda inicia e renderiza — não um teste unitário, e sim um navegador de verdade batendo em rotas de verdade.
20
+
21
+ ---
22
+
23
+ ## Como funciona 🪐
24
+
25
+ Dois módulos do servidor cooperam:
26
+
27
+ | Módulo | Arquivo | Responsabilidade |
28
+ | --- | --- | --- |
29
+ | **Gerenciador do dev server** | `src/server/devserver.ts` | Detectar um projeto executável, instalar dependências uma vez, escolher uma porta livre, subir + supervisionar o dev server do próprio projeto, observar seu console. |
30
+ | **Harness de teste** | `src/server/test-harness.ts` | Dirigir o servidor em execução com Chromium headless (Playwright), coletar findings, rodar sondagens de segurança, capturar screenshot, calcular o veredito, persistir a execução, capturar para a KB. |
31
+
32
+ O dev server do projeto é um **processo filho de vida longa**, um por workspace, rastreado em memória num mapa `SERVERS` (`Map<workspaceId, DevServer>`). Ele *não* é o processo web/worker da Constella — é o app em construção. No reconcile de boot da Constella, `stopAllProjectServers()` mata todo servidor rastreado para que um restart não deixe nenhum órfão.
33
+
34
+ ---
35
+
36
+ ## Fluxo principal 🌠
37
+
38
+ ```mermaid
39
+ flowchart TD
40
+ A["runTestDev(workspaceId, orgId, opts)"] --> B["insere test_run (status: running)"]
41
+ B --> C{"serverUrl() no ar?"}
42
+ C -- "não, opts.noBoot" --> Z1["inconclusive — suba o dev server"]
43
+ C -- "não" --> D["startProjectServer()"]
44
+ D --> E{"running + url?"}
45
+ E -- "não" --> Z2["inconclusive — não subiu"]
46
+ E -- "sim" --> F
47
+ C -- "sim" --> F["deriva rotas (caller ou '/'), máx 8"]
48
+ F --> G{"import @playwright/test"}
49
+ G -- "ausente" --> Z3["inconclusive — Playwright indisponível"]
50
+ G -- "ok" --> H["chromium.launch headless"]
51
+ H -- "binário ausente" --> H2["ensureChromium() instala · tenta de novo"]
52
+ H2 -- "ainda falha" --> Z4["inconclusive — não conseguiu subir o chromium"]
53
+ H --> I["novo context 1280x800 · liga listeners console/pageerror/requestfailed"]
54
+ I --> J["para cada rota: goto · clica 1º botão · varre HTML por segredos · screenshot"]
55
+ J --> K["sondagens de segurança: /.env /.env.local /.git/config /config.json /admin /api"]
56
+ K --> L{"algum finding high-severity?"}
57
+ L -- "sim" --> M["veredito: fail"]
58
+ L -- "não" --> N["veredito: pass"]
59
+ M --> O["atualiza test_run · ingestKnowledge(type: test)"]
60
+ N --> O
61
+ ```
62
+
63
+ ### Lista de passos (o que `runTestDev` realmente faz)
64
+
65
+ 1. **Abrir a execução** — insere uma linha `test_run` com `status: "running"`, `by` = `operator` (padrão) ou `agent`.
66
+ 2. **Garantir um dev server** —
67
+ - Se já houver uma URL no ar, usa.
68
+ - Se não houver e `opts.noBoot` estiver setado (caminho do portão autônomo), retorna `inconclusive` imediatamente — o portão nunca auto-instala/sobe um projeto no meio de uma tarefa.
69
+ - Caso contrário, chama `startProjectServer()`; se não subir, retorna `inconclusive`.
70
+ - Se o servidor iniciou mas `serverStatus().status !== "running"` ainda, retorna `inconclusive` ("ainda subindo — tente de novo em instantes").
71
+ 3. **Derivar rotas** — `opts.routes` fornecidas pelo chamador, senão `["/"]`, limitadas a **8** rotas.
72
+ 4. **Subir o navegador** — `import("@playwright/test")` dinâmico. Se o import falhar → `inconclusive`. Se `chromium.launch()` lançar porque o binário do navegador não está instalado → `ensureChromium()` roda `npx playwright install chromium` (uma vez por processo, limite de 300s) e tenta de novo; se ainda falhar → `inconclusive`.
73
+ 5. **Dirigir cada rota** — abre um context em **1280×800**, liga os listeners e, para cada rota: `page.goto(...)` (`domcontentloaded`, timeout 20s), registra um finding `high` em HTTP ≥ 500, espera 800ms, clica no primeiro `button` visível e habilitado para exercitar um fluxo, varre o HTML servido por segredos, captura screenshot em `.testdev/`.
74
+ 6. **Sondagens de segurança** — `fetch` em cada caminho sensível (`redirect: "manual"`, timeout 4s); um `200` com conteúdo (qualquer caminho exceto `/api`) ou um match de segredo é um finding de segurança `high`.
75
+ 7. **Veredito** — qualquer finding de severidade `high` ⇒ `fail`; caso contrário `pass`. Warnings / findings low nunca reprovam uma execução.
76
+ 8. **Persistir + capturar** — atualiza a linha `test_run` (`status`, `summary`, `findings`, `finishedAt`) e `ingestKnowledge(type: "test")` para que o veredito vire KB durável.
77
+
78
+ ---
79
+
80
+ ## Conceitos-chave ✦
81
+
82
+ ### Detecção de stack (`detectProject`)
83
+
84
+ `detectProject(orgId)` varre a raiz do workspace **e** subdiretórios comuns (`packages`, `apps`, `app`, `web`, `client`, `frontend`, `backend`, `server`, `api`). Ele roda duas passagens:
85
+
86
+ - **Passagem 1 — Node sempre vence.** `detectNode(dir)` procura `package.json` com um script `dev`, `start` ou `serve` (nessa prioridade). O gerenciador de pacotes é inferido pelo lockfile: `pnpm-lock.yaml` → `pnpm`, `yarn.lock` → `yarn`, senão `npm`. A instalação só é sinalizada quando `node_modules` está ausente.
87
+ - **Passagem 2 — outros ecossistemas**, em ordem: Django (`manage.py`), FastAPI (`main.py` contendo `FastAPI(`) → `uvicorn`, `main.py` simples → `python main.py`, Go (`go.mod`) → `go run .`, Rust (`Cargo.toml`) → `cargo run`, estático (`server.js`) → `node server.js`.
88
+
89
+ | `ProjectKind` | Gatilho | Label | Etapa de install |
90
+ | --- | --- | --- | --- |
91
+ | `node` | `package.json` + dev/start/serve | `npm/pnpm/yarn <script>` | `<pm> install` se `node_modules` ausente |
92
+ | `python` (django) | `manage.py` | `django runserver` | `pip install -r requirements.txt` (uma vez, marker) |
93
+ | `python` (fastapi) | `main.py` com `FastAPI(` | `uvicorn` | idem |
94
+ | `python` (script) | `main.py` | `python main.py` | idem |
95
+ | `go` | `go.mod` | `go run` | — |
96
+ | `rust` | `Cargo.toml` | `cargo run` | — |
97
+ | `static` | `server.js` | `node server.js` | — |
98
+
99
+ ### Faixa de portas 🛰️
100
+
101
+ `freePort(start = 4173, end = 4999)` percorre a faixa e retorna a primeira porta que faz bind em `127.0.0.1`. A faixa deliberadamente **evita a própria `:3000` da Constella**. A porta escolhida é exportada para o filho como `PORT`, e qualquer sentinela literal `$PORT` em `runArgs` é substituída antes do spawn. Env passado ao filho: `PORT`, `BROWSER=none`, `NODE_ENV=development`.
102
+
103
+ ### Pré-checagem de toolchain
104
+
105
+ Para kinds não-Node e não-estáticos (`python`/`go`/`rust`), `toolAvailable(cmd)` roda `<cmd> --version` (cache de 60s) antes de subir. Um toolchain ausente falha **rápido e com clareza** em vez de uma espera morta de 30s. No portão de boot isso é tratado como "não dá para validar, não punir" — veja Estados possíveis.
106
+
107
+ ### Detecção de "ready" + deadlines de boot
108
+
109
+ `push()` observa o stdout/stderr do filho; a primeira linha que casa com `/(ready|listening|localhost:|started server|compiled)/i` vira `status: "starting" → "running"`. Em paralelo, `waitReachable(url, deadline)` faz polling na porta. Os deadlines escalam por kind:
110
+
111
+ | Kind | Deadline de boot |
112
+ | --- | --- |
113
+ | `go`, `rust` (compilação) | 120 000 ms |
114
+ | `python` | 60 000 ms |
115
+ | `node` / `static` | 30 000 ms |
116
+
117
+ ### Findings — tipos & severidades 🕳️
118
+
119
+ Um `Finding` é `{ severity, kind, route, message }`.
120
+
121
+ | `kind` | Origem | `severity` típica |
122
+ | --- | --- | --- |
123
+ | `console` | `page.on("console")` — `error` → high, `warning` → low | high / low |
124
+ | `pageerror` | `page.on("pageerror")` — exceção JS não capturada | high |
125
+ | `request` | `page.on("requestfailed")` (não-`ERR_ABORTED`), HTTP ≥ 500 no `goto`, ou navegação que falhou | med / high |
126
+ | `security` | match do regex de segredo no HTML servido, ou caminho sensível retornando `200` com conteúdo | high |
127
+ | `boot` | dev server / chromium não conseguiu iniciar | low |
128
+
129
+ O detector de segredos `SECRET_RE` casa chaves `sk-…`, IDs AWS `AKIA…`, cabeçalhos de chave privada PEM e literais `password: "…"` / `password='…'`. Ele é aplicado tanto ao HTML servido quanto aos corpos de resposta das sondagens.
130
+
131
+ ### Sondagens de segurança
132
+
133
+ `SECURITY_PATHS = ["/.env", "/.env.local", "/.git/config", "/config.json", "/admin", "/api"]`. Cada um é buscado **apenas contra o dev server local do projeto** — nunca um host externo. Um `200` que retorna conteúdo (todo caminho exceto `/api`, que pode legitimamente ser um `200` roteável) é marcado como finding de segurança high-severity, assim como qualquer corpo de resposta que case com `SECRET_RE`.
134
+
135
+ ### Lógica do veredito
136
+
137
+ ```text
138
+ high = findings onde severity === "high"
139
+ status = high.length ? "fail" : "pass"
140
+ ```
141
+
142
+ Somente findings **hard (high-severity)** bloqueiam. Warnings e notas de baixa severidade são registrados mas não reprovam a execução. Se o app não conseguir subir, o Playwright estiver ausente, ou o chromium não subir, o veredito é **`inconclusive`** — uma escolha de design deliberada para que o harness nunca produza um falso `fail` e nunca bloqueie uma tarefa por engano.
143
+
144
+ ---
145
+
146
+ ## A tabela `test_run` 🗄️
147
+
148
+ Definida em `src/db/schema.ts` (`sqliteTable("test_run", …)`):
149
+
150
+ | Coluna | Tipo | Notas |
151
+ | --- | --- | --- |
152
+ | `id` | text PK | UUID da execução |
153
+ | `workspaceId` | text → `workspace.id` | cascade delete; indexada (`test_run_ws_idx`) |
154
+ | `goalId` | text, nullable | link opcional ao goal sob teste |
155
+ | `issueId` | text, nullable | link opcional à issue sob teste |
156
+ | `status` | enum `running` \| `pass` \| `fail` \| `inconclusive` | padrão `running` |
157
+ | `summary` | text | padrão `""`; fatia persistida de ≤ 600 chars |
158
+ | `findings` | text (JSON) | `Finding[]` serializado; fatia persistida de ≤ 20 000 chars |
159
+ | `by` | enum `operator` \| `agent` | quem disparou a execução |
160
+ | `startedAt` | integer timestamp | padrão agora |
161
+ | `finishedAt` | integer timestamp, nullable | setado em `finish()` |
162
+
163
+ A página `/test-dev` (`src/app/(app)/test-dev/page.tsx`) lista as **20 execuções mais recentes** do workspace mais o `serverStatus(workspace.id)` ao vivo.
164
+
165
+ ---
166
+
167
+ ## Estados possíveis 🌌
168
+
169
+ ### Status do dev server (`DevServerStatus.status`)
170
+
171
+ | Estado | Significado |
172
+ | --- | --- |
173
+ | `none` | nenhum servidor rastreado para este workspace |
174
+ | `starting` | spawnado, ainda não alcançável / nenhuma linha de "ready" vista |
175
+ | `running` | alcançável / imprimiu uma linha de "ready" |
176
+ | `stopped` | saiu de forma limpa ou foi parado pelo operador |
177
+ | `error` | spawn falhou, exit ≠ 0, toolchain ausente, ou nenhuma porta livre |
178
+
179
+ ### Veredito de teste (`TestVerdict`)
180
+
181
+ | Veredito | Quando |
182
+ | --- | --- |
183
+ | `pass` | nenhum finding high-severity |
184
+ | `fail` | ≥ 1 finding high-severity |
185
+ | `inconclusive` | não subiu / nenhum projeto executável / Playwright ou chromium indisponível / servidor ainda inalcançável / `noBoot` e nada no ar |
186
+
187
+ ---
188
+
189
+ ## Passo a passo 🚀
190
+
191
+ ### Rodar como operador
192
+
193
+ 1. Abra o módulo **Test Dev**, ou digite `/test-dev` na Team Room ou em uma DM.
194
+ 2. Se nenhum dev server estiver no ar, suba a partir do módulo (isso chama `startDevServerAction` → `startProjectServer`, instalando dependências na primeira vez).
195
+ 3. Rode a validação. O Edsger posta o resultado de volta no thread:
196
+ `Test Dev — **pass** … Navigated N route(s).`
197
+ 4. Inspecione os findings + screenshots (salvos em `<org-root>/.testdev/<runId>-<route>.png`).
198
+
199
+ ### Rodar para uma issue específica
200
+
201
+ `runTestDevAction({ issueId })` resolve rotas com `routesForIssue(workspaceId, issueId)`, que minera o título/key da issue por substrings parecidas com `/path` (até 4) e sempre inclui `/`.
202
+
203
+ ---
204
+
205
+ ## Exemplos 🛰️
206
+
207
+ **Comando slash do operador (`/test-dev`)** — tratado em `src/server/commands.ts`:
208
+
209
+ ```text
210
+ operator: /test-dev
211
+ edsger: 🧪 Running the Test Dev validation gate…
212
+ edsger: Test Dev — pass. Passed — 2 note(s), no blocking issues. Navigated 1 route(s).
213
+ ```
214
+
215
+ **Portão autônomo (runner)** — após uma tarefa de código, em `src/server/runner.ts`:
216
+
217
+ ```ts
218
+ // portão de boot — o projeto AINDA precisa subir
219
+ const boot = await ensureBootable(ws.id, ws.orgId);
220
+ if (!boot.ok) {
221
+ next = "review";
222
+ await pushInbox(ws.id, { kind: "block", refType: "task", refId: t.id, /* … */
223
+ title: `${t.key} broke the dev server`, detail: `${t.title}\n\n${boot.detail}` });
224
+ }
225
+
226
+ // portão Test Dev — só se um servidor já estiver no ar (noBoot: true)
227
+ if (next === "done" && serverUrl(ws.id)) {
228
+ const gate = await runTestDev(ws.id, ws.orgId, { goalId: t.goalId, issueId: t.issueId ?? undefined,
229
+ by: "agent", noBoot: true, routes: /* routesForIssue */ });
230
+ if (gate.status === "fail") {
231
+ next = "review";
232
+ await pushInbox(ws.id, { kind: "validation", refType: "validation", refId: gate.id, /* … */
233
+ title: `${t.key} failed Test Dev`, detail: gate.summary });
234
+ }
235
+ }
236
+ ```
237
+
238
+ ---
239
+
240
+ ## Gating do Edsger + o modelo de dois portões 🪐
241
+
242
+ O loop de trabalho autônomo aplica **dois** portões antes de uma tarefa de código poder ser marcada como `done`:
243
+
244
+ 1. **Portão de boot (`ensureBootable`)** — aplica-se quando `next === "done"` e a tarefa tocou ao menos um caminho de *código* (`isCodePath`: qualquer coisa que não esteja sob `.claude/`, `DOCS/`, `PO/`, `Reports/`, `specs/`, `issues/`, `mock/`, e que não seja um `*.md` de topo). Se o projeto não sobe mais, a tarefa volta para `review`, um `block` é enfileirado no Inbox (`"<key> broke the dev server"`) e o operador é notificado. Um *toolchain ausente* retorna `ok: true` (pula, "não dá para validar"), nunca um bloqueio falso.
245
+ 2. **Portão Test Dev (`runTestDev`, `noBoot: true`)** — aplica-se quando `next === "done"` **e um dev server já está no ar** (`serverUrl(ws.id)`). Por causa de `noBoot`, esse portão nunca instala/sobe um projeto no meio da tarefa — ele só valida o que já está no ar. Um veredito `fail` manda a tarefa de volta para `review` com um item `validation` no Inbox (`"<key> failed Test Dev"`).
246
+
247
+ O **Edsger** é o agente de QA/teste (handle `edsger`, reporta a `linus`). Quando o Test Dev roda como portão autônomo (`by: "agent"`), a captura na KB é atribuída ao `edsger`; quando rodado via `/test-dev`, o Edsger é a persona que posta o veredito na conversa. Ambos os portões são projetados para **degradar para `inconclusive`/pular** em vez de segurar uma tarefa por engano.
248
+
249
+ ```mermaid
250
+ flowchart LR
251
+ T["tarefa concluída pelo agente"] --> C1{"tocou caminho de código?"}
252
+ C1 -- "não (docs/PO)" --> DONE["done"]
253
+ C1 -- "sim" --> BG["portão de boot: ensureBootable"]
254
+ BG -- "ok:false" --> REV1["review + Inbox block"]
255
+ BG -- "ok:true" --> C2{"dev server no ar?"}
256
+ C2 -- "não" --> RG["portão de review (reviewer)"]
257
+ C2 -- "sim" --> TD["runTestDev noBoot:true"]
258
+ TD -- "fail" --> REV2["review + Inbox validation"]
259
+ TD -- "pass / inconclusive" --> RG
260
+ RG --> DONE
261
+ ```
262
+
263
+ ---
264
+
265
+ ## Screenshots & artefatos 🌠
266
+
267
+ - Screenshots são gravados em `<org-root>/.testdev/<runId>-<route>.png` (rota convertida em slug `[a-z0-9_]`, `root` para `/`). O diretório é criado em best-effort com `mkdirSync(..., { recursive: true })`.
268
+ - A captura na KB (`ingestKnowledge`) escreve uma entrada do tipo `test` intitulada `Test Dev — <status>` com o summary, ligada ao goal/issue, atribuída ao `edsger` (execuções de agente) ou `operator`.
269
+ - O diretório `.testdev/` é um artefato de controle da Constella — ele é removido da árvore de fonte limpa pela preparação de deploy (`buildCleanTree`) e não faz parte do produto que é enviado.
270
+
271
+ ---
272
+
273
+ ## Integrações relacionadas 🛰️
274
+
275
+ - **Loop de trabalho / runner** — `src/server/runner.ts` conecta ambos os portões (veja [WORKFLOW.md](./WORKFLOW.md), [AGENTS.md](./AGENTS.md)).
276
+ - **Inbox** — portões reprovados enfileiram itens `block` / `validation` (veja [INBOX.md](./INBOX.md)).
277
+ - **KB / RAG** — todo veredito é ingerido como conhecimento `test` durável (veja [KB_RAG.md](./KB_RAG.md), [KB_AGENT.md](./KB_AGENT.md)).
278
+ - **Prepare Deploy** — reutiliza `ensureBootable` + `detectProject` na etapa `validateBuild` (veja [PREPARE_DEPLOY.md](./PREPARE_DEPLOY.md)).
279
+ - **Comandos de chat** — `/test-dev` e `/review` (veja [CHAT_COMMANDS.md](./CHAT_COMMANDS.md)).
280
+ - **Stacks de projeto** — a detecção de stack espelha os ecossistemas do starter executável (veja [PROJECT_STACKS.md](./PROJECT_STACKS.md)).
281
+
282
+ ---
283
+
284
+ ## Segurança 🕳️
285
+
286
+ - **Sondagens são apenas locais.** As sondagens de segurança e a checagem de frameability do iframe (`previewFrameableAction`) só miram `127.0.0.1` / `localhost`. O harness nunca aponta um navegador ou `fetch` para um host externo.
287
+ - **Varredura de segredos** roda no HTML servido e nos corpos de resposta das sondagens via `SECRET_RE`; um match é um finding de segurança high-severity (e, se aparecer na saída do produto, algo que os agentes precisam corrigir antes do deploy).
288
+ - **Sondagem de caminhos sensíveis** confirma que `/.env`, `/.git/config`, `/admin` etc. não são servidos sem autenticação pelo app sob teste.
289
+ - **Sem falso fail.** A incapacidade de subir ou de instalar o Chromium gera `inconclusive`, nunca `fail` — o portão não pode ser transformado numa negação de progresso por um toolchain instável.
290
+ - O dev server do projeto roda com `NODE_ENV=development`, `BROWSER=none`, dentro do workspace da org; no restart da Constella, `stopAllProjectServers()` o recolhe.
291
+
292
+ Veja [SECURITY.md](./SECURITY.md) para o modelo de confiança geral.
293
+
294
+ ---
295
+
296
+ ## Solução de problemas 🌌
297
+
298
+ | Sintoma | Causa | Correção |
299
+ | --- | --- | --- |
300
+ | `inconclusive — No runnable project` | nenhum script dev/start/serve no `package.json` e nenhum entrypoint Python/Go/Rust/`server.js` | adicione um script `dev`/`start` ou um ponto de entrada reconhecido no workspace |
301
+ | `inconclusive — Playwright not available` | `@playwright/test` não instalado | instale o Playwright no diretório de instalação |
302
+ | `Couldn't install/launch chromium` | binário do navegador ausente, install estourou o timeout (300s) | rode `npx playwright install chromium` no diretório de instalação e tente de novo |
303
+ | `inconclusive — Dev server is still starting` | porta ainda inalcançável dentro do deadline | espere e rode de novo; para a primeira compilação go/rust isso pode levar até 120s |
304
+ | `error — Toolchain not found: '<cmd>'` | python/go/cargo fora do `PATH` | instale o toolchain, ou escolha uma stack Node (o portão de boot o pula como "não dá para validar") |
305
+ | `error — No free port available` | nada livre em `4173–4999` | libere uma porta na faixa ou pare dev servers obsoletos |
306
+ | Portão de boot segurou a tarefa (`"<key> broke the dev server"`) | a mudança deixou o projeto sem conseguir subir | corrija o erro de build/import; a tarefa fica em `review` com o log de boot no Inbox |
307
+ | Iframe de preview mostra erro do navegador | app envia `X-Frame-Options` / CSP `frame-ancestors` restritivo | esperado — `previewFrameableAction` detecta; abra o app numa nova aba |
308
+
309
+ ---
310
+
311
+ ## Links relacionados ✦
312
+
313
+ - [WORKFLOW.md](./WORKFLOW.md) — o ciclo de vida do trabalho e onde os portões se encaixam
314
+ - [AGENTS.md](./AGENTS.md) — Edsger (QA) e o roster
315
+ - [PREPARE_DEPLOY.md](./PREPARE_DEPLOY.md) — reuso de `ensureBootable` na preparação de deploy
316
+ - [DEPLOY.md](./DEPLOY.md) — lançando o produto
317
+ - [INBOX.md](./INBOX.md) — onde portões reprovados pousam
318
+ - [KB_RAG.md](./KB_RAG.md) · [KB_AGENT.md](./KB_AGENT.md) — conhecimento de teste durável
319
+ - [CHAT_COMMANDS.md](./CHAT_COMMANDS.md) — `/test-dev`, `/review`
320
+ - [PROJECT_STACKS.md](./PROJECT_STACKS.md) — stacks que o dev server consegue subir
321
+ - [SECURITY.md](./SECURITY.md) · [TROUBLESHOOTING.md](./TROUBLESHOOTING.md)
@@ -0,0 +1,294 @@
1
+ [← Índice](./README.md) · [🇬🇧 English](../en/TROUBLESHOOTING.md) · [✦ Constella](../../README.pt-BR.md)
2
+
3
+ # Solução de problemas 🛰️ — quando a constelação sai de órbita
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ Correções reais, baseadas no código, para o que de fato quebra: uma porta ocupada, um servidor de embeddings adormecido, um navegador ausente, uma CLI sem login, um worker travado. Cada sintoma abaixo é rastreado até um comportamento concreto no código — nada de folclore.
8
+
9
+ > A nave central roda dois motores (web + worker) e uma frota de serviços satélites (servidor de embeddings, llama.cpp, poll do Telegram, o dev server do projeto). Quando um sai de órbita, o Constella foi projetado para **degradar, não cair**. Esta página diz qual estrela apagou e como reacendê-la.
10
+
11
+ ---
12
+
13
+ ## 1. Quando usar 🌌
14
+
15
+ Recorra a esta página quando:
16
+
17
+ - Um modo de execução não inicia (`npx constella --auth`, `--vps`, `--portable`).
18
+ - Algo *funciona mas degrada silenciosamente* — o RAG vira só palavra-chave, o Test Dev retorna `INCONCLUSIVE`, os agentes caem para um modelo padrão.
19
+ - O loop 24/7 parece congelado: nenhum agente se move, nenhuma resposta do Telegram, nenhum tick de cron.
20
+ - Um problema de instalação/primeira execução: o build falha, `claude`/`codex` não encontrados, disco pequeno demais.
21
+
22
+ Para contexto mais profundo de qualquer subsistema, siga os [Links relacionados](#15-links-relacionados--docs-irmãos-) no rodapé — esta página é a triagem, não o manual completo.
23
+
24
+ ---
25
+
26
+ ## 2. Como funciona — o design fail-soft 🪐
27
+
28
+ O diagnóstico do Constella se apoia em três princípios embutidos no código:
29
+
30
+ | Princípio | Onde vive | O que significa para você |
31
+ |---|---|---|
32
+ | **Fail closed em segredos/auth** | `src/app/api/cron/tick/route.ts`, `bin/worker.mjs` | Sem `CONSTELLA_WORKER_SECRET` → o endpoint do tick retorna **401**, e o worker nem fala com um host não-loopback. Uma brecha de segurança nunca abre silenciosamente. |
33
+ | **Fail soft em capacidade** | `src/server/rag.ts`, `src/server/test-harness.ts`, `src/server/adapters/cli.ts` | Sem servidor de embeddings → busca por palavra-chave. Sem Playwright → `inconclusive`. Id de modelo inválido → padrão da CLI. Uma *capacidade* ausente degrada; não derruba o fluxo inteiro. |
34
+ | **Status honesto** | `src/server/local-models.ts`, `src/server/devserver.ts` | As sondas de "está no ar?" retornam o motivo real (`"llama-server not installed"`, `"no embedding model installed"`). A UI mostra o que o código realmente encontrou — nunca um "pronto" fabricado. |
35
+
36
+ Então a maior parte da solução de problemas é **ler o motivo honesto** que o código já expôs e corrigir a causa nomeada.
37
+
38
+ ---
39
+
40
+ ## 3. Fluxo principal — ordem de boot e onde pode quebrar 🌠
41
+
42
+ ```mermaid
43
+ flowchart TD
44
+ A["npx constella --<modo>"] --> B{"segredos em <HOME>/.env?"}
45
+ B -- "não" --> B2["gera BETTER_AUTH_SECRET,<br/>CONSTELLA_VAULT_KEY,<br/>CONSTELLA_WORKER_SECRET (chmod 600)"]
46
+ B -- "sim" --> C["drizzle-kit migrate"]
47
+ B2 --> C
48
+ C -- "falha em db NOVO" --> CX["✖ aborta: o app precisa das tabelas"]
49
+ C -- "ok / no-op" --> D{".next/BUILD_ID existe?"}
50
+ D -- "não, modo público" --> DX["build; se falhar → ✖ recusa dev server"]
51
+ D -- "sim" --> E["supervisiona web (next start) + worker"]
52
+ E --> F["worker: waitForServer → tick → watcher → poll do telegram"]
53
+ F --> G{"servidor de embeddings :8083 no ar?"}
54
+ G -- "sim" --> H["RAG = semântico"]
55
+ G -- "não" --> I["RAG = fallback por palavra-chave"]
56
+ ```
57
+
58
+ Cada losango é um lugar onde um sintoma real aparece. A tabela em [§7](#7-sintoma--causa--correção--a-tabela-mestre-) mapeia cada um deles a uma correção.
59
+
60
+ ---
61
+
62
+ ## 4. Conceitos-chave 🕳️
63
+
64
+ - **Raiz de runtime** — tudo vive sob `<HOME>` (padrão `~/.constella`, sobrescreva com `CONSTELLA_HOME` ou `--path`). O banco é `<HOME>/constella.db`; os segredos ficam em `<HOME>/.env`. Quando algo não acha os dados, este é o primeiro caminho a confirmar.
65
+ - **Processo duplo** — o servidor web (`next start`) e o worker (`bin/worker.mjs`) são separados. Uma UI congelada e um loop 24/7 travado são problemas *diferentes* com logs *diferentes*.
66
+ - **Worker só loopback** — o worker anexa o privilegiado `x-worker-secret` em toda chamada e **recusa** qualquer `CONSTELLA_BASE_URL` não-loopback, a menos que você defina `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1`.
67
+ - **Sondas de capacidade** — `embedServerUp()`, `llamaServerStatus()`, `cliVersion()`, `detectCliAuth()`, `toolAvailable()` são todas sondas reais e limitadas. Nunca lançam exceção; retornam um status acionável.
68
+
69
+ ---
70
+
71
+ ## 5. Kit de comandos de diagnóstico 🚀
72
+
73
+ | Objetivo | Comando | Lê |
74
+ |---|---|---|
75
+ | Versão + atualização disponível | `npx constella update --check` | registro npm (`registry.npmjs.org/constella/latest`) |
76
+ | A CLI do Claude está autenticada? | `claude --version` e faça login no Claude Code | `cliVersion("claude")` / `detectCliAuth` |
77
+ | A CLI do Codex está autenticada? | `codex --version`, depois `codex login` | idem |
78
+ | Servidor de embeddings vivo? | `curl http://127.0.0.1:8083/health` | `embedServerUp()` |
79
+ | Servidor de chat llama vivo? | `curl http://127.0.0.1:8082/v1/models` | `llamaServerStatus()` |
80
+ | Alvo acessível do worker | confira `CONSTELLA_BASE_URL` (precisa ser loopback) | guarda SSRF do `bin/worker.mjs` |
81
+ | Reaplicar o schema manualmente | `npm run db:migrate` | `drizzle-kit migrate` |
82
+ | Espaço livre no disco de runtime | o launcher imprime no modo portable | `freeBytes()` / `checkUsbFreeSpace()` |
83
+
84
+ > O launcher nunca imprime segredos — ele registra `• Secrets ready (stored in <HOME>/.env, never printed).` Não procure por eles no console.
85
+
86
+ ---
87
+
88
+ ## 6. Triagem passo a passo 🌌
89
+
90
+ 1. **Leia o banner de inicialização.** O `bin/constella.mjs` imprime a raiz de runtime, o modo + bind e a linha do next-start. Um `<HOME>` errado aqui explica a maioria dos relatos de "meus dados sumiram".
91
+ 2. **Separe web de worker.** A *UI* está quebrada, ou o *loop* não avança? Eles têm supervisores independentes (máx. 5 reinícios / 60 s cada) e stdout independentes.
92
+ 3. **Verifique a sonda honesta.** Abra a página relevante (Models, Test Dev) — o código já expôs o motivo real. Combine-o com a tabela abaixo.
93
+ 4. **Corrija a causa nomeada** e deixe o autorreparo agir (o servidor de embeddings auto-inicia, o RAG re-indexa sozinho quando os embeddings aparecem, o chromium se instala uma vez).
94
+ 5. **Se um filho entra em crash-loop**, o supervisor desiste após 5 reinícios em 60 s e imprime uma dica (ex.: "Likely OS-level OOM … raise `CONSTELLA_WEB_HEAP_MB`").
95
+
96
+ ---
97
+
98
+ ## 7. Sintoma · Causa · Correção — a tabela mestre 🛰️
99
+
100
+ ### 7.1 Boot & instalação
101
+
102
+ | Sintoma | Causa | Correção |
103
+ |---|---|---|
104
+ | `EADDRINUSE` / "porta 3000 ocupada" ao iniciar | Outro processo segura a porta escolhida (web na 3000, ou um Constella zumbi) | Passe `--port <n>` (ou `PORT=<n>`), ou pare o outro processo. O launcher lê `--port` → `PORT` → `3000`. |
105
+ | `✖ drizzle-kit not found in the install` | Instalação incompleta (árvore de deps cortada) | Reinstale o pacote. O `drizzle-kit migrate` é obrigatório — o launcher aborta sem ele. |
106
+ | `✖ Database schema migration failed on a fresh database — aborting` | As migrações não aplicaram em um `<HOME>/constella.db` novo | Inspecione o erro do drizzle acima. Um banco novo sem tabelas daria 500 em toda requisição, então o boot falha closed por design. Em um banco *existente*, uma re-execução falha é tolerada (registra `• schema migrate skipped/failed … continuing`). |
107
+ | `✖ No production build and the build failed … Refusing to start a dev server in a public/network mode` | Rodando uma árvore de fonte sem `.next/BUILD_ID`, build falhou, modo público (`CONSTELLA_PUBLIC=1`) | Instale um pacote pré-buildado, ou rode `npm run build`. Um launch via CLI nunca rebaixa silenciosamente para o `next dev` não-endurecido. Devs podem optar com `CONSTELLA_DEV=1` (só em árvore de fonte). |
108
+ | Build na primeira execução é lento e depois funciona | Árvore de fonte sem build → `next build` uma vez | Esperado, uma vez. O pacote npm publicado já traz um `.next` pré-buildado, então o usuário final nunca passa por isso. |
109
+ | `✖ next not found in the install` | `node_modules` cortado/quebrado | Reinstale o pacote. |
110
+
111
+ ### 7.2 Execução dos agentes (CLIs claude / codex)
112
+
113
+ | Sintoma | Causa | Correção |
114
+ |---|---|---|
115
+ | Os agentes erram instantaneamente, o texto do resultado é um erro de spawn | `claude` (ou `codex`) **não instalado / fora do PATH** | Instale a CLI; verifique com `claude --version`. O `runProc` faz spawn do binário puro no cwd do workspace. |
116
+ | O agente roda mas o resultado vem vazio / "needs login" | CLI instalada mas **sem autenticação** | Faça login no Claude Code; para o Codex rode `codex login`. O `detectCliAuth` confere `~/.claude/.credentials.json`, `~/.codex/auth.json`. O `LOGIN_HINTS` mostra a ação por CLI na UI. |
117
+ | A execução termina com `error: "timed out"` | A CLI estourou o timeout padrão de **180 s** | Tarefas pesadas: aumente o timeout daquele adaptador, ou divida o trabalho. O runner dá SIGKILL no limite e registra `timed out` honestamente. |
118
+ | O agente ignora o modelo configurado | O id de modelo falhou na validação do `safeModel` (guarda de injeção) | Use um id de modelo plausível (`opus`/`sonnet`/`haiku`, `gpt-5-codex`, ou `provider/model`). Um valor inválido é descartado e a CLI usa o próprio padrão. |
119
+ | Agentes "falam estranho" (cortado, sem artigos) | Hooks/plugins pessoais do `~/.claude` do operador vazaram para a execução headless | Já mitigado: agentes rodam com um overlay `--settings {disableAllHooks:true}`. Se você habilitou os hooks de lock/guard, a isolação usa um config dir limpo. |
120
+ | O agente não consegue instalar deps / rodar testes | O modo de execução está **jaulado** (`vps`/`auth`/`portable` → `acceptEdits`, codex `workspace-write`) | Endurecimento esperado. Sobrescreva com `CONSTELLA_AGENT_FULL_ACCESS=1` (ou `=0` para re-jaular o modo `start`). |
121
+ | Pesquisa web não acontece | `CONSTELLA_WEB_RESEARCH=0` ou `settings.agents.webResearch=false` por workspace | As ferramentas web estão LIGADAS por padrão (`--allowedTools WebSearch WebFetch`). Reative. |
122
+
123
+ ### 7.3 Nebulosa de memória RAG / KB 🌌
124
+
125
+ | Sintoma | Causa | Correção |
126
+ |---|---|---|
127
+ | A recuperação parece rasa / só palavra-chave | **Servidor de embeddings :8083 fora** → busca semântica indisponível | O `embed()` tenta Ollama (`OLLAMA_URL`), depois llama.cpp (`CONSTELLA_EMBED_URL` :8083). Sem nenhum, o `retrieve()` cai num heurístico de palavra-chave (`mode: "heuristic"`). Baixe `nomic-embed-text`; o servidor auto-inicia no boot e quando o modelo chega. |
128
+ | Existem chunks mas sem vetores | O índice foi construído com o servidor de embeddings fora | Nenhuma ação — quando os embeddings ficam disponíveis, o `retrieve()` re-indexa **uma vez por processo** (guarda `autoReindexed`) para os chunks ganharem vetores. Force em Models → Reindex. |
129
+ | `retrieve` retorna `mode: "none"` | Nenhum chunk (índice vazio) | A primeira chamada roda `indexRag` preguiçosamente. Se continuar vazio, não há nada nos diretórios indexados (`.claude`, `DOCS`, `PO`, `Reports`, `specs`, `issues`, `mock`). |
130
+ | Prompts/skills internos vazam nas respostas | — | Não pode acontecer: `.claude/kb/` e `.claude/skills/` são excluídos do RAG pelo `inRagDirs`. |
131
+ | Erros no caminho do Ollama | Ollama não está rodando | Inicie (`ollama serve`) e baixe `nomic-embed-text`, ou apenas confie no servidor de embeddings dedicado do llama.cpp. |
132
+
133
+ ### 7.4 Test Dev (o dev server do projeto + Playwright) 🚀
134
+
135
+ | Sintoma | Causa | Correção |
136
+ |---|---|---|
137
+ | Veredito `INCONCLUSIVE`, mensagem "Playwright not available" | `@playwright/test` não importável | `npx playwright install chromium` no diretório de instalação, depois tente de novo. |
138
+ | `INCONCLUSIVE`, "Couldn't install/launch chromium" | O binário do navegador falta (o npm instala a lib, não o navegador) | O Test Dev roda `npx playwright install chromium` sozinho uma vez por processo; se falhar, rode manualmente. |
139
+ | `INCONCLUSIVE`, "No runnable project / dev server didn't boot" | Sem script dev/start no `package.json`, ou sem projeto Python/Go/Rust no workspace | Adicione um ponto de entrada executável (`detectProject` varre a raiz + subdirs `apps`/`web`/`server`/…). |
140
+ | `INCONCLUSIVE`, "Toolchain not found: 'python'/'go'/'cargo'" | A toolchain do starter não-Node não está instalada | Instale a toolchain, ou escolha um stack Node. O `toolAvailable()` faz pré-checagem para falhar rápido em vez de uma espera morta de 30 s. |
141
+ | `INCONCLUSIVE`, "Dev server is still starting" | O servidor subiu mas a porta ainda não responde | Tente de novo em breve. Primeiros boots de Go/Rust ganham 120 s, Python 60 s, Node 30 s. |
142
+ | `INCONCLUSIVE` em vez de `FAIL` com o app quebrado | Por design — o Test Dev nunca retorna um **falso fail** | Só achados de severidade alta viram o veredito para `FAIL`. Um problema de boot/tooling é `inconclusive`. |
143
+
144
+ ### 7.5 Worker / loop 24/7 🛰️
145
+
146
+ | Sintoma | Causa | Correção |
147
+ |---|---|---|
148
+ | Nada avança sozinho; sem logs de tick | O worker não consegue alcançar o servidor web | O worker sonda `CONSTELLA_BASE_URL` por ~90 s antes do primeiro tick. Confirme que o web está no ar e que a base URL é o loopback `http://127.0.0.1:<port>`. |
149
+ | O worker imprime `✖ Refusing to send the worker secret to a non-loopback host` e sai | `CONSTELLA_BASE_URL` aponta para um host não-loopback | A guarda SSRF é intencional. Para um worker remoto de verdade, defina `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1` (prefira `https://`). |
150
+ | O cron tick retorna **401 unauthorized** | `CONSTELLA_WORKER_SECRET` ausente ou divergente | O endpoint falha closed. O launcher persiste o segredo em `<HOME>/.env`; garanta que web e worker herdem o mesmo env. |
151
+ | O tick roda mas nenhum agente se move | O loop autônomo só roda workspaces com **Run 24/7 LIGADO** | `tickAll({ execute: true, auto: true })` pula workspaces onde o operador não habilitou o loop 24/7. Ligue (ou aprove o plano primeiro). |
152
+ | O watcher nunca indexa edições de arquivo | O arquivo não está num caminho INDEXED | O worker só sincroniza `.claude/skills/*.md`, `.claude/agents/<h>/{Agent,skills}.md`, `DOCS/*.md`, `PO/*.md`, `Reports/*.md`. Outros arquivos são ignorados por design. |
153
+ | O worker fica reiniciando | Um filho caiu; o supervisor reinicia (máx. 5 / 60 s) | Após 5 quedas em 60 s ele desiste e imprime uma dica. Veja o stderr do filho; para OOM, aumente `CONSTELLA_WEB_HEAP_MB` ou limite agentes concorrentes. |
154
+
155
+ ### 7.6 Telegram 🌠
156
+
157
+ | Sintoma | Causa | Correção |
158
+ |---|---|---|
159
+ | O bot não responde | Integração desligada, ou sem token no vault | O poll pula workspaces onde a integração `telegram` está desligada ou onde `getTelegramConfig` retorna vazio. Habilite a integração e defina o token do bot. |
160
+ | O poll do Telegram retorna **401** | `CONSTELLA_WORKER_SECRET` ausente/divergente | Mesma guarda fail-closed do cron tick; o worker recua 30 s e tenta de novo. Corrija o segredo compartilhado. |
161
+ | O bot ignora suas mensagens | Você não está na allowlist | Só o chat privado registrado pode conversar: tanto `chat.id` quanto `from.id` precisam ser iguais ao `chatId` configurado. Qualquer outro é descartado em silêncio. |
162
+ | Menu de comandos `/` ausente | `setMyCommands` ainda não rodou para aquele bot | Ele se registra sozinho uma vez por processo no próximo poll (guarda `commandsRegistered`). Aguarde um ciclo. |
163
+ | Sensação de lentidão / uma mensagem por poll | Long-poll: `getUpdates` espera ~25 s no servidor | Esperado. O worker adiciona um intervalo de 1 s entre long-polls. |
164
+
165
+ ### 7.7 Modos de rede & segredos 🕳️
166
+
167
+ | Sintoma | Causa | Correção |
168
+ |---|---|---|
169
+ | better-auth lança erro com segredo padrão em `auth`/`vps`/`portable` | Sem `BETTER_AUTH_SECRET` real | O launcher gera + persiste um em `<HOME>/.env` (`chmod 600`) para **todos** os modos. Se você limpou o `.env`, basta reiniciar — ele regenera. |
170
+ | O vault não decifra as chaves de provedor / token do Telegram | `CONSTELLA_VAULT_KEY` mudou ou sumiu | O vault é AES-256-GCM com chave `CONSTELLA_VAULT_KEY`. **Trocar a chave orfana o texto cifrado existente.** Restaure a chave original de `<HOME>/.env`, ou re-insira os segredos. |
171
+ | VPS inacessível pela tailnet | Bind em `0.0.0.0` mas Tailscale/Docker não conectados | O modo VPS faz bind em `0.0.0.0` para a tailnet e roda em Docker. Verifique o contêiner + Tailscale; o worker ainda fala com o servidor por loopback dentro do contêiner. |
172
+
173
+ ### 7.8 Portable & espaço em disco 🪐
174
+
175
+ | Sintoma | Causa | Correção |
176
+ |---|---|---|
177
+ | `✖ Portable mode: no removable USB drive detected` | Nenhum drive USB montado | Insira um pen-drive, ou passe `--path <drive>` explicitamente. |
178
+ | `✖ Portable needs at least 32 GB free` e sai | Drive abaixo do mínimo rígido (`PORTABLE_MIN_GB = 32`) | Use um drive maior. Esta é uma barreira fatal. |
179
+ | `• <n> GB free on the drive — good` | No mínimo de 32 GB ou acima (`PORTABLE_RECOMMENDED_GB = 32`) | Dá boot normalmente — mais folga só ajuda se você carregar modelos locais. |
180
+ | Download de GGUF recusado: "not enough free space" | O drive não comporta `sizeBytes * 1.1` | Libere espaço ou escolha um quant menor. A checagem roda antes do download começar. |
181
+ | Modelo baixado falha ao carregar | Download truncado/corrompido | `verifyDownloadedFileSize` (tolerância de 2%) e o SHA-256 opcional pegam isso; o arquivo é apagado. Baixe de novo. |
182
+
183
+ ### 7.9 Banco de dados & migrações 🌌
184
+
185
+ | Sintoma | Causa | Correção |
186
+ |---|---|---|
187
+ | O app dá 500 em toda requisição após uma mudança manual de schema | Tabelas faltando/inconsistentes | Reaplique com `npm run db:migrate` (idempotente). O launcher faz isso automaticamente no boot. |
188
+ | Perdeu a senha do operador após um "reset" | Você rodou `db:reset` / `db:nuke` (apaga `.constella` + `organizations`) | Evite os scripts nuke num install real — eles destroem dados. Prefira scripts cirúrgicos (`db:reset-state`, `db:repair-fs`). Só para demo, `db:reset-demo`. |
189
+ | `db:push` reescreveu coisas inesperadamente | `drizzle-kit push` é o caminho de dev inseguro | Use `db:migrate` (SQL gerado e versionado), não `db:push`, em qualquer coisa que você se importe. |
190
+
191
+ ---
192
+
193
+ ## 8. Mapa de autorreparo — o que se conserta sozinho 🌠
194
+
195
+ ```mermaid
196
+ flowchart LR
197
+ A["modelo de embedding baixado"] --> B["ensureEmbedServer() auto-inicia :8083"]
198
+ B --> C["retrieve() re-indexa uma vez → vetores"]
199
+ D["chromium ausente"] --> E["ensureChromium() instala uma vez por processo"]
200
+ F["build CUDA, sem DLLs de runtime"] --> G["ensureCudaRuntime() busca o cudart"]
201
+ H["filho web/worker morre"] --> I["supervisor reinicia (≤5 / 60s)"]
202
+ J["arquivo editado em caminho INDEXED"] --> K["watcher → /api/sync/file → reindex do RAG"]
203
+ ```
204
+
205
+ Se um sintoma estiver à esquerda, **espere um ciclo** antes de intervir — o sistema provavelmente se recupera sozinho.
206
+
207
+ ---
208
+
209
+ ## 9. Estados possíveis 🛰️
210
+
211
+ | Subsistema | Saudável | Degradado | Fora |
212
+ |---|---|---|---|
213
+ | RAG | `mode: "semantic"` | `mode: "heuristic"` (palavra-chave) | `mode: "none"` (sem chunks) |
214
+ | Test Dev | `PASS` | `INCONCLUSIVE` | `FAIL` (só achados de severidade alta) |
215
+ | Servidor de embeddings | `embedServerUp() → true` | — | motivo: "not installed" / "didn't come up" |
216
+ | Servidor de chat llama | `llamaServerStatus().up` | — | motivo: "no chat GGUF" / "not installed" |
217
+ | Worker | ticks logados a cada ~60 s | tentando de novo (servidor aquecendo) | saiu após 5 crash-loops |
218
+ | Auth da CLI | `detectCliAuth → "ready"` | `"unknown"` | `"needs_login"` / `"needs_key"` |
219
+ | Execução do agente | `ok: true` | parcial (CLI roteada por provedor, custo 0 reportado) | `error` definido (timeout / sem JSON / código de saída) |
220
+
221
+ ---
222
+
223
+ ## 10. Exemplos 🚀
224
+
225
+ **A. O RAG virou silenciosamente só palavra-chave.** Você nota respostas menos precisas. Confira `curl http://127.0.0.1:8083/health` → sem resposta. Abra **Models**, confirme que `nomic-embed-text` está instalado, clique em **Start embeddings** (ou só reinicie — `ensureEmbedServer` roda no boot). A próxima consulta retorna `mode: "semantic"`.
226
+
227
+ **B. O Test Dev fica dizendo INCONCLUSIVE.** A primeira execução reporta "Couldn't install/launch chromium." Rode `npx playwright install chromium` no diretório de instalação, tente de novo. Agora a navegação + captura de console rodam e você obtém `PASS`/`FAIL`.
228
+
229
+ **C. Os agentes não fazem nada durante a noite.** Há logs de tick mas nenhum card de trabalho se move. O plano do goal existe mas **Run 24/7 está desligado** — `tickAll(auto:true)` o pula. Aprove o plano e habilite o Run 24/7.
230
+
231
+ **D. O worker sai na hora num VPS.** Log: `✖ Refusing to send the worker secret to a non-loopback host`. Seu `CONSTELLA_BASE_URL` aponta para um hostname público. Ajuste-o para o loopback dentro do contêiner, ou `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1` sobre `https://` se o remoto for mesmo a intenção.
232
+
233
+ ---
234
+
235
+ ## 11. Integrações relacionadas 🪐
236
+
237
+ - **Models / engine local** — servidores llama.cpp de embedding (:8083) e chat (:8082), fallback Ollama. Veja [MODELS](./MODELS.md).
238
+ - **Test Dev** — boot do dev server do projeto + Playwright. Veja [TEST_DEV](./TEST_DEV.md).
239
+ - **Telegram** — controle remoto + poll. Veja [TELEGRAM](./TELEGRAM.md).
240
+ - **GitHub** — token/auth, commit/push, barreira de secret-scan. Veja [GITHUB](./GITHUB.md).
241
+ - **Public API / MCP** — auth por PAT, limites de taxa. Veja [PUBLIC_API](./PUBLIC_API.md) e [MCP](./MCP.md).
242
+
243
+ ---
244
+
245
+ ## 12. Notas de segurança 🕳️
246
+
247
+ - Vários "erros" são **barreiras de segurança, não bugs**: o 401 nos endpoints de cron/Telegram, a recusa só-loopback do worker, a recusa do modo build em cair para `next dev`, e a barreira de espaço do portable. Não as contorne às cegas.
248
+ - Segredos nunca aparecem nos logs — o launcher imprime `• Secrets ready` e nada mais; o `scrubSecrets` os remove antes da ingestão no KB, do Telegram e dos logs. Se você vir um segredo na saída, trate como incidente.
249
+ - O `<HOME>/.env` é escrito `chmod 600`. Se as permissões abriram, reaperte-as.
250
+ - A guarda de comandos destrutivos (`bin/guard-hook.mjs`, ligada por padrão) e o hook de file-lock são defesa em profundidade em torno do shell dos agentes. Veja [SECURITY](./SECURITY.md).
251
+
252
+ ---
253
+
254
+ ## 13. Quando escalar 🌠
255
+
256
+ Se nenhuma correção acima se aplica, reúna:
257
+
258
+ 1. O **banner de inicialização** (raiz de runtime, modo, bind, porta).
259
+ 2. O **motivo honesto da sonda** da página relevante (Models / Test Dev).
260
+ 3. Se é um problema de **web** ou de **worker** (stdout separados).
261
+ 4. A saída de `npx constella update --check` (versão + última).
262
+
263
+ Depois confira o [FAQ](./FAQ.md) e as entradas de [TROUBLESHOOTING] aqui, e consulte [INSTALLATION](./INSTALLATION.md) / [CONFIGURATION](./CONFIGURATION.md) para especificidades de ambiente.
264
+
265
+ ---
266
+
267
+ ## 14. Referência rápida — botões de env 🛰️
268
+
269
+ | Var | Efeito | Padrão |
270
+ |---|---|---|
271
+ | `CONSTELLA_HOME` / `--path` | Raiz de runtime | `~/.constella` |
272
+ | `PORT` / `--port` | Porta web | `3000` |
273
+ | `--host` | Endereço de bind | `127.0.0.1` (start/auth), `0.0.0.0` (vps/portable) |
274
+ | `CONSTELLA_WORKER_SECRET` | Auth de cron/Telegram | gerado em `<HOME>/.env` |
275
+ | `CONSTELLA_BASE_URL` | Alvo worker → servidor (loopback) | `http://127.0.0.1:<port>` |
276
+ | `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL` | Permite alvo não-loopback do worker | sem valor (off) |
277
+ | `CONSTELLA_EMBED_URL` | Servidor de embeddings | `http://127.0.0.1:8083` |
278
+ | `OLLAMA_URL` | Fallback de embed do Ollama | `http://127.0.0.1:11434` |
279
+ | `LLAMACPP_URL` | Servidor de chat | `http://127.0.0.1:8082` |
280
+ | `CONSTELLA_AGENT_FULL_ACCESS` | Acesso ao shell do agente | `1` em `start`, senão `0` |
281
+ | `CONSTELLA_WEB_RESEARCH` | WebSearch/WebFetch do agente | ligado |
282
+ | `CONSTELLA_WEB_HEAP_MB` | Limite de heap Node do web | padrão do Node |
283
+ | `CONSTELLA_DEV` | Permite fallback `next dev` (fonte) | sem valor |
284
+
285
+ ---
286
+
287
+ ## 15. Links relacionados — docs irmãos 🌌
288
+
289
+ - [INSTALLATION](./INSTALLATION.md) · [CONFIGURATION](./CONFIGURATION.md) · [FAQ](./FAQ.md)
290
+ - [START_MODE](./START_MODE.md) · [AUTH_MODE](./AUTH_MODE.md) · [VPS_MODE](./VPS_MODE.md) · [PORTABLE_MODE](./PORTABLE_MODE.md)
291
+ - [ARCHITECTURE](./ARCHITECTURE.md) · [AI_ARCHITECTURE](./AI_ARCHITECTURE.md) · [AGENTS](./AGENTS.md)
292
+ - [MODELS](./MODELS.md) · [KB_RAG](./KB_RAG.md) · [MEMORY_RAG](./MEMORY_RAG.md)
293
+ - [TEST_DEV](./TEST_DEV.md) · [TELEGRAM](./TELEGRAM.md) · [GITHUB](./GITHUB.md)
294
+ - [UPDATE](./UPDATE.md) · [SECURITY](./SECURITY.md) · [DEPLOY](./DEPLOY.md) · [PREPARE_DEPLOY](./PREPARE_DEPLOY.md)