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,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "7",
|
|
3
|
+
"dialect": "sqlite",
|
|
4
|
+
"entries": [
|
|
5
|
+
{
|
|
6
|
+
"idx": 0,
|
|
7
|
+
"version": "6",
|
|
8
|
+
"when": 1781826259088,
|
|
9
|
+
"tag": "0000_regular_nightshade",
|
|
10
|
+
"breakpoints": true
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"idx": 1,
|
|
14
|
+
"version": "6",
|
|
15
|
+
"when": 1782163410060,
|
|
16
|
+
"tag": "0001_mixed_zombie",
|
|
17
|
+
"breakpoints": true
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Plain-JS config (NOT .ts): the compiled distribution ships this under the user's `node_modules`, and
|
|
2
|
+
// Node refuses to strip TypeScript types for files under `node_modules` ("Stripping types is currently
|
|
3
|
+
// unsupported …"). `drizzle-kit migrate` loads this at first run, so it must be loadable without any
|
|
4
|
+
// TypeScript tooling. `out` + `schema` are relative to the dir `drizzle-kit` runs in.
|
|
5
|
+
import { defineConfig } from "drizzle-kit";
|
|
6
|
+
|
|
7
|
+
export default defineConfig({
|
|
8
|
+
schema: "./src/db/schema.ts",
|
|
9
|
+
out: "./drizzle",
|
|
10
|
+
dialect: "sqlite",
|
|
11
|
+
dbCredentials: {
|
|
12
|
+
url: process.env.DATABASE_URL ?? "file:./.constella/constella.db",
|
|
13
|
+
},
|
|
14
|
+
verbose: true,
|
|
15
|
+
strict: true,
|
|
16
|
+
});
|
package/next.config.mjs
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Plain-JS config (NOT .ts) on purpose: `next start` re-reads this at runtime, and the compiled
|
|
2
|
+
// distribution installs `dependencies` only — `typescript` isn't present for end users, so a .ts
|
|
3
|
+
// config would fail to load. JSDoc keeps editor types without a runtime TypeScript dependency.
|
|
4
|
+
|
|
5
|
+
/** @type {import("next").NextConfig} */
|
|
6
|
+
const nextConfig = {
|
|
7
|
+
reactStrictMode: true,
|
|
8
|
+
// Heavy/native packages Next must NOT bundle — loaded from node_modules at runtime.
|
|
9
|
+
serverExternalPackages: ["better-sqlite3", "@playwright/test", "playwright-core", "playwright", "chromium-bidi"],
|
|
10
|
+
typedRoutes: true,
|
|
11
|
+
// NOTE: `output: "standalone"` was removed. Its NFT tracer aborts on the dev-server manager's
|
|
12
|
+
// runtime fs/spawn operations ("whole project traced unintentionally"), and its chdir into
|
|
13
|
+
// `.next/standalone/` forked a separate DB. Plain `next start` serves assets + auto-loads `.env`
|
|
14
|
+
// from the project root — simpler and correct for local prod. The npm package instead ships the
|
|
15
|
+
// prebuilt `.next` directly (see package.json "files"), which is self-contained enough.
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export default nextConfig;
|
package/package.json
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "constella",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Constella — run autonomous AI agent-companies locally: real claude/codex agents, Goals → Specs → Issues → Plans, local models, GitHub & Telegram, all from one cosmic control plane.",
|
|
5
|
+
"//name": "Unscoped so `npx constella` works. If the name is taken on npm, fall back to `@constella/cli` (then commands become `npx @constella/cli`).",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "Gabriel Silva <gabrielluizoliveirasilva724@gmail.com>",
|
|
8
|
+
"homepage": "https://github.com/gabriel7silva/constella#readme",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/gabriel7silva/constella.git"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/gabriel7silva/constella/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"ai",
|
|
18
|
+
"agents",
|
|
19
|
+
"autonomous-agents",
|
|
20
|
+
"ai-agents",
|
|
21
|
+
"claude",
|
|
22
|
+
"codex",
|
|
23
|
+
"llm",
|
|
24
|
+
"local-models",
|
|
25
|
+
"llama.cpp",
|
|
26
|
+
"rag",
|
|
27
|
+
"nextjs",
|
|
28
|
+
"self-hosted",
|
|
29
|
+
"cli"
|
|
30
|
+
],
|
|
31
|
+
"type": "module",
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=20"
|
|
34
|
+
},
|
|
35
|
+
"//files": "Ships the COMPILED build (.next) + generated migrations (drizzle) + the launcher — NOT src/. End users get a compiled, minified runtime, never the source. next.config is .mjs so `next start` needs no TypeScript at runtime (devDeps aren't installed for end users).",
|
|
36
|
+
"files": [
|
|
37
|
+
".next",
|
|
38
|
+
"bin",
|
|
39
|
+
"scripts",
|
|
40
|
+
"skills",
|
|
41
|
+
"docs",
|
|
42
|
+
"drizzle",
|
|
43
|
+
"next.config.mjs",
|
|
44
|
+
"drizzle.config.mjs",
|
|
45
|
+
"README.md",
|
|
46
|
+
"LICENSE",
|
|
47
|
+
"CHANGELOG.md"
|
|
48
|
+
],
|
|
49
|
+
"publishConfig": {
|
|
50
|
+
"access": "public"
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"dev": "next dev",
|
|
54
|
+
"dev:all": "node scripts/dev-all.mjs",
|
|
55
|
+
"build": "next build --webpack",
|
|
56
|
+
"start": "node scripts/start-all.mjs",
|
|
57
|
+
"start:web": "next start",
|
|
58
|
+
"lint": "eslint .",
|
|
59
|
+
"lint:i18n": "eslint src/components src/app --max-warnings 0",
|
|
60
|
+
"parity": "node scripts/i18n-parity.mjs",
|
|
61
|
+
"typecheck": "tsc --noEmit",
|
|
62
|
+
"validate": "npm run typecheck && npm run parity && npm run build",
|
|
63
|
+
"update": "node bin/constella.mjs update",
|
|
64
|
+
"clean": "node scripts/clean-repo.mjs",
|
|
65
|
+
"prepublishOnly": "drizzle-kit generate --config drizzle.config.mjs && npm run validate",
|
|
66
|
+
"prepack": "node scripts/trim-next.mjs",
|
|
67
|
+
"db:dir": "node -e \"require('fs').mkdirSync('.constella',{recursive:true})\"",
|
|
68
|
+
"db:generate": "drizzle-kit generate --config drizzle.config.mjs",
|
|
69
|
+
"predb:migrate": "npm run db:dir",
|
|
70
|
+
"db:migrate": "drizzle-kit migrate --config drizzle.config.mjs",
|
|
71
|
+
"predb:push": "npm run db:dir",
|
|
72
|
+
"db:push": "drizzle-kit push --config drizzle.config.mjs",
|
|
73
|
+
"db:studio": "drizzle-kit studio --config drizzle.config.mjs",
|
|
74
|
+
"predb:seed": "npm run db:dir",
|
|
75
|
+
"db:seed": "tsx src/db/seed.ts",
|
|
76
|
+
"db:migrate-fs": "tsx src/db/migrate-fs.ts",
|
|
77
|
+
"db:defake-models": "tsx src/db/defake-models.ts",
|
|
78
|
+
"db:reset-state": "tsx src/db/reset-state.ts",
|
|
79
|
+
"db:repair-fs": "tsx src/db/repair-fs.ts",
|
|
80
|
+
"db:nuke": "node -e \"const fs=require('fs'),os=require('os'),p=require('path');fs.rmSync('.constella',{recursive:true,force:true});fs.rmSync(p.join(process.env.CONSTELLA_HOME||p.join(os.homedir(),'.constella'),'organizations'),{recursive:true,force:true})\"",
|
|
81
|
+
"db:reset": "npm run db:nuke && npm run db:migrate",
|
|
82
|
+
"db:reset-demo": "npm run db:nuke && npm run db:migrate && npm run db:seed && npm run db:repair-fs",
|
|
83
|
+
"worker": "node --env-file=.env bin/worker.mjs",
|
|
84
|
+
"constella": "node bin/constella.mjs"
|
|
85
|
+
},
|
|
86
|
+
"bin": {
|
|
87
|
+
"constella": "bin/constella.mjs"
|
|
88
|
+
},
|
|
89
|
+
"dependencies": {
|
|
90
|
+
"@playwright/test": "^1.61.0",
|
|
91
|
+
"@simplewebauthn/browser": "^13.3.0",
|
|
92
|
+
"@simplewebauthn/server": "^13.3.1",
|
|
93
|
+
"adm-zip": "^0.5.17",
|
|
94
|
+
"archiver": "^8.0.0",
|
|
95
|
+
"better-auth": "^1.6.19",
|
|
96
|
+
"better-sqlite3": "^11.10.0",
|
|
97
|
+
"chokidar": "^5.0.0",
|
|
98
|
+
"drizzle-kit": "^0.31.10",
|
|
99
|
+
"drizzle-orm": "^0.45.2",
|
|
100
|
+
"next": "^16.2.9",
|
|
101
|
+
"react": "^19.2.7",
|
|
102
|
+
"react-dom": "^19.2.7",
|
|
103
|
+
"react-markdown": "^10.1.0",
|
|
104
|
+
"remark-gfm": "^4.0.1",
|
|
105
|
+
"zod": "^3.25.76"
|
|
106
|
+
},
|
|
107
|
+
"devDependencies": {
|
|
108
|
+
"@tailwindcss/postcss": "^4.3.1",
|
|
109
|
+
"@types/adm-zip": "^0.5.8",
|
|
110
|
+
"@types/archiver": "^8.0.0",
|
|
111
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
112
|
+
"@types/node": "^22.19.21",
|
|
113
|
+
"@types/react": "^19.2.17",
|
|
114
|
+
"@types/react-dom": "^19.2.3",
|
|
115
|
+
"eslint": "^10.5.0",
|
|
116
|
+
"eslint-plugin-react": "^7.37.5",
|
|
117
|
+
"postcss": "^8.5.15",
|
|
118
|
+
"tailwindcss": "^4.3.1",
|
|
119
|
+
"tsx": "^4.22.4",
|
|
120
|
+
"typescript": "^5.9.3",
|
|
121
|
+
"typescript-eslint": "^8.61.1"
|
|
122
|
+
},
|
|
123
|
+
"//pnpm.overrides": "Force patched transitive build-tooling across the tree. postcss: Next bundles 8.4.31 (GHSA: XSS via unescaped </style>). esbuild: the vulnerable 0.18.20 (GHSA-67mh-4wv8-2f99, dev-server CORS) is pulled only by drizzle-kit's legacy @esbuild-kit/core-utils config loader — drizzle-kit's own work already uses esbuild 0.25.x, so bumping the legacy loader to >=0.25.0 patches the advisory; the loader's transform/build API usage is stable across 0.18→0.25.",
|
|
124
|
+
"pnpm": {
|
|
125
|
+
"overrides": {
|
|
126
|
+
"postcss@<8.5.10": ">=8.5.10",
|
|
127
|
+
"esbuild@<0.25.0": ">=0.25.0"
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Remove dead/scratch artifacts from the repo root before commit/publish. Idempotent + safe:
|
|
3
|
+
// only touches a known pattern set, never source/config. Run: `npm run clean`.
|
|
4
|
+
import { readdirSync, rmSync, statSync } from "node:fs";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
|
|
7
|
+
const ROOT = process.cwd();
|
|
8
|
+
const EXACT = new Set(["Constella App.html", "extracted_design_system.css", "tsconfig.tsbuildinfo"]);
|
|
9
|
+
const matches = (name) =>
|
|
10
|
+
EXACT.has(name) || /^temp_.*\.(jsx?|tsx?|html|css)$/i.test(name);
|
|
11
|
+
|
|
12
|
+
let removed = 0;
|
|
13
|
+
for (const name of readdirSync(ROOT)) {
|
|
14
|
+
if (!matches(name)) continue;
|
|
15
|
+
const p = join(ROOT, name);
|
|
16
|
+
try {
|
|
17
|
+
if (statSync(p).isFile()) { rmSync(p, { force: true }); console.log("removed", name); removed++; }
|
|
18
|
+
} catch { /* skip */ }
|
|
19
|
+
}
|
|
20
|
+
console.log(removed ? `\nClean: removed ${removed} artifact(s).` : "Clean: nothing to remove.");
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Launches `next dev` (web) AND the background worker together for LOCAL DEVELOPMENT, so inbound
|
|
2
|
+
// Telegram messages, the cron tick and the filesystem sync watcher run in dev too. `next dev` on its
|
|
3
|
+
// own starts only the web server — without the worker the Telegram bot is never polled (you send a
|
|
4
|
+
// message and nothing happens). Mirrors scripts/start-all.mjs but for dev (next dev instead of next
|
|
5
|
+
// start, with a longer worker warm-up since next dev compiles on first request).
|
|
6
|
+
//
|
|
7
|
+
// Run it with `npm run dev:all`. Dependency-free: spawns both as child processes, forwards their
|
|
8
|
+
// output, and shuts both down together when either dies or on Ctrl-C.
|
|
9
|
+
import { spawn } from "node:child_process";
|
|
10
|
+
|
|
11
|
+
// Running from source = DEVELOPER mode (run-mode picker + Config chips), same as start-all.
|
|
12
|
+
if (!process.env.CONSTELLA_PUBLIC) process.env.CONSTELLA_DEV = "1";
|
|
13
|
+
|
|
14
|
+
const procs = [];
|
|
15
|
+
let shuttingDown = false;
|
|
16
|
+
|
|
17
|
+
function shutdown(code) {
|
|
18
|
+
if (shuttingDown) return;
|
|
19
|
+
shuttingDown = true;
|
|
20
|
+
for (const { p } of procs) { try { p.kill(); } catch { /* already gone */ } }
|
|
21
|
+
process.exit(code);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function run(name, args, extraEnv) {
|
|
25
|
+
const p = spawn(process.execPath, args, {
|
|
26
|
+
stdio: ["ignore", "inherit", "inherit"],
|
|
27
|
+
env: { ...process.env, ...extraEnv },
|
|
28
|
+
});
|
|
29
|
+
p.on("exit", (code) => {
|
|
30
|
+
console.log(`[${name}] exited (${code}) — shutting down the other process too.`);
|
|
31
|
+
shutdown(code ?? 1);
|
|
32
|
+
});
|
|
33
|
+
p.on("error", (e) => { console.error(`[${name}] failed to start:`, e.message); shutdown(1); });
|
|
34
|
+
procs.push({ name, p });
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
process.on("SIGINT", () => shutdown(0));
|
|
38
|
+
process.on("SIGTERM", () => shutdown(0));
|
|
39
|
+
|
|
40
|
+
console.log("Constella (dev) → next dev + worker (Telegram poll · cron tick · file watcher).");
|
|
41
|
+
// Web (dev) first — next dev loads .env on its own.
|
|
42
|
+
run("web", ["node_modules/next/dist/bin/next", "dev"]);
|
|
43
|
+
// Worker after a longer warm-up than start-all (next dev binds + compiles lazily). Plain Node needs
|
|
44
|
+
// --env-file to read .env; the worker self-retries until the dev server answers, so the delay is just
|
|
45
|
+
// to avoid a burst of "connection refused" logs on the very first ticks.
|
|
46
|
+
setTimeout(() => run("worker", ["--env-file=.env", "bin/worker.mjs"]), 4000);
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* i18n parity guard. The `en` dict is the source of truth; `pt` is the runtime layer.
|
|
4
|
+
* A missing `pt` key silently falls back to English (i18n.ts: `pt[key] ?? en[key] ?? key`),
|
|
5
|
+
* so drift is invisible at runtime. This check fails CI when the two dicts diverge.
|
|
6
|
+
*
|
|
7
|
+
* Dependency-free on purpose: it parses src/lib/i18n.ts as text (the dicts are module-local
|
|
8
|
+
* `const`s, not exported), so it runs under plain `node` with no build step.
|
|
9
|
+
*
|
|
10
|
+
* Usage: node scripts/i18n-parity.mjs (wired as `pnpm parity` / part of `pnpm validate`)
|
|
11
|
+
*/
|
|
12
|
+
import { readFileSync } from "node:fs";
|
|
13
|
+
import { fileURLToPath } from "node:url";
|
|
14
|
+
import { dirname, join } from "node:path";
|
|
15
|
+
|
|
16
|
+
const root = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
17
|
+
const src = readFileSync(join(root, "src/lib/i18n.ts"), "utf8");
|
|
18
|
+
|
|
19
|
+
/** Slice the body of a `const <name>: Dict = { ... };` block and return its quoted keys. */
|
|
20
|
+
function keysOf(name, endMarker) {
|
|
21
|
+
const start = src.indexOf(`const ${name}: Dict = {`);
|
|
22
|
+
if (start === -1) throw new Error(`Could not find \`const ${name}: Dict = {\` in i18n.ts`);
|
|
23
|
+
const end = src.indexOf(endMarker, start);
|
|
24
|
+
if (end === -1) throw new Error(`Could not find end marker \`${endMarker}\` after \`${name}\``);
|
|
25
|
+
const body = src.slice(start, end);
|
|
26
|
+
const keys = new Set();
|
|
27
|
+
const re = /^\s*"([^"]+)"\s*:/gm; // matches ` "some.key":` — comment lines (// …) never match
|
|
28
|
+
let m;
|
|
29
|
+
while ((m = re.exec(body))) keys.add(m[1]);
|
|
30
|
+
return keys;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const en = keysOf("en", "const pt: Dict = {");
|
|
34
|
+
const pt = keysOf("pt", "const DICTS:");
|
|
35
|
+
|
|
36
|
+
const missingInPt = [...en].filter((k) => !pt.has(k)).sort();
|
|
37
|
+
const extraInPt = [...pt].filter((k) => !en.has(k)).sort();
|
|
38
|
+
|
|
39
|
+
console.log(`i18n parity: en=${en.size} keys, pt=${pt.size} keys`);
|
|
40
|
+
|
|
41
|
+
let failed = false;
|
|
42
|
+
if (missingInPt.length) {
|
|
43
|
+
failed = true;
|
|
44
|
+
console.error(`\n✗ ${missingInPt.length} key(s) in EN but MISSING in PT (would silently fall back to English):`);
|
|
45
|
+
for (const k of missingInPt) console.error(` ${k}`);
|
|
46
|
+
}
|
|
47
|
+
if (extraInPt.length) {
|
|
48
|
+
failed = true;
|
|
49
|
+
console.error(`\n✗ ${extraInPt.length} key(s) in PT but MISSING in EN (orphaned PT key):`);
|
|
50
|
+
for (const k of extraInPt) console.error(` ${k}`);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (failed) {
|
|
54
|
+
console.error(`\nFix: every key must exist in BOTH the en and pt dicts in src/lib/i18n.ts.`);
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
console.log("✓ EN and PT dictionaries are in parity.");
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Constella MCP server — exposes the public REST API (v1) as MCP tools so an AI client
|
|
3
|
+
// (Claude Desktop / Cursor / any MCP host) can drive Constella. Authenticates to Constella with a
|
|
4
|
+
// Personal Access Token. Self-contained: a hand-rolled JSON-RPC-over-stdio MCP server using only
|
|
5
|
+
// Node built-ins + global fetch (Node 18+), so it ships in the compiled distribution with no deps.
|
|
6
|
+
//
|
|
7
|
+
// Configure in an MCP client (env):
|
|
8
|
+
// CONSTELLA_PAT cn_… token from Profile → Personal access tokens (REQUIRED; use a write token
|
|
9
|
+
// to allow approve/execution/new-work, a read token for read-only)
|
|
10
|
+
// CONSTELLA_BASE_URL default http://localhost:3000
|
|
11
|
+
// CONSTELLA_ORG optional orgId (multi-org users) → sent as X-Constella-Org
|
|
12
|
+
//
|
|
13
|
+
// This is the OUTBOUND-to-Constella direction (an AI drives Constella). Constella's own agents
|
|
14
|
+
// consuming EXTERNAL MCPs is the other direction and works via the claude CLI's ~/.claude config.
|
|
15
|
+
|
|
16
|
+
import { createInterface } from "node:readline";
|
|
17
|
+
|
|
18
|
+
const PAT = process.env.CONSTELLA_PAT || "";
|
|
19
|
+
const BASE = (process.env.CONSTELLA_BASE_URL || "http://localhost:3000").replace(/\/+$/, "");
|
|
20
|
+
const ORG = process.env.CONSTELLA_ORG || "";
|
|
21
|
+
const SERVER_INFO = { name: "constella", version: "1.0.0" };
|
|
22
|
+
|
|
23
|
+
// ---- tools: thin maps onto the REST routes. `build(args)` → { method, path, body? }. ----
|
|
24
|
+
const S = (props = {}, required = []) => ({ type: "object", properties: props, required });
|
|
25
|
+
const TOOLS = [
|
|
26
|
+
{ name: "constella_status", description: "Counts of goals, issues, tasks and the plan state.", inputSchema: S(), build: () => ({ method: "GET", path: "/status" }) },
|
|
27
|
+
{ name: "constella_review", description: "A readable summary of the plan, issues, tasks and next steps.", inputSchema: S(), build: () => ({ method: "GET", path: "/review" }) },
|
|
28
|
+
{ name: "constella_goals", description: "List goals.", inputSchema: S(), build: () => ({ method: "GET", path: "/goals" }) },
|
|
29
|
+
{ name: "constella_issues", description: "List issues.", inputSchema: S(), build: () => ({ method: "GET", path: "/issues" }) },
|
|
30
|
+
{ name: "constella_tasks", description: "List tasks.", inputSchema: S(), build: () => ({ method: "GET", path: "/tasks" }) },
|
|
31
|
+
{ name: "constella_specs", description: "List specs.", inputSchema: S(), build: () => ({ method: "GET", path: "/specs" }) },
|
|
32
|
+
{ name: "constella_kb", description: "Ask the Knowledge Base a question.", inputSchema: S({ q: { type: "string", description: "the question" } }, ["q"]), build: (a) => ({ method: "POST", path: "/kb", body: { q: a.q } }) },
|
|
33
|
+
{ name: "constella_approve_plan", description: "Approve the pending plan and queue tasks (write scope).", inputSchema: S(), build: () => ({ method: "POST", path: "/plan/approve" }) },
|
|
34
|
+
{ name: "constella_reject_plan", description: "Send the plan back to the CEO for revision (write scope).", inputSchema: S({ reason: { type: "string", description: "why" } }), build: (a) => ({ method: "POST", path: "/plan/reject", body: { reason: a.reason } }) },
|
|
35
|
+
{ name: "constella_set_execution", description: "Turn 24/7 autonomous execution on or off (write scope).", inputSchema: S({ on: { type: "boolean" } }, ["on"]), build: (a) => ({ method: "POST", path: "/execution", body: { on: a.on !== false } }) },
|
|
36
|
+
{ name: "constella_new_work", description: "Start a new unit of work — the CEO drafts specs/issues for approval (write scope).", inputSchema: S({ brief: { type: "string" }, title: { type: "string" } }, ["brief"]), build: (a) => ({ method: "POST", path: "/work", body: { brief: a.brief, title: a.title } }) },
|
|
37
|
+
{ name: "constella_cancel_goal", description: "Cancel a goal by id (write scope).", inputSchema: S({ id: { type: "string" } }, ["id"]), build: (a) => ({ method: "POST", path: `/goals/${encodeURIComponent(a.id)}/cancel` }) },
|
|
38
|
+
{ name: "constella_archive_goal", description: "Archive a goal by id (write scope).", inputSchema: S({ id: { type: "string" } }, ["id"]), build: (a) => ({ method: "POST", path: `/goals/${encodeURIComponent(a.id)}/archive` }) },
|
|
39
|
+
];
|
|
40
|
+
const TOOL_BY_NAME = new Map(TOOLS.map((t) => [t.name, t]));
|
|
41
|
+
|
|
42
|
+
async function callApi(method, path, body) {
|
|
43
|
+
if (!PAT) return { ok: false, error: "CONSTELLA_PAT is not set" };
|
|
44
|
+
const headers = { authorization: `Bearer ${PAT}` };
|
|
45
|
+
if (ORG) headers["x-constella-org"] = ORG;
|
|
46
|
+
if (body !== undefined) headers["content-type"] = "application/json";
|
|
47
|
+
try {
|
|
48
|
+
const res = await fetch(`${BASE}/api/v1${path}`, { method, headers, body: body !== undefined ? JSON.stringify(body) : undefined, signal: AbortSignal.timeout(30_000) });
|
|
49
|
+
const json = await res.json().catch(() => ({ ok: false, error: `non-JSON response (http ${res.status})` }));
|
|
50
|
+
return json;
|
|
51
|
+
} catch (e) {
|
|
52
|
+
return { ok: false, error: String(e?.message ?? e) };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ---- JSON-RPC over stdio (newline-delimited) ----
|
|
57
|
+
function send(msg) { process.stdout.write(JSON.stringify(msg) + "\n"); }
|
|
58
|
+
function result(id, r) { send({ jsonrpc: "2.0", id, result: r }); }
|
|
59
|
+
function error(id, code, message) { send({ jsonrpc: "2.0", id, error: { code, message } }); }
|
|
60
|
+
|
|
61
|
+
async function handle(msg) {
|
|
62
|
+
const { id, method, params } = msg;
|
|
63
|
+
const isRequest = id !== undefined && id !== null;
|
|
64
|
+
switch (method) {
|
|
65
|
+
case "initialize":
|
|
66
|
+
return result(id, {
|
|
67
|
+
protocolVersion: params?.protocolVersion || "2024-11-05",
|
|
68
|
+
capabilities: { tools: {} },
|
|
69
|
+
serverInfo: SERVER_INFO,
|
|
70
|
+
});
|
|
71
|
+
case "notifications/initialized":
|
|
72
|
+
return; // notification, no reply
|
|
73
|
+
case "ping":
|
|
74
|
+
return result(id, {});
|
|
75
|
+
case "tools/list":
|
|
76
|
+
return result(id, { tools: TOOLS.map((t) => ({ name: t.name, description: t.description, inputSchema: t.inputSchema })) });
|
|
77
|
+
case "tools/call": {
|
|
78
|
+
const tool = TOOL_BY_NAME.get(params?.name);
|
|
79
|
+
if (!tool) return error(id, -32602, `unknown tool: ${params?.name}`);
|
|
80
|
+
const req = tool.build(params?.arguments ?? {});
|
|
81
|
+
const data = await callApi(req.method, req.path, req.body);
|
|
82
|
+
const text = JSON.stringify(data, null, 2);
|
|
83
|
+
return result(id, { content: [{ type: "text", text }], isError: data && data.ok === false });
|
|
84
|
+
}
|
|
85
|
+
default:
|
|
86
|
+
if (isRequest) return error(id, -32601, `method not found: ${method}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const rl = createInterface({ input: process.stdin });
|
|
91
|
+
rl.on("line", (line) => {
|
|
92
|
+
const s = line.trim();
|
|
93
|
+
if (!s) return;
|
|
94
|
+
let msg;
|
|
95
|
+
try { msg = JSON.parse(s); } catch { return; } // ignore non-JSON lines
|
|
96
|
+
Promise.resolve(handle(msg)).catch((e) => {
|
|
97
|
+
if (msg && msg.id !== undefined && msg.id !== null) error(msg.id, -32603, String(e?.message ?? e));
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
rl.on("close", () => process.exit(0));
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// After `next build` with `output: "standalone"`, Next emits a self-contained server at
|
|
2
|
+
// `.next/standalone/server.js` but does NOT copy the client assets (`.next/static`) or
|
|
3
|
+
// `public/` into it. Without this, `node .next/standalone/server.js` serves HTML whose
|
|
4
|
+
// JS/CSS 404 → screens render unstyled / don't hydrate / navigation breaks. Copy them in.
|
|
5
|
+
import { cpSync, existsSync } from "node:fs";
|
|
6
|
+
|
|
7
|
+
const SB = ".next/standalone";
|
|
8
|
+
let copied = [];
|
|
9
|
+
if (existsSync(".next/static")) { cpSync(".next/static", `${SB}/.next/static`, { recursive: true }); copied.push(".next/static"); }
|
|
10
|
+
if (existsSync("public")) { cpSync("public", `${SB}/public`, { recursive: true }); copied.push("public"); }
|
|
11
|
+
console.log(`[postbuild] standalone assets copied: ${copied.join(", ") || "(none found)"}`);
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Push the CLEAN, COMPILED-distribution tree to the PUBLIC repo (`public` remote = gabriel7silva/constella).
|
|
4
|
+
*
|
|
5
|
+
* The public repo ships the *product*, not the source: docs, the launcher (bin/), runtime scripts,
|
|
6
|
+
* the native skills library, config, and the generated DB migrations (drizzle/) — but **NO `src/`**
|
|
7
|
+
* and **no committed build** (the compiled `.next` reaches users through the npm tarball, not git).
|
|
8
|
+
* This script builds that filtered tree in a temporary git index, secret-scans exactly what it will
|
|
9
|
+
* publish, and REFUSES on any finding. It never runs automatically.
|
|
10
|
+
*
|
|
11
|
+
* node scripts/publish-public.mjs # scan only (dry run)
|
|
12
|
+
* node scripts/publish-public.mjs --push # scan, then force-push the clean tree to `public main`
|
|
13
|
+
*/
|
|
14
|
+
import { execSync } from "node:child_process";
|
|
15
|
+
import { readFileSync, statSync, mkdtempSync, existsSync, readdirSync } from "node:fs";
|
|
16
|
+
import { tmpdir } from "node:os";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
|
|
19
|
+
const PUSH = process.argv.includes("--push");
|
|
20
|
+
|
|
21
|
+
// Tracked paths that must NEVER reach the public repo (the whole point: no source, no test config).
|
|
22
|
+
const EXCLUDE = ["src", "playwright.config.ts", "e2e", "tests"];
|
|
23
|
+
|
|
24
|
+
// Mirror of src/server/git-scan.ts — sensitive filenames + high-confidence inline secret patterns.
|
|
25
|
+
const SENSITIVE_FILE = /(^|\/)(\.env(\.[\w.-]+)?|id_[rd]sa\w*|.*\.(pem|key|p12|pfx|keystore|jks|ppk|asc)|credentials?\.json|service[-_]?account[\w.-]*\.json|.*\.(sql|dump|bak|sqlite3?|db)|npm-debug\.log|.*\.local)$/i;
|
|
26
|
+
const ALLOW_FILE = /(\.env\.(example|sample|template|dist)|\.env-example)$/i;
|
|
27
|
+
// Legit source that the SENSITIVE_FILE regex over-matches: Drizzle migrations are DDL, not DB dumps.
|
|
28
|
+
const ALLOW_PATH = /^drizzle\/.*\.sql$/i;
|
|
29
|
+
// Obvious placeholder credentials in doc/example connection strings — not real secrets.
|
|
30
|
+
const PLACEHOLDER = /^(user|username|admin|root|pass|password|pwd|secret|example|changeme|x{3,}|your|host|localhost|db|name|app|<)/i;
|
|
31
|
+
const SECRETS = [
|
|
32
|
+
["AWS access key", /\bAKIA[0-9A-Z]{16}\b/],
|
|
33
|
+
["GitHub token", /\bgh[posru]_[A-Za-z0-9]{30,}\b/],
|
|
34
|
+
["GitHub fine-grained PAT", /\bgithub_pat_[A-Za-z0-9_]{40,}\b/],
|
|
35
|
+
["OpenAI/Anthropic key", /\bsk-[A-Za-z0-9_-]{20,}\b/],
|
|
36
|
+
["Google API key", /\bAIza[0-9A-Za-z_-]{30,}\b/],
|
|
37
|
+
["Slack token", /\bxox[baprs]-[A-Za-z0-9-]{10,}\b/],
|
|
38
|
+
["Private key block", /-----BEGIN (?:RSA |EC |OPENSSH |DSA |PGP )?PRIVATE KEY-----/],
|
|
39
|
+
["JWT", /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{6,}\b/],
|
|
40
|
+
// DB URL with creds — only flag when the user:pass aren't obvious placeholders.
|
|
41
|
+
["DB URL with creds", /\b(?:postgres(?:ql)?|mysql|mongodb(?:\+srv)?|redis|amqp):\/\/([^\s:@/]+):([^\s:@/]+)@/, (m) => !PLACEHOLDER.test(m[1]) && !PLACEHOLDER.test(m[2])],
|
|
42
|
+
["Telegram bot token", /\b\d{6,}:[A-Za-z0-9_-]{35,}\b/],
|
|
43
|
+
];
|
|
44
|
+
const TEXT = /\.(m?[jt]sx?|json|md|css|ya?ml|toml|sh|env|txt|html?)$/i;
|
|
45
|
+
|
|
46
|
+
const isExcluded = (f) => EXCLUDE.some((p) => f === p || f.startsWith(p + "/"));
|
|
47
|
+
|
|
48
|
+
// 1) Ensure the generated migrations exist (the public repo ships them; they build a fresh end-user
|
|
49
|
+
// DB via `drizzle-kit migrate`). Generated from src/db/schema.ts, which exists in this dev tree.
|
|
50
|
+
if (!existsSync("drizzle") || readdirSync("drizzle").filter((f) => f.endsWith(".sql")).length === 0) {
|
|
51
|
+
console.log("• Generating DB migrations (drizzle/) from the schema…");
|
|
52
|
+
execSync("npx drizzle-kit generate --config drizzle.config.mjs", { stdio: "inherit" });
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// 2) Compute exactly the file list that will be published: tracked files minus EXCLUDE, plus the
|
|
56
|
+
// on-disk drizzle/ migrations (gitignored in this dev repo, force-added to the public tree).
|
|
57
|
+
const tracked = execSync("git ls-files", { encoding: "utf8" }).split("\n").map((s) => s.trim()).filter(Boolean);
|
|
58
|
+
// drizzle/ is gitignored in the dev repo, so list it straight off disk (cross-platform fs walk) — these
|
|
59
|
+
// generated migrations are force-added into the public tree below.
|
|
60
|
+
function walkDir(dir) {
|
|
61
|
+
const out = [];
|
|
62
|
+
for (const e of readdirSync(dir, { withFileTypes: true })) {
|
|
63
|
+
const p = `${dir}/${e.name}`;
|
|
64
|
+
if (e.isDirectory()) out.push(...walkDir(p));
|
|
65
|
+
else out.push(p);
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
const drizzleFiles = existsSync("drizzle") ? walkDir("drizzle") : [];
|
|
70
|
+
const publishFiles = [...new Set([...tracked.filter((f) => !isExcluded(f)), ...drizzleFiles])];
|
|
71
|
+
|
|
72
|
+
// 3) Secret-scan exactly that set.
|
|
73
|
+
const findings = [];
|
|
74
|
+
for (const f of publishFiles) {
|
|
75
|
+
if (SENSITIVE_FILE.test(f) && !ALLOW_FILE.test(f) && !ALLOW_PATH.test(f)) { findings.push(`${f}: sensitive file`); continue; }
|
|
76
|
+
if (!TEXT.test(f)) continue;
|
|
77
|
+
let body;
|
|
78
|
+
try { if (statSync(f).size > 512 * 1024) continue; body = readFileSync(f, "utf8"); } catch { continue; }
|
|
79
|
+
for (const [name, re, valid] of SECRETS) {
|
|
80
|
+
const m = body.match(re);
|
|
81
|
+
if (m && (!valid || valid(m))) { findings.push(`${f}: ${name}`); break; }
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Belt-and-suspenders: make sure no src/ slipped into the publish set.
|
|
85
|
+
const leaked = publishFiles.filter((f) => f === "src" || f.startsWith("src/"));
|
|
86
|
+
if (leaked.length) findings.push(`src/ leaked into the public tree (${leaked.length} file(s)) — aborting`);
|
|
87
|
+
|
|
88
|
+
if (findings.length) {
|
|
89
|
+
console.error(`\n✖ Refusing to publish — ${findings.length} potential secret/sensitive/source finding(s):`);
|
|
90
|
+
for (const x of findings.slice(0, 30)) console.error(" - " + x);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
console.log(`✓ Clean: ${publishFiles.length} files to publish (no src/, no secrets). Migrations: ${publishFiles.filter((f) => f.startsWith("drizzle/")).length} file(s).`);
|
|
94
|
+
|
|
95
|
+
if (!PUSH) {
|
|
96
|
+
console.log("\nDry run. To publish the clean compiled tree to the public repo, run:");
|
|
97
|
+
console.log(" node scripts/publish-public.mjs --push");
|
|
98
|
+
process.exit(0);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// 4) Build the filtered tree in a TEMP git index (HEAD minus EXCLUDE, plus drizzle/), then push it
|
|
102
|
+
// as a fresh root commit. Force-push = the public repo is a clean mirror, not a shared history.
|
|
103
|
+
console.log("\nStaging the clean public tree…");
|
|
104
|
+
const TMP_INDEX = join(mkdtempSync(join(tmpdir(), "constella-public-")), "index");
|
|
105
|
+
const env = { ...process.env, GIT_INDEX_FILE: TMP_INDEX, GIT_TERMINAL_PROMPT: "0" };
|
|
106
|
+
execSync("git read-tree HEAD", { env, stdio: "inherit" });
|
|
107
|
+
for (const p of EXCLUDE) execSync(`git rm -r --cached --ignore-unmatch -- "${p}"`, { env, stdio: "ignore" });
|
|
108
|
+
if (existsSync("drizzle")) execSync("git add -f -- drizzle", { env, stdio: "inherit" });
|
|
109
|
+
const tree = execSync("git write-tree", { env }).toString().trim();
|
|
110
|
+
const commit = execSync(`git commit-tree ${tree} -m "Constella — compiled distribution (docs, launcher, migrations; no source)"`, { env }).toString().trim();
|
|
111
|
+
|
|
112
|
+
console.log(`Pushing clean tree (${commit.slice(0, 9)}) to \`public\` (gabriel7silva/constella)…`);
|
|
113
|
+
// Fully-qualify the destination ref: pushing a bare commit object to `main` fails on an empty remote
|
|
114
|
+
// (git can't guess the ref). `refs/heads/main` creates/overwrites the branch deterministically.
|
|
115
|
+
execSync(`git push -f public ${commit}:refs/heads/main`, { stdio: "inherit", env });
|
|
116
|
+
console.log("✓ Pushed. The npm tarball (with the prebuilt .next) is published separately via `npm publish`.");
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Launches the web server (next start) AND the background worker together, so a single
|
|
2
|
+
// `pnpm start` runs everything. The worker hosts the Telegram bot poll, cron tick, and the
|
|
3
|
+
// filesystem sync watcher — without it, inbound Telegram messages are never fetched. Keeping
|
|
4
|
+
// them in one command means the operator can't forget to start the worker separately.
|
|
5
|
+
//
|
|
6
|
+
// Dependency-free (no `concurrently`): spawns both as child processes, forwards their output,
|
|
7
|
+
// and shuts both down together when either dies or on Ctrl-C.
|
|
8
|
+
import { spawn } from "node:child_process";
|
|
9
|
+
|
|
10
|
+
// Running from source via `pnpm start` is DEVELOPER mode — show the run-mode picker + Config chips.
|
|
11
|
+
// (The published `constella` CLI sets CONSTELLA_PUBLIC=1 instead, which hides them.)
|
|
12
|
+
if (!process.env.CONSTELLA_PUBLIC) process.env.CONSTELLA_DEV = "1";
|
|
13
|
+
|
|
14
|
+
const procs = [];
|
|
15
|
+
let shuttingDown = false;
|
|
16
|
+
|
|
17
|
+
function shutdown(code) {
|
|
18
|
+
if (shuttingDown) return;
|
|
19
|
+
shuttingDown = true;
|
|
20
|
+
for (const { p } of procs) { try { p.kill(); } catch { /* already gone */ } }
|
|
21
|
+
process.exit(code);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function run(name, args, extraEnv) {
|
|
25
|
+
const p = spawn(process.execPath, args, {
|
|
26
|
+
stdio: ["ignore", "inherit", "inherit"],
|
|
27
|
+
env: { ...process.env, ...extraEnv },
|
|
28
|
+
});
|
|
29
|
+
p.on("exit", (code) => {
|
|
30
|
+
console.log(`[${name}] exited (${code}) — shutting down the other process too.`);
|
|
31
|
+
shutdown(code ?? 1);
|
|
32
|
+
});
|
|
33
|
+
p.on("error", (e) => { console.error(`[${name}] failed to start:`, e.message); shutdown(1); });
|
|
34
|
+
procs.push({ name, p });
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
process.on("SIGINT", () => shutdown(0));
|
|
38
|
+
process.on("SIGTERM", () => shutdown(0));
|
|
39
|
+
|
|
40
|
+
console.log("Constella → starting web server + worker (single command).");
|
|
41
|
+
// Web server first. `next start` loads .env on its own.
|
|
42
|
+
run("web", ["node_modules/next/dist/bin/next", "start"]);
|
|
43
|
+
// Worker shortly after so the server is usually up first (the worker also self-retries if not).
|
|
44
|
+
// Plain Node needs --env-file to read .env (next does it internally).
|
|
45
|
+
setTimeout(() => run("worker", ["--env-file=.env", "bin/worker.mjs"]), 1500);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Runs on `prepack` (npm pack / npm publish): strip the parts of `.next` that `next start` does NOT
|
|
2
|
+
// need, so the published tarball ships only the production runtime. The dev-server artifacts
|
|
3
|
+
// (.next/dev — turbopack output + a multi-GB development log), the build cache, and trace files are
|
|
4
|
+
// regenerated locally by `next dev`/`next build` and must never travel to end users.
|
|
5
|
+
//
|
|
6
|
+
// npm's `files` allowlist re-includes the whole `.next` dir and overrides nested .npmignore rules, so
|
|
7
|
+
// deleting these on disk before packing is the reliable way to keep the package small + clean.
|
|
8
|
+
import { rmSync, existsSync } from "node:fs";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
|
|
11
|
+
const NEXT = join(process.cwd(), ".next");
|
|
12
|
+
if (!existsSync(NEXT)) {
|
|
13
|
+
console.error("• trim-next: no .next/ — nothing to trim (skipping).");
|
|
14
|
+
process.exit(0);
|
|
15
|
+
}
|
|
16
|
+
for (const sub of ["dev", "cache", "trace"]) {
|
|
17
|
+
const p = join(NEXT, sub);
|
|
18
|
+
if (existsSync(p)) {
|
|
19
|
+
rmSync(p, { recursive: true, force: true });
|
|
20
|
+
console.error(`• trim-next: removed .next/${sub}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
console.error("• trim-next: .next trimmed to the production runtime.");
|