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,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: accessibility-wcag
|
|
3
|
+
description: Meeting WCAG 2.2 success criteria and applying ARIA Authoring Practices for accessible UI; consult when building or auditing component accessibility.
|
|
4
|
+
domain: engineering
|
|
5
|
+
category: frontend
|
|
6
|
+
tags: [accessibility, a11y, wcag, aria, w3c, wai]
|
|
7
|
+
official_sources:
|
|
8
|
+
- https://www.w3.org/WAI/WCAG22/quickref/
|
|
9
|
+
- https://www.w3.org/WAI/ARIA/apg/
|
|
10
|
+
- https://github.com/w3c/wcag
|
|
11
|
+
verified: 2026-06-16
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Accessibility (WCAG 2.2 & ARIA)
|
|
15
|
+
|
|
16
|
+
## Overview
|
|
17
|
+
WCAG (Web Content Accessibility Guidelines) is the W3C standard defining how to make web content accessible; the ARIA Authoring Practices Guide (APG) shows how to build accessible widgets with ARIA roles, states, and keyboard support. Read this when implementing interactive components, choosing semantics, or auditing a UI for conformance.
|
|
18
|
+
|
|
19
|
+
## Official sources
|
|
20
|
+
- WCAG 2.2 Quick Reference (How to Meet WCAG): https://www.w3.org/WAI/WCAG22/quickref/
|
|
21
|
+
- ARIA Authoring Practices Guide (APG): https://www.w3.org/WAI/ARIA/apg/
|
|
22
|
+
- Repo: https://github.com/w3c/wcag
|
|
23
|
+
|
|
24
|
+
## Core concepts
|
|
25
|
+
- **POUR principles.** WCAG organizes success criteria under four principles: Perceivable, Operable, Understandable, and Robust (w3.org/WAI/WCAG22/quickref).
|
|
26
|
+
- **Conformance levels A / AA / AAA.** Each success criterion has a level; Level AA is the most commonly targeted baseline for sites and apps (w3.org/WAI/WCAG22/quickref).
|
|
27
|
+
- **Techniques and failures.** Each criterion links sufficient techniques (ways to satisfy it), advisory techniques, and documented common failures to avoid (w3.org/WAI/WCAG22/quickref).
|
|
28
|
+
- **Semantics first, ARIA second.** The APG covers ARIA roles, states, and properties for components that native HTML cannot express, but native HTML semantics are preferred where available (w3.org/WAI/ARIA/apg).
|
|
29
|
+
- **Keyboard support.** APG patterns specify the expected keyboard interaction for each widget so it is operable without a mouse (w3.org/WAI/ARIA/apg).
|
|
30
|
+
- **Landmark regions.** Use HTML sectioning elements and ARIA landmark roles to structure a page so assistive technology users can navigate it (w3.org/WAI/ARIA/apg/practices/landmark-regions).
|
|
31
|
+
- **Accessible name and description.** Elements must expose a name (and optional description) that assistive technology can announce (w3.org/WAI/ARIA/apg).
|
|
32
|
+
|
|
33
|
+
## Best practices
|
|
34
|
+
- Target Level AA across the four POUR principles and use the Quick Reference's filters to track which criteria apply to your technologies (w3.org/WAI/WCAG22/quickref).
|
|
35
|
+
- Reach for an established APG design pattern before inventing a custom widget; follow its required roles, states, and keyboard model exactly (w3.org/WAI/ARIA/apg).
|
|
36
|
+
- Provide a meaningful accessible name for every interactive control and a landmark structure for every page (w3.org/WAI/ARIA/apg).
|
|
37
|
+
- Validate against the sufficient techniques listed for each relevant success criterion rather than guessing (w3.org/WAI/WCAG22/quickref).
|
|
38
|
+
|
|
39
|
+
## Common pitfalls
|
|
40
|
+
- Adding ARIA roles to elements that already have native semantics → prefer the native HTML element; ARIA does not change behavior, only the exposed semantics (w3.org/WAI/ARIA/apg).
|
|
41
|
+
- Building a custom widget (menu, dialog, tabs) without keyboard support → implement the keyboard interaction the matching APG pattern specifies (w3.org/WAI/ARIA/apg).
|
|
42
|
+
|
|
43
|
+
## Examples
|
|
44
|
+
```html
|
|
45
|
+
<!-- Landmark + accessible name; native button needs no ARIA role. -->
|
|
46
|
+
<nav aria-label="Primary">
|
|
47
|
+
<button type="button">Menu</button>
|
|
48
|
+
</nav>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Further reading
|
|
52
|
+
- https://www.w3.org/WAI/ARIA/apg/patterns/ — full catalog of widget patterns
|
|
53
|
+
- https://www.w3.org/WAI/standards-guidelines/wcag/ — WCAG standards overview
|
|
54
|
+
|
|
55
|
+
## Related skills
|
|
56
|
+
- ../frontend-architecture — where accessible components fit in the UI tree
|
|
57
|
+
- ../state-management — managing widget state (open/selected) accessibly
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: frontend-architecture
|
|
3
|
+
description: Structuring component boundaries, data flow, and code-splitting in modern frontend apps; consult when designing or refactoring UI architecture.
|
|
4
|
+
domain: engineering
|
|
5
|
+
category: frontend
|
|
6
|
+
tags: [components, data-flow, code-splitting, react, architecture, lazy-loading]
|
|
7
|
+
official_sources:
|
|
8
|
+
- https://react.dev/learn
|
|
9
|
+
- https://www.patterns.dev/
|
|
10
|
+
- https://github.com/react/react
|
|
11
|
+
verified: 2026-06-16
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Frontend Architecture
|
|
15
|
+
|
|
16
|
+
## Overview
|
|
17
|
+
Frontend architecture is how you split a UI into components, decide where data lives and how it flows, and control what code ships to the browser and when. Good structure keeps features local, props predictable, and bundles small. Read this when starting a new app, drawing component boundaries, or addressing slow initial loads.
|
|
18
|
+
|
|
19
|
+
## Official sources
|
|
20
|
+
- Docs: https://react.dev/learn
|
|
21
|
+
- Patterns reference: https://www.patterns.dev/
|
|
22
|
+
- Repo: https://github.com/react/react
|
|
23
|
+
|
|
24
|
+
## Core concepts
|
|
25
|
+
- **Components compose top-down.** A React component is a function returning markup; you nest components and pass data via props, building UI from small reusable pieces (react.dev/learn).
|
|
26
|
+
- **One-way data flow.** Data flows down through props; child components do not mutate parent state directly, which makes data movement easy to trace (react.dev/learn).
|
|
27
|
+
- **Lifting state up.** When two siblings need the same data, move that state to their closest common parent and pass it down, rather than duplicating it (react.dev/learn/sharing-state-between-components).
|
|
28
|
+
- **Single source of truth.** State should not contain redundant or duplicated information; derive values during render instead of storing them (react.dev/learn/choosing-the-state-structure).
|
|
29
|
+
- **Code-splitting with lazy loading.** `lazy` defers loading a component's code until it first renders, reducing the initial bundle; it must be paired with `<Suspense>` (react.dev/reference/react/lazy).
|
|
30
|
+
- **Rendering / loading patterns.** patterns.dev catalogs reusable approaches such as bundle splitting, the PRPL pattern, and import-on-interaction to ship less JavaScript up front (patterns.dev).
|
|
31
|
+
|
|
32
|
+
## Best practices
|
|
33
|
+
- Push `'use client'` / interactive boundaries as deep into the tree as possible so static parts stay shippable and bundles stay small (react.dev/learn; patterns.dev performance patterns).
|
|
34
|
+
- Keep state minimal and derived data computed in render, avoiding state you would have to keep in sync (react.dev/learn/choosing-the-state-structure).
|
|
35
|
+
- Split routes and heavy, rarely-used components with `lazy` + `Suspense` so users only download what they need (react.dev/reference/react/lazy).
|
|
36
|
+
- Co-locate state with the components that use it, lifting it only as far up as required by shared consumers (react.dev/learn/sharing-state-between-components).
|
|
37
|
+
|
|
38
|
+
## Common pitfalls
|
|
39
|
+
- Declaring a `lazy` component inside another component → declare it at module level; nesting it resets state on every re-render (react.dev/reference/react/lazy).
|
|
40
|
+
- Storing redundant or duplicated state (e.g. a `fullName` alongside `firstName`/`lastName`) → compute it during render to avoid sync bugs (react.dev/learn/choosing-the-state-structure).
|
|
41
|
+
- Prop-drilling shared data through many layers → reconsider component boundaries or use context where appropriate (react.dev/learn/passing-data-deeply-with-context).
|
|
42
|
+
|
|
43
|
+
## Examples
|
|
44
|
+
```jsx
|
|
45
|
+
import { lazy, Suspense } from 'react';
|
|
46
|
+
|
|
47
|
+
// Module-level: code is split and loaded on first render.
|
|
48
|
+
const MarkdownPreview = lazy(() => import('./MarkdownPreview.js'));
|
|
49
|
+
|
|
50
|
+
export default function Editor() {
|
|
51
|
+
return (
|
|
52
|
+
<Suspense fallback={<Loading />}>
|
|
53
|
+
<MarkdownPreview />
|
|
54
|
+
</Suspense>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Further reading
|
|
60
|
+
- https://react.dev/learn/thinking-in-react — deriving component structure from a mockup
|
|
61
|
+
- https://www.patterns.dev/ — rendering, design, and performance patterns
|
|
62
|
+
|
|
63
|
+
## Related skills
|
|
64
|
+
- ../state-management — choosing where state lives
|
|
65
|
+
- ../rendering-strategies-ssr-csr — where components render
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rendering-strategies-ssr-csr
|
|
3
|
+
description: Trade-offs between SSR, CSR, static rendering, and streaming for web apps; consult when choosing where and when UI is rendered.
|
|
4
|
+
domain: engineering
|
|
5
|
+
category: frontend
|
|
6
|
+
tags: [ssr, csr, ssg, streaming, hydration, rendering, nextjs]
|
|
7
|
+
official_sources:
|
|
8
|
+
- https://web.dev/articles/rendering-on-the-web
|
|
9
|
+
- https://nextjs.org/docs/app/getting-started/server-and-client-components
|
|
10
|
+
- https://github.com/vercel/next.js
|
|
11
|
+
verified: 2026-06-16
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Rendering Strategies (SSR / CSR / Static / Streaming)
|
|
15
|
+
|
|
16
|
+
## Overview
|
|
17
|
+
Where and when you render HTML — on the server, in the browser, at build time, or progressively streamed — affects first paint, interactivity, and the amount of JavaScript shipped. There is no single best choice; each strategy trades time-to-first-byte, first contentful paint, and interactivity differently. Read this when picking a rendering approach for a page or framework, or diagnosing slow loads.
|
|
18
|
+
|
|
19
|
+
## Official sources
|
|
20
|
+
- Google web.dev — Rendering on the Web: https://web.dev/articles/rendering-on-the-web
|
|
21
|
+
- Next.js — Server and Client Components: https://nextjs.org/docs/app/getting-started/server-and-client-components
|
|
22
|
+
- Repo (Next.js): https://github.com/vercel/next.js
|
|
23
|
+
|
|
24
|
+
## Core concepts
|
|
25
|
+
- **Server-side rendering (SSR).** Render the app on the server and send HTML; this gives fast first contentful paint and ships less JavaScript, but server work can delay time-to-first-byte (web.dev/articles/rendering-on-the-web).
|
|
26
|
+
- **Client-side rendering (CSR).** Render in the browser with JavaScript modifying the DOM; large bundles can hurt interactivity (INP) (web.dev/articles/rendering-on-the-web).
|
|
27
|
+
- **Static rendering (SSG).** Generate HTML at build time, one file per URL, for fast FCP and low blocking time; struggles when URLs are unpredictable (web.dev/articles/rendering-on-the-web).
|
|
28
|
+
- **Hydration / rehydration.** Run client scripts to attach state and interactivity to server-rendered HTML; done poorly, a page can look interactive before it actually is (web.dev/articles/rendering-on-the-web).
|
|
29
|
+
- **Streaming SSR.** Send HTML in chunks the browser renders progressively, improving perceived load (web.dev/articles/rendering-on-the-web).
|
|
30
|
+
- **Server vs Client Components (Next.js).** Components default to the server for data fetching and smaller bundles; mark interactive ones with `'use client'`, and stream server-rendered chunks to the client (nextjs.org server-and-client-components).
|
|
31
|
+
|
|
32
|
+
## Best practices
|
|
33
|
+
- Measure where the bottleneck is (TTFB, FCP, INP) before choosing a strategy; the right answer depends on your content and audience (web.dev/articles/rendering-on-the-web).
|
|
34
|
+
- Prefer server rendering for data-fetching and secret access, keeping API keys off the client and reducing shipped JavaScript (nextjs.org server-and-client-components).
|
|
35
|
+
- Add `'use client'` to the smallest interactive components rather than large subtrees, so static parts stay server-rendered and bundles stay small (nextjs.org server-and-client-components).
|
|
36
|
+
- Use streaming with `<Suspense>` boundaries so a fast shell renders while slower, dynamic content streams in (nextjs.org server-and-client-components).
|
|
37
|
+
|
|
38
|
+
## Common pitfalls
|
|
39
|
+
- Shipping a large CSR bundle for content that could be static or server-rendered → use SSR/SSG to cut JavaScript and improve FCP (web.dev/articles/rendering-on-the-web).
|
|
40
|
+
- Marking large subtrees `'use client'` → every import in that file joins the client bundle; scope the directive to the interactive leaf (nextjs.org server-and-client-components).
|
|
41
|
+
|
|
42
|
+
## Examples
|
|
43
|
+
```tsx
|
|
44
|
+
// Next.js App Router: Server Component fetches data; only the leaf is a Client Component.
|
|
45
|
+
import LikeButton from './like-button'; // 'use client' lives in this file
|
|
46
|
+
|
|
47
|
+
export default async function Page({ params }: { params: Promise<{ id: string }> }) {
|
|
48
|
+
const { id } = await params;
|
|
49
|
+
const post = await getPost(id); // runs on the server
|
|
50
|
+
return <article><h1>{post.title}</h1><LikeButton likes={post.likes} /></article>;
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Further reading
|
|
55
|
+
- https://web.dev/articles/rendering-on-the-web — full SSR/CSR/static/streaming trade-off guide
|
|
56
|
+
- https://nextjs.org/docs/app/getting-started — Next.js App Router fundamentals
|
|
57
|
+
|
|
58
|
+
## Related skills
|
|
59
|
+
- ../frontend-architecture — code-splitting and component boundaries
|
|
60
|
+
- ../state-management — hydrating and managing state across the server/client boundary
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: state-management
|
|
3
|
+
description: Choosing between local UI state, server/async state, and global state in React apps; consult when deciding where data should live and how it updates.
|
|
4
|
+
domain: engineering
|
|
5
|
+
category: frontend
|
|
6
|
+
tags: [state, react, tanstack-query, server-state, context, reducers]
|
|
7
|
+
official_sources:
|
|
8
|
+
- https://react.dev/learn/managing-state
|
|
9
|
+
- https://tanstack.com/query/latest
|
|
10
|
+
- https://github.com/TanStack/query
|
|
11
|
+
verified: 2026-06-16
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# State Management
|
|
15
|
+
|
|
16
|
+
## Overview
|
|
17
|
+
Frontend state falls into distinct kinds: local UI state (a component's own data), server/async state (remote data that is cached and can go stale), and shared/global state across components. Picking the right tool for each avoids over-engineering and sync bugs. Read this when deciding where a piece of data should live or which library, if any, to introduce.
|
|
18
|
+
|
|
19
|
+
## Install / setup
|
|
20
|
+
TanStack Query (React) — install command copied verbatim from the official installation page (tanstack.com/query/latest/docs/framework/react/installation):
|
|
21
|
+
```bash
|
|
22
|
+
npm i @tanstack/react-query
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Official sources
|
|
26
|
+
- React state docs: https://react.dev/learn/managing-state
|
|
27
|
+
- TanStack Query docs: https://tanstack.com/query/latest
|
|
28
|
+
- Repo (TanStack Query): https://github.com/TanStack/query
|
|
29
|
+
|
|
30
|
+
## Core concepts
|
|
31
|
+
- **State drives the UI.** You describe UI as states and update state in response to input, letting React re-render rather than mutating the DOM imperatively (react.dev/learn/managing-state).
|
|
32
|
+
- **Keep state structure lean.** Avoid redundant or duplicated state; compute derived values during render (react.dev/learn/choosing-the-state-structure).
|
|
33
|
+
- **Lift state up to share it.** Move shared state to the closest common parent and pass it down via props (react.dev/learn/sharing-state-between-components).
|
|
34
|
+
- **Reducers for complex logic.** `useReducer` consolidates many related state updates into one reducer, keeping event handlers clean (react.dev/learn/extracting-state-logic-into-a-reducer).
|
|
35
|
+
- **Context for deep passing.** React context shares data deeply without prop-drilling and pairs with a reducer to scale up app state (react.dev/learn/scaling-up-with-reducer-and-context).
|
|
36
|
+
- **Server state is different.** TanStack Query treats remote data as something with a cache and lifecycle — fetched, shared, cached, refetched, and sometimes intentionally stale — distinct from client state (tanstack.com/query/latest).
|
|
37
|
+
|
|
38
|
+
## Best practices
|
|
39
|
+
- Default to local component state; only lift it up or introduce context when multiple components genuinely need it (react.dev/learn/managing-state).
|
|
40
|
+
- Use a dedicated server-state library like TanStack Query for fetching, caching, and synchronizing remote data instead of hand-rolling it in component state (tanstack.com/query/latest).
|
|
41
|
+
- Reach for `useReducer` once a component juggles several interrelated state transitions (react.dev/learn/extracting-state-logic-into-a-reducer).
|
|
42
|
+
- Don't store derived data in state — recompute it in render to prevent it from drifting out of sync (react.dev/learn/choosing-the-state-structure).
|
|
43
|
+
|
|
44
|
+
## Common pitfalls
|
|
45
|
+
- Caching server data in `useState`/context and manually refetching → use TanStack Query, which gives async data a cache and lifecycle (tanstack.com/query/latest).
|
|
46
|
+
- Duplicating one source of truth across components → lift it to a common parent or context so there is a single owner (react.dev/learn/sharing-state-between-components).
|
|
47
|
+
|
|
48
|
+
## Examples
|
|
49
|
+
```jsx
|
|
50
|
+
import { useQuery } from '@tanstack/react-query';
|
|
51
|
+
|
|
52
|
+
function Todos() {
|
|
53
|
+
const { data, isPending, error } = useQuery({
|
|
54
|
+
queryKey: ['todos'],
|
|
55
|
+
queryFn: () => fetch('/api/todos').then((r) => r.json()),
|
|
56
|
+
});
|
|
57
|
+
if (isPending) return <p>Loading…</p>;
|
|
58
|
+
if (error) return <p>Failed to load</p>;
|
|
59
|
+
return <ul>{data.map((t) => <li key={t.id}>{t.title}</li>)}</ul>;
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Further reading
|
|
64
|
+
- https://react.dev/learn/choosing-the-state-structure — principles for shaping state
|
|
65
|
+
- https://tanstack.com/query/latest/docs — caching, mutations, and invalidation
|
|
66
|
+
|
|
67
|
+
## Related skills
|
|
68
|
+
- ../frontend-architecture — component boundaries and data flow
|
|
69
|
+
- ../rendering-strategies-ssr-csr — where state is hydrated and rendered
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: backend-performance
|
|
3
|
+
description: Design resilient, high-throughput backends — timeouts, retries with backoff, connection pooling, concurrency limits, and avoiding N+1 queries.
|
|
4
|
+
domain: engineering
|
|
5
|
+
category: performance
|
|
6
|
+
tags: [backend, concurrency, timeouts, retries, connection-pool, n+1, scalability]
|
|
7
|
+
official_sources:
|
|
8
|
+
- https://aws.amazon.com/builders-library/
|
|
9
|
+
- https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/
|
|
10
|
+
verified: 2026-06-16
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Backend Performance
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
Backend performance is about sustaining throughput and low latency under real load and partial failure, not just making a single request fast. This skill covers concurrency control, connection management, retry/timeout discipline, and data-access patterns (especially the N+1 problem), grounded in the Amazon Builders' Library and SQL indexing literature. Read it when designing services that must stay responsive under contention or overload.
|
|
17
|
+
|
|
18
|
+
## Official sources
|
|
19
|
+
- Amazon Builders' Library (hub): https://aws.amazon.com/builders-library/
|
|
20
|
+
- Timeouts, retries, backoff with jitter: https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/
|
|
21
|
+
- Avoiding fallback in distributed systems: https://aws.amazon.com/builders-library/avoiding-fallback-in-distributed-systems/
|
|
22
|
+
- SQL indexing / N+1 background: https://use-the-index-luke.com/
|
|
23
|
+
|
|
24
|
+
## Core concepts
|
|
25
|
+
- **Timeouts bound waiting.** Every remote call needs a timeout; the Builders' Library recommends setting it from downstream latency metrics (e.g. a high percentile like p99.9) so legitimate slow requests are tolerated but stuck calls fail fast.
|
|
26
|
+
- **Retries are "selfish."** Per AWS, retries consume extra server resources and amplify load during overload; they help transient failures but can turn a brownout into an outage if applied blindly.
|
|
27
|
+
- **Exponential backoff with jitter.** Spacing retries exponentially and adding randomness prevents synchronized "retry storms" where all clients hammer a recovering service at once.
|
|
28
|
+
- **Connection pooling.** Reusing a bounded pool of connections (DB, HTTP) avoids per-request handshake cost and caps concurrency against downstreams; pool size is itself a concurrency limit.
|
|
29
|
+
- **Concurrency limits / load shedding.** Bounding in-flight work and shedding excess load keeps latency stable; unbounded concurrency causes queue buildup and cascading latency under load.
|
|
30
|
+
- **The N+1 query problem.** Fetching a list then issuing one query per item (1 + N) multiplies round-trips and table accesses; batch or join instead. use-the-index-luke explains how scattered per-row table access makes even indexed lookups slow.
|
|
31
|
+
- **Avoid fallbacks as the happy path.** AWS argues fallback code is rarely exercised, hard to test, and often amplifies failures; prefer strengthening the primary path and letting callers retry.
|
|
32
|
+
|
|
33
|
+
## Best practices
|
|
34
|
+
- **Set timeouts everywhere and tune from data.** Derive timeout values from observed downstream latency percentiles rather than guessing; a missing timeout is an unbounded resource leak.
|
|
35
|
+
- **Retry only transient/idempotent operations, with capped exponential backoff and jitter.** Add a retry budget/circuit breaker so retries cannot dominate traffic during incidents.
|
|
36
|
+
- **Bound concurrency explicitly.** Size connection pools and worker concurrency to the downstream's capacity; shed or queue with limits instead of accepting unbounded work.
|
|
37
|
+
- **Eliminate N+1 access.** Batch loads (join, `IN (...)`, or a dataloader) so a list view is O(1)–O(2) queries, not O(N); verify with query-count assertions in tests.
|
|
38
|
+
- **Make work cancelable and propagate deadlines.** Pass a deadline/cancellation token down the call chain so a client timeout actually stops downstream work.
|
|
39
|
+
|
|
40
|
+
## Common pitfalls
|
|
41
|
+
- **No timeout on a remote call** → one slow dependency exhausts threads/connections; always bound the wait and fail fast.
|
|
42
|
+
- **Naive immediate retries** → synchronized retry storms re-create the congestion that caused the failure; use exponential backoff with jitter and a retry budget.
|
|
43
|
+
- **Hidden N+1 from lazy ORM relations** → looping over a collection triggers a query per element; eager-load or batch and assert query counts.
|
|
44
|
+
- **Treating fallback paths as safe** → seldom-exercised fallbacks fail when finally triggered; per AWS, exercise them continuously or remove them and rely on retries.
|
|
45
|
+
|
|
46
|
+
## Examples
|
|
47
|
+
```python
|
|
48
|
+
# Capped exponential backoff with full jitter for an idempotent call
|
|
49
|
+
import random, time
|
|
50
|
+
|
|
51
|
+
def call_with_retry(do, *, attempts=5, base=0.05, cap=2.0, timeout=1.0):
|
|
52
|
+
for attempt in range(attempts):
|
|
53
|
+
try:
|
|
54
|
+
return do(timeout=timeout) # always bound the wait
|
|
55
|
+
except TransientError:
|
|
56
|
+
if attempt == attempts - 1:
|
|
57
|
+
raise
|
|
58
|
+
backoff = min(cap, base * 2 ** attempt)
|
|
59
|
+
time.sleep(random.uniform(0, backoff)) # full jitter
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Further reading
|
|
63
|
+
- https://aws.amazon.com/builders-library/avoiding-fallback-in-distributed-systems/ — why fallbacks backfire
|
|
64
|
+
- https://aws.amazon.com/builders-library/ — operational excellence essays (load shedding, fairness, caching)
|
|
65
|
+
- ./reference.md — deeper patterns (loaded only when needed)
|
|
66
|
+
|
|
67
|
+
## Related skills
|
|
68
|
+
- ../database-query-optimization — fixing the queries behind N+1 and slow access
|
|
69
|
+
- ../profiling-and-benchmarking — locating the real bottleneck before tuning
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: database-query-optimization
|
|
3
|
+
description: Speed up SQL with proper indexing and EXPLAIN — read query plans, understand B-tree index lookups, and fix slow access paths.
|
|
4
|
+
domain: engineering
|
|
5
|
+
category: performance
|
|
6
|
+
tags: [sql, indexing, explain, query-plan, postgresql, b-tree, optimization]
|
|
7
|
+
official_sources:
|
|
8
|
+
- https://use-the-index-luke.com/
|
|
9
|
+
- https://www.postgresql.org/docs/current/using-explain.html
|
|
10
|
+
verified: 2026-06-16
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Database Query Optimization
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
Most SQL performance problems are access-path problems: the right index turns a full scan into a targeted lookup, and `EXPLAIN` reveals which path the planner actually chose. Read this when a query is slow, when adding indexes, or when you need to interpret a query plan rather than guess. Material is grounded in Markus Winand's "Use The Index, Luke" and the official PostgreSQL documentation.
|
|
17
|
+
|
|
18
|
+
## Official sources
|
|
19
|
+
- SQL indexing guide: https://use-the-index-luke.com/
|
|
20
|
+
- Why indexes can be slow: https://use-the-index-luke.com/sql/anatomy/slow-indexes
|
|
21
|
+
- PostgreSQL Using EXPLAIN: https://www.postgresql.org/docs/current/using-explain.html
|
|
22
|
+
- PostgreSQL source (mirror): https://github.com/postgres/postgres
|
|
23
|
+
|
|
24
|
+
## Core concepts
|
|
25
|
+
- **A B-tree index has structure.** An index is a balanced tree whose leaf nodes form a doubly linked list of sorted entries; a lookup does a tree traversal to the right leaf, then optionally follows the leaf chain.
|
|
26
|
+
- **An index lookup has three steps.** Per use-the-index-luke: tree traversal, following the leaf node chain, and accessing the table rows. The third step (one table access per matching row) is usually what makes an "indexed" query still slow.
|
|
27
|
+
- **Scan types map to those steps.** `INDEX UNIQUE SCAN` is tree traversal only; `INDEX RANGE SCAN` traverses and walks the leaf chain; `TABLE ACCESS BY INDEX ROWID` fetches the actual rows.
|
|
28
|
+
- **EXPLAIN shows the plan; ANALYZE runs it.** `EXPLAIN` prints the planner's chosen tree of nodes with estimated cost, rows, and width; `EXPLAIN ANALYZE` executes the query and reports actual time, row counts, and (with `BUFFERS`) buffer usage.
|
|
29
|
+
- **Cost estimates drive plan choice.** PostgreSQL estimates each node's cost from table statistics; bad statistics lead to bad plans (e.g. choosing a seq scan over an index, or vice versa).
|
|
30
|
+
- **Selectivity decides whether an index helps.** Indexes win when they select a small fraction of rows; for low-selectivity predicates a sequential scan can legitimately be faster than many scattered table accesses.
|
|
31
|
+
|
|
32
|
+
## Best practices
|
|
33
|
+
- **Index for the WHERE clause and join columns.** Create indexes that cover the predicates that filter rows; column order in a composite index matters because the tree is sorted left-to-right.
|
|
34
|
+
- **Read the actual plan, not your assumptions.** Use `EXPLAIN (ANALYZE, BUFFERS)` to compare estimated vs actual rows; a large gap signals stale statistics or a misjudged predicate.
|
|
35
|
+
- **Keep statistics fresh.** Ensure `ANALYZE`/autovacuum keeps planner statistics current so cost estimates stay accurate.
|
|
36
|
+
- **Prefer covering / index-only access for hot queries.** Include the selected columns in the index so the table-access step (the expensive third step) can be skipped where supported.
|
|
37
|
+
- **Avoid functions/wrapping on indexed columns in predicates.** Applying a function to a column (or an implicit cast) prevents the plain index from being used; index the expression instead if needed.
|
|
38
|
+
|
|
39
|
+
## Common pitfalls
|
|
40
|
+
- **"It has an index, so it's fast"** → an `INDEX RANGE SCAN` over many matches plus one table access per row can be slower than a scan; check selectivity and the plan.
|
|
41
|
+
- **Trusting estimated rows** → estimates can be wrong; `EXPLAIN ANALYZE` shows the real row counts and timing to confirm.
|
|
42
|
+
- **Wrong composite index column order** → a leading column that isn't in the predicate makes the index unusable for that filter; order columns by how they are queried.
|
|
43
|
+
- **Wrapping indexed columns in functions** → `WHERE lower(email) = ...` skips a plain index on `email`; create a matching expression index or store normalized values.
|
|
44
|
+
|
|
45
|
+
## Examples
|
|
46
|
+
```sql
|
|
47
|
+
-- Inspect the real plan, not just the estimate
|
|
48
|
+
EXPLAIN (ANALYZE, BUFFERS)
|
|
49
|
+
SELECT id, status
|
|
50
|
+
FROM orders
|
|
51
|
+
WHERE customer_id = 42 AND status = 'open';
|
|
52
|
+
|
|
53
|
+
-- Composite index ordered to match the predicate (equality columns first)
|
|
54
|
+
CREATE INDEX idx_orders_customer_status ON orders (customer_id, status);
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Further reading
|
|
58
|
+
- https://use-the-index-luke.com/sql/anatomy/slow-indexes — the three steps of a lookup in detail
|
|
59
|
+
- https://www.postgresql.org/docs/current/using-explain.html — full EXPLAIN/ANALYZE reference
|
|
60
|
+
- ./reference.md — join strategies and planner internals (loaded only when needed)
|
|
61
|
+
|
|
62
|
+
## Related skills
|
|
63
|
+
- ../backend-performance — eliminating N+1 access patterns that no index can fix
|
|
64
|
+
- ../profiling-and-benchmarking — measuring query latency before and after indexing
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: profiling-and-benchmarking
|
|
3
|
+
description: Measure before optimizing — use CPU/memory profilers and benchmarks to find real bottlenecks instead of guessing; covers Node.js and Chrome DevTools.
|
|
4
|
+
domain: engineering
|
|
5
|
+
category: performance
|
|
6
|
+
tags: [profiling, benchmarking, cpu-profile, flame-graph, nodejs, devtools, memory-leak]
|
|
7
|
+
official_sources:
|
|
8
|
+
- https://nodejs.org/en/learn/getting-started/profiling
|
|
9
|
+
- https://developer.chrome.com/docs/devtools/performance
|
|
10
|
+
verified: 2026-06-16
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Profiling and Benchmarking
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
The first rule of optimization is to measure: profilers tell you where time and memory actually go, and benchmarks confirm whether a change helped. This skill covers sampling profilers, flame graphs, and runtime/memory analysis using the built-in Node.js profiler and the Chrome DevTools Performance panel. Read it before optimizing anything, so effort lands on the real bottleneck.
|
|
17
|
+
|
|
18
|
+
## Official sources
|
|
19
|
+
- Node.js profiling guide: https://nodejs.org/en/learn/getting-started/profiling
|
|
20
|
+
- Chrome DevTools Performance panel: https://developer.chrome.com/docs/devtools/performance
|
|
21
|
+
- Chrome DevTools memory problems: https://developer.chrome.com/docs/devtools/memory-problems
|
|
22
|
+
- Node.js source (repo): https://github.com/nodejs/node
|
|
23
|
+
|
|
24
|
+
## Core concepts
|
|
25
|
+
- **Sampling profilers.** Node's `--prof` uses V8's built-in profiler to sample the call stack at intervals and record events as "ticks" in an `isolate-*.log`, processed with `--prof-process` into a human-readable summary.
|
|
26
|
+
- **Bottom-up vs summary views.** The processed tick output groups time by Summary, C++, and a bottom-up profile, letting you trace which functions and their callers dominate CPU time.
|
|
27
|
+
- **Flame graphs.** The DevTools Performance panel visualizes main-thread activity as a flame chart so you can spot wide (expensive) frames and long tasks.
|
|
28
|
+
- **Runtime vs load performance.** Per Chrome, runtime performance is how a page behaves while running (Response, Animation, Idle phases of the RAIL model), distinct from initial load.
|
|
29
|
+
- **Memory problem classes.** DevTools distinguishes memory leaks (steadily growing usage), memory bloat (using more than needed), and frequent garbage collection that pauses script execution.
|
|
30
|
+
- **Benchmark vs profile.** A benchmark measures aggregate throughput/latency of a change; a profile attributes cost within a run. Use benchmarks to decide *whether* something is faster and profiles to learn *why*.
|
|
31
|
+
|
|
32
|
+
## Best practices
|
|
33
|
+
- **Measure before and after, with a baseline.** Establish a repeatable benchmark first; otherwise you cannot tell whether an optimization helped or hurt.
|
|
34
|
+
- **Profile under production-like conditions.** Run Node profiling with `NODE_ENV=production` and realistic load, as the official guide demonstrates, so JIT and code paths match production.
|
|
35
|
+
- **Find the dominant cost, then optimize that.** The Node guide's example showed synchronous `pbkdf2` consuming ~51.8% of CPU; switching to the async version raised throughput from 5.33 to 19.46 req/s — fix the biggest frame first.
|
|
36
|
+
- **Use heap snapshots and the allocation timeline for leaks.** In DevTools, compare snapshots over time and watch for detached DOM nodes and steadily growing retained size.
|
|
37
|
+
- **Keep benchmarks isolated and warmed up.** Exclude setup, warm the JIT, and run enough iterations to get stable numbers before comparing.
|
|
38
|
+
|
|
39
|
+
## Common pitfalls
|
|
40
|
+
- **Optimizing by intuition** → developers routinely guess the wrong hotspot; always confirm with a profile before changing code.
|
|
41
|
+
- **Profiling a dev build or trivial workload** → results won't reflect production; profile production builds under representative load.
|
|
42
|
+
- **Reporting a single run as a benchmark** → variance and JIT warmup distort one-shot numbers; run multiple warmed iterations and compare distributions.
|
|
43
|
+
- **Confusing high GC frequency with a leak** → frequent GC may indicate excessive short-lived allocation (bloat), not retained memory; distinguish with the allocation timeline.
|
|
44
|
+
|
|
45
|
+
## Examples
|
|
46
|
+
```bash
|
|
47
|
+
# Node.js: capture a CPU profile, then turn it into a readable report
|
|
48
|
+
NODE_ENV=production node --prof app.js
|
|
49
|
+
# ...generate load against the app, then stop it
|
|
50
|
+
node --prof-process isolate-0xnnnnnnnnnnnn-v8.log > processed.txt
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Further reading
|
|
54
|
+
- https://developer.chrome.com/docs/devtools/memory-problems — diagnosing leaks, bloat, and GC churn
|
|
55
|
+
- https://nodejs.org/en/learn/getting-started/profiling — full Node.js profiling walkthrough
|
|
56
|
+
- ./reference.md — flame-graph reading and benchmark harness tips (loaded only when needed)
|
|
57
|
+
|
|
58
|
+
## Related skills
|
|
59
|
+
- ../backend-performance — what to do once a bottleneck is found server-side
|
|
60
|
+
- ../web-performance-core-vitals — field metrics that tell you what to profile on the front end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: web-performance-core-vitals
|
|
3
|
+
description: Measure and optimize Core Web Vitals (LCP, INP, CLS) for real-user front-end performance; consult when tuning page load and interactivity.
|
|
4
|
+
domain: engineering
|
|
5
|
+
category: performance
|
|
6
|
+
tags: [web-vitals, lcp, inp, cls, frontend, rum, performance]
|
|
7
|
+
official_sources:
|
|
8
|
+
- https://web.dev/articles/vitals
|
|
9
|
+
- https://github.com/GoogleChrome/web-vitals
|
|
10
|
+
verified: 2026-06-16
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Web Performance: Core Web Vitals
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
Core Web Vitals are the subset of Web Vitals that Google considers essential signals of real-user experience: loading (LCP), interactivity (INP), and visual stability (CLS). Read this when you need to measure page performance against objective field thresholds and prioritize fixes that affect actual users rather than synthetic lab scores alone.
|
|
17
|
+
|
|
18
|
+
## Official sources
|
|
19
|
+
- Docs: https://web.dev/articles/vitals
|
|
20
|
+
- Optimize LCP guide: https://web.dev/articles/optimize-lcp
|
|
21
|
+
- MDN performance hub: https://developer.mozilla.org/en-US/docs/Web/Performance
|
|
22
|
+
- Repo (measurement library): https://github.com/GoogleChrome/web-vitals
|
|
23
|
+
- Install / download: https://www.npmjs.com/package/web-vitals
|
|
24
|
+
|
|
25
|
+
## Install / setup
|
|
26
|
+
```bash
|
|
27
|
+
npm install web-vitals
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Core concepts
|
|
31
|
+
- **The three Core Web Vitals.** LCP (Largest Contentful Paint) measures loading, INP (Interaction to Next Paint) measures interactivity, and CLS (Cumulative Layout Shift) measures visual stability.
|
|
32
|
+
- **"Good" thresholds at the 75th percentile.** Per web.dev: LCP within 2.5 s, INP of 200 ms or less, CLS of 0.1 or less — assessed at the 75th percentile of page loads, split across mobile and desktop.
|
|
33
|
+
- **Field (RUM) vs lab data.** Core Web Vitals are defined against real-user (field) data such as the Chrome User Experience Report; lab tools like Lighthouse approximate but cannot replace field measurement.
|
|
34
|
+
- **LCP load breakdown.** web.dev decomposes LCP into time to first byte, resource load delay, resource load duration, and element render delay — optimizing LCP is largely about loading the LCP resource sooner and faster.
|
|
35
|
+
- **Layout shift scoring.** CLS sums layout shift scores (impact fraction x distance fraction) from unexpected shifts; shifts within 500 ms of user input are excluded.
|
|
36
|
+
- **Performance APIs.** Browsers expose timing via the Navigation Timing, Resource Timing, and Long Animation Frame APIs (see MDN), which the web-vitals library reads through `PerformanceObserver`.
|
|
37
|
+
|
|
38
|
+
## Best practices
|
|
39
|
+
- **Measure with the official library on real users.** Use `web-vitals` (`onLCP`, `onINP`, `onCLS`) with its `buffered` PerformanceObserver flag so metrics match Chrome's own reporting; send results to your analytics endpoint.
|
|
40
|
+
- **Make the LCP resource discoverable early.** Per the optimize-LCP guide, include it in the initial HTML, set appropriate `fetchpriority`, and avoid loading it via JavaScript that delays discovery.
|
|
41
|
+
- **Reserve space to prevent CLS.** Set explicit `width`/`height` (or `aspect-ratio`) on images and media, and avoid inserting content above existing content after load.
|
|
42
|
+
- **Reduce main-thread work for INP.** Break up long tasks and minimize JavaScript executed during interactions so the next paint after an input happens within 200 ms.
|
|
43
|
+
- **Cut TTFB.** Minimize redirects and serve cacheable HTML from CDN edge servers, since TTFB is the floor for LCP.
|
|
44
|
+
|
|
45
|
+
## Common pitfalls
|
|
46
|
+
- **Optimizing only lab scores** → Lighthouse is a lab approximation; ship against field/CrUX data because that is what Core Web Vitals are measured on.
|
|
47
|
+
- **Treating averages as the target** → thresholds are evaluated at the 75th percentile across devices; a good average can still fail at p75 on slow mobile.
|
|
48
|
+
- **Lazy-loading the LCP image** → deferring the largest above-the-fold element delays its load and inflates LCP; eager-load it instead.
|
|
49
|
+
- **Ignoring INP because FID looked fine** → INP replaced FID as a Core Web Vital and considers all interactions across the page lifecycle, not just the first input.
|
|
50
|
+
|
|
51
|
+
## Examples
|
|
52
|
+
```js
|
|
53
|
+
import { onLCP, onINP, onCLS } from 'web-vitals';
|
|
54
|
+
|
|
55
|
+
function send(metric) {
|
|
56
|
+
// metric: { name, value, rating, delta, id }
|
|
57
|
+
navigator.sendBeacon('/analytics', JSON.stringify(metric));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
onLCP(send);
|
|
61
|
+
onINP(send);
|
|
62
|
+
onCLS(send);
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Further reading
|
|
66
|
+
- https://web.dev/articles/optimize-lcp — optimizing LCP step by step
|
|
67
|
+
- https://web.dev/articles/cls — understanding and reducing layout shift
|
|
68
|
+
- https://developer.mozilla.org/en-US/docs/Web/Performance — MDN performance guides and APIs
|
|
69
|
+
|
|
70
|
+
## Related skills
|
|
71
|
+
- ../profiling-and-benchmarking — measuring before optimizing, browser profilers
|
|
72
|
+
- ../backend-performance — server-side TTFB and load handling that feeds LCP
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: clean-code
|
|
3
|
+
description: Writing readable, consistent code — naming, small focused functions, cohesion, and following a project style guide.
|
|
4
|
+
domain: engineering
|
|
5
|
+
category: practices
|
|
6
|
+
tags: [clean-code, readability, naming, style-guide, functions]
|
|
7
|
+
official_sources:
|
|
8
|
+
- https://google.github.io/styleguide/
|
|
9
|
+
- https://github.com/google/styleguide
|
|
10
|
+
verified: 2026-06-16
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Clean Code
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
Clean code is code optimized for the human reader, not just the compiler: clear names, small focused units, and a consistent style so a large codebase stays understandable as it grows. Consult this when naming things, splitting up large functions, or deciding which conventions to adopt for a project. The Google Style Guides are a concrete, widely-used reference for the "consistency" half of the problem.
|
|
17
|
+
|
|
18
|
+
## Official sources
|
|
19
|
+
- Docs: https://google.github.io/styleguide/
|
|
20
|
+
- Repo: https://github.com/google/styleguide
|
|
21
|
+
|
|
22
|
+
## Core concepts
|
|
23
|
+
- **Consistency beats personal preference.** As the Google Style Guides note, a large codebase is much easier to understand when all its code follows a single consistent style; the guide itself is "sometimes arbitrary" by design, because agreeing on *a* convention matters more than the convention.
|
|
24
|
+
- **A style guide is a set of conventions.** Each major project defines its own rules for formatting, naming, and structure (Google publishes per-language guides for C++, Java, Python, JavaScript, Go, and more).
|
|
25
|
+
- **Readable names.** Names should reveal intent so the reader does not have to trace the implementation to understand what a variable, function, or class is for.
|
|
26
|
+
- **Small, focused functions.** A function that does one thing at one level of abstraction is easier to name, test, and reuse than a long multi-purpose block.
|
|
27
|
+
- **Cohesion.** Group code that changes together; a class or module should have a single, clear responsibility rather than a grab-bag of unrelated behavior.
|
|
28
|
+
|
|
29
|
+
## Best practices
|
|
30
|
+
- **Adopt and enforce a style guide.** Pick an existing published guide (e.g. Google's per-language guide) rather than inventing one, and enforce it with a formatter/linter so style stops being a review topic.
|
|
31
|
+
- **Name for intent, not implementation.** Prefer descriptive names that a reviewer can understand without context (one of Google's stated code-review checks is whether names clearly communicate intent — see code-review-practices).
|
|
32
|
+
- **Keep functions short and single-purpose.** Extract sub-steps into well-named helpers so each function reads top-to-bottom at one level of abstraction.
|
|
33
|
+
- **Comment the "why", not the "what".** Use comments to explain rationale and non-obvious decisions; let clear names and structure express the "what".
|
|
34
|
+
|
|
35
|
+
## Common pitfalls
|
|
36
|
+
- **Bikeshedding over formatting in reviews** → automate formatting with a tool so humans review behavior and design, not whitespace.
|
|
37
|
+
- **One giant function / "god" class** → split by responsibility into smaller cohesive units; low cohesion makes change risky and testing hard.
|
|
38
|
+
- **Cryptic or misleading names** (`tmp`, `data2`, names that lie about behavior) → rename to reflect actual intent; a rename is a cheap, safe refactoring (see refactoring).
|
|
39
|
+
|
|
40
|
+
## Examples
|
|
41
|
+
```python
|
|
42
|
+
# Unclear: what is processed, and what comes back?
|
|
43
|
+
def proc(d):
|
|
44
|
+
r = []
|
|
45
|
+
for x in d:
|
|
46
|
+
if x[1] > 0:
|
|
47
|
+
r.append(x[0])
|
|
48
|
+
return r
|
|
49
|
+
|
|
50
|
+
# Clean: intent-revealing names, one job
|
|
51
|
+
def names_of_in_stock_products(products):
|
|
52
|
+
return [name for name, quantity in products if quantity > 0]
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Further reading
|
|
56
|
+
- Google C++ Style Guide: https://google.github.io/styleguide/cppguide.html
|
|
57
|
+
- Google Python Style Guide: https://google.github.io/styleguide/pyguide.html
|
|
58
|
+
|
|
59
|
+
## Related skills
|
|
60
|
+
- ../refactoring — how to safely improve unclean code
|
|
61
|
+
- ../code-review-practices — what reviewers check for, including naming and clarity
|