constella 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (747) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +53 -0
  3. package/.next/build-manifest.json +20 -0
  4. package/.next/diagnostics/build-diagnostics.json +6 -0
  5. package/.next/diagnostics/framework.json +1 -0
  6. package/.next/export-marker.json +6 -0
  7. package/.next/images-manifest.json +68 -0
  8. package/.next/next-minimal-server.js.nft.json +1 -0
  9. package/.next/next-server.js.nft.json +1 -0
  10. package/.next/package.json +1 -0
  11. package/.next/prerender-manifest.json +36 -0
  12. package/.next/react-loadable-manifest.json +14 -0
  13. package/.next/required-server-files.js +343 -0
  14. package/.next/required-server-files.json +343 -0
  15. package/.next/routes-manifest.json +362 -0
  16. package/.next/server/app/(app)/activity/page.js +2 -0
  17. package/.next/server/app/(app)/activity/page.js.nft.json +1 -0
  18. package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -0
  19. package/.next/server/app/(app)/agents/[handle]/page.js +18 -0
  20. package/.next/server/app/(app)/agents/[handle]/page.js.nft.json +1 -0
  21. package/.next/server/app/(app)/agents/[handle]/page_client-reference-manifest.js +1 -0
  22. package/.next/server/app/(app)/code/page.js +2 -0
  23. package/.next/server/app/(app)/code/page.js.nft.json +1 -0
  24. package/.next/server/app/(app)/code/page_client-reference-manifest.js +1 -0
  25. package/.next/server/app/(app)/config/page.js +2 -0
  26. package/.next/server/app/(app)/config/page.js.nft.json +1 -0
  27. package/.next/server/app/(app)/config/page_client-reference-manifest.js +1 -0
  28. package/.next/server/app/(app)/costs/page.js +2 -0
  29. package/.next/server/app/(app)/costs/page.js.nft.json +1 -0
  30. package/.next/server/app/(app)/costs/page_client-reference-manifest.js +1 -0
  31. package/.next/server/app/(app)/cron/page.js +2 -0
  32. package/.next/server/app/(app)/cron/page.js.nft.json +1 -0
  33. package/.next/server/app/(app)/cron/page_client-reference-manifest.js +1 -0
  34. package/.next/server/app/(app)/dashboard/page.js +2 -0
  35. package/.next/server/app/(app)/dashboard/page.js.nft.json +1 -0
  36. package/.next/server/app/(app)/dashboard/page_client-reference-manifest.js +1 -0
  37. package/.next/server/app/(app)/docs/[id]/page.js +2 -0
  38. package/.next/server/app/(app)/docs/[id]/page.js.nft.json +1 -0
  39. package/.next/server/app/(app)/docs/[id]/page_client-reference-manifest.js +1 -0
  40. package/.next/server/app/(app)/docs/page.js +2 -0
  41. package/.next/server/app/(app)/docs/page.js.nft.json +1 -0
  42. package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -0
  43. package/.next/server/app/(app)/github/page.js +2 -0
  44. package/.next/server/app/(app)/github/page.js.nft.json +1 -0
  45. package/.next/server/app/(app)/github/page_client-reference-manifest.js +1 -0
  46. package/.next/server/app/(app)/goals/page.js +2 -0
  47. package/.next/server/app/(app)/goals/page.js.nft.json +1 -0
  48. package/.next/server/app/(app)/goals/page_client-reference-manifest.js +1 -0
  49. package/.next/server/app/(app)/inbox/page.js +2 -0
  50. package/.next/server/app/(app)/inbox/page.js.nft.json +1 -0
  51. package/.next/server/app/(app)/inbox/page_client-reference-manifest.js +1 -0
  52. package/.next/server/app/(app)/knowledge/page.js +3 -0
  53. package/.next/server/app/(app)/knowledge/page.js.nft.json +1 -0
  54. package/.next/server/app/(app)/knowledge/page_client-reference-manifest.js +1 -0
  55. package/.next/server/app/(app)/models/page.js +2 -0
  56. package/.next/server/app/(app)/models/page.js.nft.json +1 -0
  57. package/.next/server/app/(app)/models/page_client-reference-manifest.js +1 -0
  58. package/.next/server/app/(app)/notifications/page.js +2 -0
  59. package/.next/server/app/(app)/notifications/page.js.nft.json +1 -0
  60. package/.next/server/app/(app)/notifications/page_client-reference-manifest.js +1 -0
  61. package/.next/server/app/(app)/org/page.js +2 -0
  62. package/.next/server/app/(app)/org/page.js.nft.json +1 -0
  63. package/.next/server/app/(app)/org/page_client-reference-manifest.js +1 -0
  64. package/.next/server/app/(app)/organizations/page.js +2 -0
  65. package/.next/server/app/(app)/organizations/page.js.nft.json +1 -0
  66. package/.next/server/app/(app)/organizations/page_client-reference-manifest.js +1 -0
  67. package/.next/server/app/(app)/page.js +3 -0
  68. package/.next/server/app/(app)/page.js.nft.json +1 -0
  69. package/.next/server/app/(app)/page_client-reference-manifest.js +1 -0
  70. package/.next/server/app/(app)/planner/page.js +2 -0
  71. package/.next/server/app/(app)/planner/page.js.nft.json +1 -0
  72. package/.next/server/app/(app)/planner/page_client-reference-manifest.js +1 -0
  73. package/.next/server/app/(app)/plugins/page.js +2 -0
  74. package/.next/server/app/(app)/plugins/page.js.nft.json +1 -0
  75. package/.next/server/app/(app)/plugins/page_client-reference-manifest.js +1 -0
  76. package/.next/server/app/(app)/pm/page.js +2 -0
  77. package/.next/server/app/(app)/pm/page.js.nft.json +1 -0
  78. package/.next/server/app/(app)/pm/page_client-reference-manifest.js +1 -0
  79. package/.next/server/app/(app)/prepare-deploy/page.js +19 -0
  80. package/.next/server/app/(app)/prepare-deploy/page.js.nft.json +1 -0
  81. package/.next/server/app/(app)/prepare-deploy/page_client-reference-manifest.js +1 -0
  82. package/.next/server/app/(app)/profile/page.js +2 -0
  83. package/.next/server/app/(app)/profile/page.js.nft.json +1 -0
  84. package/.next/server/app/(app)/profile/page_client-reference-manifest.js +1 -0
  85. package/.next/server/app/(app)/pulse/page.js +2 -0
  86. package/.next/server/app/(app)/pulse/page.js.nft.json +1 -0
  87. package/.next/server/app/(app)/pulse/page_client-reference-manifest.js +1 -0
  88. package/.next/server/app/(app)/reports/[id]/page.js +3 -0
  89. package/.next/server/app/(app)/reports/[id]/page.js.nft.json +1 -0
  90. package/.next/server/app/(app)/reports/[id]/page_client-reference-manifest.js +1 -0
  91. package/.next/server/app/(app)/reports/page.js +5 -0
  92. package/.next/server/app/(app)/reports/page.js.nft.json +1 -0
  93. package/.next/server/app/(app)/reports/page_client-reference-manifest.js +1 -0
  94. package/.next/server/app/(app)/routines/page.js +2 -0
  95. package/.next/server/app/(app)/routines/page.js.nft.json +1 -0
  96. package/.next/server/app/(app)/routines/page_client-reference-manifest.js +1 -0
  97. package/.next/server/app/(app)/search/page.js +2 -0
  98. package/.next/server/app/(app)/search/page.js.nft.json +1 -0
  99. package/.next/server/app/(app)/search/page_client-reference-manifest.js +1 -0
  100. package/.next/server/app/(app)/security/page.js +2 -0
  101. package/.next/server/app/(app)/security/page.js.nft.json +1 -0
  102. package/.next/server/app/(app)/security/page_client-reference-manifest.js +1 -0
  103. package/.next/server/app/(app)/skills/page.js +18 -0
  104. package/.next/server/app/(app)/skills/page.js.nft.json +1 -0
  105. package/.next/server/app/(app)/skills/page_client-reference-manifest.js +1 -0
  106. package/.next/server/app/(app)/tasks/page.js +2 -0
  107. package/.next/server/app/(app)/tasks/page.js.nft.json +1 -0
  108. package/.next/server/app/(app)/tasks/page_client-reference-manifest.js +1 -0
  109. package/.next/server/app/(app)/test-dev/page.js +2 -0
  110. package/.next/server/app/(app)/test-dev/page.js.nft.json +1 -0
  111. package/.next/server/app/(app)/test-dev/page_client-reference-manifest.js +1 -0
  112. package/.next/server/app/(app)/update/page.js +2 -0
  113. package/.next/server/app/(app)/update/page.js.nft.json +1 -0
  114. package/.next/server/app/(app)/update/page_client-reference-manifest.js +1 -0
  115. package/.next/server/app/(auth)/login/page.js +2 -0
  116. package/.next/server/app/(auth)/login/page.js.nft.json +1 -0
  117. package/.next/server/app/(auth)/login/page_client-reference-manifest.js +1 -0
  118. package/.next/server/app/(auth)/onboarding/page.js +18 -0
  119. package/.next/server/app/(auth)/onboarding/page.js.nft.json +1 -0
  120. package/.next/server/app/(auth)/onboarding/page_client-reference-manifest.js +1 -0
  121. package/.next/server/app/_global-error/page.js +32 -0
  122. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  123. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
  124. package/.next/server/app/_global-error.html +1 -0
  125. package/.next/server/app/_global-error.meta +16 -0
  126. package/.next/server/app/_global-error.rsc +15 -0
  127. package/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
  128. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +5 -0
  129. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +5 -0
  130. package/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
  131. package/.next/server/app/_global-error.segments/_index.segment.rsc +6 -0
  132. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  133. package/.next/server/app/_not-found/page.js +2 -0
  134. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  135. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  136. package/.next/server/app/api/auth/[...all]/route.js +1 -0
  137. package/.next/server/app/api/auth/[...all]/route.js.nft.json +1 -0
  138. package/.next/server/app/api/auth/[...all]/route_client-reference-manifest.js +1 -0
  139. package/.next/server/app/api/cron/tick/route.js +52 -0
  140. package/.next/server/app/api/cron/tick/route.js.nft.json +1 -0
  141. package/.next/server/app/api/cron/tick/route_client-reference-manifest.js +1 -0
  142. package/.next/server/app/api/dev-login/route.js +1 -0
  143. package/.next/server/app/api/dev-login/route.js.nft.json +1 -0
  144. package/.next/server/app/api/dev-login/route_client-reference-manifest.js +1 -0
  145. package/.next/server/app/api/locks/acquire/route.js +1 -0
  146. package/.next/server/app/api/locks/acquire/route.js.nft.json +1 -0
  147. package/.next/server/app/api/locks/acquire/route_client-reference-manifest.js +1 -0
  148. package/.next/server/app/api/models/progress/route.js +1 -0
  149. package/.next/server/app/api/models/progress/route.js.nft.json +1 -0
  150. package/.next/server/app/api/models/progress/route_client-reference-manifest.js +1 -0
  151. package/.next/server/app/api/passkey/authenticate/options/route.js +1 -0
  152. package/.next/server/app/api/passkey/authenticate/options/route.js.nft.json +1 -0
  153. package/.next/server/app/api/passkey/authenticate/options/route_client-reference-manifest.js +1 -0
  154. package/.next/server/app/api/passkey/authenticate/verify/route.js +1 -0
  155. package/.next/server/app/api/passkey/authenticate/verify/route.js.nft.json +1 -0
  156. package/.next/server/app/api/passkey/authenticate/verify/route_client-reference-manifest.js +1 -0
  157. package/.next/server/app/api/passkey/register/options/route.js +1 -0
  158. package/.next/server/app/api/passkey/register/options/route.js.nft.json +1 -0
  159. package/.next/server/app/api/passkey/register/options/route_client-reference-manifest.js +1 -0
  160. package/.next/server/app/api/passkey/register/verify/route.js +1 -0
  161. package/.next/server/app/api/passkey/register/verify/route.js.nft.json +1 -0
  162. package/.next/server/app/api/passkey/register/verify/route_client-reference-manifest.js +1 -0
  163. package/.next/server/app/api/stream/route.js +4 -0
  164. package/.next/server/app/api/stream/route.js.nft.json +1 -0
  165. package/.next/server/app/api/stream/route_client-reference-manifest.js +1 -0
  166. package/.next/server/app/api/sync/file/route.js +2 -0
  167. package/.next/server/app/api/sync/file/route.js.nft.json +1 -0
  168. package/.next/server/app/api/sync/file/route_client-reference-manifest.js +1 -0
  169. package/.next/server/app/api/telegram/poll/route.js +15 -0
  170. package/.next/server/app/api/telegram/poll/route.js.nft.json +1 -0
  171. package/.next/server/app/api/telegram/poll/route_client-reference-manifest.js +1 -0
  172. package/.next/server/app/api/upload/route.js +1 -0
  173. package/.next/server/app/api/upload/route.js.nft.json +1 -0
  174. package/.next/server/app/api/upload/route_client-reference-manifest.js +1 -0
  175. package/.next/server/app/api/v1/[[...path]]/route.js +1 -0
  176. package/.next/server/app/api/v1/[[...path]]/route.js.nft.json +1 -0
  177. package/.next/server/app/api/v1/[[...path]]/route_client-reference-manifest.js +1 -0
  178. package/.next/server/app-paths-manifest.json +53 -0
  179. package/.next/server/chunks/1003.js +1 -0
  180. package/.next/server/chunks/127.js +26 -0
  181. package/.next/server/chunks/1388.js +1 -0
  182. package/.next/server/chunks/1408.js +21 -0
  183. package/.next/server/chunks/1572.js +1 -0
  184. package/.next/server/chunks/1591.js +24 -0
  185. package/.next/server/chunks/1619.js +188 -0
  186. package/.next/server/chunks/162.js +1 -0
  187. package/.next/server/chunks/1881.js +1 -0
  188. package/.next/server/chunks/1968.js +1 -0
  189. package/.next/server/chunks/2297.js +348 -0
  190. package/.next/server/chunks/2341.js +1 -0
  191. package/.next/server/chunks/2517.js +1 -0
  192. package/.next/server/chunks/2549.js +1 -0
  193. package/.next/server/chunks/259.js +14 -0
  194. package/.next/server/chunks/2599.js +1 -0
  195. package/.next/server/chunks/260.js +1 -0
  196. package/.next/server/chunks/2867.js +147 -0
  197. package/.next/server/chunks/3018.js +1 -0
  198. package/.next/server/chunks/3050.js +18 -0
  199. package/.next/server/chunks/3085.js +12 -0
  200. package/.next/server/chunks/3131.js +1 -0
  201. package/.next/server/chunks/3242.js +1 -0
  202. package/.next/server/chunks/3266.js +15 -0
  203. package/.next/server/chunks/3524.js +1 -0
  204. package/.next/server/chunks/3527.js +479 -0
  205. package/.next/server/chunks/3533.js +869 -0
  206. package/.next/server/chunks/3550.js +1 -0
  207. package/.next/server/chunks/3609.js +2 -0
  208. package/.next/server/chunks/3667.js +462 -0
  209. package/.next/server/chunks/3760.js +4 -0
  210. package/.next/server/chunks/4679.js +1 -0
  211. package/.next/server/chunks/4804.js +1 -0
  212. package/.next/server/chunks/4832.js +2 -0
  213. package/.next/server/chunks/4853.js +1 -0
  214. package/.next/server/chunks/4979.js +67 -0
  215. package/.next/server/chunks/5060.js +1 -0
  216. package/.next/server/chunks/5278.js +1 -0
  217. package/.next/server/chunks/5614.js +1 -0
  218. package/.next/server/chunks/5818.js +1 -0
  219. package/.next/server/chunks/6479.js +1 -0
  220. package/.next/server/chunks/6658.js +1 -0
  221. package/.next/server/chunks/6706.js +1 -0
  222. package/.next/server/chunks/6719.js +1 -0
  223. package/.next/server/chunks/678.js +1 -0
  224. package/.next/server/chunks/683.js +1 -0
  225. package/.next/server/chunks/6862.js +1 -0
  226. package/.next/server/chunks/6882.js +1 -0
  227. package/.next/server/chunks/7037.js +1 -0
  228. package/.next/server/chunks/7107.js +741 -0
  229. package/.next/server/chunks/73.js +17 -0
  230. package/.next/server/chunks/7327.js +1 -0
  231. package/.next/server/chunks/7514.js +1 -0
  232. package/.next/server/chunks/7622.js +1 -0
  233. package/.next/server/chunks/7778.js +1 -0
  234. package/.next/server/chunks/7912.js +1 -0
  235. package/.next/server/chunks/7949.js +1 -0
  236. package/.next/server/chunks/7971.js +1 -0
  237. package/.next/server/chunks/7989.js +1 -0
  238. package/.next/server/chunks/842.js +22 -0
  239. package/.next/server/chunks/8762.js +15 -0
  240. package/.next/server/chunks/8823.js +77 -0
  241. package/.next/server/chunks/9146.js +4 -0
  242. package/.next/server/chunks/9676.js +1 -0
  243. package/.next/server/chunks/9783.js +22 -0
  244. package/.next/server/chunks/9969.js +3 -0
  245. package/.next/server/functions-config-manifest.json +18 -0
  246. package/.next/server/instrumentation.js +1 -0
  247. package/.next/server/instrumentation.js.nft.json +1 -0
  248. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  249. package/.next/server/middleware-build-manifest.js +1 -0
  250. package/.next/server/middleware-manifest.json +6 -0
  251. package/.next/server/middleware-react-loadable-manifest.js +1 -0
  252. package/.next/server/middleware.js +18 -0
  253. package/.next/server/middleware.js.nft.json +1 -0
  254. package/.next/server/next-font-manifest.js +1 -0
  255. package/.next/server/next-font-manifest.json +1 -0
  256. package/.next/server/pages/500.html +1 -0
  257. package/.next/server/pages-manifest.json +3 -0
  258. package/.next/server/prefetch-hints.json +1 -0
  259. package/.next/server/server-reference-manifest.js +1 -0
  260. package/.next/server/server-reference-manifest.json +1 -0
  261. package/.next/server/webpack-runtime.js +1 -0
  262. package/.next/static/chunks/1858-339516f78a4b00da.js +1 -0
  263. package/.next/static/chunks/2320-fc8b39380e69d465.js +2 -0
  264. package/.next/static/chunks/23550918-ff694f70f4b0648c.js +1 -0
  265. package/.next/static/chunks/3219-ebb3c23be38c838d.js +1 -0
  266. package/.next/static/chunks/4263-adecb5b466380b6e.js +1 -0
  267. package/.next/static/chunks/5479-0cceab68cd0ca9c7.js +1 -0
  268. package/.next/static/chunks/5701-665b927b06158b76.js +1 -0
  269. package/.next/static/chunks/5920.6451a68b63918988.js +1 -0
  270. package/.next/static/chunks/6575-5c9139720bb0f5bf.js +4 -0
  271. package/.next/static/chunks/6834-4759af1ce7d95fb6.js +32 -0
  272. package/.next/static/chunks/7509.721cd47a931c5518.js +1 -0
  273. package/.next/static/chunks/8264-1ca011989ee2b231.js +1 -0
  274. package/.next/static/chunks/9219-4a39a98b5502d9d1.js +1 -0
  275. package/.next/static/chunks/9690-53d5222618cbeddb.js +1 -0
  276. package/.next/static/chunks/app/(app)/activity/page-3973534281ecea81.js +1 -0
  277. package/.next/static/chunks/app/(app)/agents/[handle]/page-83662a175c098282.js +1 -0
  278. package/.next/static/chunks/app/(app)/code/page-33979545192cd137.js +1 -0
  279. package/.next/static/chunks/app/(app)/config/page-9933aed1ca8a85c1.js +1 -0
  280. package/.next/static/chunks/app/(app)/costs/page-131c4dc580efcc19.js +1 -0
  281. package/.next/static/chunks/app/(app)/cron/page-53ea1aff998a87ca.js +1 -0
  282. package/.next/static/chunks/app/(app)/dashboard/page-deed83aaa9d0d447.js +1 -0
  283. package/.next/static/chunks/app/(app)/docs/[id]/page-38c993d73c0eab4f.js +1 -0
  284. package/.next/static/chunks/app/(app)/docs/page-bf463b55d0554e86.js +1 -0
  285. package/.next/static/chunks/app/(app)/error-988cd28480809861.js +1 -0
  286. package/.next/static/chunks/app/(app)/github/page-62678b4e82dfecb6.js +1 -0
  287. package/.next/static/chunks/app/(app)/goals/page-4adb426fe1c96106.js +1 -0
  288. package/.next/static/chunks/app/(app)/inbox/page-e347dc55ab467310.js +1 -0
  289. package/.next/static/chunks/app/(app)/knowledge/page-65393a045b4349be.js +1 -0
  290. package/.next/static/chunks/app/(app)/layout-7f65675705b011d8.js +1 -0
  291. package/.next/static/chunks/app/(app)/models/page-e01f1dd7e49a2951.js +1 -0
  292. package/.next/static/chunks/app/(app)/notifications/page-56548ac87aef00da.js +1 -0
  293. package/.next/static/chunks/app/(app)/org/page-699e6a6dc0db7d81.js +1 -0
  294. package/.next/static/chunks/app/(app)/organizations/page-36051a380a7e8eb7.js +1 -0
  295. package/.next/static/chunks/app/(app)/page-7d1011a566f81520.js +1 -0
  296. package/.next/static/chunks/app/(app)/planner/page-dab7ced94083373a.js +1 -0
  297. package/.next/static/chunks/app/(app)/plugins/page-5b5a1f53389be42e.js +1 -0
  298. package/.next/static/chunks/app/(app)/pm/page-0de5c08c0b227bb0.js +1 -0
  299. package/.next/static/chunks/app/(app)/prepare-deploy/page-e426038552df8d41.js +1 -0
  300. package/.next/static/chunks/app/(app)/profile/page-608dfcaf8aae0a69.js +1 -0
  301. package/.next/static/chunks/app/(app)/pulse/page-309ccaca91de1faa.js +1 -0
  302. package/.next/static/chunks/app/(app)/reports/[id]/page-53ea1aff998a87ca.js +1 -0
  303. package/.next/static/chunks/app/(app)/reports/page-68cdc6dcfa472d86.js +1 -0
  304. package/.next/static/chunks/app/(app)/routines/page-bcc55550b197a9fa.js +1 -0
  305. package/.next/static/chunks/app/(app)/search/page-5c5f67558d0dbf0d.js +1 -0
  306. package/.next/static/chunks/app/(app)/security/page-a7d41e36aa366b45.js +1 -0
  307. package/.next/static/chunks/app/(app)/skills/page-c5b21e89593b8336.js +1 -0
  308. package/.next/static/chunks/app/(app)/tasks/page-08ae079e3e54d2ce.js +1 -0
  309. package/.next/static/chunks/app/(app)/test-dev/page-633f82dfd9c3ce23.js +1 -0
  310. package/.next/static/chunks/app/(app)/update/page-4be019054351bfac.js +1 -0
  311. package/.next/static/chunks/app/(auth)/login/page-6e85d3377062acae.js +1 -0
  312. package/.next/static/chunks/app/(auth)/onboarding/page-ebb10c175abf3b85.js +1 -0
  313. package/.next/static/chunks/app/_global-error/page-23fe50a6bf589c97.js +1 -0
  314. package/.next/static/chunks/app/_not-found/page-dc38b02aebeab535.js +1 -0
  315. package/.next/static/chunks/app/api/auth/[...all]/route-23fe50a6bf589c97.js +1 -0
  316. package/.next/static/chunks/app/api/cron/tick/route-23fe50a6bf589c97.js +1 -0
  317. package/.next/static/chunks/app/api/dev-login/route-23fe50a6bf589c97.js +1 -0
  318. package/.next/static/chunks/app/api/locks/acquire/route-23fe50a6bf589c97.js +1 -0
  319. package/.next/static/chunks/app/api/models/progress/route-23fe50a6bf589c97.js +1 -0
  320. package/.next/static/chunks/app/api/passkey/authenticate/options/route-23fe50a6bf589c97.js +1 -0
  321. package/.next/static/chunks/app/api/passkey/authenticate/verify/route-23fe50a6bf589c97.js +1 -0
  322. package/.next/static/chunks/app/api/passkey/register/options/route-23fe50a6bf589c97.js +1 -0
  323. package/.next/static/chunks/app/api/passkey/register/verify/route-23fe50a6bf589c97.js +1 -0
  324. package/.next/static/chunks/app/api/stream/route-23fe50a6bf589c97.js +1 -0
  325. package/.next/static/chunks/app/api/sync/file/route-23fe50a6bf589c97.js +1 -0
  326. package/.next/static/chunks/app/api/telegram/poll/route-23fe50a6bf589c97.js +1 -0
  327. package/.next/static/chunks/app/api/upload/route-23fe50a6bf589c97.js +1 -0
  328. package/.next/static/chunks/app/api/v1/[[...path]]/route-23fe50a6bf589c97.js +1 -0
  329. package/.next/static/chunks/app/error-09899a13c38b6e89.js +1 -0
  330. package/.next/static/chunks/app/global-error-b8050d4d886f448c.js +1 -0
  331. package/.next/static/chunks/app/layout-ab9deed1e7e2e9df.js +1 -0
  332. package/.next/static/chunks/framework-4b2c6b6043dd203f.js +1 -0
  333. package/.next/static/chunks/main-722e16032e7764d1.js +5 -0
  334. package/.next/static/chunks/main-app-761880af2b6f1962.js +1 -0
  335. package/.next/static/chunks/next/dist/client/components/builtin/app-error-23fe50a6bf589c97.js +1 -0
  336. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-23fe50a6bf589c97.js +1 -0
  337. package/.next/static/chunks/next/dist/client/components/builtin/not-found-23fe50a6bf589c97.js +1 -0
  338. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-23fe50a6bf589c97.js +1 -0
  339. package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  340. package/.next/static/chunks/webpack-222e3894b78c67db.js +1 -0
  341. package/.next/static/css/0a9b5805594444e3.css +1 -0
  342. package/.next/static/yztMvBwyrWWkSqP6jfXoa/_buildManifest.js +1 -0
  343. package/.next/static/yztMvBwyrWWkSqP6jfXoa/_ssgManifest.js +1 -0
  344. package/.next/trace-build +1 -0
  345. package/.next/types/app/(app)/activity/page.ts +87 -0
  346. package/.next/types/app/(app)/agents/[handle]/page.ts +87 -0
  347. package/.next/types/app/(app)/code/page.ts +87 -0
  348. package/.next/types/app/(app)/config/page.ts +87 -0
  349. package/.next/types/app/(app)/costs/page.ts +87 -0
  350. package/.next/types/app/(app)/cron/page.ts +87 -0
  351. package/.next/types/app/(app)/dashboard/page.ts +87 -0
  352. package/.next/types/app/(app)/docs/[id]/page.ts +87 -0
  353. package/.next/types/app/(app)/docs/page.ts +87 -0
  354. package/.next/types/app/(app)/github/page.ts +87 -0
  355. package/.next/types/app/(app)/goals/page.ts +87 -0
  356. package/.next/types/app/(app)/inbox/page.ts +87 -0
  357. package/.next/types/app/(app)/knowledge/page.ts +87 -0
  358. package/.next/types/app/(app)/models/page.ts +87 -0
  359. package/.next/types/app/(app)/notifications/page.ts +87 -0
  360. package/.next/types/app/(app)/org/page.ts +87 -0
  361. package/.next/types/app/(app)/organizations/page.ts +87 -0
  362. package/.next/types/app/(app)/page.ts +87 -0
  363. package/.next/types/app/(app)/planner/page.ts +87 -0
  364. package/.next/types/app/(app)/plugins/page.ts +87 -0
  365. package/.next/types/app/(app)/pm/page.ts +87 -0
  366. package/.next/types/app/(app)/prepare-deploy/page.ts +87 -0
  367. package/.next/types/app/(app)/profile/page.ts +87 -0
  368. package/.next/types/app/(app)/pulse/page.ts +87 -0
  369. package/.next/types/app/(app)/reports/[id]/page.ts +87 -0
  370. package/.next/types/app/(app)/reports/page.ts +87 -0
  371. package/.next/types/app/(app)/routines/page.ts +87 -0
  372. package/.next/types/app/(app)/search/page.ts +87 -0
  373. package/.next/types/app/(app)/security/page.ts +87 -0
  374. package/.next/types/app/(app)/skills/page.ts +87 -0
  375. package/.next/types/app/(app)/tasks/page.ts +87 -0
  376. package/.next/types/app/(app)/test-dev/page.ts +87 -0
  377. package/.next/types/app/(app)/update/page.ts +87 -0
  378. package/.next/types/app/(auth)/login/page.ts +87 -0
  379. package/.next/types/app/(auth)/onboarding/page.ts +87 -0
  380. package/.next/types/app/api/auth/[...all]/route.ts +351 -0
  381. package/.next/types/app/api/cron/tick/route.ts +351 -0
  382. package/.next/types/app/api/dev-login/route.ts +351 -0
  383. package/.next/types/app/api/locks/acquire/route.ts +351 -0
  384. package/.next/types/app/api/models/progress/route.ts +351 -0
  385. package/.next/types/app/api/passkey/authenticate/options/route.ts +351 -0
  386. package/.next/types/app/api/passkey/authenticate/verify/route.ts +351 -0
  387. package/.next/types/app/api/passkey/register/options/route.ts +351 -0
  388. package/.next/types/app/api/passkey/register/verify/route.ts +351 -0
  389. package/.next/types/app/api/stream/route.ts +351 -0
  390. package/.next/types/app/api/sync/file/route.ts +351 -0
  391. package/.next/types/app/api/telegram/poll/route.ts +351 -0
  392. package/.next/types/app/api/upload/route.ts +351 -0
  393. package/.next/types/app/api/v1/[[...path]]/route.ts +351 -0
  394. package/.next/types/cache-life.d.ts +145 -0
  395. package/.next/types/link.d.ts +210 -0
  396. package/.next/types/package.json +1 -0
  397. package/.next/types/routes.d.ts +120 -0
  398. package/.next/types/validator.ts +511 -0
  399. package/CHANGELOG.md +312 -0
  400. package/LICENSE +21 -0
  401. package/README.md +382 -0
  402. package/README.pt-BR.md +391 -0
  403. package/bin/constella.mjs +329 -0
  404. package/bin/guard-hook.mjs +44 -0
  405. package/bin/lock-hook.mjs +49 -0
  406. package/bin/worker.mjs +142 -0
  407. package/docs/assets/arch-orbit.svg +56 -0
  408. package/docs/assets/blackhole.svg +37 -0
  409. package/docs/assets/divider-orbit.svg +23 -0
  410. package/docs/assets/hero-constella.svg +72 -0
  411. package/docs/en/AGENTS.md +279 -0
  412. package/docs/en/AI_ARCHITECTURE.md +373 -0
  413. package/docs/en/ARCHITECTURE.md +334 -0
  414. package/docs/en/AUTH_MODE.md +247 -0
  415. package/docs/en/CHAT_COMMANDS.md +305 -0
  416. package/docs/en/CONFIGURATION.md +340 -0
  417. package/docs/en/DEPLOY.md +331 -0
  418. package/docs/en/DM.md +297 -0
  419. package/docs/en/FAQ.md +258 -0
  420. package/docs/en/GITHUB.md +341 -0
  421. package/docs/en/GOALS_SPECS_ISSUES.md +303 -0
  422. package/docs/en/INBOX.md +340 -0
  423. package/docs/en/INSTALLATION.md +329 -0
  424. package/docs/en/KB_AGENT.md +305 -0
  425. package/docs/en/KB_RAG.md +356 -0
  426. package/docs/en/MCP.md +313 -0
  427. package/docs/en/MEMORY_RAG.md +289 -0
  428. package/docs/en/MODELS.md +341 -0
  429. package/docs/en/ONBOARDING.md +327 -0
  430. package/docs/en/PLUGINS.md +290 -0
  431. package/docs/en/PORTABLE_MODE.md +387 -0
  432. package/docs/en/PO_AGENT.md +379 -0
  433. package/docs/en/PREPARE_DEPLOY.md +308 -0
  434. package/docs/en/PROJECT_STACKS.md +258 -0
  435. package/docs/en/PUBLIC_API.md +315 -0
  436. package/docs/en/PUBLISHING.md +343 -0
  437. package/docs/en/README.md +95 -0
  438. package/docs/en/SECURITY.md +280 -0
  439. package/docs/en/SKILLS.md +349 -0
  440. package/docs/en/START_MODE.md +340 -0
  441. package/docs/en/SYNCED_BLOCKS.md +320 -0
  442. package/docs/en/TEAM_ROOM.md +285 -0
  443. package/docs/en/TELEGRAM.md +294 -0
  444. package/docs/en/TEST_DEV.md +321 -0
  445. package/docs/en/TROUBLESHOOTING.md +294 -0
  446. package/docs/en/UPDATE.md +301 -0
  447. package/docs/en/VPS_MODE.md +334 -0
  448. package/docs/en/WORKFLOW.md +321 -0
  449. package/docs/pt/AGENTS.md +279 -0
  450. package/docs/pt/AI_ARCHITECTURE.md +373 -0
  451. package/docs/pt/ARCHITECTURE.md +334 -0
  452. package/docs/pt/AUTH_MODE.md +247 -0
  453. package/docs/pt/CHAT_COMMANDS.md +307 -0
  454. package/docs/pt/CONFIGURATION.md +340 -0
  455. package/docs/pt/DEPLOY.md +331 -0
  456. package/docs/pt/DM.md +297 -0
  457. package/docs/pt/FAQ.md +258 -0
  458. package/docs/pt/GITHUB.md +341 -0
  459. package/docs/pt/GOALS_SPECS_ISSUES.md +303 -0
  460. package/docs/pt/INBOX.md +340 -0
  461. package/docs/pt/INSTALLATION.md +329 -0
  462. package/docs/pt/KB_AGENT.md +305 -0
  463. package/docs/pt/KB_RAG.md +356 -0
  464. package/docs/pt/MCP.md +313 -0
  465. package/docs/pt/MEMORY_RAG.md +289 -0
  466. package/docs/pt/MODELS.md +341 -0
  467. package/docs/pt/ONBOARDING.md +327 -0
  468. package/docs/pt/PLUGINS.md +290 -0
  469. package/docs/pt/PORTABLE_MODE.md +387 -0
  470. package/docs/pt/PO_AGENT.md +379 -0
  471. package/docs/pt/PREPARE_DEPLOY.md +308 -0
  472. package/docs/pt/PROJECT_STACKS.md +258 -0
  473. package/docs/pt/PUBLIC_API.md +315 -0
  474. package/docs/pt/PUBLISHING.md +343 -0
  475. package/docs/pt/README.md +95 -0
  476. package/docs/pt/SECURITY.md +280 -0
  477. package/docs/pt/SKILLS.md +349 -0
  478. package/docs/pt/START_MODE.md +340 -0
  479. package/docs/pt/SYNCED_BLOCKS.md +320 -0
  480. package/docs/pt/TEAM_ROOM.md +285 -0
  481. package/docs/pt/TELEGRAM.md +294 -0
  482. package/docs/pt/TEST_DEV.md +321 -0
  483. package/docs/pt/TROUBLESHOOTING.md +294 -0
  484. package/docs/pt/UPDATE.md +301 -0
  485. package/docs/pt/VPS_MODE.md +334 -0
  486. package/docs/pt/WORKFLOW.md +321 -0
  487. package/drizzle/0000_regular_nightshade.sql +644 -0
  488. package/drizzle/0001_mixed_zombie.sql +106 -0
  489. package/drizzle/meta/0000_snapshot.json +4650 -0
  490. package/drizzle/meta/0001_snapshot.json +5418 -0
  491. package/drizzle/meta/_journal.json +20 -0
  492. package/drizzle.config.mjs +16 -0
  493. package/next.config.mjs +18 -0
  494. package/package.json +130 -0
  495. package/scripts/clean-repo.mjs +20 -0
  496. package/scripts/dev-all.mjs +46 -0
  497. package/scripts/i18n-parity.mjs +57 -0
  498. package/scripts/mcp-server.mjs +100 -0
  499. package/scripts/postbuild.mjs +11 -0
  500. package/scripts/publish-public.mjs +116 -0
  501. package/scripts/start-all.mjs +45 -0
  502. package/scripts/trim-next.mjs +23 -0
  503. package/scripts/vps-install.sh +39 -0
  504. package/skills/CONTRIBUTING.md +122 -0
  505. package/skills/COVERAGE.md +129 -0
  506. package/skills/INDEX.json +3443 -0
  507. package/skills/README.md +57 -0
  508. package/skills/design/animation-motion/SKILL.md +60 -0
  509. package/skills/design/color-and-typography/SKILL.md +60 -0
  510. package/skills/design/css-techniques/SKILL.md +58 -0
  511. package/skills/design/design-systems/SKILL.md +60 -0
  512. package/skills/design/gradients/SKILL.md +59 -0
  513. package/skills/design/graphic-design-basics/SKILL.md +55 -0
  514. package/skills/design/microinteractions/SKILL.md +58 -0
  515. package/skills/design/responsive-layout/SKILL.md +59 -0
  516. package/skills/design/ui-ux-principles/SKILL.md +58 -0
  517. package/skills/engineering/architecture/api-design-rest-graphql/SKILL.md +67 -0
  518. package/skills/engineering/architecture/caching-strategies/SKILL.md +59 -0
  519. package/skills/engineering/architecture/data-modeling/SKILL.md +64 -0
  520. package/skills/engineering/architecture/message-queues-async/SKILL.md +58 -0
  521. package/skills/engineering/architecture/scalability-reliability/SKILL.md +62 -0
  522. package/skills/engineering/architecture/software-architecture-patterns/SKILL.md +56 -0
  523. package/skills/engineering/architecture/system-design-fundamentals/SKILL.md +56 -0
  524. package/skills/engineering/backend/auth-and-authorization/SKILL.md +62 -0
  525. package/skills/engineering/backend/backend-fundamentals/SKILL.md +65 -0
  526. package/skills/engineering/backend/observability-logging/SKILL.md +60 -0
  527. package/skills/engineering/frontend/accessibility-wcag/SKILL.md +57 -0
  528. package/skills/engineering/frontend/frontend-architecture/SKILL.md +65 -0
  529. package/skills/engineering/frontend/rendering-strategies-ssr-csr/SKILL.md +60 -0
  530. package/skills/engineering/frontend/state-management/SKILL.md +69 -0
  531. package/skills/engineering/performance/backend-performance/SKILL.md +69 -0
  532. package/skills/engineering/performance/database-query-optimization/SKILL.md +64 -0
  533. package/skills/engineering/performance/profiling-and-benchmarking/SKILL.md +60 -0
  534. package/skills/engineering/performance/web-performance-core-vitals/SKILL.md +72 -0
  535. package/skills/engineering/practices/clean-code/SKILL.md +61 -0
  536. package/skills/engineering/practices/code-optimization/SKILL.md +60 -0
  537. package/skills/engineering/practices/code-review-practices/SKILL.md +58 -0
  538. package/skills/engineering/practices/git-workflow/SKILL.md +62 -0
  539. package/skills/engineering/practices/refactoring/SKILL.md +58 -0
  540. package/skills/engineering/security/appsec-fundamentals/SKILL.md +70 -0
  541. package/skills/engineering/security/dependency-supply-chain/SKILL.md +77 -0
  542. package/skills/engineering/security/owasp-asvs/SKILL.md +54 -0
  543. package/skills/engineering/security/owasp-top-10/SKILL.md +63 -0
  544. package/skills/engineering/security/secrets-management/SKILL.md +58 -0
  545. package/skills/engineering/security/secure-auth-sessions/SKILL.md +56 -0
  546. package/skills/engineering/testing/tdd-and-coverage/SKILL.md +62 -0
  547. package/skills/engineering/testing/testing-strategy-pyramid/SKILL.md +56 -0
  548. package/skills/engineering/testing/unit-integration-e2e/SKILL.md +75 -0
  549. package/skills/languages/c/SKILL.md +74 -0
  550. package/skills/languages/clojure/SKILL.md +73 -0
  551. package/skills/languages/cpp/SKILL.md +75 -0
  552. package/skills/languages/csharp/SKILL.md +75 -0
  553. package/skills/languages/dart/SKILL.md +82 -0
  554. package/skills/languages/elixir/SKILL.md +74 -0
  555. package/skills/languages/erlang/SKILL.md +76 -0
  556. package/skills/languages/go/SKILL.md +83 -0
  557. package/skills/languages/haskell/SKILL.md +70 -0
  558. package/skills/languages/java/SKILL.md +71 -0
  559. package/skills/languages/javascript/SKILL.md +62 -0
  560. package/skills/languages/kotlin/SKILL.md +68 -0
  561. package/skills/languages/lua/SKILL.md +79 -0
  562. package/skills/languages/objectivec/SKILL.md +83 -0
  563. package/skills/languages/php/SKILL.md +74 -0
  564. package/skills/languages/python/SKILL.md +68 -0
  565. package/skills/languages/r/SKILL.md +70 -0
  566. package/skills/languages/ruby/SKILL.md +67 -0
  567. package/skills/languages/rust/SKILL.md +72 -0
  568. package/skills/languages/scala/SKILL.md +73 -0
  569. package/skills/languages/swift/SKILL.md +73 -0
  570. package/skills/languages/typescript/SKILL.md +69 -0
  571. package/skills/meta/authoring-agent-skills/SKILL.md +73 -0
  572. package/skills/meta/progressive-disclosure/SKILL.md +65 -0
  573. package/skills/meta/skill-frontmatter-spec/SKILL.md +65 -0
  574. package/skills/process/adr-technical-decisions/SKILL.md +59 -0
  575. package/skills/process/app-planning/SKILL.md +63 -0
  576. package/skills/process/architecture-before-code/SKILL.md +52 -0
  577. package/skills/process/breaking-work-into-sprints/SKILL.md +53 -0
  578. package/skills/process/idea-to-product/SKILL.md +50 -0
  579. package/skills/process/mocks-and-screen-flows/SKILL.md +52 -0
  580. package/skills/process/prioritization-moscow-rice/SKILL.md +64 -0
  581. package/skills/process/problem-framing/SKILL.md +51 -0
  582. package/skills/process/product-discovery/SKILL.md +53 -0
  583. package/skills/process/readme-generation/SKILL.md +90 -0
  584. package/skills/process/requirements-to-specs/SKILL.md +53 -0
  585. package/skills/process/research-official-docs/SKILL.md +58 -0
  586. package/skills/process/review-code-perf-security/SKILL.md +65 -0
  587. package/skills/process/security-by-design/SKILL.md +68 -0
  588. package/skills/process/specs-to-issues/SKILL.md +53 -0
  589. package/skills/process/testing-before-done/SKILL.md +61 -0
  590. package/skills/process/validating-ux-navigation/SKILL.md +63 -0
  591. package/skills/references/ai-attachments-ui/SKILL.md +66 -0
  592. package/skills/references/ai-in-browser-webllm/SKILL.md +74 -0
  593. package/skills/references/ai-tool-ui-patterns/SKILL.md +63 -0
  594. package/skills/references/component-patterns-gallery/SKILL.md +62 -0
  595. package/skills/references/gradient-resources/SKILL.md +66 -0
  596. package/skills/references/react-component-libraries/SKILL.md +61 -0
  597. package/skills/references/saas-landing-patterns/SKILL.md +67 -0
  598. package/skills/references/shadcn-tailwind-theming/SKILL.md +74 -0
  599. package/skills/references/vercel-ai-sdk-elements/SKILL.md +66 -0
  600. package/skills/references/web-animation-codrops/SKILL.md +68 -0
  601. package/skills/stacks/aiml/jupyter/SKILL.md +68 -0
  602. package/skills/stacks/aiml/keras/SKILL.md +77 -0
  603. package/skills/stacks/aiml/numpy/SKILL.md +69 -0
  604. package/skills/stacks/aiml/pandas/SKILL.md +72 -0
  605. package/skills/stacks/aiml/pytorch/SKILL.md +77 -0
  606. package/skills/stacks/aiml/scikit-learn/SKILL.md +74 -0
  607. package/skills/stacks/aiml/tensorflow/SKILL.md +79 -0
  608. package/skills/stacks/auth/auth0/SKILL.md +63 -0
  609. package/skills/stacks/auth/authjs/SKILL.md +69 -0
  610. package/skills/stacks/auth/clerk/SKILL.md +72 -0
  611. package/skills/stacks/auth/keycloak/SKILL.md +63 -0
  612. package/skills/stacks/auth/lucia/SKILL.md +56 -0
  613. package/skills/stacks/auth/passport/SKILL.md +70 -0
  614. package/skills/stacks/auth/supabase-auth/SKILL.md +66 -0
  615. package/skills/stacks/baas/amplify/SKILL.md +71 -0
  616. package/skills/stacks/baas/appwrite/SKILL.md +79 -0
  617. package/skills/stacks/baas/firebase/SKILL.md +73 -0
  618. package/skills/stacks/baas/heroku/SKILL.md +71 -0
  619. package/skills/stacks/backend/actix/SKILL.md +77 -0
  620. package/skills/stacks/backend/adonisjs/SKILL.md +65 -0
  621. package/skills/stacks/backend/aspnet-core/SKILL.md +75 -0
  622. package/skills/stacks/backend/codeigniter/SKILL.md +76 -0
  623. package/skills/stacks/backend/django/SKILL.md +62 -0
  624. package/skills/stacks/backend/express/SKILL.md +65 -0
  625. package/skills/stacks/backend/fastapi/SKILL.md +64 -0
  626. package/skills/stacks/backend/fastify/SKILL.md +64 -0
  627. package/skills/stacks/backend/fiber/SKILL.md +68 -0
  628. package/skills/stacks/backend/flask/SKILL.md +71 -0
  629. package/skills/stacks/backend/gin/SKILL.md +68 -0
  630. package/skills/stacks/backend/graphql/SKILL.md +70 -0
  631. package/skills/stacks/backend/hono/SKILL.md +64 -0
  632. package/skills/stacks/backend/koa/SKILL.md +63 -0
  633. package/skills/stacks/backend/laravel/SKILL.md +73 -0
  634. package/skills/stacks/backend/nestjs/SKILL.md +70 -0
  635. package/skills/stacks/backend/nginx/SKILL.md +77 -0
  636. package/skills/stacks/backend/phoenix/SKILL.md +68 -0
  637. package/skills/stacks/backend/rails/SKILL.md +67 -0
  638. package/skills/stacks/backend/spring/SKILL.md +70 -0
  639. package/skills/stacks/backend/spring-boot/SKILL.md +70 -0
  640. package/skills/stacks/backend/symfony/SKILL.md +77 -0
  641. package/skills/stacks/container/containerd/SKILL.md +75 -0
  642. package/skills/stacks/container/docker/SKILL.md +90 -0
  643. package/skills/stacks/container/podman/SKILL.md +93 -0
  644. package/skills/stacks/database/cassandra/SKILL.md +74 -0
  645. package/skills/stacks/database/cockroachdb/SKILL.md +69 -0
  646. package/skills/stacks/database/dynamodb/SKILL.md +62 -0
  647. package/skills/stacks/database/mariadb/SKILL.md +71 -0
  648. package/skills/stacks/database/mongodb/SKILL.md +71 -0
  649. package/skills/stacks/database/mysql/SKILL.md +72 -0
  650. package/skills/stacks/database/neon/SKILL.md +68 -0
  651. package/skills/stacks/database/planetscale/SKILL.md +70 -0
  652. package/skills/stacks/database/postgresql/SKILL.md +81 -0
  653. package/skills/stacks/database/redis/SKILL.md +78 -0
  654. package/skills/stacks/database/sqlite/SKILL.md +70 -0
  655. package/skills/stacks/database/supabase/SKILL.md +79 -0
  656. package/skills/stacks/dataviz/chart-js/SKILL.md +72 -0
  657. package/skills/stacks/dataviz/d3/SKILL.md +77 -0
  658. package/skills/stacks/dataviz/grafana/SKILL.md +69 -0
  659. package/skills/stacks/dataviz/plotly/SKILL.md +71 -0
  660. package/skills/stacks/frontend/alpine/SKILL.md +75 -0
  661. package/skills/stacks/frontend/angular/SKILL.md +75 -0
  662. package/skills/stacks/frontend/backbone/SKILL.md +82 -0
  663. package/skills/stacks/frontend/ember/SKILL.md +85 -0
  664. package/skills/stacks/frontend/htmx/SKILL.md +73 -0
  665. package/skills/stacks/frontend/lit/SKILL.md +76 -0
  666. package/skills/stacks/frontend/preact/SKILL.md +74 -0
  667. package/skills/stacks/frontend/qwik/SKILL.md +65 -0
  668. package/skills/stacks/frontend/react/SKILL.md +77 -0
  669. package/skills/stacks/frontend/solidjs/SKILL.md +75 -0
  670. package/skills/stacks/frontend/svelte/SKILL.md +70 -0
  671. package/skills/stacks/frontend/vue/SKILL.md +69 -0
  672. package/skills/stacks/infra/ansible/SKILL.md +76 -0
  673. package/skills/stacks/infra/aws/SKILL.md +66 -0
  674. package/skills/stacks/infra/azure/SKILL.md +72 -0
  675. package/skills/stacks/infra/circleci/SKILL.md +78 -0
  676. package/skills/stacks/infra/cloudflare/SKILL.md +65 -0
  677. package/skills/stacks/infra/fly-io/SKILL.md +63 -0
  678. package/skills/stacks/infra/gcp/SKILL.md +66 -0
  679. package/skills/stacks/infra/jenkins/SKILL.md +73 -0
  680. package/skills/stacks/infra/kubernetes/SKILL.md +64 -0
  681. package/skills/stacks/infra/netlify/SKILL.md +60 -0
  682. package/skills/stacks/infra/railway/SKILL.md +63 -0
  683. package/skills/stacks/infra/tailscale/SKILL.md +65 -0
  684. package/skills/stacks/infra/terraform/SKILL.md +75 -0
  685. package/skills/stacks/infra/vagrant/SKILL.md +70 -0
  686. package/skills/stacks/infra/vercel/SKILL.md +60 -0
  687. package/skills/stacks/meta/astro/SKILL.md +64 -0
  688. package/skills/stacks/meta/docusaurus/SKILL.md +71 -0
  689. package/skills/stacks/meta/eleventy/SKILL.md +69 -0
  690. package/skills/stacks/meta/gatsby/SKILL.md +63 -0
  691. package/skills/stacks/meta/hugo/SKILL.md +73 -0
  692. package/skills/stacks/meta/jekyll/SKILL.md +70 -0
  693. package/skills/stacks/meta/nextjs/SKILL.md +62 -0
  694. package/skills/stacks/meta/nuxt/SKILL.md +66 -0
  695. package/skills/stacks/meta/remix/SKILL.md +67 -0
  696. package/skills/stacks/meta/sveltekit/SKILL.md +70 -0
  697. package/skills/stacks/meta/vite/SKILL.md +63 -0
  698. package/skills/stacks/mobile/android/SKILL.md +77 -0
  699. package/skills/stacks/mobile/flutter/SKILL.md +77 -0
  700. package/skills/stacks/mobile/ionic/SKILL.md +72 -0
  701. package/skills/stacks/mobile/nativescript/SKILL.md +71 -0
  702. package/skills/stacks/mobile/react-native/SKILL.md +75 -0
  703. package/skills/stacks/mobile/xamarin/SKILL.md +73 -0
  704. package/skills/stacks/orm/diesel/SKILL.md +72 -0
  705. package/skills/stacks/orm/django-orm/SKILL.md +58 -0
  706. package/skills/stacks/orm/drizzle/SKILL.md +67 -0
  707. package/skills/stacks/orm/gorm/SKILL.md +73 -0
  708. package/skills/stacks/orm/knex/SKILL.md +64 -0
  709. package/skills/stacks/orm/mongoose/SKILL.md +64 -0
  710. package/skills/stacks/orm/prisma/SKILL.md +64 -0
  711. package/skills/stacks/orm/sequelize/SKILL.md +65 -0
  712. package/skills/stacks/orm/sqlalchemy/SKILL.md +71 -0
  713. package/skills/stacks/orm/typeorm/SKILL.md +70 -0
  714. package/skills/stacks/queue/bullmq/SKILL.md +69 -0
  715. package/skills/stacks/queue/celery/SKILL.md +68 -0
  716. package/skills/stacks/queue/kafka/SKILL.md +66 -0
  717. package/skills/stacks/queue/nats/SKILL.md +66 -0
  718. package/skills/stacks/queue/rabbitmq/SKILL.md +64 -0
  719. package/skills/stacks/queue/redis/SKILL.md +66 -0
  720. package/skills/stacks/runtime/beam/SKILL.md +72 -0
  721. package/skills/stacks/runtime/bun/SKILL.md +80 -0
  722. package/skills/stacks/runtime/deno/SKILL.md +74 -0
  723. package/skills/stacks/runtime/dotnet/SKILL.md +64 -0
  724. package/skills/stacks/runtime/jvm/SKILL.md +66 -0
  725. package/skills/stacks/runtime/node/SKILL.md +70 -0
  726. package/skills/stacks/runtime/pypy/SKILL.md +69 -0
  727. package/skills/stacks/runtime/python3/SKILL.md +70 -0
  728. package/skills/stacks/styling/bootstrap/SKILL.md +74 -0
  729. package/skills/stacks/styling/bulma/SKILL.md +80 -0
  730. package/skills/stacks/styling/chakra-ui/SKILL.md +61 -0
  731. package/skills/stacks/styling/css-modules/SKILL.md +54 -0
  732. package/skills/stacks/styling/mui/SKILL.md +60 -0
  733. package/skills/stacks/styling/sass/SKILL.md +63 -0
  734. package/skills/stacks/styling/shadcn-ui/SKILL.md +58 -0
  735. package/skills/stacks/styling/styled-components/SKILL.md +62 -0
  736. package/skills/stacks/styling/tailwind/SKILL.md +59 -0
  737. package/skills/stacks/styling/unocss/SKILL.md +64 -0
  738. package/skills/stacks/styling/vanilla-extract/SKILL.md +64 -0
  739. package/skills/stacks/styling/vuetify/SKILL.md +89 -0
  740. package/skills/stacks/testing/cypress/SKILL.md +68 -0
  741. package/skills/stacks/testing/jasmine/SKILL.md +67 -0
  742. package/skills/stacks/testing/jest/SKILL.md +67 -0
  743. package/skills/stacks/testing/mocha/SKILL.md +71 -0
  744. package/skills/stacks/testing/playwright/SKILL.md +68 -0
  745. package/skills/stacks/testing/puppeteer/SKILL.md +70 -0
  746. package/skills/stacks/testing/selenium/SKILL.md +70 -0
  747. package/skills/stacks/testing/vitest/SKILL.md +68 -0
@@ -0,0 +1,315 @@
1
+ [← Docs index](./README.md) · [🇧🇷 Português](../pt/PUBLIC_API.md) · [✦ Constella](../../README.md)
2
+
3
+ # 🛰️ Public API — driving the ship from orbit
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ A small, honest REST surface (`/api/v1`) that lets external systems — scripts, CI jobs, a phone, or an MCP server — read project state and steer the constellation without a browser session. One bearer credential (a **Personal Access Token**), one dispatcher, one error envelope.
8
+
9
+ ---
10
+
11
+ ## When to use ✦
12
+
13
+ Use the Public API when you want to drive Constella from **outside** the web UI:
14
+
15
+ - A **CI pipeline** that approves a plan or flips 24/7 execution after a green build.
16
+ - A **mobile / shell script** that polls the morning review and counts.
17
+ - An **MCP host** (Claude Desktop, Cursor, …) — the bundled MCP server (see [MCP.md](./MCP.md)) is a thin outbound wrapper over exactly these v1 routes.
18
+ - A **status board** that lists goals, issues, tasks or specs.
19
+ - Asking the **Knowledge Base** a question programmatically.
20
+
21
+ If you instead want an external AI host to *consume* Constella as tools, you do not call these routes by hand — you point the MCP server at them. The two are the same surface seen from two distances.
22
+
23
+ ---
24
+
25
+ ## How it works 🌌
26
+
27
+ The whole API is **one dynamic catch-all route**: `src/app/api/v1/[[...path]]/route.ts`. It exports just `GET` and `POST`; both funnel into a single `dispatch()` function so that **authentication, scope, rate-limit and the response envelope live in exactly one place**.
28
+
29
+ Mutations do **not** reinvent logic. They reuse the same session-less cores the Telegram remote control uses:
30
+
31
+ - `approvePlanFor`, `setAuto247For`, `requestPlanChangesFor`, `reviewSummaryFor` → `src/server/plan-ops.ts`
32
+ - `cancelGoalFor`, `archiveGoalFor` → `src/server/work-ops.ts`
33
+ - `startNewWorkFor` → `src/server/planner-core.ts`
34
+ - `kbAnswer` → `src/server/kb.ts`
35
+ - Structured reads (`apiStatus`, `apiGoals`, `apiIssues`, `apiTasks`, `apiSpecs`) → `src/server/api/service.ts`
36
+
37
+ There is **no session, no cookie** on the v1 routes. The only credential is the PAT. The route also sets `runtime = "nodejs"` and `dynamic = "force-dynamic"` (it touches the database on every request).
38
+
39
+ ### Response envelope
40
+
41
+ Every response is JSON with a uniform shape:
42
+
43
+ | Field | Type | Meaning |
44
+ | ------- | --------- | ---------------------------------------- |
45
+ | `ok` | `boolean` | `true` on success, `false` on error |
46
+ | `data` | any | present when `ok: true` |
47
+ | `error` | `string` | present when `ok: false` |
48
+
49
+ ```jsonc
50
+ // success
51
+ { "ok": true, "data": { /* … */ } }
52
+ // error
53
+ { "ok": false, "error": "this token has read scope; a write-scope token is required" }
54
+ ```
55
+
56
+ ---
57
+
58
+ ## Authentication 🔑 — Personal Access Tokens (`cn_…`)
59
+
60
+ A PAT is minted in the web UI (`createPAT` in `src/server/actions/profile-actions.ts`) and stored **hashed**, never in plaintext.
61
+
62
+ ```ts
63
+ // profile-actions.ts (minting)
64
+ const raw = "cn_" + randomBytes(24).toString("base64url");
65
+ const tokenHash = createHash("sha256").update(raw).digest("hex");
66
+ // stored: { tokenHash, prefix: raw.slice(0,7), scope, name, userId }
67
+ ```
68
+
69
+ Key properties:
70
+
71
+ - **Format** — `cn_` followed by a URL-safe base64 string (24 random bytes). The route accepts `cn_[A-Za-z0-9_-]{8,}`.
72
+ - **Shown once** — the raw `cn_…` value is returned by `createPAT` and displayed a single time. Only its **SHA-256 hash** (`tokenHash`) and a 7-char display `prefix` (e.g. `cn_a1b2`) are persisted in the `personalAccessToken` table. Lose it and you mint a new one.
73
+ - **Never logged** — `authenticatePAT` only ever hashes the incoming token and matches the hash; the plaintext token never reaches a log line.
74
+ - **Scope** — `read` (default) or `write`. Reads are open to any valid token; mutations require `write`.
75
+ - **Usage stamp** — every authenticated call best-effort updates `lastUsedAt` (a write hiccup never blocks auth).
76
+
77
+ ### The handshake (`authenticatePAT`)
78
+
79
+ `src/server/api/pat-auth.ts` runs on every request:
80
+
81
+ 1. Parse `Authorization: Bearer cn_…`. Malformed → **401** `missing or malformed bearer token`.
82
+ 2. SHA-256 the token, look it up by `tokenHash`. No match → **401** `invalid token`.
83
+ 3. Resolve the token owner's org via `getActiveOrg(userId, X-Constella-Org)`. This is a **membership join** — an `X-Constella-Org` value the user does not belong to is *ignored* (falls back to their first org), so a token can never be pointed at a foreign tenant. No org → **404**.
84
+ 4. Archived org → **409** `organization is archived`.
85
+ 5. Resolve the org's workspace via `getWorkspace`. None → **404**.
86
+
87
+ On success the request carries `{ userId, tokenId, scope, org, workspace }`.
88
+
89
+ ### `X-Constella-Org`
90
+
91
+ Optional header. If a user belongs to multiple organizations, set `X-Constella-Org: <orgId>` to choose which one the token acts on. Omitted (or invalid) → the user's **first** org. The choice is always validated through the membership join.
92
+
93
+ ---
94
+
95
+ ## Rate limiting 🪐
96
+
97
+ A best-effort **sliding 60-second window**, keyed by `tokenId`, lives in memory in the single Next server process:
98
+
99
+ ```ts
100
+ const RL_MAX = 120; // requests per token per 60s
101
+ ```
102
+
103
+ Exceeding it returns **429** `rate limit exceeded (120 req/min)`. Because the counter is in-memory, a server restart resets it — acceptable for the single-operator design. There is no per-IP limit and no `Retry-After` header.
104
+
105
+ ---
106
+
107
+ ## Authorization flow 🌠
108
+
109
+ ```mermaid
110
+ flowchart TD
111
+ A["Request → /api/v1/…"] --> B{"Bearer cn_… present & well-formed?"}
112
+ B -- no --> E401["401 missing/malformed"]
113
+ B -- yes --> C["sha256(token) → match tokenHash"]
114
+ C -- no match --> E401b["401 invalid token"]
115
+ C -- match --> D["getActiveOrg(userId, X-Constella-Org)\nmembership join"]
116
+ D -- none --> E404["404 no organization"]
117
+ D -- archived --> E409["409 archived"]
118
+ D -- ok --> R{"rate limit\n(120/min)?"}
119
+ R -- exceeded --> E429["429 rate limit"]
120
+ R -- ok --> M{"method + route"}
121
+ M -- "GET" --> RD["read services"]
122
+ M -- "POST (write?)" --> W{"scope == write?"}
123
+ W -- no --> E403["403 write scope required"]
124
+ W -- yes --> MUT["plan-ops / work-ops / planner-core"]
125
+ ```
126
+
127
+ ---
128
+
129
+ ## Endpoints 📡
130
+
131
+ Base URL is your Constella host, e.g. `http://localhost:3000/api/v1`. All routes require the `Authorization` header; write routes additionally require a `write`-scope token.
132
+
133
+ ### GET (read scope is enough)
134
+
135
+ | Method | Path | Returns |
136
+ | ------ | ------------------- | ----------------------------------------------------------------- |
137
+ | GET | `/api/v1` or `/me` | `{ user, org{id,name}, workspace{id,name,slug}, scope }` |
138
+ | GET | `/api/v1/status` | counts: goals, issues (`byCol`), tasks (`byCol`), plan summary |
139
+ | GET | `/api/v1/review` | `{ text }` — the mobile-style review summary (`reviewSummaryFor`) |
140
+ | GET | `/api/v1/goals` | `[{ id, title, status, progress }]` |
141
+ | GET | `/api/v1/issues` | `[{ id, key, title, col, prio, points, moscow, approved }]` |
142
+ | GET | `/api/v1/tasks` | `[{ id, key, title, col, prio }]` |
143
+ | GET | `/api/v1/specs` | `[{ id, key, title, status, approved }]` |
144
+ | GET | `/api/v1/kb?q=…` | `{ text, sources }` — Knowledge Base answer (`kbAnswer`) |
145
+
146
+ ### POST (write scope, except `kb`)
147
+
148
+ | Method | Path | Body | Effect |
149
+ | ------ | ----------------------------- | -------------------------- | --------------------------------------------------- |
150
+ | POST | `/api/v1/plan/approve` | — | Approve the plan, queue tasks (`approvePlanFor`) |
151
+ | POST | `/api/v1/plan/reject` | `{ reason? }` | Send the plan back with notes (`requestPlanChangesFor`) |
152
+ | POST | `/api/v1/execution` | `{ on?: boolean }` | 24/7 autonomous execution on/off (`setAuto247For`) — defaults `on:true` |
153
+ | POST | `/api/v1/work` | `{ brief, title? }` | Start a new unit of work (`startNewWorkFor`) |
154
+ | POST | `/api/v1/goals/{id}/cancel` | — | Cancel a goal (`cancelGoalFor`) |
155
+ | POST | `/api/v1/goals/{id}/archive` | — | Archive a goal (`archiveGoalFor`) |
156
+ | POST | `/api/v1/kb` | `{ q }` | Knowledge Base answer — **read-ish, no write scope needed** |
157
+
158
+ > `POST /api/v1/kb` is the deliberate exception: it mutates nothing, so it does not demand a `write` token. Every other POST does.
159
+
160
+ ---
161
+
162
+ ## Examples 🌠
163
+
164
+ Export your token once:
165
+
166
+ ```bash
167
+ export CN_TOKEN="cn_xxxxxxxxxxxxxxxxxxxxxxxx"
168
+ export CN_BASE="http://localhost:3000/api/v1"
169
+ ```
170
+
171
+ ### Who am I
172
+
173
+ ```bash
174
+ curl -s "$CN_BASE/me" -H "Authorization: Bearer $CN_TOKEN"
175
+ # { "ok": true, "data": { "user": "…", "org": { "id": "…", "name": "Acme" },
176
+ # "workspace": { "id": "…", "name": "web", "slug": "web" }, "scope": "write" } }
177
+ ```
178
+
179
+ ### Project status & morning review
180
+
181
+ ```bash
182
+ curl -s "$CN_BASE/status" -H "Authorization: Bearer $CN_TOKEN"
183
+ curl -s "$CN_BASE/review" -H "Authorization: Bearer $CN_TOKEN"
184
+ ```
185
+
186
+ ### List boards
187
+
188
+ ```bash
189
+ curl -s "$CN_BASE/goals" -H "Authorization: Bearer $CN_TOKEN"
190
+ curl -s "$CN_BASE/issues" -H "Authorization: Bearer $CN_TOKEN"
191
+ curl -s "$CN_BASE/tasks" -H "Authorization: Bearer $CN_TOKEN"
192
+ curl -s "$CN_BASE/specs" -H "Authorization: Bearer $CN_TOKEN"
193
+ ```
194
+
195
+ ### Ask the Knowledge Base
196
+
197
+ ```bash
198
+ # GET form (query string)
199
+ curl -s "$CN_BASE/kb?q=how%20do%20we%20handle%20auth" -H "Authorization: Bearer $CN_TOKEN"
200
+
201
+ # POST form (JSON body) — also no write scope required
202
+ curl -s -X POST "$CN_BASE/kb" \
203
+ -H "Authorization: Bearer $CN_TOKEN" -H "Content-Type: application/json" \
204
+ -d '{"q":"how do we handle auth"}'
205
+ ```
206
+
207
+ ### Approve / reject a plan (write scope)
208
+
209
+ ```bash
210
+ curl -s -X POST "$CN_BASE/plan/approve" -H "Authorization: Bearer $CN_TOKEN"
211
+
212
+ curl -s -X POST "$CN_BASE/plan/reject" \
213
+ -H "Authorization: Bearer $CN_TOKEN" -H "Content-Type: application/json" \
214
+ -d '{"reason":"split the auth issue in two"}'
215
+ ```
216
+
217
+ ### Toggle 24/7 execution (write scope)
218
+
219
+ ```bash
220
+ curl -s -X POST "$CN_BASE/execution" \
221
+ -H "Authorization: Bearer $CN_TOKEN" -H "Content-Type: application/json" \
222
+ -d '{"on":true}'
223
+ # { "ok": true, "data": { "auto247": true } }
224
+ ```
225
+
226
+ ### Launch new work (write scope) 🚀
227
+
228
+ ```bash
229
+ curl -s -X POST "$CN_BASE/work" \
230
+ -H "Authorization: Bearer $CN_TOKEN" -H "Content-Type: application/json" \
231
+ -d '{"title":"Password reset","brief":"Add a forgot-password flow with email tokens"}'
232
+ ```
233
+
234
+ ### Cancel / archive a goal (write scope) 🕳️
235
+
236
+ ```bash
237
+ curl -s -X POST "$CN_BASE/goals/$GOAL_ID/cancel" -H "Authorization: Bearer $CN_TOKEN"
238
+ curl -s -X POST "$CN_BASE/goals/$GOAL_ID/archive" -H "Authorization: Bearer $CN_TOKEN"
239
+ ```
240
+
241
+ ### Pointing a token at a specific org
242
+
243
+ ```bash
244
+ curl -s "$CN_BASE/status" \
245
+ -H "Authorization: Bearer $CN_TOKEN" \
246
+ -H "X-Constella-Org: $ORG_ID"
247
+ ```
248
+
249
+ ---
250
+
251
+ ## Possible states 🛰️
252
+
253
+ | HTTP | `error` | Cause |
254
+ | ---- | -------------------------------------------------------- | ---------------------------------------------------------- |
255
+ | 200 | — | success (`ok: true`) |
256
+ | 400 | `missing ?q=` / `missing body.q` | KB query with no question |
257
+ | 400 | `could not start work` (or core message) | `POST /work` with empty `brief` |
258
+ | 401 | `missing or malformed bearer token` | no `Authorization`, or not `Bearer cn_…` |
259
+ | 401 | `invalid token` | token hash not in `personalAccessToken` |
260
+ | 403 | `this token has read scope; a write-scope token is required` | mutating route with a `read` token |
261
+ | 404 | `no organization for this token's user` | token owner has no org |
262
+ | 404 | `no workspace for the organization` | org has no workspace |
263
+ | 404 | `unknown GET /…` / `unknown POST /…` / `goal not found` | bad route or missing goal |
264
+ | 409 | `organization is archived` | the org behind the token is archived |
265
+ | 429 | `rate limit exceeded (120 req/min)` | more than 120 requests/token in 60s |
266
+ | 500 | (error message) | unexpected exception (caught at the `GET`/`POST` boundary) |
267
+
268
+ ---
269
+
270
+ ## Related integrations 🌌
271
+
272
+ - **[MCP.md](./MCP.md)** — the outbound MCP server (`scripts/mcp-server.mjs`) is a stdio wrapper over these exact routes; an external AI host drives Constella through it using the same `cn_…` PAT.
273
+ - **[TELEGRAM.md](./TELEGRAM.md)** — the Telegram remote control shares the very same session-less cores (`plan-ops.ts`, `work-ops.ts`, `planner-core.ts`).
274
+ - **[CHAT_COMMANDS.md](./CHAT_COMMANDS.md)** — the slash commands map to the same actions you reach over HTTP here.
275
+ - **[WORKFLOW.md](./WORKFLOW.md)** / **[GOALS_SPECS_ISSUES.md](./GOALS_SPECS_ISSUES.md)** — the Goal → Spec → Issue → Plan lifecycle that `status`, `plan/approve` and `work` operate on.
276
+
277
+ ---
278
+
279
+ ## Security 🕳️
280
+
281
+ - **Hashed at rest** — only the SHA-256 `tokenHash` and a 7-char display `prefix` are stored; the raw `cn_…` is shown once and never persisted or logged.
282
+ - **Tenant isolation** — `getActiveOrg` joins through `member`, so a token can only act on orgs its owner belongs to; a forged `X-Constella-Org` is silently ignored.
283
+ - **Scope gate** — every mutation calls `needWrite()` and returns **403** for `read` tokens. The only POST that skips it is `/kb` (a pure read).
284
+ - **Revocation** — `revokePAT` (profile UI) deletes the row; the next request with that token gets **401 invalid token**.
285
+ - **No session bleed** — the v1 routes never read cookies or sessions; a stolen browser session cannot be replayed here, and a stolen PAT cannot reach the authenticated web UI.
286
+ - **Transport** — there is no built-in TLS. Behind `start`/`auth` mode the server binds loopback (`127.0.0.1`); for `vps`/`portable` (bind `0.0.0.0`) put it behind a TLS reverse proxy / tailnet and treat the PAT as a password. See [SECURITY.md](./SECURITY.md), [VPS_MODE.md](./VPS_MODE.md).
287
+
288
+ ---
289
+
290
+ ## Troubleshooting 🛠️
291
+
292
+ | Symptom | Likely cause / fix |
293
+ | ----------------------------------------- | ---------------------------------------------------------------------------------- |
294
+ | `401 missing or malformed bearer token` | Header must be exactly `Authorization: Bearer cn_…`; check for a stray space/quote. |
295
+ | `401 invalid token` | Token revoked or mistyped. Mint a fresh one in **Profile → Personal Access Tokens**; it is shown once. |
296
+ | `403 … write-scope token is required` | You used a `read` token on a mutation. Create a `write`-scope token. |
297
+ | `404 no organization` / `no workspace` | The token's user has no org/workspace yet — finish [ONBOARDING.md](./ONBOARDING.md). |
298
+ | `409 organization is archived` | Un-archive the org, or use a token whose org is active. |
299
+ | `429 rate limit exceeded` | You crossed 120 req/min for that token; back off (the window is a sliding 60s). |
300
+ | Wrong org's data returned | Pass `X-Constella-Org: <orgId>`; an invalid value falls back to the first org. |
301
+ | `400 missing ?q=` / `missing body.q` | KB needs a non-empty question — `?q=…` for GET, `{"q":"…"}` for POST. |
302
+ | Connection refused from another machine | In `start`/`auth` mode the server is loopback-only; use `vps`/`portable` or a proxy. |
303
+
304
+ ---
305
+
306
+ ## Related links
307
+
308
+ - [MCP.md](./MCP.md) — outbound MCP server over these routes
309
+ - [TELEGRAM.md](./TELEGRAM.md) — Telegram remote control (shared cores)
310
+ - [CHAT_COMMANDS.md](./CHAT_COMMANDS.md) — slash commands
311
+ - [WORKFLOW.md](./WORKFLOW.md) — the work lifecycle
312
+ - [GOALS_SPECS_ISSUES.md](./GOALS_SPECS_ISSUES.md) — goals, specs, issues
313
+ - [SECURITY.md](./SECURITY.md) — vault, secrets, auth
314
+ - [VPS_MODE.md](./VPS_MODE.md) · [PORTABLE_MODE.md](./PORTABLE_MODE.md) — remote / portable binds
315
+ - [CONFIGURATION.md](./CONFIGURATION.md) — env vars and ports
@@ -0,0 +1,343 @@
1
+ [← Docs index](./README.md) · [🇧🇷 Português](../pt/PUBLISHING.md) · [✦ Constella](../../README.md)
2
+
3
+ # 🚀 Publishing & Distribution — launching the ship from the shipyard
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ Publishing is how the central ship leaves the shipyard. Two launches happen, in two directions: the **npm tarball** carries the *compiled runtime* to end users, and the **public Git mirror** carries the *product tree* (docs, launcher, migrations — no source) to `github.com/gabriel7silva/constella`. The private development tree stays home, in orbit, on the `dev` remote. ✦
8
+
9
+ > **TL;DR** — End users receive a compiled, minified runtime, **never `src/`**. `npm publish` ships the prebuilt `.next`; `scripts/publish-public.mjs --push` mirrors a clean, secret-scanned, source-free tree to the public Git repo. Both refuse to ship secrets.
10
+
11
+ ---
12
+
13
+ ## When to use
14
+
15
+ | You want to… | Use |
16
+ | --- | --- |
17
+ | Ship a new version to npm (`npx constella` users) | `npm publish` (runs `prepublishOnly` → `prepack`) |
18
+ | Mirror the product tree to the public Git repo | `node scripts/publish-public.mjs --push` |
19
+ | Dry-run the public mirror (scan only, no push) | `node scripts/publish-public.mjs` |
20
+ | Verify the tarball locally before publishing | `npm pack` (runs `prepack` → `trim-next`) |
21
+ | Strip dev artifacts from a build before packing | automatic on `prepack`; manual: `node scripts/trim-next.mjs` |
22
+ | Remove scratch/dead files from the repo root | `npm run clean` (`scripts/clean-repo.mjs`) |
23
+
24
+ This page covers the **two distribution channels** and the gates that protect them. For the user-facing update path, see [UPDATE](./UPDATE.md). For the secret-scanning machinery, see [SECURITY](./SECURITY.md). For deploying a *built product* (not Constella itself), see [DEPLOY](./DEPLOY.md) and [PREPARE_DEPLOY](./PREPARE_DEPLOY.md).
25
+
26
+ ---
27
+
28
+ ## How it works 🌌
29
+
30
+ Constella distributes through **two channels** that share one principle: *ship the product, never the source.*
31
+
32
+ ```
33
+ ┌────────────────────── dev tree (private) ──────────────────────┐
34
+ │ src/ e2e/ tests playwright.config.ts drizzle/ bin/ │
35
+ │ .next/ (built) docs/ skills/ scripts/ *.config.mjs │
36
+ └────────────────────────────────────────────────────────────────┘
37
+ │ │
38
+ npm publish │ │ publish-public.mjs --push
39
+ (prepublishOnly → │ │ (clean-tree + secret-scan)
40
+ prepack) ▼ ▼
41
+ ┌─────────────────────────────┐ ┌────────────────────────────────┐
42
+ │ npm registry: constella │ │ public Git: gabriel7silva/ │
43
+ │ COMPILED runtime tarball │ │ constella (force-pushed mirror) │
44
+ │ .next + bin + drizzle + docs │ │ docs + bin + drizzle + skills │
45
+ │ NO src/ │ │ NO src/, NO .next, NO secrets │
46
+ └─────────────────────────────┘ └────────────────────────────────┘
47
+ ```
48
+
49
+ 1. **npm channel** — `npm publish` ships the runtime as a tarball. The `files` allowlist in `package.json` selects exactly what travels; `prepublishOnly` validates the tree; `prepack` (`trim-next.mjs`) strips dev artifacts from `.next` so end users receive only the production runtime.
50
+ 2. **Git channel** — `scripts/publish-public.mjs` builds a filtered tree in a *temporary* git index (HEAD minus `src/`/tests, plus the generated `drizzle/` migrations), secret-scans exactly that set, and **force-pushes** it as a fresh root commit to the `public` remote. The compiled `.next` does **not** travel through git — it reaches users via the npm tarball.
51
+ 3. **Dual-repo** — the private `dev` remote (`constella-Dev`) keeps the full source history; the `public` remote (`constella`) is a clean, disposable mirror, not a shared history.
52
+
53
+ > Neither channel carries `src/`. The schema reaches users as generated SQL under `drizzle/`, applied by `drizzle-kit migrate`. See [INSTALLATION](./INSTALLATION.md).
54
+
55
+ ---
56
+
57
+ ## Main flow 🌠
58
+
59
+ ```mermaid
60
+ flowchart TD
61
+ subgraph DEV["Dev tree (this repo, dev remote)"]
62
+ SRC["src/ + e2e/ + tests + configs"]
63
+ BUILT[".next (next build --webpack)"]
64
+ DRZ["drizzle/ (generated SQL migrations)"]
65
+ SHIP["bin/ scripts/ skills/ docs/ *.config.mjs"]
66
+ end
67
+
68
+ SRC --> NPMHOOK
69
+ BUILT --> NPMHOOK
70
+ DRZ --> NPMHOOK
71
+ SHIP --> NPMHOOK
72
+
73
+ subgraph NPM["npm channel — npm publish"]
74
+ NPMHOOK["prepublishOnly: drizzle-kit generate + validate (typecheck + parity + build)"]
75
+ PREPACK["prepack: trim-next.mjs strips .next/dev,cache,trace"]
76
+ TAR["files allowlist → tarball"]
77
+ NPMHOOK --> PREPACK --> TAR
78
+ end
79
+
80
+ SRC --> PUBHOOK
81
+ DRZ --> PUBHOOK
82
+ SHIP --> PUBHOOK
83
+
84
+ subgraph GIT["Git channel — publish-public.mjs"]
85
+ PUBHOOK["ls-files minus EXCLUDE + force-add drizzle/"]
86
+ SCAN["secret-scan exact publish set"]
87
+ GATE{"findings == 0 ?"}
88
+ TREE["temp git index → write-tree → commit-tree"]
89
+ PUSH["git push -f public commit:refs/heads/main"]
90
+ PUBHOOK --> SCAN --> GATE
91
+ GATE -- "no" --> ABORT["exit 1 — refuse"]
92
+ GATE -- "yes (--push)" --> TREE --> PUSH
93
+ end
94
+
95
+ TAR --> REG["npm registry: constella"]
96
+ PUSH --> PUB["public Git mirror"]
97
+ ```
98
+
99
+ ---
100
+
101
+ ## Key concepts 🪐
102
+
103
+ ### The `files` allowlist (`package.json`)
104
+
105
+ npm packs **only** what `files` lists (plus a few always-included files). This is the single source of truth for "what an end user receives":
106
+
107
+ ```json
108
+ "files": [
109
+ ".next", "bin", "scripts", "skills", "docs",
110
+ "drizzle", "next.config.mjs", "drizzle.config.mjs",
111
+ "README.md", "LICENSE", "CHANGELOG.md"
112
+ ]
113
+ ```
114
+
115
+ `src/` is **absent by design**. The package comment makes the intent explicit:
116
+
117
+ > *"Ships the COMPILED build (`.next`) + generated migrations (`drizzle`) + the launcher — NOT `src/`. End users get a compiled, minified runtime, never the source. `next.config` is `.mjs` so `next start` needs no TypeScript at runtime (devDeps aren't installed for end users)."*
118
+
119
+ ### `prepack` → `trim-next.mjs`
120
+
121
+ `prepack` runs on `npm pack` and `npm publish`, right before the tarball is built. `scripts/trim-next.mjs` deletes the parts of `.next` that `next start` does **not** need:
122
+
123
+ | Removed from `.next/` | Why |
124
+ | --- | --- |
125
+ | `dev` | Turbopack dev-server output + a multi-GB development log; regenerated by `next dev`. |
126
+ | `cache` | Build cache; regenerated by `next build`. |
127
+ | `trace` | Build trace files; not needed at runtime. |
128
+
129
+ Because the `files` allowlist re-includes the **whole** `.next` directory (overriding nested `.npmignore` rules), deleting these *on disk before packing* is the reliable way to keep the tarball small and clean. If `.next/` doesn't exist, the script exits 0 with a skip notice.
130
+
131
+ ### `prepublishOnly` → `validate`
132
+
133
+ `prepublishOnly` runs **only** on `npm publish` (not on plain `npm pack`). It is the publish gate:
134
+
135
+ ```json
136
+ "prepublishOnly": "drizzle-kit generate --config drizzle.config.mjs && npm run validate"
137
+ ```
138
+
139
+ …where `validate` is:
140
+
141
+ ```json
142
+ "validate": "npm run typecheck && npm run parity && npm run build"
143
+ ```
144
+
145
+ | Step | Command | Guarantees |
146
+ | --- | --- | --- |
147
+ | Generate migrations | `drizzle-kit generate` | `drizzle/` reflects the current `schema.ts` before it ships. |
148
+ | Typecheck | `tsc --noEmit` | The source compiles cleanly. |
149
+ | i18n parity | `node scripts/i18n-parity.mjs` | EN ↔ PT dictionary keys match (see [CONFIGURATION](./CONFIGURATION.md)). |
150
+ | Build | `next build --webpack` | A fresh, current `.next` exists to be packed. |
151
+
152
+ ### `publish-public.mjs` — the clean Git mirror
153
+
154
+ `scripts/publish-public.mjs` produces the **source-free** Git mirror. It never runs automatically; you invoke it deliberately.
155
+
156
+ The constant that defines the whole point:
157
+
158
+ ```js
159
+ const EXCLUDE = ["src", "playwright.config.ts", "e2e", "tests"];
160
+ ```
161
+
162
+ Flow inside the script:
163
+
164
+ 1. **Ensure migrations exist** — if `drizzle/` is missing or has no `.sql`, run `npx drizzle-kit generate`. The public repo ships these so an end user builds a fresh DB via `drizzle-kit migrate`.
165
+ 2. **Compute the publish set** — `git ls-files` (tracked files) minus `EXCLUDE`, **plus** the on-disk `drizzle/` files (gitignored in the dev repo, force-added into the public tree). Deduped into `publishFiles`.
166
+ 3. **Secret-scan exactly that set** — sensitive filenames + high-confidence inline patterns (mirror of `src/server/git-scan.ts`). Any finding → abort.
167
+ 4. **Belt-and-suspenders** — explicitly check that no `src/` file slipped in; if so, append a finding and abort.
168
+ 5. **Dry run by default** — without `--push`, print the file count and exit 0. With `--push`, continue.
169
+ 6. **Build the filtered tree** in a temporary git index (`GIT_INDEX_FILE`): `git read-tree HEAD` → `git rm -r --cached` each `EXCLUDE` path → `git add -f drizzle` → `git write-tree` → `git commit-tree` (a fresh root commit, no shared history).
170
+ 7. **Force-push** the bare commit to a fully-qualified ref: `git push -f public <commit>:refs/heads/main`.
171
+
172
+ ### Secret-scan rules (the publish gate)
173
+
174
+ `publish-public.mjs` carries an inline mirror of the repository scanner. It blocks on **any** finding:
175
+
176
+ | Category | Examples / pattern intent |
177
+ | --- | --- |
178
+ | Sensitive **files** | `.env` (and `.env.*` except `.example`/`.sample`/`.template`/`.dist`), `id_rsa`/`id_dsa`, `*.pem`/`*.key`/`*.p12`/`*.pfx`/`*.keystore`/`*.jks`/`*.ppk`/`*.asc`, `credentials*.json`, `service-account*.json`, `*.sql`/`*.dump`/`*.bak`/`*.sqlite*`/`*.db`, `npm-debug.log`, `*.local` |
179
+ | Allowed exceptions | `.env.example`/`.sample`/`.template`/`.dist`, `.env-example`; and `drizzle/*.sql` (DDL migrations, not DB dumps) |
180
+ | Inline secrets | AWS access key (`AKIA…`), GitHub token (`gh[posru]_…`), GitHub fine-grained PAT (`github_pat_…`), OpenAI/Anthropic key (`sk-…`), Google API key (`AIza…`), Slack token (`xox[baprs]-…`), private-key block (`-----BEGIN … PRIVATE KEY-----`), JWT (`eyJ…`), DB URL with non-placeholder creds, Telegram bot token (`\d{6,}:…`) |
181
+ | Source leak | any path equal to `src` or starting with `src/` |
182
+
183
+ > Scanned files are skipped if non-text (only `.js/.ts/.json/.md/.css/.yaml/.toml/.sh/.env/.txt/.html` are read) or larger than **512 KB**. Placeholder credentials (`user`, `admin`, `changeme`, `xxx`, `your…`, `localhost`, …) do **not** count as a DB-URL secret.
184
+
185
+ ### Dual-repo (public vs dev) 🕳️
186
+
187
+ | Remote | Repository | Contains | History |
188
+ | --- | --- | --- | --- |
189
+ | `dev` | `gabriel7silva/constella-Dev` | Full private source tree (`src/`, tests, e2e, history) | Real, preserved |
190
+ | `public` | `gabriel7silva/constella` | Product only (docs, `bin/`, `drizzle/`, `skills/`, configs) | Disposable — overwritten by force-push |
191
+
192
+ The public mirror is **not** a shared-history collaboration target. Each `--push` writes a fresh root commit and force-overwrites `main`. Development happens against `dev`; the npm tarball is published separately from either git push.
193
+
194
+ ---
195
+
196
+ ## Step-by-step 🛰️
197
+
198
+ ### Publish a new npm version
199
+
200
+ ```bash
201
+ # 1. Make sure the working tree is clean and the version is bumped in package.json.
202
+ # 2. Publish — prepublishOnly + prepack run automatically:
203
+ npm publish
204
+ # prepublishOnly: drizzle-kit generate && (typecheck + parity + build)
205
+ # prepack: trim-next.mjs strips .next/{dev,cache,trace}
206
+ # files allowlist: .next, bin, scripts, skills, docs, drizzle, configs, README, LICENSE, CHANGELOG
207
+ ```
208
+
209
+ > `package.json` is currently `"private": true` (the `//private` note: *"Keep true until the npm account exists; flip to false (or remove) to publish."*). npm refuses to publish a private package until that flag is cleared. `publishConfig.access` is already `"public"`.
210
+
211
+ To verify the exact tarball contents **without** publishing:
212
+
213
+ ```bash
214
+ npm pack # runs prepack → trim-next; writes constella-0.1.0.tgz
215
+ tar -tf constella-0.1.0.tgz | sort # inspect what would ship — confirm no src/
216
+ ```
217
+
218
+ ### Mirror the clean tree to the public Git repo
219
+
220
+ ```bash
221
+ # Dry run — generate migrations if needed, compute the publish set, secret-scan, print the count:
222
+ node scripts/publish-public.mjs
223
+ # ✓ Clean: <N> files to publish (no src/, no secrets). Migrations: <M> file(s).
224
+
225
+ # Push — build the filtered tree in a temp index and force-push to public main:
226
+ node scripts/publish-public.mjs --push
227
+ # ✓ Pushed. The npm tarball (with the prebuilt .next) is published separately via `npm publish`.
228
+ ```
229
+
230
+ ### Housekeeping before either channel
231
+
232
+ ```bash
233
+ npm run clean # scripts/clean-repo.mjs — removes scratch artifacts at the repo root
234
+ ```
235
+
236
+ `clean-repo.mjs` is idempotent and conservative: it only deletes a known set — `Constella App.html`, `extracted_design_system.css`, `tsconfig.tsbuildinfo`, and `temp_*.{js,ts,jsx,tsx,html,css}` — never source or config.
237
+
238
+ ---
239
+
240
+ ## Examples 🌠
241
+
242
+ **A clean dry-run:**
243
+
244
+ ```text
245
+ $ node scripts/publish-public.mjs
246
+ ✓ Clean: 412 files to publish (no src/, no secrets). Migrations: 7 file(s).
247
+
248
+ Dry run. To publish the clean compiled tree to the public repo, run:
249
+ node scripts/publish-public.mjs --push
250
+ ```
251
+
252
+ **A blocked run (the gate doing its job):**
253
+
254
+ ```text
255
+ $ node scripts/publish-public.mjs
256
+ ✖ Refusing to publish — 2 potential secret/sensitive/source finding(s):
257
+ - docs/notes/scratch.md: Telegram bot token
258
+ - private.pem: sensitive file
259
+ ```
260
+
261
+ Nothing is pushed; the script exits `1`. Fix the findings (move them out of the publish set, redact, or add a legitimate allow-path) and re-run the dry run until it reports clean.
262
+
263
+ **Trimming during a pack:**
264
+
265
+ ```text
266
+ $ npm pack
267
+ • trim-next: removed .next/dev
268
+ • trim-next: removed .next/cache
269
+ • trim-next: removed .next/trace
270
+ • trim-next: .next trimmed to the production runtime.
271
+ constella-0.1.0.tgz
272
+ ```
273
+
274
+ ---
275
+
276
+ ## Possible states 🪐
277
+
278
+ | State | Channel | Meaning | Exit |
279
+ | --- | --- | --- | --- |
280
+ | `Clean: N files to publish` | Git (dry run) | Publish set computed, no findings; nothing pushed | `0` |
281
+ | `Pushed` | Git (`--push`) | Filtered tree force-pushed to `public main` | `0` |
282
+ | `Refusing to publish — N finding(s)` | Git | A secret/sensitive/source path was detected | `1` |
283
+ | `src/ leaked into the public tree` | Git | A `src/` path slipped into the publish set | `1` |
284
+ | `trim-next: no .next/ — nothing to trim` | npm (`prepack`) | No build present; skip silently | `0` |
285
+ | `trim-next: .next trimmed…` | npm (`prepack`) | Dev/cache/trace removed from the build | `0` |
286
+ | `Generating DB migrations (drizzle/)…` | Git | `drizzle/` was missing; regenerated before scanning | continues |
287
+
288
+ ---
289
+
290
+ ## Related integrations 🛰️
291
+
292
+ | Integration | Relationship to publishing |
293
+ | --- | --- |
294
+ | **`drizzle-kit`** | `prepublishOnly` and `publish-public.mjs` both regenerate migrations under `drizzle/` so the schema ships as SQL, not TypeScript. |
295
+ | **Secret scanner** (`src/server/git-scan.ts`) | `publish-public.mjs` inlines a mirror of its rules; the same engine guards [GITHUB](./GITHUB.md) commits and [PREPARE_DEPLOY](./PREPARE_DEPLOY.md) exports. |
296
+ | **Update path** ([UPDATE](./UPDATE.md)) | Users pull new versions from the npm registry the tarball is published to (`registry.npmjs.org/constella/latest`). |
297
+ | **i18n parity** ([CONFIGURATION](./CONFIGURATION.md)) | `validate` runs `i18n-parity.mjs`, blocking a publish on EN ↔ PT key drift. |
298
+
299
+ ---
300
+
301
+ ## Security 🕳️
302
+
303
+ Publishing is a high-trust operation; the design assumes a mistake *will* happen and stops it at the gate.
304
+
305
+ - **Source never ships.** Both channels exclude `src/`. The Git mirror checks twice — `EXCLUDE` filters it out, then a final pass aborts if any `src/` path survived.
306
+ - **Secret-scan refuses on any finding.** `publish-public.mjs` blocks on the **first** match per file across 10 inline patterns + a sensitive-filename rule. It is deliberately conservative (`512 KB` text-file cap, placeholder-credential allowance to avoid false positives in docs).
307
+ - **`.env` and DB files are sensitive by filename.** They are blocked even if you never opened them — except the explicit allowlist (`.env.example`, etc.) and `drizzle/*.sql` DDL.
308
+ - **Force-push is intentional.** The public repo is a *clean mirror*, not a collaboration history. It carries no `.next` and no secrets, so overwriting it is safe by construction.
309
+ - **The tarball is compiled.** End users run a minified `.next` and applied SQL migrations — no readable application source, no devDependencies.
310
+ - **Secrets live outside the tree.** Runtime secrets are persisted to `<HOME>/.env` (`chmod 600`) and never in the repo; the vault key, worker secret and auth secret are generated at first boot. See [SECURITY](./SECURITY.md).
311
+
312
+ > The scanner is a safety net, not a substitute for discipline. Keep secrets in `<HOME>/.env` and the vault, never in tracked files.
313
+
314
+ ---
315
+
316
+ ## Troubleshooting 🛰️
317
+
318
+ | Symptom | Cause | Fix |
319
+ | --- | --- | --- |
320
+ | `Refusing to publish — N finding(s)` | A tracked/`drizzle` file matched a secret or sensitive-filename rule | Inspect each listed path; redact, remove from the publish set, or (for legit cases) confirm it fits an allow rule. Re-run the dry run. |
321
+ | `src/ leaked into the public tree` | A path under `src/` reached the publish set | This should be impossible via `EXCLUDE`; verify nothing force-adds `src/` and re-run. |
322
+ | `npm publish` aborts immediately | `package.json` has `"private": true` | Flip/remove `private` once the npm account exists (per the `//private` note). |
323
+ | `trim-next: no .next/ — nothing to trim` then a broken tarball | No build before packing | Run `npm run build` (or rely on `prepublishOnly`, which builds) before `npm pack`. |
324
+ | Public push fails on an empty remote | Pushing a bare commit to `main` can't infer the ref | Already handled — the script pushes `<commit>:refs/heads/main` explicitly. |
325
+ | `git push -f public …` rejected | `public` remote missing or unauthenticated | `git remote add public https://github.com/gabriel7silva/constella.git`; ensure credentials/`GIT_TERMINAL_PROMPT` allow non-interactive auth. |
326
+ | Migrations missing in the mirror | `drizzle/` was empty and generate failed | Run `npm run db:generate` manually and inspect the error before re-running. |
327
+ | EN/PT parity failure during `validate` | A dictionary key exists in one language only | Fix `src/lib/i18n.ts` so EN ↔ PT keys match; see [CONFIGURATION](./CONFIGURATION.md). |
328
+
329
+ ---
330
+
331
+ ## Related links
332
+
333
+ - [INSTALLATION](./INSTALLATION.md) — what an end user actually receives and where it lands.
334
+ - [UPDATE](./UPDATE.md) — how users pull new published versions.
335
+ - [SECURITY](./SECURITY.md) — the vault, the FS jail, and the secret-scanning engine.
336
+ - [GITHUB](./GITHUB.md) — the commit/export path that shares the secret scanner.
337
+ - [PREPARE_DEPLOY](./PREPARE_DEPLOY.md) · [DEPLOY](./DEPLOY.md) — shipping a *built product*, distinct from publishing Constella itself.
338
+ - [CONFIGURATION](./CONFIGURATION.md) — i18n parity and the validate gate.
339
+ - [ARCHITECTURE](./ARCHITECTURE.md) — the runtime root and the dir-is-truth model.
340
+
341
+ ---
342
+
343
+ <sub>✦ The shipyard is quiet, the launch is loud. Ship the product, keep the blueprints. 🚀</sub>