constella 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (747) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +53 -0
  3. package/.next/build-manifest.json +20 -0
  4. package/.next/diagnostics/build-diagnostics.json +6 -0
  5. package/.next/diagnostics/framework.json +1 -0
  6. package/.next/export-marker.json +6 -0
  7. package/.next/images-manifest.json +68 -0
  8. package/.next/next-minimal-server.js.nft.json +1 -0
  9. package/.next/next-server.js.nft.json +1 -0
  10. package/.next/package.json +1 -0
  11. package/.next/prerender-manifest.json +36 -0
  12. package/.next/react-loadable-manifest.json +14 -0
  13. package/.next/required-server-files.js +343 -0
  14. package/.next/required-server-files.json +343 -0
  15. package/.next/routes-manifest.json +362 -0
  16. package/.next/server/app/(app)/activity/page.js +2 -0
  17. package/.next/server/app/(app)/activity/page.js.nft.json +1 -0
  18. package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -0
  19. package/.next/server/app/(app)/agents/[handle]/page.js +18 -0
  20. package/.next/server/app/(app)/agents/[handle]/page.js.nft.json +1 -0
  21. package/.next/server/app/(app)/agents/[handle]/page_client-reference-manifest.js +1 -0
  22. package/.next/server/app/(app)/code/page.js +2 -0
  23. package/.next/server/app/(app)/code/page.js.nft.json +1 -0
  24. package/.next/server/app/(app)/code/page_client-reference-manifest.js +1 -0
  25. package/.next/server/app/(app)/config/page.js +2 -0
  26. package/.next/server/app/(app)/config/page.js.nft.json +1 -0
  27. package/.next/server/app/(app)/config/page_client-reference-manifest.js +1 -0
  28. package/.next/server/app/(app)/costs/page.js +2 -0
  29. package/.next/server/app/(app)/costs/page.js.nft.json +1 -0
  30. package/.next/server/app/(app)/costs/page_client-reference-manifest.js +1 -0
  31. package/.next/server/app/(app)/cron/page.js +2 -0
  32. package/.next/server/app/(app)/cron/page.js.nft.json +1 -0
  33. package/.next/server/app/(app)/cron/page_client-reference-manifest.js +1 -0
  34. package/.next/server/app/(app)/dashboard/page.js +2 -0
  35. package/.next/server/app/(app)/dashboard/page.js.nft.json +1 -0
  36. package/.next/server/app/(app)/dashboard/page_client-reference-manifest.js +1 -0
  37. package/.next/server/app/(app)/docs/[id]/page.js +2 -0
  38. package/.next/server/app/(app)/docs/[id]/page.js.nft.json +1 -0
  39. package/.next/server/app/(app)/docs/[id]/page_client-reference-manifest.js +1 -0
  40. package/.next/server/app/(app)/docs/page.js +2 -0
  41. package/.next/server/app/(app)/docs/page.js.nft.json +1 -0
  42. package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -0
  43. package/.next/server/app/(app)/github/page.js +2 -0
  44. package/.next/server/app/(app)/github/page.js.nft.json +1 -0
  45. package/.next/server/app/(app)/github/page_client-reference-manifest.js +1 -0
  46. package/.next/server/app/(app)/goals/page.js +2 -0
  47. package/.next/server/app/(app)/goals/page.js.nft.json +1 -0
  48. package/.next/server/app/(app)/goals/page_client-reference-manifest.js +1 -0
  49. package/.next/server/app/(app)/inbox/page.js +2 -0
  50. package/.next/server/app/(app)/inbox/page.js.nft.json +1 -0
  51. package/.next/server/app/(app)/inbox/page_client-reference-manifest.js +1 -0
  52. package/.next/server/app/(app)/knowledge/page.js +3 -0
  53. package/.next/server/app/(app)/knowledge/page.js.nft.json +1 -0
  54. package/.next/server/app/(app)/knowledge/page_client-reference-manifest.js +1 -0
  55. package/.next/server/app/(app)/models/page.js +2 -0
  56. package/.next/server/app/(app)/models/page.js.nft.json +1 -0
  57. package/.next/server/app/(app)/models/page_client-reference-manifest.js +1 -0
  58. package/.next/server/app/(app)/notifications/page.js +2 -0
  59. package/.next/server/app/(app)/notifications/page.js.nft.json +1 -0
  60. package/.next/server/app/(app)/notifications/page_client-reference-manifest.js +1 -0
  61. package/.next/server/app/(app)/org/page.js +2 -0
  62. package/.next/server/app/(app)/org/page.js.nft.json +1 -0
  63. package/.next/server/app/(app)/org/page_client-reference-manifest.js +1 -0
  64. package/.next/server/app/(app)/organizations/page.js +2 -0
  65. package/.next/server/app/(app)/organizations/page.js.nft.json +1 -0
  66. package/.next/server/app/(app)/organizations/page_client-reference-manifest.js +1 -0
  67. package/.next/server/app/(app)/page.js +3 -0
  68. package/.next/server/app/(app)/page.js.nft.json +1 -0
  69. package/.next/server/app/(app)/page_client-reference-manifest.js +1 -0
  70. package/.next/server/app/(app)/planner/page.js +2 -0
  71. package/.next/server/app/(app)/planner/page.js.nft.json +1 -0
  72. package/.next/server/app/(app)/planner/page_client-reference-manifest.js +1 -0
  73. package/.next/server/app/(app)/plugins/page.js +2 -0
  74. package/.next/server/app/(app)/plugins/page.js.nft.json +1 -0
  75. package/.next/server/app/(app)/plugins/page_client-reference-manifest.js +1 -0
  76. package/.next/server/app/(app)/pm/page.js +2 -0
  77. package/.next/server/app/(app)/pm/page.js.nft.json +1 -0
  78. package/.next/server/app/(app)/pm/page_client-reference-manifest.js +1 -0
  79. package/.next/server/app/(app)/prepare-deploy/page.js +19 -0
  80. package/.next/server/app/(app)/prepare-deploy/page.js.nft.json +1 -0
  81. package/.next/server/app/(app)/prepare-deploy/page_client-reference-manifest.js +1 -0
  82. package/.next/server/app/(app)/profile/page.js +2 -0
  83. package/.next/server/app/(app)/profile/page.js.nft.json +1 -0
  84. package/.next/server/app/(app)/profile/page_client-reference-manifest.js +1 -0
  85. package/.next/server/app/(app)/pulse/page.js +2 -0
  86. package/.next/server/app/(app)/pulse/page.js.nft.json +1 -0
  87. package/.next/server/app/(app)/pulse/page_client-reference-manifest.js +1 -0
  88. package/.next/server/app/(app)/reports/[id]/page.js +3 -0
  89. package/.next/server/app/(app)/reports/[id]/page.js.nft.json +1 -0
  90. package/.next/server/app/(app)/reports/[id]/page_client-reference-manifest.js +1 -0
  91. package/.next/server/app/(app)/reports/page.js +5 -0
  92. package/.next/server/app/(app)/reports/page.js.nft.json +1 -0
  93. package/.next/server/app/(app)/reports/page_client-reference-manifest.js +1 -0
  94. package/.next/server/app/(app)/routines/page.js +2 -0
  95. package/.next/server/app/(app)/routines/page.js.nft.json +1 -0
  96. package/.next/server/app/(app)/routines/page_client-reference-manifest.js +1 -0
  97. package/.next/server/app/(app)/search/page.js +2 -0
  98. package/.next/server/app/(app)/search/page.js.nft.json +1 -0
  99. package/.next/server/app/(app)/search/page_client-reference-manifest.js +1 -0
  100. package/.next/server/app/(app)/security/page.js +2 -0
  101. package/.next/server/app/(app)/security/page.js.nft.json +1 -0
  102. package/.next/server/app/(app)/security/page_client-reference-manifest.js +1 -0
  103. package/.next/server/app/(app)/skills/page.js +18 -0
  104. package/.next/server/app/(app)/skills/page.js.nft.json +1 -0
  105. package/.next/server/app/(app)/skills/page_client-reference-manifest.js +1 -0
  106. package/.next/server/app/(app)/tasks/page.js +2 -0
  107. package/.next/server/app/(app)/tasks/page.js.nft.json +1 -0
  108. package/.next/server/app/(app)/tasks/page_client-reference-manifest.js +1 -0
  109. package/.next/server/app/(app)/test-dev/page.js +2 -0
  110. package/.next/server/app/(app)/test-dev/page.js.nft.json +1 -0
  111. package/.next/server/app/(app)/test-dev/page_client-reference-manifest.js +1 -0
  112. package/.next/server/app/(app)/update/page.js +2 -0
  113. package/.next/server/app/(app)/update/page.js.nft.json +1 -0
  114. package/.next/server/app/(app)/update/page_client-reference-manifest.js +1 -0
  115. package/.next/server/app/(auth)/login/page.js +2 -0
  116. package/.next/server/app/(auth)/login/page.js.nft.json +1 -0
  117. package/.next/server/app/(auth)/login/page_client-reference-manifest.js +1 -0
  118. package/.next/server/app/(auth)/onboarding/page.js +18 -0
  119. package/.next/server/app/(auth)/onboarding/page.js.nft.json +1 -0
  120. package/.next/server/app/(auth)/onboarding/page_client-reference-manifest.js +1 -0
  121. package/.next/server/app/_global-error/page.js +32 -0
  122. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  123. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
  124. package/.next/server/app/_global-error.html +1 -0
  125. package/.next/server/app/_global-error.meta +16 -0
  126. package/.next/server/app/_global-error.rsc +15 -0
  127. package/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
  128. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +5 -0
  129. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +5 -0
  130. package/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
  131. package/.next/server/app/_global-error.segments/_index.segment.rsc +6 -0
  132. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  133. package/.next/server/app/_not-found/page.js +2 -0
  134. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  135. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  136. package/.next/server/app/api/auth/[...all]/route.js +1 -0
  137. package/.next/server/app/api/auth/[...all]/route.js.nft.json +1 -0
  138. package/.next/server/app/api/auth/[...all]/route_client-reference-manifest.js +1 -0
  139. package/.next/server/app/api/cron/tick/route.js +52 -0
  140. package/.next/server/app/api/cron/tick/route.js.nft.json +1 -0
  141. package/.next/server/app/api/cron/tick/route_client-reference-manifest.js +1 -0
  142. package/.next/server/app/api/dev-login/route.js +1 -0
  143. package/.next/server/app/api/dev-login/route.js.nft.json +1 -0
  144. package/.next/server/app/api/dev-login/route_client-reference-manifest.js +1 -0
  145. package/.next/server/app/api/locks/acquire/route.js +1 -0
  146. package/.next/server/app/api/locks/acquire/route.js.nft.json +1 -0
  147. package/.next/server/app/api/locks/acquire/route_client-reference-manifest.js +1 -0
  148. package/.next/server/app/api/models/progress/route.js +1 -0
  149. package/.next/server/app/api/models/progress/route.js.nft.json +1 -0
  150. package/.next/server/app/api/models/progress/route_client-reference-manifest.js +1 -0
  151. package/.next/server/app/api/passkey/authenticate/options/route.js +1 -0
  152. package/.next/server/app/api/passkey/authenticate/options/route.js.nft.json +1 -0
  153. package/.next/server/app/api/passkey/authenticate/options/route_client-reference-manifest.js +1 -0
  154. package/.next/server/app/api/passkey/authenticate/verify/route.js +1 -0
  155. package/.next/server/app/api/passkey/authenticate/verify/route.js.nft.json +1 -0
  156. package/.next/server/app/api/passkey/authenticate/verify/route_client-reference-manifest.js +1 -0
  157. package/.next/server/app/api/passkey/register/options/route.js +1 -0
  158. package/.next/server/app/api/passkey/register/options/route.js.nft.json +1 -0
  159. package/.next/server/app/api/passkey/register/options/route_client-reference-manifest.js +1 -0
  160. package/.next/server/app/api/passkey/register/verify/route.js +1 -0
  161. package/.next/server/app/api/passkey/register/verify/route.js.nft.json +1 -0
  162. package/.next/server/app/api/passkey/register/verify/route_client-reference-manifest.js +1 -0
  163. package/.next/server/app/api/stream/route.js +4 -0
  164. package/.next/server/app/api/stream/route.js.nft.json +1 -0
  165. package/.next/server/app/api/stream/route_client-reference-manifest.js +1 -0
  166. package/.next/server/app/api/sync/file/route.js +2 -0
  167. package/.next/server/app/api/sync/file/route.js.nft.json +1 -0
  168. package/.next/server/app/api/sync/file/route_client-reference-manifest.js +1 -0
  169. package/.next/server/app/api/telegram/poll/route.js +15 -0
  170. package/.next/server/app/api/telegram/poll/route.js.nft.json +1 -0
  171. package/.next/server/app/api/telegram/poll/route_client-reference-manifest.js +1 -0
  172. package/.next/server/app/api/upload/route.js +1 -0
  173. package/.next/server/app/api/upload/route.js.nft.json +1 -0
  174. package/.next/server/app/api/upload/route_client-reference-manifest.js +1 -0
  175. package/.next/server/app/api/v1/[[...path]]/route.js +1 -0
  176. package/.next/server/app/api/v1/[[...path]]/route.js.nft.json +1 -0
  177. package/.next/server/app/api/v1/[[...path]]/route_client-reference-manifest.js +1 -0
  178. package/.next/server/app-paths-manifest.json +53 -0
  179. package/.next/server/chunks/1003.js +1 -0
  180. package/.next/server/chunks/127.js +26 -0
  181. package/.next/server/chunks/1388.js +1 -0
  182. package/.next/server/chunks/1408.js +21 -0
  183. package/.next/server/chunks/1572.js +1 -0
  184. package/.next/server/chunks/1591.js +24 -0
  185. package/.next/server/chunks/1619.js +188 -0
  186. package/.next/server/chunks/162.js +1 -0
  187. package/.next/server/chunks/1881.js +1 -0
  188. package/.next/server/chunks/1968.js +1 -0
  189. package/.next/server/chunks/2297.js +348 -0
  190. package/.next/server/chunks/2341.js +1 -0
  191. package/.next/server/chunks/2517.js +1 -0
  192. package/.next/server/chunks/2549.js +1 -0
  193. package/.next/server/chunks/259.js +14 -0
  194. package/.next/server/chunks/2599.js +1 -0
  195. package/.next/server/chunks/260.js +1 -0
  196. package/.next/server/chunks/2867.js +147 -0
  197. package/.next/server/chunks/3018.js +1 -0
  198. package/.next/server/chunks/3050.js +18 -0
  199. package/.next/server/chunks/3085.js +12 -0
  200. package/.next/server/chunks/3131.js +1 -0
  201. package/.next/server/chunks/3242.js +1 -0
  202. package/.next/server/chunks/3266.js +15 -0
  203. package/.next/server/chunks/3524.js +1 -0
  204. package/.next/server/chunks/3527.js +479 -0
  205. package/.next/server/chunks/3533.js +869 -0
  206. package/.next/server/chunks/3550.js +1 -0
  207. package/.next/server/chunks/3609.js +2 -0
  208. package/.next/server/chunks/3667.js +462 -0
  209. package/.next/server/chunks/3760.js +4 -0
  210. package/.next/server/chunks/4679.js +1 -0
  211. package/.next/server/chunks/4804.js +1 -0
  212. package/.next/server/chunks/4832.js +2 -0
  213. package/.next/server/chunks/4853.js +1 -0
  214. package/.next/server/chunks/4979.js +67 -0
  215. package/.next/server/chunks/5060.js +1 -0
  216. package/.next/server/chunks/5278.js +1 -0
  217. package/.next/server/chunks/5614.js +1 -0
  218. package/.next/server/chunks/5818.js +1 -0
  219. package/.next/server/chunks/6479.js +1 -0
  220. package/.next/server/chunks/6658.js +1 -0
  221. package/.next/server/chunks/6706.js +1 -0
  222. package/.next/server/chunks/6719.js +1 -0
  223. package/.next/server/chunks/678.js +1 -0
  224. package/.next/server/chunks/683.js +1 -0
  225. package/.next/server/chunks/6862.js +1 -0
  226. package/.next/server/chunks/6882.js +1 -0
  227. package/.next/server/chunks/7037.js +1 -0
  228. package/.next/server/chunks/7107.js +741 -0
  229. package/.next/server/chunks/73.js +17 -0
  230. package/.next/server/chunks/7327.js +1 -0
  231. package/.next/server/chunks/7514.js +1 -0
  232. package/.next/server/chunks/7622.js +1 -0
  233. package/.next/server/chunks/7778.js +1 -0
  234. package/.next/server/chunks/7912.js +1 -0
  235. package/.next/server/chunks/7949.js +1 -0
  236. package/.next/server/chunks/7971.js +1 -0
  237. package/.next/server/chunks/7989.js +1 -0
  238. package/.next/server/chunks/842.js +22 -0
  239. package/.next/server/chunks/8762.js +15 -0
  240. package/.next/server/chunks/8823.js +77 -0
  241. package/.next/server/chunks/9146.js +4 -0
  242. package/.next/server/chunks/9676.js +1 -0
  243. package/.next/server/chunks/9783.js +22 -0
  244. package/.next/server/chunks/9969.js +3 -0
  245. package/.next/server/functions-config-manifest.json +18 -0
  246. package/.next/server/instrumentation.js +1 -0
  247. package/.next/server/instrumentation.js.nft.json +1 -0
  248. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  249. package/.next/server/middleware-build-manifest.js +1 -0
  250. package/.next/server/middleware-manifest.json +6 -0
  251. package/.next/server/middleware-react-loadable-manifest.js +1 -0
  252. package/.next/server/middleware.js +18 -0
  253. package/.next/server/middleware.js.nft.json +1 -0
  254. package/.next/server/next-font-manifest.js +1 -0
  255. package/.next/server/next-font-manifest.json +1 -0
  256. package/.next/server/pages/500.html +1 -0
  257. package/.next/server/pages-manifest.json +3 -0
  258. package/.next/server/prefetch-hints.json +1 -0
  259. package/.next/server/server-reference-manifest.js +1 -0
  260. package/.next/server/server-reference-manifest.json +1 -0
  261. package/.next/server/webpack-runtime.js +1 -0
  262. package/.next/static/chunks/1858-339516f78a4b00da.js +1 -0
  263. package/.next/static/chunks/2320-fc8b39380e69d465.js +2 -0
  264. package/.next/static/chunks/23550918-ff694f70f4b0648c.js +1 -0
  265. package/.next/static/chunks/3219-ebb3c23be38c838d.js +1 -0
  266. package/.next/static/chunks/4263-adecb5b466380b6e.js +1 -0
  267. package/.next/static/chunks/5479-0cceab68cd0ca9c7.js +1 -0
  268. package/.next/static/chunks/5701-665b927b06158b76.js +1 -0
  269. package/.next/static/chunks/5920.6451a68b63918988.js +1 -0
  270. package/.next/static/chunks/6575-5c9139720bb0f5bf.js +4 -0
  271. package/.next/static/chunks/6834-4759af1ce7d95fb6.js +32 -0
  272. package/.next/static/chunks/7509.721cd47a931c5518.js +1 -0
  273. package/.next/static/chunks/8264-1ca011989ee2b231.js +1 -0
  274. package/.next/static/chunks/9219-4a39a98b5502d9d1.js +1 -0
  275. package/.next/static/chunks/9690-53d5222618cbeddb.js +1 -0
  276. package/.next/static/chunks/app/(app)/activity/page-3973534281ecea81.js +1 -0
  277. package/.next/static/chunks/app/(app)/agents/[handle]/page-83662a175c098282.js +1 -0
  278. package/.next/static/chunks/app/(app)/code/page-33979545192cd137.js +1 -0
  279. package/.next/static/chunks/app/(app)/config/page-9933aed1ca8a85c1.js +1 -0
  280. package/.next/static/chunks/app/(app)/costs/page-131c4dc580efcc19.js +1 -0
  281. package/.next/static/chunks/app/(app)/cron/page-53ea1aff998a87ca.js +1 -0
  282. package/.next/static/chunks/app/(app)/dashboard/page-deed83aaa9d0d447.js +1 -0
  283. package/.next/static/chunks/app/(app)/docs/[id]/page-38c993d73c0eab4f.js +1 -0
  284. package/.next/static/chunks/app/(app)/docs/page-bf463b55d0554e86.js +1 -0
  285. package/.next/static/chunks/app/(app)/error-988cd28480809861.js +1 -0
  286. package/.next/static/chunks/app/(app)/github/page-62678b4e82dfecb6.js +1 -0
  287. package/.next/static/chunks/app/(app)/goals/page-4adb426fe1c96106.js +1 -0
  288. package/.next/static/chunks/app/(app)/inbox/page-e347dc55ab467310.js +1 -0
  289. package/.next/static/chunks/app/(app)/knowledge/page-65393a045b4349be.js +1 -0
  290. package/.next/static/chunks/app/(app)/layout-7f65675705b011d8.js +1 -0
  291. package/.next/static/chunks/app/(app)/models/page-e01f1dd7e49a2951.js +1 -0
  292. package/.next/static/chunks/app/(app)/notifications/page-56548ac87aef00da.js +1 -0
  293. package/.next/static/chunks/app/(app)/org/page-699e6a6dc0db7d81.js +1 -0
  294. package/.next/static/chunks/app/(app)/organizations/page-36051a380a7e8eb7.js +1 -0
  295. package/.next/static/chunks/app/(app)/page-7d1011a566f81520.js +1 -0
  296. package/.next/static/chunks/app/(app)/planner/page-dab7ced94083373a.js +1 -0
  297. package/.next/static/chunks/app/(app)/plugins/page-5b5a1f53389be42e.js +1 -0
  298. package/.next/static/chunks/app/(app)/pm/page-0de5c08c0b227bb0.js +1 -0
  299. package/.next/static/chunks/app/(app)/prepare-deploy/page-e426038552df8d41.js +1 -0
  300. package/.next/static/chunks/app/(app)/profile/page-608dfcaf8aae0a69.js +1 -0
  301. package/.next/static/chunks/app/(app)/pulse/page-309ccaca91de1faa.js +1 -0
  302. package/.next/static/chunks/app/(app)/reports/[id]/page-53ea1aff998a87ca.js +1 -0
  303. package/.next/static/chunks/app/(app)/reports/page-68cdc6dcfa472d86.js +1 -0
  304. package/.next/static/chunks/app/(app)/routines/page-bcc55550b197a9fa.js +1 -0
  305. package/.next/static/chunks/app/(app)/search/page-5c5f67558d0dbf0d.js +1 -0
  306. package/.next/static/chunks/app/(app)/security/page-a7d41e36aa366b45.js +1 -0
  307. package/.next/static/chunks/app/(app)/skills/page-c5b21e89593b8336.js +1 -0
  308. package/.next/static/chunks/app/(app)/tasks/page-08ae079e3e54d2ce.js +1 -0
  309. package/.next/static/chunks/app/(app)/test-dev/page-633f82dfd9c3ce23.js +1 -0
  310. package/.next/static/chunks/app/(app)/update/page-4be019054351bfac.js +1 -0
  311. package/.next/static/chunks/app/(auth)/login/page-6e85d3377062acae.js +1 -0
  312. package/.next/static/chunks/app/(auth)/onboarding/page-ebb10c175abf3b85.js +1 -0
  313. package/.next/static/chunks/app/_global-error/page-23fe50a6bf589c97.js +1 -0
  314. package/.next/static/chunks/app/_not-found/page-dc38b02aebeab535.js +1 -0
  315. package/.next/static/chunks/app/api/auth/[...all]/route-23fe50a6bf589c97.js +1 -0
  316. package/.next/static/chunks/app/api/cron/tick/route-23fe50a6bf589c97.js +1 -0
  317. package/.next/static/chunks/app/api/dev-login/route-23fe50a6bf589c97.js +1 -0
  318. package/.next/static/chunks/app/api/locks/acquire/route-23fe50a6bf589c97.js +1 -0
  319. package/.next/static/chunks/app/api/models/progress/route-23fe50a6bf589c97.js +1 -0
  320. package/.next/static/chunks/app/api/passkey/authenticate/options/route-23fe50a6bf589c97.js +1 -0
  321. package/.next/static/chunks/app/api/passkey/authenticate/verify/route-23fe50a6bf589c97.js +1 -0
  322. package/.next/static/chunks/app/api/passkey/register/options/route-23fe50a6bf589c97.js +1 -0
  323. package/.next/static/chunks/app/api/passkey/register/verify/route-23fe50a6bf589c97.js +1 -0
  324. package/.next/static/chunks/app/api/stream/route-23fe50a6bf589c97.js +1 -0
  325. package/.next/static/chunks/app/api/sync/file/route-23fe50a6bf589c97.js +1 -0
  326. package/.next/static/chunks/app/api/telegram/poll/route-23fe50a6bf589c97.js +1 -0
  327. package/.next/static/chunks/app/api/upload/route-23fe50a6bf589c97.js +1 -0
  328. package/.next/static/chunks/app/api/v1/[[...path]]/route-23fe50a6bf589c97.js +1 -0
  329. package/.next/static/chunks/app/error-09899a13c38b6e89.js +1 -0
  330. package/.next/static/chunks/app/global-error-b8050d4d886f448c.js +1 -0
  331. package/.next/static/chunks/app/layout-ab9deed1e7e2e9df.js +1 -0
  332. package/.next/static/chunks/framework-4b2c6b6043dd203f.js +1 -0
  333. package/.next/static/chunks/main-722e16032e7764d1.js +5 -0
  334. package/.next/static/chunks/main-app-761880af2b6f1962.js +1 -0
  335. package/.next/static/chunks/next/dist/client/components/builtin/app-error-23fe50a6bf589c97.js +1 -0
  336. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-23fe50a6bf589c97.js +1 -0
  337. package/.next/static/chunks/next/dist/client/components/builtin/not-found-23fe50a6bf589c97.js +1 -0
  338. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-23fe50a6bf589c97.js +1 -0
  339. package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  340. package/.next/static/chunks/webpack-222e3894b78c67db.js +1 -0
  341. package/.next/static/css/0a9b5805594444e3.css +1 -0
  342. package/.next/static/yztMvBwyrWWkSqP6jfXoa/_buildManifest.js +1 -0
  343. package/.next/static/yztMvBwyrWWkSqP6jfXoa/_ssgManifest.js +1 -0
  344. package/.next/trace-build +1 -0
  345. package/.next/types/app/(app)/activity/page.ts +87 -0
  346. package/.next/types/app/(app)/agents/[handle]/page.ts +87 -0
  347. package/.next/types/app/(app)/code/page.ts +87 -0
  348. package/.next/types/app/(app)/config/page.ts +87 -0
  349. package/.next/types/app/(app)/costs/page.ts +87 -0
  350. package/.next/types/app/(app)/cron/page.ts +87 -0
  351. package/.next/types/app/(app)/dashboard/page.ts +87 -0
  352. package/.next/types/app/(app)/docs/[id]/page.ts +87 -0
  353. package/.next/types/app/(app)/docs/page.ts +87 -0
  354. package/.next/types/app/(app)/github/page.ts +87 -0
  355. package/.next/types/app/(app)/goals/page.ts +87 -0
  356. package/.next/types/app/(app)/inbox/page.ts +87 -0
  357. package/.next/types/app/(app)/knowledge/page.ts +87 -0
  358. package/.next/types/app/(app)/models/page.ts +87 -0
  359. package/.next/types/app/(app)/notifications/page.ts +87 -0
  360. package/.next/types/app/(app)/org/page.ts +87 -0
  361. package/.next/types/app/(app)/organizations/page.ts +87 -0
  362. package/.next/types/app/(app)/page.ts +87 -0
  363. package/.next/types/app/(app)/planner/page.ts +87 -0
  364. package/.next/types/app/(app)/plugins/page.ts +87 -0
  365. package/.next/types/app/(app)/pm/page.ts +87 -0
  366. package/.next/types/app/(app)/prepare-deploy/page.ts +87 -0
  367. package/.next/types/app/(app)/profile/page.ts +87 -0
  368. package/.next/types/app/(app)/pulse/page.ts +87 -0
  369. package/.next/types/app/(app)/reports/[id]/page.ts +87 -0
  370. package/.next/types/app/(app)/reports/page.ts +87 -0
  371. package/.next/types/app/(app)/routines/page.ts +87 -0
  372. package/.next/types/app/(app)/search/page.ts +87 -0
  373. package/.next/types/app/(app)/security/page.ts +87 -0
  374. package/.next/types/app/(app)/skills/page.ts +87 -0
  375. package/.next/types/app/(app)/tasks/page.ts +87 -0
  376. package/.next/types/app/(app)/test-dev/page.ts +87 -0
  377. package/.next/types/app/(app)/update/page.ts +87 -0
  378. package/.next/types/app/(auth)/login/page.ts +87 -0
  379. package/.next/types/app/(auth)/onboarding/page.ts +87 -0
  380. package/.next/types/app/api/auth/[...all]/route.ts +351 -0
  381. package/.next/types/app/api/cron/tick/route.ts +351 -0
  382. package/.next/types/app/api/dev-login/route.ts +351 -0
  383. package/.next/types/app/api/locks/acquire/route.ts +351 -0
  384. package/.next/types/app/api/models/progress/route.ts +351 -0
  385. package/.next/types/app/api/passkey/authenticate/options/route.ts +351 -0
  386. package/.next/types/app/api/passkey/authenticate/verify/route.ts +351 -0
  387. package/.next/types/app/api/passkey/register/options/route.ts +351 -0
  388. package/.next/types/app/api/passkey/register/verify/route.ts +351 -0
  389. package/.next/types/app/api/stream/route.ts +351 -0
  390. package/.next/types/app/api/sync/file/route.ts +351 -0
  391. package/.next/types/app/api/telegram/poll/route.ts +351 -0
  392. package/.next/types/app/api/upload/route.ts +351 -0
  393. package/.next/types/app/api/v1/[[...path]]/route.ts +351 -0
  394. package/.next/types/cache-life.d.ts +145 -0
  395. package/.next/types/link.d.ts +210 -0
  396. package/.next/types/package.json +1 -0
  397. package/.next/types/routes.d.ts +120 -0
  398. package/.next/types/validator.ts +511 -0
  399. package/CHANGELOG.md +312 -0
  400. package/LICENSE +21 -0
  401. package/README.md +382 -0
  402. package/README.pt-BR.md +391 -0
  403. package/bin/constella.mjs +329 -0
  404. package/bin/guard-hook.mjs +44 -0
  405. package/bin/lock-hook.mjs +49 -0
  406. package/bin/worker.mjs +142 -0
  407. package/docs/assets/arch-orbit.svg +56 -0
  408. package/docs/assets/blackhole.svg +37 -0
  409. package/docs/assets/divider-orbit.svg +23 -0
  410. package/docs/assets/hero-constella.svg +72 -0
  411. package/docs/en/AGENTS.md +279 -0
  412. package/docs/en/AI_ARCHITECTURE.md +373 -0
  413. package/docs/en/ARCHITECTURE.md +334 -0
  414. package/docs/en/AUTH_MODE.md +247 -0
  415. package/docs/en/CHAT_COMMANDS.md +305 -0
  416. package/docs/en/CONFIGURATION.md +340 -0
  417. package/docs/en/DEPLOY.md +331 -0
  418. package/docs/en/DM.md +297 -0
  419. package/docs/en/FAQ.md +258 -0
  420. package/docs/en/GITHUB.md +341 -0
  421. package/docs/en/GOALS_SPECS_ISSUES.md +303 -0
  422. package/docs/en/INBOX.md +340 -0
  423. package/docs/en/INSTALLATION.md +329 -0
  424. package/docs/en/KB_AGENT.md +305 -0
  425. package/docs/en/KB_RAG.md +356 -0
  426. package/docs/en/MCP.md +313 -0
  427. package/docs/en/MEMORY_RAG.md +289 -0
  428. package/docs/en/MODELS.md +341 -0
  429. package/docs/en/ONBOARDING.md +327 -0
  430. package/docs/en/PLUGINS.md +290 -0
  431. package/docs/en/PORTABLE_MODE.md +387 -0
  432. package/docs/en/PO_AGENT.md +379 -0
  433. package/docs/en/PREPARE_DEPLOY.md +308 -0
  434. package/docs/en/PROJECT_STACKS.md +258 -0
  435. package/docs/en/PUBLIC_API.md +315 -0
  436. package/docs/en/PUBLISHING.md +343 -0
  437. package/docs/en/README.md +95 -0
  438. package/docs/en/SECURITY.md +280 -0
  439. package/docs/en/SKILLS.md +349 -0
  440. package/docs/en/START_MODE.md +340 -0
  441. package/docs/en/SYNCED_BLOCKS.md +320 -0
  442. package/docs/en/TEAM_ROOM.md +285 -0
  443. package/docs/en/TELEGRAM.md +294 -0
  444. package/docs/en/TEST_DEV.md +321 -0
  445. package/docs/en/TROUBLESHOOTING.md +294 -0
  446. package/docs/en/UPDATE.md +301 -0
  447. package/docs/en/VPS_MODE.md +334 -0
  448. package/docs/en/WORKFLOW.md +321 -0
  449. package/docs/pt/AGENTS.md +279 -0
  450. package/docs/pt/AI_ARCHITECTURE.md +373 -0
  451. package/docs/pt/ARCHITECTURE.md +334 -0
  452. package/docs/pt/AUTH_MODE.md +247 -0
  453. package/docs/pt/CHAT_COMMANDS.md +307 -0
  454. package/docs/pt/CONFIGURATION.md +340 -0
  455. package/docs/pt/DEPLOY.md +331 -0
  456. package/docs/pt/DM.md +297 -0
  457. package/docs/pt/FAQ.md +258 -0
  458. package/docs/pt/GITHUB.md +341 -0
  459. package/docs/pt/GOALS_SPECS_ISSUES.md +303 -0
  460. package/docs/pt/INBOX.md +340 -0
  461. package/docs/pt/INSTALLATION.md +329 -0
  462. package/docs/pt/KB_AGENT.md +305 -0
  463. package/docs/pt/KB_RAG.md +356 -0
  464. package/docs/pt/MCP.md +313 -0
  465. package/docs/pt/MEMORY_RAG.md +289 -0
  466. package/docs/pt/MODELS.md +341 -0
  467. package/docs/pt/ONBOARDING.md +327 -0
  468. package/docs/pt/PLUGINS.md +290 -0
  469. package/docs/pt/PORTABLE_MODE.md +387 -0
  470. package/docs/pt/PO_AGENT.md +379 -0
  471. package/docs/pt/PREPARE_DEPLOY.md +308 -0
  472. package/docs/pt/PROJECT_STACKS.md +258 -0
  473. package/docs/pt/PUBLIC_API.md +315 -0
  474. package/docs/pt/PUBLISHING.md +343 -0
  475. package/docs/pt/README.md +95 -0
  476. package/docs/pt/SECURITY.md +280 -0
  477. package/docs/pt/SKILLS.md +349 -0
  478. package/docs/pt/START_MODE.md +340 -0
  479. package/docs/pt/SYNCED_BLOCKS.md +320 -0
  480. package/docs/pt/TEAM_ROOM.md +285 -0
  481. package/docs/pt/TELEGRAM.md +294 -0
  482. package/docs/pt/TEST_DEV.md +321 -0
  483. package/docs/pt/TROUBLESHOOTING.md +294 -0
  484. package/docs/pt/UPDATE.md +301 -0
  485. package/docs/pt/VPS_MODE.md +334 -0
  486. package/docs/pt/WORKFLOW.md +321 -0
  487. package/drizzle/0000_regular_nightshade.sql +644 -0
  488. package/drizzle/0001_mixed_zombie.sql +106 -0
  489. package/drizzle/meta/0000_snapshot.json +4650 -0
  490. package/drizzle/meta/0001_snapshot.json +5418 -0
  491. package/drizzle/meta/_journal.json +20 -0
  492. package/drizzle.config.mjs +16 -0
  493. package/next.config.mjs +18 -0
  494. package/package.json +130 -0
  495. package/scripts/clean-repo.mjs +20 -0
  496. package/scripts/dev-all.mjs +46 -0
  497. package/scripts/i18n-parity.mjs +57 -0
  498. package/scripts/mcp-server.mjs +100 -0
  499. package/scripts/postbuild.mjs +11 -0
  500. package/scripts/publish-public.mjs +116 -0
  501. package/scripts/start-all.mjs +45 -0
  502. package/scripts/trim-next.mjs +23 -0
  503. package/scripts/vps-install.sh +39 -0
  504. package/skills/CONTRIBUTING.md +122 -0
  505. package/skills/COVERAGE.md +129 -0
  506. package/skills/INDEX.json +3443 -0
  507. package/skills/README.md +57 -0
  508. package/skills/design/animation-motion/SKILL.md +60 -0
  509. package/skills/design/color-and-typography/SKILL.md +60 -0
  510. package/skills/design/css-techniques/SKILL.md +58 -0
  511. package/skills/design/design-systems/SKILL.md +60 -0
  512. package/skills/design/gradients/SKILL.md +59 -0
  513. package/skills/design/graphic-design-basics/SKILL.md +55 -0
  514. package/skills/design/microinteractions/SKILL.md +58 -0
  515. package/skills/design/responsive-layout/SKILL.md +59 -0
  516. package/skills/design/ui-ux-principles/SKILL.md +58 -0
  517. package/skills/engineering/architecture/api-design-rest-graphql/SKILL.md +67 -0
  518. package/skills/engineering/architecture/caching-strategies/SKILL.md +59 -0
  519. package/skills/engineering/architecture/data-modeling/SKILL.md +64 -0
  520. package/skills/engineering/architecture/message-queues-async/SKILL.md +58 -0
  521. package/skills/engineering/architecture/scalability-reliability/SKILL.md +62 -0
  522. package/skills/engineering/architecture/software-architecture-patterns/SKILL.md +56 -0
  523. package/skills/engineering/architecture/system-design-fundamentals/SKILL.md +56 -0
  524. package/skills/engineering/backend/auth-and-authorization/SKILL.md +62 -0
  525. package/skills/engineering/backend/backend-fundamentals/SKILL.md +65 -0
  526. package/skills/engineering/backend/observability-logging/SKILL.md +60 -0
  527. package/skills/engineering/frontend/accessibility-wcag/SKILL.md +57 -0
  528. package/skills/engineering/frontend/frontend-architecture/SKILL.md +65 -0
  529. package/skills/engineering/frontend/rendering-strategies-ssr-csr/SKILL.md +60 -0
  530. package/skills/engineering/frontend/state-management/SKILL.md +69 -0
  531. package/skills/engineering/performance/backend-performance/SKILL.md +69 -0
  532. package/skills/engineering/performance/database-query-optimization/SKILL.md +64 -0
  533. package/skills/engineering/performance/profiling-and-benchmarking/SKILL.md +60 -0
  534. package/skills/engineering/performance/web-performance-core-vitals/SKILL.md +72 -0
  535. package/skills/engineering/practices/clean-code/SKILL.md +61 -0
  536. package/skills/engineering/practices/code-optimization/SKILL.md +60 -0
  537. package/skills/engineering/practices/code-review-practices/SKILL.md +58 -0
  538. package/skills/engineering/practices/git-workflow/SKILL.md +62 -0
  539. package/skills/engineering/practices/refactoring/SKILL.md +58 -0
  540. package/skills/engineering/security/appsec-fundamentals/SKILL.md +70 -0
  541. package/skills/engineering/security/dependency-supply-chain/SKILL.md +77 -0
  542. package/skills/engineering/security/owasp-asvs/SKILL.md +54 -0
  543. package/skills/engineering/security/owasp-top-10/SKILL.md +63 -0
  544. package/skills/engineering/security/secrets-management/SKILL.md +58 -0
  545. package/skills/engineering/security/secure-auth-sessions/SKILL.md +56 -0
  546. package/skills/engineering/testing/tdd-and-coverage/SKILL.md +62 -0
  547. package/skills/engineering/testing/testing-strategy-pyramid/SKILL.md +56 -0
  548. package/skills/engineering/testing/unit-integration-e2e/SKILL.md +75 -0
  549. package/skills/languages/c/SKILL.md +74 -0
  550. package/skills/languages/clojure/SKILL.md +73 -0
  551. package/skills/languages/cpp/SKILL.md +75 -0
  552. package/skills/languages/csharp/SKILL.md +75 -0
  553. package/skills/languages/dart/SKILL.md +82 -0
  554. package/skills/languages/elixir/SKILL.md +74 -0
  555. package/skills/languages/erlang/SKILL.md +76 -0
  556. package/skills/languages/go/SKILL.md +83 -0
  557. package/skills/languages/haskell/SKILL.md +70 -0
  558. package/skills/languages/java/SKILL.md +71 -0
  559. package/skills/languages/javascript/SKILL.md +62 -0
  560. package/skills/languages/kotlin/SKILL.md +68 -0
  561. package/skills/languages/lua/SKILL.md +79 -0
  562. package/skills/languages/objectivec/SKILL.md +83 -0
  563. package/skills/languages/php/SKILL.md +74 -0
  564. package/skills/languages/python/SKILL.md +68 -0
  565. package/skills/languages/r/SKILL.md +70 -0
  566. package/skills/languages/ruby/SKILL.md +67 -0
  567. package/skills/languages/rust/SKILL.md +72 -0
  568. package/skills/languages/scala/SKILL.md +73 -0
  569. package/skills/languages/swift/SKILL.md +73 -0
  570. package/skills/languages/typescript/SKILL.md +69 -0
  571. package/skills/meta/authoring-agent-skills/SKILL.md +73 -0
  572. package/skills/meta/progressive-disclosure/SKILL.md +65 -0
  573. package/skills/meta/skill-frontmatter-spec/SKILL.md +65 -0
  574. package/skills/process/adr-technical-decisions/SKILL.md +59 -0
  575. package/skills/process/app-planning/SKILL.md +63 -0
  576. package/skills/process/architecture-before-code/SKILL.md +52 -0
  577. package/skills/process/breaking-work-into-sprints/SKILL.md +53 -0
  578. package/skills/process/idea-to-product/SKILL.md +50 -0
  579. package/skills/process/mocks-and-screen-flows/SKILL.md +52 -0
  580. package/skills/process/prioritization-moscow-rice/SKILL.md +64 -0
  581. package/skills/process/problem-framing/SKILL.md +51 -0
  582. package/skills/process/product-discovery/SKILL.md +53 -0
  583. package/skills/process/readme-generation/SKILL.md +90 -0
  584. package/skills/process/requirements-to-specs/SKILL.md +53 -0
  585. package/skills/process/research-official-docs/SKILL.md +58 -0
  586. package/skills/process/review-code-perf-security/SKILL.md +65 -0
  587. package/skills/process/security-by-design/SKILL.md +68 -0
  588. package/skills/process/specs-to-issues/SKILL.md +53 -0
  589. package/skills/process/testing-before-done/SKILL.md +61 -0
  590. package/skills/process/validating-ux-navigation/SKILL.md +63 -0
  591. package/skills/references/ai-attachments-ui/SKILL.md +66 -0
  592. package/skills/references/ai-in-browser-webllm/SKILL.md +74 -0
  593. package/skills/references/ai-tool-ui-patterns/SKILL.md +63 -0
  594. package/skills/references/component-patterns-gallery/SKILL.md +62 -0
  595. package/skills/references/gradient-resources/SKILL.md +66 -0
  596. package/skills/references/react-component-libraries/SKILL.md +61 -0
  597. package/skills/references/saas-landing-patterns/SKILL.md +67 -0
  598. package/skills/references/shadcn-tailwind-theming/SKILL.md +74 -0
  599. package/skills/references/vercel-ai-sdk-elements/SKILL.md +66 -0
  600. package/skills/references/web-animation-codrops/SKILL.md +68 -0
  601. package/skills/stacks/aiml/jupyter/SKILL.md +68 -0
  602. package/skills/stacks/aiml/keras/SKILL.md +77 -0
  603. package/skills/stacks/aiml/numpy/SKILL.md +69 -0
  604. package/skills/stacks/aiml/pandas/SKILL.md +72 -0
  605. package/skills/stacks/aiml/pytorch/SKILL.md +77 -0
  606. package/skills/stacks/aiml/scikit-learn/SKILL.md +74 -0
  607. package/skills/stacks/aiml/tensorflow/SKILL.md +79 -0
  608. package/skills/stacks/auth/auth0/SKILL.md +63 -0
  609. package/skills/stacks/auth/authjs/SKILL.md +69 -0
  610. package/skills/stacks/auth/clerk/SKILL.md +72 -0
  611. package/skills/stacks/auth/keycloak/SKILL.md +63 -0
  612. package/skills/stacks/auth/lucia/SKILL.md +56 -0
  613. package/skills/stacks/auth/passport/SKILL.md +70 -0
  614. package/skills/stacks/auth/supabase-auth/SKILL.md +66 -0
  615. package/skills/stacks/baas/amplify/SKILL.md +71 -0
  616. package/skills/stacks/baas/appwrite/SKILL.md +79 -0
  617. package/skills/stacks/baas/firebase/SKILL.md +73 -0
  618. package/skills/stacks/baas/heroku/SKILL.md +71 -0
  619. package/skills/stacks/backend/actix/SKILL.md +77 -0
  620. package/skills/stacks/backend/adonisjs/SKILL.md +65 -0
  621. package/skills/stacks/backend/aspnet-core/SKILL.md +75 -0
  622. package/skills/stacks/backend/codeigniter/SKILL.md +76 -0
  623. package/skills/stacks/backend/django/SKILL.md +62 -0
  624. package/skills/stacks/backend/express/SKILL.md +65 -0
  625. package/skills/stacks/backend/fastapi/SKILL.md +64 -0
  626. package/skills/stacks/backend/fastify/SKILL.md +64 -0
  627. package/skills/stacks/backend/fiber/SKILL.md +68 -0
  628. package/skills/stacks/backend/flask/SKILL.md +71 -0
  629. package/skills/stacks/backend/gin/SKILL.md +68 -0
  630. package/skills/stacks/backend/graphql/SKILL.md +70 -0
  631. package/skills/stacks/backend/hono/SKILL.md +64 -0
  632. package/skills/stacks/backend/koa/SKILL.md +63 -0
  633. package/skills/stacks/backend/laravel/SKILL.md +73 -0
  634. package/skills/stacks/backend/nestjs/SKILL.md +70 -0
  635. package/skills/stacks/backend/nginx/SKILL.md +77 -0
  636. package/skills/stacks/backend/phoenix/SKILL.md +68 -0
  637. package/skills/stacks/backend/rails/SKILL.md +67 -0
  638. package/skills/stacks/backend/spring/SKILL.md +70 -0
  639. package/skills/stacks/backend/spring-boot/SKILL.md +70 -0
  640. package/skills/stacks/backend/symfony/SKILL.md +77 -0
  641. package/skills/stacks/container/containerd/SKILL.md +75 -0
  642. package/skills/stacks/container/docker/SKILL.md +90 -0
  643. package/skills/stacks/container/podman/SKILL.md +93 -0
  644. package/skills/stacks/database/cassandra/SKILL.md +74 -0
  645. package/skills/stacks/database/cockroachdb/SKILL.md +69 -0
  646. package/skills/stacks/database/dynamodb/SKILL.md +62 -0
  647. package/skills/stacks/database/mariadb/SKILL.md +71 -0
  648. package/skills/stacks/database/mongodb/SKILL.md +71 -0
  649. package/skills/stacks/database/mysql/SKILL.md +72 -0
  650. package/skills/stacks/database/neon/SKILL.md +68 -0
  651. package/skills/stacks/database/planetscale/SKILL.md +70 -0
  652. package/skills/stacks/database/postgresql/SKILL.md +81 -0
  653. package/skills/stacks/database/redis/SKILL.md +78 -0
  654. package/skills/stacks/database/sqlite/SKILL.md +70 -0
  655. package/skills/stacks/database/supabase/SKILL.md +79 -0
  656. package/skills/stacks/dataviz/chart-js/SKILL.md +72 -0
  657. package/skills/stacks/dataviz/d3/SKILL.md +77 -0
  658. package/skills/stacks/dataviz/grafana/SKILL.md +69 -0
  659. package/skills/stacks/dataviz/plotly/SKILL.md +71 -0
  660. package/skills/stacks/frontend/alpine/SKILL.md +75 -0
  661. package/skills/stacks/frontend/angular/SKILL.md +75 -0
  662. package/skills/stacks/frontend/backbone/SKILL.md +82 -0
  663. package/skills/stacks/frontend/ember/SKILL.md +85 -0
  664. package/skills/stacks/frontend/htmx/SKILL.md +73 -0
  665. package/skills/stacks/frontend/lit/SKILL.md +76 -0
  666. package/skills/stacks/frontend/preact/SKILL.md +74 -0
  667. package/skills/stacks/frontend/qwik/SKILL.md +65 -0
  668. package/skills/stacks/frontend/react/SKILL.md +77 -0
  669. package/skills/stacks/frontend/solidjs/SKILL.md +75 -0
  670. package/skills/stacks/frontend/svelte/SKILL.md +70 -0
  671. package/skills/stacks/frontend/vue/SKILL.md +69 -0
  672. package/skills/stacks/infra/ansible/SKILL.md +76 -0
  673. package/skills/stacks/infra/aws/SKILL.md +66 -0
  674. package/skills/stacks/infra/azure/SKILL.md +72 -0
  675. package/skills/stacks/infra/circleci/SKILL.md +78 -0
  676. package/skills/stacks/infra/cloudflare/SKILL.md +65 -0
  677. package/skills/stacks/infra/fly-io/SKILL.md +63 -0
  678. package/skills/stacks/infra/gcp/SKILL.md +66 -0
  679. package/skills/stacks/infra/jenkins/SKILL.md +73 -0
  680. package/skills/stacks/infra/kubernetes/SKILL.md +64 -0
  681. package/skills/stacks/infra/netlify/SKILL.md +60 -0
  682. package/skills/stacks/infra/railway/SKILL.md +63 -0
  683. package/skills/stacks/infra/tailscale/SKILL.md +65 -0
  684. package/skills/stacks/infra/terraform/SKILL.md +75 -0
  685. package/skills/stacks/infra/vagrant/SKILL.md +70 -0
  686. package/skills/stacks/infra/vercel/SKILL.md +60 -0
  687. package/skills/stacks/meta/astro/SKILL.md +64 -0
  688. package/skills/stacks/meta/docusaurus/SKILL.md +71 -0
  689. package/skills/stacks/meta/eleventy/SKILL.md +69 -0
  690. package/skills/stacks/meta/gatsby/SKILL.md +63 -0
  691. package/skills/stacks/meta/hugo/SKILL.md +73 -0
  692. package/skills/stacks/meta/jekyll/SKILL.md +70 -0
  693. package/skills/stacks/meta/nextjs/SKILL.md +62 -0
  694. package/skills/stacks/meta/nuxt/SKILL.md +66 -0
  695. package/skills/stacks/meta/remix/SKILL.md +67 -0
  696. package/skills/stacks/meta/sveltekit/SKILL.md +70 -0
  697. package/skills/stacks/meta/vite/SKILL.md +63 -0
  698. package/skills/stacks/mobile/android/SKILL.md +77 -0
  699. package/skills/stacks/mobile/flutter/SKILL.md +77 -0
  700. package/skills/stacks/mobile/ionic/SKILL.md +72 -0
  701. package/skills/stacks/mobile/nativescript/SKILL.md +71 -0
  702. package/skills/stacks/mobile/react-native/SKILL.md +75 -0
  703. package/skills/stacks/mobile/xamarin/SKILL.md +73 -0
  704. package/skills/stacks/orm/diesel/SKILL.md +72 -0
  705. package/skills/stacks/orm/django-orm/SKILL.md +58 -0
  706. package/skills/stacks/orm/drizzle/SKILL.md +67 -0
  707. package/skills/stacks/orm/gorm/SKILL.md +73 -0
  708. package/skills/stacks/orm/knex/SKILL.md +64 -0
  709. package/skills/stacks/orm/mongoose/SKILL.md +64 -0
  710. package/skills/stacks/orm/prisma/SKILL.md +64 -0
  711. package/skills/stacks/orm/sequelize/SKILL.md +65 -0
  712. package/skills/stacks/orm/sqlalchemy/SKILL.md +71 -0
  713. package/skills/stacks/orm/typeorm/SKILL.md +70 -0
  714. package/skills/stacks/queue/bullmq/SKILL.md +69 -0
  715. package/skills/stacks/queue/celery/SKILL.md +68 -0
  716. package/skills/stacks/queue/kafka/SKILL.md +66 -0
  717. package/skills/stacks/queue/nats/SKILL.md +66 -0
  718. package/skills/stacks/queue/rabbitmq/SKILL.md +64 -0
  719. package/skills/stacks/queue/redis/SKILL.md +66 -0
  720. package/skills/stacks/runtime/beam/SKILL.md +72 -0
  721. package/skills/stacks/runtime/bun/SKILL.md +80 -0
  722. package/skills/stacks/runtime/deno/SKILL.md +74 -0
  723. package/skills/stacks/runtime/dotnet/SKILL.md +64 -0
  724. package/skills/stacks/runtime/jvm/SKILL.md +66 -0
  725. package/skills/stacks/runtime/node/SKILL.md +70 -0
  726. package/skills/stacks/runtime/pypy/SKILL.md +69 -0
  727. package/skills/stacks/runtime/python3/SKILL.md +70 -0
  728. package/skills/stacks/styling/bootstrap/SKILL.md +74 -0
  729. package/skills/stacks/styling/bulma/SKILL.md +80 -0
  730. package/skills/stacks/styling/chakra-ui/SKILL.md +61 -0
  731. package/skills/stacks/styling/css-modules/SKILL.md +54 -0
  732. package/skills/stacks/styling/mui/SKILL.md +60 -0
  733. package/skills/stacks/styling/sass/SKILL.md +63 -0
  734. package/skills/stacks/styling/shadcn-ui/SKILL.md +58 -0
  735. package/skills/stacks/styling/styled-components/SKILL.md +62 -0
  736. package/skills/stacks/styling/tailwind/SKILL.md +59 -0
  737. package/skills/stacks/styling/unocss/SKILL.md +64 -0
  738. package/skills/stacks/styling/vanilla-extract/SKILL.md +64 -0
  739. package/skills/stacks/styling/vuetify/SKILL.md +89 -0
  740. package/skills/stacks/testing/cypress/SKILL.md +68 -0
  741. package/skills/stacks/testing/jasmine/SKILL.md +67 -0
  742. package/skills/stacks/testing/jest/SKILL.md +67 -0
  743. package/skills/stacks/testing/mocha/SKILL.md +71 -0
  744. package/skills/stacks/testing/playwright/SKILL.md +68 -0
  745. package/skills/stacks/testing/puppeteer/SKILL.md +70 -0
  746. package/skills/stacks/testing/selenium/SKILL.md +70 -0
  747. package/skills/stacks/testing/vitest/SKILL.md +68 -0
@@ -0,0 +1,327 @@
1
+ [← Docs index](./README.md) · [🇧🇷 Português](../pt/ONBOARDING.md) · [✦ Constella](../../README.md)
2
+
3
+ # Onboarding 🌌 — Igniting a New Constellation
4
+
5
+ The first-run wizard that turns an empty runtime into a live agent-company: it creates the organization + workspace, scaffolds the `.claude/` control layer, ignites the ten-agent constellation, seeds skills and plugins, optionally imports an existing project, and hands the operator to the CEO Planner.
6
+
7
+ ---
8
+
9
+ ## When to use
10
+
11
+ - **The very first launch.** With no organization yet, [`requireWorkspace()`](../en/ARCHITECTURE.md) redirects to `/onboarding` automatically (`src/lib/workspace.ts`).
12
+ - **Forcing the wizard again.** Launch with `npx constella --onboarding` (or the `onboard` / `onboarding` subcommand). `bin/constella.mjs` sets `CONSTELLA_FORCE_ONBOARDING=1`, which `requireWorkspace()` honours by redirecting to `/onboarding` even when an org exists.
13
+ - **Creating an additional organization** for an operator who already has one (the wizard shows a Close button only in that case).
14
+
15
+ > 🪐 Onboarding is a *one-shot trap*. The moment `completeOnboarding()` runs it calls `delete process.env.CONSTELLA_FORCE_ONBOARDING`, so the next `requireWorkspace()` no longer re-routes here.
16
+
17
+ ---
18
+
19
+ ## How it works
20
+
21
+ Onboarding is a five-step client wizard (`src/app/(auth)/onboarding/page.tsx`) backed by a single server action, `completeOnboarding()` in `src/server/onboarding.ts`. The wizard collects the company identity, the CEO's brain (provider + model), a real connection test, the project stack, and a brief / source — then the server action does the heavy lifting:
22
+
23
+ 1. Create `organization` + `member` (owner) + `workspace` rows. The active run mode (`getRunMode()`) is stored on `organization.runMode`.
24
+ 2. Optionally register a fallback provider and vault its key.
25
+ 3. **Import** existing material (GitHub repo or local directory) *before* scaffolding, so the imported `README.md` survives.
26
+ 4. **Scaffold** the `.claude/` control layer plus `DOCS/`, `PO/`, `Reports/`, `specs/`, `issues/` (`scaffoldWorkspace`).
27
+ 5. For a truly-new project only, write a **runnable starter** (`scaffoldProjectStarter`).
28
+ 6. Persist the project source descriptor on `workspace.settings.source` (with `analyzed: false`).
29
+ 7. Create the **ten agents**, apply the operator's CEO choices to Ada, and store the brief at `.claude/BRIEF.md`.
30
+ 8. Write any attached mock files to `mock/`.
31
+ 9. Seed the native + library **skills**, reconcile stack/role links, and create the four native **plugins**.
32
+ 10. Mark the org active on the session and `redirect("/planner")`.
33
+
34
+ The **first plan** (fired later when the operator clicks *Generate plan* on `/planner`) runs the file-by-file analysis that produces `specs/SUPER-SPEC.md` — see [First-plan analysis](#first-plan-analysis-) below.
35
+
36
+ ---
37
+
38
+ ## Main flow 🛰️
39
+
40
+ ```mermaid
41
+ flowchart TD
42
+ L["npx constella<br/>(no org yet)"] --> RW["requireWorkspace()"]
43
+ RW -->|no org / FORCE=1| OB["/onboarding wizard"]
44
+ OB --> S0["1 · Company<br/>name · mission · objective"]
45
+ S0 --> S1["2 · CEO brain<br/>provider + model"]
46
+ S1 --> S2["3 · Connection test<br/>env → adapter → connection → model"]
47
+ S2 --> S3["4 · Project stack<br/>17 categories"]
48
+ S3 --> S4["5 · Brief & source<br/>new | github | local · mock · system prompt"]
49
+ S4 --> CO["completeOnboarding()"]
50
+ CO --> ORG["create org + workspace + member"]
51
+ ORG --> IMP{"source?"}
52
+ IMP -->|github| GH["cloneRepoIntoWorkspace()"]
53
+ IMP -->|local| LD["copyLocalDirIntoWorkspace()"]
54
+ IMP -->|new| NEW["no import"]
55
+ GH --> SCAF["scaffoldWorkspace()<br/>(preserveReadme if imported)"]
56
+ LD --> SCAF
57
+ NEW --> SCAF
58
+ SCAF --> ST{"has material?"}
59
+ ST -->|no| STARTER["scaffoldProjectStarter()<br/>runnable dev server"]
60
+ ST -->|yes| SKIP["starter suppressed"]
61
+ STARTER --> AG["create 10 agents · brief · skills · plugins"]
62
+ SKIP --> AG
63
+ AG --> RP["redirect('/planner')"]
64
+ RP --> GP["operator clicks Generate plan"]
65
+ GP --> ANA{"hasMaterial && !analyzed?"}
66
+ ANA -->|yes| SS["analyzeExistingProject()<br/>→ specs/SUPER-SPEC.md"]
67
+ ANA -->|no| PLAN["draft specs + issues"]
68
+ SS --> PLAN
69
+ ```
70
+
71
+ ---
72
+
73
+ ## The five wizard steps 🌠
74
+
75
+ The step keys are fixed in `STEP_KEYS = ["company", "ceoModel", "connection", "stack", "brief"]`.
76
+
77
+ | # | Step | What the operator provides | Required |
78
+ |---|---|---|---|
79
+ | 0 | **Company** | `company` name, `mission`, `objective` | All three |
80
+ | 1 | **CEO brain** | Pick a detected `provider` + `model` (or register one with an API key) | A provider + model |
81
+ | 2 | **Connection test** | A real four-stage check: `checkSetupEnv` → `checkAdapter` → `testConnection` → `probeModel` | Must pass |
82
+ | 3 | **Project stack** | Choose from 17 stack categories (browse cards or search) | Optional (any/all can stay `None`) |
83
+ | 4 | **Brief & source** | Project `source` (new/github/local), optional brief, optional mock folder, Ada's `systemPrompt` | `systemPrompt` + a ready source |
84
+
85
+ A few behaviours worth noting from the code:
86
+
87
+ - **Provider detection** runs on mount (`detectProviders()`); the first detected provider + its first model are pre-selected.
88
+ - **The connection test is real** — no fake timers. Each stage is an actual probe; a failed stage shows its error and blocks *Continue*. The verified `adapter:model` is cached (`testedKey`), so going Back → Continue does not re-run the checks unless the provider or model changed.
89
+ - **Stack** has no auto-selection; the operator picks every category manually. Incompatible options are disabled (`incompat()`), and `stackNote()` surfaces a hint.
90
+ - **Finish** packs everything (`source`, `provider`, `model`, `systemPrompt`, `briefText`/`briefName`, `mockFiles`, optional `providerCatalogId`/`providerKey`) into `completeOnboarding()`.
91
+
92
+ ---
93
+
94
+ ## Project source: `new | github | local` 🕳️
95
+
96
+ Step 5 chooses where the product comes from. The `source` field of `OnboardingInput` is one of:
97
+
98
+ ```ts
99
+ source?:
100
+ | { type: "new" }
101
+ | { type: "github"; pat: string; repoFull: string; branch?: string; login?: string }
102
+ | { type: "local"; path: string };
103
+ ```
104
+
105
+ | Source | Import function | Effect | README |
106
+ |---|---|---|---|
107
+ | `new` | none | Fresh project; a **runnable starter** is scaffolded | Generated `README.md` written |
108
+ | `github` | `cloneRepoIntoWorkspace()` | Shallow-clones `owner/repo` into the workspace, vaults the PAT as `github_pat`, points `origin` at the **clean** (token-free) URL | Repo's own README preserved |
109
+ | `local` | `copyLocalDirIntoWorkspace()` | Copies a snapshot of an absolute local directory into the workspace | Repo's own README preserved |
110
+
111
+ Plus an implicit fourth source: **mock** — when `source.type === "new"` *and* `mockFiles` are attached, `sourceMeta.type` becomes `"mock"`.
112
+
113
+ ### Import rules (from `onboarding-import.ts`)
114
+
115
+ - Heavy/dependency directories are skipped (`HEAVY_DIRS`); `.git`, `.env*` (but **not** `.env.example`/`.sample`), `.DS_Store`, binaries, and oversize files (> 512 KB each) are skipped.
116
+ - Local import is capped at `DEFAULT_MAX_FILES = 4000` files; `DEFAULT_MAX_BYTES = 512 * 1024`.
117
+ - Every write goes through `writeWorkspaceFile()` → `safe()` (path-jailed; traversal rejected).
118
+ - GitHub clone uses `git clone --depth 1 --single-branch` (optional `--branch`) into a temp dir with a transient `x-access-token:<pat>@github.com` URL, then copies in and points `origin` at `https://github.com/<owner>/<repo>.git`. The token is **redacted** from every returned/logged string.
119
+ - `validateLocalDir(path)` (server action via `scanLocalDir`) checks the path is absolute and a real directory with importable files; it returns a `fileCount` + an 8-file `sample` (no file contents leaked).
120
+
121
+ ### `preserveReadme` — why the imported README wins
122
+
123
+ After import, `completeOnboarding()` computes `importedReadme = readWorkspaceFile(orgId, "README.md") != null` and passes `preserveReadme` to `scaffoldWorkspace()`. In `workspaceFiles()` the generated `README.md` is only added when `!c.preserveReadme`, so an imported repo keeps its **own** README while the `.claude/` control layer lands on top.
124
+
125
+ ---
126
+
127
+ ## The runnable starter (truly-new projects only) 🚀
128
+
129
+ When there is **no material** (`hasMaterial = sourceMeta.type !== "new" || hasMock` is `false`), `scaffoldProjectStarter()` writes a real, configured app that boots a dev server out of the box — so [Test Dev](../en/TEST_DEV.md) can preview it immediately and the agents build the product *on top of* it. The starter is written **absent-only**, so agent edits are never clobbered, and it is **not** part of `workspaceFiles()` (so `bootstrapWorkspace`/`rerenderMissionDocs` can never overwrite product code).
130
+
131
+ The template is chosen by `pickStarter(stack)` in `src/data/project-starter.ts`. The selection precedence: meta-framework → explicit static/no-framework → Vite baseline by frontend → backend framework → language fallback → the always-bootable `static` Node server.
132
+
133
+ ### Starter ids (`StarterId`)
134
+
135
+ | `StarterId` | Picked when (examples) | Boots |
136
+ |---|---|---|
137
+ | `next` | `meta = "Next.js"` | `next dev` |
138
+ | `vite-react` | `frontend = "React"` (or TS/JS language fallback) | `vite` |
139
+ | `vite-vue` | `frontend = "Vue"` | `vite` |
140
+ | `vite-svelte` | `frontend = "Svelte"` or `meta = "SvelteKit"` | `vite` |
141
+ | `node-express` | `backend = "Express"` | `node server.js` |
142
+ | `node-fastify` | `backend = "Fastify"` | `node server.js` |
143
+ | `node-koa` | `backend = "Koa"` | `node server.js` |
144
+ | `node-hono` | `backend = "Hono"` | `node server.js` |
145
+ | `node-nest` | `backend = "NestJS"` | `tsx watch src/main.ts` |
146
+ | `fastapi` | `backend = "FastAPI"` | `uvicorn` |
147
+ | `flask` | `backend = "Flask"` or `language = "Python"` | `python main.py` |
148
+ | `django` | `backend = "Django"` | `manage.py` |
149
+ | `go-http` | `language = "Go"` | `net/http` |
150
+ | `go-gin` | `backend = "Gin"` | `gin` |
151
+ | `rust-axum` | `language = "Rust"` | `axum` |
152
+ | `rust-actix` | `backend = "Actix"` | `actix-web` |
153
+ | `static` | `HTML/CSS`, `Vanilla JS`, `Static (no framework)`, or anything unknown | pure Node `http` |
154
+
155
+ > 🌠 The `static` template is the **universal fallback**: Node is always present, so every project boots *something* regardless of stack.
156
+
157
+ Each starter ships a themed, self-contained landing page (deterministic per-company palette via `paletteFor()`), a `.gitignore`, an `.env.example`, and a `PORT`-aware server bound to `127.0.0.1`. The page reads "Your AI team is building **\<objective\>** on top of this starter."
158
+
159
+ ---
160
+
161
+ ## First-plan analysis → `specs/SUPER-SPEC.md` 🌌
162
+
163
+ When the project has material (imported repo, copied local dir, attached mock, **or** a detected project on disk), the **first** plan does not jump straight to specs. In `src/server/planner-core.ts`:
164
+
165
+ ```ts
166
+ const hasMaterial = srcType !== "new" || mockFiles.length > 0 || !!detectProject(org.id);
167
+ if (!isNewWork && hasMaterial && !wsSettings.source?.analyzed) {
168
+ await analyzeExistingProject({ orgId, wsId, ada, binary, model });
169
+ // → mark settings.source.analyzed = true
170
+ }
171
+ ```
172
+
173
+ `analyzeExistingProject()` (`src/server/analyze.ts`) runs a **real agent pass** as Ada (`cwd = workspace`, reads files literally), streamed to the `planner` channel, that writes/overwrites `specs/SUPER-SPEC.md`. It runs **once per project** — guarded by `settings.source.analyzed`. The agent is instructed to read in order: docs → manifests/config → source file-by-file (skipping `node_modules`, `dist`, `build`, `.next`, `.git`, `vendor`), then write these sections:
174
+
175
+ `## Overview & purpose` · `## Architecture & layers` · `## Tech stack & dependencies` · `## Directory / module map` · `## Frontend` · `## Backend` · `## Data model & database` · `## Auth & security` · `## Integrations / external services` · `## Business rules & key flows` · `## What is mock/stubbed vs real` · `## Gaps to make it production-real`.
176
+
177
+ The crucial framing: Constella **extends** the exact existing system — it must call out which UI/UX, behaviour and visual identity to **preserve** and where to **add** real backend/data/integrations; it never builds a second separate prototype. The CEO planner then reads `specs/SUPER-SPEC.md` in full before drafting specs and issues, and the `runner` injects the same "extend the existing code" framing into each task (`src/server/runner.ts`). If the agent forgets to write the file, `analyzeExistingProject()` writes its final summary text as the super spec so the deliverable always exists.
178
+
179
+ ---
180
+
181
+ ## What `completeOnboarding()` creates 🪐
182
+
183
+ | Artifact | Where | Notes |
184
+ |---|---|---|
185
+ | `organization` | DB | `runMode` from `getRunMode()` |
186
+ | `member` | DB | role `owner` |
187
+ | `workspace` | DB | `mission`, `objective`, `stack`; `settings.source` + optional `settings.github` |
188
+ | `.claude/` control layer | disk | org/workspace/permissions/memory/routing/index/CLAUDE.md/settings.json |
189
+ | Project starter | disk | only when no material (`scaffoldProjectStarter`) |
190
+ | 10 agents | DB | Ada `working`, others `idle`; health `alive` |
191
+ | Ada CEO overrides | DB + `.claude/agents/ada/Agent.md` | `adapter`, `model`, system prompt |
192
+ | `.claude/BRIEF.md` | disk | when `briefText` provided |
193
+ | `mock/` files | disk | up to 200 files + a generated `mock/README.md` |
194
+ | `budget` | DB | `monthlyCapUsd: 400` |
195
+ | `plan` | DB | `stage: 4` |
196
+ | Native + library skills | DB + disk | 6 procedural skills + the whole skills library; `reconcileStackRoleSkills()` links per stack/role |
197
+ | 4 native plugins | DB | GitHub, Telegram, Vault (enabled), Web Search (off by default) |
198
+ | Active org on session | DB | then `redirect("/planner")` |
199
+
200
+ ### The ten agents
201
+
202
+ | Handle | Name | Role | Reports to | Model | Daily cap (USD) | Tier |
203
+ |---|---|---|---|---|---|---|
204
+ | `ada` | Ada | CEO | — | opus¹ | 15 | critical |
205
+ | `linus` | Linus | CTO | `ada` | sonnet | 40 | critical |
206
+ | `donald` | Donald | Product Owner | `ada` | haiku | 20 | heavy |
207
+ | `margaret` | Margaret | Backend | `linus` | sonnet | 50 | heavy |
208
+ | `grace` | Grace | Frontend | `linus` | sonnet | 45 | heavy |
209
+ | `edsger` | Edsger | QA | `linus` | haiku | 25 | heavy |
210
+ | `werner` | Werner | DevOps | `linus` | haiku | 20 | heavy |
211
+ | `barbara` | Barbara | Docs | `ada` | haiku | 15 | light |
212
+ | `whitfield` | Whitfield | CyberSec | `linus` | opus | 30 | critical |
213
+ | `vannevar` | Vannevar | Knowledge | `ada` | haiku | 10 | light |
214
+
215
+ ¹ Ada's persona file defaults to `sonnet`, but the operator's CEO-brain choice (`provider`/`model`) overrides it during onboarding. The daily caps are USD ceilings; the workspace also gets a `monthlyCapUsd: 400` budget.
216
+
217
+ ---
218
+
219
+ ## Step-by-step (operator) ✦
220
+
221
+ 1. **Launch.** `npx constella` (or `--onboarding` to force the wizard).
222
+ 2. **Company.** Enter the company name, mission and objective. All three are required.
223
+ 3. **CEO brain.** Pick a detected provider + model, or expand *Register* to add one with a model id and API key.
224
+ 4. **Connection test.** Watch the four real checks pass. Fix any failing stage before continuing.
225
+ 5. **Stack.** Browse the 17 category cards (or search) and pick what applies; leave the rest as `None`.
226
+ 6. **Brief & source.** Choose `new`, `github` (paste a PAT → list repos → pick one) or `local` (type an absolute path → Validate). Optionally paste a brief and/or attach a mock folder. Edit Ada's system prompt.
227
+ 7. **Hand off.** Click the finish button. The wizard calls `completeOnboarding()` and redirects to `/planner`.
228
+ 8. **Generate plan.** On the Planner, click *Generate plan* to fire the CEO ritual (and, for imported/mock projects, the one-time super-spec analysis).
229
+
230
+ ---
231
+
232
+ ## Examples
233
+
234
+ **Force the wizard from the CLI:**
235
+
236
+ ```bash
237
+ npx constella --onboarding
238
+ # or the explicit subcommand
239
+ npx constella onboard
240
+ ```
241
+
242
+ **Import a GitHub repo at onboarding** — the wizard sends:
243
+
244
+ ```ts
245
+ source = { type: "github", pat: "ghp_…", repoFull: "acme/web-app", branch: "main", login: "acme" }
246
+ ```
247
+
248
+ → `cloneRepoIntoWorkspace()` shallow-clones `acme/web-app`, vaults the PAT, sets `origin` to the clean URL, and `preserveReadme` keeps the repo's README.
249
+
250
+ **Import a local directory:**
251
+
252
+ ```ts
253
+ source = { type: "local", path: "C:\\Users\\you\\project" }
254
+ ```
255
+
256
+ → `validateLocalDir()` confirms it, then `copyLocalDirIntoWorkspace()` snapshots up to 4000 files (skipping deps/secrets/binaries).
257
+
258
+ ---
259
+
260
+ ## Possible states 🕳️
261
+
262
+ | State | Meaning | Where |
263
+ |---|---|---|
264
+ | `CONSTELLA_FORCE_ONBOARDING=1` | Wizard forced; cleared on first `completeOnboarding()` | `bin/constella.mjs`, `workspace.ts`, `onboarding.ts` |
265
+ | `source.type = new` | Fresh project; runnable starter scaffolded | `workspace.settings.source` |
266
+ | `source.type = github\|local\|mock` | Imported material; starter suppressed | `workspace.settings.source` |
267
+ | `source.analyzed = false` | First plan will run the super-spec analysis | `workspace.settings.source` |
268
+ | `source.analyzed = true` | Analysis done; planner reads `specs/SUPER-SPEC.md` | set by `planner-core.ts` |
269
+ | import failed | Logged to console; org still created; `sourceMeta` recomputed from what landed | `onboarding.ts` |
270
+ | agent status | Ada `working`, the rest `idle`; health `alive` | `agent` table |
271
+
272
+ ---
273
+
274
+ ## Related integrations 🛰️
275
+
276
+ - **[Project stacks](../en/PROJECT_STACKS.md)** — the chosen `stack` drives the starter template and skill linking.
277
+ - **[Skills](../en/SKILLS.md)** — `seedLibrarySkills` + `reconcileStackRoleSkills` link each agent to the skills its stack and role need.
278
+ - **[Plugins](../en/PLUGINS.md)** — GitHub, Telegram, Vault and Web Search are created as native plugins.
279
+ - **[GitHub](../en/GITHUB.md)** — repo import, PAT vaulting and `origin` cleanup.
280
+ - **[Models](../en/MODELS.md)** — provider/model detection and the connection test.
281
+ - **[Workflow](../en/WORKFLOW.md)** / **[Goals, specs & issues](../en/GOALS_SPECS_ISSUES.md)** — what the first plan produces after onboarding.
282
+ - **[Test Dev](../en/TEST_DEV.md)** — boots the runnable starter for an immediate preview.
283
+
284
+ ---
285
+
286
+ ## Security 🔒
287
+
288
+ - **Path jail.** Every imported file is written through `writeWorkspaceFile()` → `safe()` (lexical + symlink checks; traversal rejected; paths starting with `..` skipped).
289
+ - **Token hygiene.** The GitHub PAT is used only transiently in the clone URL, then `origin` is reset to the clean `https://github.com/<owner>/<repo>.git`; the token is redacted from all returned/logged strings and vaulted as `github_pat` (AES-256-GCM via the [Vault](../en/SECURITY.md)).
290
+ - **Secret skipping on import.** `.env`, `.env.local`, `.env.development`, `.env.production` and `.DS_Store` are never copied (`.env.example`/`.sample` are kept); binaries and oversize files are skipped.
291
+ - **Honest empty state.** No fake goals/tasks/specs/issues are seeded — boards start real-empty; real artifacts come from the CEO ritual and agent runs.
292
+ - **Mode-bound permissions.** The org/workspace `runMode` (from `getRunMode()`) determines the agent permission mode the runner later applies (`bypassPermissions` in `start`, `acceptEdits` otherwise) — see [Security](../en/SECURITY.md).
293
+
294
+ ---
295
+
296
+ ## Troubleshooting
297
+
298
+ | Symptom | Likely cause | Fix |
299
+ |---|---|---|
300
+ | Wizard reopens after finishing | `CONSTELLA_FORCE_ONBOARDING` still set in the env | It is cleared in-process on first `completeOnboarding()`; remove the `--onboarding` flag / unset the env var on relaunch |
301
+ | *Continue* disabled on the test step | A real check failed (`env`/`adapter`/`connection`/`model`) | Read the inline error; fix the provider/CLI/API key, then re-select the provider to re-verify |
302
+ | GitHub *List repos* fails | Bad/expired PAT or no `repo` scope | Use a valid token; `githubReposForToken()` returns the error string |
303
+ | Local *Validate* fails | Path not absolute, not a directory, or empty | `scanLocalDir()` requires an absolute path to a directory with importable files |
304
+ | Imported repo shows the generated README | `preserveReadme` not triggered (no top-level `README.md` in the import) | Add a `README.md` to the source; otherwise the generated one is expected |
305
+ | No `specs/SUPER-SPEC.md` after Generate plan | Project had no material, or `source.analyzed` was already `true` | Analysis only runs once, and only with material; check `workspace.settings.source` |
306
+ | Starter not created | The project had material (`hasMaterial`) | By design — agents extend the imported/mock material instead |
307
+
308
+ ---
309
+
310
+ ## Related links
311
+
312
+ - [Installation](./INSTALLATION.md)
313
+ - [Configuration](./CONFIGURATION.md)
314
+ - [Architecture](./ARCHITECTURE.md)
315
+ - [AI Architecture](./AI_ARCHITECTURE.md)
316
+ - [Agents](./AGENTS.md)
317
+ - [Workflow](./WORKFLOW.md)
318
+ - [Goals, specs & issues](./GOALS_SPECS_ISSUES.md)
319
+ - [Project stacks](./PROJECT_STACKS.md)
320
+ - [Skills](./SKILLS.md)
321
+ - [Plugins](./PLUGINS.md)
322
+ - [Models](./MODELS.md)
323
+ - [GitHub](./GITHUB.md)
324
+ - [Test Dev](./TEST_DEV.md)
325
+ - [Security](./SECURITY.md)
326
+ - [Troubleshooting](./TROUBLESHOOTING.md)
327
+ - [FAQ](./FAQ.md)
@@ -0,0 +1,290 @@
1
+ [← Docs index](./README.md) · [🇧🇷 Português](../pt/PLUGINS.md) · [✦ Constella](../../README.md)
2
+
3
+ # 🛰️ Plugins — Docking Bays for Capabilities
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ A **plugin** in Constella is a workspace-scoped catalog entry that names a capability the agent constellation can dock with: GitHub, Telegram, the Vault, Web Search. The plugin row is a registry and a switch — the *real* behaviour lives in dedicated modules, gated by their own settings, secrets and env vars.
8
+
9
+ > Mental model: plugins are the **docking bays** on the central ship. The bay tells you a capability *exists* and whether its bay door is open (`enabled`). The engine that the bay leads to (the GitHub engine, the Telegram relay, the Vault) is wired elsewhere.
10
+
11
+ ---
12
+
13
+ ## When to use 🌌
14
+
15
+ - You want to see, at a glance, which **native integrations** this workspace ships with.
16
+ - You want to flip a capability's catalog switch on or off (`togglePlugin`).
17
+ - You are registering a placeholder for a third-party extension you intend to wire up later (`installPlugin` — **PARTIAL / mock**, see below).
18
+ - You need to tell **plugins** apart from **Skills** (agent knowledge) and from **external MCP servers** (tools the `claude` CLI consumes). All three are different layers — section [Plugins vs Skills vs external MCP](#plugins-vs-skills-vs-external-mcp-).
19
+
20
+ If you are looking for *agent abilities* (prompt-level knowledge that shapes how an agent works), that is **Skills**, not plugins — see [SKILLS.md](./SKILLS.md).
21
+
22
+ ---
23
+
24
+ ## How it works 🪐
25
+
26
+ There is exactly one table and three server actions. Nothing more — the surface area is deliberately tiny.
27
+
28
+ ### The `plugin` table
29
+
30
+ Source: `src/db/schema.ts`.
31
+
32
+ ```ts
33
+ export const plugin = sqliteTable("plugin", {
34
+ id: text("id").primaryKey(),
35
+ workspaceId: text("workspace_id").notNull().references(() => workspace.id, { onDelete: "cascade" }),
36
+ name: text("name").notNull(),
37
+ description: text("description").notNull().default(""),
38
+ enabled: integer("enabled", { mode: "boolean" }).notNull().default(false),
39
+ native: integer("native", { mode: "boolean" }).notNull().default(false),
40
+ });
41
+ ```
42
+
43
+ | Column | Type | Default | Meaning |
44
+ |---------------|-----------|---------|---------|
45
+ | `id` | text PK | — | UUID (`randomUUID()`). |
46
+ | `workspaceId` | text FK | — | Owning workspace; `ON DELETE CASCADE` — plugins die with the workspace. |
47
+ | `name` | text | — | Display name (`"GitHub"`, `"Telegram"`, …). |
48
+ | `description` | text | `""` | One-line description shown in the grid. |
49
+ | `enabled` | boolean | `false` | Bay-door switch. `installPlugin` seeds new rows as `true`; some native rows seed `false`. |
50
+ | `native` | boolean | `false` | `true` = shipped by onboarding; cannot be removed from the UI. |
51
+
52
+ Every row is scoped to a single `workspaceId`. There is no global plugin registry — each workspace has its own constellation of docking bays.
53
+
54
+ ### Server actions
55
+
56
+ Source: `src/server/actions/plugin-actions.ts` (a sibling `togglePlugin` also exists in `src/server/modules.ts`).
57
+
58
+ | Action | Signature | What it does |
59
+ |--------|-----------|--------------|
60
+ | `togglePlugin` | `(id: string, enabled: boolean)` | Sets `plugin.enabled` for a row scoped to the current workspace, then `revalidatePath("/plugins")`. |
61
+ | `installPlugin` | `(name: string, description = "")` | **PARTIAL / mock.** Inserts a new non-native row (`enabled: true`, `native: false`) named after the URL/name. Does **not** download, verify, sandbox or wire anything. Returns `{ ok }`. |
62
+ | `removePlugin` | `(id: string)` | Deletes a row — but the `WHERE` clause includes `eq(plugin.native, false)`, so **native plugins can never be removed**. |
63
+
64
+ Every action calls `requireWorkspace()` first, so all writes are workspace-isolated and authenticated.
65
+
66
+ ---
67
+
68
+ ## Main flow 🌠
69
+
70
+ ```mermaid
71
+ flowchart TD
72
+ OB["Onboarding<br/>completeOnboarding()"] -->|"seeds 4 native rows"| TBL[("plugin table<br/>workspace-scoped")]
73
+ UI["/plugins page<br/>PluginGrid"] -->|"toggle switch"| TOGGLE["togglePlugin(id, enabled)"]
74
+ UI -->|"Install from URL"| INSTALL["installPlugin(name)<br/>PARTIAL / mock"]
75
+ UI -->|"Remove (non-native only)"| REMOVE["removePlugin(id)"]
76
+ TOGGLE --> TBL
77
+ INSTALL --> TBL
78
+ REMOVE --> TBL
79
+ TBL -. "catalog only" .-> ENG["Real engines<br/>github.ts · telegram.ts · vault.ts · cli.ts web research"]
80
+ ENG -.->|"gated by their OWN settings/secrets/env"| AGENTS["Agent constellation"]
81
+ ```
82
+
83
+ The dashed edge is the important nuance: the `plugin` table is a **catalog and display layer**. The real capability engines are wired through their own modules and are gated by their own configuration — not by `plugin.enabled`. Flipping the GitHub plugin switch does not, by itself, set a repo or store a token; that happens in the GitHub integration (`src/server/github.ts`). See [Native plugins](#native-plugins-).
84
+
85
+ ---
86
+
87
+ ## Key concepts 🕳️
88
+
89
+ - **Workspace-scoped.** Every plugin belongs to one workspace; there is no shared/global plugin store.
90
+ - **Native vs installed.** `native: true` rows are seeded by onboarding and are permanent (the UI hides the remove button; `removePlugin` ignores them). `native: false` rows come from `installPlugin` and can be removed.
91
+ - **Catalog, not gate.** `enabled` is a registry switch and a UI signal. The native integrations enforce their own enablement through secrets and settings — e.g. GitHub needs a vaulted `github_pat` or OAuth token, Telegram needs a vaulted `telegram_bot_token`, Web Search is gated by `CONSTELLA_WEB_RESEARCH` / per-workspace `settings.agents.webResearch`.
92
+ - **`installPlugin` is a placeholder.** It is honest about being a mock: the code comment reads *"mock — just registers it disabled"* and the description defaults to `"Installed from URL"`. No code fetches, validates or executes the URL.
93
+
94
+ ---
95
+
96
+ ## Native plugins 🚀
97
+
98
+ Seeded once during onboarding. Source: `src/server/modules.ts`:
99
+
100
+ ```ts
101
+ const plugins: [string, string, boolean][] = [
102
+ ["GitHub", "Commit, push & open PRs from the workspace.", true],
103
+ ["Telegram", "Route reports and alerts to a channel.", true],
104
+ ["Vault", "Encrypted secret storage for provider keys.", true],
105
+ ["Web Search", "Let agents look things up while planning.", false],
106
+ ];
107
+ ```
108
+
109
+ | Plugin | Seeded `enabled` | Real engine | Gated by | Docs |
110
+ |--------|------------------|-------------|----------|------|
111
+ | **GitHub** | `true` | `src/server/github.ts` (`setRepo`, `refreshGitStatus`, commit/push, `scanForSecrets`) | Vaulted `github_pat` (preferred) or OAuth `account.accessToken`; `settings.github.repo` | [GITHUB.md](./GITHUB.md) |
112
+ | **Telegram** | `true` | `src/server/telegram.ts` (`pollTelegram` on cron tick, allowlist, command menu) | Vaulted `telegram_bot_token`; chat/user allowlist | [TELEGRAM.md](./TELEGRAM.md) |
113
+ | **Vault** | `true` | `src/lib/vault.ts` (AES-256-GCM, `vault` table) | `CONSTELLA_VAULT_KEY` | [SECURITY.md](./SECURITY.md) |
114
+ | **Web Search** | `false` | `src/server/adapters/cli.ts` (`--allowedTools WebSearch WebFetch`) | `CONSTELLA_WEB_RESEARCH` (default ON) and per-workspace `settings.agents.webResearch` | [AGENTS.md](./AGENTS.md) |
115
+
116
+ > Note on Web Search: the plugin row seeds `enabled: false`, yet the underlying web-research capability is **ON by default** at the agent layer (`webResearchOn()` returns true unless `CONSTELLA_WEB_RESEARCH=0` or the workspace setting disables it). This is the clearest proof that the plugin row is a **catalog entry, not the actual gate** — the real switch is the env var / workspace setting that the runner pushes via `setWebResearch` before each spawn.
117
+
118
+ ---
119
+
120
+ ## Tables 🌌
121
+
122
+ ### `plugin` (already covered above)
123
+
124
+ The only table for this feature. See [The `plugin` table](#the-plugin-table).
125
+
126
+ ### Where the real capability state lives (for contrast)
127
+
128
+ | Capability | State table / store | Not in `plugin` |
129
+ |------------|--------------------|-----------------|
130
+ | GitHub token / repo | `vault` (`github_pat`), `workspace.settings.github` | ✓ |
131
+ | Telegram token / offset / allowlist | `vault` (`telegram_bot_token`), `workspace.settings.telegram` | ✓ |
132
+ | Vault key | `CONSTELLA_VAULT_KEY` env, `vault` table | ✓ |
133
+ | Web research flag | `CONSTELLA_WEB_RESEARCH` env, `settings.agents.webResearch` | ✓ |
134
+
135
+ ---
136
+
137
+ ## Plugins vs Skills vs external MCP 🪐
138
+
139
+ Three layers people routinely confuse. They are genuinely different:
140
+
141
+ ```mermaid
142
+ flowchart LR
143
+ subgraph "Plugins (this doc)"
144
+ P[("plugin table<br/>catalog of integrations")]
145
+ end
146
+ subgraph "Skills"
147
+ S[("skill / agentSkill tables<br/>.claude/skills/*.md")]
148
+ end
149
+ subgraph "External MCP"
150
+ M["claude CLI ~/.claude config<br/>mcpServers — OUTSIDE the plugin table"]
151
+ end
152
+ P -. "names integrations<br/>(GitHub/Telegram/Vault/Web Search)" .-> ENG["Real engines + secrets"]
153
+ S -. "shapes how agents work<br/>(prompt-level knowledge)" .-> AG["Agent persona"]
154
+ M -. "adds tools the claude CLI can call" .-> AG
155
+ ```
156
+
157
+ | Layer | What it is | Where it is stored | Wired through |
158
+ |-------|-----------|--------------------|---------------|
159
+ | **Plugins** | A catalog of native integrations (this doc) | `plugin` table (per workspace) | `plugin-actions.ts`; real work in `github.ts` / `telegram.ts` / `vault.ts` / `cli.ts` |
160
+ | **Skills** | Agent knowledge files that shape *how* an agent works | `skill` / `agentSkill` tables, `.claude/skills/<name>.md` on disk | `src/server/skills-library.ts` — see [SKILLS.md](./SKILLS.md) |
161
+ | **External MCP** | Third-party MCP servers the **`claude` CLI consumes as tools** | The operator's `~/.claude` config (`mcpServers`) — **not** the `plugin` table | The vanilla `claude` CLI itself; see [MCP.md](./MCP.md) |
162
+
163
+ Two crucial clarifications:
164
+
165
+ 1. **Constella's own MCP server is the OUTBOUND direction.** `scripts/mcp-server.mjs` lets an *external* host (Claude Desktop, Cursor) drive Constella over MCP. That is documented in [MCP.md](./MCP.md) and [PUBLIC_API.md](./PUBLIC_API.md). It has nothing to do with the `plugin` table.
166
+ 2. **Constella agents consuming external MCP servers** happens through the vanilla `claude` CLI's own `~/.claude` configuration — again **not** the `plugin` table. (And note: company agents run *vanilla* with operator hooks disabled, per `src/server/adapters/cli.ts`, so leak-prone operator plugins/hooks do not bleed into agent runs.)
167
+
168
+ ---
169
+
170
+ ## Step-by-step 🛰️
171
+
172
+ ### Toggle a native plugin
173
+
174
+ 1. Open the **Plugins** page (`/plugins`).
175
+ 2. Click the switch on a row. The UI calls `togglePlugin(p.id, !p.enabled)`.
176
+ 3. `plugin.enabled` flips for that workspace; the page revalidates.
177
+ 4. Remember: for native integrations the *operative* gate is the integration's own config (token / env / setting), not this switch.
178
+
179
+ ### "Install" a placeholder plugin (PARTIAL)
180
+
181
+ 1. Click **Install from URL** in the topbar.
182
+ 2. The browser `window.prompt` asks for a URL or name (placeholder text: `github.com/acme/slack-bridge`).
183
+ 3. `installPlugin(url.trim())` inserts a non-native row, `enabled: true`, `description: "Installed from URL"`.
184
+ 4. Nothing is downloaded or wired. The row is a bookmark only — **this is a mock** (see [Possible states](#possible-states-)).
185
+
186
+ ### Remove an installed plugin
187
+
188
+ 1. Non-native rows show a **Remove** button (native rows do not).
189
+ 2. Click it → `removePlugin(p.id)`.
190
+ 3. The delete is guarded by `eq(plugin.native, false)`, so even a crafted call cannot delete a native row.
191
+
192
+ ---
193
+
194
+ ## Examples 🌠
195
+
196
+ ### Programmatic toggle (server action)
197
+
198
+ ```ts
199
+ import { togglePlugin } from "@/server/actions/plugin-actions";
200
+
201
+ // Flip the GitHub catalog switch off for the current workspace.
202
+ await togglePlugin(githubPluginId, false);
203
+ // NOTE: this does NOT remove the repo or token — see github.ts.
204
+ ```
205
+
206
+ ### Register a placeholder (mock install)
207
+
208
+ ```ts
209
+ import { installPlugin } from "@/server/actions/plugin-actions";
210
+
211
+ const res = await installPlugin("github.com/acme/slack-bridge");
212
+ // res => { ok: true }
213
+ // A non-native row appears in /plugins, enabled, description "Installed from URL".
214
+ // No bridge code runs — it is a catalog bookmark.
215
+ ```
216
+
217
+ ### What a freshly onboarded workspace contains
218
+
219
+ | name | description | enabled | native |
220
+ |------|-------------|---------|--------|
221
+ | GitHub | Commit, push & open PRs from the workspace. | true | true |
222
+ | Telegram | Route reports and alerts to a channel. | true | true |
223
+ | Vault | Encrypted secret storage for provider keys. | true | true |
224
+ | Web Search | Let agents look things up while planning. | false | true |
225
+
226
+ ---
227
+
228
+ ## Possible states 🕳️
229
+
230
+ | State | `native` | `enabled` | Removable? | Source |
231
+ |-------|----------|-----------|------------|--------|
232
+ | Native, on | `true` | `true` | No | onboarding seed |
233
+ | Native, off | `true` | `false` | No | onboarding seed (e.g. Web Search) or `togglePlugin` |
234
+ | Installed (mock), on | `false` | `true` | Yes | `installPlugin` |
235
+ | Installed, off | `false` | `false` | Yes | `installPlugin` + `togglePlugin` |
236
+
237
+ **Feature maturity:**
238
+
239
+ - `togglePlugin` — **real.** Persists, scoped, revalidates.
240
+ - `removePlugin` — **real.** Guarded so natives survive.
241
+ - `installPlugin` — **PARTIAL (mock).** It only registers a row. There is no fetch, no verification, no sandbox, no runtime wiring of the named extension. Treat installed rows as bookmarks until this is fully implemented.
242
+
243
+ ---
244
+
245
+ ## Related integrations 🪐
246
+
247
+ The native plugins are thin labels over real subsystems documented elsewhere:
248
+
249
+ - **GitHub** → [GITHUB.md](./GITHUB.md) (commit/push, repo wiring, secret scanning).
250
+ - **Telegram** → [TELEGRAM.md](./TELEGRAM.md) (bot token, allowlist, command menu, polling).
251
+ - **Vault** → [SECURITY.md](./SECURITY.md) (AES-256-GCM secret storage).
252
+ - **Web Search** → [AGENTS.md](./AGENTS.md) (agent web research via `--allowedTools WebSearch WebFetch`).
253
+ - **MCP (outbound + external)** → [MCP.md](./MCP.md) and [PUBLIC_API.md](./PUBLIC_API.md).
254
+
255
+ ---
256
+
257
+ ## Security 🛰️
258
+
259
+ - **Workspace isolation.** Every action calls `requireWorkspace()` and scopes its `WHERE` by `workspaceId`, so one workspace cannot read or mutate another's plugins.
260
+ - **Native immutability.** `removePlugin`'s `eq(plugin.native, false)` clause prevents removal of native integrations even via a forged request.
261
+ - **No code execution from `installPlugin`.** Because the install path is a mock, there is *currently no* code-download/execution attack surface from it. When it is built out, the named URL must be fetched, scanned and sandboxed — do not assume an installed row is safe to execute today.
262
+ - **Secrets never live here.** Tokens and keys live in the encrypted `vault` (`CONSTELLA_VAULT_KEY`) and in `workspace.settings`, never in the `plugin` table. The catalog row carries no secret material.
263
+ - **Agents run vanilla.** Operator-side `~/.claude` plugins/hooks are disabled for company-agent runs (`src/server/adapters/cli.ts`), so an operator's personal Claude plugins cannot silently alter agent behaviour. This is a different "plugin" concept entirely — operator CLI plugins, not Constella plugin rows.
264
+
265
+ ---
266
+
267
+ ## Troubleshooting 🕳️
268
+
269
+ | Symptom | Likely cause | Fix |
270
+ |---------|--------------|-----|
271
+ | Toggling GitHub on did nothing | `enabled` is a catalog flag, not the gate | Configure the repo and token in [GITHUB.md](./GITHUB.md). |
272
+ | Web Search shows `enabled: false` but agents still search | Web research is ON by default at the agent layer | Disable via `CONSTELLA_WEB_RESEARCH=0` or `settings.agents.webResearch=false` — see [AGENTS.md](./AGENTS.md). |
273
+ | Installed plugin "does nothing" | `installPlugin` is a mock (registers a row only) | Expected — PARTIAL feature; the named extension is not wired. |
274
+ | Remove button missing on a row | The row is `native: true` | Native plugins are permanent by design; use the toggle instead. |
275
+ | Plugins page empty | No rows for this workspace (rare; onboarding seeds 4) | Re-check the workspace; native rows are seeded by `completeOnboarding`. |
276
+ | Want agents to use an external MCP tool | That is configured in the `claude` CLI `~/.claude`, not here | See [MCP.md](./MCP.md). |
277
+
278
+ ---
279
+
280
+ ## Related links 🌌
281
+
282
+ - [SKILLS.md](./SKILLS.md) — agent knowledge layer (not the same as plugins)
283
+ - [MCP.md](./MCP.md) — Constella's MCP server + external MCP consumption
284
+ - [GITHUB.md](./GITHUB.md) — the GitHub integration engine
285
+ - [TELEGRAM.md](./TELEGRAM.md) — the Telegram relay engine
286
+ - [SECURITY.md](./SECURITY.md) — the Vault and secret handling
287
+ - [AGENTS.md](./AGENTS.md) — agents and web research
288
+ - [PUBLIC_API.md](./PUBLIC_API.md) — REST v1 surface that MCP maps onto
289
+ - [ARCHITECTURE.md](./ARCHITECTURE.md) — where plugins sit in the control plane
290
+ - [CONFIGURATION.md](./CONFIGURATION.md) — env vars and workspace settings