@stacksjs/defaults 0.70.207 → 0.70.208
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/TODO.md +21 -0
- package/ai/AGENTS.md +79 -0
- package/ai/README.md +45 -0
- package/ai/claude/launch.json +12 -0
- package/ai/skills/stacks-actions/SKILL.md +128 -0
- package/ai/skills/stacks-ai/SKILL.md +276 -0
- package/ai/skills/stacks-alias/SKILL.md +94 -0
- package/ai/skills/stacks-analytics/SKILL.md +91 -0
- package/ai/skills/stacks-api/SKILL.md +738 -0
- package/ai/skills/stacks-arrays/SKILL.md +277 -0
- package/ai/skills/stacks-auth/SKILL.md +422 -0
- package/ai/skills/stacks-auto-imports/SKILL.md +138 -0
- package/ai/skills/stacks-brandkit/SKILL.md +811 -0
- package/ai/skills/stacks-browse/SKILL.md +127 -0
- package/ai/skills/stacks-browse/scripts/browse.ts +492 -0
- package/ai/skills/stacks-browser/SKILL.md +145 -0
- package/ai/skills/stacks-buddy/SKILL.md +676 -0
- package/ai/skills/stacks-build/SKILL.md +163 -0
- package/ai/skills/stacks-cache/SKILL.md +125 -0
- package/ai/skills/stacks-calendar/SKILL.md +113 -0
- package/ai/skills/stacks-chat/SKILL.md +371 -0
- package/ai/skills/stacks-cli/SKILL.md +112 -0
- package/ai/skills/stacks-cloud/SKILL.md +192 -0
- package/ai/skills/stacks-cms/SKILL.md +217 -0
- package/ai/skills/stacks-collections/SKILL.md +82 -0
- package/ai/skills/stacks-commerce/SKILL.md +114 -0
- package/ai/skills/stacks-composables/SKILL.md +161 -0
- package/ai/skills/stacks-config/SKILL.md +144 -0
- package/ai/skills/stacks-configuration/SKILL.md +154 -0
- package/ai/skills/stacks-cron/SKILL.md +123 -0
- package/ai/skills/stacks-crosswind/SKILL.md +190 -0
- package/ai/skills/stacks-dashboard/SKILL.md +173 -0
- package/ai/skills/stacks-database/SKILL.md +286 -0
- package/ai/skills/stacks-datetime/SKILL.md +269 -0
- package/ai/skills/stacks-dependencies/SKILL.md +111 -0
- package/ai/skills/stacks-deploy/SKILL.md +102 -0
- package/ai/skills/stacks-design-brutalist/SKILL.md +110 -0
- package/ai/skills/stacks-design-minimalist/SKILL.md +115 -0
- package/ai/skills/stacks-design-output/SKILL.md +55 -0
- package/ai/skills/stacks-design-soft/SKILL.md +156 -0
- package/ai/skills/stacks-design-taste/SKILL.md +1012 -0
- package/ai/skills/stacks-design-taste-codex/SKILL.md +294 -0
- package/ai/skills/stacks-desktop/SKILL.md +78 -0
- package/ai/skills/stacks-development/SKILL.md +298 -0
- package/ai/skills/stacks-dns/SKILL.md +149 -0
- package/ai/skills/stacks-docs/SKILL.md +109 -0
- package/ai/skills/stacks-email/SKILL.md +236 -0
- package/ai/skills/stacks-enums/SKILL.md +100 -0
- package/ai/skills/stacks-env/SKILL.md +181 -0
- package/ai/skills/stacks-error-handling/SKILL.md +137 -0
- package/ai/skills/stacks-events/SKILL.md +228 -0
- package/ai/skills/stacks-faker/SKILL.md +158 -0
- package/ai/skills/stacks-git/SKILL.md +158 -0
- package/ai/skills/stacks-guard/SKILL.md +98 -0
- package/ai/skills/stacks-health/SKILL.md +75 -0
- package/ai/skills/stacks-http/SKILL.md +316 -0
- package/ai/skills/stacks-i18n/SKILL.md +198 -0
- package/ai/skills/stacks-image-to-code/SKILL.md +629 -0
- package/ai/skills/stacks-imagegen-mobile/SKILL.md +1474 -0
- package/ai/skills/stacks-imagegen-web/SKILL.md +998 -0
- package/ai/skills/stacks-investigate/SKILL.md +119 -0
- package/ai/skills/stacks-jobs/SKILL.md +136 -0
- package/ai/skills/stacks-lint/SKILL.md +184 -0
- package/ai/skills/stacks-listeners/SKILL.md +99 -0
- package/ai/skills/stacks-logging/SKILL.md +78 -0
- package/ai/skills/stacks-mail/SKILL.md +120 -0
- package/ai/skills/stacks-middleware/SKILL.md +249 -0
- package/ai/skills/stacks-migrations/SKILL.md +105 -0
- package/ai/skills/stacks-models/SKILL.md +267 -0
- package/ai/skills/stacks-new-feature/SKILL.md +206 -0
- package/ai/skills/stacks-notifications/SKILL.md +210 -0
- package/ai/skills/stacks-objects/SKILL.md +205 -0
- package/ai/skills/stacks-office-hours/SKILL.md +134 -0
- package/ai/skills/stacks-orm/SKILL.md +342 -0
- package/ai/skills/stacks-path/SKILL.md +118 -0
- package/ai/skills/stacks-payments/SKILL.md +373 -0
- package/ai/skills/stacks-plan-review/SKILL.md +152 -0
- package/ai/skills/stacks-plugins/SKILL.md +149 -0
- package/ai/skills/stacks-push/SKILL.md +376 -0
- package/ai/skills/stacks-query-builder/SKILL.md +128 -0
- package/ai/skills/stacks-queue/SKILL.md +559 -0
- package/ai/skills/stacks-realtime/SKILL.md +442 -0
- package/ai/skills/stacks-redesign/SKILL.md +182 -0
- package/ai/skills/stacks-registry/SKILL.md +58 -0
- package/ai/skills/stacks-repl/SKILL.md +80 -0
- package/ai/skills/stacks-retro/SKILL.md +122 -0
- package/ai/skills/stacks-review/SKILL.md +135 -0
- package/ai/skills/stacks-router/SKILL.md +231 -0
- package/ai/skills/stacks-routes/SKILL.md +105 -0
- package/ai/skills/stacks-scaffolding/SKILL.md +162 -0
- package/ai/skills/stacks-scheduler/SKILL.md +363 -0
- package/ai/skills/stacks-search-engine/SKILL.md +112 -0
- package/ai/skills/stacks-security/SKILL.md +129 -0
- package/ai/skills/stacks-security-audit/SKILL.md +128 -0
- package/ai/skills/stacks-server/SKILL.md +458 -0
- package/ai/skills/stacks-shell/SKILL.md +62 -0
- package/ai/skills/stacks-slug/SKILL.md +87 -0
- package/ai/skills/stacks-sms/SKILL.md +385 -0
- package/ai/skills/stacks-socials/SKILL.md +303 -0
- package/ai/skills/stacks-storage/SKILL.md +576 -0
- package/ai/skills/stacks-strings/SKILL.md +416 -0
- package/ai/skills/stacks-stx/SKILL.md +176 -0
- package/ai/skills/stacks-technical-diagrams/LICENSE +22 -0
- package/ai/skills/stacks-technical-diagrams/SKILL.md +290 -0
- package/ai/skills/stacks-technical-diagrams/agents/openai.yaml +4 -0
- package/ai/skills/stacks-technical-diagrams/assets/template.html +1252 -0
- package/ai/skills/stacks-technical-diagrams/bin/technical-diagrams.mjs +289 -0
- package/ai/skills/stacks-technical-diagrams/bunfig.toml +1 -0
- package/ai/skills/stacks-technical-diagrams/examples/agent-run.lifecycle.json +64 -0
- package/ai/skills/stacks-technical-diagrams/examples/agent-tool-call.workflow.json +88 -0
- package/ai/skills/stacks-technical-diagrams/examples/cache-miss-request.sequence.json +75 -0
- package/ai/skills/stacks-technical-diagrams/examples/product-analytics.dataflow.json +70 -0
- package/ai/skills/stacks-technical-diagrams/examples/web-app.architecture.json +41 -0
- package/ai/skills/stacks-technical-diagrams/renderers/architecture/grid.mjs +62 -0
- package/ai/skills/stacks-technical-diagrams/renderers/architecture/render-architecture.mjs +371 -0
- package/ai/skills/stacks-technical-diagrams/renderers/dataflow/README.md +82 -0
- package/ai/skills/stacks-technical-diagrams/renderers/dataflow/render-dataflow.mjs +295 -0
- package/ai/skills/stacks-technical-diagrams/renderers/lifecycle/README.md +91 -0
- package/ai/skills/stacks-technical-diagrams/renderers/lifecycle/render-lifecycle.mjs +384 -0
- package/ai/skills/stacks-technical-diagrams/renderers/sequence/README.md +84 -0
- package/ai/skills/stacks-technical-diagrams/renderers/sequence/render-sequence.mjs +257 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/cli.mjs +42 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/generated-validators.mjs +13 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/geometry.mjs +230 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/layout-report.mjs +40 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/utils.mjs +88 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/validator.mjs +40 -0
- package/ai/skills/stacks-technical-diagrams/renderers/workflow/README.md +103 -0
- package/ai/skills/stacks-technical-diagrams/renderers/workflow/render-workflow.mjs +481 -0
- package/ai/skills/stacks-technical-diagrams/schemas/README.md +68 -0
- package/ai/skills/stacks-technical-diagrams/schemas/architecture.schema.json +121 -0
- package/ai/skills/stacks-technical-diagrams/schemas/common.schema.json +43 -0
- package/ai/skills/stacks-technical-diagrams/schemas/dataflow.schema.json +221 -0
- package/ai/skills/stacks-technical-diagrams/schemas/lifecycle.schema.json +241 -0
- package/ai/skills/stacks-technical-diagrams/schemas/sequence.schema.json +186 -0
- package/ai/skills/stacks-technical-diagrams/schemas/workflow.schema.json +332 -0
- package/ai/skills/stacks-technical-diagrams/scripts/check-render-output.mjs +297 -0
- package/ai/skills/stacks-technical-diagrams/scripts/render-examples.mjs +28 -0
- package/ai/skills/stacks-testing/SKILL.md +129 -0
- package/ai/skills/stacks-tunnel/SKILL.md +125 -0
- package/ai/skills/stacks-types/SKILL.md +178 -0
- package/ai/skills/stacks-ui/SKILL.md +246 -0
- package/ai/skills/stacks-utils/SKILL.md +444 -0
- package/ai/skills/stacks-validation/SKILL.md +371 -0
- package/ai/skills/stacks-whois/SKILL.md +315 -0
- package/assets/world-map-data.ts +121 -0
- package/bootstrap.ts +114 -0
- package/docs/api-examples.md +46 -0
- package/docs/index.md +24 -0
- package/docs/markdown-examples.md +87 -0
- package/functions/analytics.ts +97 -0
- package/functions/api.ts +143 -0
- package/functions/auth.ts +208 -0
- package/functions/billing/payments.ts +149 -0
- package/functions/blog.ts +120 -0
- package/functions/cms/categorizables.ts +107 -0
- package/functions/cms/pages.ts +108 -0
- package/functions/cms/posts.ts +100 -0
- package/functions/cms/taggables.ts +102 -0
- package/functions/commerce/coupons.ts +128 -0
- package/functions/commerce/customers.ts +128 -0
- package/functions/commerce/gift-cards.ts +119 -0
- package/functions/commerce/orders.ts +112 -0
- package/functions/commerce/payments.ts +119 -0
- package/functions/commerce/products/categories.ts +123 -0
- package/functions/commerce/products/manufacturers.ts +123 -0
- package/functions/commerce/products/products.ts +123 -0
- package/functions/commerce/products/reviews.ts +123 -0
- package/functions/commerce/products/units.ts +123 -0
- package/functions/commerce/products/variants.ts +123 -0
- package/functions/commerce/shippings/delivery-routes.ts +123 -0
- package/functions/commerce/shippings/digital-deliveries.ts +119 -0
- package/functions/commerce/shippings/drivers.ts +123 -0
- package/functions/commerce/shippings/license-keys.ts +123 -0
- package/functions/commerce/shippings/shipping-methods.ts +123 -0
- package/functions/commerce/shippings/shipping-rates.ts +119 -0
- package/functions/commerce/shippings/shipping-zones.ts +119 -0
- package/functions/commerce/taxes.ts +119 -0
- package/functions/commerce/waitlist/products.ts +123 -0
- package/functions/commerce/waitlist/restaurants.ts +123 -0
- package/functions/craft.ts +107 -0
- package/functions/dashboard.ts +153 -0
- package/functions/inbox.ts +95 -0
- package/functions/jobs.ts +86 -0
- package/functions/monitoring/errors.ts +295 -0
- package/functions/queue.ts +111 -0
- package/functions/realtime/websockets.ts +96 -0
- package/functions/realtime.ts +52 -0
- package/functions/releases.ts +49 -0
- package/functions/search.ts +126 -0
- package/functions/toasts.ts +95 -0
- package/functions/uploads.ts +216 -0
- package/ide/.gitignore +4 -0
- package/ide/cursor/rules/auto-imports.mdc +574 -0
- package/ide/cursor/rules/code-style.mdc +12 -0
- package/ide/cursor/rules/documentation.mdc +9 -0
- package/ide/cursor/rules/error-handling-validation.mdc +11 -0
- package/ide/cursor/rules/key-conventions.mdc +11 -0
- package/ide/cursor/rules/project-structure.mdc +169 -0
- package/ide/cursor/rules/readme.mdc +318 -0
- package/ide/cursor/rules/syntax-formatting.mdc +9 -0
- package/ide/cursor/rules/testing.mdc +10 -0
- package/ide/cursor/rules/typescript.mdc +9 -0
- package/ide/cursor/rules/ui-styling.mdc +0 -0
- package/ide/dictionary.txt +397 -0
- package/ide/jetbrains/.fleet/settings.json +4 -0
- package/ide/jetbrains/.idea/.gitignore +5 -0
- package/ide/jetbrains/.idea/.name +1 -0
- package/ide/jetbrains/.idea/inspectionProfiles/Project_Default.xml +6 -0
- package/ide/jetbrains/.idea/jsLinters/eslint.xml +7 -0
- package/ide/jetbrains/.idea/modules.xml +8 -0
- package/ide/jetbrains/.idea/stacks.iml +22 -0
- package/ide/jetbrains/.idea/vcs.xml +6 -0
- package/ide/jetbrains/.idea/webResources.xml +14 -0
- package/ide/jetbrains/IntelliJ IDEA Global Settings +0 -0
- package/ide/jetbrains/installed.txt +4 -0
- package/ide/jetbrains/options/github-copilot.xml +5 -0
- package/ide/jetbrains/options/nodejs.xml +7 -0
- package/ide/jetbrains/options/templates.xml +124 -0
- package/ide/jetbrains/templates/JavaScript.xml +6 -0
- package/ide/jetbrains/templates/Stacks.xml +8 -0
- package/ide/vscode/.vscode/README.md +23 -0
- package/ide/vscode/.vscode/extensions.json +5 -0
- package/ide/vscode/.vscode/settings.json +176 -0
- package/ide/vscode/.vscode/stacks.code-snippets +181 -0
- package/ide/vscode/LICENSE.md +21 -0
- package/ide/vscode/README.md +36 -0
- package/ide/vscode/logo.png +0 -0
- package/ide/vscode/package.json +79 -0
- package/ide/zed/.zed/settings.json +139 -0
- package/lang/README.md +28 -0
- package/lang/de.yml +14 -0
- package/lang/en.yml +15 -0
- package/package.json +19 -3
- package/project/bootstrap +161 -0
- package/project/buddy +175 -0
- package/project/storage/framework/tsconfig.app.json +50 -0
- package/project/storage/framework/tsconfig.base.json +58 -0
- package/routes/core.ts +78 -0
- package/routes/dashboard-api.ts +233 -0
- package/routes/dashboard.ts +739 -0
- package/routes/email.ts +129 -0
- package/stores/[name].stx +16 -0
- package/stores/git.ts +71 -0
- package/stores/payment.ts +474 -0
- package/stores/queue.ts +43 -0
- package/stores/user.ts +29 -0
- package/stx-components-plugin.ts +25 -0
- package/styles/design-tokens.css +597 -0
- package/types/dashboard.ts +70 -0
- package/types/defaults.ts +438 -0
- package/vcs/github/CODE_OF_CONDUCT.md +83 -0
- package/vcs/github/CONTRIBUTING.md +187 -0
- package/vcs/github/EXPLANATIONS.md +41 -0
- package/vcs/github/FUNDING.yml +1 -0
- package/vcs/github/ISSUE_TEMPLATE/bug_report.yml +49 -0
- package/vcs/github/ISSUE_TEMPLATE/config.yml +10 -0
- package/vcs/github/ISSUE_TEMPLATE/feature_request.yml +44 -0
- package/vcs/github/SECURITY.md +70 -0
- package/vcs/github/renovate.json +5 -0
- package/vcs/github/stale.yml +14 -0
- package/vcs/github/workflows/README.md +16 -0
- package/vcs/github/workflows/ci.yml +114 -0
- package/vcs/github/workflows/export-size.yml +25 -0
- package/vcs/github/workflows/labeler.yml +13 -0
- package/vcs/github/workflows/release.yml +219 -0
- package/views/[...all].stx +8 -0
- package/views/about.md +3 -0
- package/views/auth/login.stx +1 -0
- package/views/auth/signup.stx +85 -0
- package/views/dashboard/.discovered-models.json +542 -0
- package/views/dashboard/AUDIT.md +904 -0
- package/views/dashboard/[...all].stx +89 -0
- package/views/dashboard/access-tokens/index.stx +177 -0
- package/views/dashboard/actions/index.stx +129 -0
- package/views/dashboard/analytics/blog/index.stx +356 -0
- package/views/dashboard/analytics/browsers/index.stx +263 -0
- package/views/dashboard/analytics/commerce/sales/index.stx +329 -0
- package/views/dashboard/analytics/commerce/web/index.stx +379 -0
- package/views/dashboard/analytics/countries/index.stx +289 -0
- package/views/dashboard/analytics/devices/index.stx +305 -0
- package/views/dashboard/analytics/events/index.stx +536 -0
- package/views/dashboard/analytics/index.stx +88 -0
- package/views/dashboard/analytics/marketing/index.stx +315 -0
- package/views/dashboard/analytics/pages/index.stx +271 -0
- package/views/dashboard/analytics/referrers/index.stx +319 -0
- package/views/dashboard/analytics/web/index.stx +356 -0
- package/views/dashboard/buddy/index.stx +198 -0
- package/views/dashboard/ci/index.stx +462 -0
- package/views/dashboard/cloud/index.stx +452 -0
- package/views/dashboard/commands/index.stx +295 -0
- package/views/dashboard/commerce/categories/index.stx +406 -0
- package/views/dashboard/commerce/coupons/index.stx +485 -0
- package/views/dashboard/commerce/customers/index.stx +410 -0
- package/views/dashboard/commerce/dashboard/index.stx +287 -0
- package/views/dashboard/commerce/delivery/delivery-routes.stx +305 -0
- package/views/dashboard/commerce/delivery/digital-delivery.stx +332 -0
- package/views/dashboard/commerce/delivery/drivers.stx +397 -0
- package/views/dashboard/commerce/delivery/index.stx +18 -0
- package/views/dashboard/commerce/delivery/license-keys.stx +380 -0
- package/views/dashboard/commerce/delivery/shipping-methods.stx +346 -0
- package/views/dashboard/commerce/delivery/shipping-rates.stx +338 -0
- package/views/dashboard/commerce/delivery/shipping-zones.stx +302 -0
- package/views/dashboard/commerce/delivery/tabs.ts +25 -0
- package/views/dashboard/commerce/gift-cards/index.stx +561 -0
- package/views/dashboard/commerce/manufacturers/index.stx +308 -0
- package/views/dashboard/commerce/orders/index.stx +247 -0
- package/views/dashboard/commerce/payments/index.stx +535 -0
- package/views/dashboard/commerce/pos/index.stx +653 -0
- package/views/dashboard/commerce/printers/devices/index.stx +273 -0
- package/views/dashboard/commerce/printers/receipts/index.stx +308 -0
- package/views/dashboard/commerce/products/detail.stx +563 -0
- package/views/dashboard/commerce/products/index.stx +370 -0
- package/views/dashboard/commerce/reviews/index.stx +656 -0
- package/views/dashboard/commerce/reviews/index.ts +0 -0
- package/views/dashboard/commerce/taxes/index.stx +377 -0
- package/views/dashboard/commerce/units/index.stx +317 -0
- package/views/dashboard/commerce/variants/index.stx +319 -0
- package/views/dashboard/commerce/waitlist/products.stx +942 -0
- package/views/dashboard/commerce/waitlist/restaurant.stx +1024 -0
- package/views/dashboard/components/index.stx +330 -0
- package/views/dashboard/composables/index.ts +19 -0
- package/views/dashboard/composables/useChart.ts +77 -0
- package/views/dashboard/composables/useNavigation.ts +99 -0
- package/views/dashboard/composables/useRole.ts +58 -0
- package/views/dashboard/composables/useTheme.ts +74 -0
- package/views/dashboard/content/authors/index.stx +171 -0
- package/views/dashboard/content/blog/index.stx +493 -0
- package/views/dashboard/content/categories/index.stx +169 -0
- package/views/dashboard/content/comments/index.stx +189 -0
- package/views/dashboard/content/dashboard.stx +383 -0
- package/views/dashboard/content/files/index.stx +706 -0
- package/views/dashboard/content/pages/index.stx +174 -0
- package/views/dashboard/content/posts/index.stx +269 -0
- package/views/dashboard/content/seo/index.stx +240 -0
- package/views/dashboard/content/tags/index.stx +167 -0
- package/views/dashboard/data/activity/index.stx +261 -0
- package/views/dashboard/data/dashboard/index.stx +116 -0
- package/views/dashboard/data/subscribers.stx +270 -0
- package/views/dashboard/data/teams.stx +275 -0
- package/views/dashboard/data/users.stx +279 -0
- package/views/dashboard/dependencies/index.stx +178 -0
- package/views/dashboard/deployments/[id].stx +234 -0
- package/views/dashboard/deployments/index.stx +9 -0
- package/views/dashboard/dns/index.stx +163 -0
- package/views/dashboard/environment/index.stx +283 -0
- package/views/dashboard/errors/index.stx +274 -0
- package/views/dashboard/forgot-password.stx +57 -0
- package/views/dashboard/functions/index.stx +159 -0
- package/views/dashboard/health/index.stx +248 -0
- package/views/dashboard/inbox/activity.stx +350 -0
- package/views/dashboard/inbox/index.stx +452 -0
- package/views/dashboard/inbox/settings.stx +290 -0
- package/views/dashboard/index.stx +252 -0
- package/views/dashboard/insights/index.stx +529 -0
- package/views/dashboard/jobs/[id].stx +430 -0
- package/views/dashboard/jobs/history.stx +222 -0
- package/views/dashboard/jobs/index.stx +214 -0
- package/views/dashboard/kanban/[id].stx +899 -0
- package/views/dashboard/kanban/index.stx +260 -0
- package/views/dashboard/layouts/default.stx +565 -0
- package/views/dashboard/layouts/guest.stx +10 -0
- package/views/dashboard/login.stx +48 -0
- package/views/dashboard/logs/index.stx +540 -0
- package/views/dashboard/mailboxes/index.stx +149 -0
- package/views/dashboard/management/permissions/index.stx +490 -0
- package/views/dashboard/marketing/campaigns/index.stx +604 -0
- package/views/dashboard/marketing/lists/index.stx +514 -0
- package/views/dashboard/marketing/reviews/index.stx +475 -0
- package/views/dashboard/marketing/social-posts/index.stx +560 -0
- package/views/dashboard/models/[model].stx +195 -0
- package/views/dashboard/models/index.stx +159 -0
- package/views/dashboard/monitoring/errors/index.stx +415 -0
- package/views/dashboard/notifications/dashboard.stx +383 -0
- package/views/dashboard/notifications/email.stx +336 -0
- package/views/dashboard/notifications/history.stx +373 -0
- package/views/dashboard/notifications/sms.stx +332 -0
- package/views/dashboard/packages/index.stx +195 -0
- package/views/dashboard/queries/[id].stx +381 -0
- package/views/dashboard/queries/history.stx +227 -0
- package/views/dashboard/queries/index.stx +335 -0
- package/views/dashboard/queries/slow.stx +318 -0
- package/views/dashboard/queue/index.stx +427 -0
- package/views/dashboard/realtime/index.stx +429 -0
- package/views/dashboard/register.stx +46 -0
- package/views/dashboard/releases/index.stx +389 -0
- package/views/dashboard/requests/index.stx +462 -0
- package/views/dashboard/serverless/index.stx +475 -0
- package/views/dashboard/servers/[id].stx +299 -0
- package/views/dashboard/servers/index.stx +483 -0
- package/views/dashboard/settings/billing.stx +50 -0
- package/views/dashboard/settings/index.stx +256 -0
- package/views/dashboard/settings/mail.stx +252 -0
- package/views/dashboard/stores/auth.ts +123 -0
- package/views/dashboard/stores/ci.ts +342 -0
- package/views/dashboard/stores/index.ts +129 -0
- package/views/dashboard/stores/kanban.ts +723 -0
- package/views/dashboard/stores/rbac.ts +350 -0
- package/views/dashboard/stx.config.ts +34 -0
- package/views/dashboard/teams/[id].stx +170 -0
- package/views/forum/category.stx +92 -0
- package/views/forum/index.stx +209 -0
- package/views/forum/new-topic.stx +113 -0
- package/views/forum/profile.stx +1 -0
- package/views/forum/topic.stx +143 -0
- package/views/hello-world/[name].stx +47 -0
- package/views/index.stx +21 -0
- package/views/system-tray/index.stx +147 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stacks-investigate
|
|
3
|
+
description: Use when debugging issues in the Stacks project — four-phase root-cause debugging with hypothesis testing and escalation. Enforces "no fixes without root cause." Invoke with /stacks-investigate.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Bun >= 1.3.0, TypeScript
|
|
6
|
+
allowed-tools: Read Edit Write Bash Grep Glob
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# /stacks-investigate — Root Cause Debugging
|
|
10
|
+
|
|
11
|
+
You are a systematic debugger for the Stacks framework. Find the **root cause**, not just make symptoms go away. No fixes until the root cause is confirmed.
|
|
12
|
+
|
|
13
|
+
## Phase 1: Investigate
|
|
14
|
+
|
|
15
|
+
Gather information. Do not form hypotheses yet.
|
|
16
|
+
|
|
17
|
+
1. **Understand the symptom**: What's happening vs. what should happen?
|
|
18
|
+
2. **Reproduce mentally**: Read code paths end-to-end. Trace data flow from input to failure point.
|
|
19
|
+
3. **Collect evidence**:
|
|
20
|
+
- Read error messages, stack traces, and logs (`storage/logs/stacks.log`)
|
|
21
|
+
- Check recent git history: `git log --oneline -20 -- [relevant files]`
|
|
22
|
+
- Check for related test failures: `bun test [relevant test file]`
|
|
23
|
+
- Check config files that affect the failing path (`config/*.ts`)
|
|
24
|
+
4. **Map blast radius**: What else touches this code? Use `grep` to find all callers.
|
|
25
|
+
|
|
26
|
+
For Stacks-specific issues, also check:
|
|
27
|
+
- ORM model definitions in `storage/framework/defaults/app/Models/`
|
|
28
|
+
- Route definitions in `routes/`
|
|
29
|
+
- Action handlers in `storage/framework/core/actions/src/`
|
|
30
|
+
- Middleware in `storage/framework/defaults/app/Middleware/`
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
## Investigation Summary
|
|
34
|
+
**Symptom**: [what's happening]
|
|
35
|
+
**Expected**: [what should happen]
|
|
36
|
+
**Affected code**: [file:line references]
|
|
37
|
+
**Recent changes**: [relevant commits]
|
|
38
|
+
**Blast radius**: [other code/features affected]
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Phase 2: Pattern Analysis
|
|
42
|
+
|
|
43
|
+
1. **When does it fail?** Always, or only under certain conditions? Environment-specific?
|
|
44
|
+
2. **Failure mode?** Crash / wrong result / hang / intermittent
|
|
45
|
+
3. **Where in the stack?**
|
|
46
|
+
- Framework issue (check `storage/framework/core/`)
|
|
47
|
+
- Application code issue (`app/`, `routes/`, `resources/`)
|
|
48
|
+
- Dependency issue (check `bun.lock` for version changes)
|
|
49
|
+
- Configuration issue (`config/*.ts`)
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
## Pattern Analysis
|
|
53
|
+
**Failure type**: [crash / wrong result / hang / intermittent]
|
|
54
|
+
**Consistency**: [always / conditional / intermittent]
|
|
55
|
+
**Layer**: [framework / application / dependency / config]
|
|
56
|
+
**Key observation**: [most important pattern]
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Phase 3: Hypothesis Testing
|
|
60
|
+
|
|
61
|
+
Form up to 3 hypotheses, ranked by likelihood.
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
### Hypothesis 1 (most likely): [title]
|
|
65
|
+
**Claim**: [specific root cause]
|
|
66
|
+
**Prediction**: [observable if true]
|
|
67
|
+
**Test**: [how to verify]
|
|
68
|
+
**Result**: ✅ Confirmed / ❌ Refuted / ⚠️ Inconclusive
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Escalation Rule
|
|
72
|
+
|
|
73
|
+
If all 3 hypotheses refuted:
|
|
74
|
+
1. **Stop and reassess.** Don't generate more hypotheses in a loop.
|
|
75
|
+
2. Present what you've ruled out.
|
|
76
|
+
3. Ask for additional context.
|
|
77
|
+
4. If still stuck after second round, recommend:
|
|
78
|
+
- Add targeted logging with `log.debug()` from `@stacksjs/logging`
|
|
79
|
+
- Write a minimal reproduction case
|
|
80
|
+
- Run `buddy doctor` for system diagnostics
|
|
81
|
+
|
|
82
|
+
**Never apply a fix just to "see if it helps."**
|
|
83
|
+
|
|
84
|
+
## Phase 4: Implementation
|
|
85
|
+
|
|
86
|
+
Only enter when a hypothesis is confirmed.
|
|
87
|
+
|
|
88
|
+
1. **Explain the root cause** in plain language
|
|
89
|
+
2. **Show the minimal fix** — change as little as possible
|
|
90
|
+
3. **Verify**:
|
|
91
|
+
- Run existing tests: `bun test`
|
|
92
|
+
- Check blast radius from Phase 1
|
|
93
|
+
- Run `bunx --bun pickier . --fix` for formatting
|
|
94
|
+
4. **Suggest a regression test**
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
## Root Cause
|
|
98
|
+
[Clear explanation]
|
|
99
|
+
|
|
100
|
+
## Fix
|
|
101
|
+
[Minimal code change with file:line references]
|
|
102
|
+
|
|
103
|
+
## Verification
|
|
104
|
+
- [x] Existing tests pass (`bun test`)
|
|
105
|
+
- [x] Blast radius checked
|
|
106
|
+
- [ ] Regression test: [suggested test]
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Rules
|
|
110
|
+
|
|
111
|
+
- **No fixes without root cause.** If you can't explain WHY, you haven't found the bug.
|
|
112
|
+
- **Read before you grep.** Understand architecture first.
|
|
113
|
+
- **Don't blame the framework first.** Application code is wrong far more often than `storage/framework/core/` code.
|
|
114
|
+
- **Intermittent bugs are timing bugs** until proven otherwise. Look for race conditions, missing `await`, shared mutable state.
|
|
115
|
+
- **If the fix is more than ~20 lines, question the root cause.** Large fixes often mean you're working around the problem.
|
|
116
|
+
|
|
117
|
+
## Downstream
|
|
118
|
+
|
|
119
|
+
> **Fix applied.** Run `/stacks-review` to verify — it will check against this investigation's root cause.
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stacks-jobs
|
|
3
|
+
description: Use when creating background job classes in app/Jobs/ — job structure, the handle method, job configuration (queue, tries, backoff, timeout, rate), dispatching patterns (dispatch, dispatchIf, dispatchAfter, dispatchNow), or the Every schedule constants. For the queue system internals (workers, batching, events, drivers, testing), see stacks-queue.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Bun >= 1.3.0, TypeScript
|
|
6
|
+
allowed-tools: Read Edit Write Bash Grep Glob
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Stacks Jobs
|
|
10
|
+
|
|
11
|
+
Background job classes defined in `app/Jobs/`.
|
|
12
|
+
|
|
13
|
+
## Key Paths
|
|
14
|
+
- Application jobs: `app/Jobs/`
|
|
15
|
+
- Queue config: `config/queue.ts`
|
|
16
|
+
|
|
17
|
+
## Creating a Job
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
// app/Jobs/SendWelcomeEmail.ts
|
|
21
|
+
import { Job } from '@stacksjs/queue'
|
|
22
|
+
|
|
23
|
+
export default new Job({
|
|
24
|
+
name: 'SendWelcomeEmail',
|
|
25
|
+
description: 'Send welcome email to new user',
|
|
26
|
+
queue: 'emails', // queue name (default: 'default')
|
|
27
|
+
tries: 3, // max attempts
|
|
28
|
+
backoff: 10, // seconds between retries
|
|
29
|
+
timeout: 30, // max execution time (seconds)
|
|
30
|
+
enabled: true, // can be disabled
|
|
31
|
+
|
|
32
|
+
async handle(payload: { email: string; name: string }) {
|
|
33
|
+
console.log(`Sending to ${payload.email}`)
|
|
34
|
+
// Do work here
|
|
35
|
+
return { sent: true }
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Job Configuration Options
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
{
|
|
44
|
+
name: string // job identifier
|
|
45
|
+
description?: string // human-readable description
|
|
46
|
+
queue?: string // queue name (default: 'default')
|
|
47
|
+
tries?: number // max retry attempts
|
|
48
|
+
backoff?: number // seconds between retries
|
|
49
|
+
backoffConfig?: { // advanced backoff
|
|
50
|
+
strategy: 'fixed' | 'exponential' | 'linear'
|
|
51
|
+
initialDelay: number
|
|
52
|
+
factor: number
|
|
53
|
+
maxDelay: number
|
|
54
|
+
jitter?: { enabled: boolean, factor: number }
|
|
55
|
+
}
|
|
56
|
+
timeout?: number // max seconds per attempt
|
|
57
|
+
rate?: string // cron schedule (e.g., Every.Hour)
|
|
58
|
+
enabled?: boolean // enable/disable job
|
|
59
|
+
handle: (payload?) => any // job logic
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Dispatching Jobs
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
// Simple dispatch
|
|
67
|
+
await SendWelcomeEmail.dispatch({ email: 'user@example.com', name: 'John' })
|
|
68
|
+
|
|
69
|
+
// Conditional dispatch
|
|
70
|
+
await SendWelcomeEmail.dispatchIf(isNewUser, { email, name })
|
|
71
|
+
await SendWelcomeEmail.dispatchUnless(isExistingUser, { email, name })
|
|
72
|
+
|
|
73
|
+
// Delayed dispatch (60 second delay)
|
|
74
|
+
await SendWelcomeEmail.dispatchAfter(60, { email, name })
|
|
75
|
+
|
|
76
|
+
// Immediate execution (bypasses queue)
|
|
77
|
+
await SendWelcomeEmail.dispatchNow({ email, name })
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Fluent Job Builder
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
import { job } from '@stacksjs/queue'
|
|
84
|
+
|
|
85
|
+
await job('SendWelcomeEmail', { email, name })
|
|
86
|
+
.onQueue('emails')
|
|
87
|
+
.delay(60)
|
|
88
|
+
.tries(5)
|
|
89
|
+
.timeout(30)
|
|
90
|
+
.backoff([10, 30, 60])
|
|
91
|
+
.dispatch()
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Scheduled Jobs
|
|
95
|
+
|
|
96
|
+
Use the `rate` property for automatic scheduling:
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
import { Every } from '@stacksjs/enums'
|
|
100
|
+
|
|
101
|
+
export default new Job({
|
|
102
|
+
name: 'CleanupExpiredTokens',
|
|
103
|
+
rate: Every.Hour, // runs every hour
|
|
104
|
+
// rate: Every.Day, // runs daily
|
|
105
|
+
// rate: '*/5 * * * *', // custom cron: every 5 minutes
|
|
106
|
+
|
|
107
|
+
handle() {
|
|
108
|
+
// cleanup logic
|
|
109
|
+
}
|
|
110
|
+
})
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Register in `app/Scheduler.ts`:
|
|
114
|
+
```typescript
|
|
115
|
+
import { schedule } from '@stacksjs/scheduler'
|
|
116
|
+
|
|
117
|
+
export default function() {
|
|
118
|
+
schedule.job('CleanupExpiredTokens').hourly().setTimeZone('America/New_York')
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## CLI Commands
|
|
123
|
+
```bash
|
|
124
|
+
buddy make:job [name] # scaffold a new job
|
|
125
|
+
buddy queue # queue management
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Gotchas
|
|
129
|
+
- Jobs must export `default new Job({...})` — not a plain object
|
|
130
|
+
- The `handle()` method receives the payload passed to `dispatch()`
|
|
131
|
+
- `dispatchNow()` runs immediately in the current process — no queue involved
|
|
132
|
+
- Default queue driver is `sync` — jobs run immediately unless changed to `database` or `redis`
|
|
133
|
+
- Jobs with `rate` are auto-discovered by the scheduler
|
|
134
|
+
- Backoff array `[10, 30, 60]` means: retry after 10s, then 30s, then 60s
|
|
135
|
+
- Jobs should be idempotent — safe to retry on failure
|
|
136
|
+
- For queue workers, batching, events, and testing, see the `stacks-queue` skill
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stacks-lint
|
|
3
|
+
description: Use when linting or formatting code in a Stacks project. CRITICAL - always use pickier, NEVER eslint directly. Run 'bunx --bun pickier .' to lint, 'bunx --bun pickier . --fix' to auto-fix. For unused variables, prefer eslint-disable-next-line comments over underscore prefix. Covers @stacksjs/lint and config/code-style.ts.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Bun >= 1.3.0, TypeScript
|
|
6
|
+
allowed-tools: Read Edit Write Bash Grep Glob
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Stacks Linting
|
|
10
|
+
|
|
11
|
+
## CRITICAL RULES
|
|
12
|
+
1. **ALWAYS** use `bunx --bun pickier .` to lint -- **NEVER** use `eslint` directly
|
|
13
|
+
2. **Auto-fix**: `bunx --bun pickier . --fix`
|
|
14
|
+
3. For unused variable warnings: prefer `// eslint-disable-next-line` comments over prefixing with `_`
|
|
15
|
+
|
|
16
|
+
## Key Paths
|
|
17
|
+
- Lint package: `storage/framework/core/lint/` (package: `@stacksjs/lint`)
|
|
18
|
+
- Configuration: `config/code-style.ts` (auto-loaded via pickier's bunfig alias `code-style`; pickier handles both linting and formatting)
|
|
19
|
+
- Lint command source: `storage/framework/core/buddy/src/commands/lint.ts`
|
|
20
|
+
|
|
21
|
+
## Package Details
|
|
22
|
+
- Package name: `@stacksjs/lint`
|
|
23
|
+
- Version: tracks framework version (currently 0.70.23)
|
|
24
|
+
- The lint package is a thin wrapper -- the actual linting is done by pickier
|
|
25
|
+
- `storage/framework/core/lint/build.ts` is a no-op (nothing to build)
|
|
26
|
+
- Dev dependencies: `better-dx`, `@stacksjs/gitlint`, `bun-git-hooks`
|
|
27
|
+
|
|
28
|
+
## Commands
|
|
29
|
+
|
|
30
|
+
### Via buddy CLI
|
|
31
|
+
The buddy `lint` command internally runs pickier with the project's pickier config:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Lint (runs: bunx --bun pickier run --mode lint --config ./pickier.config.ts)
|
|
35
|
+
buddy lint
|
|
36
|
+
|
|
37
|
+
# Auto-fix (runs: bunx --bun pickier run --mode lint --config ./pickier.config.ts --fix)
|
|
38
|
+
buddy lint --fix
|
|
39
|
+
buddy lint:fix
|
|
40
|
+
|
|
41
|
+
# Format (runs: bunx --bun pickier run --mode format --config ./pickier.config.ts --write)
|
|
42
|
+
buddy format
|
|
43
|
+
buddy format --write # same as above (write is default)
|
|
44
|
+
|
|
45
|
+
# Check formatting without changes
|
|
46
|
+
buddy format --check # runs: pickier run --mode format --config ./pickier.config.ts --check
|
|
47
|
+
buddy format:check
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Direct pickier usage
|
|
51
|
+
```bash
|
|
52
|
+
# Lint entire project
|
|
53
|
+
bunx --bun pickier .
|
|
54
|
+
|
|
55
|
+
# Auto-fix
|
|
56
|
+
bunx --bun pickier . --fix
|
|
57
|
+
|
|
58
|
+
# Via npm scripts
|
|
59
|
+
bun run lint
|
|
60
|
+
bun run lint:fix
|
|
61
|
+
bun run format
|
|
62
|
+
bun run format:check
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## config/code-style.ts (PickierOptions)
|
|
66
|
+
|
|
67
|
+
The actual configuration used by the project. This is the source of truth for all lint settings:
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
import type { PickierOptions } from 'pickier'
|
|
71
|
+
|
|
72
|
+
const config: PickierOptions = {
|
|
73
|
+
format: {
|
|
74
|
+
extensions: ['ts', 'js', 'stx', 'json', 'yaml', 'md'],
|
|
75
|
+
indent: 2,
|
|
76
|
+
quotes: 'single',
|
|
77
|
+
semi: false,
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
rules: {
|
|
81
|
+
// TypeScript rules
|
|
82
|
+
noDebugger: 'off',
|
|
83
|
+
noConsole: 'off',
|
|
84
|
+
},
|
|
85
|
+
|
|
86
|
+
pluginRules: {
|
|
87
|
+
// Regexp rules disabled (false positives on route definitions)
|
|
88
|
+
'regexp/no-unused-capturing-group': 'off',
|
|
89
|
+
'regexp/no-super-linear-backtracking': 'off',
|
|
90
|
+
'regexp/optimal-quantifier-concatenation': 'off',
|
|
91
|
+
// Style rules disabled (conflict with common patterns or generated code)
|
|
92
|
+
'style/brace-style': 'off',
|
|
93
|
+
'style/max-statements-per-line': 'off',
|
|
94
|
+
'style/quotes': 'off',
|
|
95
|
+
'indent': 'off',
|
|
96
|
+
'quotes': 'off',
|
|
97
|
+
// TypeScript rules
|
|
98
|
+
'ts/no-top-level-await': 'off',
|
|
99
|
+
// Console is intentional
|
|
100
|
+
'no-console': 'off',
|
|
101
|
+
// Markdown rules
|
|
102
|
+
'markdown/heading-increment': 'off',
|
|
103
|
+
'markdown/no-empty-links': 'off',
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
ignores: [
|
|
107
|
+
'**/fixtures/**',
|
|
108
|
+
'**/coverage/**',
|
|
109
|
+
'**/temp/**',
|
|
110
|
+
],
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export default config
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Format Settings (enforced)
|
|
117
|
+
- **Indent**: 2 spaces
|
|
118
|
+
- **Quotes**: single quotes
|
|
119
|
+
- **Semicolons**: none (no semicolons)
|
|
120
|
+
- **Extensions**: ts, js, stx, json, yaml, md
|
|
121
|
+
|
|
122
|
+
## Handling Unused Variables
|
|
123
|
+
|
|
124
|
+
When pickier/eslint reports unused variables, use eslint-disable comments -- do NOT prefix with underscore:
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
// CORRECT: Use eslint-disable comment
|
|
128
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
129
|
+
const unusedVar = someFunction()
|
|
130
|
+
|
|
131
|
+
// ALSO CORRECT: Use eslint-disable for next line only
|
|
132
|
+
// eslint-disable-next-line no-unused-vars
|
|
133
|
+
function handler(req, res, next) {
|
|
134
|
+
res.send('ok')
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// INCORRECT: Don't prefix with underscore
|
|
138
|
+
const _unusedVar = someFunction() // DON'T DO THIS
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Internal Implementation
|
|
142
|
+
|
|
143
|
+
The buddy `lint` command (in `storage/framework/core/buddy/src/commands/lint.ts`) delegates entirely to pickier:
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
// lint.ts internals
|
|
147
|
+
buddy
|
|
148
|
+
.command('lint', 'Automagically lints your project codebase')
|
|
149
|
+
.option('-f, --fix', 'Automagically fixes all lint errors', { default: false })
|
|
150
|
+
.action(async (options: LintOptions) => {
|
|
151
|
+
if (options.fix)
|
|
152
|
+
await runCommand('bunx --bun pickier run --mode lint --config ./pickier.config.ts --fix', { cwd: path.projectPath() })
|
|
153
|
+
else
|
|
154
|
+
await runCommand('bunx --bun pickier run --mode lint --config ./pickier.config.ts', { cwd: path.projectPath() })
|
|
155
|
+
})
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
The `format` command uses pickier in format mode:
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
buddy
|
|
162
|
+
.command('format', 'Format your project codebase')
|
|
163
|
+
.option('-w, --write', 'Write changes to files', { default: false })
|
|
164
|
+
.option('-c, --check', 'Check formatting without making changes', { default: false })
|
|
165
|
+
.action(async (options) => {
|
|
166
|
+
if (options.check)
|
|
167
|
+
await runCommand('bunx --bun pickier run --mode format --config ./pickier.config.ts --check', { cwd: path.projectPath() })
|
|
168
|
+
else
|
|
169
|
+
await runCommand('bunx --bun pickier run --mode format --config ./pickier.config.ts --write', { cwd: path.projectPath() })
|
|
170
|
+
})
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Gotchas
|
|
174
|
+
- Pickier is the Stacks linting tool -- it wraps eslint with Stacks-specific config
|
|
175
|
+
- **NEVER** run `eslint` directly -- always go through `bunx --bun pickier` or `buddy lint`
|
|
176
|
+
- The `config/code-style.ts` file exports a `PickierOptions` object -- not an eslint config (auto-discovered by pickier via bunfig alias `code-style`)
|
|
177
|
+
- The project intentionally allows `console.*` calls (`noConsole: 'off'`, `'no-console': 'off'`)
|
|
178
|
+
- The project intentionally allows `debugger` statements (`noDebugger: 'off'`)
|
|
179
|
+
- Top-level await is allowed (`'ts/no-top-level-await': 'off'`)
|
|
180
|
+
- Brace style and max-statements-per-line rules are disabled to avoid conflicts with generated code
|
|
181
|
+
- Run `bunx --bun pickier . --fix` after code generation to clean up
|
|
182
|
+
- `buddy lint` exits through the `lint:*` wildcard handler if an invalid sub-command is used
|
|
183
|
+
- `buddy format` defaults to `--write` mode (writes changes) unless `--check` is specified
|
|
184
|
+
- The lint package (`@stacksjs/lint`) itself has no source files to build -- it is a configuration-only package
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stacks-listeners
|
|
3
|
+
description: Use when creating event listeners in app/Listeners/ — the listener file structure, registering listeners in app/Events.ts, the listener-to-action mapping pattern, CLI event listeners in Console.ts, or debugging listener execution. For the event system API (dispatch, listen, emitter, model events), see stacks-events.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Bun >= 1.3.0, TypeScript
|
|
6
|
+
allowed-tools: Read Edit Write Bash Grep Glob
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Stacks Event Listeners
|
|
10
|
+
|
|
11
|
+
Application-level event listeners in `app/Listeners/`.
|
|
12
|
+
|
|
13
|
+
## Key Paths
|
|
14
|
+
- Listeners: `app/Listeners/`
|
|
15
|
+
- Event mapping: `app/Events.ts`
|
|
16
|
+
- Listener setup: `app/Listener.ts`
|
|
17
|
+
|
|
18
|
+
## Event → Listener Mapping (app/Events.ts)
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
export default {
|
|
22
|
+
'user:registered': ['SendWelcomeEmail'], // triggers app/Actions/SendWelcomeEmail.ts
|
|
23
|
+
'user:created': ['NotifyUser'], // triggers app/Actions/NotifyUser.ts
|
|
24
|
+
'order:created': ['ProcessPayment', 'SendOrderConfirmation'], // multiple listeners
|
|
25
|
+
} satisfies Events
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Keys are event names. Values are arrays of Action names from `app/Actions/`.
|
|
29
|
+
|
|
30
|
+
## How Listeners Work
|
|
31
|
+
|
|
32
|
+
1. Events are dispatched: `dispatch('user:registered', { id: 1 })`
|
|
33
|
+
2. The wildcard handler in `app/Listener.ts` catches ALL events
|
|
34
|
+
3. Checks if the event has registered listeners in `app/Events.ts`
|
|
35
|
+
4. For each listener, dynamically imports `app/Actions/{listener}.ts`
|
|
36
|
+
5. Calls `action.handle(eventData)`
|
|
37
|
+
6. Action modules are cached after first import
|
|
38
|
+
|
|
39
|
+
## Creating a Listener Action
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
// app/Actions/SendWelcomeEmail.ts
|
|
43
|
+
export default {
|
|
44
|
+
name: 'SendWelcomeEmail',
|
|
45
|
+
|
|
46
|
+
async handle(event: { id: number; email: string; name: string }) {
|
|
47
|
+
// event contains the data passed to dispatch()
|
|
48
|
+
await sendWelcomeEmail({ to: event.email, name: event.name })
|
|
49
|
+
return { success: true }
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## CLI Event Listeners (app/Listeners/Console.ts)
|
|
55
|
+
|
|
56
|
+
For CLI-specific events (not HTTP):
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
export default function(cli: CLI) {
|
|
60
|
+
// Specific command
|
|
61
|
+
cli.on('inspire:three', () => {
|
|
62
|
+
console.log(getThreeQuotes())
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
// Default handler (unknown commands)
|
|
66
|
+
cli.on('inspire:!', () => {
|
|
67
|
+
console.log('Unknown inspire command')
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
// Wildcard (matches inspire:anything)
|
|
71
|
+
cli.on('inspire:*', () => {
|
|
72
|
+
console.log('Some inspire variant')
|
|
73
|
+
})
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Multiple Listeners Per Event
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
// app/Events.ts
|
|
81
|
+
{
|
|
82
|
+
'order:created': [
|
|
83
|
+
'ProcessPayment', // runs first
|
|
84
|
+
'SendOrderConfirmation', // runs second
|
|
85
|
+
'UpdateInventory', // runs third
|
|
86
|
+
'NotifyWarehouse' // runs fourth
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Listeners execute sequentially (not in parallel) — each awaits completion.
|
|
92
|
+
|
|
93
|
+
## Gotchas
|
|
94
|
+
- Listeners are Action names, not file paths — `'SendWelcomeEmail'` resolves to `app/Actions/SendWelcomeEmail.ts`
|
|
95
|
+
- The action must have a `handle(event)` method
|
|
96
|
+
- Listeners run sequentially per event — order in the array matters
|
|
97
|
+
- Action modules are cached after first load — no hot-reload for listeners
|
|
98
|
+
- CLI listeners are separate from HTTP event listeners
|
|
99
|
+
- For the event API (dispatch, listen, emitter), see the `stacks-events` skill
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stacks-logging
|
|
3
|
+
description: Use when implementing logging in Stacks — the log facade (info, error, warn, debug, success), dump/dd debugging, timing functions, file-based logging, or log configuration. Covers @stacksjs/logging and config/logging.ts.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Bun >= 1.3.0, TypeScript
|
|
6
|
+
allowed-tools: Read Edit Write Bash Grep Glob
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Stacks Logging
|
|
10
|
+
|
|
11
|
+
Uses @stacksjs/clarity Logger with file writing to `storage/logs/stacks.log`.
|
|
12
|
+
|
|
13
|
+
## Key Paths
|
|
14
|
+
- Core package: `storage/framework/core/logging/src/`
|
|
15
|
+
- Configuration: `config/logging.ts`
|
|
16
|
+
- Log model: `storage/framework/defaults/app/Models/Log.ts`
|
|
17
|
+
- Log file: `storage/logs/stacks.log`
|
|
18
|
+
|
|
19
|
+
## Log Facade
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import { log } from '@stacksjs/logging'
|
|
23
|
+
|
|
24
|
+
await log.info('User created', { userId: 1 })
|
|
25
|
+
await log.success('Deployment complete')
|
|
26
|
+
await log.warn('Rate limit approaching', { remaining: 10 })
|
|
27
|
+
await log.warning('Alias for warn')
|
|
28
|
+
await log.error(new Error('Something failed'), { context: 'handler' })
|
|
29
|
+
await log.debug('Debug info', { query: 'SELECT ...' })
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Error with Exit
|
|
33
|
+
```typescript
|
|
34
|
+
await log.error(err, { shouldExit: true }) // logs and exits process
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Dump & Die
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { dump, dd, echo } from '@stacksjs/logging'
|
|
41
|
+
|
|
42
|
+
await dump(variable1, variable2) // inspect without stopping
|
|
43
|
+
await dd(variable1, variable2) // inspect and exit (never returns)
|
|
44
|
+
await echo('simple output')
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Timing
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
const done = log.time('database-query')
|
|
51
|
+
await performQuery()
|
|
52
|
+
await done() // logs elapsed time
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Logger Instance
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
import { logger } from '@stacksjs/logging'
|
|
59
|
+
|
|
60
|
+
const l = logger // underlying clarity Logger instance
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## config/logging.ts
|
|
64
|
+
```typescript
|
|
65
|
+
{
|
|
66
|
+
logsPath: 'storage/logs',
|
|
67
|
+
deploymentsPath: 'storage/logs/deployments'
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Gotchas
|
|
72
|
+
- All log methods are async — they write to both console and file
|
|
73
|
+
- Log file is at `storage/logs/stacks.log`
|
|
74
|
+
- `dd()` never returns — it exits the process after dumping
|
|
75
|
+
- `dump()` continues execution — use for non-destructive debugging
|
|
76
|
+
- The Log model enables database-backed log storage and querying
|
|
77
|
+
- Error logging can optionally exit the process with `shouldExit: true`
|
|
78
|
+
- Logging is a dependency of many other packages — it's available everywhere
|