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,303 @@
|
|
|
1
|
+
[← Docs index](./README.md) · [🇧🇷 Português](../pt/GOALS_SPECS_ISSUES.md) · [✦ Constella](../../README.md)
|
|
2
|
+
|
|
3
|
+
# Goals, Specs, Issues, Plans — The Work Constellation 🌌🪐
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
The data model and state machines behind every unit of work. A **Goal** is an orbit; **Specs** are its charts; **Issues** are the manoeuvres; **Tasks** are the burns the engine actually fires; the **Plan** is the launch gate the operator opens. This page documents the real tables, columns, status enums and the transitions between them.
|
|
8
|
+
|
|
9
|
+
## Short description
|
|
10
|
+
|
|
11
|
+
Constella turns a brief into a structured, state-aware delivery pipeline: `Goal → Spec → Issue → Plan → Execution → Review → Test → Done`. The CEO agent (Ada) drafts specs and issues; the operator approves the plan; approved issues are *materialized* into executable tasks the runner picks up. Cancelling or archiving a goal cascades to its children so nothing settled keeps reading as pending.
|
|
12
|
+
|
|
13
|
+
## When to use
|
|
14
|
+
|
|
15
|
+
- You want to understand **what each entity is**, what columns it has and how rows relate.
|
|
16
|
+
- You need the exact **status enums** and **kanban columns** for `goal`, `spec`, `issue`, `task` and `plan`.
|
|
17
|
+
- You're debugging why a cancelled goal still shows pending work, or why a re-approved plan only created *some* tasks.
|
|
18
|
+
- You want to know what the **SUPER-SPEC** is and when it is written.
|
|
19
|
+
|
|
20
|
+
## How it works 🛰️
|
|
21
|
+
|
|
22
|
+
Every entity is a row in the SQLite database (`src/db/schema.ts`), scoped to a `workspaceId` (one workspace per organization). The directory on disk is the source of truth for the human-readable artifacts (`specs/*.md`, `issues/*.md`, `specs/SUPER-SPEC.md`); the tables index them and carry the lifecycle state.
|
|
23
|
+
|
|
24
|
+
The pipeline is driven by three modules:
|
|
25
|
+
|
|
26
|
+
| Module | File | Responsibility |
|
|
27
|
+
| --- | --- | --- |
|
|
28
|
+
| Planner | `src/server/planner-core.ts` | `generatePlanFor` / `runPlanJob` / `planFromConversationFor` — the CEO drafts the Goal + specs + issues |
|
|
29
|
+
| Plan ops | `src/server/plan-ops.ts` | `approvePlanFor` / `requestPlanChangesFor` / `setAuto247For` — the approval gate |
|
|
30
|
+
| Work ops | `src/server/work-ops.ts` | `cancelGoalFor` / `archiveGoalFor` + cascade helpers — goal lifecycle |
|
|
31
|
+
| Materialize | `src/server/materialize.ts` | `materializeTasks` — turn approved issues into executable `task` rows |
|
|
32
|
+
|
|
33
|
+
All four are `server-only` cores keyed by an explicit `(orgId, workspaceId)`, so they can be called from a session action **or** from the channels with no session (the Telegram remote control, the public API).
|
|
34
|
+
|
|
35
|
+
## Main flow 🌠
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
brief / DM "@ada build X"
|
|
39
|
+
└─ generatePlanFor → runPlanJob (Ada, detached, "planner" channel)
|
|
40
|
+
├─ (first plan, existing project) analyzeExistingProject → specs/SUPER-SPEC.md
|
|
41
|
+
├─ insert goal (from the MAIN/first spec)
|
|
42
|
+
├─ insert spec rows + write specs/SPEC-NN.md
|
|
43
|
+
├─ insert issue rows + write issues/<key>.md (col=todo, approved=false)
|
|
44
|
+
└─ push Inbox "Approve plan"
|
|
45
|
+
└─ operator approves → approvePlanFor
|
|
46
|
+
├─ plan.approved=true, stage=6
|
|
47
|
+
├─ issue.approved=true, spec.approved=true (active specs)
|
|
48
|
+
├─ materializeTasks → one task per issue (idempotent)
|
|
49
|
+
└─ groom PO backlog
|
|
50
|
+
└─ Run 24/7 (plan.auto247=true) → runner pulls tasks → Review → Test → Done
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Key concepts 🕳️
|
|
54
|
+
|
|
55
|
+
- **The Goal is born from the MAIN spec.** `runPlanJob` treats the first spec in the model's output as the main spec; the `goal.specId` points at it, and every drafted spec/issue gets the goal's id (`goalId`).
|
|
56
|
+
- **Lifecycle is independent of the workflow column.** `spec.status` / `issue.status` (`active | cancelled | archived`) are *separate* from `issue.col` (the kanban lane). Cancelling a goal flips the children's `status`, never their `col`, so the board history survives.
|
|
57
|
+
- **`approved` is a boolean, not a status.** A spec or issue can be `approved=true` while still `active`. The approval gate lives on the singleton `plan` row.
|
|
58
|
+
- **Tasks are the only thing the runner executes.** Issues are plans; tasks are work. `materializeTasks` bridges them and is idempotent via `task.issueId`.
|
|
59
|
+
- **Disk is the source of truth.** Spec/issue keys are renumbered to *continue* from existing ones so a second "New work" plan never overwrites `specs/SPEC-01.md` on disk.
|
|
60
|
+
|
|
61
|
+
## Tables 🪐
|
|
62
|
+
|
|
63
|
+
### `goal` — a unit of work (an orbit)
|
|
64
|
+
|
|
65
|
+
| Column | Type | Notes |
|
|
66
|
+
| --- | --- | --- |
|
|
67
|
+
| `id` | text PK | |
|
|
68
|
+
| `workspaceId` | text FK → workspace | indexed `goal_ws_idx` |
|
|
69
|
+
| `title` / `description` | text | |
|
|
70
|
+
| `ownerId` | text FK → agent | usually Ada (the CEO) |
|
|
71
|
+
| `progress` | int | cached rollup 0–100, recomputed by the runner |
|
|
72
|
+
| `parentId` | text | optional parent goal |
|
|
73
|
+
| `status` | enum | `active \| cancelled \| archived \| done` (default `active`) |
|
|
74
|
+
| `specId` | text | the **main** spec this goal was born from |
|
|
75
|
+
| `archivePath` | text | ZIP path when archived |
|
|
76
|
+
| `createdAt` / `updatedAt` / `doneAt` / `cancelledAt` / `archivedAt` / `reopenedAt` | timestamp | nullable lifecycle stamps |
|
|
77
|
+
|
|
78
|
+
Provenance is tracked in `goal_file` (PK `goalId + path`, `op = created | edit`) so an archive ZIP can include *only* the files this goal produced.
|
|
79
|
+
|
|
80
|
+
### `spec` — a chart
|
|
81
|
+
|
|
82
|
+
| Column | Type | Notes |
|
|
83
|
+
| --- | --- | --- |
|
|
84
|
+
| `id` | text PK | |
|
|
85
|
+
| `workspaceId` | text FK | |
|
|
86
|
+
| `key` | text | e.g. `SPEC-01` (renumbered to continue from existing) |
|
|
87
|
+
| `title` / `summary` / `body` | text | |
|
|
88
|
+
| `authorId` | text FK → agent | the role the CEO assigned as author |
|
|
89
|
+
| `approved` | bool | default `false` |
|
|
90
|
+
| `goalId` | text | parent goal |
|
|
91
|
+
| `status` | enum | `active \| cancelled \| archived` (default `active`) |
|
|
92
|
+
| `createdAt` / `updatedAt` | timestamp | |
|
|
93
|
+
|
|
94
|
+
### `issue` — a manoeuvre
|
|
95
|
+
|
|
96
|
+
| Column | Type | Notes |
|
|
97
|
+
| --- | --- | --- |
|
|
98
|
+
| `id` | text PK | |
|
|
99
|
+
| `workspaceId` | text FK | |
|
|
100
|
+
| `specId` | text FK → spec | `onDelete: cascade` |
|
|
101
|
+
| `goalId` | text | parent goal |
|
|
102
|
+
| `key` | text | sequential, continuing from existing issues |
|
|
103
|
+
| `title` | text | |
|
|
104
|
+
| `prio` | enum | `low \| med \| high` (default `med`) |
|
|
105
|
+
| `col` | enum | `todo \| doing \| blocked \| review \| done` (kanban lane, default `todo`) |
|
|
106
|
+
| `moscow` | enum | `Must \| Should \| Could \| Won't` (derived from `prio`) |
|
|
107
|
+
| `points` | int | story points (derived: high→8, med→5, low→3) |
|
|
108
|
+
| `assigneeId` | text FK → agent | the role the CEO assigned |
|
|
109
|
+
| `approved` | bool | default `false` |
|
|
110
|
+
| `status` | enum | `active \| cancelled \| archived` (default `active`) |
|
|
111
|
+
| `createdAt` / `updatedAt` | timestamp | |
|
|
112
|
+
|
|
113
|
+
### `task` — an engine burn (the executable unit)
|
|
114
|
+
|
|
115
|
+
| Column | Type | Notes |
|
|
116
|
+
| --- | --- | --- |
|
|
117
|
+
| `id` | text PK | |
|
|
118
|
+
| `workspaceId` | text FK | |
|
|
119
|
+
| `key` / `title` / `description` | text | |
|
|
120
|
+
| `col` | enum | `triage \| todo \| doing \| blocked \| review \| done` (default `triage`) |
|
|
121
|
+
| `prio` | enum | `low \| med \| high` |
|
|
122
|
+
| `assigneeId` | text FK → agent | |
|
|
123
|
+
| `goalId` | text FK → goal | |
|
|
124
|
+
| `issueId` | text FK → issue | the issue it was materialized from (idempotency key) |
|
|
125
|
+
| `createdBy` | enum | `operator \| agent` |
|
|
126
|
+
| `createdAt` / `updatedAt` | timestamp | |
|
|
127
|
+
|
|
128
|
+
Sub-steps live in `task_step` (`text`, `done`, `active`, `ord`) — seeded from the issue's `## Checklist` and the basis for live progress.
|
|
129
|
+
|
|
130
|
+
### `plan` — the launch gate (one row per workspace)
|
|
131
|
+
|
|
132
|
+
| Column | Type | Notes |
|
|
133
|
+
| --- | --- | --- |
|
|
134
|
+
| `workspaceId` | text **PK** | one plan per workspace |
|
|
135
|
+
| `approved` | bool | default `false` |
|
|
136
|
+
| `auto247` | bool | 24/7 autonomous execution toggle |
|
|
137
|
+
| `stage` | int | pipeline stage marker (default `4`) |
|
|
138
|
+
| `createdAt` / `updatedAt` | timestamp | |
|
|
139
|
+
|
|
140
|
+
Note the difference in cardinality: there is exactly **one** `plan` row per workspace (PK is `workspaceId`), but **many** goals/specs/issues/tasks.
|
|
141
|
+
|
|
142
|
+
## Entity relationships diagram
|
|
143
|
+
|
|
144
|
+
```mermaid
|
|
145
|
+
erDiagram
|
|
146
|
+
WORKSPACE ||--|| PLAN : "has one (gate)"
|
|
147
|
+
WORKSPACE ||--o{ GOAL : contains
|
|
148
|
+
GOAL ||--o{ SPEC : "parent of"
|
|
149
|
+
GOAL ||--o{ ISSUE : "parent of"
|
|
150
|
+
GOAL ||--o{ GOAL_FILE : "provenance"
|
|
151
|
+
SPEC ||--o{ ISSUE : "groups (cascade delete)"
|
|
152
|
+
ISSUE ||--o| TASK : "materialized into"
|
|
153
|
+
TASK ||--o{ TASK_STEP : "checklist"
|
|
154
|
+
GOAL ||--o| SPEC : "born from (specId)"
|
|
155
|
+
AGENT ||--o{ GOAL : owns
|
|
156
|
+
AGENT ||--o{ SPEC : authors
|
|
157
|
+
AGENT ||--o{ ISSUE : assigned
|
|
158
|
+
AGENT ||--o{ TASK : assigned
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Status transitions 🌠
|
|
162
|
+
|
|
163
|
+
### Goal state machine
|
|
164
|
+
|
|
165
|
+
```mermaid
|
|
166
|
+
stateDiagram-v2
|
|
167
|
+
[*] --> active : runPlanJob inserts goal
|
|
168
|
+
active --> done : all issues 100% (auto-complete, sticky)
|
|
169
|
+
active --> cancelled : cancelGoalFor
|
|
170
|
+
active --> archived : archiveGoalFor (ZIP)
|
|
171
|
+
cancelled --> active : reopenGoal
|
|
172
|
+
archived --> active : restoreGoal (re-extract ZIP)
|
|
173
|
+
done --> [*]
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
`progress` and `status` drift **only while active**. Once a goal settles (`done`/`cancelled`/`archived`) its `%` is sticky — a later blocked or added issue can't make a "Done" goal read 62%. Auto-completion is compare-and-set: only the first writer that still sees the goal `active` stamps `done` + `doneAt` (`src/server/progress.ts`).
|
|
177
|
+
|
|
178
|
+
### Spec / Issue lifecycle (status) — cascades from the parent goal
|
|
179
|
+
|
|
180
|
+
```mermaid
|
|
181
|
+
stateDiagram-v2
|
|
182
|
+
[*] --> active
|
|
183
|
+
active --> cancelled : goal cancelled (setGoalChildrenStatus)
|
|
184
|
+
active --> archived : goal archived
|
|
185
|
+
cancelled --> active : goal reopened
|
|
186
|
+
archived --> active : goal restored
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Issue / Task kanban column (workflow, independent of status)
|
|
190
|
+
|
|
191
|
+
```mermaid
|
|
192
|
+
stateDiagram-v2
|
|
193
|
+
[*] --> triage : task default
|
|
194
|
+
triage --> todo
|
|
195
|
+
todo --> doing : runner claims
|
|
196
|
+
doing --> review : work done
|
|
197
|
+
doing --> blocked : parkGoalTasks / agent stuck
|
|
198
|
+
blocked --> todo : unparkGoalTasks
|
|
199
|
+
review --> done : QA sign-off
|
|
200
|
+
done --> [*]
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
> Issues use the columns `todo · doing · blocked · review · done`. Tasks add a leading `triage` lane.
|
|
204
|
+
|
|
205
|
+
### Plan gate
|
|
206
|
+
|
|
207
|
+
```mermaid
|
|
208
|
+
stateDiagram-v2
|
|
209
|
+
[*] --> draft : runPlanJob (approved=false, stage=4)
|
|
210
|
+
draft --> approved : approvePlanFor (approved=true, stage=6)
|
|
211
|
+
approved --> draft : requestPlanChangesFor (approved=false, auto247=false, stage=1)
|
|
212
|
+
approved --> running247 : setAuto247For(true)
|
|
213
|
+
running247 --> approved : setAuto247For(false)
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Step-by-step 🚀
|
|
217
|
+
|
|
218
|
+
1. **A brief arrives** — the standing workspace brief (`.claude/BRIEF.md`), a DM to `@ada`, or `/new-work` / `/new-goal`.
|
|
219
|
+
2. **`generatePlanFor`** marks Ada `working` and kicks off `runPlanJob` detached on the persistent node server (streams to the `planner` channel).
|
|
220
|
+
3. **First-plan analysis** (only when an existing project is present and not yet analyzed): `analyzeExistingProject` reads the project file-by-file and writes `specs/SUPER-SPEC.md`, then flags `settings.source.analyzed = true`.
|
|
221
|
+
4. **Ada drafts** a single JSON object of `specs[]` + `issues[]`. The first spec is the **main** spec.
|
|
222
|
+
5. **Persist** — insert the `goal` (title from `opts.goalTitle` / main spec / objective), then specs (keys renumbered to continue), then issues (`col=todo`, `points`/`moscow` derived from `prio`). Write `specs/SPEC-NN.md` and `issues/<key>.md` to disk.
|
|
223
|
+
6. **Inbox + Telegram** — an `approval` inbox item (`refType=plan`) is pushed; if Telegram is configured, the plan is sent to the phone with Approve / Start execution / Review / Reject buttons.
|
|
224
|
+
7. **Operator approves** (`approvePlanFor`): `plan.approved=true, stage=6`, issues + active specs flip `approved=true`, `materializeTasks` creates one task per un-materialized issue, and the PO backlog (`PO/backlog.md`) is groomed.
|
|
225
|
+
8. **Run 24/7** (`setAuto247For(true)`) — the runner pulls `todo` tasks, advances them through `doing → review → done`, mirrors progress back onto issues and goals.
|
|
226
|
+
9. **Cancel / archive** when needed — `cancelGoalFor` / `archiveGoalFor` stop everything and cascade the children's status.
|
|
227
|
+
|
|
228
|
+
## Examples
|
|
229
|
+
|
|
230
|
+
**New work from a DM** (handled by `planFromConversationFor` → `generatePlanFor`):
|
|
231
|
+
|
|
232
|
+
```
|
|
233
|
+
@ada build a billing dashboard with Stripe and a CSV export
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
**Approve from a slash command** ([CHAT_COMMANDS](./CHAT_COMMANDS.md)):
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
/approve # approvePlanFor: approve plan/specs/issues + materialize tasks
|
|
240
|
+
/run-247 # setAuto247For(true)
|
|
241
|
+
/reject <reason> # requestPlanChangesFor — back to Ada, stage rewinds to 1
|
|
242
|
+
/cancel # cancelGoalFor — stop + park, reopen later
|
|
243
|
+
/archive # archiveGoalFor — ZIP the goal's source + manifest
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
**Issue → task materialization** (`materializeTasks`, idempotent): re-approving after a re-plan creates tasks **only** for issues without a `task.issueId`, so existing work is never duplicated.
|
|
247
|
+
|
|
248
|
+
## Possible states
|
|
249
|
+
|
|
250
|
+
| Entity | Field | Values |
|
|
251
|
+
| --- | --- | --- |
|
|
252
|
+
| goal | `status` | `active`, `cancelled`, `archived`, `done` |
|
|
253
|
+
| spec | `status` | `active`, `cancelled`, `archived` |
|
|
254
|
+
| spec | `approved` | `true`, `false` |
|
|
255
|
+
| issue | `status` | `active`, `cancelled`, `archived` |
|
|
256
|
+
| issue | `col` | `todo`, `doing`, `blocked`, `review`, `done` |
|
|
257
|
+
| issue | `approved` | `true`, `false` |
|
|
258
|
+
| issue | `moscow` | `Must`, `Should`, `Could`, `Won't` |
|
|
259
|
+
| task | `col` | `triage`, `todo`, `doing`, `blocked`, `review`, `done` |
|
|
260
|
+
| plan | `approved` / `auto247` | `true`, `false` |
|
|
261
|
+
|
|
262
|
+
## The SUPER-SPEC 🌌
|
|
263
|
+
|
|
264
|
+
When onboarding imports an existing project (a GitHub repo, a copied local directory, or an attached `mock/`), the **first** plan run does not draft blindly. `analyzeExistingProject` (`src/server/analyze.ts`) runs a real agent pass with the workspace as `cwd`, reads docs → manifests → source file-by-file, and writes `specs/SUPER-SPEC.md` with sections such as *Overview & purpose, Architecture & layers, Tech stack & dependencies, Directory / module map, Frontend, Backend, Data model & database, Auth & security, Integrations, Business rules & key flows, What is mock/stubbed vs real, Gaps to make it production-real*.
|
|
265
|
+
|
|
266
|
+
The plan then reads the SUPER-SPEC in full and **extends** the existing system — it never scaffolds a second separate prototype. The analysis runs once per project (`settings.source.analyzed`).
|
|
267
|
+
|
|
268
|
+
## Related integrations
|
|
269
|
+
|
|
270
|
+
- **PO grooming** — on approve, every issue is copied into `backlog_item` (MoSCoW + points) and `PO/backlog.md` is rewritten. See [PO_AGENT](./PO_AGENT.md).
|
|
271
|
+
- **Inbox** — the plan-approval decision surfaces as an actionable item (`refType=plan`). See [INBOX](./INBOX.md).
|
|
272
|
+
- **Decisions log** — approve/cancel/archive each append a `decision` row. See [TEAM_ROOM](./TEAM_ROOM.md).
|
|
273
|
+
- **Telegram remote** — the same session-less cores power `/approve`, `/cancel`, etc. from the phone. See [TELEGRAM](./TELEGRAM.md).
|
|
274
|
+
- **Runner / execution** — tasks flow through review and test. See [WORKFLOW](./WORKFLOW.md), [TEST_DEV](./TEST_DEV.md).
|
|
275
|
+
|
|
276
|
+
## Security 🔒
|
|
277
|
+
|
|
278
|
+
- All lifecycle cores are `server-only` and keyed by an explicit `(orgId, workspaceId)` — **never** exposed as unauthenticated RPC endpoints. Every caller (session action, Telegram allowlist, public API PAT) must already be authorized for the workspace.
|
|
279
|
+
- `ownGoal(wsId, goalId)` verifies the goal belongs to the workspace before any mutation.
|
|
280
|
+
- Archive/restore ZIP extraction normalizes paths and refuses to write outside the workspace root (`abs !== root && !abs.startsWith(root + sep)`), part of the FS jail. See [SECURITY](./SECURITY.md).
|
|
281
|
+
|
|
282
|
+
## Troubleshooting 🕳️
|
|
283
|
+
|
|
284
|
+
| Symptom | Cause | Fix |
|
|
285
|
+
| --- | --- | --- |
|
|
286
|
+
| Cancelled goal still shows pending issues | child `status` not cascaded | `cancelGoalFor` calls `setGoalChildrenStatus`; reopen + re-cancel if a row was edited directly |
|
|
287
|
+
| Re-approve created no new tasks | all issues already have a `task.issueId` | expected — `materializeTasks` is idempotent; only new issues materialize |
|
|
288
|
+
| "Done" goal stuck below 100% | sticky cached progress | by design once settled; reopen to recompute while `active` |
|
|
289
|
+
| Plan won't approve | no `plan` row / specs not `active` | `approvePlanFor` only approves `spec.status = active`; ensure a plan exists |
|
|
290
|
+
| Ada stuck "working", no plan | a prior job died before its `finally` | `generatePlanFor` self-recovers by checking the live `planner` event stream |
|
|
291
|
+
| Second "New work" overwrote SPEC-01 | should not happen | keys are renumbered to continue from existing specs/issues on disk |
|
|
292
|
+
|
|
293
|
+
## Related links
|
|
294
|
+
|
|
295
|
+
- [WORKFLOW](./WORKFLOW.md) — the end-to-end execution ritual
|
|
296
|
+
- [PO_AGENT](./PO_AGENT.md) — backlog grooming, story points, MoSCoW
|
|
297
|
+
- [AGENTS](./AGENTS.md) — the roster (Ada is the CEO/planner)
|
|
298
|
+
- [INBOX](./INBOX.md) — operator approvals and decisions
|
|
299
|
+
- [CHAT_COMMANDS](./CHAT_COMMANDS.md) — `/approve`, `/cancel`, `/archive`, `/new-work`
|
|
300
|
+
- [DM](./DM.md) — starting new work from a direct message
|
|
301
|
+
- [TEAM_ROOM](./TEAM_ROOM.md) — where the CEO narrates the plan
|
|
302
|
+
- [ARCHITECTURE](./ARCHITECTURE.md) — the data layer and sync engine
|
|
303
|
+
- [TELEGRAM](./TELEGRAM.md) — remote control of the same cores
|
package/docs/en/INBOX.md
ADDED
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
[← Docs index](./README.md) · [🇧🇷 Português](../pt/INBOX.md) · [✦ Constella](../../README.md)
|
|
2
|
+
|
|
3
|
+
# 🛰️ Inbox — the operator's decision console
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
The Inbox is the single place where every decision that needs *you* — the human at the control plane — comes to rest. When a working constellation drifts off course (a plan awaiting approval, a budget cap hit, a blocked file, a knowledge gap, an agent asking a direct question), it files an actionable item here. Nothing the agents do that requires human judgement is silent: it lands in the Inbox, deduplicated and auto-clearing.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## When to use
|
|
12
|
+
|
|
13
|
+
- You want **one list** of everything that needs your action right now (approvals, blocks, budget, validations, questions).
|
|
14
|
+
- An agent posted "@operator, can you confirm…?" and you want to act on it without scrolling chat.
|
|
15
|
+
- A plan / spec / issue is drafted and waiting for **approval** before any code runs.
|
|
16
|
+
- A run **blocked** (file lock, broken dev server, failed Test Dev, rejected push, blocked destructive command) and you need to intervene.
|
|
17
|
+
- An agent **hit its daily budget cap** and paused.
|
|
18
|
+
- The Product Owner flagged likely **duplicates** or **gaps** during backlog grooming.
|
|
19
|
+
- A new Constella **version** is available.
|
|
20
|
+
|
|
21
|
+
If you only want to *read* status, use `/status` in chat. The Inbox is for things that need a **decision or an action**.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## How it works 🌌
|
|
26
|
+
|
|
27
|
+
The Inbox is backed by a real table, `inbox_item` (`src/db/schema.ts`). It is not a view over chat — items are persisted rows with a `kind`, a human title/detail, an optional reference to the underlying decision (`refType` + `refId`), and a `resolved` flag.
|
|
28
|
+
|
|
29
|
+
Three small modules form the whole surface:
|
|
30
|
+
|
|
31
|
+
| Module | File | Role |
|
|
32
|
+
| --- | --- | --- |
|
|
33
|
+
| Producer API | `src/server/inbox.ts` | `pushInbox`, `resolveInboxFor`, `resolveInboxRefTypes`, `resolveInboxForGoal` |
|
|
34
|
+
| List page | `src/app/(app)/inbox/page.tsx` + `src/components/modules/inbox-row.tsx` | the full Inbox view + detail overlay |
|
|
35
|
+
| Home hub | `src/server/home.ts` (`homeDecisions`) + `src/components/modules/home-inbox.tsx` | "Needs your decision" card on the dashboard |
|
|
36
|
+
|
|
37
|
+
Items are created by **producers** scattered across the codebase (the planner, the runner, GitHub, deploy prep, blocks, Test Dev, the operator-ping). They are **consumed** by the Inbox UI, where the primary button runs the *real* action (approve the plan, approve a spec/issue, open the channel/screen) and then marks the item resolved.
|
|
38
|
+
|
|
39
|
+
The same item is reachable from two places: the dedicated **Inbox** page (all kinds, resolved + unresolved) and the dashboard **Needs your decision** card (`homeDecisions`, unresolved, only `approval | review | block | budget`, newest 6).
|
|
40
|
+
|
|
41
|
+
### Dedup and refresh
|
|
42
|
+
|
|
43
|
+
`pushInbox` is dedup-aware. If an item already exists **unresolved** for the same `(refType, refId)`, it is **refreshed in place** (latest title/detail/goal/timestamp) instead of piling up a duplicate. So a re-drafted plan with new spec/issue counts updates the one "Approve plan" row rather than spawning a second one.
|
|
44
|
+
|
|
45
|
+
### Auto-clear
|
|
46
|
+
|
|
47
|
+
When the underlying decision is taken **elsewhere** (you approve the plan in the Planner, a blocked task recovers, a goal is cancelled), the matching Inbox item is auto-resolved so the list never shows a stale pending row. Four helpers do this — see [Clearing items](#clearing-items--orbital-decay-).
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Main flow
|
|
52
|
+
|
|
53
|
+
```mermaid
|
|
54
|
+
flowchart TD
|
|
55
|
+
subgraph Producers["✦ Producers (raise items)"]
|
|
56
|
+
PL["Planner: plan ready → approval"]
|
|
57
|
+
PO["PO grooming: duplicates + gaps → review"]
|
|
58
|
+
RUN["Runner: blocks / budget / validation / arch"]
|
|
59
|
+
GH["GitHub: commit/push blocked → block"]
|
|
60
|
+
DEP["Deploy prep / export: secret risk → block"]
|
|
61
|
+
BLK["Knowledge blocks: edit proposed → review"]
|
|
62
|
+
TD["Test Dev / validation request → validation"]
|
|
63
|
+
PING["operator-ping: @operator ask → question/approval"]
|
|
64
|
+
end
|
|
65
|
+
PL & PO & RUN & GH & DEP & BLK & TD & PING --> PUSH["pushInbox() → inbox_item"]
|
|
66
|
+
PUSH -->|dedup on refType+refId| TABLE[("inbox_item table")]
|
|
67
|
+
TABLE --> UI["🛰️ Inbox page + Home hub"]
|
|
68
|
+
UI -->|primary action| ACT["approvePlan / approveSpec / approveIssue / open screen"]
|
|
69
|
+
ACT --> RES["resolveInbox(id)"]
|
|
70
|
+
ACTELSE["Action taken elsewhere<br/>(approve in Planner, goal cancelled,<br/>task recovers)"] --> AUTORES["resolveInboxFor / RefTypes / ForGoal"]
|
|
71
|
+
RES --> TABLE
|
|
72
|
+
AUTORES --> TABLE
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Key concepts 🪐
|
|
78
|
+
|
|
79
|
+
### Item kinds
|
|
80
|
+
|
|
81
|
+
The `kind` enum (`inbox_item.kind`) is the item's category. It drives the icon and the localized label.
|
|
82
|
+
|
|
83
|
+
| `kind` | Meaning | Typical producer | Icon |
|
|
84
|
+
| --- | --- | --- | --- |
|
|
85
|
+
| `approval` | A plan or an agent ask needs your sign-off before work proceeds | planner-core (plan ready), operator-ping (approval phrasing) | `check` |
|
|
86
|
+
| `review` | Something to look over: a spec/issue rejection, an architecture decision, a held review, a KB block edit, a duplicate/gap report, an available update | planner (reject spec/issue), runner (arch decision, held review), blocks (proposal), planner (PO grooming) | `doc` |
|
|
87
|
+
| `block` | A run is blocked and needs you to unblock it | runner (broken dev server, blocked goal, guard-blocked command), GitHub (commit/push rejected), deploy prep (secret risk), file locks | `close` |
|
|
88
|
+
| `budget` | An agent paused on its daily spend cap | runner | `coins` |
|
|
89
|
+
| `validation` | A feature needs you to validate it (Test Dev / manual) | test-dev-actions (`requestValidation`), runner (failed Test Dev) | `pulse` |
|
|
90
|
+
| `question` | A plain `@operator` question that needs an answer | operator-ping | `chat` |
|
|
91
|
+
|
|
92
|
+
### Reference (`refType` + `refId`)
|
|
93
|
+
|
|
94
|
+
`refType` says *what kind of thing* the decision is about; `refId` is the concrete id (or a synthetic key). Together they let the Inbox **execute the real action** and **auto-resolve** when handled elsewhere.
|
|
95
|
+
|
|
96
|
+
| `refType` | `refId` example | Primary action in the UI |
|
|
97
|
+
| --- | --- | --- |
|
|
98
|
+
| `plan` | the **workspace id** (the plan is a singleton per workspace) | **Approve plan** → `approvePlan()` |
|
|
99
|
+
| `spec` | spec row id | **Approve spec** → `approveSpec(refId)` |
|
|
100
|
+
| `issue` | issue row id | **Approve issue** → `approveIssue(refId)` |
|
|
101
|
+
| `task` | task id, or a synthetic key like `lock:<path>`, `commit-<origin>`, `budget:<id>`, `arch:<taskId>` | **Open tasks** (`/tasks`) |
|
|
102
|
+
| `validation` | issue key, block-proposal id, Test Dev gate id | **Open Test Dev** (`/test-dev`) |
|
|
103
|
+
| `question` | the chat `messageId` | **Open chat** (jumps to the DM or toggles chat) |
|
|
104
|
+
| `goal` | goal id | (used by `resolveInboxForGoal`) |
|
|
105
|
+
|
|
106
|
+
> Note: `InboxRefType` in `src/server/inbox.ts` enumerates `plan | spec | issue | task | validation | question | goal`. The column itself is a free-text `text("ref_type")`, so synthetic keys (e.g. `arch:<taskId>`) ride on `refType: "task"`.
|
|
107
|
+
|
|
108
|
+
### Other columns
|
|
109
|
+
|
|
110
|
+
| Column | Purpose |
|
|
111
|
+
| --- | --- |
|
|
112
|
+
| `fromAgentId` | which agent raised it (drives the avatar + "from {name}") |
|
|
113
|
+
| `goalId` | the goal it belongs to — lets a cancel/archive clear all related items |
|
|
114
|
+
| `channel` | jump target for chat-linked items (e.g. `dm:<handle>`) |
|
|
115
|
+
| `messageId` | the source chat message (for `question` items) |
|
|
116
|
+
| `resolved` | `false` = still demands action; `true` = handled/dismissed |
|
|
117
|
+
| `createdAt` | timestamp; refreshed on dedup |
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Producers — what surfaces in the Inbox 🌠
|
|
122
|
+
|
|
123
|
+
Every `pushInbox` call in the codebase, grouped by source:
|
|
124
|
+
|
|
125
|
+
| Source file | When | `kind` | `refType` |
|
|
126
|
+
| --- | --- | --- | --- |
|
|
127
|
+
| `server/planner-core.ts` | Ada finished drafting a plan; it needs approval before code runs | `approval` | `plan` |
|
|
128
|
+
| `server/planner.ts` | A spec was **rejected** — author should revise | `review` | `spec` |
|
|
129
|
+
| `server/planner.ts` | An issue was **rejected** — assignee should revise | `review` | `issue` |
|
|
130
|
+
| `server/planner.ts` (`groomBacklogFor`) | PO grooming flagged **duplicates / gaps** | `review` | _(none)_ |
|
|
131
|
+
| `server/runner.ts` | Agent **hit the daily budget cap** and paused | `budget` | `task` (`budget:<agentId>`) |
|
|
132
|
+
| `server/runner.ts` | Captured an **architecture / business-rule** decision | `review` | `task` (`arch:<taskId>`) |
|
|
133
|
+
| `server/runner.ts` | A task **broke the dev server** (boot gate) | `block` | `task` |
|
|
134
|
+
| `server/runner.ts` | A task **failed Test Dev** | `validation` | `validation` |
|
|
135
|
+
| `server/runner.ts` | A task is **held in review** with high-severity findings | `review` | `task` |
|
|
136
|
+
| `server/runner.ts` | A run **blocked — needs you** (run failed) | `block` | `task` |
|
|
137
|
+
| `server/runner.ts` | The safety guard **blocked destructive commands** | `block` | `task` (`guard:<taskId>`) |
|
|
138
|
+
| `server/runner.ts` | A new **Constella version** is available | `review` | `task` (`update:<latest>`) |
|
|
139
|
+
| `server/github.ts` | **Commit blocked** — secret risk in the change set | `block` | `task` (`commit-<origin>`) |
|
|
140
|
+
| `server/github.ts` | **Push rejected** — remote conflict / non-fast-forward | `block` | `task` (`push:<repo>:<branch>`) |
|
|
141
|
+
| `server/prepare-deploy.ts` | **Prep blocked** — secret risk | `block` | `task` (`deploy-prep`) |
|
|
142
|
+
| `server/prepare-deploy.ts` | **Export blocked** — secret risk | `block` | `task` (`export-<repo>`) |
|
|
143
|
+
| `server/blocks.ts` | A **knowledge block edit** was proposed | `review` | `validation` |
|
|
144
|
+
| `server/actions/test-dev-actions.ts` (`requestValidation`) | An agent/operator asks you to **validate a feature** | `validation` | `validation` |
|
|
145
|
+
| `server/dashboard.ts` | A **file lock** is held by a live run | `block` | `task` (`lock-<path>`) |
|
|
146
|
+
| `app/api/locks/acquire/route.ts` | **File contention** — an agent is blocked editing a locked file | `block` | `task` (`lock:<path>`) |
|
|
147
|
+
| `server/operator-ping.ts` | An agent message **addresses you** (`@operator`) | `approval` (if approval phrasing) or `question` | `question` |
|
|
148
|
+
|
|
149
|
+
Most producers also call `notifyOps` (a transient toast/notification) alongside `pushInbox` (the persistent decision). The Inbox is the durable record; notifications are the nudge.
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Consuming the Inbox — the UI
|
|
154
|
+
|
|
155
|
+
### The full Inbox page
|
|
156
|
+
|
|
157
|
+
`/inbox` (`src/app/(app)/inbox/page.tsx`) loads **all** items for the workspace, sorts **unresolved first then newest first**, and renders `InboxList`. The header sub-title shows the pending count (`inbox.sub`). Each row shows the kind icon, the title, a sub-line (`kind · from {name} · <when>`), and the raising agent's avatar with a health dot.
|
|
158
|
+
|
|
159
|
+
Clicking a row opens a **detail overlay** with the full detail text and the buttons:
|
|
160
|
+
|
|
161
|
+
- **Primary action** — for an actionable `refType`, the real decision runs (`primaryFor` in `inbox-row.tsx`):
|
|
162
|
+
- `plan` → **Approve plan**
|
|
163
|
+
- `spec` → **Approve spec**
|
|
164
|
+
- `issue` → **Approve issue**
|
|
165
|
+
- `task` → **Open tasks**
|
|
166
|
+
- `validation` → **Open Test Dev**
|
|
167
|
+
- `question` → **Open chat** (opens the DM if `channel` starts with `dm:`, else toggles the chat panel)
|
|
168
|
+
- **Dismiss** — resolve without running anything.
|
|
169
|
+
- **Reopen** — for an already-resolved item, flip `resolved` back to `false`.
|
|
170
|
+
|
|
171
|
+
After the primary action runs, the item is always resolved (`finally { resolveInbox(id, true) }`).
|
|
172
|
+
|
|
173
|
+
### The dashboard hub
|
|
174
|
+
|
|
175
|
+
`homeDecisions` (`src/server/home.ts`) feeds the "Needs your decision" card (`HomeInbox`). It is a tighter slice: **unresolved** items of kind `approval | review | block | budget` only, newest 6. Here the buttons are **Approve / Reject** for `plan | spec | issue` (reject uses `rejectSpec` / `rejectIssue`, which themselves file a follow-up "Revise…" review item and open a prefilled DM to the author). Anything else falls back to opening `/inbox`.
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Clearing items — orbital decay 🕳️
|
|
180
|
+
|
|
181
|
+
There are two flavours of clearing.
|
|
182
|
+
|
|
183
|
+
### Manual — by the operator
|
|
184
|
+
|
|
185
|
+
`resolveInbox(id, resolved = true)` in `src/server/actions/inbox-actions.ts` flips `resolved` (workspace-scoped) and revalidates `/inbox`. This is what the **Dismiss / Reopen** buttons and every primary action call.
|
|
186
|
+
|
|
187
|
+
> ⚠️ **Two `resolveInbox` exist.** `src/server/actions/inbox-actions.ts` **updates** `resolved` (reversible — you can Reopen). `src/server/modules.ts` has a different `resolveInbox(id)` that **deletes** the row outright. The Inbox UI (`inbox-row.tsx`, `home-inbox.tsx`) uses the *actions* version; `module-toggles.tsx` uses the *modules* (delete) one. Treat the modules variant as a hard delete.
|
|
188
|
+
|
|
189
|
+
### Automatic — when the decision is taken elsewhere
|
|
190
|
+
|
|
191
|
+
Four helpers in `src/server/inbox.ts` resolve items so the list never shows a stale row:
|
|
192
|
+
|
|
193
|
+
| Helper | Resolves | Called by |
|
|
194
|
+
| --- | --- | --- |
|
|
195
|
+
| `resolveInboxFor(wsId, refType, refId)` | every unresolved item for one `(refType, refId)` | `plan-ops.ts` (plan approve/reject), `planner.ts` (spec/issue approve), `blocks.ts` (merge/reject proposal), `file-locks.ts` (lock released), `runner.ts` (task recovered) |
|
|
196
|
+
| `resolveInboxRefTypes(wsId, refTypes[])` | every unresolved item of the given ref types | `plan-ops.ts` — approving the plan clears all per-`spec`/`issue` review items at once |
|
|
197
|
+
| `resolveInboxForGoal(wsId, goalId)` | every unresolved item tied to a goal | `work-ops.ts` — cancel / archive a goal clears everything related |
|
|
198
|
+
| `resolveInbox(id)` (modules) | a single row, by **delete** | `module-toggles.tsx` |
|
|
199
|
+
|
|
200
|
+
All four are **best-effort** and never throw — an inbox write/clear must never break the chat post or the runner step that triggered it.
|
|
201
|
+
|
|
202
|
+
```mermaid
|
|
203
|
+
sequenceDiagram
|
|
204
|
+
participant Ada as Ada (planner-core)
|
|
205
|
+
participant DB as inbox_item
|
|
206
|
+
participant Op as Operator
|
|
207
|
+
participant Plan as plan-ops
|
|
208
|
+
Ada->>DB: pushInbox(approval, refType=plan, refId=wsId)
|
|
209
|
+
Note over DB: dedup → one "Approve plan" row
|
|
210
|
+
Op->>Plan: approve in Planner (/planner)
|
|
211
|
+
Plan->>DB: resolveInboxFor(plan, wsId)
|
|
212
|
+
Plan->>DB: resolveInboxRefTypes([spec, issue])
|
|
213
|
+
Note over DB: row(s) resolved=true → Inbox empties
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## Step-by-step
|
|
219
|
+
|
|
220
|
+
### Approve a plan from the Inbox
|
|
221
|
+
|
|
222
|
+
1. Ada drafts a plan → a `kind: "approval"`, `refType: "plan"` item appears titled **"Approve plan — <workspace>"**.
|
|
223
|
+
2. Open `/inbox`, click the row.
|
|
224
|
+
3. Press **Approve plan**. This runs `approvePlan()` (queues tasks, marks issues approved, grooms the backlog), then resolves the item.
|
|
225
|
+
4. The `plan` item *and* all pending per-`spec`/`issue` review items clear automatically (`resolveInboxRefTypes`).
|
|
226
|
+
|
|
227
|
+
### Handle a blocked run
|
|
228
|
+
|
|
229
|
+
1. A run blocks → a `kind: "block"`, `refType: "task"` item appears (e.g. **"<KEY> broke the dev server"** or **"Commit blocked — N secret risk(s)"**).
|
|
230
|
+
2. Open the row, read the `detail` (it carries the boot error / secret list / stderr).
|
|
231
|
+
3. Fix the cause (e.g. resolve secrets, then re-run with force on GitHub), or **Open tasks** to inspect.
|
|
232
|
+
4. When the task recovers, `runner.ts` calls `resolveInboxFor(ws.id, "task", t.id)` and the item clears.
|
|
233
|
+
|
|
234
|
+
### Answer an agent question
|
|
235
|
+
|
|
236
|
+
1. An agent posts `@operator can you confirm the pricing tiers?` → `operator-ping` files a `kind: "question"` (or `approval` if it reads as an approval ask), `refType: "question"`, with the `channel` + `messageId`.
|
|
237
|
+
2. Open the row, press **Open chat** — it jumps straight to that DM/channel.
|
|
238
|
+
3. Reply in chat. Dismiss the item (questions don't auto-resolve from a reply).
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## Examples
|
|
243
|
+
|
|
244
|
+
A budget cap item raised by the runner:
|
|
245
|
+
|
|
246
|
+
```ts
|
|
247
|
+
await pushInbox(ws.id, {
|
|
248
|
+
kind: "budget", refType: "task", refId: `budget:${a.id}`,
|
|
249
|
+
goalId: t.goalId ?? null, fromAgentId: a.id,
|
|
250
|
+
title: `@${a.handle} hit the daily budget cap`,
|
|
251
|
+
detail: `${a.name} reached the $${a.dailyCapUsd}/day spend cap and paused. ` +
|
|
252
|
+
`Raise the cap in Agent Studio or wait for the daily reset.`,
|
|
253
|
+
});
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
A PO grooming review item (duplicates + gaps — `groomBacklogFor`):
|
|
257
|
+
|
|
258
|
+
```ts
|
|
259
|
+
await pushInbox(workspace.id, {
|
|
260
|
+
kind: "review", fromAgentId: po.id,
|
|
261
|
+
title: `PO backlog review — ${dupes.length} duplicate, ${gaps.length} gap`,
|
|
262
|
+
detail: note.slice(0, 500),
|
|
263
|
+
});
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
The plan-ready approval item (`planner-core.ts`):
|
|
267
|
+
|
|
268
|
+
```ts
|
|
269
|
+
await pushInbox(workspace.id, {
|
|
270
|
+
kind: "approval", refType: "plan", refId: workspace.id, goalId,
|
|
271
|
+
fromAgentId: ada.id, channel: "room",
|
|
272
|
+
title: `Approve plan — ${workspace.name}`,
|
|
273
|
+
detail: `${specCount} spec(s) · ${issues} issue(s) drafted from the brief. Approve to start execution.`,
|
|
274
|
+
});
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## Possible states
|
|
280
|
+
|
|
281
|
+
| State | Meaning |
|
|
282
|
+
| --- | --- |
|
|
283
|
+
| **Unresolved** (`resolved = false`) | Demands your action. Shown first in the list, full opacity, counted in `inbox.sub`. |
|
|
284
|
+
| **Resolved** (`resolved = true`) | Handled or dismissed. Shown greyed + struck-through, sorts to the bottom, offers **Reopen**. |
|
|
285
|
+
| **Refreshed** | A dedup hit — an existing unresolved item's title/detail/timestamp were updated in place. |
|
|
286
|
+
| **Deleted** | Removed entirely via the `modules.ts` `resolveInbox` (no Reopen possible). |
|
|
287
|
+
| **Empty** | No items — the list shows "All caught up 🎉" (`inbox.empty`). |
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Related integrations 🛰️
|
|
292
|
+
|
|
293
|
+
- **Planner / Plan-ops** — the biggest producer (plan approval) and the biggest auto-resolver (`/approve` clears plan + spec + issue items). See [WORKFLOW](./WORKFLOW.md) and [GOALS_SPECS_ISSUES](./GOALS_SPECS_ISSUES.md).
|
|
294
|
+
- **Runner** — files block/budget/validation/review items as tasks execute. See [AGENTS](./AGENTS.md).
|
|
295
|
+
- **Telegram** — the same plan-ready decision is mirrored to your phone with inline **Approve / Start execution / Review / Reject** buttons; tapping them runs the same shared core. See [TELEGRAM](./TELEGRAM.md).
|
|
296
|
+
- **GitHub** — commit/push blocks land here. See [GITHUB](./GITHUB.md).
|
|
297
|
+
- **Prepare Deploy / Export** — secret-scan blocks land here. See [PREPARE_DEPLOY](./PREPARE_DEPLOY.md) and [DEPLOY](./DEPLOY.md).
|
|
298
|
+
- **Test Dev** — failed gates + validation requests land here. See [TEST_DEV](./TEST_DEV.md).
|
|
299
|
+
- **Knowledge** — block-edit proposals land here as `review` items. See [SYNCED_BLOCKS](./SYNCED_BLOCKS.md) and [KB_RAG](./KB_RAG.md).
|
|
300
|
+
- **Update** — an available release files a `review` item. See [UPDATE](./UPDATE.md).
|
|
301
|
+
|
|
302
|
+
The Inbox is also exposed indirectly through the public API and the chat surface: `/status` summarizes counts, while `/approve`, `/reject`, `/pause`, `/run-247` act on the same underlying decisions. See [CHAT_COMMANDS](./CHAT_COMMANDS.md) and [PUBLIC_API](./PUBLIC_API.md).
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## Security
|
|
307
|
+
|
|
308
|
+
- **Workspace isolation** — every read/write is scoped by `workspaceId`; `resolveInbox` filters on both `id` *and* `workspaceId`, so one org can never resolve another org's item.
|
|
309
|
+
- **No secrets in items** — producers that surface secret findings (GitHub, deploy prep) include a **redacted preview** only (`kind` + truncated path), never the secret value. The detail text is also length-capped (≈400–500 chars).
|
|
310
|
+
- **Server-only** — `inbox.ts` is `import "server-only"`; items are written by trusted server actions and the runner, never directly by an agent process inside the FS jail.
|
|
311
|
+
- **Best-effort, non-blocking** — a failed inbox write logs and returns; it can't stall a chat post or a run.
|
|
312
|
+
|
|
313
|
+
See [SECURITY](./SECURITY.md) for the vault, scrub and jail details.
|
|
314
|
+
|
|
315
|
+
---
|
|
316
|
+
|
|
317
|
+
## Troubleshooting
|
|
318
|
+
|
|
319
|
+
| Symptom | Likely cause | Fix |
|
|
320
|
+
| --- | --- | --- |
|
|
321
|
+
| A "decision" never appears in the Inbox | The producer's `notifyOps`/`pushInbox` ran best-effort and swallowed an error | Check the worker/server console for `[inbox] pushInbox failed` |
|
|
322
|
+
| Duplicate-looking rows | They differ in `(refType, refId)` — dedup only collapses an exact match | Expected; resolve each |
|
|
323
|
+
| A resolved item won't go away from the Home hub | `homeDecisions` only shows `approval/review/block/budget` and only unresolved — a stale cache | Refresh; the page revalidates `/inbox` on resolve |
|
|
324
|
+
| "Approve plan" does nothing | No active workspace/plan, or the plan was already approved elsewhere | The button still resolves the item; re-check the Planner |
|
|
325
|
+
| Reopen is missing | The item was removed via the `modules.ts` delete path, not the actions update path | Deletes are permanent — the producer must raise it again |
|
|
326
|
+
| Old blocked-task items linger after a fix | The task recovered without going through `runner.ts`'s `resolveInboxFor` path | Dismiss manually, or cancel/archive the goal to clear all related items |
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
|
|
330
|
+
## Related links
|
|
331
|
+
|
|
332
|
+
- [WORKFLOW](./WORKFLOW.md) — the Goal → Spec → Issue → Plan → Execution lifecycle the Inbox gates.
|
|
333
|
+
- [GOALS_SPECS_ISSUES](./GOALS_SPECS_ISSUES.md) — what gets approved/rejected from the Inbox.
|
|
334
|
+
- [AGENTS](./AGENTS.md) — the constellations that raise items.
|
|
335
|
+
- [PO_AGENT](./PO_AGENT.md) — Donald's grooming that flags duplicates and gaps.
|
|
336
|
+
- [CHAT_COMMANDS](./CHAT_COMMANDS.md) — `/status`, `/approve`, `/reject` over the same decisions.
|
|
337
|
+
- [DM](./DM.md) · [TEAM_ROOM](./TEAM_ROOM.md) — where `question` items jump to.
|
|
338
|
+
- [TELEGRAM](./TELEGRAM.md) — the Inbox on your phone.
|
|
339
|
+
- [GITHUB](./GITHUB.md) · [PREPARE_DEPLOY](./PREPARE_DEPLOY.md) · [TEST_DEV](./TEST_DEV.md) — block/validation producers.
|
|
340
|
+
- [SECURITY](./SECURITY.md) · [TROUBLESHOOTING](./TROUBLESHOOTING.md) · [FAQ](./FAQ.md)
|