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
|
+
[← Índice](./README.md) · [🇬🇧 English](../en/GOALS_SPECS_ISSUES.md) · [✦ Constella](../../README.pt-BR.md)
|
|
2
|
+
|
|
3
|
+
# Metas, Specs, Issues, Planos — A Constelação do Trabalho 🌌🪐
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
O modelo de dados e as máquinas de estado por trás de cada unidade de trabalho. Uma **Meta (Goal)** é uma órbita; as **Specs** são suas cartas estelares; as **Issues** são as manobras; as **Tasks** são as queimas que o motor realmente dispara; o **Plano (Plan)** é o portão de lançamento que o operador abre. Esta página documenta as tabelas reais, colunas, enums de status e as transições entre eles.
|
|
8
|
+
|
|
9
|
+
## Descrição curta
|
|
10
|
+
|
|
11
|
+
A Constella transforma um briefing em um pipeline de entrega estruturado e consciente de estado: `Goal → Spec → Issue → Plan → Execution → Review → Test → Done`. O agente CEO (Ada) rascunha specs e issues; o operador aprova o plano; as issues aprovadas são *materializadas* em tasks executáveis que o runner pega. Cancelar ou arquivar uma meta cascateia para seus filhos, de modo que nada já encerrado continue aparecendo como pendente.
|
|
12
|
+
|
|
13
|
+
## Quando usar
|
|
14
|
+
|
|
15
|
+
- Você quer entender **o que é cada entidade**, quais colunas ela tem e como as linhas se relacionam.
|
|
16
|
+
- Você precisa dos **enums de status** exatos e das **colunas do kanban** de `goal`, `spec`, `issue`, `task` e `plan`.
|
|
17
|
+
- Você está depurando por que uma meta cancelada ainda mostra trabalho pendente, ou por que um plano reaprovado criou apenas *algumas* tasks.
|
|
18
|
+
- Você quer saber o que é o **SUPER-SPEC** e quando ele é escrito.
|
|
19
|
+
|
|
20
|
+
## Como funciona 🛰️
|
|
21
|
+
|
|
22
|
+
Cada entidade é uma linha no banco de dados SQLite (`src/db/schema.ts`), com escopo por `workspaceId` (um workspace por organização). O diretório em disco é a fonte da verdade para os artefatos legíveis (`specs/*.md`, `issues/*.md`, `specs/SUPER-SPEC.md`); as tabelas os indexam e carregam o estado de ciclo de vida.
|
|
23
|
+
|
|
24
|
+
O pipeline é conduzido por três módulos:
|
|
25
|
+
|
|
26
|
+
| Módulo | Arquivo | Responsabilidade |
|
|
27
|
+
| --- | --- | --- |
|
|
28
|
+
| Planner | `src/server/planner-core.ts` | `generatePlanFor` / `runPlanJob` / `planFromConversationFor` — o CEO rascunha a Goal + specs + issues |
|
|
29
|
+
| Plan ops | `src/server/plan-ops.ts` | `approvePlanFor` / `requestPlanChangesFor` / `setAuto247For` — o portão de aprovação |
|
|
30
|
+
| Work ops | `src/server/work-ops.ts` | `cancelGoalFor` / `archiveGoalFor` + helpers de cascata — ciclo de vida da meta |
|
|
31
|
+
| Materialize | `src/server/materialize.ts` | `materializeTasks` — converte issues aprovadas em linhas `task` executáveis |
|
|
32
|
+
|
|
33
|
+
Os quatro são cores `server-only` chaveados por um `(orgId, workspaceId)` explícito, então podem ser chamados a partir de uma server action de sessão **ou** dos canais sem sessão (o controle remoto via Telegram, a API pública).
|
|
34
|
+
|
|
35
|
+
## Fluxo principal 🌠
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
briefing / DM "@ada construa X"
|
|
39
|
+
└─ generatePlanFor → runPlanJob (Ada, destacado, canal "planner")
|
|
40
|
+
├─ (primeiro plano, projeto existente) analyzeExistingProject → specs/SUPER-SPEC.md
|
|
41
|
+
├─ insere goal (a partir da spec PRINCIPAL/primeira)
|
|
42
|
+
├─ insere linhas spec + escreve specs/SPEC-NN.md
|
|
43
|
+
├─ insere linhas issue + escreve issues/<key>.md (col=todo, approved=false)
|
|
44
|
+
└─ envia item ao Inbox "Aprovar plano"
|
|
45
|
+
└─ operador aprova → approvePlanFor
|
|
46
|
+
├─ plan.approved=true, stage=6
|
|
47
|
+
├─ issue.approved=true, spec.approved=true (specs ativas)
|
|
48
|
+
├─ materializeTasks → uma task por issue (idempotente)
|
|
49
|
+
└─ organiza o backlog do PO
|
|
50
|
+
└─ Run 24/7 (plan.auto247=true) → runner pega tasks → Review → Test → Done
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Conceitos-chave 🕳️
|
|
54
|
+
|
|
55
|
+
- **A Goal nasce da spec PRINCIPAL.** O `runPlanJob` trata a primeira spec da saída do modelo como a spec principal; `goal.specId` aponta para ela, e toda spec/issue rascunhada recebe o id da meta (`goalId`).
|
|
56
|
+
- **O ciclo de vida é independente da coluna de fluxo.** `spec.status` / `issue.status` (`active | cancelled | archived`) são *separados* de `issue.col` (a raia do kanban). Cancelar uma meta vira o `status` dos filhos, nunca a `col`, então o histórico do board sobrevive.
|
|
57
|
+
- **`approved` é um booleano, não um status.** Uma spec ou issue pode estar `approved=true` ainda que `active`. O portão de aprovação fica na linha singleton `plan`.
|
|
58
|
+
- **Tasks são a única coisa que o runner executa.** Issues são planos; tasks são trabalho. `materializeTasks` faz a ponte e é idempotente via `task.issueId`.
|
|
59
|
+
- **O disco é a fonte da verdade.** As keys de spec/issue são renumeradas para *continuar* a partir das existentes, de modo que um segundo plano de "New work" nunca sobrescreva `specs/SPEC-01.md` em disco.
|
|
60
|
+
|
|
61
|
+
## Tabelas 🪐
|
|
62
|
+
|
|
63
|
+
### `goal` — uma unidade de trabalho (uma órbita)
|
|
64
|
+
|
|
65
|
+
| Coluna | Tipo | Notas |
|
|
66
|
+
| --- | --- | --- |
|
|
67
|
+
| `id` | text PK | |
|
|
68
|
+
| `workspaceId` | text FK → workspace | indexado `goal_ws_idx` |
|
|
69
|
+
| `title` / `description` | text | |
|
|
70
|
+
| `ownerId` | text FK → agent | normalmente Ada (a CEO) |
|
|
71
|
+
| `progress` | int | rollup em cache 0–100, recomputado pelo runner |
|
|
72
|
+
| `parentId` | text | meta pai opcional |
|
|
73
|
+
| `status` | enum | `active \| cancelled \| archived \| done` (padrão `active`) |
|
|
74
|
+
| `specId` | text | a spec **principal** da qual esta meta nasceu |
|
|
75
|
+
| `archivePath` | text | caminho do ZIP quando arquivada |
|
|
76
|
+
| `createdAt` / `updatedAt` / `doneAt` / `cancelledAt` / `archivedAt` / `reopenedAt` | timestamp | marcadores de ciclo de vida (nuláveis) |
|
|
77
|
+
|
|
78
|
+
A proveniência é rastreada em `goal_file` (PK `goalId + path`, `op = created | edit`), para que um ZIP de arquivamento inclua *apenas* os arquivos que esta meta produziu.
|
|
79
|
+
|
|
80
|
+
### `spec` — uma carta estelar
|
|
81
|
+
|
|
82
|
+
| Coluna | Tipo | Notas |
|
|
83
|
+
| --- | --- | --- |
|
|
84
|
+
| `id` | text PK | |
|
|
85
|
+
| `workspaceId` | text FK | |
|
|
86
|
+
| `key` | text | ex.: `SPEC-01` (renumerada para continuar a partir das existentes) |
|
|
87
|
+
| `title` / `summary` / `body` | text | |
|
|
88
|
+
| `authorId` | text FK → agent | o papel que o CEO designou como autor |
|
|
89
|
+
| `approved` | bool | padrão `false` |
|
|
90
|
+
| `goalId` | text | meta pai |
|
|
91
|
+
| `status` | enum | `active \| cancelled \| archived` (padrão `active`) |
|
|
92
|
+
| `createdAt` / `updatedAt` | timestamp | |
|
|
93
|
+
|
|
94
|
+
### `issue` — uma manobra
|
|
95
|
+
|
|
96
|
+
| Coluna | Tipo | Notas |
|
|
97
|
+
| --- | --- | --- |
|
|
98
|
+
| `id` | text PK | |
|
|
99
|
+
| `workspaceId` | text FK | |
|
|
100
|
+
| `specId` | text FK → spec | `onDelete: cascade` |
|
|
101
|
+
| `goalId` | text | meta pai |
|
|
102
|
+
| `key` | text | sequencial, continuando a partir das issues existentes |
|
|
103
|
+
| `title` | text | |
|
|
104
|
+
| `prio` | enum | `low \| med \| high` (padrão `med`) |
|
|
105
|
+
| `col` | enum | `todo \| doing \| blocked \| review \| done` (raia do kanban, padrão `todo`) |
|
|
106
|
+
| `moscow` | enum | `Must \| Should \| Could \| Won't` (derivado de `prio`) |
|
|
107
|
+
| `points` | int | story points (derivado: high→8, med→5, low→3) |
|
|
108
|
+
| `assigneeId` | text FK → agent | o papel que o CEO designou |
|
|
109
|
+
| `approved` | bool | padrão `false` |
|
|
110
|
+
| `status` | enum | `active \| cancelled \| archived` (padrão `active`) |
|
|
111
|
+
| `createdAt` / `updatedAt` | timestamp | |
|
|
112
|
+
|
|
113
|
+
### `task` — uma queima de motor (a unidade executável)
|
|
114
|
+
|
|
115
|
+
| Coluna | Tipo | Notas |
|
|
116
|
+
| --- | --- | --- |
|
|
117
|
+
| `id` | text PK | |
|
|
118
|
+
| `workspaceId` | text FK | |
|
|
119
|
+
| `key` / `title` / `description` | text | |
|
|
120
|
+
| `col` | enum | `triage \| todo \| doing \| blocked \| review \| done` (padrão `triage`) |
|
|
121
|
+
| `prio` | enum | `low \| med \| high` |
|
|
122
|
+
| `assigneeId` | text FK → agent | |
|
|
123
|
+
| `goalId` | text FK → goal | |
|
|
124
|
+
| `issueId` | text FK → issue | a issue da qual foi materializada (chave de idempotência) |
|
|
125
|
+
| `createdBy` | enum | `operator \| agent` |
|
|
126
|
+
| `createdAt` / `updatedAt` | timestamp | |
|
|
127
|
+
|
|
128
|
+
Os sub-passos vivem em `task_step` (`text`, `done`, `active`, `ord`) — semeados a partir do `## Checklist` da issue e base do progresso ao vivo.
|
|
129
|
+
|
|
130
|
+
### `plan` — o portão de lançamento (uma linha por workspace)
|
|
131
|
+
|
|
132
|
+
| Coluna | Tipo | Notas |
|
|
133
|
+
| --- | --- | --- |
|
|
134
|
+
| `workspaceId` | text **PK** | um plano por workspace |
|
|
135
|
+
| `approved` | bool | padrão `false` |
|
|
136
|
+
| `auto247` | bool | chave da execução autônoma 24/7 |
|
|
137
|
+
| `stage` | int | marcador de estágio do pipeline (padrão `4`) |
|
|
138
|
+
| `createdAt` / `updatedAt` | timestamp | |
|
|
139
|
+
|
|
140
|
+
Note a diferença de cardinalidade: existe exatamente **uma** linha `plan` por workspace (a PK é `workspaceId`), mas **muitas** goals/specs/issues/tasks.
|
|
141
|
+
|
|
142
|
+
## Diagrama de relacionamento de entidades
|
|
143
|
+
|
|
144
|
+
```mermaid
|
|
145
|
+
erDiagram
|
|
146
|
+
WORKSPACE ||--|| PLAN : "tem um (portao)"
|
|
147
|
+
WORKSPACE ||--o{ GOAL : contem
|
|
148
|
+
GOAL ||--o{ SPEC : "pai de"
|
|
149
|
+
GOAL ||--o{ ISSUE : "pai de"
|
|
150
|
+
GOAL ||--o{ GOAL_FILE : "proveniencia"
|
|
151
|
+
SPEC ||--o{ ISSUE : "agrupa (delete em cascata)"
|
|
152
|
+
ISSUE ||--o| TASK : "materializada em"
|
|
153
|
+
TASK ||--o{ TASK_STEP : "checklist"
|
|
154
|
+
GOAL ||--o| SPEC : "nasce de (specId)"
|
|
155
|
+
AGENT ||--o{ GOAL : possui
|
|
156
|
+
AGENT ||--o{ SPEC : escreve
|
|
157
|
+
AGENT ||--o{ ISSUE : atribuida
|
|
158
|
+
AGENT ||--o{ TASK : atribuida
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Transições de status 🌠
|
|
162
|
+
|
|
163
|
+
### Máquina de estado da Goal
|
|
164
|
+
|
|
165
|
+
```mermaid
|
|
166
|
+
stateDiagram-v2
|
|
167
|
+
[*] --> active : runPlanJob insere goal
|
|
168
|
+
active --> done : todas as issues 100% (auto-conclusao, sticky)
|
|
169
|
+
active --> cancelled : cancelGoalFor
|
|
170
|
+
active --> archived : archiveGoalFor (ZIP)
|
|
171
|
+
cancelled --> active : reopenGoal
|
|
172
|
+
archived --> active : restoreGoal (re-extrai ZIP)
|
|
173
|
+
done --> [*]
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
`progress` e `status` mudam **apenas enquanto active**. Assim que uma meta encerra (`done`/`cancelled`/`archived`), seu `%` fica fixo (sticky) — uma issue posterior bloqueada ou adicionada não pode fazer uma meta "Done" mostrar 62%. A auto-conclusão é compare-and-set: só o primeiro escritor que ainda vê a meta `active` carimba `done` + `doneAt` (`src/server/progress.ts`).
|
|
177
|
+
|
|
178
|
+
### Ciclo de vida de Spec / Issue (status) — cascateia da meta pai
|
|
179
|
+
|
|
180
|
+
```mermaid
|
|
181
|
+
stateDiagram-v2
|
|
182
|
+
[*] --> active
|
|
183
|
+
active --> cancelled : meta cancelada (setGoalChildrenStatus)
|
|
184
|
+
active --> archived : meta arquivada
|
|
185
|
+
cancelled --> active : meta reaberta
|
|
186
|
+
archived --> active : meta restaurada
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Coluna kanban de Issue / Task (fluxo, independente do status)
|
|
190
|
+
|
|
191
|
+
```mermaid
|
|
192
|
+
stateDiagram-v2
|
|
193
|
+
[*] --> triage : padrao da task
|
|
194
|
+
triage --> todo
|
|
195
|
+
todo --> doing : runner assume
|
|
196
|
+
doing --> review : trabalho concluido
|
|
197
|
+
doing --> blocked : parkGoalTasks / agente travado
|
|
198
|
+
blocked --> todo : unparkGoalTasks
|
|
199
|
+
review --> done : aprovacao da QA
|
|
200
|
+
done --> [*]
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
> As Issues usam as colunas `todo · doing · blocked · review · done`. As Tasks adicionam uma raia inicial `triage`.
|
|
204
|
+
|
|
205
|
+
### Portão do Plano
|
|
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
|
+
## Passo a passo 🚀
|
|
217
|
+
|
|
218
|
+
1. **Chega um briefing** — o briefing permanente do workspace (`.claude/BRIEF.md`), uma DM para `@ada`, ou `/new-work` / `/new-goal`.
|
|
219
|
+
2. **`generatePlanFor`** marca Ada como `working` e dispara o `runPlanJob` destacado no servidor node persistente (faz streaming no canal `planner`).
|
|
220
|
+
3. **Análise do primeiro plano** (apenas quando há um projeto existente ainda não analisado): `analyzeExistingProject` lê o projeto arquivo a arquivo e escreve `specs/SUPER-SPEC.md`, então sinaliza `settings.source.analyzed = true`.
|
|
221
|
+
4. **Ada rascunha** um único objeto JSON de `specs[]` + `issues[]`. A primeira spec é a spec **principal**.
|
|
222
|
+
5. **Persiste** — insere a `goal` (título de `opts.goalTitle` / spec principal / objetivo), depois as specs (keys renumeradas para continuar), depois as issues (`col=todo`, `points`/`moscow` derivados de `prio`). Escreve `specs/SPEC-NN.md` e `issues/<key>.md` em disco.
|
|
223
|
+
6. **Inbox + Telegram** — um item de inbox `approval` (`refType=plan`) é enviado; se o Telegram estiver configurado, o plano é enviado ao celular com botões Aprovar / Iniciar execução / Revisar / Rejeitar.
|
|
224
|
+
7. **O operador aprova** (`approvePlanFor`): `plan.approved=true, stage=6`, issues + specs ativas viram `approved=true`, `materializeTasks` cria uma task por issue não materializada, e o backlog do PO (`PO/backlog.md`) é organizado.
|
|
225
|
+
8. **Run 24/7** (`setAuto247For(true)`) — o runner pega tasks `todo`, avança-as por `doing → review → done`, espelhando o progresso de volta nas issues e metas.
|
|
226
|
+
9. **Cancelar / arquivar** quando necessário — `cancelGoalFor` / `archiveGoalFor` param tudo e cascateiam o status dos filhos.
|
|
227
|
+
|
|
228
|
+
## Exemplos
|
|
229
|
+
|
|
230
|
+
**Novo trabalho a partir de uma DM** (tratado por `planFromConversationFor` → `generatePlanFor`):
|
|
231
|
+
|
|
232
|
+
```
|
|
233
|
+
@ada construa um painel de cobrança com Stripe e exportação CSV
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
**Aprovar via slash command** ([CHAT_COMMANDS](./CHAT_COMMANDS.md)):
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
/approve # approvePlanFor: aprova plano/specs/issues + materializa tasks
|
|
240
|
+
/run-247 # setAuto247For(true)
|
|
241
|
+
/reject <motivo> # requestPlanChangesFor — volta para Ada, estágio recua para 1
|
|
242
|
+
/cancel # cancelGoalFor — para + estaciona, reabre depois
|
|
243
|
+
/archive # archiveGoalFor — compacta o source da meta + manifesto
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
**Materialização Issue → task** (`materializeTasks`, idempotente): reaprovar após um replanejamento cria tasks **apenas** para issues sem `task.issueId`, então o trabalho existente nunca é duplicado.
|
|
247
|
+
|
|
248
|
+
## Estados possíveis
|
|
249
|
+
|
|
250
|
+
| Entidade | Campo | Valores |
|
|
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
|
+
## O SUPER-SPEC 🌌
|
|
263
|
+
|
|
264
|
+
Quando o onboarding importa um projeto existente (um repositório GitHub, um diretório local copiado, ou um `mock/` anexado), a **primeira** execução de plano não rascunha às cegas. `analyzeExistingProject` (`src/server/analyze.ts`) roda uma passagem real de agente com o workspace como `cwd`, lê docs → manifestos → código arquivo a arquivo, e escreve `specs/SUPER-SPEC.md` com seções como *Visão geral & propósito, Arquitetura & camadas, Stack & dependências, Mapa de diretórios / módulos, Frontend, Backend, Modelo de dados & banco, Auth & segurança, Integrações, Regras de negócio & fluxos-chave, O que é mock/stub vs real, Lacunas para tornar production-real*.
|
|
265
|
+
|
|
266
|
+
O plano então lê o SUPER-SPEC por inteiro e **estende** o sistema existente — nunca cria um segundo protótipo separado. A análise roda uma vez por projeto (`settings.source.analyzed`).
|
|
267
|
+
|
|
268
|
+
## Integrações relacionadas
|
|
269
|
+
|
|
270
|
+
- **Grooming do PO** — ao aprovar, cada issue é copiada para `backlog_item` (MoSCoW + points) e `PO/backlog.md` é reescrito. Veja [PO_AGENT](./PO_AGENT.md).
|
|
271
|
+
- **Inbox** — a decisão de aprovar o plano aparece como item acionável (`refType=plan`). Veja [INBOX](./INBOX.md).
|
|
272
|
+
- **Log de decisões** — aprovar/cancelar/arquivar acrescentam cada um uma linha `decision`. Veja [TEAM_ROOM](./TEAM_ROOM.md).
|
|
273
|
+
- **Remoto via Telegram** — os mesmos cores sem sessão alimentam `/approve`, `/cancel`, etc. pelo celular. Veja [TELEGRAM](./TELEGRAM.md).
|
|
274
|
+
- **Runner / execução** — as tasks fluem por review e teste. Veja [WORKFLOW](./WORKFLOW.md), [TEST_DEV](./TEST_DEV.md).
|
|
275
|
+
|
|
276
|
+
## Segurança 🔒
|
|
277
|
+
|
|
278
|
+
- Todos os cores de ciclo de vida são `server-only` e chaveados por um `(orgId, workspaceId)` explícito — **nunca** expostos como endpoints RPC não autenticados. Todo chamador (server action de sessão, allowlist do Telegram, PAT da API pública) já deve estar autorizado para o workspace.
|
|
279
|
+
- `ownGoal(wsId, goalId)` verifica que a meta pertence ao workspace antes de qualquer mutação.
|
|
280
|
+
- A extração de ZIP em arquivar/restaurar normaliza caminhos e recusa escrever fora da raiz do workspace (`abs !== root && !abs.startsWith(root + sep)`), parte da FS jail. Veja [SECURITY](./SECURITY.md).
|
|
281
|
+
|
|
282
|
+
## Solução de problemas 🕳️
|
|
283
|
+
|
|
284
|
+
| Sintoma | Causa | Solução |
|
|
285
|
+
| --- | --- | --- |
|
|
286
|
+
| Meta cancelada ainda mostra issues pendentes | `status` do filho não cascateado | `cancelGoalFor` chama `setGoalChildrenStatus`; reabra + cancele de novo se uma linha foi editada direto |
|
|
287
|
+
| Reaprovação não criou novas tasks | todas as issues já têm `task.issueId` | esperado — `materializeTasks` é idempotente; só novas issues materializam |
|
|
288
|
+
| Meta "Done" travada abaixo de 100% | progresso em cache fixo (sticky) | por design, uma vez encerrada; reabra para recomputar enquanto `active` |
|
|
289
|
+
| Plano não aprova | sem linha `plan` / specs não `active` | `approvePlanFor` só aprova `spec.status = active`; garanta que existe um plano |
|
|
290
|
+
| Ada travada em "working", sem plano | um job anterior morreu antes do `finally` | `generatePlanFor` se auto-recupera checando o stream de eventos `planner` ao vivo |
|
|
291
|
+
| Segundo "New work" sobrescreveu SPEC-01 | não deveria ocorrer | as keys são renumeradas para continuar a partir das specs/issues existentes em disco |
|
|
292
|
+
|
|
293
|
+
## Links relacionados
|
|
294
|
+
|
|
295
|
+
- [WORKFLOW](./WORKFLOW.md) — o ritual de execução ponta a ponta
|
|
296
|
+
- [PO_AGENT](./PO_AGENT.md) — grooming de backlog, story points, MoSCoW
|
|
297
|
+
- [AGENTS](./AGENTS.md) — a tripulação (Ada é a CEO/planner)
|
|
298
|
+
- [INBOX](./INBOX.md) — aprovações e decisões do operador
|
|
299
|
+
- [CHAT_COMMANDS](./CHAT_COMMANDS.md) — `/approve`, `/cancel`, `/archive`, `/new-work`
|
|
300
|
+
- [DM](./DM.md) — iniciar novo trabalho a partir de uma mensagem direta
|
|
301
|
+
- [TEAM_ROOM](./TEAM_ROOM.md) — onde a CEO narra o plano
|
|
302
|
+
- [ARCHITECTURE](./ARCHITECTURE.md) — a camada de dados e o motor de sync
|
|
303
|
+
- [TELEGRAM](./TELEGRAM.md) — controle remoto dos mesmos cores
|
package/docs/pt/INBOX.md
ADDED
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
[← Índice](./README.md) · [🇬🇧 English](../en/INBOX.md) · [✦ Constella](../../README.pt-BR.md)
|
|
2
|
+
|
|
3
|
+
# 🛰️ Inbox — o console de decisões do operador
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
A Inbox é o único lugar onde toda decisão que precisa de *você* — o humano no plano de controle — vai parar. Quando uma constelação em trabalho sai de rota (um plano aguardando aprovação, um teto de orçamento atingido, um arquivo bloqueado, uma lacuna de conhecimento, um agente fazendo uma pergunta direta), ela registra um item acionável aqui. Nada que os agentes façam e que exija julgamento humano fica em silêncio: cai na Inbox, deduplicado e com limpeza automática.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Quando usar
|
|
12
|
+
|
|
13
|
+
- Você quer **uma lista** de tudo que precisa de ação agora (aprovações, bloqueios, orçamento, validações, perguntas).
|
|
14
|
+
- Um agente postou "@operator, você confirma…?" e você quer agir sem rolar o chat.
|
|
15
|
+
- Um plano / spec / issue foi rascunhado e aguarda **aprovação** antes que qualquer código rode.
|
|
16
|
+
- Uma execução **bloqueou** (lock de arquivo, dev server quebrado, Test Dev falhou, push rejeitado, comando destrutivo bloqueado) e você precisa intervir.
|
|
17
|
+
- Um agente **atingiu o teto diário de orçamento** e pausou.
|
|
18
|
+
- O Product Owner sinalizou prováveis **duplicatas** ou **lacunas** durante o grooming do backlog.
|
|
19
|
+
- Uma nova **versão** do Constella está disponível.
|
|
20
|
+
|
|
21
|
+
Se você quer apenas *ler* o status, use `/status` no chat. A Inbox é para coisas que precisam de **decisão ou ação**.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Como funciona 🌌
|
|
26
|
+
|
|
27
|
+
A Inbox é sustentada por uma tabela real, `inbox_item` (`src/db/schema.ts`). Não é uma view sobre o chat — os itens são linhas persistidas com um `kind`, um título/detalhe legível, uma referência opcional à decisão subjacente (`refType` + `refId`) e uma flag `resolved`.
|
|
28
|
+
|
|
29
|
+
Três módulos pequenos formam toda a superfície:
|
|
30
|
+
|
|
31
|
+
| Módulo | Arquivo | Papel |
|
|
32
|
+
| --- | --- | --- |
|
|
33
|
+
| API produtora | `src/server/inbox.ts` | `pushInbox`, `resolveInboxFor`, `resolveInboxRefTypes`, `resolveInboxForGoal` |
|
|
34
|
+
| Página de lista | `src/app/(app)/inbox/page.tsx` + `src/components/modules/inbox-row.tsx` | a visão completa da Inbox + overlay de detalhe |
|
|
35
|
+
| Hub da home | `src/server/home.ts` (`homeDecisions`) + `src/components/modules/home-inbox.tsx` | card "Precisa da sua decisão" no dashboard |
|
|
36
|
+
|
|
37
|
+
Os itens são criados por **produtores** espalhados pelo código (o planner, o runner, GitHub, prep de deploy, blocks, Test Dev, o operator-ping). São **consumidos** pela UI da Inbox, onde o botão primário executa a ação *real* (aprovar o plano, aprovar uma spec/issue, abrir o canal/tela) e então marca o item como resolvido.
|
|
38
|
+
|
|
39
|
+
O mesmo item é alcançável a partir de dois lugares: a página dedicada da **Inbox** (todos os kinds, resolvidos + não resolvidos) e o card **Precisa da sua decisão** do dashboard (`homeDecisions`, não resolvidos, apenas `approval | review | block | budget`, os 6 mais recentes).
|
|
40
|
+
|
|
41
|
+
### Dedup e refresh
|
|
42
|
+
|
|
43
|
+
`pushInbox` é ciente de duplicatas. Se já existe um item **não resolvido** para o mesmo `(refType, refId)`, ele é **atualizado no lugar** (último título/detalhe/goal/timestamp) em vez de empilhar uma duplicata. Assim, um plano re-rascunhado com novas contagens de spec/issue atualiza a única linha "Aprovar plano" em vez de gerar uma segunda.
|
|
44
|
+
|
|
45
|
+
### Limpeza automática
|
|
46
|
+
|
|
47
|
+
Quando a decisão subjacente é tomada **em outro lugar** (você aprova o plano no Planner, uma task bloqueada se recupera, um goal é cancelado), o item correspondente da Inbox é auto-resolvido para que a lista nunca mostre uma linha pendente obsoleta. Quatro helpers fazem isso — veja [Limpando itens](#limpando-itens--decaimento-orbital-).
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Fluxo principal
|
|
52
|
+
|
|
53
|
+
```mermaid
|
|
54
|
+
flowchart TD
|
|
55
|
+
subgraph Produtores["✦ Produtores (levantam itens)"]
|
|
56
|
+
PL["Planner: plano pronto → approval"]
|
|
57
|
+
PO["Grooming do PO: duplicatas + lacunas → review"]
|
|
58
|
+
RUN["Runner: blocks / budget / validation / arch"]
|
|
59
|
+
GH["GitHub: commit/push bloqueado → block"]
|
|
60
|
+
DEP["Prep de deploy / export: risco de segredo → block"]
|
|
61
|
+
BLK["Blocos de conhecimento: edição proposta → review"]
|
|
62
|
+
TD["Test Dev / pedido de validação → validation"]
|
|
63
|
+
PING["operator-ping: pergunta @operator → question/approval"]
|
|
64
|
+
end
|
|
65
|
+
PL & PO & RUN & GH & DEP & BLK & TD & PING --> PUSH["pushInbox() → inbox_item"]
|
|
66
|
+
PUSH -->|dedup por refType+refId| TABLE[("tabela inbox_item")]
|
|
67
|
+
TABLE --> UI["🛰️ Página da Inbox + Hub da home"]
|
|
68
|
+
UI -->|ação primária| ACT["approvePlan / approveSpec / approveIssue / abrir tela"]
|
|
69
|
+
ACT --> RES["resolveInbox(id)"]
|
|
70
|
+
ACTELSE["Ação tomada em outro lugar<br/>(aprovar no Planner, goal cancelado,<br/>task se recupera)"] --> AUTORES["resolveInboxFor / RefTypes / ForGoal"]
|
|
71
|
+
RES --> TABLE
|
|
72
|
+
AUTORES --> TABLE
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Conceitos-chave 🪐
|
|
78
|
+
|
|
79
|
+
### Tipos de item (kinds)
|
|
80
|
+
|
|
81
|
+
O enum `kind` (`inbox_item.kind`) é a categoria do item. Ele determina o ícone e o rótulo localizado.
|
|
82
|
+
|
|
83
|
+
| `kind` | Significado | Produtor típico | Ícone |
|
|
84
|
+
| --- | --- | --- | --- |
|
|
85
|
+
| `approval` | Um plano ou um pedido de agente precisa do seu aval antes de o trabalho prosseguir | planner-core (plano pronto), operator-ping (frase de aprovação) | `check` |
|
|
86
|
+
| `review` | Algo para revisar: rejeição de spec/issue, decisão de arquitetura, review retido, edição de bloco da KB, relatório de duplicata/lacuna, atualização disponível | planner (rejeitar spec/issue), runner (decisão arch, review retido), blocks (proposta), planner (grooming do PO) | `doc` |
|
|
87
|
+
| `block` | Uma execução está bloqueada e precisa que você desbloqueie | runner (dev server quebrado, goal bloqueado, comando barrado pelo guard), GitHub (commit/push rejeitado), prep de deploy (risco de segredo), file locks | `close` |
|
|
88
|
+
| `budget` | Um agente pausou no teto diário de gasto | runner | `coins` |
|
|
89
|
+
| `validation` | Uma feature precisa que você a valide (Test Dev / manual) | test-dev-actions (`requestValidation`), runner (Test Dev falhou) | `pulse` |
|
|
90
|
+
| `question` | Uma pergunta `@operator` simples que precisa de resposta | operator-ping | `chat` |
|
|
91
|
+
|
|
92
|
+
### Referência (`refType` + `refId`)
|
|
93
|
+
|
|
94
|
+
`refType` diz *que tipo de coisa* a decisão envolve; `refId` é o id concreto (ou uma chave sintética). Juntos eles permitem que a Inbox **execute a ação real** e **auto-resolva** quando tratada em outro lugar.
|
|
95
|
+
|
|
96
|
+
| `refType` | exemplo de `refId` | Ação primária na UI |
|
|
97
|
+
| --- | --- | --- |
|
|
98
|
+
| `plan` | o **id do workspace** (o plano é singleton por workspace) | **Aprovar plano** → `approvePlan()` |
|
|
99
|
+
| `spec` | id da linha de spec | **Aprovar spec** → `approveSpec(refId)` |
|
|
100
|
+
| `issue` | id da linha de issue | **Aprovar issue** → `approveIssue(refId)` |
|
|
101
|
+
| `task` | id da task, ou chave sintética como `lock:<path>`, `commit-<origin>`, `budget:<id>`, `arch:<taskId>` | **Abrir tarefas** (`/tasks`) |
|
|
102
|
+
| `validation` | chave da issue, id de proposta de bloco, id do gate do Test Dev | **Abrir Test Dev** (`/test-dev`) |
|
|
103
|
+
| `question` | o `messageId` do chat | **Abrir chat** (pula para a DM ou alterna o painel de chat) |
|
|
104
|
+
| `goal` | id do goal | (usado por `resolveInboxForGoal`) |
|
|
105
|
+
|
|
106
|
+
> Nota: `InboxRefType` em `src/server/inbox.ts` enumera `plan | spec | issue | task | validation | question | goal`. A coluna em si é um `text("ref_type")` de texto livre, então chaves sintéticas (ex.: `arch:<taskId>`) viajam sobre `refType: "task"`.
|
|
107
|
+
|
|
108
|
+
### Outras colunas
|
|
109
|
+
|
|
110
|
+
| Coluna | Propósito |
|
|
111
|
+
| --- | --- |
|
|
112
|
+
| `fromAgentId` | qual agente levantou o item (define o avatar + "de {name}") |
|
|
113
|
+
| `goalId` | o goal a que pertence — permite que um cancelar/arquivar limpe todos os itens relacionados |
|
|
114
|
+
| `channel` | alvo de salto para itens ligados ao chat (ex.: `dm:<handle>`) |
|
|
115
|
+
| `messageId` | a mensagem de chat de origem (para itens `question`) |
|
|
116
|
+
| `resolved` | `false` = ainda exige ação; `true` = tratado/dispensado |
|
|
117
|
+
| `createdAt` | timestamp; atualizado no dedup |
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Produtores — o que aparece na Inbox 🌠
|
|
122
|
+
|
|
123
|
+
Cada chamada `pushInbox` no código, agrupada por origem:
|
|
124
|
+
|
|
125
|
+
| Arquivo de origem | Quando | `kind` | `refType` |
|
|
126
|
+
| --- | --- | --- | --- |
|
|
127
|
+
| `server/planner-core.ts` | Ada terminou de rascunhar um plano; precisa de aprovação antes de o código rodar | `approval` | `plan` |
|
|
128
|
+
| `server/planner.ts` | Uma spec foi **rejeitada** — o autor deve revisar | `review` | `spec` |
|
|
129
|
+
| `server/planner.ts` | Uma issue foi **rejeitada** — o responsável deve revisar | `review` | `issue` |
|
|
130
|
+
| `server/planner.ts` (`groomBacklogFor`) | O grooming do PO sinalizou **duplicatas / lacunas** | `review` | _(nenhum)_ |
|
|
131
|
+
| `server/runner.ts` | Agente **atingiu o teto diário de orçamento** e pausou | `budget` | `task` (`budget:<agentId>`) |
|
|
132
|
+
| `server/runner.ts` | Capturou uma decisão de **arquitetura / regra de negócio** | `review` | `task` (`arch:<taskId>`) |
|
|
133
|
+
| `server/runner.ts` | Uma task **quebrou o dev server** (gate de boot) | `block` | `task` |
|
|
134
|
+
| `server/runner.ts` | Uma task **falhou no Test Dev** | `validation` | `validation` |
|
|
135
|
+
| `server/runner.ts` | Uma task ficou **retida em review** com findings de alta severidade | `review` | `task` |
|
|
136
|
+
| `server/runner.ts` | Uma execução **bloqueou — precisa de você** (run falhou) | `block` | `task` |
|
|
137
|
+
| `server/runner.ts` | O guard de segurança **bloqueou comandos destrutivos** | `block` | `task` (`guard:<taskId>`) |
|
|
138
|
+
| `server/runner.ts` | Uma nova **versão do Constella** está disponível | `review` | `task` (`update:<latest>`) |
|
|
139
|
+
| `server/github.ts` | **Commit bloqueado** — risco de segredo no change set | `block` | `task` (`commit-<origin>`) |
|
|
140
|
+
| `server/github.ts` | **Push rejeitado** — conflito remoto / non-fast-forward | `block` | `task` (`push:<repo>:<branch>`) |
|
|
141
|
+
| `server/prepare-deploy.ts` | **Prep bloqueado** — risco de segredo | `block` | `task` (`deploy-prep`) |
|
|
142
|
+
| `server/prepare-deploy.ts` | **Export bloqueado** — risco de segredo | `block` | `task` (`export-<repo>`) |
|
|
143
|
+
| `server/blocks.ts` | Uma **edição de bloco de conhecimento** foi proposta | `review` | `validation` |
|
|
144
|
+
| `server/actions/test-dev-actions.ts` (`requestValidation`) | Um agente/operador pede que você **valide uma feature** | `validation` | `validation` |
|
|
145
|
+
| `server/dashboard.ts` | Um **lock de arquivo** está retido por uma execução viva | `block` | `task` (`lock-<path>`) |
|
|
146
|
+
| `app/api/locks/acquire/route.ts` | **Contenção de arquivo** — um agente está bloqueado editando um arquivo travado | `block` | `task` (`lock:<path>`) |
|
|
147
|
+
| `server/operator-ping.ts` | Uma mensagem de agente **se dirige a você** (`@operator`) | `approval` (se for frase de aprovação) ou `question` | `question` |
|
|
148
|
+
|
|
149
|
+
A maioria dos produtores também chama `notifyOps` (um toast/notificação transitório) junto do `pushInbox` (a decisão persistente). A Inbox é o registro durável; as notificações são o cutucão.
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Consumindo a Inbox — a UI
|
|
154
|
+
|
|
155
|
+
### A página completa da Inbox
|
|
156
|
+
|
|
157
|
+
`/inbox` (`src/app/(app)/inbox/page.tsx`) carrega **todos** os itens do workspace, ordena **não resolvidos primeiro, depois mais recentes primeiro**, e renderiza `InboxList`. O subtítulo do cabeçalho mostra a contagem de pendentes (`inbox.sub`). Cada linha mostra o ícone do kind, o título, uma sublinha (`kind · de {name} · <quando>`) e o avatar do agente que levantou, com um ponto de saúde.
|
|
158
|
+
|
|
159
|
+
Clicar numa linha abre um **overlay de detalhe** com o texto completo do detalhe e os botões:
|
|
160
|
+
|
|
161
|
+
- **Ação primária** — para um `refType` acionável, a decisão real é executada (`primaryFor` em `inbox-row.tsx`):
|
|
162
|
+
- `plan` → **Aprovar plano**
|
|
163
|
+
- `spec` → **Aprovar spec**
|
|
164
|
+
- `issue` → **Aprovar issue**
|
|
165
|
+
- `task` → **Abrir tarefas**
|
|
166
|
+
- `validation` → **Abrir Test Dev**
|
|
167
|
+
- `question` → **Abrir chat** (abre a DM se `channel` começa com `dm:`, senão alterna o painel de chat)
|
|
168
|
+
- **Dispensar** — resolve sem executar nada.
|
|
169
|
+
- **Reabrir** — para um item já resolvido, devolve `resolved` para `false`.
|
|
170
|
+
|
|
171
|
+
Depois que a ação primária roda, o item é sempre resolvido (`finally { resolveInbox(id, true) }`).
|
|
172
|
+
|
|
173
|
+
### O hub do dashboard
|
|
174
|
+
|
|
175
|
+
`homeDecisions` (`src/server/home.ts`) alimenta o card "Precisa da sua decisão" (`HomeInbox`). É uma fatia mais estreita: apenas itens **não resolvidos** de kind `approval | review | block | budget`, os 6 mais recentes. Aqui os botões são **Aprovar / Rejeitar** para `plan | spec | issue` (rejeitar usa `rejectSpec` / `rejectIssue`, que por sua vez registram um item de follow-up "Revisar…" do tipo review e abrem uma DM pré-preenchida para o autor). Qualquer outra coisa recai em abrir `/inbox`.
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Limpando itens — decaimento orbital 🕳️
|
|
180
|
+
|
|
181
|
+
Há dois sabores de limpeza.
|
|
182
|
+
|
|
183
|
+
### Manual — pelo operador
|
|
184
|
+
|
|
185
|
+
`resolveInbox(id, resolved = true)` em `src/server/actions/inbox-actions.ts` alterna `resolved` (escopado ao workspace) e revalida `/inbox`. É o que os botões **Dispensar / Reabrir** e toda ação primária chamam.
|
|
186
|
+
|
|
187
|
+
> ⚠️ **Existem dois `resolveInbox`.** `src/server/actions/inbox-actions.ts` **atualiza** `resolved` (reversível — você pode Reabrir). `src/server/modules.ts` tem um `resolveInbox(id)` diferente que **deleta** a linha de vez. A UI da Inbox (`inbox-row.tsx`, `home-inbox.tsx`) usa a versão de *actions*; `module-toggles.tsx` usa a de *modules* (delete). Trate a variante de modules como um delete definitivo.
|
|
188
|
+
|
|
189
|
+
### Automática — quando a decisão é tomada em outro lugar
|
|
190
|
+
|
|
191
|
+
Quatro helpers em `src/server/inbox.ts` resolvem itens para que a lista nunca mostre uma linha obsoleta:
|
|
192
|
+
|
|
193
|
+
| Helper | Resolve | Chamado por |
|
|
194
|
+
| --- | --- | --- |
|
|
195
|
+
| `resolveInboxFor(wsId, refType, refId)` | todo item não resolvido de um `(refType, refId)` | `plan-ops.ts` (aprovar/rejeitar plano), `planner.ts` (aprovar spec/issue), `blocks.ts` (merge/rejeitar proposta), `file-locks.ts` (lock liberado), `runner.ts` (task recuperada) |
|
|
196
|
+
| `resolveInboxRefTypes(wsId, refTypes[])` | todo item não resolvido dos ref types dados | `plan-ops.ts` — aprovar o plano limpa todos os itens de review por `spec`/`issue` de uma vez |
|
|
197
|
+
| `resolveInboxForGoal(wsId, goalId)` | todo item não resolvido ligado a um goal | `work-ops.ts` — cancelar / arquivar um goal limpa tudo relacionado |
|
|
198
|
+
| `resolveInbox(id)` (modules) | uma única linha, por **delete** | `module-toggles.tsx` |
|
|
199
|
+
|
|
200
|
+
Os quatro são **best-effort** e nunca lançam exceção — uma escrita/limpeza de inbox jamais pode quebrar o post do chat ou o passo do runner que a disparou.
|
|
201
|
+
|
|
202
|
+
```mermaid
|
|
203
|
+
sequenceDiagram
|
|
204
|
+
participant Ada as Ada (planner-core)
|
|
205
|
+
participant DB as inbox_item
|
|
206
|
+
participant Op as Operador
|
|
207
|
+
participant Plan as plan-ops
|
|
208
|
+
Ada->>DB: pushInbox(approval, refType=plan, refId=wsId)
|
|
209
|
+
Note over DB: dedup → uma linha "Aprovar plano"
|
|
210
|
+
Op->>Plan: aprova no Planner (/planner)
|
|
211
|
+
Plan->>DB: resolveInboxFor(plan, wsId)
|
|
212
|
+
Plan->>DB: resolveInboxRefTypes([spec, issue])
|
|
213
|
+
Note over DB: linha(s) resolved=true → Inbox esvazia
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## Passo a passo
|
|
219
|
+
|
|
220
|
+
### Aprovar um plano pela Inbox
|
|
221
|
+
|
|
222
|
+
1. Ada rascunha um plano → aparece um item `kind: "approval"`, `refType: "plan"` intitulado **"Approve plan — <workspace>"**.
|
|
223
|
+
2. Abra `/inbox`, clique na linha.
|
|
224
|
+
3. Aperte **Aprovar plano**. Isso roda `approvePlan()` (enfileira tasks, marca issues aprovadas, faz o grooming do backlog), e então resolve o item.
|
|
225
|
+
4. O item `plan` *e* todos os itens de review por `spec`/`issue` pendentes são limpos automaticamente (`resolveInboxRefTypes`).
|
|
226
|
+
|
|
227
|
+
### Tratar uma execução bloqueada
|
|
228
|
+
|
|
229
|
+
1. Uma execução bloqueia → aparece um item `kind: "block"`, `refType: "task"` (ex.: **"<KEY> broke the dev server"** ou **"Commit blocked — N secret risk(s)"**).
|
|
230
|
+
2. Abra a linha, leia o `detail` (ele carrega o erro de boot / a lista de segredos / o stderr).
|
|
231
|
+
3. Corrija a causa (ex.: resolva os segredos e re-rode com force no GitHub), ou **Abra tarefas** para inspecionar.
|
|
232
|
+
4. Quando a task se recupera, `runner.ts` chama `resolveInboxFor(ws.id, "task", t.id)` e o item limpa.
|
|
233
|
+
|
|
234
|
+
### Responder à pergunta de um agente
|
|
235
|
+
|
|
236
|
+
1. Um agente posta `@operator você confirma os tiers de preço?` → `operator-ping` registra um `kind: "question"` (ou `approval` se soa como pedido de aprovação), `refType: "question"`, com o `channel` + `messageId`.
|
|
237
|
+
2. Abra a linha, aperte **Abrir chat** — pula direto para aquela DM/canal.
|
|
238
|
+
3. Responda no chat. Dispense o item (perguntas não auto-resolvem por uma resposta).
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## Exemplos
|
|
243
|
+
|
|
244
|
+
Um item de teto de orçamento levantado pelo 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
|
+
Um item de review do grooming do PO (duplicatas + lacunas — `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
|
+
O item de aprovação de plano pronto (`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
|
+
## Estados possíveis
|
|
280
|
+
|
|
281
|
+
| Estado | Significado |
|
|
282
|
+
| --- | --- |
|
|
283
|
+
| **Não resolvido** (`resolved = false`) | Exige sua ação. Mostrado primeiro na lista, opacidade total, contado em `inbox.sub`. |
|
|
284
|
+
| **Resolvido** (`resolved = true`) | Tratado ou dispensado. Mostrado acinzentado + tachado, vai para o fim, oferece **Reabrir**. |
|
|
285
|
+
| **Atualizado** | Um acerto de dedup — título/detalhe/timestamp de um item não resolvido existente foram atualizados no lugar. |
|
|
286
|
+
| **Deletado** | Removido por completo via o `resolveInbox` de `modules.ts` (sem Reabrir). |
|
|
287
|
+
| **Vazio** | Nenhum item — a lista mostra "Tudo em dia 🎉" (`inbox.empty`). |
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Integrações relacionadas 🛰️
|
|
292
|
+
|
|
293
|
+
- **Planner / Plan-ops** — o maior produtor (aprovação de plano) e o maior auto-resolvedor (`/approve` limpa itens de plan + spec + issue). Veja [WORKFLOW](./WORKFLOW.md) e [GOALS_SPECS_ISSUES](./GOALS_SPECS_ISSUES.md).
|
|
294
|
+
- **Runner** — registra itens block/budget/validation/review à medida que as tasks executam. Veja [AGENTS](./AGENTS.md).
|
|
295
|
+
- **Telegram** — a mesma decisão de plano pronto é espelhada no seu celular com botões inline **Approve / Start execution / Review / Reject**; tocá-los roda o mesmo core compartilhado. Veja [TELEGRAM](./TELEGRAM.md).
|
|
296
|
+
- **GitHub** — bloqueios de commit/push caem aqui. Veja [GITHUB](./GITHUB.md).
|
|
297
|
+
- **Prepare Deploy / Export** — bloqueios de varredura de segredos caem aqui. Veja [PREPARE_DEPLOY](./PREPARE_DEPLOY.md) e [DEPLOY](./DEPLOY.md).
|
|
298
|
+
- **Test Dev** — gates falhos + pedidos de validação caem aqui. Veja [TEST_DEV](./TEST_DEV.md).
|
|
299
|
+
- **Knowledge** — propostas de edição de bloco caem aqui como itens `review`. Veja [SYNCED_BLOCKS](./SYNCED_BLOCKS.md) e [KB_RAG](./KB_RAG.md).
|
|
300
|
+
- **Update** — uma release disponível registra um item `review`. Veja [UPDATE](./UPDATE.md).
|
|
301
|
+
|
|
302
|
+
A Inbox também é exposta indiretamente pela API pública e pela superfície de chat: `/status` resume as contagens, enquanto `/approve`, `/reject`, `/pause`, `/run-247` agem sobre as mesmas decisões subjacentes. Veja [CHAT_COMMANDS](./CHAT_COMMANDS.md) e [PUBLIC_API](./PUBLIC_API.md).
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## Segurança
|
|
307
|
+
|
|
308
|
+
- **Isolamento por workspace** — toda leitura/escrita é escopada por `workspaceId`; `resolveInbox` filtra por `id` *e* `workspaceId`, então uma org nunca resolve o item de outra.
|
|
309
|
+
- **Sem segredos nos itens** — produtores que expõem findings de segredos (GitHub, prep de deploy) incluem apenas um **preview redatado** (`kind` + caminho truncado), nunca o valor do segredo. O texto de detalhe também tem o comprimento limitado (≈400–500 caracteres).
|
|
310
|
+
- **Server-only** — `inbox.ts` é `import "server-only"`; os itens são escritos por server actions confiáveis e pelo runner, nunca diretamente por um processo de agente dentro da jaula de FS.
|
|
311
|
+
- **Best-effort, não bloqueante** — uma escrita de inbox que falha registra log e retorna; não pode travar um post de chat nem uma execução.
|
|
312
|
+
|
|
313
|
+
Veja [SECURITY](./SECURITY.md) para detalhes de vault, scrub e jaula.
|
|
314
|
+
|
|
315
|
+
---
|
|
316
|
+
|
|
317
|
+
## Solução de problemas
|
|
318
|
+
|
|
319
|
+
| Sintoma | Causa provável | Correção |
|
|
320
|
+
| --- | --- | --- |
|
|
321
|
+
| Uma "decisão" nunca aparece na Inbox | O `notifyOps`/`pushInbox` do produtor rodou best-effort e engoliu um erro | Confira o console do worker/server por `[inbox] pushInbox failed` |
|
|
322
|
+
| Linhas que parecem duplicadas | Elas diferem em `(refType, refId)` — o dedup só colapsa uma combinação exata | Esperado; resolva cada uma |
|
|
323
|
+
| Um item resolvido não some do hub da Home | `homeDecisions` só mostra `approval/review/block/budget` e só não resolvidos — cache obsoleto | Atualize; a página revalida `/inbox` ao resolver |
|
|
324
|
+
| "Aprovar plano" não faz nada | Sem workspace/plano ativo, ou o plano já foi aprovado em outro lugar | O botão ainda resolve o item; reveja o Planner |
|
|
325
|
+
| Reabrir está ausente | O item foi removido pelo caminho de delete de `modules.ts`, não pelo de update de actions | Deletes são permanentes — o produtor precisa levantá-lo de novo |
|
|
326
|
+
| Itens antigos de task bloqueada persistem após a correção | A task se recuperou sem passar pelo caminho `resolveInboxFor` de `runner.ts` | Dispense manualmente, ou cancele/arquive o goal para limpar tudo relacionado |
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
|
|
330
|
+
## Links relacionados
|
|
331
|
+
|
|
332
|
+
- [WORKFLOW](./WORKFLOW.md) — o ciclo Goal → Spec → Issue → Plan → Execution que a Inbox controla.
|
|
333
|
+
- [GOALS_SPECS_ISSUES](./GOALS_SPECS_ISSUES.md) — o que é aprovado/rejeitado pela Inbox.
|
|
334
|
+
- [AGENTS](./AGENTS.md) — as constelações que levantam itens.
|
|
335
|
+
- [PO_AGENT](./PO_AGENT.md) — o grooming do Donald que sinaliza duplicatas e lacunas.
|
|
336
|
+
- [CHAT_COMMANDS](./CHAT_COMMANDS.md) — `/status`, `/approve`, `/reject` sobre as mesmas decisões.
|
|
337
|
+
- [DM](./DM.md) · [TEAM_ROOM](./TEAM_ROOM.md) — para onde os itens `question` pulam.
|
|
338
|
+
- [TELEGRAM](./TELEGRAM.md) — a Inbox no seu celular.
|
|
339
|
+
- [GITHUB](./GITHUB.md) · [PREPARE_DEPLOY](./PREPARE_DEPLOY.md) · [TEST_DEV](./TEST_DEV.md) — produtores de block/validation.
|
|
340
|
+
- [SECURITY](./SECURITY.md) · [TROUBLESHOOTING](./TROUBLESHOOTING.md) · [FAQ](./FAQ.md)
|