constella 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (747) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +53 -0
  3. package/.next/build-manifest.json +20 -0
  4. package/.next/diagnostics/build-diagnostics.json +6 -0
  5. package/.next/diagnostics/framework.json +1 -0
  6. package/.next/export-marker.json +6 -0
  7. package/.next/images-manifest.json +68 -0
  8. package/.next/next-minimal-server.js.nft.json +1 -0
  9. package/.next/next-server.js.nft.json +1 -0
  10. package/.next/package.json +1 -0
  11. package/.next/prerender-manifest.json +36 -0
  12. package/.next/react-loadable-manifest.json +14 -0
  13. package/.next/required-server-files.js +343 -0
  14. package/.next/required-server-files.json +343 -0
  15. package/.next/routes-manifest.json +362 -0
  16. package/.next/server/app/(app)/activity/page.js +2 -0
  17. package/.next/server/app/(app)/activity/page.js.nft.json +1 -0
  18. package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -0
  19. package/.next/server/app/(app)/agents/[handle]/page.js +18 -0
  20. package/.next/server/app/(app)/agents/[handle]/page.js.nft.json +1 -0
  21. package/.next/server/app/(app)/agents/[handle]/page_client-reference-manifest.js +1 -0
  22. package/.next/server/app/(app)/code/page.js +2 -0
  23. package/.next/server/app/(app)/code/page.js.nft.json +1 -0
  24. package/.next/server/app/(app)/code/page_client-reference-manifest.js +1 -0
  25. package/.next/server/app/(app)/config/page.js +2 -0
  26. package/.next/server/app/(app)/config/page.js.nft.json +1 -0
  27. package/.next/server/app/(app)/config/page_client-reference-manifest.js +1 -0
  28. package/.next/server/app/(app)/costs/page.js +2 -0
  29. package/.next/server/app/(app)/costs/page.js.nft.json +1 -0
  30. package/.next/server/app/(app)/costs/page_client-reference-manifest.js +1 -0
  31. package/.next/server/app/(app)/cron/page.js +2 -0
  32. package/.next/server/app/(app)/cron/page.js.nft.json +1 -0
  33. package/.next/server/app/(app)/cron/page_client-reference-manifest.js +1 -0
  34. package/.next/server/app/(app)/dashboard/page.js +2 -0
  35. package/.next/server/app/(app)/dashboard/page.js.nft.json +1 -0
  36. package/.next/server/app/(app)/dashboard/page_client-reference-manifest.js +1 -0
  37. package/.next/server/app/(app)/docs/[id]/page.js +2 -0
  38. package/.next/server/app/(app)/docs/[id]/page.js.nft.json +1 -0
  39. package/.next/server/app/(app)/docs/[id]/page_client-reference-manifest.js +1 -0
  40. package/.next/server/app/(app)/docs/page.js +2 -0
  41. package/.next/server/app/(app)/docs/page.js.nft.json +1 -0
  42. package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -0
  43. package/.next/server/app/(app)/github/page.js +2 -0
  44. package/.next/server/app/(app)/github/page.js.nft.json +1 -0
  45. package/.next/server/app/(app)/github/page_client-reference-manifest.js +1 -0
  46. package/.next/server/app/(app)/goals/page.js +2 -0
  47. package/.next/server/app/(app)/goals/page.js.nft.json +1 -0
  48. package/.next/server/app/(app)/goals/page_client-reference-manifest.js +1 -0
  49. package/.next/server/app/(app)/inbox/page.js +2 -0
  50. package/.next/server/app/(app)/inbox/page.js.nft.json +1 -0
  51. package/.next/server/app/(app)/inbox/page_client-reference-manifest.js +1 -0
  52. package/.next/server/app/(app)/knowledge/page.js +3 -0
  53. package/.next/server/app/(app)/knowledge/page.js.nft.json +1 -0
  54. package/.next/server/app/(app)/knowledge/page_client-reference-manifest.js +1 -0
  55. package/.next/server/app/(app)/models/page.js +2 -0
  56. package/.next/server/app/(app)/models/page.js.nft.json +1 -0
  57. package/.next/server/app/(app)/models/page_client-reference-manifest.js +1 -0
  58. package/.next/server/app/(app)/notifications/page.js +2 -0
  59. package/.next/server/app/(app)/notifications/page.js.nft.json +1 -0
  60. package/.next/server/app/(app)/notifications/page_client-reference-manifest.js +1 -0
  61. package/.next/server/app/(app)/org/page.js +2 -0
  62. package/.next/server/app/(app)/org/page.js.nft.json +1 -0
  63. package/.next/server/app/(app)/org/page_client-reference-manifest.js +1 -0
  64. package/.next/server/app/(app)/organizations/page.js +2 -0
  65. package/.next/server/app/(app)/organizations/page.js.nft.json +1 -0
  66. package/.next/server/app/(app)/organizations/page_client-reference-manifest.js +1 -0
  67. package/.next/server/app/(app)/page.js +3 -0
  68. package/.next/server/app/(app)/page.js.nft.json +1 -0
  69. package/.next/server/app/(app)/page_client-reference-manifest.js +1 -0
  70. package/.next/server/app/(app)/planner/page.js +2 -0
  71. package/.next/server/app/(app)/planner/page.js.nft.json +1 -0
  72. package/.next/server/app/(app)/planner/page_client-reference-manifest.js +1 -0
  73. package/.next/server/app/(app)/plugins/page.js +2 -0
  74. package/.next/server/app/(app)/plugins/page.js.nft.json +1 -0
  75. package/.next/server/app/(app)/plugins/page_client-reference-manifest.js +1 -0
  76. package/.next/server/app/(app)/pm/page.js +2 -0
  77. package/.next/server/app/(app)/pm/page.js.nft.json +1 -0
  78. package/.next/server/app/(app)/pm/page_client-reference-manifest.js +1 -0
  79. package/.next/server/app/(app)/prepare-deploy/page.js +19 -0
  80. package/.next/server/app/(app)/prepare-deploy/page.js.nft.json +1 -0
  81. package/.next/server/app/(app)/prepare-deploy/page_client-reference-manifest.js +1 -0
  82. package/.next/server/app/(app)/profile/page.js +2 -0
  83. package/.next/server/app/(app)/profile/page.js.nft.json +1 -0
  84. package/.next/server/app/(app)/profile/page_client-reference-manifest.js +1 -0
  85. package/.next/server/app/(app)/pulse/page.js +2 -0
  86. package/.next/server/app/(app)/pulse/page.js.nft.json +1 -0
  87. package/.next/server/app/(app)/pulse/page_client-reference-manifest.js +1 -0
  88. package/.next/server/app/(app)/reports/[id]/page.js +3 -0
  89. package/.next/server/app/(app)/reports/[id]/page.js.nft.json +1 -0
  90. package/.next/server/app/(app)/reports/[id]/page_client-reference-manifest.js +1 -0
  91. package/.next/server/app/(app)/reports/page.js +5 -0
  92. package/.next/server/app/(app)/reports/page.js.nft.json +1 -0
  93. package/.next/server/app/(app)/reports/page_client-reference-manifest.js +1 -0
  94. package/.next/server/app/(app)/routines/page.js +2 -0
  95. package/.next/server/app/(app)/routines/page.js.nft.json +1 -0
  96. package/.next/server/app/(app)/routines/page_client-reference-manifest.js +1 -0
  97. package/.next/server/app/(app)/search/page.js +2 -0
  98. package/.next/server/app/(app)/search/page.js.nft.json +1 -0
  99. package/.next/server/app/(app)/search/page_client-reference-manifest.js +1 -0
  100. package/.next/server/app/(app)/security/page.js +2 -0
  101. package/.next/server/app/(app)/security/page.js.nft.json +1 -0
  102. package/.next/server/app/(app)/security/page_client-reference-manifest.js +1 -0
  103. package/.next/server/app/(app)/skills/page.js +18 -0
  104. package/.next/server/app/(app)/skills/page.js.nft.json +1 -0
  105. package/.next/server/app/(app)/skills/page_client-reference-manifest.js +1 -0
  106. package/.next/server/app/(app)/tasks/page.js +2 -0
  107. package/.next/server/app/(app)/tasks/page.js.nft.json +1 -0
  108. package/.next/server/app/(app)/tasks/page_client-reference-manifest.js +1 -0
  109. package/.next/server/app/(app)/test-dev/page.js +2 -0
  110. package/.next/server/app/(app)/test-dev/page.js.nft.json +1 -0
  111. package/.next/server/app/(app)/test-dev/page_client-reference-manifest.js +1 -0
  112. package/.next/server/app/(app)/update/page.js +2 -0
  113. package/.next/server/app/(app)/update/page.js.nft.json +1 -0
  114. package/.next/server/app/(app)/update/page_client-reference-manifest.js +1 -0
  115. package/.next/server/app/(auth)/login/page.js +2 -0
  116. package/.next/server/app/(auth)/login/page.js.nft.json +1 -0
  117. package/.next/server/app/(auth)/login/page_client-reference-manifest.js +1 -0
  118. package/.next/server/app/(auth)/onboarding/page.js +18 -0
  119. package/.next/server/app/(auth)/onboarding/page.js.nft.json +1 -0
  120. package/.next/server/app/(auth)/onboarding/page_client-reference-manifest.js +1 -0
  121. package/.next/server/app/_global-error/page.js +32 -0
  122. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  123. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
  124. package/.next/server/app/_global-error.html +1 -0
  125. package/.next/server/app/_global-error.meta +16 -0
  126. package/.next/server/app/_global-error.rsc +15 -0
  127. package/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
  128. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +5 -0
  129. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +5 -0
  130. package/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
  131. package/.next/server/app/_global-error.segments/_index.segment.rsc +6 -0
  132. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  133. package/.next/server/app/_not-found/page.js +2 -0
  134. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  135. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  136. package/.next/server/app/api/auth/[...all]/route.js +1 -0
  137. package/.next/server/app/api/auth/[...all]/route.js.nft.json +1 -0
  138. package/.next/server/app/api/auth/[...all]/route_client-reference-manifest.js +1 -0
  139. package/.next/server/app/api/cron/tick/route.js +52 -0
  140. package/.next/server/app/api/cron/tick/route.js.nft.json +1 -0
  141. package/.next/server/app/api/cron/tick/route_client-reference-manifest.js +1 -0
  142. package/.next/server/app/api/dev-login/route.js +1 -0
  143. package/.next/server/app/api/dev-login/route.js.nft.json +1 -0
  144. package/.next/server/app/api/dev-login/route_client-reference-manifest.js +1 -0
  145. package/.next/server/app/api/locks/acquire/route.js +1 -0
  146. package/.next/server/app/api/locks/acquire/route.js.nft.json +1 -0
  147. package/.next/server/app/api/locks/acquire/route_client-reference-manifest.js +1 -0
  148. package/.next/server/app/api/models/progress/route.js +1 -0
  149. package/.next/server/app/api/models/progress/route.js.nft.json +1 -0
  150. package/.next/server/app/api/models/progress/route_client-reference-manifest.js +1 -0
  151. package/.next/server/app/api/passkey/authenticate/options/route.js +1 -0
  152. package/.next/server/app/api/passkey/authenticate/options/route.js.nft.json +1 -0
  153. package/.next/server/app/api/passkey/authenticate/options/route_client-reference-manifest.js +1 -0
  154. package/.next/server/app/api/passkey/authenticate/verify/route.js +1 -0
  155. package/.next/server/app/api/passkey/authenticate/verify/route.js.nft.json +1 -0
  156. package/.next/server/app/api/passkey/authenticate/verify/route_client-reference-manifest.js +1 -0
  157. package/.next/server/app/api/passkey/register/options/route.js +1 -0
  158. package/.next/server/app/api/passkey/register/options/route.js.nft.json +1 -0
  159. package/.next/server/app/api/passkey/register/options/route_client-reference-manifest.js +1 -0
  160. package/.next/server/app/api/passkey/register/verify/route.js +1 -0
  161. package/.next/server/app/api/passkey/register/verify/route.js.nft.json +1 -0
  162. package/.next/server/app/api/passkey/register/verify/route_client-reference-manifest.js +1 -0
  163. package/.next/server/app/api/stream/route.js +4 -0
  164. package/.next/server/app/api/stream/route.js.nft.json +1 -0
  165. package/.next/server/app/api/stream/route_client-reference-manifest.js +1 -0
  166. package/.next/server/app/api/sync/file/route.js +2 -0
  167. package/.next/server/app/api/sync/file/route.js.nft.json +1 -0
  168. package/.next/server/app/api/sync/file/route_client-reference-manifest.js +1 -0
  169. package/.next/server/app/api/telegram/poll/route.js +15 -0
  170. package/.next/server/app/api/telegram/poll/route.js.nft.json +1 -0
  171. package/.next/server/app/api/telegram/poll/route_client-reference-manifest.js +1 -0
  172. package/.next/server/app/api/upload/route.js +1 -0
  173. package/.next/server/app/api/upload/route.js.nft.json +1 -0
  174. package/.next/server/app/api/upload/route_client-reference-manifest.js +1 -0
  175. package/.next/server/app/api/v1/[[...path]]/route.js +1 -0
  176. package/.next/server/app/api/v1/[[...path]]/route.js.nft.json +1 -0
  177. package/.next/server/app/api/v1/[[...path]]/route_client-reference-manifest.js +1 -0
  178. package/.next/server/app-paths-manifest.json +53 -0
  179. package/.next/server/chunks/1003.js +1 -0
  180. package/.next/server/chunks/127.js +26 -0
  181. package/.next/server/chunks/1388.js +1 -0
  182. package/.next/server/chunks/1408.js +21 -0
  183. package/.next/server/chunks/1572.js +1 -0
  184. package/.next/server/chunks/1591.js +24 -0
  185. package/.next/server/chunks/1619.js +188 -0
  186. package/.next/server/chunks/162.js +1 -0
  187. package/.next/server/chunks/1881.js +1 -0
  188. package/.next/server/chunks/1968.js +1 -0
  189. package/.next/server/chunks/2297.js +348 -0
  190. package/.next/server/chunks/2341.js +1 -0
  191. package/.next/server/chunks/2517.js +1 -0
  192. package/.next/server/chunks/2549.js +1 -0
  193. package/.next/server/chunks/259.js +14 -0
  194. package/.next/server/chunks/2599.js +1 -0
  195. package/.next/server/chunks/260.js +1 -0
  196. package/.next/server/chunks/2867.js +147 -0
  197. package/.next/server/chunks/3018.js +1 -0
  198. package/.next/server/chunks/3050.js +18 -0
  199. package/.next/server/chunks/3085.js +12 -0
  200. package/.next/server/chunks/3131.js +1 -0
  201. package/.next/server/chunks/3242.js +1 -0
  202. package/.next/server/chunks/3266.js +15 -0
  203. package/.next/server/chunks/3524.js +1 -0
  204. package/.next/server/chunks/3527.js +479 -0
  205. package/.next/server/chunks/3533.js +869 -0
  206. package/.next/server/chunks/3550.js +1 -0
  207. package/.next/server/chunks/3609.js +2 -0
  208. package/.next/server/chunks/3667.js +462 -0
  209. package/.next/server/chunks/3760.js +4 -0
  210. package/.next/server/chunks/4679.js +1 -0
  211. package/.next/server/chunks/4804.js +1 -0
  212. package/.next/server/chunks/4832.js +2 -0
  213. package/.next/server/chunks/4853.js +1 -0
  214. package/.next/server/chunks/4979.js +67 -0
  215. package/.next/server/chunks/5060.js +1 -0
  216. package/.next/server/chunks/5278.js +1 -0
  217. package/.next/server/chunks/5614.js +1 -0
  218. package/.next/server/chunks/5818.js +1 -0
  219. package/.next/server/chunks/6479.js +1 -0
  220. package/.next/server/chunks/6658.js +1 -0
  221. package/.next/server/chunks/6706.js +1 -0
  222. package/.next/server/chunks/6719.js +1 -0
  223. package/.next/server/chunks/678.js +1 -0
  224. package/.next/server/chunks/683.js +1 -0
  225. package/.next/server/chunks/6862.js +1 -0
  226. package/.next/server/chunks/6882.js +1 -0
  227. package/.next/server/chunks/7037.js +1 -0
  228. package/.next/server/chunks/7107.js +741 -0
  229. package/.next/server/chunks/73.js +17 -0
  230. package/.next/server/chunks/7327.js +1 -0
  231. package/.next/server/chunks/7514.js +1 -0
  232. package/.next/server/chunks/7622.js +1 -0
  233. package/.next/server/chunks/7778.js +1 -0
  234. package/.next/server/chunks/7912.js +1 -0
  235. package/.next/server/chunks/7949.js +1 -0
  236. package/.next/server/chunks/7971.js +1 -0
  237. package/.next/server/chunks/7989.js +1 -0
  238. package/.next/server/chunks/842.js +22 -0
  239. package/.next/server/chunks/8762.js +15 -0
  240. package/.next/server/chunks/8823.js +77 -0
  241. package/.next/server/chunks/9146.js +4 -0
  242. package/.next/server/chunks/9676.js +1 -0
  243. package/.next/server/chunks/9783.js +22 -0
  244. package/.next/server/chunks/9969.js +3 -0
  245. package/.next/server/functions-config-manifest.json +18 -0
  246. package/.next/server/instrumentation.js +1 -0
  247. package/.next/server/instrumentation.js.nft.json +1 -0
  248. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  249. package/.next/server/middleware-build-manifest.js +1 -0
  250. package/.next/server/middleware-manifest.json +6 -0
  251. package/.next/server/middleware-react-loadable-manifest.js +1 -0
  252. package/.next/server/middleware.js +18 -0
  253. package/.next/server/middleware.js.nft.json +1 -0
  254. package/.next/server/next-font-manifest.js +1 -0
  255. package/.next/server/next-font-manifest.json +1 -0
  256. package/.next/server/pages/500.html +1 -0
  257. package/.next/server/pages-manifest.json +3 -0
  258. package/.next/server/prefetch-hints.json +1 -0
  259. package/.next/server/server-reference-manifest.js +1 -0
  260. package/.next/server/server-reference-manifest.json +1 -0
  261. package/.next/server/webpack-runtime.js +1 -0
  262. package/.next/static/chunks/1858-339516f78a4b00da.js +1 -0
  263. package/.next/static/chunks/2320-fc8b39380e69d465.js +2 -0
  264. package/.next/static/chunks/23550918-ff694f70f4b0648c.js +1 -0
  265. package/.next/static/chunks/3219-ebb3c23be38c838d.js +1 -0
  266. package/.next/static/chunks/4263-adecb5b466380b6e.js +1 -0
  267. package/.next/static/chunks/5479-0cceab68cd0ca9c7.js +1 -0
  268. package/.next/static/chunks/5701-665b927b06158b76.js +1 -0
  269. package/.next/static/chunks/5920.6451a68b63918988.js +1 -0
  270. package/.next/static/chunks/6575-5c9139720bb0f5bf.js +4 -0
  271. package/.next/static/chunks/6834-4759af1ce7d95fb6.js +32 -0
  272. package/.next/static/chunks/7509.721cd47a931c5518.js +1 -0
  273. package/.next/static/chunks/8264-1ca011989ee2b231.js +1 -0
  274. package/.next/static/chunks/9219-4a39a98b5502d9d1.js +1 -0
  275. package/.next/static/chunks/9690-53d5222618cbeddb.js +1 -0
  276. package/.next/static/chunks/app/(app)/activity/page-3973534281ecea81.js +1 -0
  277. package/.next/static/chunks/app/(app)/agents/[handle]/page-83662a175c098282.js +1 -0
  278. package/.next/static/chunks/app/(app)/code/page-33979545192cd137.js +1 -0
  279. package/.next/static/chunks/app/(app)/config/page-9933aed1ca8a85c1.js +1 -0
  280. package/.next/static/chunks/app/(app)/costs/page-131c4dc580efcc19.js +1 -0
  281. package/.next/static/chunks/app/(app)/cron/page-53ea1aff998a87ca.js +1 -0
  282. package/.next/static/chunks/app/(app)/dashboard/page-deed83aaa9d0d447.js +1 -0
  283. package/.next/static/chunks/app/(app)/docs/[id]/page-38c993d73c0eab4f.js +1 -0
  284. package/.next/static/chunks/app/(app)/docs/page-bf463b55d0554e86.js +1 -0
  285. package/.next/static/chunks/app/(app)/error-988cd28480809861.js +1 -0
  286. package/.next/static/chunks/app/(app)/github/page-62678b4e82dfecb6.js +1 -0
  287. package/.next/static/chunks/app/(app)/goals/page-4adb426fe1c96106.js +1 -0
  288. package/.next/static/chunks/app/(app)/inbox/page-e347dc55ab467310.js +1 -0
  289. package/.next/static/chunks/app/(app)/knowledge/page-65393a045b4349be.js +1 -0
  290. package/.next/static/chunks/app/(app)/layout-7f65675705b011d8.js +1 -0
  291. package/.next/static/chunks/app/(app)/models/page-e01f1dd7e49a2951.js +1 -0
  292. package/.next/static/chunks/app/(app)/notifications/page-56548ac87aef00da.js +1 -0
  293. package/.next/static/chunks/app/(app)/org/page-699e6a6dc0db7d81.js +1 -0
  294. package/.next/static/chunks/app/(app)/organizations/page-36051a380a7e8eb7.js +1 -0
  295. package/.next/static/chunks/app/(app)/page-7d1011a566f81520.js +1 -0
  296. package/.next/static/chunks/app/(app)/planner/page-dab7ced94083373a.js +1 -0
  297. package/.next/static/chunks/app/(app)/plugins/page-5b5a1f53389be42e.js +1 -0
  298. package/.next/static/chunks/app/(app)/pm/page-0de5c08c0b227bb0.js +1 -0
  299. package/.next/static/chunks/app/(app)/prepare-deploy/page-e426038552df8d41.js +1 -0
  300. package/.next/static/chunks/app/(app)/profile/page-608dfcaf8aae0a69.js +1 -0
  301. package/.next/static/chunks/app/(app)/pulse/page-309ccaca91de1faa.js +1 -0
  302. package/.next/static/chunks/app/(app)/reports/[id]/page-53ea1aff998a87ca.js +1 -0
  303. package/.next/static/chunks/app/(app)/reports/page-68cdc6dcfa472d86.js +1 -0
  304. package/.next/static/chunks/app/(app)/routines/page-bcc55550b197a9fa.js +1 -0
  305. package/.next/static/chunks/app/(app)/search/page-5c5f67558d0dbf0d.js +1 -0
  306. package/.next/static/chunks/app/(app)/security/page-a7d41e36aa366b45.js +1 -0
  307. package/.next/static/chunks/app/(app)/skills/page-c5b21e89593b8336.js +1 -0
  308. package/.next/static/chunks/app/(app)/tasks/page-08ae079e3e54d2ce.js +1 -0
  309. package/.next/static/chunks/app/(app)/test-dev/page-633f82dfd9c3ce23.js +1 -0
  310. package/.next/static/chunks/app/(app)/update/page-4be019054351bfac.js +1 -0
  311. package/.next/static/chunks/app/(auth)/login/page-6e85d3377062acae.js +1 -0
  312. package/.next/static/chunks/app/(auth)/onboarding/page-ebb10c175abf3b85.js +1 -0
  313. package/.next/static/chunks/app/_global-error/page-23fe50a6bf589c97.js +1 -0
  314. package/.next/static/chunks/app/_not-found/page-dc38b02aebeab535.js +1 -0
  315. package/.next/static/chunks/app/api/auth/[...all]/route-23fe50a6bf589c97.js +1 -0
  316. package/.next/static/chunks/app/api/cron/tick/route-23fe50a6bf589c97.js +1 -0
  317. package/.next/static/chunks/app/api/dev-login/route-23fe50a6bf589c97.js +1 -0
  318. package/.next/static/chunks/app/api/locks/acquire/route-23fe50a6bf589c97.js +1 -0
  319. package/.next/static/chunks/app/api/models/progress/route-23fe50a6bf589c97.js +1 -0
  320. package/.next/static/chunks/app/api/passkey/authenticate/options/route-23fe50a6bf589c97.js +1 -0
  321. package/.next/static/chunks/app/api/passkey/authenticate/verify/route-23fe50a6bf589c97.js +1 -0
  322. package/.next/static/chunks/app/api/passkey/register/options/route-23fe50a6bf589c97.js +1 -0
  323. package/.next/static/chunks/app/api/passkey/register/verify/route-23fe50a6bf589c97.js +1 -0
  324. package/.next/static/chunks/app/api/stream/route-23fe50a6bf589c97.js +1 -0
  325. package/.next/static/chunks/app/api/sync/file/route-23fe50a6bf589c97.js +1 -0
  326. package/.next/static/chunks/app/api/telegram/poll/route-23fe50a6bf589c97.js +1 -0
  327. package/.next/static/chunks/app/api/upload/route-23fe50a6bf589c97.js +1 -0
  328. package/.next/static/chunks/app/api/v1/[[...path]]/route-23fe50a6bf589c97.js +1 -0
  329. package/.next/static/chunks/app/error-09899a13c38b6e89.js +1 -0
  330. package/.next/static/chunks/app/global-error-b8050d4d886f448c.js +1 -0
  331. package/.next/static/chunks/app/layout-ab9deed1e7e2e9df.js +1 -0
  332. package/.next/static/chunks/framework-4b2c6b6043dd203f.js +1 -0
  333. package/.next/static/chunks/main-722e16032e7764d1.js +5 -0
  334. package/.next/static/chunks/main-app-761880af2b6f1962.js +1 -0
  335. package/.next/static/chunks/next/dist/client/components/builtin/app-error-23fe50a6bf589c97.js +1 -0
  336. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-23fe50a6bf589c97.js +1 -0
  337. package/.next/static/chunks/next/dist/client/components/builtin/not-found-23fe50a6bf589c97.js +1 -0
  338. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-23fe50a6bf589c97.js +1 -0
  339. package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  340. package/.next/static/chunks/webpack-222e3894b78c67db.js +1 -0
  341. package/.next/static/css/0a9b5805594444e3.css +1 -0
  342. package/.next/static/yztMvBwyrWWkSqP6jfXoa/_buildManifest.js +1 -0
  343. package/.next/static/yztMvBwyrWWkSqP6jfXoa/_ssgManifest.js +1 -0
  344. package/.next/trace-build +1 -0
  345. package/.next/types/app/(app)/activity/page.ts +87 -0
  346. package/.next/types/app/(app)/agents/[handle]/page.ts +87 -0
  347. package/.next/types/app/(app)/code/page.ts +87 -0
  348. package/.next/types/app/(app)/config/page.ts +87 -0
  349. package/.next/types/app/(app)/costs/page.ts +87 -0
  350. package/.next/types/app/(app)/cron/page.ts +87 -0
  351. package/.next/types/app/(app)/dashboard/page.ts +87 -0
  352. package/.next/types/app/(app)/docs/[id]/page.ts +87 -0
  353. package/.next/types/app/(app)/docs/page.ts +87 -0
  354. package/.next/types/app/(app)/github/page.ts +87 -0
  355. package/.next/types/app/(app)/goals/page.ts +87 -0
  356. package/.next/types/app/(app)/inbox/page.ts +87 -0
  357. package/.next/types/app/(app)/knowledge/page.ts +87 -0
  358. package/.next/types/app/(app)/models/page.ts +87 -0
  359. package/.next/types/app/(app)/notifications/page.ts +87 -0
  360. package/.next/types/app/(app)/org/page.ts +87 -0
  361. package/.next/types/app/(app)/organizations/page.ts +87 -0
  362. package/.next/types/app/(app)/page.ts +87 -0
  363. package/.next/types/app/(app)/planner/page.ts +87 -0
  364. package/.next/types/app/(app)/plugins/page.ts +87 -0
  365. package/.next/types/app/(app)/pm/page.ts +87 -0
  366. package/.next/types/app/(app)/prepare-deploy/page.ts +87 -0
  367. package/.next/types/app/(app)/profile/page.ts +87 -0
  368. package/.next/types/app/(app)/pulse/page.ts +87 -0
  369. package/.next/types/app/(app)/reports/[id]/page.ts +87 -0
  370. package/.next/types/app/(app)/reports/page.ts +87 -0
  371. package/.next/types/app/(app)/routines/page.ts +87 -0
  372. package/.next/types/app/(app)/search/page.ts +87 -0
  373. package/.next/types/app/(app)/security/page.ts +87 -0
  374. package/.next/types/app/(app)/skills/page.ts +87 -0
  375. package/.next/types/app/(app)/tasks/page.ts +87 -0
  376. package/.next/types/app/(app)/test-dev/page.ts +87 -0
  377. package/.next/types/app/(app)/update/page.ts +87 -0
  378. package/.next/types/app/(auth)/login/page.ts +87 -0
  379. package/.next/types/app/(auth)/onboarding/page.ts +87 -0
  380. package/.next/types/app/api/auth/[...all]/route.ts +351 -0
  381. package/.next/types/app/api/cron/tick/route.ts +351 -0
  382. package/.next/types/app/api/dev-login/route.ts +351 -0
  383. package/.next/types/app/api/locks/acquire/route.ts +351 -0
  384. package/.next/types/app/api/models/progress/route.ts +351 -0
  385. package/.next/types/app/api/passkey/authenticate/options/route.ts +351 -0
  386. package/.next/types/app/api/passkey/authenticate/verify/route.ts +351 -0
  387. package/.next/types/app/api/passkey/register/options/route.ts +351 -0
  388. package/.next/types/app/api/passkey/register/verify/route.ts +351 -0
  389. package/.next/types/app/api/stream/route.ts +351 -0
  390. package/.next/types/app/api/sync/file/route.ts +351 -0
  391. package/.next/types/app/api/telegram/poll/route.ts +351 -0
  392. package/.next/types/app/api/upload/route.ts +351 -0
  393. package/.next/types/app/api/v1/[[...path]]/route.ts +351 -0
  394. package/.next/types/cache-life.d.ts +145 -0
  395. package/.next/types/link.d.ts +210 -0
  396. package/.next/types/package.json +1 -0
  397. package/.next/types/routes.d.ts +120 -0
  398. package/.next/types/validator.ts +511 -0
  399. package/CHANGELOG.md +312 -0
  400. package/LICENSE +21 -0
  401. package/README.md +382 -0
  402. package/README.pt-BR.md +391 -0
  403. package/bin/constella.mjs +329 -0
  404. package/bin/guard-hook.mjs +44 -0
  405. package/bin/lock-hook.mjs +49 -0
  406. package/bin/worker.mjs +142 -0
  407. package/docs/assets/arch-orbit.svg +56 -0
  408. package/docs/assets/blackhole.svg +37 -0
  409. package/docs/assets/divider-orbit.svg +23 -0
  410. package/docs/assets/hero-constella.svg +72 -0
  411. package/docs/en/AGENTS.md +279 -0
  412. package/docs/en/AI_ARCHITECTURE.md +373 -0
  413. package/docs/en/ARCHITECTURE.md +334 -0
  414. package/docs/en/AUTH_MODE.md +247 -0
  415. package/docs/en/CHAT_COMMANDS.md +305 -0
  416. package/docs/en/CONFIGURATION.md +340 -0
  417. package/docs/en/DEPLOY.md +331 -0
  418. package/docs/en/DM.md +297 -0
  419. package/docs/en/FAQ.md +258 -0
  420. package/docs/en/GITHUB.md +341 -0
  421. package/docs/en/GOALS_SPECS_ISSUES.md +303 -0
  422. package/docs/en/INBOX.md +340 -0
  423. package/docs/en/INSTALLATION.md +329 -0
  424. package/docs/en/KB_AGENT.md +305 -0
  425. package/docs/en/KB_RAG.md +356 -0
  426. package/docs/en/MCP.md +313 -0
  427. package/docs/en/MEMORY_RAG.md +289 -0
  428. package/docs/en/MODELS.md +341 -0
  429. package/docs/en/ONBOARDING.md +327 -0
  430. package/docs/en/PLUGINS.md +290 -0
  431. package/docs/en/PORTABLE_MODE.md +387 -0
  432. package/docs/en/PO_AGENT.md +379 -0
  433. package/docs/en/PREPARE_DEPLOY.md +308 -0
  434. package/docs/en/PROJECT_STACKS.md +258 -0
  435. package/docs/en/PUBLIC_API.md +315 -0
  436. package/docs/en/PUBLISHING.md +343 -0
  437. package/docs/en/README.md +95 -0
  438. package/docs/en/SECURITY.md +280 -0
  439. package/docs/en/SKILLS.md +349 -0
  440. package/docs/en/START_MODE.md +340 -0
  441. package/docs/en/SYNCED_BLOCKS.md +320 -0
  442. package/docs/en/TEAM_ROOM.md +285 -0
  443. package/docs/en/TELEGRAM.md +294 -0
  444. package/docs/en/TEST_DEV.md +321 -0
  445. package/docs/en/TROUBLESHOOTING.md +294 -0
  446. package/docs/en/UPDATE.md +301 -0
  447. package/docs/en/VPS_MODE.md +334 -0
  448. package/docs/en/WORKFLOW.md +321 -0
  449. package/docs/pt/AGENTS.md +279 -0
  450. package/docs/pt/AI_ARCHITECTURE.md +373 -0
  451. package/docs/pt/ARCHITECTURE.md +334 -0
  452. package/docs/pt/AUTH_MODE.md +247 -0
  453. package/docs/pt/CHAT_COMMANDS.md +307 -0
  454. package/docs/pt/CONFIGURATION.md +340 -0
  455. package/docs/pt/DEPLOY.md +331 -0
  456. package/docs/pt/DM.md +297 -0
  457. package/docs/pt/FAQ.md +258 -0
  458. package/docs/pt/GITHUB.md +341 -0
  459. package/docs/pt/GOALS_SPECS_ISSUES.md +303 -0
  460. package/docs/pt/INBOX.md +340 -0
  461. package/docs/pt/INSTALLATION.md +329 -0
  462. package/docs/pt/KB_AGENT.md +305 -0
  463. package/docs/pt/KB_RAG.md +356 -0
  464. package/docs/pt/MCP.md +313 -0
  465. package/docs/pt/MEMORY_RAG.md +289 -0
  466. package/docs/pt/MODELS.md +341 -0
  467. package/docs/pt/ONBOARDING.md +327 -0
  468. package/docs/pt/PLUGINS.md +290 -0
  469. package/docs/pt/PORTABLE_MODE.md +387 -0
  470. package/docs/pt/PO_AGENT.md +379 -0
  471. package/docs/pt/PREPARE_DEPLOY.md +308 -0
  472. package/docs/pt/PROJECT_STACKS.md +258 -0
  473. package/docs/pt/PUBLIC_API.md +315 -0
  474. package/docs/pt/PUBLISHING.md +343 -0
  475. package/docs/pt/README.md +95 -0
  476. package/docs/pt/SECURITY.md +280 -0
  477. package/docs/pt/SKILLS.md +349 -0
  478. package/docs/pt/START_MODE.md +340 -0
  479. package/docs/pt/SYNCED_BLOCKS.md +320 -0
  480. package/docs/pt/TEAM_ROOM.md +285 -0
  481. package/docs/pt/TELEGRAM.md +294 -0
  482. package/docs/pt/TEST_DEV.md +321 -0
  483. package/docs/pt/TROUBLESHOOTING.md +294 -0
  484. package/docs/pt/UPDATE.md +301 -0
  485. package/docs/pt/VPS_MODE.md +334 -0
  486. package/docs/pt/WORKFLOW.md +321 -0
  487. package/drizzle/0000_regular_nightshade.sql +644 -0
  488. package/drizzle/0001_mixed_zombie.sql +106 -0
  489. package/drizzle/meta/0000_snapshot.json +4650 -0
  490. package/drizzle/meta/0001_snapshot.json +5418 -0
  491. package/drizzle/meta/_journal.json +20 -0
  492. package/drizzle.config.mjs +16 -0
  493. package/next.config.mjs +18 -0
  494. package/package.json +130 -0
  495. package/scripts/clean-repo.mjs +20 -0
  496. package/scripts/dev-all.mjs +46 -0
  497. package/scripts/i18n-parity.mjs +57 -0
  498. package/scripts/mcp-server.mjs +100 -0
  499. package/scripts/postbuild.mjs +11 -0
  500. package/scripts/publish-public.mjs +116 -0
  501. package/scripts/start-all.mjs +45 -0
  502. package/scripts/trim-next.mjs +23 -0
  503. package/scripts/vps-install.sh +39 -0
  504. package/skills/CONTRIBUTING.md +122 -0
  505. package/skills/COVERAGE.md +129 -0
  506. package/skills/INDEX.json +3443 -0
  507. package/skills/README.md +57 -0
  508. package/skills/design/animation-motion/SKILL.md +60 -0
  509. package/skills/design/color-and-typography/SKILL.md +60 -0
  510. package/skills/design/css-techniques/SKILL.md +58 -0
  511. package/skills/design/design-systems/SKILL.md +60 -0
  512. package/skills/design/gradients/SKILL.md +59 -0
  513. package/skills/design/graphic-design-basics/SKILL.md +55 -0
  514. package/skills/design/microinteractions/SKILL.md +58 -0
  515. package/skills/design/responsive-layout/SKILL.md +59 -0
  516. package/skills/design/ui-ux-principles/SKILL.md +58 -0
  517. package/skills/engineering/architecture/api-design-rest-graphql/SKILL.md +67 -0
  518. package/skills/engineering/architecture/caching-strategies/SKILL.md +59 -0
  519. package/skills/engineering/architecture/data-modeling/SKILL.md +64 -0
  520. package/skills/engineering/architecture/message-queues-async/SKILL.md +58 -0
  521. package/skills/engineering/architecture/scalability-reliability/SKILL.md +62 -0
  522. package/skills/engineering/architecture/software-architecture-patterns/SKILL.md +56 -0
  523. package/skills/engineering/architecture/system-design-fundamentals/SKILL.md +56 -0
  524. package/skills/engineering/backend/auth-and-authorization/SKILL.md +62 -0
  525. package/skills/engineering/backend/backend-fundamentals/SKILL.md +65 -0
  526. package/skills/engineering/backend/observability-logging/SKILL.md +60 -0
  527. package/skills/engineering/frontend/accessibility-wcag/SKILL.md +57 -0
  528. package/skills/engineering/frontend/frontend-architecture/SKILL.md +65 -0
  529. package/skills/engineering/frontend/rendering-strategies-ssr-csr/SKILL.md +60 -0
  530. package/skills/engineering/frontend/state-management/SKILL.md +69 -0
  531. package/skills/engineering/performance/backend-performance/SKILL.md +69 -0
  532. package/skills/engineering/performance/database-query-optimization/SKILL.md +64 -0
  533. package/skills/engineering/performance/profiling-and-benchmarking/SKILL.md +60 -0
  534. package/skills/engineering/performance/web-performance-core-vitals/SKILL.md +72 -0
  535. package/skills/engineering/practices/clean-code/SKILL.md +61 -0
  536. package/skills/engineering/practices/code-optimization/SKILL.md +60 -0
  537. package/skills/engineering/practices/code-review-practices/SKILL.md +58 -0
  538. package/skills/engineering/practices/git-workflow/SKILL.md +62 -0
  539. package/skills/engineering/practices/refactoring/SKILL.md +58 -0
  540. package/skills/engineering/security/appsec-fundamentals/SKILL.md +70 -0
  541. package/skills/engineering/security/dependency-supply-chain/SKILL.md +77 -0
  542. package/skills/engineering/security/owasp-asvs/SKILL.md +54 -0
  543. package/skills/engineering/security/owasp-top-10/SKILL.md +63 -0
  544. package/skills/engineering/security/secrets-management/SKILL.md +58 -0
  545. package/skills/engineering/security/secure-auth-sessions/SKILL.md +56 -0
  546. package/skills/engineering/testing/tdd-and-coverage/SKILL.md +62 -0
  547. package/skills/engineering/testing/testing-strategy-pyramid/SKILL.md +56 -0
  548. package/skills/engineering/testing/unit-integration-e2e/SKILL.md +75 -0
  549. package/skills/languages/c/SKILL.md +74 -0
  550. package/skills/languages/clojure/SKILL.md +73 -0
  551. package/skills/languages/cpp/SKILL.md +75 -0
  552. package/skills/languages/csharp/SKILL.md +75 -0
  553. package/skills/languages/dart/SKILL.md +82 -0
  554. package/skills/languages/elixir/SKILL.md +74 -0
  555. package/skills/languages/erlang/SKILL.md +76 -0
  556. package/skills/languages/go/SKILL.md +83 -0
  557. package/skills/languages/haskell/SKILL.md +70 -0
  558. package/skills/languages/java/SKILL.md +71 -0
  559. package/skills/languages/javascript/SKILL.md +62 -0
  560. package/skills/languages/kotlin/SKILL.md +68 -0
  561. package/skills/languages/lua/SKILL.md +79 -0
  562. package/skills/languages/objectivec/SKILL.md +83 -0
  563. package/skills/languages/php/SKILL.md +74 -0
  564. package/skills/languages/python/SKILL.md +68 -0
  565. package/skills/languages/r/SKILL.md +70 -0
  566. package/skills/languages/ruby/SKILL.md +67 -0
  567. package/skills/languages/rust/SKILL.md +72 -0
  568. package/skills/languages/scala/SKILL.md +73 -0
  569. package/skills/languages/swift/SKILL.md +73 -0
  570. package/skills/languages/typescript/SKILL.md +69 -0
  571. package/skills/meta/authoring-agent-skills/SKILL.md +73 -0
  572. package/skills/meta/progressive-disclosure/SKILL.md +65 -0
  573. package/skills/meta/skill-frontmatter-spec/SKILL.md +65 -0
  574. package/skills/process/adr-technical-decisions/SKILL.md +59 -0
  575. package/skills/process/app-planning/SKILL.md +63 -0
  576. package/skills/process/architecture-before-code/SKILL.md +52 -0
  577. package/skills/process/breaking-work-into-sprints/SKILL.md +53 -0
  578. package/skills/process/idea-to-product/SKILL.md +50 -0
  579. package/skills/process/mocks-and-screen-flows/SKILL.md +52 -0
  580. package/skills/process/prioritization-moscow-rice/SKILL.md +64 -0
  581. package/skills/process/problem-framing/SKILL.md +51 -0
  582. package/skills/process/product-discovery/SKILL.md +53 -0
  583. package/skills/process/readme-generation/SKILL.md +90 -0
  584. package/skills/process/requirements-to-specs/SKILL.md +53 -0
  585. package/skills/process/research-official-docs/SKILL.md +58 -0
  586. package/skills/process/review-code-perf-security/SKILL.md +65 -0
  587. package/skills/process/security-by-design/SKILL.md +68 -0
  588. package/skills/process/specs-to-issues/SKILL.md +53 -0
  589. package/skills/process/testing-before-done/SKILL.md +61 -0
  590. package/skills/process/validating-ux-navigation/SKILL.md +63 -0
  591. package/skills/references/ai-attachments-ui/SKILL.md +66 -0
  592. package/skills/references/ai-in-browser-webllm/SKILL.md +74 -0
  593. package/skills/references/ai-tool-ui-patterns/SKILL.md +63 -0
  594. package/skills/references/component-patterns-gallery/SKILL.md +62 -0
  595. package/skills/references/gradient-resources/SKILL.md +66 -0
  596. package/skills/references/react-component-libraries/SKILL.md +61 -0
  597. package/skills/references/saas-landing-patterns/SKILL.md +67 -0
  598. package/skills/references/shadcn-tailwind-theming/SKILL.md +74 -0
  599. package/skills/references/vercel-ai-sdk-elements/SKILL.md +66 -0
  600. package/skills/references/web-animation-codrops/SKILL.md +68 -0
  601. package/skills/stacks/aiml/jupyter/SKILL.md +68 -0
  602. package/skills/stacks/aiml/keras/SKILL.md +77 -0
  603. package/skills/stacks/aiml/numpy/SKILL.md +69 -0
  604. package/skills/stacks/aiml/pandas/SKILL.md +72 -0
  605. package/skills/stacks/aiml/pytorch/SKILL.md +77 -0
  606. package/skills/stacks/aiml/scikit-learn/SKILL.md +74 -0
  607. package/skills/stacks/aiml/tensorflow/SKILL.md +79 -0
  608. package/skills/stacks/auth/auth0/SKILL.md +63 -0
  609. package/skills/stacks/auth/authjs/SKILL.md +69 -0
  610. package/skills/stacks/auth/clerk/SKILL.md +72 -0
  611. package/skills/stacks/auth/keycloak/SKILL.md +63 -0
  612. package/skills/stacks/auth/lucia/SKILL.md +56 -0
  613. package/skills/stacks/auth/passport/SKILL.md +70 -0
  614. package/skills/stacks/auth/supabase-auth/SKILL.md +66 -0
  615. package/skills/stacks/baas/amplify/SKILL.md +71 -0
  616. package/skills/stacks/baas/appwrite/SKILL.md +79 -0
  617. package/skills/stacks/baas/firebase/SKILL.md +73 -0
  618. package/skills/stacks/baas/heroku/SKILL.md +71 -0
  619. package/skills/stacks/backend/actix/SKILL.md +77 -0
  620. package/skills/stacks/backend/adonisjs/SKILL.md +65 -0
  621. package/skills/stacks/backend/aspnet-core/SKILL.md +75 -0
  622. package/skills/stacks/backend/codeigniter/SKILL.md +76 -0
  623. package/skills/stacks/backend/django/SKILL.md +62 -0
  624. package/skills/stacks/backend/express/SKILL.md +65 -0
  625. package/skills/stacks/backend/fastapi/SKILL.md +64 -0
  626. package/skills/stacks/backend/fastify/SKILL.md +64 -0
  627. package/skills/stacks/backend/fiber/SKILL.md +68 -0
  628. package/skills/stacks/backend/flask/SKILL.md +71 -0
  629. package/skills/stacks/backend/gin/SKILL.md +68 -0
  630. package/skills/stacks/backend/graphql/SKILL.md +70 -0
  631. package/skills/stacks/backend/hono/SKILL.md +64 -0
  632. package/skills/stacks/backend/koa/SKILL.md +63 -0
  633. package/skills/stacks/backend/laravel/SKILL.md +73 -0
  634. package/skills/stacks/backend/nestjs/SKILL.md +70 -0
  635. package/skills/stacks/backend/nginx/SKILL.md +77 -0
  636. package/skills/stacks/backend/phoenix/SKILL.md +68 -0
  637. package/skills/stacks/backend/rails/SKILL.md +67 -0
  638. package/skills/stacks/backend/spring/SKILL.md +70 -0
  639. package/skills/stacks/backend/spring-boot/SKILL.md +70 -0
  640. package/skills/stacks/backend/symfony/SKILL.md +77 -0
  641. package/skills/stacks/container/containerd/SKILL.md +75 -0
  642. package/skills/stacks/container/docker/SKILL.md +90 -0
  643. package/skills/stacks/container/podman/SKILL.md +93 -0
  644. package/skills/stacks/database/cassandra/SKILL.md +74 -0
  645. package/skills/stacks/database/cockroachdb/SKILL.md +69 -0
  646. package/skills/stacks/database/dynamodb/SKILL.md +62 -0
  647. package/skills/stacks/database/mariadb/SKILL.md +71 -0
  648. package/skills/stacks/database/mongodb/SKILL.md +71 -0
  649. package/skills/stacks/database/mysql/SKILL.md +72 -0
  650. package/skills/stacks/database/neon/SKILL.md +68 -0
  651. package/skills/stacks/database/planetscale/SKILL.md +70 -0
  652. package/skills/stacks/database/postgresql/SKILL.md +81 -0
  653. package/skills/stacks/database/redis/SKILL.md +78 -0
  654. package/skills/stacks/database/sqlite/SKILL.md +70 -0
  655. package/skills/stacks/database/supabase/SKILL.md +79 -0
  656. package/skills/stacks/dataviz/chart-js/SKILL.md +72 -0
  657. package/skills/stacks/dataviz/d3/SKILL.md +77 -0
  658. package/skills/stacks/dataviz/grafana/SKILL.md +69 -0
  659. package/skills/stacks/dataviz/plotly/SKILL.md +71 -0
  660. package/skills/stacks/frontend/alpine/SKILL.md +75 -0
  661. package/skills/stacks/frontend/angular/SKILL.md +75 -0
  662. package/skills/stacks/frontend/backbone/SKILL.md +82 -0
  663. package/skills/stacks/frontend/ember/SKILL.md +85 -0
  664. package/skills/stacks/frontend/htmx/SKILL.md +73 -0
  665. package/skills/stacks/frontend/lit/SKILL.md +76 -0
  666. package/skills/stacks/frontend/preact/SKILL.md +74 -0
  667. package/skills/stacks/frontend/qwik/SKILL.md +65 -0
  668. package/skills/stacks/frontend/react/SKILL.md +77 -0
  669. package/skills/stacks/frontend/solidjs/SKILL.md +75 -0
  670. package/skills/stacks/frontend/svelte/SKILL.md +70 -0
  671. package/skills/stacks/frontend/vue/SKILL.md +69 -0
  672. package/skills/stacks/infra/ansible/SKILL.md +76 -0
  673. package/skills/stacks/infra/aws/SKILL.md +66 -0
  674. package/skills/stacks/infra/azure/SKILL.md +72 -0
  675. package/skills/stacks/infra/circleci/SKILL.md +78 -0
  676. package/skills/stacks/infra/cloudflare/SKILL.md +65 -0
  677. package/skills/stacks/infra/fly-io/SKILL.md +63 -0
  678. package/skills/stacks/infra/gcp/SKILL.md +66 -0
  679. package/skills/stacks/infra/jenkins/SKILL.md +73 -0
  680. package/skills/stacks/infra/kubernetes/SKILL.md +64 -0
  681. package/skills/stacks/infra/netlify/SKILL.md +60 -0
  682. package/skills/stacks/infra/railway/SKILL.md +63 -0
  683. package/skills/stacks/infra/tailscale/SKILL.md +65 -0
  684. package/skills/stacks/infra/terraform/SKILL.md +75 -0
  685. package/skills/stacks/infra/vagrant/SKILL.md +70 -0
  686. package/skills/stacks/infra/vercel/SKILL.md +60 -0
  687. package/skills/stacks/meta/astro/SKILL.md +64 -0
  688. package/skills/stacks/meta/docusaurus/SKILL.md +71 -0
  689. package/skills/stacks/meta/eleventy/SKILL.md +69 -0
  690. package/skills/stacks/meta/gatsby/SKILL.md +63 -0
  691. package/skills/stacks/meta/hugo/SKILL.md +73 -0
  692. package/skills/stacks/meta/jekyll/SKILL.md +70 -0
  693. package/skills/stacks/meta/nextjs/SKILL.md +62 -0
  694. package/skills/stacks/meta/nuxt/SKILL.md +66 -0
  695. package/skills/stacks/meta/remix/SKILL.md +67 -0
  696. package/skills/stacks/meta/sveltekit/SKILL.md +70 -0
  697. package/skills/stacks/meta/vite/SKILL.md +63 -0
  698. package/skills/stacks/mobile/android/SKILL.md +77 -0
  699. package/skills/stacks/mobile/flutter/SKILL.md +77 -0
  700. package/skills/stacks/mobile/ionic/SKILL.md +72 -0
  701. package/skills/stacks/mobile/nativescript/SKILL.md +71 -0
  702. package/skills/stacks/mobile/react-native/SKILL.md +75 -0
  703. package/skills/stacks/mobile/xamarin/SKILL.md +73 -0
  704. package/skills/stacks/orm/diesel/SKILL.md +72 -0
  705. package/skills/stacks/orm/django-orm/SKILL.md +58 -0
  706. package/skills/stacks/orm/drizzle/SKILL.md +67 -0
  707. package/skills/stacks/orm/gorm/SKILL.md +73 -0
  708. package/skills/stacks/orm/knex/SKILL.md +64 -0
  709. package/skills/stacks/orm/mongoose/SKILL.md +64 -0
  710. package/skills/stacks/orm/prisma/SKILL.md +64 -0
  711. package/skills/stacks/orm/sequelize/SKILL.md +65 -0
  712. package/skills/stacks/orm/sqlalchemy/SKILL.md +71 -0
  713. package/skills/stacks/orm/typeorm/SKILL.md +70 -0
  714. package/skills/stacks/queue/bullmq/SKILL.md +69 -0
  715. package/skills/stacks/queue/celery/SKILL.md +68 -0
  716. package/skills/stacks/queue/kafka/SKILL.md +66 -0
  717. package/skills/stacks/queue/nats/SKILL.md +66 -0
  718. package/skills/stacks/queue/rabbitmq/SKILL.md +64 -0
  719. package/skills/stacks/queue/redis/SKILL.md +66 -0
  720. package/skills/stacks/runtime/beam/SKILL.md +72 -0
  721. package/skills/stacks/runtime/bun/SKILL.md +80 -0
  722. package/skills/stacks/runtime/deno/SKILL.md +74 -0
  723. package/skills/stacks/runtime/dotnet/SKILL.md +64 -0
  724. package/skills/stacks/runtime/jvm/SKILL.md +66 -0
  725. package/skills/stacks/runtime/node/SKILL.md +70 -0
  726. package/skills/stacks/runtime/pypy/SKILL.md +69 -0
  727. package/skills/stacks/runtime/python3/SKILL.md +70 -0
  728. package/skills/stacks/styling/bootstrap/SKILL.md +74 -0
  729. package/skills/stacks/styling/bulma/SKILL.md +80 -0
  730. package/skills/stacks/styling/chakra-ui/SKILL.md +61 -0
  731. package/skills/stacks/styling/css-modules/SKILL.md +54 -0
  732. package/skills/stacks/styling/mui/SKILL.md +60 -0
  733. package/skills/stacks/styling/sass/SKILL.md +63 -0
  734. package/skills/stacks/styling/shadcn-ui/SKILL.md +58 -0
  735. package/skills/stacks/styling/styled-components/SKILL.md +62 -0
  736. package/skills/stacks/styling/tailwind/SKILL.md +59 -0
  737. package/skills/stacks/styling/unocss/SKILL.md +64 -0
  738. package/skills/stacks/styling/vanilla-extract/SKILL.md +64 -0
  739. package/skills/stacks/styling/vuetify/SKILL.md +89 -0
  740. package/skills/stacks/testing/cypress/SKILL.md +68 -0
  741. package/skills/stacks/testing/jasmine/SKILL.md +67 -0
  742. package/skills/stacks/testing/jest/SKILL.md +67 -0
  743. package/skills/stacks/testing/mocha/SKILL.md +71 -0
  744. package/skills/stacks/testing/playwright/SKILL.md +68 -0
  745. package/skills/stacks/testing/puppeteer/SKILL.md +70 -0
  746. package/skills/stacks/testing/selenium/SKILL.md +70 -0
  747. package/skills/stacks/testing/vitest/SKILL.md +68 -0
package/docs/en/FAQ.md ADDED
@@ -0,0 +1,258 @@
1
+ [โ† Docs index](./README.md) ยท [๐Ÿ‡ง๐Ÿ‡ท Portuguรชs](../pt/FAQ.md) ยท [โœฆ Constella](../../README.md)
2
+
3
+ # FAQ โ€” Signals from the Control Plane โœฆ๐ŸŒŒ
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ Honest answers to the questions people actually ask before (and after) launching their first agent-company. Everything here is grounded in the real codebase โ€” no marketing, no vaporware.
8
+
9
+ ---
10
+
11
+ ## When to use this page
12
+
13
+ - You are evaluating Constella and want to know what is **real** vs. aspirational.
14
+ - You hit a decision (which run mode? local or cloud models? how do I cap spend?) and want the short, sourced answer.
15
+ - You want a fast index into the deeper docs โ€” every answer links to the canonical page.
16
+
17
+ ---
18
+
19
+ ## How it works (the 30-second model) ๐Ÿ›ฐ๏ธ
20
+
21
+ Constella is a **local-first control plane**. It runs a small ship of services on your machine โ€” a Next.js web app plus a background worker โ€” and from there it spawns **real CLI agents** (`claude`, `codex`, and others) as subprocesses that read, write, and ship code inside an isolated workspace directory. The directory on disk is the source of truth; the SQLite database is an index over it.
22
+
23
+ ```mermaid
24
+ flowchart LR
25
+ OP["Operator"] -->|chat / approve| WEB["Web app (Next.js)"]
26
+ WEB --> DB[("SQLite ยท constella.db")]
27
+ WEB --> FS[["Workspace dir (FS jail)"]]
28
+ WK["Worker (cron ยท watcher ยท Telegram)"] --> WEB
29
+ WK -->|spawn| CLI["claude / codex CLI"]
30
+ CLI --> FS
31
+ EXT["External AI host (MCP / API)"] -.->|PAT| WEB
32
+ ```
33
+
34
+ ---
35
+
36
+ ## 1. Is it real? ๐ŸŒ 
37
+
38
+ **Yes.** Agents are not scripted mocks. `src/server/adapters/cli.ts` spawns the locally-installed `claude` (Claude Code) and `codex` CLIs as real subprocesses with `spawn(...)`, feeds them the prompt on stdin, and parses **real** token usage and cost from their JSON output:
39
+
40
+ - `runClaude()` runs `claude -p --output-format json โ€ฆ` and reads `is_error`, `result`, `usage`, and `total_cost_usd` straight from the CLI.
41
+ - Where a CLI emits no usage (e.g. Hermes, Aider, Cursor headless modes) the cost is recorded as `0` โ€” **honest zero**, never a fabricated number (`base()` and the per-runner comments make this explicit).
42
+ - The agent's working directory (`cwd`) is the org's real workspace, so edits land on real files; the Team Room renders **real diffs** parsed from the CLI's `Edit`/`Write` tool calls (`mapTool` in the same file).
43
+
44
+ There are no API keys held by Constella for the Claude/Codex path โ€” it drives your **existing CLI login/subscription**.
45
+
46
+ โ†’ [AI_ARCHITECTURE](./AI_ARCHITECTURE.md) ยท [AGENTS](./AGENTS.md) ยท [ARCHITECTURE](./ARCHITECTURE.md)
47
+
48
+ ---
49
+
50
+ ## 2. Local models or cloud models? ๐Ÿช
51
+
52
+ Both, depending on the job:
53
+
54
+ | Layer | Backend | Where defined |
55
+ | --- | --- | --- |
56
+ | **Reasoning / coding agents** | Cloud CLIs by default (`claude`, `codex`, plus Aider/OpenCode/Copilot/Cursor/Cline/Kilo) routed through their own logins | `src/server/adapters/cli.ts`, `CLI_MODELS` |
57
+ | **Local chat models** | `llama.cpp` chat server at `LLAMACPP_URL` (default `http://127.0.0.1:8082`), GGUF from the `lmstudio-community` catalog | `src/server/local-models.ts`, `src/data/model-catalog.ts` |
58
+ | **RAG embeddings** | Dedicated local `llama.cpp` embed server `CONSTELLA_EMBED_URL` (default `http://127.0.0.1:8083`), auto-started on boot; falls back to Ollama (`OLLAMA_URL`, `nomic-embed-text`) | `src/server/rag.ts` |
59
+
60
+ The model catalog itself is pulled from `models.dev` (`https://models.dev/api.json`, cached 24h at `~/.constella/cache/models-dev.json`) with an offline `FALLBACK_MODELS` table baked in. Before downloading a local GGUF, `detectHardware()` probes your CPU/RAM/GPU/VRAM and recommends a quantisation (`Q5_K_M`/`Q4_K_M`/`Q4_0`) and a max parameter count that will actually fit.
61
+
62
+ So: **cloud for the heavy thinking, local for embeddings/RAG (and optional local chat).** If no embed backend is up, RAG degrades to a keyword heuristic rather than failing.
63
+
64
+ โ†’ [MODELS](./MODELS.md) ยท [KB_RAG](./KB_RAG.md) ยท [MEMORY_RAG](./MEMORY_RAG.md)
65
+
66
+ ---
67
+
68
+ ## 3. How do I control cost? ๐Ÿ•ณ๏ธ
69
+
70
+ Two hard ceilings, both **enforced server-side at dispatch time** in `src/server/budget.ts`:
71
+
72
+ - **Per-agent daily cap** โ€” `agent.dailyCapUsd` (USD). Each of the 10 seeded agents ships with a sensible default (e.g. Ada `15`, Linus `40`, Margaret `50`, Vannevar `10`). Change it with `setAgentDailyCap(agentId, usd)` from the Costs UI.
73
+ - **Workspace monthly cap** โ€” `budget.monthlyCapUsd` (USD), set with `setMonthlyCap(usd)`.
74
+
75
+ The gate is `canDispatch(...)`:
76
+
77
+ ```ts
78
+ return spentTodayUsd < a.dailyCapUsd && monthlySpentUsd < b.monthlyCapUsd;
79
+ ```
80
+
81
+ An agent may only spend if it is **under both** its daily cap and the workspace monthly cap. The cap appears in every agent's persona file too (`Stop at the daily budget cap ($<cap>).`), so the agent is told its own limit.
82
+
83
+ Other cost levers:
84
+
85
+ - Each agent runs on a tier you choose (`opus`/`sonnet`/`haiku` for Claude; cheaper models reduce spend).
86
+ - Web research (`WebSearch`/`WebFetch`) is on by default but can be turned off (`CONSTELLA_WEB_RESEARCH=0`).
87
+ - Runs have a hard timeout (default `180s`) so a stuck run cannot bleed budget indefinitely.
88
+
89
+ โ†’ [CONFIGURATION](./CONFIGURATION.md) ยท [AGENTS](./AGENTS.md)
90
+
91
+ ---
92
+
93
+ ## 4. Where does my data live? ๐ŸŒŒ
94
+
95
+ Everything stays under one runtime root on your machine โ€” there is no Constella cloud:
96
+
97
+ | Thing | Location |
98
+ | --- | --- |
99
+ | Runtime root | `~/.constella` (override with `CONSTELLA_HOME` or `--path`) |
100
+ | Database | `<HOME>/constella.db` (`DATABASE_URL=file:<HOME>/constella.db`) |
101
+ | Per-org workspace | `~/.constella/organizations/<orgId>/workspace/` |
102
+ | Secrets | `<HOME>/.env`, written with mode `0o600` (chmod 600): `BETTER_AUTH_SECRET`, `CONSTELLA_VAULT_KEY`, `CONSTELLA_WORKER_SECRET` |
103
+ | Model cache | `~/.constella/cache/models-dev.json` |
104
+ | Update backups | `<HOME>/backups/<timestamp>/` |
105
+
106
+ The workspace directory is the **source of truth** (`src/lib/fs-workspace.ts`); SQLite indexes it. Each org is keyed by its stable `organization.id`, and all access is sandboxed by `safe()` โ€” no path traversal, no cross-org leakage. Provider keys and tokens are encrypted at rest (AES-256-GCM) in the `vault` table.
107
+
108
+ โ†’ [ARCHITECTURE](./ARCHITECTURE.md) ยท [SECURITY](./SECURITY.md) ยท [CONFIGURATION](./CONFIGURATION.md)
109
+
110
+ ---
111
+
112
+ ## 5. Can I run it across multiple machines? ๐Ÿš€
113
+
114
+ Yes โ€” two supported patterns, plus a caveat:
115
+
116
+ - **Portable mode** (`--portable`): the runtime root lives on a **USB drive** mounted as root, carried between machines. Requires `>=32GB` free (fatal below that); `>=32GB` is fine. Login (email+password) is required and it binds `0.0.0.0`.
117
+ - **VPS mode** (`--vps`): Constella runs in Docker on a server and you reach it over your **Tailscale tailnet**. Binds `0.0.0.0`, login required.
118
+
119
+ Caveat: the CLI subscription credentials (`~/.claude/.credentials.json`) live on the host running the agents. Constella copies the operator's Claude credentials into a clean per-agent config dir so agents stay logged in (see Q8), but the **host machine** still needs a valid CLI login. Portable mode carries Constella's data, not necessarily every CLI's auth.
120
+
121
+ There is **no built-in multi-machine sync of one workspace** โ€” pick a single host (VPS) or carry the drive (portable).
122
+
123
+ โ†’ [PORTABLE_MODE](./PORTABLE_MODE.md) ยท [VPS_MODE](./VPS_MODE.md)
124
+
125
+ ---
126
+
127
+ ## 6. Which run mode should I pick? ๐Ÿ›ฐ๏ธ
128
+
129
+ There are four (`src/lib/run-mode.ts`, `type RunMode = "start" | "auth" | "vps" | "portable"`):
130
+
131
+ | Mode | Login | Bind | Best for |
132
+ | --- | --- | --- | --- |
133
+ | `start` (default) | none โ€” auto operator `operator@constella.dev` / `operator123` | `127.0.0.1` | Solo local use on your own machine; agents get **full access** (install deps, run tests) |
134
+ | `auth` | email + password each session | `127.0.0.1` | Local, but you want a real login gate |
135
+ | `vps` | email + password | `0.0.0.0` | A shared server over Tailscale, runs in Docker; agents **jailed** to edits-only |
136
+ | `portable` | email + password | `0.0.0.0` | A USB you carry between machines; agents **jailed** |
137
+
138
+ ```mermaid
139
+ flowchart TD
140
+ Q{"Where will it run?"}
141
+ Q -->|My machine, just me| START["start (no login, full agent access)"]
142
+ Q -->|My machine, want a login| AUTH["auth"]
143
+ Q -->|A server I reach remotely| VPS["vps (Docker + Tailscale)"]
144
+ Q -->|A USB I carry around| PORT["portable"]
145
+ ```
146
+
147
+ The mode is stored in `organization.runMode`. In `start` mode agents run with `--permission-mode bypassPermissions` (full); in `vps`/`auth`/`portable` they run `--permission-mode acceptEdits` (jailed). Override with `CONSTELLA_AGENT_FULL_ACCESS=1|0`.
148
+
149
+ โ†’ [START_MODE](./START_MODE.md) ยท [AUTH_MODE](./AUTH_MODE.md) ยท [VPS_MODE](./VPS_MODE.md) ยท [PORTABLE_MODE](./PORTABLE_MODE.md)
150
+
151
+ ---
152
+
153
+ ## 7. Can external AIs drive Constella? (MCP / API) ๐ŸŒ 
154
+
155
+ **Yes โ€” outbound, with a Personal Access Token.**
156
+
157
+ - **Public REST API v1** (`src/app/api/v1/[[...path]]/route.ts`): authenticate with `Authorization: Bearer cn_<token>` (a PAT, SHA-256-hashed in the `personalAccessToken` table, with `scope` `read|write`). Optional `X-Constella-Org` header selects the org. Rate limit is **120 req/min/token**. Reads: `/me`, `/status`, `/review`, `/goals`, `/issues`, `/tasks`, `/specs`, `/kb?q=`. Writes (write scope): `/plan/approve`, `/plan/reject`, `/execution`, `/goals/:id/cancel`, `/goals/:id/archive`, `/work`, `/kb`.
158
+ - **MCP server** (`scripts/mcp-server.mjs`): a self-contained JSON-RPC-over-stdio server (no deps) that maps those REST routes to MCP tools (`constella_status`, `constella_review`, `constella_approve_plan`, `constella_new_work`, โ€ฆ). Point Claude Desktop / Cursor / any MCP host at it with `CONSTELLA_PAT`, `CONSTELLA_BASE_URL` (default `http://localhost:3000`), and optional `CONSTELLA_ORG`.
159
+
160
+ Two directions, do not confuse them:
161
+
162
+ | Direction | What it means | Mechanism |
163
+ | --- | --- | --- |
164
+ | **Outbound (AI โ†’ Constella)** | An external host drives your company | API v1 / `scripts/mcp-server.mjs` + PAT |
165
+ | **Inbound (Constella agent โ†’ external MCP)** | Constella's own agents consume an external MCP server | The `claude` CLI's own `~/.claude` config โ€” **not** the in-app plugin table |
166
+
167
+ โ†’ [PUBLIC_API](./PUBLIC_API.md) ยท [MCP](./MCP.md) ยท [TELEGRAM](./TELEGRAM.md)
168
+
169
+ ---
170
+
171
+ ## 8. How do agents stay logged in? ๐Ÿ›ฐ๏ธ
172
+
173
+ Agents inherit your **operator's CLI login**, not a separate set of keys. For the Claude path:
174
+
175
+ - Constella does **not** redirect `CLAUDE_CONFIG_DIR` (the subscription credentials live there โ€” redirecting it would log the agent out). Instead, by default it passes a settings overlay (`{ "disableAllHooks": true }`, written to a temp file) so the agent runs **vanilla** โ€” independent of your personal `~/.claude` hooks/plugins โ€” while keeping auth intact (`vanillaSettingsArgs()`).
176
+ - When file-locking or the command guard are enabled, Constella builds a clean per-agent config dir (`<HOME>/.agent-claude`) and **copies your `~/.claude/.credentials.json`** into it so the agent stays logged in, carrying only Constella's own hooks (`agentClaudeDir()`). If the credentials file is absent, it **falls back to vanilla** โ€” file-locking degrades, auth never breaks.
177
+
178
+ Provider-routed CLIs (Aider, OpenCode, Copilot, Cursor, Cline, Kilo) authenticate via **their own** login/config โ€” Constella drives them but never holds their keys. The UI shows a `LOGIN_HINTS` string (e.g. `opencode auth login`) when auth isn't detected.
179
+
180
+ โ†’ [AGENTS](./AGENTS.md) ยท [MODELS](./MODELS.md) ยท [SECURITY](./SECURITY.md)
181
+
182
+ ---
183
+
184
+ ## 9. Is the product UI multilingual? ๐ŸŒŒ
185
+
186
+ **The product UI is English-only by rule.** `src/lib/i18n.ts` keeps the English `en` dictionary as the **source** strings; the Portuguese `pt` dictionary is a mirror reserved for the future and validated for key parity (`scripts/i18n-parity.mjs`). The translation plumbing exists (`useT()`, `getServerLang()`, cookie `cn-lang`, `user.lang`), but English is the shipped UI language. All code, UI strings, and even confirm dialogs are English.
187
+
188
+ (These docs are bilingual โ€” EN + PT-BR โ€” but that is documentation, not the running product.)
189
+
190
+ โ†’ [CONFIGURATION](./CONFIGURATION.md)
191
+
192
+ ---
193
+
194
+ ## 10. Step-by-step: from install to first shipped change
195
+
196
+ 1. **Install & launch** โ€” `npx constella` (default `start` mode). โ†’ [INSTALLATION](./INSTALLATION.md)
197
+ 2. **Onboard** โ€” create org + workspace, import a source (`new`/`github`/`local`/`mock`), scaffold `.claude/`, seed 10 agents + skills + plugins. โ†’ [ONBOARDING](./ONBOARDING.md)
198
+ 3. **Set budgets** โ€” pick a workspace monthly cap and per-agent daily caps. โ†’ [CONFIGURATION](./CONFIGURATION.md)
199
+ 4. **Start work** โ€” DM `@ada` "build X", or `/new-work`. โ†’ [DM](./DM.md) ยท [WORKFLOW](./WORKFLOW.md)
200
+ 5. **Approve the plan** โ€” review the CEO's plan and `/approve`. โ†’ [GOALS_SPECS_ISSUES](./GOALS_SPECS_ISSUES.md)
201
+ 6. **Watch it ship** โ€” agents execute, review, test, and (optionally) push. โ†’ [TEAM_ROOM](./TEAM_ROOM.md)
202
+
203
+ ---
204
+
205
+ ## Possible states (quick reference)
206
+
207
+ | Object | States |
208
+ | --- | --- |
209
+ | Agent status | `idle` ยท `working` ยท `review` ยท `blocked` |
210
+ | Agent health | `alive` ยท `stale` ยท `down` |
211
+ | Goal | `active` ยท `cancelled` ยท `archived` ยท `done` |
212
+ | Issue column | `todo` ยท `doing` ยท `blocked` ยท `review` ยท `done` |
213
+ | PAT scope | `read` ยท `write` |
214
+ | Run mode | `start` ยท `auth` ยท `vps` ยท `portable` |
215
+ | Embed backend | Ollama โ†’ llama.cpp embed server โ†’ keyword fallback |
216
+
217
+ ---
218
+
219
+ ## Related integrations
220
+
221
+ - **Telegram** โ€” remote control from your phone via a vaulted bot token; Ada replies. โ†’ [TELEGRAM](./TELEGRAM.md)
222
+ - **GitHub** โ€” vaulted PAT (or OAuth), commit/push and clean-source export. โ†’ [GITHUB](./GITHUB.md)
223
+ - **MCP / API** โ€” outbound control from external AI hosts. โ†’ [MCP](./MCP.md) ยท [PUBLIC_API](./PUBLIC_API.md)
224
+ - **Local models** โ€” llama.cpp chat + embed servers, GGUF catalog. โ†’ [MODELS](./MODELS.md)
225
+
226
+ ---
227
+
228
+ ## Security in one paragraph ๐Ÿ•ณ๏ธ
229
+
230
+ The workspace is an FS jail (`safe()` โ€” lexical + symlink checks, no traversal, root never deleted). Secrets are encrypted (AES-256-GCM, `vault` table) and scrubbed (`scrubSecrets`) before any KB ingest, Telegram send, or log. A destructive-command guard (`bin/guard-hook.mjs`, on by default) blocks catastrophic shell; an opt-in file-lock hook prevents parallel agents clobbering each other. Auth is better-auth email+password with optional 2FA TOTP and WebAuthn passkeys.
231
+
232
+ โ†’ [SECURITY](./SECURITY.md)
233
+
234
+ ---
235
+
236
+ ## Troubleshooting (FAQ-of-the-FAQ)
237
+
238
+ | Symptom | Likely cause | Fix |
239
+ | --- | --- | --- |
240
+ | Agent run fails with "no JSON output" | `claude` CLI not installed/logged in | Sign in to Claude Code; verify with `claude --version` |
241
+ | Agent costs show `0` | That CLI emits no usage (Hermes/Aider/Cursor headless) | Expected โ€” it is an honest zero, not a bug |
242
+ | RAG answers are weak/keyword-only | No embed backend running | Ensure the llama.cpp embed server (`:8083`) or Ollama (`:11434`) is up |
243
+ | API returns `429` | Over `120 req/min` on a token | Back off; the limit resets each minute |
244
+ | API returns `403` on a write | Token has `read` scope | Mint a `write`-scope PAT |
245
+ | Agent "talks like my plugin" | Operator's `~/.claude` hooks leaked in | Default `disableAllHooks` should prevent this; verify no override |
246
+ | Portable launch aborts | `<32GB` free on the drive | Use a drive with โ‰ฅ 32 GB free |
247
+
248
+ โ†’ [TROUBLESHOOTING](./TROUBLESHOOTING.md)
249
+
250
+ ---
251
+
252
+ ## Related links
253
+
254
+ - [ARCHITECTURE](./ARCHITECTURE.md) ยท [AI_ARCHITECTURE](./AI_ARCHITECTURE.md) ยท [AGENTS](./AGENTS.md)
255
+ - [START_MODE](./START_MODE.md) ยท [AUTH_MODE](./AUTH_MODE.md) ยท [VPS_MODE](./VPS_MODE.md) ยท [PORTABLE_MODE](./PORTABLE_MODE.md)
256
+ - [CONFIGURATION](./CONFIGURATION.md) ยท [MODELS](./MODELS.md) ยท [KB_RAG](./KB_RAG.md) ยท [MEMORY_RAG](./MEMORY_RAG.md)
257
+ - [PUBLIC_API](./PUBLIC_API.md) ยท [MCP](./MCP.md) ยท [TELEGRAM](./TELEGRAM.md) ยท [GITHUB](./GITHUB.md)
258
+ - [SECURITY](./SECURITY.md) ยท [TROUBLESHOOTING](./TROUBLESHOOTING.md) ยท [INSTALLATION](./INSTALLATION.md)
@@ -0,0 +1,341 @@
1
+ [โ† Docs index](./README.md) ยท [๐Ÿ‡ง๐Ÿ‡ท Portuguรชs](../pt/GITHUB.md) ยท [โœฆ Constella](../../README.md)
2
+
3
+ # GitHub ๐Ÿ›ฐ๏ธ
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ The launch bay that connects a constellation's workspace to a real Git remote. Two distinct flight paths leave from here: **Commit GitHub** (the full control-plane workspace โ†’ its bound `origin`) and **Export Clean Source** (only the product, stripped of Constella's internal layer โ†’ a separate repo). Both pass through the same secret-scan airlock.
8
+
9
+ > Source of truth: [`src/server/github.ts`](../../src/server/github.ts), [`src/server/prepare-deploy.ts`](../../src/server/prepare-deploy.ts), [`src/server/git-scan.ts`](../../src/server/git-scan.ts).
10
+
11
+ ---
12
+
13
+ ## 1. When to use ๐ŸŒ 
14
+
15
+ - You connected a GitHub account during onboarding (or want to connect/replace one now).
16
+ - An agent (or you) finished work and you want **real local git history** plus a **push to a remote**.
17
+ - You want to publish **only the product** โ€” without `.claude/`, planning docs, or any internal control files โ€” to a public/separate repo.
18
+ - You need to verify there are no leaked secrets before anything leaves the ship.
19
+
20
+ ---
21
+
22
+ ## 2. How it works ๐ŸŒŒ
23
+
24
+ Every workspace lives at the org root on disk (`orgRoot(org.id)`). The GitHub module operates on that directory as a **normal git repository**:
25
+
26
+ - `ensureRepo(cwd)` runs `git init -b main` on first use and drops a default `.gitignore` so `git add -A` never stages `node_modules/`, `.next/`, `dist/`, build output, `.env*`, `uploads/`, or `.testdev/`.
27
+ - Authentication uses a **GitHub token** resolved by `ghToken(workspaceId, userId)`:
28
+ 1. **Vaulted PAT** (`getSecret(workspaceId, "github_pat")`) โ€” preferred.
29
+ 2. **OAuth access token** โ€” the user's GitHub `account.accessToken` from better-auth, usable for git **only** if the OAuth app was granted the `repo` scope.
30
+ - The token is **redacted from every captured string** (`redact()` splits on the token and replaces it with `***`) so it can never leak into a notification, the Inbox, or the UI.
31
+ - All GitHub API calls go through `ghApi(token, path)` against `https://api.github.com` with a 12s timeout and `User-Agent: constella`.
32
+
33
+ ### Two flight paths
34
+
35
+ | Path | Function | Source dir | Target | Strips internal layer? | Push style |
36
+ |------|----------|-----------|--------|------------------------|------------|
37
+ | **Commit GitHub** | `commitPush()` in `github.ts` | the live workspace (`orgRoot`) | the **bound** `origin` repo | No โ€” commits the whole workspace (minus `.gitignore`) | `git push HEAD:<branch>` |
38
+ | **Export Clean Source** | `exportCleanSource()` in `prepare-deploy.ts` | a **temp** clean tree | a **separate** repo (`owner/repo`) | Yes โ€” only `isCleanProductPath` survives | `git push -f HEAD:<branch>` |
39
+
40
+ ---
41
+
42
+ ## 3. Main flow ๐Ÿš€
43
+
44
+ ### Connect
45
+
46
+ ```
47
+ connectGitHub(pat)
48
+ โ†’ trim + length check
49
+ โ†’ GET https://api.github.com/user (verify the token actually works; 401 โ†’ error)
50
+ โ†’ delete any existing github_pat row โ†’ putSecret(ws, "github_pat", token)
51
+ โ†’ bind { login, repo: undefined, defaultBranch: undefined } to workspace.settings.github
52
+ ```
53
+
54
+ The repo binding is **cleared on (re)connect** so a different account can't push to the previous account's repo.
55
+
56
+ ### Bind a repo
57
+
58
+ ```
59
+ setRepo("owner/repo")
60
+ โ†’ normalize (strip https://github.com/ and .git)
61
+ โ†’ ghToken() must reach GET /repos/owner/repo (404 โ†’ "token can't access it")
62
+ โ†’ ensureRepo(cwd) โ†’ git remote add|set-url origin https://github.com/owner/repo.git
63
+ โ†’ persist settings.github = { repo, defaultBranch }
64
+ ```
65
+
66
+ `createRepo({ name, private })` is a shortcut: it `POST`s `/user/repos` then calls `setRepo` on the new full name.
67
+
68
+ ### Commit + push
69
+
70
+ `commitPush({ repo, branch, message, delegated?, force? })` runs three safety gates **before** touching git, then commits and (optionally) pushes / opens a PR. See [ยง4](#4-key-concepts-) and the diagram in [ยง8](#8-mermaid-diagrams-).
71
+
72
+ ### Export clean source
73
+
74
+ `exportCleanSource({ repo, token?, branch?, message? })` copies only the clean product into a temp dir, scans it, and force-pushes to a **different** repo. It never touches the workspace's own `origin`.
75
+
76
+ ---
77
+
78
+ ## 4. Key concepts ๐Ÿช
79
+
80
+ ### PAT vs OAuth token
81
+
82
+ | | Vaulted PAT (`github_pat`) | OAuth `account.accessToken` |
83
+ |---|---|---|
84
+ | Stored where | `vault` table, AES-256-GCM (`CONSTELLA_VAULT_KEY`) | better-auth `account` row |
85
+ | Set by | `connectGitHub()` / onboarding | GitHub OAuth sign-in |
86
+ | Used for git push? | Yes | Only if granted `repo` scope |
87
+ | Precedence | **First** (preferred) | Fallback when no PAT |
88
+ | Per-company | Yes โ€” vaulted per `workspaceId` | Per user account |
89
+
90
+ `ghToken()` always returns the PAT if present, otherwise the OAuth token, otherwise `null` ("Connect GitHub first").
91
+
92
+ ### `setRepo` binding โ€” the per-company guard
93
+
94
+ The chosen repo is recorded in `workspace.settings.github.repo` (and `defaultBranch`). This binding is later checked at commit time so an agent can never push to a repo this company's token shouldn't reach. Binding **fails** if the bound token can't `GET /repos/owner/repo`.
95
+
96
+ ### `refreshGitStatus` โ€” reconciling the working tree
97
+
98
+ `file.gitStatus` is never populated by the watcher; `refreshGitStatus()` runs the **real** `git status --porcelain -z --untracked-files=all` and reconciles the `file` table so the GitHub + Code modules show actual changes.
99
+
100
+ - `-z` โ†’ NUL-separated **raw** paths (renames/copies consume an extra old-path field; non-ASCII names stay intact).
101
+ - Each entry maps to a one-letter code: `U` (untracked `?`), `D` (deleted), `A` (added), else `M` (modified).
102
+ - `.git/` and `node_modules/` paths are skipped.
103
+ - Files no longer changed get their `gitStatus` cleared back to `""`.
104
+ - A per-workspace in-memory lock (`refreshing` Set) prevents two concurrent renders from racing the reconcile and inserting duplicate rows.
105
+
106
+ ### Commit GitHub vs Export Clean Source
107
+
108
+ - **Commit GitHub** = honest local git history for the *whole workspace*, pushed to the *bound* `origin`. The control-plane layer (`.claude/`, planning dirs) is committed too (it is part of your private repo).
109
+ - **Export Clean Source** = a *clean tree* โ€” only files that pass `isCleanProductPath()` โ€” force-pushed to a *separate* repo. This is the path for publishing the deliverable product without exposing Constella's internals.
110
+
111
+ `isCleanProductPath(rel)` rejects any path whose top dir is in `DENY_TOP` (`.claude`, `DOCS`, `PO`, `Reports`, `specs`, `issues`, `mock`, `uploads`, `archives`, `.testdev`, `node_modules`, `.git`, `.next`, `dist`, `build`, `out`, `coverage`, `.cache`, `.turbo`, `vendor`), anything under `.constella`, and any `SENSITIVE` file (`.env*`, private keys, `*.pem/.key/.p12/...`, credentials JSON, dumps/db/logs) โ€” **except** harmless env templates matching `ALLOW_ENV` (`.env.example|.sample|.template|.dist`).
112
+
113
+ ### Secret scan โ€” the shared airlock
114
+
115
+ Both paths call `scanForSecrets(cwd)` from `git-scan.ts`. It scans the files that *would* be committed (the working-tree change set; gitignored files are already excluded by `git status`).
116
+
117
+ - **Must-never-commit files** by name: `.env*`, `id_rsa*`, `*.pem/.key/.p12/.pfx/.keystore/.jks/.ppk/.asc`, `credentials.json`, `service-account*.json`, `*.sql/.dump/.bak/.sqlite/.db`, `*.local`, `npm-debug.log` โ€” except `ALLOW_FILE` templates.
118
+ - **High-confidence content patterns**: AWS access key, GitHub token, OpenAI/Anthropic key, Google API key, Slack token, private key block, JWT, DB URL with credentials, Telegram bot token, and a generic hardcoded-secret pattern.
119
+ - The generic pattern is suppressed for obvious **placeholders** (`your_`, `xxx`, `<...>`, `change_me`, `example`, `placeholder`, `***`, `dummy`, `todo`, `redacted`, `...`).
120
+ - Findings are **redacted** in the preview (`first4โ€ขโ€ขโ€ขlast2`).
121
+ - Files over 2 MB and binary files (containing `\0`) are skipped; scan caps at 3000 files / 300 findings.
122
+
123
+ ---
124
+
125
+ ## 5. Tables ๐ŸŒŒ
126
+
127
+ ### `vault` (relevant ref)
128
+
129
+ | Column | Value for GitHub |
130
+ |--------|------------------|
131
+ | `ref` | `github_pat` |
132
+ | `ciphertext` | AES-GCM ciphertext of the PAT |
133
+ | `iv` | per-secret IV |
134
+
135
+ ### `workspace.settings.github` (JSON)
136
+
137
+ | Field | Meaning |
138
+ |-------|---------|
139
+ | `login` | GitHub username of the connected account |
140
+ | `repo` | bound `owner/repo` (the per-company binding) |
141
+ | `defaultBranch` | repo default branch (from the API) |
142
+
143
+ ### `file.gitStatus`
144
+
145
+ | Code | Meaning |
146
+ |------|---------|
147
+ | `""` | no change |
148
+ | `M` | modified |
149
+ | `A` | added / staged-new |
150
+ | `U` | untracked |
151
+ | `D` | deleted |
152
+
153
+ ### `deploy_run.lastExport` (set by `exportCleanSource`)
154
+
155
+ | Field | Meaning |
156
+ |-------|---------|
157
+ | `ok` | export succeeded |
158
+ | `sha` | short commit SHA of the clean tree |
159
+ | `copied` | number of clean files pushed |
160
+ | `repo` / `branch` | export target |
161
+ | `at` | timestamp |
162
+
163
+ ### `PushResult` (return of `commitPush`)
164
+
165
+ | Field | Meaning |
166
+ |-------|---------|
167
+ | `ok` | a real commit landed |
168
+ | `committed` | local commit created |
169
+ | `sha` | short HEAD sha |
170
+ | `pushed` | reached the remote |
171
+ | `prUrl` | PR URL (delegated path only) |
172
+ | `nothing` | working tree had nothing to commit |
173
+ | `blocked` | a safety gate stopped the commit |
174
+ | `secrets` | secret-scan findings when blocked |
175
+
176
+ ---
177
+
178
+ ## 6. Step-by-step ๐Ÿ›ฐ๏ธ
179
+
180
+ ### Commit the workspace to its bound repo
181
+
182
+ 1. **Connect** a PAT (`connectGitHub`) or sign in with GitHub OAuth (`repo` scope).
183
+ 2. **Bind** a repo with `setRepo("owner/repo")` (or `createRepo`).
184
+ 3. (Optional) **Refresh** status โ€” `refreshGitStatus()` populates the change list; `draftCommitMessage()` proposes a Conventional-Commit subject from `A`/`M`/`D` counts.
185
+ 4. **Scan** on demand with `scanWorkspace()` (no commit) to preview findings.
186
+ 5. **Commit + push** with `commitPush({ repo, branch, message })`. Pass `delegated: true` to also open a PR via `gh pr create --fill`. Pass `force: true` to bypass the secret-scan gate *after review*.
187
+
188
+ ### Export only the product
189
+
190
+ 1. Run **Prepare Deploy** (or `previewCleanExport()`) to see the clean tree + a pre-export scan.
191
+ 2. Call `exportCleanSource({ repo: "myorg/my-app-public" })` โ€” or `/export-source myorg/my-app-public` in chat.
192
+ 3. The clean tree is built in a temp dir, secret-scanned, committed, and **force-pushed** to the separate repo. `deploy_run.lastExport` records the result.
193
+
194
+ ---
195
+
196
+ ## 7. Examples ๐ŸŒ 
197
+
198
+ ### Slash commands
199
+
200
+ ```
201
+ /github # refresh git status, report changed file count (Werner)
202
+ /export-source myorg/app-pub # export the clean product to a separate repo
203
+ /prepare-deploy # run the full production-prep pipeline
204
+ ```
205
+
206
+ `/github` (handled in `src/server/commands.ts`) calls `refreshGitStatus()` and posts the changed-file count from Werner (DevOps).
207
+
208
+ ### Commit gate messages (real strings)
209
+
210
+ ```
211
+ Blocked: 2 potential secret(s)/sensitive file(s) in the change set. Resolve them or review before committing.
212
+ Origin (acme/app) doesn't match this company's configured repo (acme/app-2). Re-select the repo before committing.
213
+ committed locally โ€” connect a GitHub PAT to push
214
+ ```
215
+
216
+ ### Authenticated push URL
217
+
218
+ `commitPush` rewrites the HTTPS origin to inject the PAT only at push time:
219
+
220
+ ```
221
+ https://github.com/owner/repo.git
222
+ โ†’ https://x-access-token:<PAT>@github.com/owner/repo.git (used for `git push`, redacted everywhere else)
223
+ ```
224
+
225
+ ---
226
+
227
+ ## 8. Mermaid diagrams ๐Ÿช
228
+
229
+ ### Commit GitHub vs Export Clean Source
230
+
231
+ ```mermaid
232
+ flowchart TD
233
+ subgraph WS["Workspace on disk (orgRoot)"]
234
+ A[".claude / DOCS / PO / specs / issues / mock"]
235
+ B["product source + README + .env.example"]
236
+ end
237
+
238
+ WS --> P{Which path?}
239
+
240
+ P -->|"Commit GitHub<br/>commitPush()"| G1["Gate 1: PAT for this company?"]
241
+ G1 --> G2["Gate 2: origin == bound repo?"]
242
+ G2 --> G3["Gate 3: scanForSecrets()"]
243
+ G3 -->|"findings"| BLK1["BLOCKED โ†’ Inbox + notifyOps"]
244
+ G3 -->|"clean (or force)"| C1["git add -A โ†’ commit โ†’ push HEAD:branch"]
245
+ C1 --> C2["delegated? gh pr create --fill"]
246
+ C1 --> ORIGIN["bound origin repo<br/>(whole workspace)"]
247
+
248
+ P -->|"Export Clean Source<br/>exportCleanSource()"| E1["buildCleanTree โ†’ temp dir<br/>(isCleanProductPath filter)"]
249
+ E1 --> E2["git init + add -A"]
250
+ E2 --> E3["scanForSecrets() โ€” final gate"]
251
+ E3 -->|"findings"| BLK2["BLOCKED โ†’ Inbox + notifyOps"]
252
+ E3 -->|"clean"| E4["commit โ†’ push -f HEAD:branch"]
253
+ E4 --> SEP["separate repo<br/>(product only)"]
254
+ ```
255
+
256
+ ### Token resolution
257
+
258
+ ```mermaid
259
+ flowchart LR
260
+ T["ghToken(ws, user)"] --> V{"vault github_pat?"}
261
+ V -->|yes| PAT["use vaulted PAT"]
262
+ V -->|no| OA{"GitHub OAuth account?"}
263
+ OA -->|yes| TOK["use account.accessToken<br/>(needs 'repo' scope to push)"]
264
+ OA -->|no| NULL["null โ†’ 'Connect GitHub first'"]
265
+ ```
266
+
267
+ ---
268
+
269
+ ## 9. Possible states ๐Ÿ•ณ๏ธ
270
+
271
+ ### Commit gates (in order)
272
+
273
+ | Gate | Trigger | Result |
274
+ |------|---------|--------|
275
+ | **1. PAT configured** | no `github_pat` for this workspace | `blocked` โ€” "GitHub isn't configured for this company" |
276
+ | **2. Repo bound + origin match** | no `settings.github.repo` / no origin, or mismatch | `blocked` โ€” re-select the repo |
277
+ | **3. Secret scan** | any finding (and `force` not set) | `blocked`, `secrets[]`, Inbox card + ops notification |
278
+
279
+ After gates pass: `committed` โ†’ optional `pushed` โ†’ optional `prUrl`. A `nothing-to-commit` working tree returns `nothing: true`.
280
+
281
+ ### Push rejection
282
+
283
+ A rejected / non-fast-forward push (`rejected | non-fast-forward | fetch first | merge conflict | failed to push`) is **not** silently dropped โ€” it raises an Inbox `block` card ("Push rejected โ€” \<repo\>") so the operator pulls + resolves.
284
+
285
+ ### Export states
286
+
287
+ | State | Cause |
288
+ |-------|-------|
289
+ | `ok: false, error: "Use the form owner/repo."` | malformed target |
290
+ | `ok: false, error: "...token can't access it."` | `GET /repos/...` returned 404 |
291
+ | `blocked: true, secrets[]` | final scan found a secret |
292
+ | `ok: true, pushed: true, sha, copied` | clean force-push landed |
293
+ | `error: "Nothing to export yet..."` | `buildCleanTree` copied 0 files |
294
+
295
+ ---
296
+
297
+ ## 10. Related integrations ๐ŸŒŒ
298
+
299
+ - **Vault** โ€” stores `github_pat` encrypted; see [SECURITY](./SECURITY.md).
300
+ - **Inbox** โ€” receives `block` cards for secret findings + push rejections; see [INBOX](./INBOX.md).
301
+ - **Prepare Deploy** โ€” the pipeline that builds, validates, and gates the clean export; see [PREPARE_DEPLOY](./PREPARE_DEPLOY.md) and [DEPLOY](./DEPLOY.md).
302
+ - **Agents** โ€” Werner (DevOps) is the default deploy/commit agent; see [AGENTS](./AGENTS.md).
303
+ - **Chat commands** โ€” `/github`, `/export-source`, `/prepare-deploy`; see [CHAT_COMMANDS](./CHAT_COMMANDS.md).
304
+ - **Onboarding** โ€” initial GitHub import / connect; see [ONBOARDING](./ONBOARDING.md).
305
+
306
+ ---
307
+
308
+ ## 11. Security ๐Ÿ•ณ๏ธ
309
+
310
+ - **Token never logged.** `redact()` strips the PAT from every captured stdout/stderr before it reaches the UI, Inbox, or notifications. The authenticated push URL (`x-access-token:<PAT>@...`) is only constructed in-memory for the `git push` call.
311
+ - **Per-company isolation.** The PAT is vaulted by `workspaceId`; binding is verified against the token; commit Gate 2 ensures `origin` equals the bound repo โ€” you can't push another org's repo.
312
+ - **Mandatory secret scan.** Commit Gate 3 and the export final-gate both run `scanForSecrets`. The `force` flag only bypasses the *commit* scan and is intended for *post-review* use.
313
+ - **Clean export strips internals.** `isCleanProductPath` removes the entire Constella control layer and all sensitive files before anything is pushed to a separate repo.
314
+ - **Safe `.gitignore`.** `ensureRepo` guarantees deps/build/secrets are never staged by `git add -A`.
315
+
316
+ See [SECURITY](./SECURITY.md) for the full vault + scrub model.
317
+
318
+ ---
319
+
320
+ ## 12. Troubleshooting ๐Ÿ›ฐ๏ธ
321
+
322
+ | Symptom | Likely cause | Fix |
323
+ |---------|--------------|-----|
324
+ | "Connect GitHub first." | no PAT and no OAuth token | run `connectGitHub` with a `repo`-scoped PAT |
325
+ | "Invalid token (401). ...needs the 'repo' scope." | PAT lacks `repo` scope or is wrong | regenerate with `repo` scope |
326
+ | "Repo not found, or this company's token can't access it." | `GET /repos/owner/repo` 404 | check the repo name + that the token's account has access |
327
+ | "Origin (X) doesn't match this company's configured repo (Y)." | origin and binding diverged | call `setRepo` to re-bind |
328
+ | Commit `blocked` with `secrets[]` | scan found a secret/sensitive file | remove it (or move into `.env`), or `force` after review |
329
+ | "Push rejected โ€” \<repo\>" in Inbox | remote moved ahead / conflict | pull + resolve, then push again |
330
+ | GitHub module shows "No changes" but files changed | `file.gitStatus` not reconciled | trigger `refreshGitStatus()` (Refresh button / `/github`) |
331
+ | "committed locally โ€” connect a GitHub PAT to push" | commit landed, no credentials to push | connect a PAT |
332
+ | "Nothing to export yet..." | no clean product files found | add product source outside the internal dirs |
333
+
334
+ ---
335
+
336
+ ## 13. Related links ๐ŸŒ 
337
+
338
+ - [PREPARE_DEPLOY](./PREPARE_DEPLOY.md) ยท [DEPLOY](./DEPLOY.md) ยท [PUBLISHING](./PUBLISHING.md)
339
+ - [SECURITY](./SECURITY.md) ยท [INBOX](./INBOX.md) ยท [CHAT_COMMANDS](./CHAT_COMMANDS.md)
340
+ - [AGENTS](./AGENTS.md) ยท [ONBOARDING](./ONBOARDING.md) ยท [CONFIGURATION](./CONFIGURATION.md)
341
+ - [โœฆ Back to the Docs index](./README.md)