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.
- package/.next/BUILD_ID +1 -0
- package/.next/app-path-routes-manifest.json +53 -0
- package/.next/build-manifest.json +20 -0
- package/.next/diagnostics/build-diagnostics.json +6 -0
- package/.next/diagnostics/framework.json +1 -0
- package/.next/export-marker.json +6 -0
- package/.next/images-manifest.json +68 -0
- package/.next/next-minimal-server.js.nft.json +1 -0
- package/.next/next-server.js.nft.json +1 -0
- package/.next/package.json +1 -0
- package/.next/prerender-manifest.json +36 -0
- package/.next/react-loadable-manifest.json +14 -0
- package/.next/required-server-files.js +343 -0
- package/.next/required-server-files.json +343 -0
- package/.next/routes-manifest.json +362 -0
- package/.next/server/app/(app)/activity/page.js +2 -0
- package/.next/server/app/(app)/activity/page.js.nft.json +1 -0
- package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/agents/[handle]/page.js +18 -0
- package/.next/server/app/(app)/agents/[handle]/page.js.nft.json +1 -0
- package/.next/server/app/(app)/agents/[handle]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/code/page.js +2 -0
- package/.next/server/app/(app)/code/page.js.nft.json +1 -0
- package/.next/server/app/(app)/code/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/config/page.js +2 -0
- package/.next/server/app/(app)/config/page.js.nft.json +1 -0
- package/.next/server/app/(app)/config/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/costs/page.js +2 -0
- package/.next/server/app/(app)/costs/page.js.nft.json +1 -0
- package/.next/server/app/(app)/costs/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/cron/page.js +2 -0
- package/.next/server/app/(app)/cron/page.js.nft.json +1 -0
- package/.next/server/app/(app)/cron/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/dashboard/page.js +2 -0
- package/.next/server/app/(app)/dashboard/page.js.nft.json +1 -0
- package/.next/server/app/(app)/dashboard/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/docs/[id]/page.js +2 -0
- package/.next/server/app/(app)/docs/[id]/page.js.nft.json +1 -0
- package/.next/server/app/(app)/docs/[id]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/docs/page.js +2 -0
- package/.next/server/app/(app)/docs/page.js.nft.json +1 -0
- package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/github/page.js +2 -0
- package/.next/server/app/(app)/github/page.js.nft.json +1 -0
- package/.next/server/app/(app)/github/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/goals/page.js +2 -0
- package/.next/server/app/(app)/goals/page.js.nft.json +1 -0
- package/.next/server/app/(app)/goals/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/inbox/page.js +2 -0
- package/.next/server/app/(app)/inbox/page.js.nft.json +1 -0
- package/.next/server/app/(app)/inbox/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/knowledge/page.js +3 -0
- package/.next/server/app/(app)/knowledge/page.js.nft.json +1 -0
- package/.next/server/app/(app)/knowledge/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/models/page.js +2 -0
- package/.next/server/app/(app)/models/page.js.nft.json +1 -0
- package/.next/server/app/(app)/models/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/notifications/page.js +2 -0
- package/.next/server/app/(app)/notifications/page.js.nft.json +1 -0
- package/.next/server/app/(app)/notifications/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/org/page.js +2 -0
- package/.next/server/app/(app)/org/page.js.nft.json +1 -0
- package/.next/server/app/(app)/org/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/organizations/page.js +2 -0
- package/.next/server/app/(app)/organizations/page.js.nft.json +1 -0
- package/.next/server/app/(app)/organizations/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/page.js +3 -0
- package/.next/server/app/(app)/page.js.nft.json +1 -0
- package/.next/server/app/(app)/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/planner/page.js +2 -0
- package/.next/server/app/(app)/planner/page.js.nft.json +1 -0
- package/.next/server/app/(app)/planner/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/plugins/page.js +2 -0
- package/.next/server/app/(app)/plugins/page.js.nft.json +1 -0
- package/.next/server/app/(app)/plugins/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/pm/page.js +2 -0
- package/.next/server/app/(app)/pm/page.js.nft.json +1 -0
- package/.next/server/app/(app)/pm/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/prepare-deploy/page.js +19 -0
- package/.next/server/app/(app)/prepare-deploy/page.js.nft.json +1 -0
- package/.next/server/app/(app)/prepare-deploy/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/profile/page.js +2 -0
- package/.next/server/app/(app)/profile/page.js.nft.json +1 -0
- package/.next/server/app/(app)/profile/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/pulse/page.js +2 -0
- package/.next/server/app/(app)/pulse/page.js.nft.json +1 -0
- package/.next/server/app/(app)/pulse/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/reports/[id]/page.js +3 -0
- package/.next/server/app/(app)/reports/[id]/page.js.nft.json +1 -0
- package/.next/server/app/(app)/reports/[id]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/reports/page.js +5 -0
- package/.next/server/app/(app)/reports/page.js.nft.json +1 -0
- package/.next/server/app/(app)/reports/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/routines/page.js +2 -0
- package/.next/server/app/(app)/routines/page.js.nft.json +1 -0
- package/.next/server/app/(app)/routines/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/search/page.js +2 -0
- package/.next/server/app/(app)/search/page.js.nft.json +1 -0
- package/.next/server/app/(app)/search/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/security/page.js +2 -0
- package/.next/server/app/(app)/security/page.js.nft.json +1 -0
- package/.next/server/app/(app)/security/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/skills/page.js +18 -0
- package/.next/server/app/(app)/skills/page.js.nft.json +1 -0
- package/.next/server/app/(app)/skills/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/tasks/page.js +2 -0
- package/.next/server/app/(app)/tasks/page.js.nft.json +1 -0
- package/.next/server/app/(app)/tasks/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/test-dev/page.js +2 -0
- package/.next/server/app/(app)/test-dev/page.js.nft.json +1 -0
- package/.next/server/app/(app)/test-dev/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/update/page.js +2 -0
- package/.next/server/app/(app)/update/page.js.nft.json +1 -0
- package/.next/server/app/(app)/update/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(auth)/login/page.js +2 -0
- package/.next/server/app/(auth)/login/page.js.nft.json +1 -0
- package/.next/server/app/(auth)/login/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(auth)/onboarding/page.js +18 -0
- package/.next/server/app/(auth)/onboarding/page.js.nft.json +1 -0
- package/.next/server/app/(auth)/onboarding/page_client-reference-manifest.js +1 -0
- package/.next/server/app/_global-error/page.js +32 -0
- package/.next/server/app/_global-error/page.js.nft.json +1 -0
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
- package/.next/server/app/_global-error.html +1 -0
- package/.next/server/app/_global-error.meta +16 -0
- package/.next/server/app/_global-error.rsc +15 -0
- package/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +5 -0
- package/.next/server/app/_global-error.segments/_global-error.segment.rsc +5 -0
- package/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
- package/.next/server/app/_global-error.segments/_index.segment.rsc +6 -0
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
- package/.next/server/app/_not-found/page.js +2 -0
- package/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/[...all]/route.js +1 -0
- package/.next/server/app/api/auth/[...all]/route.js.nft.json +1 -0
- package/.next/server/app/api/auth/[...all]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/cron/tick/route.js +52 -0
- package/.next/server/app/api/cron/tick/route.js.nft.json +1 -0
- package/.next/server/app/api/cron/tick/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/dev-login/route.js +1 -0
- package/.next/server/app/api/dev-login/route.js.nft.json +1 -0
- package/.next/server/app/api/dev-login/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/locks/acquire/route.js +1 -0
- package/.next/server/app/api/locks/acquire/route.js.nft.json +1 -0
- package/.next/server/app/api/locks/acquire/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models/progress/route.js +1 -0
- package/.next/server/app/api/models/progress/route.js.nft.json +1 -0
- package/.next/server/app/api/models/progress/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/passkey/authenticate/options/route.js +1 -0
- package/.next/server/app/api/passkey/authenticate/options/route.js.nft.json +1 -0
- package/.next/server/app/api/passkey/authenticate/options/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/passkey/authenticate/verify/route.js +1 -0
- package/.next/server/app/api/passkey/authenticate/verify/route.js.nft.json +1 -0
- package/.next/server/app/api/passkey/authenticate/verify/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/passkey/register/options/route.js +1 -0
- package/.next/server/app/api/passkey/register/options/route.js.nft.json +1 -0
- package/.next/server/app/api/passkey/register/options/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/passkey/register/verify/route.js +1 -0
- package/.next/server/app/api/passkey/register/verify/route.js.nft.json +1 -0
- package/.next/server/app/api/passkey/register/verify/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/stream/route.js +4 -0
- package/.next/server/app/api/stream/route.js.nft.json +1 -0
- package/.next/server/app/api/stream/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sync/file/route.js +2 -0
- package/.next/server/app/api/sync/file/route.js.nft.json +1 -0
- package/.next/server/app/api/sync/file/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/telegram/poll/route.js +15 -0
- package/.next/server/app/api/telegram/poll/route.js.nft.json +1 -0
- package/.next/server/app/api/telegram/poll/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/upload/route.js +1 -0
- package/.next/server/app/api/upload/route.js.nft.json +1 -0
- package/.next/server/app/api/upload/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/v1/[[...path]]/route.js +1 -0
- package/.next/server/app/api/v1/[[...path]]/route.js.nft.json +1 -0
- package/.next/server/app/api/v1/[[...path]]/route_client-reference-manifest.js +1 -0
- package/.next/server/app-paths-manifest.json +53 -0
- package/.next/server/chunks/1003.js +1 -0
- package/.next/server/chunks/127.js +26 -0
- package/.next/server/chunks/1388.js +1 -0
- package/.next/server/chunks/1408.js +21 -0
- package/.next/server/chunks/1572.js +1 -0
- package/.next/server/chunks/1591.js +24 -0
- package/.next/server/chunks/1619.js +188 -0
- package/.next/server/chunks/162.js +1 -0
- package/.next/server/chunks/1881.js +1 -0
- package/.next/server/chunks/1968.js +1 -0
- package/.next/server/chunks/2297.js +348 -0
- package/.next/server/chunks/2341.js +1 -0
- package/.next/server/chunks/2517.js +1 -0
- package/.next/server/chunks/2549.js +1 -0
- package/.next/server/chunks/259.js +14 -0
- package/.next/server/chunks/2599.js +1 -0
- package/.next/server/chunks/260.js +1 -0
- package/.next/server/chunks/2867.js +147 -0
- package/.next/server/chunks/3018.js +1 -0
- package/.next/server/chunks/3050.js +18 -0
- package/.next/server/chunks/3085.js +12 -0
- package/.next/server/chunks/3131.js +1 -0
- package/.next/server/chunks/3242.js +1 -0
- package/.next/server/chunks/3266.js +15 -0
- package/.next/server/chunks/3524.js +1 -0
- package/.next/server/chunks/3527.js +479 -0
- package/.next/server/chunks/3533.js +869 -0
- package/.next/server/chunks/3550.js +1 -0
- package/.next/server/chunks/3609.js +2 -0
- package/.next/server/chunks/3667.js +462 -0
- package/.next/server/chunks/3760.js +4 -0
- package/.next/server/chunks/4679.js +1 -0
- package/.next/server/chunks/4804.js +1 -0
- package/.next/server/chunks/4832.js +2 -0
- package/.next/server/chunks/4853.js +1 -0
- package/.next/server/chunks/4979.js +67 -0
- package/.next/server/chunks/5060.js +1 -0
- package/.next/server/chunks/5278.js +1 -0
- package/.next/server/chunks/5614.js +1 -0
- package/.next/server/chunks/5818.js +1 -0
- package/.next/server/chunks/6479.js +1 -0
- package/.next/server/chunks/6658.js +1 -0
- package/.next/server/chunks/6706.js +1 -0
- package/.next/server/chunks/6719.js +1 -0
- package/.next/server/chunks/678.js +1 -0
- package/.next/server/chunks/683.js +1 -0
- package/.next/server/chunks/6862.js +1 -0
- package/.next/server/chunks/6882.js +1 -0
- package/.next/server/chunks/7037.js +1 -0
- package/.next/server/chunks/7107.js +741 -0
- package/.next/server/chunks/73.js +17 -0
- package/.next/server/chunks/7327.js +1 -0
- package/.next/server/chunks/7514.js +1 -0
- package/.next/server/chunks/7622.js +1 -0
- package/.next/server/chunks/7778.js +1 -0
- package/.next/server/chunks/7912.js +1 -0
- package/.next/server/chunks/7949.js +1 -0
- package/.next/server/chunks/7971.js +1 -0
- package/.next/server/chunks/7989.js +1 -0
- package/.next/server/chunks/842.js +22 -0
- package/.next/server/chunks/8762.js +15 -0
- package/.next/server/chunks/8823.js +77 -0
- package/.next/server/chunks/9146.js +4 -0
- package/.next/server/chunks/9676.js +1 -0
- package/.next/server/chunks/9783.js +22 -0
- package/.next/server/chunks/9969.js +3 -0
- package/.next/server/functions-config-manifest.json +18 -0
- package/.next/server/instrumentation.js +1 -0
- package/.next/server/instrumentation.js.nft.json +1 -0
- package/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/.next/server/middleware-build-manifest.js +1 -0
- package/.next/server/middleware-manifest.json +6 -0
- package/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/.next/server/middleware.js +18 -0
- package/.next/server/middleware.js.nft.json +1 -0
- package/.next/server/next-font-manifest.js +1 -0
- package/.next/server/next-font-manifest.json +1 -0
- package/.next/server/pages/500.html +1 -0
- package/.next/server/pages-manifest.json +3 -0
- package/.next/server/prefetch-hints.json +1 -0
- package/.next/server/server-reference-manifest.js +1 -0
- package/.next/server/server-reference-manifest.json +1 -0
- package/.next/server/webpack-runtime.js +1 -0
- package/.next/static/chunks/1858-339516f78a4b00da.js +1 -0
- package/.next/static/chunks/2320-fc8b39380e69d465.js +2 -0
- package/.next/static/chunks/23550918-ff694f70f4b0648c.js +1 -0
- package/.next/static/chunks/3219-ebb3c23be38c838d.js +1 -0
- package/.next/static/chunks/4263-adecb5b466380b6e.js +1 -0
- package/.next/static/chunks/5479-0cceab68cd0ca9c7.js +1 -0
- package/.next/static/chunks/5701-665b927b06158b76.js +1 -0
- package/.next/static/chunks/5920.6451a68b63918988.js +1 -0
- package/.next/static/chunks/6575-5c9139720bb0f5bf.js +4 -0
- package/.next/static/chunks/6834-4759af1ce7d95fb6.js +32 -0
- package/.next/static/chunks/7509.721cd47a931c5518.js +1 -0
- package/.next/static/chunks/8264-1ca011989ee2b231.js +1 -0
- package/.next/static/chunks/9219-4a39a98b5502d9d1.js +1 -0
- package/.next/static/chunks/9690-53d5222618cbeddb.js +1 -0
- package/.next/static/chunks/app/(app)/activity/page-3973534281ecea81.js +1 -0
- package/.next/static/chunks/app/(app)/agents/[handle]/page-83662a175c098282.js +1 -0
- package/.next/static/chunks/app/(app)/code/page-33979545192cd137.js +1 -0
- package/.next/static/chunks/app/(app)/config/page-9933aed1ca8a85c1.js +1 -0
- package/.next/static/chunks/app/(app)/costs/page-131c4dc580efcc19.js +1 -0
- package/.next/static/chunks/app/(app)/cron/page-53ea1aff998a87ca.js +1 -0
- package/.next/static/chunks/app/(app)/dashboard/page-deed83aaa9d0d447.js +1 -0
- package/.next/static/chunks/app/(app)/docs/[id]/page-38c993d73c0eab4f.js +1 -0
- package/.next/static/chunks/app/(app)/docs/page-bf463b55d0554e86.js +1 -0
- package/.next/static/chunks/app/(app)/error-988cd28480809861.js +1 -0
- package/.next/static/chunks/app/(app)/github/page-62678b4e82dfecb6.js +1 -0
- package/.next/static/chunks/app/(app)/goals/page-4adb426fe1c96106.js +1 -0
- package/.next/static/chunks/app/(app)/inbox/page-e347dc55ab467310.js +1 -0
- package/.next/static/chunks/app/(app)/knowledge/page-65393a045b4349be.js +1 -0
- package/.next/static/chunks/app/(app)/layout-7f65675705b011d8.js +1 -0
- package/.next/static/chunks/app/(app)/models/page-e01f1dd7e49a2951.js +1 -0
- package/.next/static/chunks/app/(app)/notifications/page-56548ac87aef00da.js +1 -0
- package/.next/static/chunks/app/(app)/org/page-699e6a6dc0db7d81.js +1 -0
- package/.next/static/chunks/app/(app)/organizations/page-36051a380a7e8eb7.js +1 -0
- package/.next/static/chunks/app/(app)/page-7d1011a566f81520.js +1 -0
- package/.next/static/chunks/app/(app)/planner/page-dab7ced94083373a.js +1 -0
- package/.next/static/chunks/app/(app)/plugins/page-5b5a1f53389be42e.js +1 -0
- package/.next/static/chunks/app/(app)/pm/page-0de5c08c0b227bb0.js +1 -0
- package/.next/static/chunks/app/(app)/prepare-deploy/page-e426038552df8d41.js +1 -0
- package/.next/static/chunks/app/(app)/profile/page-608dfcaf8aae0a69.js +1 -0
- package/.next/static/chunks/app/(app)/pulse/page-309ccaca91de1faa.js +1 -0
- package/.next/static/chunks/app/(app)/reports/[id]/page-53ea1aff998a87ca.js +1 -0
- package/.next/static/chunks/app/(app)/reports/page-68cdc6dcfa472d86.js +1 -0
- package/.next/static/chunks/app/(app)/routines/page-bcc55550b197a9fa.js +1 -0
- package/.next/static/chunks/app/(app)/search/page-5c5f67558d0dbf0d.js +1 -0
- package/.next/static/chunks/app/(app)/security/page-a7d41e36aa366b45.js +1 -0
- package/.next/static/chunks/app/(app)/skills/page-c5b21e89593b8336.js +1 -0
- package/.next/static/chunks/app/(app)/tasks/page-08ae079e3e54d2ce.js +1 -0
- package/.next/static/chunks/app/(app)/test-dev/page-633f82dfd9c3ce23.js +1 -0
- package/.next/static/chunks/app/(app)/update/page-4be019054351bfac.js +1 -0
- package/.next/static/chunks/app/(auth)/login/page-6e85d3377062acae.js +1 -0
- package/.next/static/chunks/app/(auth)/onboarding/page-ebb10c175abf3b85.js +1 -0
- package/.next/static/chunks/app/_global-error/page-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/_not-found/page-dc38b02aebeab535.js +1 -0
- package/.next/static/chunks/app/api/auth/[...all]/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/cron/tick/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/dev-login/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/locks/acquire/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/models/progress/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/passkey/authenticate/options/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/passkey/authenticate/verify/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/passkey/register/options/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/passkey/register/verify/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/stream/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/sync/file/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/telegram/poll/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/upload/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/v1/[[...path]]/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/error-09899a13c38b6e89.js +1 -0
- package/.next/static/chunks/app/global-error-b8050d4d886f448c.js +1 -0
- package/.next/static/chunks/app/layout-ab9deed1e7e2e9df.js +1 -0
- package/.next/static/chunks/framework-4b2c6b6043dd203f.js +1 -0
- package/.next/static/chunks/main-722e16032e7764d1.js +5 -0
- package/.next/static/chunks/main-app-761880af2b6f1962.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/.next/static/chunks/webpack-222e3894b78c67db.js +1 -0
- package/.next/static/css/0a9b5805594444e3.css +1 -0
- package/.next/static/yztMvBwyrWWkSqP6jfXoa/_buildManifest.js +1 -0
- package/.next/static/yztMvBwyrWWkSqP6jfXoa/_ssgManifest.js +1 -0
- package/.next/trace-build +1 -0
- package/.next/types/app/(app)/activity/page.ts +87 -0
- package/.next/types/app/(app)/agents/[handle]/page.ts +87 -0
- package/.next/types/app/(app)/code/page.ts +87 -0
- package/.next/types/app/(app)/config/page.ts +87 -0
- package/.next/types/app/(app)/costs/page.ts +87 -0
- package/.next/types/app/(app)/cron/page.ts +87 -0
- package/.next/types/app/(app)/dashboard/page.ts +87 -0
- package/.next/types/app/(app)/docs/[id]/page.ts +87 -0
- package/.next/types/app/(app)/docs/page.ts +87 -0
- package/.next/types/app/(app)/github/page.ts +87 -0
- package/.next/types/app/(app)/goals/page.ts +87 -0
- package/.next/types/app/(app)/inbox/page.ts +87 -0
- package/.next/types/app/(app)/knowledge/page.ts +87 -0
- package/.next/types/app/(app)/models/page.ts +87 -0
- package/.next/types/app/(app)/notifications/page.ts +87 -0
- package/.next/types/app/(app)/org/page.ts +87 -0
- package/.next/types/app/(app)/organizations/page.ts +87 -0
- package/.next/types/app/(app)/page.ts +87 -0
- package/.next/types/app/(app)/planner/page.ts +87 -0
- package/.next/types/app/(app)/plugins/page.ts +87 -0
- package/.next/types/app/(app)/pm/page.ts +87 -0
- package/.next/types/app/(app)/prepare-deploy/page.ts +87 -0
- package/.next/types/app/(app)/profile/page.ts +87 -0
- package/.next/types/app/(app)/pulse/page.ts +87 -0
- package/.next/types/app/(app)/reports/[id]/page.ts +87 -0
- package/.next/types/app/(app)/reports/page.ts +87 -0
- package/.next/types/app/(app)/routines/page.ts +87 -0
- package/.next/types/app/(app)/search/page.ts +87 -0
- package/.next/types/app/(app)/security/page.ts +87 -0
- package/.next/types/app/(app)/skills/page.ts +87 -0
- package/.next/types/app/(app)/tasks/page.ts +87 -0
- package/.next/types/app/(app)/test-dev/page.ts +87 -0
- package/.next/types/app/(app)/update/page.ts +87 -0
- package/.next/types/app/(auth)/login/page.ts +87 -0
- package/.next/types/app/(auth)/onboarding/page.ts +87 -0
- package/.next/types/app/api/auth/[...all]/route.ts +351 -0
- package/.next/types/app/api/cron/tick/route.ts +351 -0
- package/.next/types/app/api/dev-login/route.ts +351 -0
- package/.next/types/app/api/locks/acquire/route.ts +351 -0
- package/.next/types/app/api/models/progress/route.ts +351 -0
- package/.next/types/app/api/passkey/authenticate/options/route.ts +351 -0
- package/.next/types/app/api/passkey/authenticate/verify/route.ts +351 -0
- package/.next/types/app/api/passkey/register/options/route.ts +351 -0
- package/.next/types/app/api/passkey/register/verify/route.ts +351 -0
- package/.next/types/app/api/stream/route.ts +351 -0
- package/.next/types/app/api/sync/file/route.ts +351 -0
- package/.next/types/app/api/telegram/poll/route.ts +351 -0
- package/.next/types/app/api/upload/route.ts +351 -0
- package/.next/types/app/api/v1/[[...path]]/route.ts +351 -0
- package/.next/types/cache-life.d.ts +145 -0
- package/.next/types/link.d.ts +210 -0
- package/.next/types/package.json +1 -0
- package/.next/types/routes.d.ts +120 -0
- package/.next/types/validator.ts +511 -0
- package/CHANGELOG.md +312 -0
- package/LICENSE +21 -0
- package/README.md +382 -0
- package/README.pt-BR.md +391 -0
- package/bin/constella.mjs +329 -0
- package/bin/guard-hook.mjs +44 -0
- package/bin/lock-hook.mjs +49 -0
- package/bin/worker.mjs +142 -0
- package/docs/assets/arch-orbit.svg +56 -0
- package/docs/assets/blackhole.svg +37 -0
- package/docs/assets/divider-orbit.svg +23 -0
- package/docs/assets/hero-constella.svg +72 -0
- package/docs/en/AGENTS.md +279 -0
- package/docs/en/AI_ARCHITECTURE.md +373 -0
- package/docs/en/ARCHITECTURE.md +334 -0
- package/docs/en/AUTH_MODE.md +247 -0
- package/docs/en/CHAT_COMMANDS.md +305 -0
- package/docs/en/CONFIGURATION.md +340 -0
- package/docs/en/DEPLOY.md +331 -0
- package/docs/en/DM.md +297 -0
- package/docs/en/FAQ.md +258 -0
- package/docs/en/GITHUB.md +341 -0
- package/docs/en/GOALS_SPECS_ISSUES.md +303 -0
- package/docs/en/INBOX.md +340 -0
- package/docs/en/INSTALLATION.md +329 -0
- package/docs/en/KB_AGENT.md +305 -0
- package/docs/en/KB_RAG.md +356 -0
- package/docs/en/MCP.md +313 -0
- package/docs/en/MEMORY_RAG.md +289 -0
- package/docs/en/MODELS.md +341 -0
- package/docs/en/ONBOARDING.md +327 -0
- package/docs/en/PLUGINS.md +290 -0
- package/docs/en/PORTABLE_MODE.md +387 -0
- package/docs/en/PO_AGENT.md +379 -0
- package/docs/en/PREPARE_DEPLOY.md +308 -0
- package/docs/en/PROJECT_STACKS.md +258 -0
- package/docs/en/PUBLIC_API.md +315 -0
- package/docs/en/PUBLISHING.md +343 -0
- package/docs/en/README.md +95 -0
- package/docs/en/SECURITY.md +280 -0
- package/docs/en/SKILLS.md +349 -0
- package/docs/en/START_MODE.md +340 -0
- package/docs/en/SYNCED_BLOCKS.md +320 -0
- package/docs/en/TEAM_ROOM.md +285 -0
- package/docs/en/TELEGRAM.md +294 -0
- package/docs/en/TEST_DEV.md +321 -0
- package/docs/en/TROUBLESHOOTING.md +294 -0
- package/docs/en/UPDATE.md +301 -0
- package/docs/en/VPS_MODE.md +334 -0
- package/docs/en/WORKFLOW.md +321 -0
- package/docs/pt/AGENTS.md +279 -0
- package/docs/pt/AI_ARCHITECTURE.md +373 -0
- package/docs/pt/ARCHITECTURE.md +334 -0
- package/docs/pt/AUTH_MODE.md +247 -0
- package/docs/pt/CHAT_COMMANDS.md +307 -0
- package/docs/pt/CONFIGURATION.md +340 -0
- package/docs/pt/DEPLOY.md +331 -0
- package/docs/pt/DM.md +297 -0
- package/docs/pt/FAQ.md +258 -0
- package/docs/pt/GITHUB.md +341 -0
- package/docs/pt/GOALS_SPECS_ISSUES.md +303 -0
- package/docs/pt/INBOX.md +340 -0
- package/docs/pt/INSTALLATION.md +329 -0
- package/docs/pt/KB_AGENT.md +305 -0
- package/docs/pt/KB_RAG.md +356 -0
- package/docs/pt/MCP.md +313 -0
- package/docs/pt/MEMORY_RAG.md +289 -0
- package/docs/pt/MODELS.md +341 -0
- package/docs/pt/ONBOARDING.md +327 -0
- package/docs/pt/PLUGINS.md +290 -0
- package/docs/pt/PORTABLE_MODE.md +387 -0
- package/docs/pt/PO_AGENT.md +379 -0
- package/docs/pt/PREPARE_DEPLOY.md +308 -0
- package/docs/pt/PROJECT_STACKS.md +258 -0
- package/docs/pt/PUBLIC_API.md +315 -0
- package/docs/pt/PUBLISHING.md +343 -0
- package/docs/pt/README.md +95 -0
- package/docs/pt/SECURITY.md +280 -0
- package/docs/pt/SKILLS.md +349 -0
- package/docs/pt/START_MODE.md +340 -0
- package/docs/pt/SYNCED_BLOCKS.md +320 -0
- package/docs/pt/TEAM_ROOM.md +285 -0
- package/docs/pt/TELEGRAM.md +294 -0
- package/docs/pt/TEST_DEV.md +321 -0
- package/docs/pt/TROUBLESHOOTING.md +294 -0
- package/docs/pt/UPDATE.md +301 -0
- package/docs/pt/VPS_MODE.md +334 -0
- package/docs/pt/WORKFLOW.md +321 -0
- package/drizzle/0000_regular_nightshade.sql +644 -0
- package/drizzle/0001_mixed_zombie.sql +106 -0
- package/drizzle/meta/0000_snapshot.json +4650 -0
- package/drizzle/meta/0001_snapshot.json +5418 -0
- package/drizzle/meta/_journal.json +20 -0
- package/drizzle.config.mjs +16 -0
- package/next.config.mjs +18 -0
- package/package.json +130 -0
- package/scripts/clean-repo.mjs +20 -0
- package/scripts/dev-all.mjs +46 -0
- package/scripts/i18n-parity.mjs +57 -0
- package/scripts/mcp-server.mjs +100 -0
- package/scripts/postbuild.mjs +11 -0
- package/scripts/publish-public.mjs +116 -0
- package/scripts/start-all.mjs +45 -0
- package/scripts/trim-next.mjs +23 -0
- package/scripts/vps-install.sh +39 -0
- package/skills/CONTRIBUTING.md +122 -0
- package/skills/COVERAGE.md +129 -0
- package/skills/INDEX.json +3443 -0
- package/skills/README.md +57 -0
- package/skills/design/animation-motion/SKILL.md +60 -0
- package/skills/design/color-and-typography/SKILL.md +60 -0
- package/skills/design/css-techniques/SKILL.md +58 -0
- package/skills/design/design-systems/SKILL.md +60 -0
- package/skills/design/gradients/SKILL.md +59 -0
- package/skills/design/graphic-design-basics/SKILL.md +55 -0
- package/skills/design/microinteractions/SKILL.md +58 -0
- package/skills/design/responsive-layout/SKILL.md +59 -0
- package/skills/design/ui-ux-principles/SKILL.md +58 -0
- package/skills/engineering/architecture/api-design-rest-graphql/SKILL.md +67 -0
- package/skills/engineering/architecture/caching-strategies/SKILL.md +59 -0
- package/skills/engineering/architecture/data-modeling/SKILL.md +64 -0
- package/skills/engineering/architecture/message-queues-async/SKILL.md +58 -0
- package/skills/engineering/architecture/scalability-reliability/SKILL.md +62 -0
- package/skills/engineering/architecture/software-architecture-patterns/SKILL.md +56 -0
- package/skills/engineering/architecture/system-design-fundamentals/SKILL.md +56 -0
- package/skills/engineering/backend/auth-and-authorization/SKILL.md +62 -0
- package/skills/engineering/backend/backend-fundamentals/SKILL.md +65 -0
- package/skills/engineering/backend/observability-logging/SKILL.md +60 -0
- package/skills/engineering/frontend/accessibility-wcag/SKILL.md +57 -0
- package/skills/engineering/frontend/frontend-architecture/SKILL.md +65 -0
- package/skills/engineering/frontend/rendering-strategies-ssr-csr/SKILL.md +60 -0
- package/skills/engineering/frontend/state-management/SKILL.md +69 -0
- package/skills/engineering/performance/backend-performance/SKILL.md +69 -0
- package/skills/engineering/performance/database-query-optimization/SKILL.md +64 -0
- package/skills/engineering/performance/profiling-and-benchmarking/SKILL.md +60 -0
- package/skills/engineering/performance/web-performance-core-vitals/SKILL.md +72 -0
- package/skills/engineering/practices/clean-code/SKILL.md +61 -0
- package/skills/engineering/practices/code-optimization/SKILL.md +60 -0
- package/skills/engineering/practices/code-review-practices/SKILL.md +58 -0
- package/skills/engineering/practices/git-workflow/SKILL.md +62 -0
- package/skills/engineering/practices/refactoring/SKILL.md +58 -0
- package/skills/engineering/security/appsec-fundamentals/SKILL.md +70 -0
- package/skills/engineering/security/dependency-supply-chain/SKILL.md +77 -0
- package/skills/engineering/security/owasp-asvs/SKILL.md +54 -0
- package/skills/engineering/security/owasp-top-10/SKILL.md +63 -0
- package/skills/engineering/security/secrets-management/SKILL.md +58 -0
- package/skills/engineering/security/secure-auth-sessions/SKILL.md +56 -0
- package/skills/engineering/testing/tdd-and-coverage/SKILL.md +62 -0
- package/skills/engineering/testing/testing-strategy-pyramid/SKILL.md +56 -0
- package/skills/engineering/testing/unit-integration-e2e/SKILL.md +75 -0
- package/skills/languages/c/SKILL.md +74 -0
- package/skills/languages/clojure/SKILL.md +73 -0
- package/skills/languages/cpp/SKILL.md +75 -0
- package/skills/languages/csharp/SKILL.md +75 -0
- package/skills/languages/dart/SKILL.md +82 -0
- package/skills/languages/elixir/SKILL.md +74 -0
- package/skills/languages/erlang/SKILL.md +76 -0
- package/skills/languages/go/SKILL.md +83 -0
- package/skills/languages/haskell/SKILL.md +70 -0
- package/skills/languages/java/SKILL.md +71 -0
- package/skills/languages/javascript/SKILL.md +62 -0
- package/skills/languages/kotlin/SKILL.md +68 -0
- package/skills/languages/lua/SKILL.md +79 -0
- package/skills/languages/objectivec/SKILL.md +83 -0
- package/skills/languages/php/SKILL.md +74 -0
- package/skills/languages/python/SKILL.md +68 -0
- package/skills/languages/r/SKILL.md +70 -0
- package/skills/languages/ruby/SKILL.md +67 -0
- package/skills/languages/rust/SKILL.md +72 -0
- package/skills/languages/scala/SKILL.md +73 -0
- package/skills/languages/swift/SKILL.md +73 -0
- package/skills/languages/typescript/SKILL.md +69 -0
- package/skills/meta/authoring-agent-skills/SKILL.md +73 -0
- package/skills/meta/progressive-disclosure/SKILL.md +65 -0
- package/skills/meta/skill-frontmatter-spec/SKILL.md +65 -0
- package/skills/process/adr-technical-decisions/SKILL.md +59 -0
- package/skills/process/app-planning/SKILL.md +63 -0
- package/skills/process/architecture-before-code/SKILL.md +52 -0
- package/skills/process/breaking-work-into-sprints/SKILL.md +53 -0
- package/skills/process/idea-to-product/SKILL.md +50 -0
- package/skills/process/mocks-and-screen-flows/SKILL.md +52 -0
- package/skills/process/prioritization-moscow-rice/SKILL.md +64 -0
- package/skills/process/problem-framing/SKILL.md +51 -0
- package/skills/process/product-discovery/SKILL.md +53 -0
- package/skills/process/readme-generation/SKILL.md +90 -0
- package/skills/process/requirements-to-specs/SKILL.md +53 -0
- package/skills/process/research-official-docs/SKILL.md +58 -0
- package/skills/process/review-code-perf-security/SKILL.md +65 -0
- package/skills/process/security-by-design/SKILL.md +68 -0
- package/skills/process/specs-to-issues/SKILL.md +53 -0
- package/skills/process/testing-before-done/SKILL.md +61 -0
- package/skills/process/validating-ux-navigation/SKILL.md +63 -0
- package/skills/references/ai-attachments-ui/SKILL.md +66 -0
- package/skills/references/ai-in-browser-webllm/SKILL.md +74 -0
- package/skills/references/ai-tool-ui-patterns/SKILL.md +63 -0
- package/skills/references/component-patterns-gallery/SKILL.md +62 -0
- package/skills/references/gradient-resources/SKILL.md +66 -0
- package/skills/references/react-component-libraries/SKILL.md +61 -0
- package/skills/references/saas-landing-patterns/SKILL.md +67 -0
- package/skills/references/shadcn-tailwind-theming/SKILL.md +74 -0
- package/skills/references/vercel-ai-sdk-elements/SKILL.md +66 -0
- package/skills/references/web-animation-codrops/SKILL.md +68 -0
- package/skills/stacks/aiml/jupyter/SKILL.md +68 -0
- package/skills/stacks/aiml/keras/SKILL.md +77 -0
- package/skills/stacks/aiml/numpy/SKILL.md +69 -0
- package/skills/stacks/aiml/pandas/SKILL.md +72 -0
- package/skills/stacks/aiml/pytorch/SKILL.md +77 -0
- package/skills/stacks/aiml/scikit-learn/SKILL.md +74 -0
- package/skills/stacks/aiml/tensorflow/SKILL.md +79 -0
- package/skills/stacks/auth/auth0/SKILL.md +63 -0
- package/skills/stacks/auth/authjs/SKILL.md +69 -0
- package/skills/stacks/auth/clerk/SKILL.md +72 -0
- package/skills/stacks/auth/keycloak/SKILL.md +63 -0
- package/skills/stacks/auth/lucia/SKILL.md +56 -0
- package/skills/stacks/auth/passport/SKILL.md +70 -0
- package/skills/stacks/auth/supabase-auth/SKILL.md +66 -0
- package/skills/stacks/baas/amplify/SKILL.md +71 -0
- package/skills/stacks/baas/appwrite/SKILL.md +79 -0
- package/skills/stacks/baas/firebase/SKILL.md +73 -0
- package/skills/stacks/baas/heroku/SKILL.md +71 -0
- package/skills/stacks/backend/actix/SKILL.md +77 -0
- package/skills/stacks/backend/adonisjs/SKILL.md +65 -0
- package/skills/stacks/backend/aspnet-core/SKILL.md +75 -0
- package/skills/stacks/backend/codeigniter/SKILL.md +76 -0
- package/skills/stacks/backend/django/SKILL.md +62 -0
- package/skills/stacks/backend/express/SKILL.md +65 -0
- package/skills/stacks/backend/fastapi/SKILL.md +64 -0
- package/skills/stacks/backend/fastify/SKILL.md +64 -0
- package/skills/stacks/backend/fiber/SKILL.md +68 -0
- package/skills/stacks/backend/flask/SKILL.md +71 -0
- package/skills/stacks/backend/gin/SKILL.md +68 -0
- package/skills/stacks/backend/graphql/SKILL.md +70 -0
- package/skills/stacks/backend/hono/SKILL.md +64 -0
- package/skills/stacks/backend/koa/SKILL.md +63 -0
- package/skills/stacks/backend/laravel/SKILL.md +73 -0
- package/skills/stacks/backend/nestjs/SKILL.md +70 -0
- package/skills/stacks/backend/nginx/SKILL.md +77 -0
- package/skills/stacks/backend/phoenix/SKILL.md +68 -0
- package/skills/stacks/backend/rails/SKILL.md +67 -0
- package/skills/stacks/backend/spring/SKILL.md +70 -0
- package/skills/stacks/backend/spring-boot/SKILL.md +70 -0
- package/skills/stacks/backend/symfony/SKILL.md +77 -0
- package/skills/stacks/container/containerd/SKILL.md +75 -0
- package/skills/stacks/container/docker/SKILL.md +90 -0
- package/skills/stacks/container/podman/SKILL.md +93 -0
- package/skills/stacks/database/cassandra/SKILL.md +74 -0
- package/skills/stacks/database/cockroachdb/SKILL.md +69 -0
- package/skills/stacks/database/dynamodb/SKILL.md +62 -0
- package/skills/stacks/database/mariadb/SKILL.md +71 -0
- package/skills/stacks/database/mongodb/SKILL.md +71 -0
- package/skills/stacks/database/mysql/SKILL.md +72 -0
- package/skills/stacks/database/neon/SKILL.md +68 -0
- package/skills/stacks/database/planetscale/SKILL.md +70 -0
- package/skills/stacks/database/postgresql/SKILL.md +81 -0
- package/skills/stacks/database/redis/SKILL.md +78 -0
- package/skills/stacks/database/sqlite/SKILL.md +70 -0
- package/skills/stacks/database/supabase/SKILL.md +79 -0
- package/skills/stacks/dataviz/chart-js/SKILL.md +72 -0
- package/skills/stacks/dataviz/d3/SKILL.md +77 -0
- package/skills/stacks/dataviz/grafana/SKILL.md +69 -0
- package/skills/stacks/dataviz/plotly/SKILL.md +71 -0
- package/skills/stacks/frontend/alpine/SKILL.md +75 -0
- package/skills/stacks/frontend/angular/SKILL.md +75 -0
- package/skills/stacks/frontend/backbone/SKILL.md +82 -0
- package/skills/stacks/frontend/ember/SKILL.md +85 -0
- package/skills/stacks/frontend/htmx/SKILL.md +73 -0
- package/skills/stacks/frontend/lit/SKILL.md +76 -0
- package/skills/stacks/frontend/preact/SKILL.md +74 -0
- package/skills/stacks/frontend/qwik/SKILL.md +65 -0
- package/skills/stacks/frontend/react/SKILL.md +77 -0
- package/skills/stacks/frontend/solidjs/SKILL.md +75 -0
- package/skills/stacks/frontend/svelte/SKILL.md +70 -0
- package/skills/stacks/frontend/vue/SKILL.md +69 -0
- package/skills/stacks/infra/ansible/SKILL.md +76 -0
- package/skills/stacks/infra/aws/SKILL.md +66 -0
- package/skills/stacks/infra/azure/SKILL.md +72 -0
- package/skills/stacks/infra/circleci/SKILL.md +78 -0
- package/skills/stacks/infra/cloudflare/SKILL.md +65 -0
- package/skills/stacks/infra/fly-io/SKILL.md +63 -0
- package/skills/stacks/infra/gcp/SKILL.md +66 -0
- package/skills/stacks/infra/jenkins/SKILL.md +73 -0
- package/skills/stacks/infra/kubernetes/SKILL.md +64 -0
- package/skills/stacks/infra/netlify/SKILL.md +60 -0
- package/skills/stacks/infra/railway/SKILL.md +63 -0
- package/skills/stacks/infra/tailscale/SKILL.md +65 -0
- package/skills/stacks/infra/terraform/SKILL.md +75 -0
- package/skills/stacks/infra/vagrant/SKILL.md +70 -0
- package/skills/stacks/infra/vercel/SKILL.md +60 -0
- package/skills/stacks/meta/astro/SKILL.md +64 -0
- package/skills/stacks/meta/docusaurus/SKILL.md +71 -0
- package/skills/stacks/meta/eleventy/SKILL.md +69 -0
- package/skills/stacks/meta/gatsby/SKILL.md +63 -0
- package/skills/stacks/meta/hugo/SKILL.md +73 -0
- package/skills/stacks/meta/jekyll/SKILL.md +70 -0
- package/skills/stacks/meta/nextjs/SKILL.md +62 -0
- package/skills/stacks/meta/nuxt/SKILL.md +66 -0
- package/skills/stacks/meta/remix/SKILL.md +67 -0
- package/skills/stacks/meta/sveltekit/SKILL.md +70 -0
- package/skills/stacks/meta/vite/SKILL.md +63 -0
- package/skills/stacks/mobile/android/SKILL.md +77 -0
- package/skills/stacks/mobile/flutter/SKILL.md +77 -0
- package/skills/stacks/mobile/ionic/SKILL.md +72 -0
- package/skills/stacks/mobile/nativescript/SKILL.md +71 -0
- package/skills/stacks/mobile/react-native/SKILL.md +75 -0
- package/skills/stacks/mobile/xamarin/SKILL.md +73 -0
- package/skills/stacks/orm/diesel/SKILL.md +72 -0
- package/skills/stacks/orm/django-orm/SKILL.md +58 -0
- package/skills/stacks/orm/drizzle/SKILL.md +67 -0
- package/skills/stacks/orm/gorm/SKILL.md +73 -0
- package/skills/stacks/orm/knex/SKILL.md +64 -0
- package/skills/stacks/orm/mongoose/SKILL.md +64 -0
- package/skills/stacks/orm/prisma/SKILL.md +64 -0
- package/skills/stacks/orm/sequelize/SKILL.md +65 -0
- package/skills/stacks/orm/sqlalchemy/SKILL.md +71 -0
- package/skills/stacks/orm/typeorm/SKILL.md +70 -0
- package/skills/stacks/queue/bullmq/SKILL.md +69 -0
- package/skills/stacks/queue/celery/SKILL.md +68 -0
- package/skills/stacks/queue/kafka/SKILL.md +66 -0
- package/skills/stacks/queue/nats/SKILL.md +66 -0
- package/skills/stacks/queue/rabbitmq/SKILL.md +64 -0
- package/skills/stacks/queue/redis/SKILL.md +66 -0
- package/skills/stacks/runtime/beam/SKILL.md +72 -0
- package/skills/stacks/runtime/bun/SKILL.md +80 -0
- package/skills/stacks/runtime/deno/SKILL.md +74 -0
- package/skills/stacks/runtime/dotnet/SKILL.md +64 -0
- package/skills/stacks/runtime/jvm/SKILL.md +66 -0
- package/skills/stacks/runtime/node/SKILL.md +70 -0
- package/skills/stacks/runtime/pypy/SKILL.md +69 -0
- package/skills/stacks/runtime/python3/SKILL.md +70 -0
- package/skills/stacks/styling/bootstrap/SKILL.md +74 -0
- package/skills/stacks/styling/bulma/SKILL.md +80 -0
- package/skills/stacks/styling/chakra-ui/SKILL.md +61 -0
- package/skills/stacks/styling/css-modules/SKILL.md +54 -0
- package/skills/stacks/styling/mui/SKILL.md +60 -0
- package/skills/stacks/styling/sass/SKILL.md +63 -0
- package/skills/stacks/styling/shadcn-ui/SKILL.md +58 -0
- package/skills/stacks/styling/styled-components/SKILL.md +62 -0
- package/skills/stacks/styling/tailwind/SKILL.md +59 -0
- package/skills/stacks/styling/unocss/SKILL.md +64 -0
- package/skills/stacks/styling/vanilla-extract/SKILL.md +64 -0
- package/skills/stacks/styling/vuetify/SKILL.md +89 -0
- package/skills/stacks/testing/cypress/SKILL.md +68 -0
- package/skills/stacks/testing/jasmine/SKILL.md +67 -0
- package/skills/stacks/testing/jest/SKILL.md +67 -0
- package/skills/stacks/testing/mocha/SKILL.md +71 -0
- package/skills/stacks/testing/playwright/SKILL.md +68 -0
- package/skills/stacks/testing/puppeteer/SKILL.md +70 -0
- package/skills/stacks/testing/selenium/SKILL.md +70 -0
- package/skills/stacks/testing/vitest/SKILL.md +68 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
[โ Docs index](./README.md) ยท [๐ง๐ท Portuguรชs](../pt/PREPARE_DEPLOY.md) ยท [โฆ Constella](../../README.md)
|
|
2
|
+
|
|
3
|
+
# Prepare Deploy ๐
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
The pre-launch sequence. Before any product leaves the central ship, **Prepare Deploy** runs a hybrid pipeline โ deterministic engineering checks (real commands) plus one bundled agent phase โ then strips Constella's entire internal control layer and ships only the clean product source to a separate repository. Every launch passes through a secret-scan airlock.
|
|
8
|
+
|
|
9
|
+
> Source of truth: [`src/server/prepare-deploy.ts`](../../src/server/prepare-deploy.ts), [`src/server/deploy-store.ts`](../../src/server/deploy-store.ts), [`src/server/git-scan.ts`](../../src/server/git-scan.ts), [`src/server/devserver.ts`](../../src/server/devserver.ts).
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1. When to use ๐
|
|
14
|
+
|
|
15
|
+
- A constellation finished building and you want to take the project to production.
|
|
16
|
+
- You need a **deterministic readiness check**: dependencies install, tests pass, a clean production build runs, and the app actually boots.
|
|
17
|
+
- You want to **document the environment** (`.env.example`, `README.md`, `DEPLOY.md`) before handing the project to a host.
|
|
18
|
+
- You want to publish **only the product** โ without `.claude/`, planning docs, internal reports, or any control file โ to a separate GitHub repository.
|
|
19
|
+
- You need certainty that **no secrets** are about to leave the ship.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 2. How it works ๐
|
|
24
|
+
|
|
25
|
+
Prepare Deploy is a **hybrid production-prep pipeline**. The system runs the deterministic engineering steps itself (real `install`, `test`, `build` commands; a boot gate; a secret scan), then hands a **single bundled agent phase** the remaining creative work (write `.env.example`, fix a broken build, write `README.md` / `DEPLOY.md`). The clean-export filter is the single source of truth shared by both the **preview** and the **export** โ what you see in the preview is exactly what would be pushed.
|
|
26
|
+
|
|
27
|
+
Three deterministic, agent-free panels feed the UI:
|
|
28
|
+
|
|
29
|
+
| Panel | Server action | What it returns |
|
|
30
|
+
|-------|---------------|-----------------|
|
|
31
|
+
| **Environment snapshot** | `getDeployEnv()` โ `detectDeployEnv(org.id)` | runtime, framework, package manager, required/undocumented env vars, DB type, ports, Dockerfile/compose, build & start scripts, mode |
|
|
32
|
+
| **Clean export preview** | `previewCleanExport()` โ `buildPreview(org.id)` | the file tree that survives the filter, total bytes, included/ignored counts, docs found, and a **pre-export secret scan** |
|
|
33
|
+
| **Auto checklist** | `deployChecklist()` โ `computeChecklist(...)` | a deterministic readiness checklist derived from the env snapshot + the last run's step statuses |
|
|
34
|
+
|
|
35
|
+
The current run state itself is read with `getDeployRun()` โ `loadDeployRow(workspace.id)`.
|
|
36
|
+
|
|
37
|
+
### Persistence
|
|
38
|
+
|
|
39
|
+
One `deploy_run` row **per workspace** holds the latest run. The table is created idempotently at boot by `ensureDeployTables()` (`CREATE TABLE IF NOT EXISTS deploy_run โฆ CREATE UNIQUE INDEX โฆ ON deploy_run (workspace_id)`) โ no `drizzle-kit push` needed. The row stores `status`, `runId`, the `steps[]`, the `checklist[]`, the last `buildLog`, the `summary`, the `lastExport` snapshot, and `startedAt` / `updatedAt`.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 3. Environment snapshot โ `getDeployEnv` ๐ช
|
|
44
|
+
|
|
45
|
+
`detectDeployEnv(orgId)` is fully deterministic (no agent, no model call). It builds a `DeployEnv` object:
|
|
46
|
+
|
|
47
|
+
| Field | How it is detected |
|
|
48
|
+
|-------|--------------------|
|
|
49
|
+
| `detected` | `true` if `detectProject(orgId)` found a runnable project |
|
|
50
|
+
| `runtime` | `proj.kind` โ one of `node` / `python` / `go` / `rust` / `static`, else `unknown` |
|
|
51
|
+
| `packageManager` | for Node, the resolved `runCmd` (`npm` / `pnpm` / `yarn`) |
|
|
52
|
+
| `framework` | `detectFramework(deps, runtime)` โ maps deps to a label (Next.js / Nuxt / Remix / Angular / Svelte / Vue / React / Nest / Node server / PythonยทGoยทRustยทStatic service) |
|
|
53
|
+
| `projectName` / `runLabel` | `proj.name` / `proj.label` (e.g. `npm run dev`, `uvicorn`, `go run`) |
|
|
54
|
+
| `requiredEnv` | parsed from `.env.example` / `.env.sample` / `.env.template` via `parseEnvKeys` โ each key gets a `hasValue` flag (placeholders like `your_`, `<โฆ>`, `changeme`, `xxx`, `example` count as **no** value) |
|
|
55
|
+
| `referencedEnvCount` | total env keys referenced in source (`scanEnvRefs`) |
|
|
56
|
+
| `unsetEnvKeys` | env keys **used in code but not documented** in `.env.example` (minus `ENV_NOISE`: `NODE_ENV`, `PORT`, `HOST`, `PWD`, `HOME`, `PATH`, `CI`, `TZ`, `VERCEL`, `VERCEL_ENV`), sorted, capped at 40 |
|
|
57
|
+
| `database` | `detectDatabase(deps)` โ `relational` / `document` / `key-value` / `none` |
|
|
58
|
+
| `ports` | parsed from `Dockerfile` `EXPOSE` lines and `docker-compose*` / `compose*` port mappings (capped at 12) |
|
|
59
|
+
| `hasDockerfile` / `hasCompose` | presence of a `Dockerfile` / a compose file |
|
|
60
|
+
| `buildScript` / `startScript` | `package.json` `scripts.build` / `scripts.start` |
|
|
61
|
+
| `mode` | `prod` if build output exists (`hasBuildOutput`), `dev` otherwise, `unknown` if no project |
|
|
62
|
+
|
|
63
|
+
`scanEnvRefs` walks source files (`.ts .tsx .js .jsx .mjs .cjs .py .go .rs .vue .svelte`, โค1500 files, โค512 KB each) and matches `process.env.X`, `process.env["X"]`, `import.meta.env.X`, `os.environ[...]`, `os.getenv(...)`, and Go's `os.Getenv(...)`.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 4. Clean-export filter โ `buildCleanTree` ๐ณ๏ธ
|
|
68
|
+
|
|
69
|
+
`buildCleanTree(tmp, orgId)` copies **only the clean product** into a temp directory. It is the shared engine behind both the preview and the export, so the preview is a faithful dry run. A workspace-relative path survives only if `isCleanProductPath(rel)` returns `true`.
|
|
70
|
+
|
|
71
|
+
A path is **stripped** when:
|
|
72
|
+
|
|
73
|
+
1. Its top-level segment is in `DENY_TOP` โ Constella's control/planning layer **or** build/dep noise.
|
|
74
|
+
2. It starts with `.constella`.
|
|
75
|
+
3. It matches the `SENSITIVE` pattern (secrets / dumps / logs / local stores) **and** is not an allowed env template.
|
|
76
|
+
|
|
77
|
+
### What is removed
|
|
78
|
+
|
|
79
|
+
| Category | Entries |
|
|
80
|
+
|----------|---------|
|
|
81
|
+
| **Control / planning layer** (`DENY_TOP`) | `.claude`, `DOCS`, `PO`, `Reports`, `specs`, `issues`, `mock`, `uploads`, `archives`, `.testdev` |
|
|
82
|
+
| **Build / dependency noise** (`DENY_TOP`) | `node_modules`, `.git`, `.next`, `dist`, `build`, `out`, `coverage`, `.cache`, `.turbo`, `vendor` |
|
|
83
|
+
| **Sensitive files** (`SENSITIVE` regex) | `.env`, `.env.*`, `id_rsa*` / `id_dsa*`, `*.pem` `*.key` `*.p12` `*.pfx` `*.keystore` `*.jks` `*.ppk` `*.asc`, `credentials.json`, `service-account*.json`, `*.sql` `*.dump` `*.bak` `*.sqlite*` `*.db`, `*.log`, `*.local` |
|
|
84
|
+
| **Anything under** `.constella` | the runtime root marker |
|
|
85
|
+
|
|
86
|
+
### What is kept
|
|
87
|
+
|
|
88
|
+
Everything else โ the real product source โ **plus** allowed env templates that match `ALLOW_ENV` (`.env.example`, `.env.sample`, `.env.template`, `.env.dist`). After copying, `buildCleanTree` writes a fresh `.gitignore` (`EXPORT_GITIGNORE`) into the temp tree so the exported repo ignores `node_modules/`, build dirs, logs, and `.env*` (but keeps `!.env.example`). It returns `{ copied, docs, files }`, where `docs` collects root README / LICENSE / CHANGELOG / DEPLOY / CONTRIBUTING files.
|
|
89
|
+
|
|
90
|
+
> The control layer (`.claude/`, planning dirs) is what makes Constella a control plane. Export deliberately leaves it on the ship โ only the product launches.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 5. The pipeline โ `runDeployPipeline` โฆ
|
|
95
|
+
|
|
96
|
+
`runDeployPipeline()` runs nine steps in order. Each step persists to the `deploy_run` row **and** emits a `deploy` event so both the visual pipeline (polled) and the live narration box (`AgentRunLive`) show real state. A **re-entry guard** returns the current row early if a run is already `running` and started less than 15 minutes ago.
|
|
97
|
+
|
|
98
|
+
| # | Step `key` | Label | What it does |
|
|
99
|
+
|---|------------|-------|--------------|
|
|
100
|
+
| 1 | `analyze` | Analyze the project | `detectProject` + `detectDeployEnv`. **No project โ `failed`** |
|
|
101
|
+
| 2 | `deps` | Validate dependencies | runs `proj.install` (`CI=1`, 300 s timeout); `done` / `error` / "already installed" |
|
|
102
|
+
| 3 | `env` | Validate environment variables | `needs-action` if `unsetEnvKeys` exist, else `done` |
|
|
103
|
+
| 4 | `tests` | Run tests | Node + `scripts.test` โ `runCmd test` (`CI=1`, 300 s); else `needs-action` "no automated test script" |
|
|
104
|
+
| 5 | `secrets` | Security scan | `buildPreview` over the clean tree โ **`blocked` stops the pipeline** if any secret is found |
|
|
105
|
+
| 6 | `build` | Production build | Node + `buildScript` โ `run build` (`CI=1`, 600 s); failure โ `error` (the agent will try to fix it) |
|
|
106
|
+
| 7 | `validateBuild` | Validate build | `ensureBootable` boot gate โ does the app actually start? |
|
|
107
|
+
| 8 | `agent` | Configure env, fix & document | **one** bundled agent phase (see below) |
|
|
108
|
+
| 9 | `package` | Prepare clean package | `buildPreview` **again** (after the agent's edits); re-checks secrets, reports file count + size |
|
|
109
|
+
|
|
110
|
+
### The early secret gate
|
|
111
|
+
|
|
112
|
+
Step 5 is an **early gate**: it runs the full clean-tree secret scan *before* the build and the agent. If `buildPreview().blocked` is true, the step becomes `blocked`, a `block` item is pushed to the **Inbox**, and the run finalizes with status `blocked` โ the build and agent never run. Fix the secrets and re-run.
|
|
113
|
+
|
|
114
|
+
### The agent phase
|
|
115
|
+
|
|
116
|
+
`pickDeployAgent` chooses the **DevOps** agent (role matches `/devops/i`), falling back to `ada`, then the first agent. `runFocusedAgent` makes one streamed call on the `deploy` channel (600 s timeout) and **books real cost** to the `costEntry` table. The instruction (`deployAgentInstruction`) tells it the deterministic steps already ran and to focus on the gaps, in order:
|
|
117
|
+
|
|
118
|
+
1. Create/refresh `.env.example` documenting **every** required env var (placeholders only, **never** real secrets) โ the undocumented keys are injected into the prompt.
|
|
119
|
+
2. If the production build failed, **fix** the errors until it builds clean.
|
|
120
|
+
3. Write/refresh a root `README.md` and a root `DEPLOY.md` with concrete build/run/deploy steps for this host.
|
|
121
|
+
4. Finish with a short operator summary + exact next steps.
|
|
122
|
+
|
|
123
|
+
It is told to keep the existing product/UX and **never** add internal/control files or a second app.
|
|
124
|
+
|
|
125
|
+
### Finalization
|
|
126
|
+
|
|
127
|
+
`finalize(status, summary)` recomputes the checklist, persists `status` + `summary` + `buildLog`, emits a terminal `done` / `error` event, calls `notifyOps` (a `deploy` notification), and revalidates `/prepare-deploy`. Final status is `done`, `blocked` (secrets found in the export set after the agent), or `failed`.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 6. Pipeline diagram ๐ฐ๏ธ
|
|
132
|
+
|
|
133
|
+
```mermaid
|
|
134
|
+
flowchart TD
|
|
135
|
+
A["analyze ยท detectProject + env"] -->|no project| FAIL["status: failed"]
|
|
136
|
+
A --> B["deps ยท install (CI=1)"]
|
|
137
|
+
B --> C["env ยท unset keys?"]
|
|
138
|
+
C --> D["tests ยท run test (CI=1)"]
|
|
139
|
+
D --> E{"secrets ยท scan clean tree"}
|
|
140
|
+
E -->|secret found| BLK["status: blocked โ Inbox block ยท stop"]
|
|
141
|
+
E -->|clean| F["build ยท run build (CI=1)"]
|
|
142
|
+
F --> G["validateBuild ยท ensureBootable"]
|
|
143
|
+
G --> H["agent ยท env + fix + docs (1 phase)"]
|
|
144
|
+
H --> I{"package ยท re-scan export set"}
|
|
145
|
+
I -->|secret found| BLK2["status: blocked"]
|
|
146
|
+
I -->|clean| DONE["status: done"]
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## 7. Auto checklist โ `computeChecklist` ๐
|
|
152
|
+
|
|
153
|
+
Deterministic, derived from the env snapshot and the last run's step statuses. Each item has a `status` of `ok` / `warn` / `fail` / `todo`.
|
|
154
|
+
|
|
155
|
+
| `key` | Label | `ok` when |
|
|
156
|
+
|-------|-------|-----------|
|
|
157
|
+
| `pkg` | package.json valid / manifest present | Node: `package.json` parses; else: project detected |
|
|
158
|
+
| `deps` | Dependencies installed | `node_modules` exists or the `deps` step finished |
|
|
159
|
+
| `envExample` | `.env.example` present | a template exists or `requiredEnv` non-empty |
|
|
160
|
+
| `envComplete` | All used env vars documented | `unsetEnvKeys.length === 0` (else `warn`) |
|
|
161
|
+
| `secrets` | No secrets in the product | the `secrets` step is `done` (`blocked` โ `fail`) |
|
|
162
|
+
| `build` | Production build runs | `buildScript` exists and the `build` step finished (no script โ `warn`) |
|
|
163
|
+
| `tests` | Tests pass | `scripts.test` exists and the `tests` step finished (no script โ `warn`) |
|
|
164
|
+
| `readme` | README present | `README.md` / `readme.md` exists |
|
|
165
|
+
| `deployDoc` | Deploy docs present | `DEPLOY.md` exists |
|
|
166
|
+
| `internalExcluded` | Internal files excluded from export | always `ok` (the filter guarantees it) |
|
|
167
|
+
| `exportRepo` | Export repository configured | a `github_pat` is vaulted |
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## 8. Quick actions โญ
|
|
172
|
+
|
|
173
|
+
Beyond the full pipeline, individual actions are available (each emits `deploy` events via `withDeployEvents`):
|
|
174
|
+
|
|
175
|
+
| Action | Function | Effect |
|
|
176
|
+
|--------|----------|--------|
|
|
177
|
+
| Build only | `runBuildOnly()` | Node `run build` (`CI=1`, 600 s); persists the `buildLog` |
|
|
178
|
+
| Tests only | `runTestsOnly()` | Node `run test` (`CI=1`, 300 s) |
|
|
179
|
+
| Generate README | `generateReadme()` โ `genDocs("readme")` | one DevOps-agent call to write/refresh `README.md` |
|
|
180
|
+
| Generate deploy docs | `generateDeployDocs()` โ `genDocs("deploy")` | one DevOps-agent call to write/refresh `DEPLOY.md` |
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## 9. Clean source export โ `exportCleanSource` ๐
|
|
185
|
+
|
|
186
|
+
Pushes **only** the clean product to a **separate** GitHub repo โ never the org workspace's bound `origin`. Input: `{ repo, token?, branch?, message? }`.
|
|
187
|
+
|
|
188
|
+
**Step by step:**
|
|
189
|
+
|
|
190
|
+
1. Normalize `repo` to `owner/repo` (strips a `https://github.com/` prefix and a `.git` suffix); reject anything that is not `owner/repo`.
|
|
191
|
+
2. Resolve the token: the provided `token`, else the vaulted `github_pat`. No token โ error. The token is **redacted** from every returned string.
|
|
192
|
+
3. Verify the repo via `GET https://api.github.com/repos/{repo}` (12 s timeout). `404` โ "Repo not found, or this token can't access it."
|
|
193
|
+
4. `buildCleanTree(tmp, org.id)` into a temp dir. **Nothing copied โ error** ("no clean product source files were found").
|
|
194
|
+
5. `git init -b <branch>` (default `main`) โ `git add -A`.
|
|
195
|
+
6. **FINAL secret gate** โ `scanForSecrets(tmp)`. **Any** finding blocks the push regardless of the allowlist: a `block` lands in the **Inbox**, `notifyOps` fires a `security` alert, and the result is `{ ok:false, blocked:true, secrets }`.
|
|
196
|
+
7. Commit as `Constella Agents <agents@constella.dev>` (message defaults to `chore: export clean source`), grab the short SHA.
|
|
197
|
+
8. `git push -f https://x-access-token:<token>@github.com/<repo>.git HEAD:<branch>` (120 s timeout). Push failure โ redacted error tail.
|
|
198
|
+
9. On success, persist `lastExport` (`{ ok, sha, copied, repo, branch, at }`) to the `deploy_run` row.
|
|
199
|
+
|
|
200
|
+
```mermaid
|
|
201
|
+
sequenceDiagram
|
|
202
|
+
participant Op as Operator
|
|
203
|
+
participant PD as exportCleanSource
|
|
204
|
+
participant GH as GitHub API
|
|
205
|
+
participant FS as temp clean tree
|
|
206
|
+
Op->>PD: repo, token?, branch?
|
|
207
|
+
PD->>GH: GET /repos/{repo}
|
|
208
|
+
GH-->>PD: 200 / 404
|
|
209
|
+
PD->>FS: buildCleanTree (strip control layer + secrets)
|
|
210
|
+
PD->>FS: git init + add -A
|
|
211
|
+
PD->>FS: scanForSecrets (FINAL gate)
|
|
212
|
+
alt secret found
|
|
213
|
+
PD-->>Op: blocked โ Inbox + notifyOps(security)
|
|
214
|
+
else clean
|
|
215
|
+
PD->>GH: git push -f HEAD:branch
|
|
216
|
+
PD-->>Op: ok, sha, copied
|
|
217
|
+
end
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 10. Examples ๐ช
|
|
223
|
+
|
|
224
|
+
**Run the full pipeline** (from the Prepare Deploy page) โ the system calls `runDeployPipeline()`; you watch nine steps and the live agent narration.
|
|
225
|
+
|
|
226
|
+
**Build only:**
|
|
227
|
+
```ts
|
|
228
|
+
const { ok, log } = await runBuildOnly();
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**Export the clean product to a separate repo:**
|
|
232
|
+
```ts
|
|
233
|
+
const res = await exportCleanSource({
|
|
234
|
+
repo: "my-org/my-product", // or https://github.com/my-org/my-product(.git)
|
|
235
|
+
branch: "main",
|
|
236
|
+
message: "chore: export clean source",
|
|
237
|
+
});
|
|
238
|
+
// res = { ok, pushed, sha, copied } | { ok:false, blocked:true, secrets:[โฆ] } | { ok:false, error }
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## 11. Possible states ๐ณ๏ธ
|
|
244
|
+
|
|
245
|
+
**Run status** (`RunStatus`, the `deploy_run.status` column):
|
|
246
|
+
|
|
247
|
+
| State | Meaning |
|
|
248
|
+
|-------|---------|
|
|
249
|
+
| `idle` | no run yet (default row) |
|
|
250
|
+
| `running` | pipeline in progress (re-entry guarded for 15 min) |
|
|
251
|
+
| `done` | finished, clean |
|
|
252
|
+
| `blocked` | secrets found โ early gate (step 5) or final package re-scan (step 9) |
|
|
253
|
+
| `failed` | no runnable project, or an unexpected error |
|
|
254
|
+
|
|
255
|
+
**Step status** (`StepStatus`): `waiting`, `running`, `done`, `error`, `blocked`, `needs-action`.
|
|
256
|
+
|
|
257
|
+
**Checklist status** (`ChecklistStatus`): `ok`, `warn`, `fail`, `todo`.
|
|
258
|
+
|
|
259
|
+
**Boot reconcile:** at startup `reconcileDeployRuns()` treats any `running` row as an orphan (its process died) โ it flips the row to `failed` and any still-`running` step to `error` ("interrupted by restart").
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## 12. Related integrations ๐
|
|
264
|
+
|
|
265
|
+
- **GitHub** โ `exportCleanSource` reuses the vaulted `github_pat`; the other path (commit the whole workspace to its bound `origin`) lives in [`GITHUB.md`](./GITHUB.md).
|
|
266
|
+
- **Test Dev** โ the `validateBuild` step calls `ensureBootable` from the same dev-server engine documented in [`TEST_DEV.md`](./TEST_DEV.md).
|
|
267
|
+
- **Inbox** โ secret gates push `block` items via `pushInbox` ([`INBOX.md`](./INBOX.md)).
|
|
268
|
+
- **Agents** โ the agent phase runs the **DevOps** agent (Werner) ([`AGENTS.md`](./AGENTS.md)).
|
|
269
|
+
- **Deploy** โ the actual launch from clean source to a host ([`DEPLOY.md`](./DEPLOY.md)).
|
|
270
|
+
- **Vault / Security** โ secrets are vaulted and scrubbed; see [`SECURITY.md`](./SECURITY.md).
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
## 13. Security ๐ก๏ธ
|
|
275
|
+
|
|
276
|
+
- **Two secret gates.** The pipeline's early gate (step 5) and the package re-scan (step 9) both run `scanForSecrets` over the clean tree; `exportCleanSource` runs a **third, final** scan at push time. Any finding blocks.
|
|
277
|
+
- **`scanForSecrets`** scans the files git *would* commit (working-tree changes, untracked included) โ high-confidence patterns (AWS / GitHub / OpenAIยทAnthropic / Google / Slack / private keys / JWT / DB URLs with credentials / Telegram tokens / hardcoded secrets) plus must-never-commit file types. Placeholders are ignored; binaries, files >2 MB, and build dirs are skipped. Previews are redacted (`abcdโขโขโขyz`).
|
|
278
|
+
- **Token redaction.** The export redacts the GitHub token from every returned string, so it never leaks into the UI, the Inbox, or a notification.
|
|
279
|
+
- **Separate target.** Export pushes to a **separate** repo, never the workspace's bound `origin` โ the control layer cannot escape by accident.
|
|
280
|
+
- **Allowlist vs final net.** The clean filter keeps env templates (`.env.example`, etc.) but the final `scanForSecrets` blocks **any** inlined secret regardless of the allowlist.
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## 14. Troubleshooting ๐ฐ๏ธ
|
|
285
|
+
|
|
286
|
+
| Symptom | Likely cause / fix |
|
|
287
|
+
|---------|--------------------|
|
|
288
|
+
| Run finalizes `failed` immediately | "No runnable project detected" โ `detectProject` found no manifest. Check the workspace root. |
|
|
289
|
+
| Stuck on `running` after a restart | `reconcileDeployRuns()` flips orphaned runs to `failed` at boot; reload the page. |
|
|
290
|
+
| `secrets` step `blocked` | A real secret is in the product. Open the Inbox block, remove it (use `.env` + a vaulted secret), re-run. |
|
|
291
|
+
| `build` step `error` | The agent phase will try to fix it; the build tail is in `buildLog`. Use **Build only** to iterate. |
|
|
292
|
+
| `tests` shows `needs-action` | No `scripts.test` (or non-Node runtime) โ Constella has nothing to run. |
|
|
293
|
+
| Export "Nothing to export yet" | `buildCleanTree` copied 0 files โ everything matched `DENY_TOP` / `SENSITIVE`, or the workspace has no product source. |
|
|
294
|
+
| Export "Repo not found" | The repo doesn't exist or the token lacks access โ check the PAT scope. |
|
|
295
|
+
| Export `blocked` | The final secret scan found something; see the Inbox + security notification. |
|
|
296
|
+
| `validateBuild` says "toolchain unavailable" | The boot gate is **skipped** (not failed) when the runtime (python/go/rust) isn't installed โ it cannot validate, so it does not block. |
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## 15. Related links ๐
|
|
301
|
+
|
|
302
|
+
- [`DEPLOY.md`](./DEPLOY.md) โ launch the clean source to a host
|
|
303
|
+
- [`GITHUB.md`](./GITHUB.md) โ connect a remote, commit the workspace, export clean source
|
|
304
|
+
- [`TEST_DEV.md`](./TEST_DEV.md) โ the dev-server + headless test harness (boot gate)
|
|
305
|
+
- [`INBOX.md`](./INBOX.md) โ where blocks surface
|
|
306
|
+
- [`AGENTS.md`](./AGENTS.md) โ the DevOps agent that runs the agent phase
|
|
307
|
+
- [`SECURITY.md`](./SECURITY.md) โ Vault, scrubbing, the FS jail
|
|
308
|
+
- [`WORKFLOW.md`](./WORKFLOW.md) โ the full Goal โ โฆ โ Done lifecycle
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
[โ Docs index](./README.md) ยท [๐ง๐ท Portuguรชs](../pt/PROJECT_STACKS.md) ยท [โฆ Constella](../../README.md)
|
|
2
|
+
|
|
3
|
+
# Project Stacks ๐ช
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
The **project stack** is the technological star-chart of a workspace: a small map of which language, runtime, framework, database, ORM, styling, tests and infra the product is built on. From that chart Constella decides which native **skills** orbit each agent, which official-docs hosts its **web research** may reach, and what background colours the **RAG** memory nebula and every system prompt. Pick the stack once; the whole constellation re-aligns.
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
- During **onboarding** โ you choose the stack (or it is inferred from an imported project) before the first plan.
|
|
12
|
+
- Whenever the product's foundations change โ adopt a new framework, swap a database, add a queue โ open **Config โ Project Stacks** and re-save. Every agent is re-linked, the stack-bearing docs are re-rendered, and RAG re-indexes.
|
|
13
|
+
- When an agent keeps reaching for the *wrong* framework's idioms: the stack is what tells a Vue project's Frontend to load `vue`, not `react`.
|
|
14
|
+
|
|
15
|
+
## How it works
|
|
16
|
+
|
|
17
|
+
A stack is a plain JSON map stored on the workspace row:
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
// src/db/schema.ts โ workspace
|
|
21
|
+
stack: text("stack", { mode: "json" }).$type<Record<string, string>>().notNull().default({}),
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Keys are **category keys** (`language`, `runtime`, `frontend`, โฆ); values are the **catalog option labels** the operator picked (`"TypeScript"`, `"Next.js"`, `"PostgreSQL"`, `"None"`). The catalog of categories and their options lives in `src/data/stack-catalog.ts` (`STACK_CATS` โ 16 categories, each option carrying a one-line description via `descFor`).
|
|
25
|
+
|
|
26
|
+
That map drives three downstream systems:
|
|
27
|
+
|
|
28
|
+
1. **Skills** โ `STACK_VALUE_TO_SKILL` (in `src/data/stack-skill-map.ts`) maps each catalog label to a `skills/` library leaf id (`"Next.js" โ "nextjs"`). `librarySkillNamesForStack(stack)` and `skillNamesForRole(stack, role)` (in `src/server/skills-library.ts`) turn the stack into the exact set of skills each agent should carry.
|
|
29
|
+
2. **Web research** โ `stackDocHosts(stack)` reads the `official_sources` of the stack's skills and yields the documentation hostnames the central allowlist (`src/server/research.ts`) will permit.
|
|
30
|
+
3. **Context + RAG** โ `src/server/context-manager.ts` ranks an agent's enabled skills by stack relevance and writes a one-line `stack: โฆ` summary into the system prompt; `setWorkspaceStack` re-indexes RAG on a real change.
|
|
31
|
+
|
|
32
|
+
## Main flow ๐
|
|
33
|
+
|
|
34
|
+
```mermaid
|
|
35
|
+
flowchart TD
|
|
36
|
+
OP["Operator picks stack<br/>(onboarding or Config)"] --> WS["workspace.stack<br/>Record<string,string>"]
|
|
37
|
+
WS --> MAP["STACK_VALUE_TO_SKILL<br/>label โ library leaf id"]
|
|
38
|
+
MAP --> SK["librarySkillNamesForStack()<br/>universal + stack ids"]
|
|
39
|
+
SK --> ROLE["skillNamesForRole(stack, role)<br/>role profile gates folders"]
|
|
40
|
+
ROLE --> LINK["reconcileStackRoleSkills()<br/>auto-link / prune per agent"]
|
|
41
|
+
SK --> HOSTS["stackDocHosts()<br/>official_sources โ hosts"]
|
|
42
|
+
HOSTS --> RESEARCH["research allowlist<br/>WebFetch / researchDocs"]
|
|
43
|
+
WS --> CTX["context-manager<br/>rank skills + stack line"]
|
|
44
|
+
CTX --> PROMPT["agent system prompt"]
|
|
45
|
+
RESEARCH --> RAG["KB / RAG nebula"]
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Key concepts
|
|
49
|
+
|
|
50
|
+
| Concept | What it is | Source |
|
|
51
|
+
| --- | --- | --- |
|
|
52
|
+
| **Stack** | `Record<string,string>` of category โ chosen label, on `workspace.stack` | `src/db/schema.ts` |
|
|
53
|
+
| **Catalog** | `STACK_CATS` โ the 16 categories + options shown in the UI | `src/data/stack-catalog.ts` |
|
|
54
|
+
| **`STACK_VALUE_TO_SKILL`** | label โ `skills/` leaf id; `"None"`/missing = no skill | `src/data/stack-skill-map.ts` |
|
|
55
|
+
| **Library skill** | a `SKILL.md` under root `skills/`, keyed by its **leaf folder name** | `src/server/skills-library.ts` |
|
|
56
|
+
| **Role profile** | which library folders a role auto-links (`stackPrefixes` vs `allPrefixes` + `core`) | `src/data/role-skill-profile.ts` |
|
|
57
|
+
| **`auto` link** | `agent_skill.auto = true` โ system-managed (reconcile may touch it); `false` โ operator hand-toggle (never touched) | `src/db/schema.ts` |
|
|
58
|
+
| **Reconciliation** | `reconcileStackRoleSkills(wsId)` โ re-links/prunes auto skills to match stack+role | `src/server/seed-library-skills.ts` |
|
|
59
|
+
| **Compatibility** | `incompat()` / `stackNote()` โ disable incoherent picks, warn on redundancy | `src/lib/stack-compat.ts` |
|
|
60
|
+
|
|
61
|
+
### From stack value to a library skill
|
|
62
|
+
|
|
63
|
+
`STACK_VALUE_TO_SKILL` is a flat dictionary. A **missing entry** or the literal `"None"` resolves to no skill (skipped). The skills-library loader additionally filters every mapped id to the ones that **actually exist on disk** โ so an aspirational mapping with no `SKILL.md` degrades silently to a no-op.
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
// src/data/stack-skill-map.ts (excerpt)
|
|
67
|
+
"Next.js": "nextjs", React: "react", Vue: "vue", Django: "django",
|
|
68
|
+
PostgreSQL: "postgresql", Drizzle: "drizzle", "Tailwind CSS": "tailwind",
|
|
69
|
+
Playwright: "playwright", Docker: "docker", "Auth.js": "authjs",
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Universal vs stack vs role
|
|
73
|
+
|
|
74
|
+
- **Universal skills** (`UNIVERSAL_SKILL_NAMES`, ~23) ship to *every* workspace regardless of stack โ clean-code, git-workflow, OWASP, testing pyramid, UI/UX principles, the process rituals, `research-official-docs`, etc.
|
|
75
|
+
- **Stack skills** are the ids `STACK_VALUE_TO_SKILL` produces from the chosen options.
|
|
76
|
+
- **Role gating** decides *which* agent gets *which* stack skill. `skillNamesForRole(stack, role)` consults `roleProfile(role)`: a role's `allPrefixes` folders are linked in full (design/engineering/process best practice), while `stackPrefixes` folders are linked **only for the picks the stack actually selected** โ so a Vue project's Frontend gets `vue`, never `react` + `svelte`.
|
|
77
|
+
|
|
78
|
+
```ts
|
|
79
|
+
// src/server/skills-library.ts โ skillNamesForRole
|
|
80
|
+
for (const [name, sk] of index) {
|
|
81
|
+
if (prof.allPrefixes.some((p) => sk.relPath.startsWith(p))) out.add(name);
|
|
82
|
+
else if (prof.stackPrefixes.some((p) => sk.relPath.startsWith(p)) && stackSet.has(name)) out.add(name);
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Tables
|
|
87
|
+
|
|
88
|
+
### Stack categories (`STACK_CATS`)
|
|
89
|
+
|
|
90
|
+
| Key | Label | Example options |
|
|
91
|
+
| --- | --- | --- |
|
|
92
|
+
| `language` | Language | TypeScript, Python, Go, Rust, Java, โฆ |
|
|
93
|
+
| `runtime` | Runtime | Node.js, Bun, Deno, Python 3, JVM, .NET |
|
|
94
|
+
| `frontend` | Frontend | React, Vue, Svelte, Angular, SolidJS, โฆ |
|
|
95
|
+
| `meta` | Meta-framework / SSG | Next.js, Nuxt, Remix, SvelteKit, Astro, โฆ |
|
|
96
|
+
| `backend` | Backend framework | NestJS, Express, Django, FastAPI, Rails, โฆ |
|
|
97
|
+
| `mobile` | Mobile | React Native, Flutter, Android, Ionic |
|
|
98
|
+
| `database` | Database | PostgreSQL, MySQL, SQLite, MongoDB, Redis |
|
|
99
|
+
| `orm` | ORM / Data layer | Prisma, Drizzle, TypeORM, SQLAlchemy, GORM |
|
|
100
|
+
| `styling` | Styling / UI | Tailwind CSS, CSS Modules, styled-components |
|
|
101
|
+
| `testing` | Testing | Jest, Vitest, Cypress, Playwright, Selenium |
|
|
102
|
+
| `aiml` | AI / ML | TensorFlow, PyTorch, scikit-learn, Pandas |
|
|
103
|
+
| `dataviz` | Data viz | D3, Chart.js, Grafana, Plotly |
|
|
104
|
+
| `container` | Container | Docker, Podman, containerd |
|
|
105
|
+
| `infra` | Infra / DevOps | Tailscale, Vercel, AWS, Kubernetes, Terraform |
|
|
106
|
+
| `baas` | Backend-as-a-service | Firebase, Appwrite, Amplify, Heroku, Supabase |
|
|
107
|
+
| `queue` | Queue / Cache | Redis, BullMQ, RabbitMQ, Kafka, Celery |
|
|
108
|
+
| `auth` | Auth | Auth.js, Clerk, Lucia, Keycloak, Auth0 |
|
|
109
|
+
|
|
110
|
+
> Each category also offers `"None"` (skip this category โ no skill). Not every option in the catalog has a `STACK_VALUE_TO_SKILL` entry; unmapped picks simply contribute no stack skill (but still appear in the stack line and docs).
|
|
111
|
+
|
|
112
|
+
### Role โ stack-folder gating (`role-skill-profile.ts`)
|
|
113
|
+
|
|
114
|
+
| Role match | `stackPrefixes` (gated by stack) | Pinned `core` (signature) |
|
|
115
|
+
| --- | --- | --- |
|
|
116
|
+
| CEO | *(none)* | app-planning, requirements-to-specs, specs-to-issues, architecture-before-code |
|
|
117
|
+
| Product Owner | *(none)* | product-discovery, requirements-to-specs, specs-to-issues, prioritization-moscow-rice |
|
|
118
|
+
| CTO | `stacks/` (all) | system-design-fundamentals, software-architecture-patterns, โฆ |
|
|
119
|
+
| Frontend | `stacks/frontend/` `stacks/styling/` `stacks/meta/` `stacks/mobile/` `stacks/testing/` | design-systems, ui-ux-principles, responsive-layout, โฆ |
|
|
120
|
+
| Backend | `stacks/backend/` `stacks/database/` `stacks/orm/` `stacks/queue/` `stacks/runtime/` `stacks/baas/` `stacks/auth/` | backend-fundamentals, api-design-rest-graphql, data-modeling, auth-and-authorization |
|
|
121
|
+
| Security | `stacks/auth/` | owasp-top-10, owasp-asvs, secrets-management, secure-auth-sessions |
|
|
122
|
+
| QA | `stacks/testing/` | testing-strategy-pyramid, tdd-and-coverage, unit-integration-e2e |
|
|
123
|
+
| DevOps | `stacks/infra/` `stacks/container/` `stacks/runtime/` | scalability-reliability, secrets-management |
|
|
124
|
+
| Docs | `stacks/` (all) | readme-generation |
|
|
125
|
+
| *(default)* | `stacks/` | *(none)* |
|
|
126
|
+
|
|
127
|
+
### `agent_skill` link columns
|
|
128
|
+
|
|
129
|
+
| Column | Meaning |
|
|
130
|
+
| --- | --- |
|
|
131
|
+
| `agentId`, `skillId` | composite primary key (the link) |
|
|
132
|
+
| `auto` | `true` = system-managed (stack/role auto-link, reconciled on boot & stack change); `false` = operator hand-toggled in the UI โ **reconcile never touches it** |
|
|
133
|
+
|
|
134
|
+
## Reconciliation ๐ฐ๏ธ
|
|
135
|
+
|
|
136
|
+
`reconcileStackRoleSkills(wsId)` (in `src/server/seed-library-skills.ts`) is the idempotent, LLM-free function that re-aligns every agent's auto-managed skills with the current stack + role. It runs:
|
|
137
|
+
|
|
138
|
+
- on **boot** (via `reconcileOnBoot` โ `seedLibrarySkillsForExistingWorkspaces`),
|
|
139
|
+
- during **onboarding** (after seeding the whole library), and
|
|
140
|
+
- on every **stack change** (`setWorkspaceStack`).
|
|
141
|
+
|
|
142
|
+
For each agent it computes `desired = skillNamesForRole(stack, role)`, then:
|
|
143
|
+
|
|
144
|
+
- **Prunes** any `auto` link to a *library* skill that falls outside the role's profile for the current stack (manual hand-toggles and the non-library procedural skills like `open-pr`/`run-suite` are left untouched).
|
|
145
|
+
- **Adds** the role's desired skills that aren't linked yet, inserting them with `auto: true` (`onConflictDoNothing`).
|
|
146
|
+
|
|
147
|
+
```ts
|
|
148
|
+
// src/server/seed-library-skills.ts โ reconcileStackRoleSkills (excerpt)
|
|
149
|
+
const desired = new Set(skillNamesForRole(stack, a.role).filter((n) => idByName.has(n)));
|
|
150
|
+
// prune AUTO links to LIBRARY skills outside this role's profile
|
|
151
|
+
if (l.auto && nm && libNames.has(nm) && !desired.has(nm)) { /* delete */ }
|
|
152
|
+
// add the role's skills not yet linked
|
|
153
|
+
if (sid && !present.has(sid)) { /* insert auto:true */ }
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
The whole native library (180+ skills) is **seeded** into every workspace so it shows in `/skills`, but only the stack+role subset is **auto-linked** to each agent. The rest stay available for the operator to enable by hand.
|
|
157
|
+
|
|
158
|
+
```mermaid
|
|
159
|
+
sequenceDiagram
|
|
160
|
+
participant OP as Operator
|
|
161
|
+
participant ACT as setWorkspaceStack
|
|
162
|
+
participant SEED as seedLibrarySkills
|
|
163
|
+
participant REC as reconcileStackRoleSkills
|
|
164
|
+
participant RAG as indexRag
|
|
165
|
+
OP->>ACT: save new stack
|
|
166
|
+
ACT->>ACT: diff vs current (changed?)
|
|
167
|
+
alt changed
|
|
168
|
+
ACT->>SEED: seed newly-relevant stack skills
|
|
169
|
+
ACT->>REC: re-link + prune auto skills per agent
|
|
170
|
+
ACT->>ACT: rerenderMissionDocs + logDecision
|
|
171
|
+
ACT->>RAG: indexRag (re-embed)
|
|
172
|
+
end
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Step-by-step
|
|
176
|
+
|
|
177
|
+
### Set or change a stack
|
|
178
|
+
|
|
179
|
+
1. Go to **Config โ Project Stacks** (the `StackEditor`, `src/components/modules/stack-editor.tsx`).
|
|
180
|
+
2. Pick one option per category. Incoherent picks are disabled with a reason (e.g. choosing a Python backend under a JS language shows *"Requires a Python language"*); a redundancy note may appear (e.g. *"Django already ships its own ORM"*).
|
|
181
|
+
3. Click **Save stack & reload skills** โ calls `setWorkspaceStack(sel)`.
|
|
182
|
+
4. On a real change the server seeds new stack skills, runs `reconcileStackRoleSkills`, re-renders the stack-bearing docs, logs a decision, and re-indexes RAG.
|
|
183
|
+
5. The UI confirms: *"Saved โ agents re-linked to the new stack."*
|
|
184
|
+
|
|
185
|
+
### Inferred stack on import
|
|
186
|
+
|
|
187
|
+
When onboarding **imports** an existing repo, local dir or visual mock, the first plan analyses the project file-by-file (`src/server/analyze.ts`) and writes a "Tech stack & dependencies" section into `specs/SUPER-SPEC.md`. For a pure visual mock, the analyzer is instructed to **infer** the intended tech stack from the markup/styles/scripts and state it explicitly so the plan adopts it.
|
|
188
|
+
|
|
189
|
+
## Examples
|
|
190
|
+
|
|
191
|
+
A Next.js + Postgres + Drizzle + Tailwind + Playwright TypeScript app:
|
|
192
|
+
|
|
193
|
+
```json
|
|
194
|
+
{
|
|
195
|
+
"language": "TypeScript",
|
|
196
|
+
"runtime": "Node.js",
|
|
197
|
+
"frontend": "React",
|
|
198
|
+
"meta": "Next.js",
|
|
199
|
+
"database": "PostgreSQL",
|
|
200
|
+
"orm": "Drizzle",
|
|
201
|
+
"styling": "Tailwind CSS",
|
|
202
|
+
"testing": "Playwright",
|
|
203
|
+
"container": "Docker",
|
|
204
|
+
"auth": "Auth.js"
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Resolved skill ids (`STACK_VALUE_TO_SKILL`): `typescript, node, react, nextjs, postgresql, drizzle, tailwind, playwright, docker, authjs` โ plus the ~23 universals. The **Frontend** agent auto-links `react`, `nextjs`, `tailwind`, `playwright` + all of `design/`; the **Backend** agent auto-links `postgresql`, `drizzle`, `node`, `authjs`; the **CyberSec** agent auto-links `authjs` + all of `engineering/security/`.
|
|
209
|
+
|
|
210
|
+
`stackDocHosts(stack)` would then expand the research allowlist with the `official_sources` hosts of those skills (e.g. `nextjs.org`, `tailwindcss.com`, `orm.drizzle.team`), on top of `BASE_DOC_HOSTS`.
|
|
211
|
+
|
|
212
|
+
## Possible states
|
|
213
|
+
|
|
214
|
+
| State | What it means |
|
|
215
|
+
| --- | --- |
|
|
216
|
+
| `stack = {}` | Empty (default). Only universal skills link; research allowlist is the base set only. |
|
|
217
|
+
| Category = `"None"` | That category contributes no skill and no docs host. |
|
|
218
|
+
| Mapped + on disk | Skill id resolves and the `SKILL.md` exists โ seeded + role-gated. |
|
|
219
|
+
| Mapped but no `SKILL.md` | Filtered out by `index.has(n)` โ silent no-op. |
|
|
220
|
+
| Unmapped catalog option | No stack skill, but still shown in the prompt's stack line + docs. |
|
|
221
|
+
| Incompatible pick | `incompat()` returns a reason โ the option card is disabled in the editor. |
|
|
222
|
+
|
|
223
|
+
## Related integrations
|
|
224
|
+
|
|
225
|
+
- **[Skills](./SKILLS.md)** โ the native library, seeding, the `auto` link, provisional skills, toggles.
|
|
226
|
+
- **[Agents](./AGENTS.md)** โ the 10-role roster whose roles drive `roleProfile`.
|
|
227
|
+
- **[KB & RAG](./KB_RAG.md)** ยท **[Memory RAG](./MEMORY_RAG.md)** โ the memory nebula that re-indexes on stack change.
|
|
228
|
+
- **[AI Architecture](./AI_ARCHITECTURE.md)** โ how the context-manager ranks stack skills into the prompt.
|
|
229
|
+
- **[Onboarding](./ONBOARDING.md)** โ where the stack is first chosen or inferred.
|
|
230
|
+
- **[Plugins](./PLUGINS.md)** ยท **[Models](./MODELS.md)** โ adjacent capability surfaces.
|
|
231
|
+
|
|
232
|
+
## Security ๐ณ๏ธ
|
|
233
|
+
|
|
234
|
+
- The stack is **operator-controlled data**, never agent-writable: it lives in the DB and is only edited via the `setWorkspaceStack` server action (behind `requireWorkspace`).
|
|
235
|
+
- `stackDocHosts` widens the research allowlist *only* to hosts declared in trusted `official_sources` frontmatter โ agents cannot fetch arbitrary URLs through `researchDocs` (`hostAllowed` gate, `src/server/research.ts`).
|
|
236
|
+
- Reconciliation never deletes operator hand-toggles (`auto: false`) or the procedural (non-library) skills โ a stack change cannot silently strip a capability you turned on by hand.
|
|
237
|
+
|
|
238
|
+
## Troubleshooting
|
|
239
|
+
|
|
240
|
+
| Symptom | Likely cause | Fix |
|
|
241
|
+
| --- | --- | --- |
|
|
242
|
+
| An agent ignores the chosen framework | Stack skill not linked / not on disk | Confirm the `STACK_VALUE_TO_SKILL` id has a `SKILL.md`; re-save the stack to re-run reconcile. |
|
|
243
|
+
| Wrong framework's skill keeps appearing | Stale auto link, or it's a hand-toggle | Re-save the stack (prunes stale autos); if hand-toggled (`auto:false`), toggle it off in `/skills`. |
|
|
244
|
+
| Research blocked on a docs host | Host not in `BASE_DOC_HOSTS` nor any skill's `official_sources` | Add the host to the relevant `SKILL.md` `official_sources`. |
|
|
245
|
+
| Editor disables an option | `incompat()` family mismatch | Align the language/runtime/backend/orm picks (see `stack-compat.ts`). |
|
|
246
|
+
| Skills didn't change after save | Stack value identical (no diff) | `setWorkspaceStack` only reconciles on a real change; pick a different value. |
|
|
247
|
+
|
|
248
|
+
## Related links
|
|
249
|
+
|
|
250
|
+
- [Skills](./SKILLS.md)
|
|
251
|
+
- [Agents](./AGENTS.md)
|
|
252
|
+
- [AI Architecture](./AI_ARCHITECTURE.md)
|
|
253
|
+
- [KB & RAG](./KB_RAG.md)
|
|
254
|
+
- [Memory RAG](./MEMORY_RAG.md)
|
|
255
|
+
- [Onboarding](./ONBOARDING.md)
|
|
256
|
+
- [Configuration](./CONFIGURATION.md)
|
|
257
|
+
- [Models](./MODELS.md)
|
|
258
|
+
- [Plugins](./PLUGINS.md)
|