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
|
+
[← Índice](./README.md) · [🇬🇧 English](../en/PREPARE_DEPLOY.md) · [✦ Constella](../../README.pt-BR.md)
|
|
2
|
+
|
|
3
|
+
# Preparar Deploy 🚀
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
A sequência de pré-lançamento. Antes de qualquer produto deixar a nave central, o **Preparar Deploy** executa um pipeline híbrido — verificações de engenharia determinísticas (comandos reais) mais uma única fase de agente — e então remove toda a camada de controle interna da Constella, enviando apenas o código-fonte limpo do produto para um repositório separado. Todo lançamento passa por uma comporta de varredura de segredos.
|
|
8
|
+
|
|
9
|
+
> Fonte da verdade: [`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. Quando usar 🌠
|
|
14
|
+
|
|
15
|
+
- Uma constelação terminou de construir e você quer levar o projeto para produção.
|
|
16
|
+
- Você precisa de uma **verificação de prontidão determinística**: dependências instalam, testes passam, um build de produção limpo roda e a aplicação realmente sobe.
|
|
17
|
+
- Você quer **documentar o ambiente** (`.env.example`, `README.md`, `DEPLOY.md`) antes de entregar o projeto a um host.
|
|
18
|
+
- Você quer publicar **apenas o produto** — sem `.claude/`, docs de planejamento, relatórios internos ou qualquer arquivo de controle — em um repositório GitHub separado.
|
|
19
|
+
- Você precisa da certeza de que **nenhum segredo** está prestes a deixar a nave.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 2. Como funciona 🌌
|
|
24
|
+
|
|
25
|
+
O Preparar Deploy é um **pipeline híbrido de preparação para produção**. O sistema executa por conta própria os passos determinísticos de engenharia (comandos reais de `install`, `test`, `build`; um portão de boot; uma varredura de segredos) e então entrega a uma **única fase de agente** o trabalho criativo restante (escrever `.env.example`, corrigir um build quebrado, escrever `README.md` / `DEPLOY.md`). O filtro de exportação limpa é a fonte única da verdade compartilhada tanto pelo **preview** quanto pela **exportação** — o que você vê no preview é exatamente o que seria enviado.
|
|
26
|
+
|
|
27
|
+
Três painéis determinísticos e sem agente alimentam a UI:
|
|
28
|
+
|
|
29
|
+
| Painel | Server action | O que retorna |
|
|
30
|
+
|--------|---------------|---------------|
|
|
31
|
+
| **Snapshot do ambiente** | `getDeployEnv()` → `detectDeployEnv(org.id)` | runtime, framework, gerenciador de pacotes, env vars exigidas/não documentadas, tipo de DB, portas, Dockerfile/compose, scripts de build e start, modo |
|
|
32
|
+
| **Preview da exportação limpa** | `previewCleanExport()` → `buildPreview(org.id)` | a árvore de arquivos que sobrevive ao filtro, total de bytes, contagens incluídas/ignoradas, docs encontrados e uma **varredura de segredos pré-exportação** |
|
|
33
|
+
| **Checklist automático** | `deployChecklist()` → `computeChecklist(...)` | um checklist de prontidão determinístico derivado do snapshot de ambiente + dos status dos passos da última execução |
|
|
34
|
+
|
|
35
|
+
O estado da execução atual em si é lido com `getDeployRun()` → `loadDeployRow(workspace.id)`.
|
|
36
|
+
|
|
37
|
+
### Persistência
|
|
38
|
+
|
|
39
|
+
Uma linha `deploy_run` **por workspace** guarda a última execução. A tabela é criada de forma idempotente no boot por `ensureDeployTables()` (`CREATE TABLE IF NOT EXISTS deploy_run … CREATE UNIQUE INDEX … ON deploy_run (workspace_id)`) — sem necessidade de `drizzle-kit push`. A linha armazena `status`, `runId`, os `steps[]`, o `checklist[]`, o último `buildLog`, o `summary`, o snapshot `lastExport` e `startedAt` / `updatedAt`.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 3. Snapshot do ambiente — `getDeployEnv` 🪐
|
|
44
|
+
|
|
45
|
+
`detectDeployEnv(orgId)` é totalmente determinístico (sem agente, sem chamada de modelo). Ele monta um objeto `DeployEnv`:
|
|
46
|
+
|
|
47
|
+
| Campo | Como é detectado |
|
|
48
|
+
|-------|------------------|
|
|
49
|
+
| `detected` | `true` se `detectProject(orgId)` encontrou um projeto executável |
|
|
50
|
+
| `runtime` | `proj.kind` — um de `node` / `python` / `go` / `rust` / `static`, senão `unknown` |
|
|
51
|
+
| `packageManager` | para Node, o `runCmd` resolvido (`npm` / `pnpm` / `yarn`) |
|
|
52
|
+
| `framework` | `detectFramework(deps, runtime)` — mapeia deps para um rótulo (Next.js / Nuxt / Remix / Angular / Svelte / Vue / React / Nest / servidor Node / serviço Python·Go·Rust·Static) |
|
|
53
|
+
| `projectName` / `runLabel` | `proj.name` / `proj.label` (ex.: `npm run dev`, `uvicorn`, `go run`) |
|
|
54
|
+
| `requiredEnv` | extraído de `.env.example` / `.env.sample` / `.env.template` via `parseEnvKeys` — cada chave recebe um flag `hasValue` (placeholders como `your_`, `<…>`, `changeme`, `xxx`, `example` contam como **sem** valor) |
|
|
55
|
+
| `referencedEnvCount` | total de chaves de env referenciadas no código (`scanEnvRefs`) |
|
|
56
|
+
| `unsetEnvKeys` | chaves de env **usadas no código mas não documentadas** em `.env.example` (menos `ENV_NOISE`: `NODE_ENV`, `PORT`, `HOST`, `PWD`, `HOME`, `PATH`, `CI`, `TZ`, `VERCEL`, `VERCEL_ENV`), ordenadas, limitadas a 40 |
|
|
57
|
+
| `database` | `detectDatabase(deps)` → `relational` / `document` / `key-value` / `none` |
|
|
58
|
+
| `ports` | extraído das linhas `EXPOSE` do `Dockerfile` e dos mapeamentos de porta em `docker-compose*` / `compose*` (limitado a 12) |
|
|
59
|
+
| `hasDockerfile` / `hasCompose` | presença de um `Dockerfile` / um arquivo compose |
|
|
60
|
+
| `buildScript` / `startScript` | `scripts.build` / `scripts.start` do `package.json` |
|
|
61
|
+
| `mode` | `prod` se houver saída de build (`hasBuildOutput`), `dev` caso contrário, `unknown` se não houver projeto |
|
|
62
|
+
|
|
63
|
+
`scanEnvRefs` percorre arquivos de código (`.ts .tsx .js .jsx .mjs .cjs .py .go .rs .vue .svelte`, ≤1500 arquivos, ≤512 KB cada) e casa `process.env.X`, `process.env["X"]`, `import.meta.env.X`, `os.environ[...]`, `os.getenv(...)` e o `os.Getenv(...)` do Go.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 4. Filtro de exportação limpa — `buildCleanTree` 🕳️
|
|
68
|
+
|
|
69
|
+
`buildCleanTree(tmp, orgId)` copia **apenas o produto limpo** para um diretório temporário. É o motor compartilhado por trás do preview e da exportação, então o preview é um ensaio fiel. Um caminho relativo ao workspace sobrevive somente se `isCleanProductPath(rel)` retornar `true`.
|
|
70
|
+
|
|
71
|
+
Um caminho é **removido** quando:
|
|
72
|
+
|
|
73
|
+
1. Seu segmento de primeiro nível está em `DENY_TOP` — a camada de controle/planejamento da Constella **ou** ruído de build/dependências.
|
|
74
|
+
2. Começa com `.constella`.
|
|
75
|
+
3. Casa o padrão `SENSITIVE` (segredos / dumps / logs / stores locais) **e** não é um template de env permitido.
|
|
76
|
+
|
|
77
|
+
### O que é removido
|
|
78
|
+
|
|
79
|
+
| Categoria | Entradas |
|
|
80
|
+
|-----------|----------|
|
|
81
|
+
| **Camada de controle / planejamento** (`DENY_TOP`) | `.claude`, `DOCS`, `PO`, `Reports`, `specs`, `issues`, `mock`, `uploads`, `archives`, `.testdev` |
|
|
82
|
+
| **Ruído de build / dependências** (`DENY_TOP`) | `node_modules`, `.git`, `.next`, `dist`, `build`, `out`, `coverage`, `.cache`, `.turbo`, `vendor` |
|
|
83
|
+
| **Arquivos sensíveis** (regex `SENSITIVE`) | `.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
|
+
| **Qualquer coisa sob** `.constella` | o marcador da raiz de runtime |
|
|
85
|
+
|
|
86
|
+
### O que é mantido
|
|
87
|
+
|
|
88
|
+
Todo o resto — o código-fonte real do produto — **mais** os templates de env permitidos que casam `ALLOW_ENV` (`.env.example`, `.env.sample`, `.env.template`, `.env.dist`). Após copiar, `buildCleanTree` escreve um `.gitignore` novo (`EXPORT_GITIGNORE`) na árvore temporária para que o repositório exportado ignore `node_modules/`, diretórios de build, logs e `.env*` (mas mantenha `!.env.example`). Retorna `{ copied, docs, files }`, onde `docs` reúne arquivos de README / LICENSE / CHANGELOG / DEPLOY / CONTRIBUTING na raiz.
|
|
89
|
+
|
|
90
|
+
> A camada de controle (`.claude/`, diretórios de planejamento) é o que faz da Constella um control plane. A exportação deliberadamente a deixa na nave — só o produto é lançado.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 5. O pipeline — `runDeployPipeline` ✦
|
|
95
|
+
|
|
96
|
+
`runDeployPipeline()` executa nove passos em ordem. Cada passo persiste na linha `deploy_run` **e** emite um evento `deploy` para que tanto o pipeline visual (por polling) quanto a caixa de narração ao vivo (`AgentRunLive`) mostrem o estado real. Uma **trava de reentrância** retorna a linha atual cedo se uma execução já estiver `running` e tiver começado há menos de 15 minutos.
|
|
97
|
+
|
|
98
|
+
| # | `key` do passo | Rótulo | O que faz |
|
|
99
|
+
|---|----------------|--------|-----------|
|
|
100
|
+
| 1 | `analyze` | Analyze the project | `detectProject` + `detectDeployEnv`. **Sem projeto → `failed`** |
|
|
101
|
+
| 2 | `deps` | Validate dependencies | roda `proj.install` (`CI=1`, timeout 300 s); `done` / `error` / "already installed" |
|
|
102
|
+
| 3 | `env` | Validate environment variables | `needs-action` se houver `unsetEnvKeys`, senão `done` |
|
|
103
|
+
| 4 | `tests` | Run tests | Node + `scripts.test` → `runCmd test` (`CI=1`, 300 s); senão `needs-action` "no automated test script" |
|
|
104
|
+
| 5 | `secrets` | Security scan | `buildPreview` sobre a árvore limpa → **`blocked` interrompe o pipeline** se algum segredo for encontrado |
|
|
105
|
+
| 6 | `build` | Production build | Node + `buildScript` → `run build` (`CI=1`, 600 s); falha → `error` (o agente tentará corrigir) |
|
|
106
|
+
| 7 | `validateBuild` | Validate build | portão de boot `ensureBootable` — a aplicação realmente sobe? |
|
|
107
|
+
| 8 | `agent` | Configure env, fix & document | **uma** fase de agente empacotada (ver abaixo) |
|
|
108
|
+
| 9 | `package` | Prepare clean package | `buildPreview` **de novo** (após as edições do agente); reverifica segredos, reporta contagem de arquivos + tamanho |
|
|
109
|
+
|
|
110
|
+
### O portão antecipado de segredos
|
|
111
|
+
|
|
112
|
+
O passo 5 é um **portão antecipado**: ele roda a varredura completa de segredos sobre a árvore limpa *antes* do build e do agente. Se `buildPreview().blocked` for verdadeiro, o passo vira `blocked`, um item `block` é enviado à **Inbox**, e a execução finaliza com status `blocked` — o build e o agente nunca rodam. Corrija os segredos e execute de novo.
|
|
113
|
+
|
|
114
|
+
### A fase de agente
|
|
115
|
+
|
|
116
|
+
`pickDeployAgent` escolhe o agente de **DevOps** (papel casando `/devops/i`), com fallback para `ada` e então o primeiro agente. `runFocusedAgent` faz uma chamada em streaming no canal `deploy` (timeout de 600 s) e **registra custo real** na tabela `costEntry`. A instrução (`deployAgentInstruction`) avisa que os passos determinísticos já rodaram e foca nas lacunas, em ordem:
|
|
117
|
+
|
|
118
|
+
1. Criar/atualizar `.env.example` documentando **toda** env var exigida (apenas placeholders, **nunca** segredos reais) — as chaves não documentadas são injetadas no prompt.
|
|
119
|
+
2. Se o build de produção falhou, **corrigir** os erros até compilar limpo.
|
|
120
|
+
3. Escrever/atualizar um `README.md` na raiz e um `DEPLOY.md` na raiz com passos concretos de build/run/deploy para este host.
|
|
121
|
+
4. Finalizar com um resumo curto para o operador + os próximos passos exatos.
|
|
122
|
+
|
|
123
|
+
É instruído a manter o produto/UX existente e a **nunca** adicionar arquivos internos/de controle nem um segundo app.
|
|
124
|
+
|
|
125
|
+
### Finalização
|
|
126
|
+
|
|
127
|
+
`finalize(status, summary)` recalcula o checklist, persiste `status` + `summary` + `buildLog`, emite um evento terminal `done` / `error`, chama `notifyOps` (uma notificação `deploy`) e revalida `/prepare-deploy`. O status final é `done`, `blocked` (segredos encontrados no conjunto de exportação após o agente) ou `failed`.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 6. Diagrama do pipeline 🛰️
|
|
132
|
+
|
|
133
|
+
```mermaid
|
|
134
|
+
flowchart TD
|
|
135
|
+
A["analyze · detectProject + env"] -->|sem projeto| FAIL["status: failed"]
|
|
136
|
+
A --> B["deps · install (CI=1)"]
|
|
137
|
+
B --> C["env · chaves nao definidas?"]
|
|
138
|
+
C --> D["tests · run test (CI=1)"]
|
|
139
|
+
D --> E{"secrets · varre arvore limpa"}
|
|
140
|
+
E -->|segredo encontrado| BLK["status: blocked → block na Inbox · para"]
|
|
141
|
+
E -->|limpo| F["build · run build (CI=1)"]
|
|
142
|
+
F --> G["validateBuild · ensureBootable"]
|
|
143
|
+
G --> H["agent · env + fix + docs (1 fase)"]
|
|
144
|
+
H --> I{"package · revarre conjunto de exportacao"}
|
|
145
|
+
I -->|segredo encontrado| BLK2["status: blocked"]
|
|
146
|
+
I -->|limpo| DONE["status: done"]
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## 7. Checklist automático — `computeChecklist` 🌠
|
|
152
|
+
|
|
153
|
+
Determinístico, derivado do snapshot de ambiente e dos status dos passos da última execução. Cada item tem um `status` de `ok` / `warn` / `fail` / `todo`.
|
|
154
|
+
|
|
155
|
+
| `key` | Rótulo | `ok` quando |
|
|
156
|
+
|-------|--------|-------------|
|
|
157
|
+
| `pkg` | package.json valid / manifest present | Node: `package.json` faz parse; senão: projeto detectado |
|
|
158
|
+
| `deps` | Dependencies installed | `node_modules` existe ou o passo `deps` terminou |
|
|
159
|
+
| `envExample` | `.env.example` present | existe um template ou `requiredEnv` não vazio |
|
|
160
|
+
| `envComplete` | All used env vars documented | `unsetEnvKeys.length === 0` (senão `warn`) |
|
|
161
|
+
| `secrets` | No secrets in the product | o passo `secrets` está `done` (`blocked` → `fail`) |
|
|
162
|
+
| `build` | Production build runs | `buildScript` existe e o passo `build` terminou (sem script → `warn`) |
|
|
163
|
+
| `tests` | Tests pass | `scripts.test` existe e o passo `tests` terminou (sem script → `warn`) |
|
|
164
|
+
| `readme` | README present | `README.md` / `readme.md` existe |
|
|
165
|
+
| `deployDoc` | Deploy docs present | `DEPLOY.md` existe |
|
|
166
|
+
| `internalExcluded` | Internal files excluded from export | sempre `ok` (o filtro garante isso) |
|
|
167
|
+
| `exportRepo` | Export repository configured | há um `github_pat` no Vault |
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## 8. Ações rápidas ⭐
|
|
172
|
+
|
|
173
|
+
Além do pipeline completo, ações individuais estão disponíveis (cada uma emite eventos `deploy` via `withDeployEvents`):
|
|
174
|
+
|
|
175
|
+
| Ação | Função | Efeito |
|
|
176
|
+
|------|--------|--------|
|
|
177
|
+
| Build only | `runBuildOnly()` | Node `run build` (`CI=1`, 600 s); persiste o `buildLog` |
|
|
178
|
+
| Tests only | `runTestsOnly()` | Node `run test` (`CI=1`, 300 s) |
|
|
179
|
+
| Generate README | `generateReadme()` → `genDocs("readme")` | uma chamada ao agente DevOps para escrever/atualizar `README.md` |
|
|
180
|
+
| Generate deploy docs | `generateDeployDocs()` → `genDocs("deploy")` | uma chamada ao agente DevOps para escrever/atualizar `DEPLOY.md` |
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## 9. Exportação de fonte limpa — `exportCleanSource` 🚀
|
|
185
|
+
|
|
186
|
+
Envia **apenas** o produto limpo para um repositório GitHub **separado** — nunca o `origin` vinculado do workspace da organização. Entrada: `{ repo, token?, branch?, message? }`.
|
|
187
|
+
|
|
188
|
+
**Passo a passo:**
|
|
189
|
+
|
|
190
|
+
1. Normaliza `repo` para `owner/repo` (remove o prefixo `https://github.com/` e o sufixo `.git`); rejeita qualquer coisa que não seja `owner/repo`.
|
|
191
|
+
2. Resolve o token: o `token` fornecido, senão o `github_pat` do Vault. Sem token → erro. O token é **ocultado** de toda string retornada.
|
|
192
|
+
3. Verifica o repo via `GET https://api.github.com/repos/{repo}` (timeout 12 s). `404` → "Repo not found, or this token can't access it."
|
|
193
|
+
4. `buildCleanTree(tmp, org.id)` para um diretório temporário. **Nada copiado → erro** ("no clean product source files were found").
|
|
194
|
+
5. `git init -b <branch>` (padrão `main`) → `git add -A`.
|
|
195
|
+
6. **PORTÃO FINAL de segredos** — `scanForSecrets(tmp)`. **Qualquer** achado bloqueia o push independentemente da allowlist: um `block` cai na **Inbox**, `notifyOps` dispara um alerta `security`, e o resultado é `{ ok:false, blocked:true, secrets }`.
|
|
196
|
+
7. Commit como `Constella Agents <agents@constella.dev>` (mensagem padrão `chore: export clean source`), pega o SHA curto.
|
|
197
|
+
8. `git push -f https://x-access-token:<token>@github.com/<repo>.git HEAD:<branch>` (timeout 120 s). Falha de push → cauda de erro ocultada.
|
|
198
|
+
9. Em caso de sucesso, persiste `lastExport` (`{ ok, sha, copied, repo, branch, at }`) na linha `deploy_run`.
|
|
199
|
+
|
|
200
|
+
```mermaid
|
|
201
|
+
sequenceDiagram
|
|
202
|
+
participant Op as Operador
|
|
203
|
+
participant PD as exportCleanSource
|
|
204
|
+
participant GH as API GitHub
|
|
205
|
+
participant FS as arvore limpa temp
|
|
206
|
+
Op->>PD: repo, token?, branch?
|
|
207
|
+
PD->>GH: GET /repos/{repo}
|
|
208
|
+
GH-->>PD: 200 / 404
|
|
209
|
+
PD->>FS: buildCleanTree (remove camada de controle + segredos)
|
|
210
|
+
PD->>FS: git init + add -A
|
|
211
|
+
PD->>FS: scanForSecrets (portao FINAL)
|
|
212
|
+
alt segredo encontrado
|
|
213
|
+
PD-->>Op: blocked → Inbox + notifyOps(security)
|
|
214
|
+
else limpo
|
|
215
|
+
PD->>GH: git push -f HEAD:branch
|
|
216
|
+
PD-->>Op: ok, sha, copied
|
|
217
|
+
end
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 10. Exemplos 🪐
|
|
223
|
+
|
|
224
|
+
**Rodar o pipeline completo** (a partir da página Preparar Deploy) — o sistema chama `runDeployPipeline()`; você acompanha nove passos e a narração ao vivo do agente.
|
|
225
|
+
|
|
226
|
+
**Apenas build:**
|
|
227
|
+
```ts
|
|
228
|
+
const { ok, log } = await runBuildOnly();
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**Exportar o produto limpo para um repositório separado:**
|
|
232
|
+
```ts
|
|
233
|
+
const res = await exportCleanSource({
|
|
234
|
+
repo: "my-org/my-product", // ou 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. Estados possíveis 🕳️
|
|
244
|
+
|
|
245
|
+
**Status da execução** (`RunStatus`, a coluna `deploy_run.status`):
|
|
246
|
+
|
|
247
|
+
| Estado | Significado |
|
|
248
|
+
|--------|-------------|
|
|
249
|
+
| `idle` | nenhuma execução ainda (linha padrão) |
|
|
250
|
+
| `running` | pipeline em andamento (trava de reentrância por 15 min) |
|
|
251
|
+
| `done` | concluído, limpo |
|
|
252
|
+
| `blocked` | segredos encontrados — portão antecipado (passo 5) ou re-varredura do pacote (passo 9) |
|
|
253
|
+
| `failed` | nenhum projeto executável, ou um erro inesperado |
|
|
254
|
+
|
|
255
|
+
**Status do passo** (`StepStatus`): `waiting`, `running`, `done`, `error`, `blocked`, `needs-action`.
|
|
256
|
+
|
|
257
|
+
**Status do checklist** (`ChecklistStatus`): `ok`, `warn`, `fail`, `todo`.
|
|
258
|
+
|
|
259
|
+
**Reconciliação no boot:** na inicialização, `reconcileDeployRuns()` trata qualquer linha `running` como órfã (seu processo morreu) — vira a linha para `failed` e qualquer passo ainda `running` para `error` ("interrupted by restart").
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## 12. Integrações relacionadas 🌌
|
|
264
|
+
|
|
265
|
+
- **GitHub** — `exportCleanSource` reutiliza o `github_pat` do Vault; o outro caminho (commitar o workspace inteiro no seu `origin` vinculado) está em [`GITHUB.md`](./GITHUB.md).
|
|
266
|
+
- **Test Dev** — o passo `validateBuild` chama `ensureBootable` do mesmo motor de dev-server documentado em [`TEST_DEV.md`](./TEST_DEV.md).
|
|
267
|
+
- **Inbox** — os portões de segredos enviam itens `block` via `pushInbox` ([`INBOX.md`](./INBOX.md)).
|
|
268
|
+
- **Agentes** — a fase de agente roda o agente de **DevOps** (Werner) ([`AGENTS.md`](./AGENTS.md)).
|
|
269
|
+
- **Deploy** — o lançamento real da fonte limpa para um host ([`DEPLOY.md`](./DEPLOY.md)).
|
|
270
|
+
- **Vault / Segurança** — segredos são guardados no Vault e limpos; ver [`SECURITY.md`](./SECURITY.md).
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
## 13. Segurança 🛡️
|
|
275
|
+
|
|
276
|
+
- **Dois portões de segredos.** O portão antecipado do pipeline (passo 5) e a re-varredura do pacote (passo 9) rodam ambos `scanForSecrets` sobre a árvore limpa; `exportCleanSource` roda uma **terceira, final** varredura no momento do push. Qualquer achado bloqueia.
|
|
277
|
+
- **`scanForSecrets`** varre os arquivos que o git *iria* commitar (mudanças da working-tree, incluindo não rastreados) — padrões de alta confiança (AWS / GitHub / OpenAI·Anthropic / Google / Slack / chaves privadas / JWT / URLs de DB com credenciais / tokens do Telegram / segredos hardcoded) mais tipos de arquivo que nunca devem ser commitados. Placeholders são ignorados; binários, arquivos >2 MB e diretórios de build são pulados. Os previews são ocultados (`abcd•••yz`).
|
|
278
|
+
- **Ocultação do token.** A exportação oculta o token do GitHub de toda string retornada, então ele nunca vaza para a UI, a Inbox ou uma notificação.
|
|
279
|
+
- **Alvo separado.** A exportação envia para um repositório **separado**, nunca o `origin` vinculado do workspace — a camada de controle não pode escapar por acidente.
|
|
280
|
+
- **Allowlist vs rede final.** O filtro limpo mantém templates de env (`.env.example`, etc.), mas o `scanForSecrets` final bloqueia **qualquer** segredo inline independentemente da allowlist.
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## 14. Solução de problemas 🛰️
|
|
285
|
+
|
|
286
|
+
| Sintoma | Causa provável / correção |
|
|
287
|
+
|---------|---------------------------|
|
|
288
|
+
| Execução finaliza `failed` imediatamente | "No runnable project detected" — `detectProject` não achou manifesto. Verifique a raiz do workspace. |
|
|
289
|
+
| Travado em `running` após reinício | `reconcileDeployRuns()` vira execuções órfãs para `failed` no boot; recarregue a página. |
|
|
290
|
+
| Passo `secrets` `blocked` | Há um segredo real no produto. Abra o block na Inbox, remova-o (use `.env` + um segredo no Vault), execute de novo. |
|
|
291
|
+
| Passo `build` `error` | A fase de agente tentará corrigir; a cauda do build está em `buildLog`. Use **Build only** para iterar. |
|
|
292
|
+
| `tests` mostra `needs-action` | Sem `scripts.test` (ou runtime não-Node) — a Constella não tem nada para rodar. |
|
|
293
|
+
| Exportação "Nothing to export yet" | `buildCleanTree` copiou 0 arquivos — tudo casou `DENY_TOP` / `SENSITIVE`, ou o workspace não tem fonte de produto. |
|
|
294
|
+
| Exportação "Repo not found" | O repo não existe ou o token não tem acesso — verifique o escopo do PAT. |
|
|
295
|
+
| Exportação `blocked` | A varredura final de segredos achou algo; veja a Inbox + a notificação de segurança. |
|
|
296
|
+
| `validateBuild` diz "toolchain unavailable" | O portão de boot é **pulado** (não falhado) quando o runtime (python/go/rust) não está instalado — não consegue validar, então não bloqueia. |
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## 15. Links relacionados 🌠
|
|
301
|
+
|
|
302
|
+
- [`DEPLOY.md`](./DEPLOY.md) — lançar a fonte limpa para um host
|
|
303
|
+
- [`GITHUB.md`](./GITHUB.md) — conectar um remoto, commitar o workspace, exportar fonte limpa
|
|
304
|
+
- [`TEST_DEV.md`](./TEST_DEV.md) — o dev-server + harness de testes headless (portão de boot)
|
|
305
|
+
- [`INBOX.md`](./INBOX.md) — onde os blocks aparecem
|
|
306
|
+
- [`AGENTS.md`](./AGENTS.md) — o agente de DevOps que roda a fase de agente
|
|
307
|
+
- [`SECURITY.md`](./SECURITY.md) — Vault, scrubbing, a jaula de FS
|
|
308
|
+
- [`WORKFLOW.md`](./WORKFLOW.md) — o ciclo completo Goal → … → Done
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
[← Índice](./README.md) · [🇬🇧 English](../en/PROJECT_STACKS.md) · [✦ Constella](../../README.pt-BR.md)
|
|
2
|
+
|
|
3
|
+
# Project Stacks 🪐
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
O **project stack** é a carta estelar tecnológica de um workspace: um pequeno mapa de qual linguagem, runtime, framework, banco de dados, ORM, estilização, testes e infra sustentam o produto. A partir dessa carta a Constella decide quais **skills** nativas orbitam cada agente, quais hosts de documentação oficial sua **pesquisa web** pode alcançar, e que cores de fundo pintam a nebulosa de memória **RAG** e cada system prompt. Escolha o stack uma vez; toda a constelação se realinha.
|
|
8
|
+
|
|
9
|
+
## Quando usar
|
|
10
|
+
|
|
11
|
+
- Durante o **onboarding** — você escolhe o stack (ou ele é inferido de um projeto importado) antes do primeiro plano.
|
|
12
|
+
- Sempre que as fundações do produto mudarem — adotar um novo framework, trocar de banco, adicionar uma fila — abra **Config → Project Stacks** e salve de novo. Cada agente é re-vinculado, os docs que carregam o stack são re-renderizados e o RAG re-indexa.
|
|
13
|
+
- Quando um agente insiste nos idiomas do framework *errado*: o stack é o que diz ao Frontend de um projeto Vue para carregar `vue`, não `react`.
|
|
14
|
+
|
|
15
|
+
## Como funciona
|
|
16
|
+
|
|
17
|
+
Um stack é um mapa JSON simples armazenado na linha do workspace:
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
// src/db/schema.ts → workspace
|
|
21
|
+
stack: text("stack", { mode: "json" }).$type<Record<string, string>>().notNull().default({}),
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
As chaves são **chaves de categoria** (`language`, `runtime`, `frontend`, …); os valores são os **rótulos das opções do catálogo** que o operador escolheu (`"TypeScript"`, `"Next.js"`, `"PostgreSQL"`, `"None"`). O catálogo de categorias e suas opções vive em `src/data/stack-catalog.ts` (`STACK_CATS` — 16 categorias, cada opção com uma descrição de uma linha via `descFor`).
|
|
25
|
+
|
|
26
|
+
Esse mapa alimenta três sistemas a jusante:
|
|
27
|
+
|
|
28
|
+
1. **Skills** — `STACK_VALUE_TO_SKILL` (em `src/data/stack-skill-map.ts`) mapeia cada rótulo do catálogo para um id-folha da biblioteca `skills/` (`"Next.js" → "nextjs"`). `librarySkillNamesForStack(stack)` e `skillNamesForRole(stack, role)` (em `src/server/skills-library.ts`) transformam o stack no conjunto exato de skills que cada agente deve carregar.
|
|
29
|
+
2. **Pesquisa web** — `stackDocHosts(stack)` lê os `official_sources` das skills do stack e produz os hostnames de documentação que a allowlist central (`src/server/research.ts`) permitirá.
|
|
30
|
+
3. **Contexto + RAG** — `src/server/context-manager.ts` ranqueia as skills habilitadas de um agente por relevância ao stack e escreve uma linha-resumo `stack: …` no system prompt; `setWorkspaceStack` re-indexa o RAG numa mudança real.
|
|
31
|
+
|
|
32
|
+
## Fluxo principal 🌌
|
|
33
|
+
|
|
34
|
+
```mermaid
|
|
35
|
+
flowchart TD
|
|
36
|
+
OP["Operador escolhe o stack<br/>(onboarding ou Config)"] --> WS["workspace.stack<br/>Record<string,string>"]
|
|
37
|
+
WS --> MAP["STACK_VALUE_TO_SKILL<br/>rótulo → id-folha da biblioteca"]
|
|
38
|
+
MAP --> SK["librarySkillNamesForStack()<br/>universais + ids do stack"]
|
|
39
|
+
SK --> ROLE["skillNamesForRole(stack, role)<br/>perfil de role filtra pastas"]
|
|
40
|
+
ROLE --> LINK["reconcileStackRoleSkills()<br/>auto-vincular / podar por agente"]
|
|
41
|
+
SK --> HOSTS["stackDocHosts()<br/>official_sources → hosts"]
|
|
42
|
+
HOSTS --> RESEARCH["allowlist de pesquisa<br/>WebFetch / researchDocs"]
|
|
43
|
+
WS --> CTX["context-manager<br/>ranqueia skills + linha de stack"]
|
|
44
|
+
CTX --> PROMPT["system prompt do agente"]
|
|
45
|
+
RESEARCH --> RAG["nebulosa KB / RAG"]
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Conceitos-chave
|
|
49
|
+
|
|
50
|
+
| Conceito | O que é | Fonte |
|
|
51
|
+
| --- | --- | --- |
|
|
52
|
+
| **Stack** | `Record<string,string>` de categoria → rótulo escolhido, em `workspace.stack` | `src/db/schema.ts` |
|
|
53
|
+
| **Catálogo** | `STACK_CATS` — as 16 categorias + opções exibidas na UI | `src/data/stack-catalog.ts` |
|
|
54
|
+
| **`STACK_VALUE_TO_SKILL`** | rótulo → id-folha de `skills/`; `"None"`/ausente = sem skill | `src/data/stack-skill-map.ts` |
|
|
55
|
+
| **Skill da biblioteca** | um `SKILL.md` sob `skills/` na raiz, chaveado pelo **nome da pasta-folha** | `src/server/skills-library.ts` |
|
|
56
|
+
| **Perfil de role** | quais pastas da biblioteca um role auto-vincula (`stackPrefixes` vs `allPrefixes` + `core`) | `src/data/role-skill-profile.ts` |
|
|
57
|
+
| **Vínculo `auto`** | `agent_skill.auto = true` → gerenciado pelo sistema (reconcile pode tocar); `false` → toggle manual do operador (nunca tocado) | `src/db/schema.ts` |
|
|
58
|
+
| **Reconciliação** | `reconcileStackRoleSkills(wsId)` — re-vincula/poda skills auto para casar com stack+role | `src/server/seed-library-skills.ts` |
|
|
59
|
+
| **Compatibilidade** | `incompat()` / `stackNote()` — desabilita escolhas incoerentes, avisa sobre redundância | `src/lib/stack-compat.ts` |
|
|
60
|
+
|
|
61
|
+
### Do valor do stack a uma skill da biblioteca
|
|
62
|
+
|
|
63
|
+
`STACK_VALUE_TO_SKILL` é um dicionário plano. Uma **entrada ausente** ou o literal `"None"` resolve para nenhuma skill (ignorada). O loader da biblioteca de skills filtra ainda cada id mapeado para os que **realmente existem em disco** — então um mapeamento aspiracional sem `SKILL.md` degrada silenciosamente para um no-op.
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
// src/data/stack-skill-map.ts (trecho)
|
|
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
|
+
- **Skills universais** (`UNIVERSAL_SKILL_NAMES`, ~23) vão para *todo* workspace, independente do stack — clean-code, git-workflow, OWASP, pirâmide de testes, princípios de UI/UX, os rituais de processo, `research-official-docs`, etc.
|
|
75
|
+
- **Skills do stack** são os ids que `STACK_VALUE_TO_SKILL` produz a partir das opções escolhidas.
|
|
76
|
+
- **Filtragem por role** decide *qual* agente recebe *qual* skill do stack. `skillNamesForRole(stack, role)` consulta `roleProfile(role)`: as pastas `allPrefixes` de um role são vinculadas por inteiro (boas práticas de design/engenharia/processo), enquanto as pastas `stackPrefixes` são vinculadas **só para as escolhas que o stack de fato selecionou** — então o Frontend de um projeto Vue recebe `vue`, nunca `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
|
+
## Tabelas
|
|
87
|
+
|
|
88
|
+
### Categorias do stack (`STACK_CATS`)
|
|
89
|
+
|
|
90
|
+
| Chave | Rótulo | Opções de exemplo |
|
|
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
|
+
> Cada categoria também oferece `"None"` (pular esta categoria — sem skill). Nem toda opção do catálogo tem entrada em `STACK_VALUE_TO_SKILL`; escolhas não mapeadas simplesmente não contribuem com skill de stack (mas ainda aparecem na linha de stack e nos docs).
|
|
111
|
+
|
|
112
|
+
### Filtragem role → pasta de stack (`role-skill-profile.ts`)
|
|
113
|
+
|
|
114
|
+
| Match do role | `stackPrefixes` (filtrado pelo stack) | `core` fixado (assinatura) |
|
|
115
|
+
| --- | --- | --- |
|
|
116
|
+
| CEO | *(nenhum)* | app-planning, requirements-to-specs, specs-to-issues, architecture-before-code |
|
|
117
|
+
| Product Owner | *(nenhum)* | product-discovery, requirements-to-specs, specs-to-issues, prioritization-moscow-rice |
|
|
118
|
+
| CTO | `stacks/` (tudo) | 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/` (tudo) | readme-generation |
|
|
125
|
+
| *(default)* | `stacks/` | *(nenhum)* |
|
|
126
|
+
|
|
127
|
+
### Colunas do vínculo `agent_skill`
|
|
128
|
+
|
|
129
|
+
| Coluna | Significado |
|
|
130
|
+
| --- | --- |
|
|
131
|
+
| `agentId`, `skillId` | chave primária composta (o vínculo) |
|
|
132
|
+
| `auto` | `true` = gerenciado pelo sistema (auto-vínculo por stack/role, reconciliado no boot e na mudança de stack); `false` = toggle manual do operador na UI → **reconcile nunca toca nele** |
|
|
133
|
+
|
|
134
|
+
## Reconciliação 🛰️
|
|
135
|
+
|
|
136
|
+
`reconcileStackRoleSkills(wsId)` (em `src/server/seed-library-skills.ts`) é a função idempotente e sem-LLM que re-alinha as skills auto-gerenciadas de cada agente com o stack + role atual. Ela roda:
|
|
137
|
+
|
|
138
|
+
- no **boot** (via `reconcileOnBoot` → `seedLibrarySkillsForExistingWorkspaces`),
|
|
139
|
+
- durante o **onboarding** (após semear a biblioteca inteira), e
|
|
140
|
+
- em toda **mudança de stack** (`setWorkspaceStack`).
|
|
141
|
+
|
|
142
|
+
Para cada agente ela computa `desired = skillNamesForRole(stack, role)`, e então:
|
|
143
|
+
|
|
144
|
+
- **Poda** qualquer vínculo `auto` para uma skill *da biblioteca* que caia fora do perfil do role para o stack atual (toggles manuais e as skills procedurais fora da biblioteca como `open-pr`/`run-suite` ficam intactos).
|
|
145
|
+
- **Adiciona** as skills desejadas do role ainda não vinculadas, inserindo-as com `auto: true` (`onConflictDoNothing`).
|
|
146
|
+
|
|
147
|
+
```ts
|
|
148
|
+
// src/server/seed-library-skills.ts → reconcileStackRoleSkills (trecho)
|
|
149
|
+
const desired = new Set(skillNamesForRole(stack, a.role).filter((n) => idByName.has(n)));
|
|
150
|
+
// poda vínculos AUTO para skills da BIBLIOTECA fora do perfil deste role
|
|
151
|
+
if (l.auto && nm && libNames.has(nm) && !desired.has(nm)) { /* delete */ }
|
|
152
|
+
// adiciona as skills do role ainda não vinculadas
|
|
153
|
+
if (sid && !present.has(sid)) { /* insert auto:true */ }
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
A biblioteca nativa inteira (180+ skills) é **semeada** em todo workspace para aparecer em `/skills`, mas apenas o subconjunto stack+role é **auto-vinculado** a cada agente. O resto fica disponível para o operador habilitar à mão.
|
|
157
|
+
|
|
158
|
+
```mermaid
|
|
159
|
+
sequenceDiagram
|
|
160
|
+
participant OP as Operador
|
|
161
|
+
participant ACT as setWorkspaceStack
|
|
162
|
+
participant SEED as seedLibrarySkills
|
|
163
|
+
participant REC as reconcileStackRoleSkills
|
|
164
|
+
participant RAG as indexRag
|
|
165
|
+
OP->>ACT: salva novo stack
|
|
166
|
+
ACT->>ACT: diff vs atual (mudou?)
|
|
167
|
+
alt mudou
|
|
168
|
+
ACT->>SEED: semeia skills do stack recém-relevantes
|
|
169
|
+
ACT->>REC: re-vincula + poda skills auto por agente
|
|
170
|
+
ACT->>ACT: rerenderMissionDocs + logDecision
|
|
171
|
+
ACT->>RAG: indexRag (re-embed)
|
|
172
|
+
end
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Passo a passo
|
|
176
|
+
|
|
177
|
+
### Definir ou mudar um stack
|
|
178
|
+
|
|
179
|
+
1. Vá em **Config → Project Stacks** (o `StackEditor`, `src/components/modules/stack-editor.tsx`).
|
|
180
|
+
2. Escolha uma opção por categoria. Escolhas incoerentes ficam desabilitadas com um motivo (ex.: escolher um backend Python sob uma linguagem JS mostra *"Requires a Python language"*); uma nota de redundância pode surgir (ex.: *"Django already ships its own ORM"*).
|
|
181
|
+
3. Clique em **Save stack & reload skills** → chama `setWorkspaceStack(sel)`.
|
|
182
|
+
4. Numa mudança real o servidor semeia novas skills de stack, roda `reconcileStackRoleSkills`, re-renderiza os docs que carregam o stack, registra uma decisão e re-indexa o RAG.
|
|
183
|
+
5. A UI confirma: *"Saved — agents re-linked to the new stack."*
|
|
184
|
+
|
|
185
|
+
### Stack inferido na importação
|
|
186
|
+
|
|
187
|
+
Quando o onboarding **importa** um repo existente, diretório local ou mock visual, o primeiro plano analisa o projeto arquivo por arquivo (`src/server/analyze.ts`) e escreve uma seção "Tech stack & dependencies" em `specs/SUPER-SPEC.md`. Para um mock puramente visual, o analisador é instruído a **inferir** o tech stack pretendido a partir do markup/estilos/scripts e declará-lo explicitamente para que o plano o adote.
|
|
188
|
+
|
|
189
|
+
## Exemplos
|
|
190
|
+
|
|
191
|
+
Um app TypeScript Next.js + Postgres + Drizzle + Tailwind + Playwright:
|
|
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
|
+
Ids de skill resolvidos (`STACK_VALUE_TO_SKILL`): `typescript, node, react, nextjs, postgresql, drizzle, tailwind, playwright, docker, authjs` — mais as ~23 universais. O agente **Frontend** auto-vincula `react`, `nextjs`, `tailwind`, `playwright` + todo `design/`; o agente **Backend** auto-vincula `postgresql`, `drizzle`, `node`, `authjs`; o agente **CyberSec** auto-vincula `authjs` + todo `engineering/security/`.
|
|
209
|
+
|
|
210
|
+
`stackDocHosts(stack)` então expandiria a allowlist de pesquisa com os hosts de `official_sources` dessas skills (ex.: `nextjs.org`, `tailwindcss.com`, `orm.drizzle.team`), além de `BASE_DOC_HOSTS`.
|
|
211
|
+
|
|
212
|
+
## Estados possíveis
|
|
213
|
+
|
|
214
|
+
| Estado | O que significa |
|
|
215
|
+
| --- | --- |
|
|
216
|
+
| `stack = {}` | Vazio (default). Só skills universais vinculam; a allowlist de pesquisa é só o conjunto base. |
|
|
217
|
+
| Categoria = `"None"` | Essa categoria não contribui com skill nem host de docs. |
|
|
218
|
+
| Mapeado + em disco | O id de skill resolve e o `SKILL.md` existe → semeado + filtrado por role. |
|
|
219
|
+
| Mapeado mas sem `SKILL.md` | Filtrado por `index.has(n)` → no-op silencioso. |
|
|
220
|
+
| Opção de catálogo não mapeada | Sem skill de stack, mas ainda exibida na linha de stack do prompt + docs. |
|
|
221
|
+
| Escolha incompatível | `incompat()` retorna um motivo → o card da opção fica desabilitado no editor. |
|
|
222
|
+
|
|
223
|
+
## Integrações relacionadas
|
|
224
|
+
|
|
225
|
+
- **[Skills](./SKILLS.md)** — a biblioteca nativa, semeadura, o vínculo `auto`, skills provisórias, toggles.
|
|
226
|
+
- **[Agents](./AGENTS.md)** — o roster de 10 funções cujos roles alimentam `roleProfile`.
|
|
227
|
+
- **[KB & RAG](./KB_RAG.md)** · **[Memory RAG](./MEMORY_RAG.md)** — a nebulosa de memória que re-indexa na mudança de stack.
|
|
228
|
+
- **[AI Architecture](./AI_ARCHITECTURE.md)** — como o context-manager ranqueia as skills do stack no prompt.
|
|
229
|
+
- **[Onboarding](./ONBOARDING.md)** — onde o stack é escolhido ou inferido pela primeira vez.
|
|
230
|
+
- **[Plugins](./PLUGINS.md)** · **[Models](./MODELS.md)** — superfícies de capacidade adjacentes.
|
|
231
|
+
|
|
232
|
+
## Segurança 🕳️
|
|
233
|
+
|
|
234
|
+
- O stack é **dado controlado pelo operador**, nunca gravável por agente: vive no DB e só é editado via a server action `setWorkspaceStack` (atrás de `requireWorkspace`).
|
|
235
|
+
- `stackDocHosts` amplia a allowlist de pesquisa *apenas* para hosts declarados em `official_sources` de frontmatter confiável — agentes não podem buscar URLs arbitrárias via `researchDocs` (gate `hostAllowed`, `src/server/research.ts`).
|
|
236
|
+
- A reconciliação nunca apaga toggles manuais do operador (`auto: false`) nem as skills procedurais (fora da biblioteca) — uma mudança de stack não pode remover silenciosamente uma capacidade que você ligou à mão.
|
|
237
|
+
|
|
238
|
+
## Resolução de problemas
|
|
239
|
+
|
|
240
|
+
| Sintoma | Causa provável | Correção |
|
|
241
|
+
| --- | --- | --- |
|
|
242
|
+
| Um agente ignora o framework escolhido | Skill de stack não vinculada / não está em disco | Confirme que o id de `STACK_VALUE_TO_SKILL` tem um `SKILL.md`; salve o stack de novo para re-rodar o reconcile. |
|
|
243
|
+
| Skill do framework errado fica aparecendo | Vínculo auto obsoleto, ou é um toggle manual | Salve o stack de novo (poda autos obsoletos); se for manual (`auto:false`), desative-o em `/skills`. |
|
|
244
|
+
| Pesquisa bloqueada num host de docs | Host fora de `BASE_DOC_HOSTS` e de qualquer `official_sources` | Adicione o host ao `official_sources` do `SKILL.md` relevante. |
|
|
245
|
+
| Editor desabilita uma opção | Mismatch de família em `incompat()` | Alinhe as escolhas de language/runtime/backend/orm (ver `stack-compat.ts`). |
|
|
246
|
+
| Skills não mudaram após salvar | Valor de stack idêntico (sem diff) | `setWorkspaceStack` só reconcilia numa mudança real; escolha um valor diferente. |
|
|
247
|
+
|
|
248
|
+
## Links relacionados
|
|
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)
|