@dsalazardev/ai-hub-cli 0.0.0-stage → 0.2.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/LICENSE +21 -0
- package/NOTICE.md +34 -0
- package/README.md +64 -2
- package/agents/cpp-build-resolver.md +25 -0
- package/agents/cpp-reviewer.md +28 -0
- package/agents/csharp-reviewer.md +28 -0
- package/agents/django-build-resolver.md +25 -0
- package/agents/django-reviewer.md +28 -0
- package/agents/explorer-domain.md +28 -0
- package/agents/fastapi-reviewer.md +28 -0
- package/agents/flutter-build-resolver.md +25 -0
- package/agents/flutter-reviewer.md +28 -0
- package/agents/go-build-resolver.md +25 -0
- package/agents/go-reviewer.md +28 -0
- package/agents/implementer-backend.md +30 -0
- package/agents/implementer-frontend.md +30 -0
- package/agents/java-build-resolver.md +26 -0
- package/agents/java-reviewer.md +29 -0
- package/agents/kotlin-build-resolver.md +25 -0
- package/agents/kotlin-reviewer.md +28 -0
- package/agents/mle-reviewer.md +28 -0
- package/agents/php-reviewer.md +29 -0
- package/agents/postgres-reviewer.md +28 -0
- package/agents/python-reviewer.md +28 -0
- package/agents/pytorch-build-resolver.md +25 -0
- package/agents/rag-reviewer.md +28 -0
- package/agents/react-build-resolver.md +26 -0
- package/agents/react-reviewer.md +29 -0
- package/agents/reviewer-architecture.md +32 -0
- package/agents/reviewer-tests.md +31 -0
- package/agents/rust-build-resolver.md +25 -0
- package/agents/rust-reviewer.md +28 -0
- package/agents/spec-author.md +36 -0
- package/agents/spec-miner.md +14 -0
- package/agents/swift-build-resolver.md +25 -0
- package/agents/swift-reviewer.md +28 -0
- package/agents/typescript-reviewer.md +28 -0
- package/agents/vue-reviewer.md +28 -0
- package/dist/backup/snapshots.d.ts +24 -0
- package/dist/backup/snapshots.js +171 -0
- package/dist/bin/ai-hub.d.ts +2 -0
- package/dist/bin/ai-hub.js +11 -0
- package/dist/catalog.d.ts +76 -0
- package/dist/catalog.js +321 -0
- package/dist/cli/args.d.ts +4 -0
- package/dist/cli/args.js +63 -0
- package/dist/cli/context.d.ts +7 -0
- package/dist/cli/context.js +79 -0
- package/dist/cli/doctor.d.ts +14 -0
- package/dist/cli/doctor.js +282 -0
- package/dist/cli/drift.d.ts +2 -0
- package/dist/cli/drift.js +34 -0
- package/dist/cli/items.d.ts +5 -0
- package/dist/cli/items.js +10 -0
- package/dist/cli/legacy.d.ts +3 -0
- package/dist/cli/legacy.js +18 -0
- package/dist/cli/maintenance.d.ts +8 -0
- package/dist/cli/maintenance.js +334 -0
- package/dist/cli/memory.d.ts +2 -0
- package/dist/cli/memory.js +89 -0
- package/dist/cli/onboarding.d.ts +36 -0
- package/dist/cli/onboarding.js +516 -0
- package/dist/cli/run.d.ts +15 -0
- package/dist/cli/run.js +185 -0
- package/dist/cli/source.d.ts +5 -0
- package/dist/cli/source.js +22 -0
- package/dist/cli/trunk.d.ts +8 -0
- package/dist/cli/trunk.js +54 -0
- package/dist/cli/types.d.ts +17 -0
- package/dist/cli/types.js +4 -0
- package/dist/cli/worktrees.d.ts +11 -0
- package/dist/cli/worktrees.js +141 -0
- package/dist/concurrency.d.ts +5 -0
- package/dist/concurrency.js +23 -0
- package/dist/engine/engine.d.ts +48 -0
- package/dist/engine/engine.js +114 -0
- package/dist/engine/gates.d.ts +2 -0
- package/dist/engine/gates.js +131 -0
- package/dist/frontmatter.d.ts +11 -0
- package/dist/frontmatter.js +30 -0
- package/dist/harness/guards/adapters/context.d.ts +19 -0
- package/dist/harness/guards/adapters/context.js +153 -0
- package/dist/harness/guards/adapters/hermes.d.ts +13 -0
- package/dist/harness/guards/adapters/hermes.js +18 -0
- package/dist/harness/guards/adapters/hooks.d.ts +25 -0
- package/dist/harness/guards/adapters/hooks.js +52 -0
- package/dist/harness/guards/branch.d.ts +5 -0
- package/dist/harness/guards/branch.js +43 -0
- package/dist/harness/guards/danger.d.ts +13 -0
- package/dist/harness/guards/danger.js +157 -0
- package/dist/harness/guards/index.d.ts +6 -0
- package/dist/harness/guards/index.js +6 -0
- package/dist/harness/guards/preflight.d.ts +14 -0
- package/dist/harness/guards/preflight.js +37 -0
- package/dist/harness/guards/ship.d.ts +2 -0
- package/dist/harness/guards/ship.js +35 -0
- package/dist/harness/guards/trunk.d.ts +5 -0
- package/dist/harness/guards/trunk.js +41 -0
- package/dist/harness/guards/types.d.ts +50 -0
- package/dist/harness/guards/types.js +1 -0
- package/dist/harness/memory/ledger.d.ts +53 -0
- package/dist/harness/memory/ledger.js +136 -0
- package/dist/harness/memory/state.d.ts +35 -0
- package/dist/harness/memory/state.js +121 -0
- package/dist/harness/worktree/reaper.d.ts +32 -0
- package/dist/harness/worktree/reaper.js +54 -0
- package/dist/manifest/build.d.ts +1 -0
- package/dist/manifest/build.js +1 -0
- package/dist/manifest/cli.d.ts +2 -0
- package/dist/manifest/cli.js +44 -0
- package/dist/manifest/dispatch.d.ts +13 -0
- package/dist/manifest/dispatch.js +36 -0
- package/dist/manifest/labels.d.ts +15 -0
- package/dist/manifest/labels.js +70 -0
- package/dist/manifest/manifest.d.ts +130 -0
- package/dist/manifest/manifest.js +220 -0
- package/dist/package-info.d.ts +4 -0
- package/dist/package-info.js +7 -0
- package/dist/paths.d.ts +33 -0
- package/dist/paths.js +123 -0
- package/dist/presets/detect.d.ts +24 -0
- package/dist/presets/detect.js +116 -0
- package/dist/presets/materialize.d.ts +26 -0
- package/dist/presets/materialize.js +192 -0
- package/dist/presets/resolve.d.ts +37 -0
- package/dist/presets/resolve.js +83 -0
- package/dist/presets/schema.d.ts +57 -0
- package/dist/presets/schema.js +68 -0
- package/dist/source-checkout.d.ts +8 -0
- package/dist/source-checkout.js +19 -0
- package/dist/sync/config.d.ts +47 -0
- package/dist/sync/config.js +85 -0
- package/dist/sync/lock.d.ts +16 -0
- package/dist/sync/lock.js +43 -0
- package/dist/sync/render.d.ts +18 -0
- package/dist/sync/render.js +259 -0
- package/dist/sync/sync.d.ts +38 -0
- package/dist/sync/sync.js +288 -0
- package/dist/sync/targets.d.ts +24 -0
- package/dist/sync/targets.js +78 -0
- package/engine/coupling.json +4 -0
- package/engine/engine.yaml +250 -0
- package/engine/legacy-paths.json +4 -0
- package/engine/preflight.md +11 -0
- package/manifest.json +402 -0
- package/package.json +62 -4
- package/presets/angular-express/harness/rules/01-zero-any.sh +25 -0
- package/presets/angular-express/harness/rules/02-no-ng-module.sh +21 -0
- package/presets/angular-express/harness/rules/03-no-constructor-injection.sh +21 -0
- package/presets/angular-express/harness/rules/04-no-legacy-directives.sh +21 -0
- package/presets/angular-express/harness/rules/05-no-dolibarrdal-inheritance.sh +25 -0
- package/presets/angular-express/harness/rules/06-no-todos.sh +22 -0
- package/presets/angular-express/harness/run-all.sh +13 -0
- package/presets/angular-express/preset.yaml +53 -0
- package/presets/angular-express/references/common-imports-catalog.md +146 -0
- package/presets/angular-express/references/fichajes-migration-notes.md +57 -0
- package/presets/angular-express/references/module-implementation-flow.md +260 -0
- package/presets/angular-express/references/products-coding-standard.md +143 -0
- package/presets/angular-express/references/products-module-blueprint.md +860 -0
- package/presets/angular-express/references/replicate-module-checklist.md +72 -0
- package/presets/angular-express/references/users-migration-notes.md +172 -0
- package/presets/angular-express/rules/architecture.md +8 -0
- package/presets/angular-express/rules/backend.md +4 -0
- package/presets/angular-express/rules/frontend.md +53 -0
- package/presets/angular-express/skills/angular-developer/SKILL.md +130 -0
- package/presets/angular-express/skills/angular-developer/references/angular-animations.md +160 -0
- package/presets/angular-express/skills/angular-developer/references/angular-aria.md +410 -0
- package/presets/angular-express/skills/angular-developer/references/cli.md +86 -0
- package/presets/angular-express/skills/angular-developer/references/component-harnesses.md +59 -0
- package/presets/angular-express/skills/angular-developer/references/component-styling.md +91 -0
- package/presets/angular-express/skills/angular-developer/references/components.md +117 -0
- package/presets/angular-express/skills/angular-developer/references/creating-services.md +97 -0
- package/presets/angular-express/skills/angular-developer/references/data-resolvers.md +69 -0
- package/presets/angular-express/skills/angular-developer/references/define-routes.md +67 -0
- package/presets/angular-express/skills/angular-developer/references/defining-providers.md +72 -0
- package/presets/angular-express/skills/angular-developer/references/di-fundamentals.md +120 -0
- package/presets/angular-express/skills/angular-developer/references/e2e-testing.md +66 -0
- package/presets/angular-express/skills/angular-developer/references/effects.md +83 -0
- package/presets/angular-express/skills/angular-developer/references/hierarchical-injectors.md +43 -0
- package/presets/angular-express/skills/angular-developer/references/host-elements.md +80 -0
- package/presets/angular-express/skills/angular-developer/references/injection-context.md +63 -0
- package/presets/angular-express/skills/angular-developer/references/inputs.md +101 -0
- package/presets/angular-express/skills/angular-developer/references/linked-signal.md +59 -0
- package/presets/angular-express/skills/angular-developer/references/loading-strategies.md +61 -0
- package/presets/angular-express/skills/angular-developer/references/mcp.md +106 -0
- package/presets/angular-express/skills/angular-developer/references/migrations.md +30 -0
- package/presets/angular-express/skills/angular-developer/references/navigate-to-routes.md +69 -0
- package/presets/angular-express/skills/angular-developer/references/outputs.md +86 -0
- package/presets/angular-express/skills/angular-developer/references/reactive-forms.md +122 -0
- package/presets/angular-express/skills/angular-developer/references/rendering-strategies.md +44 -0
- package/presets/angular-express/skills/angular-developer/references/resource.md +74 -0
- package/presets/angular-express/skills/angular-developer/references/route-animations.md +56 -0
- package/presets/angular-express/skills/angular-developer/references/route-guards.md +52 -0
- package/presets/angular-express/skills/angular-developer/references/router-lifecycle.md +45 -0
- package/presets/angular-express/skills/angular-developer/references/router-testing.md +87 -0
- package/presets/angular-express/skills/angular-developer/references/show-routes-with-outlets.md +68 -0
- package/presets/angular-express/skills/angular-developer/references/signal-forms.md +897 -0
- package/presets/angular-express/skills/angular-developer/references/signals-overview.md +94 -0
- package/presets/angular-express/skills/angular-developer/references/tailwind-css.md +69 -0
- package/presets/angular-express/skills/angular-developer/references/template-driven-forms.md +114 -0
- package/presets/angular-express/skills/angular-developer/references/testing-fundamentals.md +66 -0
- package/presets/angular-express/skills/angular-new-app/SKILL.md +62 -0
- package/presets/angular-express/skills/frontend-design/LICENSE.txt +177 -0
- package/presets/angular-express/skills/frontend-design/SKILL.md +55 -0
- package/presets/angular-express/skills/onna-architecture-angular/SKILL.md +229 -0
- package/presets/angular-express/skills/onna-architecture-bff/SKILL.md +446 -0
- package/presets/angular-express/skills/onna-architecture-common/SKILL.md +313 -0
- package/presets/angular-express/skills/onna-design-system/SKILL.md +615 -0
- package/presets/base/preset.yaml +25 -0
- package/presets/base/rules/core.md +35 -0
- package/presets/generic-ts/preset.yaml +44 -0
- package/presets/python/preset.yaml +45 -0
- package/presets/python/rules/python.md +10 -0
- package/rules/skill-quality/skill-behavior-rubric.md +63 -0
- package/rules/skill-quality/skill-harden-rubric.md +102 -0
- package/rules/skill-quality/skill-migration-brief.md +200 -0
- package/rules/skill-quality/skill-rubric.md +40 -0
- package/schema/engine.schema.json +73 -0
- package/schema/manifest.schema.json +152 -0
- package/schema/preset.schema.json +98 -0
- package/schema/state.schema.json +27 -0
- package/skills/shared/ab-testing/SKILL.md +159 -0
- package/skills/shared/ab-testing/evals/README.md +8 -0
- package/skills/shared/ab-testing/evals/cases.yaml +49 -0
- package/skills/shared/ab-testing/references/pitfalls.md +74 -0
- package/skills/shared/ab-testing/references/sample-size-and-cuped.md +128 -0
- package/skills/shared/ab-testing/scripts/verify.sh +89 -0
- package/skills/shared/accessibility/SKILL.md +216 -0
- package/skills/shared/accessibility/evals/README.md +3 -0
- package/skills/shared/accessibility/evals/cases.yaml +47 -0
- package/skills/shared/accessibility/references/aria-patterns.md +113 -0
- package/skills/shared/accessibility/references/wcag22-checklist.md +83 -0
- package/skills/shared/accessibility/scripts/verify.sh +103 -0
- package/skills/shared/agent-eval/SKILL.md +187 -0
- package/skills/shared/agent-eval/evals/README.md +12 -0
- package/skills/shared/agent-eval/evals/cases.yaml +45 -0
- package/skills/shared/agent-eval/references/judge-design.md +118 -0
- package/skills/shared/agent-eval/references/runner-and-gate.md +183 -0
- package/skills/shared/agent-eval/scripts/verify.sh +161 -0
- package/skills/shared/agent-safety/SKILL.md +169 -0
- package/skills/shared/agent-safety/evals/README.md +12 -0
- package/skills/shared/agent-safety/evals/cases.yaml +46 -0
- package/skills/shared/agent-safety/references/threat-model.md +51 -0
- package/skills/shared/analyze/SKILL.md +123 -0
- package/skills/shared/analyze/evals/README.md +72 -0
- package/skills/shared/analyze/evals/cases.yaml +74 -0
- package/skills/shared/angular/SKILL.md +275 -0
- package/skills/shared/angular/evals/README.md +3 -0
- package/skills/shared/angular/evals/cases.yaml +38 -0
- package/skills/shared/angular/references/migration.md +81 -0
- package/skills/shared/angular/references/signals-rxjs.md +92 -0
- package/skills/shared/angular/scripts/verify.sh +122 -0
- package/skills/shared/api-connector-builder/SKILL.md +268 -0
- package/skills/shared/api-connector-builder/evals/README.md +11 -0
- package/skills/shared/api-connector-builder/evals/cases.yaml +47 -0
- package/skills/shared/api-connector-builder/references/auth-flows.md +132 -0
- package/skills/shared/api-connector-builder/references/pagination.md +144 -0
- package/skills/shared/api-connector-builder/scripts/verify.sh +172 -0
- package/skills/shared/api-design/SKILL.md +182 -0
- package/skills/shared/api-design/evals/README.md +3 -0
- package/skills/shared/api-design/evals/cases.yaml +45 -0
- package/skills/shared/api-design/references/graphql-design.md +70 -0
- package/skills/shared/api-design/references/openapi-contract.md +86 -0
- package/skills/shared/api-design/references/rest-conventions.md +63 -0
- package/skills/shared/api-design/references/versioning-and-evolution.md +49 -0
- package/skills/shared/api-design/scripts/verify.sh +138 -0
- package/skills/shared/astro/SKILL.md +257 -0
- package/skills/shared/astro/evals/README.md +3 -0
- package/skills/shared/astro/evals/cases.yaml +41 -0
- package/skills/shared/astro/references/content-layer.md +118 -0
- package/skills/shared/astro/references/deploy-and-integrations.md +163 -0
- package/skills/shared/astro/scripts/verify.sh +137 -0
- package/skills/shared/author-skill/SKILL.md +194 -0
- package/skills/shared/author-skill/evals/README.md +66 -0
- package/skills/shared/author-skill/evals/cases.yaml +75 -0
- package/skills/shared/author-skill/references/description-recipe.md +85 -0
- package/skills/shared/author-skill/references/eval-authoring.md +108 -0
- package/skills/shared/author-skill/references/skill-conventions.md +95 -0
- package/skills/shared/automation-flows/SKILL.md +122 -0
- package/skills/shared/automation-flows/evals/README.md +5 -0
- package/skills/shared/automation-flows/evals/cases.yaml +44 -0
- package/skills/shared/automation-flows/references/error-handling.md +58 -0
- package/skills/shared/automation-flows/references/n8n-workflow-json.md +63 -0
- package/skills/shared/automation-flows/scripts/verify.sh +78 -0
- package/skills/shared/aws-essentials/SKILL.md +206 -0
- package/skills/shared/aws-essentials/evals/README.md +10 -0
- package/skills/shared/aws-essentials/evals/cases.yaml +44 -0
- package/skills/shared/aws-essentials/references/iam-least-privilege.md +134 -0
- package/skills/shared/aws-essentials/references/rds-cloudfront-recipes.md +127 -0
- package/skills/shared/aws-essentials/scripts/verify.sh +99 -0
- package/skills/shared/backups/SKILL.md +131 -0
- package/skills/shared/backups/evals/README.md +3 -0
- package/skills/shared/backups/evals/cases.yaml +42 -0
- package/skills/shared/backups/references/engine-recipes.md +121 -0
- package/skills/shared/backups/references/restore-runbook.md +65 -0
- package/skills/shared/backups/scripts/verify.sh +80 -0
- package/skills/shared/bash-scripting/SKILL.md +227 -0
- package/skills/shared/bash-scripting/evals/README.md +3 -0
- package/skills/shared/bash-scripting/evals/cases.yaml +45 -0
- package/skills/shared/bash-scripting/references/portability.md +97 -0
- package/skills/shared/bash-scripting/scripts/verify.sh +140 -0
- package/skills/shared/building-agents/SKILL.md +386 -0
- package/skills/shared/building-agents/evals/README.md +68 -0
- package/skills/shared/building-agents/evals/cases.yaml +60 -0
- package/skills/shared/building-agents/references/agent-loops-and-harness.md +371 -0
- package/skills/shared/building-agents/references/evals-and-observability.md +420 -0
- package/skills/shared/building-agents/references/mcp-servers.md +294 -0
- package/skills/shared/building-agents/references/provider-abstraction.md +489 -0
- package/skills/shared/building-agents/references/tools-and-rag.md +417 -0
- package/skills/shared/building-agents/scripts/verify.sh +121 -0
- package/skills/shared/chatbot/SKILL.md +151 -0
- package/skills/shared/chatbot/evals/README.md +13 -0
- package/skills/shared/chatbot/evals/cases.yaml +43 -0
- package/skills/shared/chatbot/references/handoff-and-sales.md +71 -0
- package/skills/shared/chatbot/references/system-prompt-and-guardrails.md +78 -0
- package/skills/shared/chatbot/scripts/verify.sh +162 -0
- package/skills/shared/chrome-extension/SKILL.md +169 -0
- package/skills/shared/chrome-extension/evals/README.md +12 -0
- package/skills/shared/chrome-extension/evals/cases.yaml +40 -0
- package/skills/shared/chrome-extension/references/store-and-migration.md +84 -0
- package/skills/shared/chrome-extension/scripts/verify.sh +62 -0
- package/skills/shared/clarify/SKILL.md +161 -0
- package/skills/shared/clarify/evals/README.md +70 -0
- package/skills/shared/clarify/evals/cases.yaml +71 -0
- package/skills/shared/clickhouse-analytics/SKILL.md +159 -0
- package/skills/shared/clickhouse-analytics/evals/README.md +3 -0
- package/skills/shared/clickhouse-analytics/evals/cases.yaml +45 -0
- package/skills/shared/clickhouse-analytics/references/ingestion-and-mvs.md +109 -0
- package/skills/shared/clickhouse-analytics/references/query-optimization.md +76 -0
- package/skills/shared/clickhouse-analytics/references/schema-and-engines.md +63 -0
- package/skills/shared/clickhouse-analytics/scripts/verify.sh +109 -0
- package/skills/shared/cloudflare/SKILL.md +186 -0
- package/skills/shared/cloudflare/evals/README.md +15 -0
- package/skills/shared/cloudflare/evals/cases.yaml +46 -0
- package/skills/shared/cloudflare/references/storage-primitives.md +104 -0
- package/skills/shared/cloudflare/references/wrangler-config.md +91 -0
- package/skills/shared/cloudflare/scripts/verify.sh +133 -0
- package/skills/shared/code-review/SKILL.md +132 -0
- package/skills/shared/code-review/evals/README.md +3 -0
- package/skills/shared/code-review/evals/cases.yaml +55 -0
- package/skills/shared/code-review/references/pr-workflow.md +67 -0
- package/skills/shared/codebase-onboarding/SKILL.md +128 -0
- package/skills/shared/codebase-onboarding/evals/README.md +3 -0
- package/skills/shared/codebase-onboarding/evals/cases.yaml +69 -0
- package/skills/shared/codebase-onboarding/references/recon-playbook.md +57 -0
- package/skills/shared/codebase-onboarding/scripts/verify.sh +54 -0
- package/skills/shared/compose-multiplatform/SKILL.md +198 -0
- package/skills/shared/compose-multiplatform/evals/README.md +3 -0
- package/skills/shared/compose-multiplatform/evals/cases.yaml +40 -0
- package/skills/shared/compose-multiplatform/references/ios-interop.md +91 -0
- package/skills/shared/compose-multiplatform/references/project-setup.md +96 -0
- package/skills/shared/compose-multiplatform/scripts/verify.sh +123 -0
- package/skills/shared/connect-tool/SKILL.md +163 -0
- package/skills/shared/connect-tool/evals/cases.yaml +58 -0
- package/skills/shared/constitution/SKILL.md +158 -0
- package/skills/shared/constitution/evals/README.md +68 -0
- package/skills/shared/constitution/evals/cases.yaml +72 -0
- package/skills/shared/constitution/references/constitution-template.md +100 -0
- package/skills/shared/context-budget/SKILL.md +114 -0
- package/skills/shared/context-budget/evals/README.md +11 -0
- package/skills/shared/context-budget/evals/cases.yaml +40 -0
- package/skills/shared/context-budget/references/handoff-and-compaction.md +96 -0
- package/skills/shared/continuous-learning/SKILL.md +106 -0
- package/skills/shared/continuous-learning/evals/README.md +16 -0
- package/skills/shared/continuous-learning/evals/cases.yaml +39 -0
- package/skills/shared/continuous-learning/references/lesson-routing.md +106 -0
- package/skills/shared/coolify/SKILL.md +194 -0
- package/skills/shared/coolify/evals/README.md +21 -0
- package/skills/shared/coolify/evals/cases.yaml +46 -0
- package/skills/shared/coolify/references/databases-and-backups.md +99 -0
- package/skills/shared/coolify/references/deploy-recipes.md +105 -0
- package/skills/shared/coolify/references/install-and-proxy.md +80 -0
- package/skills/shared/coolify/scripts/verify.sh +123 -0
- package/skills/shared/cost-tracking/SKILL.md +176 -0
- package/skills/shared/cost-tracking/evals/README.md +3 -0
- package/skills/shared/cost-tracking/evals/cases.yaml +45 -0
- package/skills/shared/cost-tracking/references/cloud-caps.md +52 -0
- package/skills/shared/cost-tracking/references/pricing-tables.md +51 -0
- package/skills/shared/cost-tracking/scripts/verify.sh +135 -0
- package/skills/shared/cpp/SKILL.md +302 -0
- package/skills/shared/cpp/evals/README.md +14 -0
- package/skills/shared/cpp/evals/cases.yaml +44 -0
- package/skills/shared/cpp/references/cmake.md +167 -0
- package/skills/shared/cpp/references/move-and-templates.md +130 -0
- package/skills/shared/cpp/references/undefined-behavior.md +86 -0
- package/skills/shared/cpp/scripts/verify.sh +165 -0
- package/skills/shared/csharp-dotnet/SKILL.md +272 -0
- package/skills/shared/csharp-dotnet/evals/README.md +3 -0
- package/skills/shared/csharp-dotnet/evals/cases.yaml +48 -0
- package/skills/shared/csharp-dotnet/references/aspnetcore.md +99 -0
- package/skills/shared/csharp-dotnet/references/async.md +82 -0
- package/skills/shared/csharp-dotnet/references/efcore.md +96 -0
- package/skills/shared/csharp-dotnet/scripts/verify.sh +90 -0
- package/skills/shared/data-cleaning/SKILL.md +259 -0
- package/skills/shared/data-cleaning/evals/README.md +16 -0
- package/skills/shared/data-cleaning/evals/cases.yaml +57 -0
- package/skills/shared/data-cleaning/references/normalization-recipes.md +136 -0
- package/skills/shared/data-cleaning/references/validation-patterns.md +134 -0
- package/skills/shared/data-cleaning/scripts/verify.sh +115 -0
- package/skills/shared/data-scraper/SKILL.md +130 -0
- package/skills/shared/data-scraper/evals/README.md +3 -0
- package/skills/shared/data-scraper/evals/cases.yaml +46 -0
- package/skills/shared/data-scraper/references/anti-bot.md +85 -0
- package/skills/shared/data-scraper/references/frameworks.md +116 -0
- package/skills/shared/data-scraper/references/legal-compliance.md +64 -0
- package/skills/shared/data-scraper/scripts/verify.sh +166 -0
- package/skills/shared/db-migrations/SKILL.md +237 -0
- package/skills/shared/db-migrations/evals/README.md +10 -0
- package/skills/shared/db-migrations/evals/cases.yaml +46 -0
- package/skills/shared/db-migrations/references/backfill-and-batching.md +105 -0
- package/skills/shared/db-migrations/references/expand-contract-playbook.md +152 -0
- package/skills/shared/db-migrations/references/tools-and-runners.md +88 -0
- package/skills/shared/db-migrations/scripts/verify.sh +112 -0
- package/skills/shared/debug/SKILL.md +188 -0
- package/skills/shared/debug/evals/README.md +88 -0
- package/skills/shared/debug/evals/cases.yaml +74 -0
- package/skills/shared/decision-challenge/SKILL.md +113 -0
- package/skills/shared/decision-challenge/evals/README.md +3 -0
- package/skills/shared/decision-challenge/evals/cases.yaml +42 -0
- package/skills/shared/decision-records/SKILL.md +202 -0
- package/skills/shared/decision-records/evals/README.md +3 -0
- package/skills/shared/decision-records/evals/cases.yaml +43 -0
- package/skills/shared/decision-records/references/templates.md +252 -0
- package/skills/shared/decision-records/scripts/verify.sh +105 -0
- package/skills/shared/deep-learning/SKILL.md +226 -0
- package/skills/shared/deep-learning/evals/README.md +11 -0
- package/skills/shared/deep-learning/evals/cases.yaml +48 -0
- package/skills/shared/deep-learning/references/distributed.md +105 -0
- package/skills/shared/deep-learning/references/training-recipes.md +135 -0
- package/skills/shared/deployment/SKILL.md +374 -0
- package/skills/shared/deployment/evals/README.md +50 -0
- package/skills/shared/deployment/evals/cases.yaml +53 -0
- package/skills/shared/deployment/references/coolify.md +216 -0
- package/skills/shared/deployment/references/dockerfiles-by-stack.md +319 -0
- package/skills/shared/deployment/references/github-actions.md +295 -0
- package/skills/shared/deployment/references/hosting-targets.md +272 -0
- package/skills/shared/deployment/scripts/verify.sh +134 -0
- package/skills/shared/deprecation/SKILL.md +123 -0
- package/skills/shared/deprecation/evals/README.md +3 -0
- package/skills/shared/deprecation/evals/cases.yaml +42 -0
- package/skills/shared/design/IMPECCABLE-LICENSE.txt +191 -0
- package/skills/shared/design/SKILL.md +111 -0
- package/skills/shared/design/THIRD_PARTY.md +26 -0
- package/skills/shared/design/engine/LICENSE +21 -0
- package/skills/shared/design/engine/RUN.md +515 -0
- package/skills/shared/design/engine/UPSTREAM.json +4 -0
- package/skills/shared/design/engine/assets/app.css +216 -0
- package/skills/shared/design/engine/assets/base.css +105 -0
- package/skills/shared/design/engine/assets/base.js +37 -0
- package/skills/shared/design/engine/assets/charts.js +617 -0
- package/skills/shared/design/engine/assets/scenes/stage.css +28 -0
- package/skills/shared/design/engine/assets/scenes/stage.js +133 -0
- package/skills/shared/design/engine/library/app.json +1327 -0
- package/skills/shared/design/engine/library/directions.json +1078 -0
- package/skills/shared/design/engine/library/heroes.json +1086 -0
- package/skills/shared/design/engine/library/motions.json +92 -0
- package/skills/shared/design/engine/library/palettes.json +1485 -0
- package/skills/shared/design/engine/library/photos.json +7240 -0
- package/skills/shared/design/engine/library/sections.json +4429 -0
- package/skills/shared/design/engine/library/sites.json +8350 -0
- package/skills/shared/design/engine/library/type.json +2024 -0
- package/skills/shared/design/engine/references/app-screens.md +1199 -0
- package/skills/shared/design/engine/references/colour.md +141 -0
- package/skills/shared/design/engine/references/copy.md +177 -0
- package/skills/shared/design/engine/references/critique.md +182 -0
- package/skills/shared/design/engine/references/imagery.md +791 -0
- package/skills/shared/design/engine/references/layout.md +292 -0
- package/skills/shared/design/engine/references/motion.md +980 -0
- package/skills/shared/design/engine/references/research.md +356 -0
- package/skills/shared/design/engine/references/scenes.md +174 -0
- package/skills/shared/design/engine/references/tells.md +115 -0
- package/skills/shared/design/engine/references/type.md +170 -0
- package/skills/shared/design/engine/scripts/assets.mjs +865 -0
- package/skills/shared/design/engine/scripts/draw.mjs +584 -0
- package/skills/shared/design/engine/scripts/inspect.mjs +303 -0
- package/skills/shared/design/engine/scripts/lib/app-draw.mjs +203 -0
- package/skills/shared/design/engine/scripts/lib/cdp.mjs +248 -0
- package/skills/shared/design/engine/scripts/lib/probe.mjs +909 -0
- package/skills/shared/design/engine/scripts/lib/rules.mjs +243 -0
- package/skills/shared/design/engine/scripts/lint.mjs +119 -0
- package/skills/shared/design/engine/scripts/scenes.mjs +124 -0
- package/skills/shared/design/evals/cases.yaml +45 -0
- package/skills/shared/design/references/design-md.md +49 -0
- package/skills/shared/design/references/finish-review.md +46 -0
- package/skills/shared/design/references/modes.md +51 -0
- package/skills/shared/digitalocean/SKILL.md +227 -0
- package/skills/shared/digitalocean/evals/README.md +10 -0
- package/skills/shared/digitalocean/evals/cases.yaml +37 -0
- package/skills/shared/digitalocean/references/app-spec.md +126 -0
- package/skills/shared/digitalocean/references/droplet-ops.md +95 -0
- package/skills/shared/digitalocean/scripts/verify.sh +102 -0
- package/skills/shared/django/SKILL.md +263 -0
- package/skills/shared/django/evals/README.md +11 -0
- package/skills/shared/django/evals/cases.yaml +47 -0
- package/skills/shared/django/references/drf.md +109 -0
- package/skills/shared/django/references/orm-performance.md +91 -0
- package/skills/shared/django/references/security.md +81 -0
- package/skills/shared/django/references/testing.md +86 -0
- package/skills/shared/django/scripts/verify.sh +115 -0
- package/skills/shared/docker/SKILL.md +251 -0
- package/skills/shared/docker/evals/README.md +10 -0
- package/skills/shared/docker/evals/cases.yaml +44 -0
- package/skills/shared/docker/references/base-images-and-stages.md +104 -0
- package/skills/shared/docker/references/compose-recipes.md +109 -0
- package/skills/shared/docker/scripts/verify.sh +149 -0
- package/skills/shared/domains-dns/SKILL.md +131 -0
- package/skills/shared/domains-dns/evals/README.md +16 -0
- package/skills/shared/domains-dns/evals/cases.yaml +47 -0
- package/skills/shared/domains-dns/references/record-cookbook.md +94 -0
- package/skills/shared/domains-dns/references/tls-and-acme.md +90 -0
- package/skills/shared/domains-dns/references/verify-and-debug.md +64 -0
- package/skills/shared/domains-dns/scripts/verify.sh +163 -0
- package/skills/shared/drizzle-orm/SKILL.md +231 -0
- package/skills/shared/drizzle-orm/evals/README.md +12 -0
- package/skills/shared/drizzle-orm/evals/cases.yaml +47 -0
- package/skills/shared/drizzle-orm/references/relations-and-drivers.md +118 -0
- package/skills/shared/drizzle-orm/scripts/verify.sh +155 -0
- package/skills/shared/duckdb/SKILL.md +202 -0
- package/skills/shared/duckdb/evals/README.md +31 -0
- package/skills/shared/duckdb/evals/cases.yaml +41 -0
- package/skills/shared/duckdb/references/python-and-interop.md +105 -0
- package/skills/shared/duckdb/references/remote-and-lakehouse.md +101 -0
- package/skills/shared/duckdb/scripts/verify.sh +71 -0
- package/skills/shared/dynamodb/SKILL.md +204 -0
- package/skills/shared/dynamodb/evals/README.md +8 -0
- package/skills/shared/dynamodb/evals/cases.yaml +46 -0
- package/skills/shared/dynamodb/references/access-patterns.md +127 -0
- package/skills/shared/dynamodb/references/capacity-and-limits.md +78 -0
- package/skills/shared/dynamodb/scripts/verify.sh +108 -0
- package/skills/shared/e2e-testing/SKILL.md +233 -0
- package/skills/shared/e2e-testing/evals/README.md +10 -0
- package/skills/shared/e2e-testing/evals/cases.yaml +64 -0
- package/skills/shared/e2e-testing/references/config-and-ci.md +156 -0
- package/skills/shared/e2e-testing/references/flakiness-playbook.md +124 -0
- package/skills/shared/e2e-testing/scripts/verify.sh +117 -0
- package/skills/shared/electron/SKILL.md +209 -0
- package/skills/shared/electron/evals/README.md +13 -0
- package/skills/shared/electron/evals/cases.yaml +38 -0
- package/skills/shared/electron/references/packaging-and-updates.md +122 -0
- package/skills/shared/electron/references/security-and-ipc.md +158 -0
- package/skills/shared/electron/scripts/verify.sh +143 -0
- package/skills/shared/elixir/SKILL.md +209 -0
- package/skills/shared/elixir/evals/README.md +3 -0
- package/skills/shared/elixir/evals/cases.yaml +41 -0
- package/skills/shared/elixir/references/mix-and-releases.md +91 -0
- package/skills/shared/elixir/references/otp-patterns.md +96 -0
- package/skills/shared/elixir/scripts/verify.sh +76 -0
- package/skills/shared/email-deliverability/SKILL.md +148 -0
- package/skills/shared/email-deliverability/evals/README.md +21 -0
- package/skills/shared/email-deliverability/evals/cases.yaml +45 -0
- package/skills/shared/email-deliverability/scripts/verify.sh +98 -0
- package/skills/shared/embeddings-search/SKILL.md +184 -0
- package/skills/shared/embeddings-search/evals/README.md +10 -0
- package/skills/shared/embeddings-search/evals/cases.yaml +44 -0
- package/skills/shared/embeddings-search/references/evaluation.md +86 -0
- package/skills/shared/embeddings-search/references/models.md +73 -0
- package/skills/shared/embeddings-search/scripts/verify.sh +103 -0
- package/skills/shared/error-handling/SKILL.md +273 -0
- package/skills/shared/error-handling/evals/README.md +12 -0
- package/skills/shared/error-handling/evals/cases.yaml +46 -0
- package/skills/shared/error-handling/references/boundaries-and-messaging.md +120 -0
- package/skills/shared/error-handling/references/retry-and-resilience.md +154 -0
- package/skills/shared/error-handling/scripts/verify.sh +110 -0
- package/skills/shared/expo/SKILL.md +243 -0
- package/skills/shared/expo/evals/README.md +13 -0
- package/skills/shared/expo/evals/cases.yaml +44 -0
- package/skills/shared/expo/references/config-plugins.md +117 -0
- package/skills/shared/expo/references/eas-update.md +118 -0
- package/skills/shared/expo/scripts/verify.sh +132 -0
- package/skills/shared/fal/SKILL.md +196 -0
- package/skills/shared/fal/evals/README.md +3 -0
- package/skills/shared/fal/evals/cases.yaml +42 -0
- package/skills/shared/fal/references/models-and-cost.md +53 -0
- package/skills/shared/fal/references/queue-and-webhooks.md +153 -0
- package/skills/shared/fal/scripts/verify.sh +72 -0
- package/skills/shared/fastapi/SKILL.md +469 -0
- package/skills/shared/fastapi/evals/README.md +50 -0
- package/skills/shared/fastapi/evals/cases.yaml +55 -0
- package/skills/shared/fastapi/references/database.md +347 -0
- package/skills/shared/fastapi/references/production.md +338 -0
- package/skills/shared/fastapi/references/security.md +330 -0
- package/skills/shared/fastapi/references/testing.md +349 -0
- package/skills/shared/fastapi/scripts/verify.sh +157 -0
- package/skills/shared/finetuning/SKILL.md +232 -0
- package/skills/shared/finetuning/evals/README.md +13 -0
- package/skills/shared/finetuning/evals/cases.yaml +50 -0
- package/skills/shared/finetuning/references/hyperparameters-and-eval.md +74 -0
- package/skills/shared/finetuning/references/methods.md +189 -0
- package/skills/shared/firebase/SKILL.md +237 -0
- package/skills/shared/firebase/evals/README.md +12 -0
- package/skills/shared/firebase/evals/cases.yaml +45 -0
- package/skills/shared/firebase/references/cloud-functions.md +102 -0
- package/skills/shared/firebase/references/data-modeling.md +108 -0
- package/skills/shared/firebase/references/security-rules.md +137 -0
- package/skills/shared/firebase/scripts/verify.sh +98 -0
- package/skills/shared/flutter/SKILL.md +400 -0
- package/skills/shared/flutter/evals/README.md +54 -0
- package/skills/shared/flutter/evals/cases.yaml +69 -0
- package/skills/shared/flutter/references/architecture-and-state.md +499 -0
- package/skills/shared/flutter/references/i18n-and-dependencies.md +197 -0
- package/skills/shared/flutter/references/performance.md +299 -0
- package/skills/shared/flutter/references/testing.md +385 -0
- package/skills/shared/flutter/references/ui-and-navigation.md +378 -0
- package/skills/shared/flutter/scripts/verify.sh +104 -0
- package/skills/shared/fly-io/SKILL.md +197 -0
- package/skills/shared/fly-io/evals/README.md +3 -0
- package/skills/shared/fly-io/evals/cases.yaml +42 -0
- package/skills/shared/fly-io/references/fly-toml.md +155 -0
- package/skills/shared/fly-io/references/multi-region.md +66 -0
- package/skills/shared/fly-io/scripts/verify.sh +90 -0
- package/skills/shared/ftd/SKILL.md +111 -0
- package/skills/shared/ftd/evals/cases.yaml +66 -0
- package/skills/shared/ftd/evals/routing.json +24 -0
- package/skills/shared/game-design/SKILL.md +146 -0
- package/skills/shared/game-design/evals/README.md +13 -0
- package/skills/shared/game-design/evals/cases.yaml +47 -0
- package/skills/shared/game-design/references/mechanics-and-loops.md +78 -0
- package/skills/shared/game-design/references/playtesting-and-scope.md +58 -0
- package/skills/shared/game-design/references/progression-and-economy.md +70 -0
- package/skills/shared/game-storytelling/SKILL.md +134 -0
- package/skills/shared/game-storytelling/evals/README.md +28 -0
- package/skills/shared/game-storytelling/evals/cases.yaml +51 -0
- package/skills/shared/game-storytelling/references/branching-and-state.md +134 -0
- package/skills/shared/game-storytelling/references/dialogue-tools.md +117 -0
- package/skills/shared/game-storytelling/references/environmental-storytelling.md +71 -0
- package/skills/shared/gamedev-multiplayer/SKILL.md +237 -0
- package/skills/shared/gamedev-multiplayer/evals/README.md +12 -0
- package/skills/shared/gamedev-multiplayer/evals/cases.yaml +44 -0
- package/skills/shared/gamedev-multiplayer/references/godot-high-level-multiplayer.md +133 -0
- package/skills/shared/gamedev-multiplayer/references/prediction-and-latency.md +104 -0
- package/skills/shared/gamedev-multiplayer/references/unity-and-unreal-netcode.md +166 -0
- package/skills/shared/gamedev-pathing/SKILL.md +233 -0
- package/skills/shared/gamedev-pathing/evals/README.md +14 -0
- package/skills/shared/gamedev-pathing/evals/cases.yaml +49 -0
- package/skills/shared/gamedev-pathing/references/navmesh-workflow.md +110 -0
- package/skills/shared/gamedev-pathing/references/search-algorithms.md +135 -0
- package/skills/shared/gamedev-pathing/references/steering-and-avoidance.md +120 -0
- package/skills/shared/gamedev-physics/SKILL.md +225 -0
- package/skills/shared/gamedev-physics/evals/README.md +12 -0
- package/skills/shared/gamedev-physics/evals/cases.yaml +54 -0
- package/skills/shared/gamedev-physics/references/character-controllers.md +120 -0
- package/skills/shared/gamedev-physics/references/determinism-and-queries.md +124 -0
- package/skills/shared/gamedev-physics/references/layers-and-masks.md +115 -0
- package/skills/shared/gamedev-shaders/SKILL.md +232 -0
- package/skills/shared/gamedev-shaders/evals/README.md +14 -0
- package/skills/shared/gamedev-shaders/evals/cases.yaml +45 -0
- package/skills/shared/gamedev-shaders/references/effect-recipes.md +205 -0
- package/skills/shared/gamedev-shaders/references/godot-shading-language.md +133 -0
- package/skills/shared/gamedev-shaders/references/unity-and-unreal-shaders.md +169 -0
- package/skills/shared/gamedev-shipping/SKILL.md +220 -0
- package/skills/shared/gamedev-shipping/evals/README.md +9 -0
- package/skills/shared/gamedev-shipping/evals/cases.yaml +55 -0
- package/skills/shared/gamedev-shipping/references/mobile-and-desktop.md +127 -0
- package/skills/shared/gamedev-shipping/references/stores-and-ci.md +162 -0
- package/skills/shared/gamedev-shipping/references/web-export-headers.md +140 -0
- package/skills/shared/gcp-essentials/SKILL.md +324 -0
- package/skills/shared/gcp-essentials/evals/README.md +12 -0
- package/skills/shared/gcp-essentials/evals/cases.yaml +38 -0
- package/skills/shared/gcp-essentials/references/deploy-recipes.md +81 -0
- package/skills/shared/gcp-essentials/references/iam-and-auth.md +94 -0
- package/skills/shared/gcp-essentials/references/networking-and-sql.md +74 -0
- package/skills/shared/gcp-essentials/scripts/verify.sh +158 -0
- package/skills/shared/git-workflow/SKILL.md +214 -0
- package/skills/shared/git-workflow/evals/README.md +10 -0
- package/skills/shared/git-workflow/evals/cases.yaml +52 -0
- package/skills/shared/git-workflow/references/gitmoji.md +157 -0
- package/skills/shared/git-workflow/references/interactive-rebase.md +89 -0
- package/skills/shared/github-actions/SKILL.md +244 -0
- package/skills/shared/github-actions/evals/README.md +3 -0
- package/skills/shared/github-actions/evals/cases.yaml +45 -0
- package/skills/shared/github-actions/references/caching-and-matrix.md +92 -0
- package/skills/shared/github-actions/references/oidc-deploys.md +130 -0
- package/skills/shared/github-actions/scripts/verify.sh +105 -0
- package/skills/shared/gitlab-auth/SKILL.md +99 -0
- package/skills/shared/gitlab-workflow/SKILL.md +138 -0
- package/skills/shared/go/SKILL.md +390 -0
- package/skills/shared/go/evals/README.md +56 -0
- package/skills/shared/go/evals/cases.yaml +55 -0
- package/skills/shared/go/references/concurrency.md +557 -0
- package/skills/shared/go/references/http-services.md +529 -0
- package/skills/shared/go/references/testing.md +338 -0
- package/skills/shared/go/scripts/verify.sh +134 -0
- package/skills/shared/godot/SKILL.md +300 -0
- package/skills/shared/godot/evals/README.md +13 -0
- package/skills/shared/godot/evals/cases.yaml +50 -0
- package/skills/shared/godot/references/export-and-testing.md +102 -0
- package/skills/shared/godot/references/gdscript-style.md +84 -0
- package/skills/shared/godot/references/godot3-to-4-traps.md +89 -0
- package/skills/shared/godot/references/nodes-scenes-resources.md +109 -0
- package/skills/shared/harness/SKILL.md +316 -0
- package/skills/shared/harness/assets/_TEMPLATE/.env.example +8 -0
- package/skills/shared/harness/assets/_TEMPLATE/CREDENTIALS.md +25 -0
- package/skills/shared/harness/assets/_TEMPLATE/README.md +25 -0
- package/skills/shared/harness/assets/_TEMPLATE/gitignore +10 -0
- package/skills/shared/harness/assets/_TEMPLATE/test_connection.sh +30 -0
- package/skills/shared/harness/evals/README.md +54 -0
- package/skills/shared/harness/evals/cases.yaml +72 -0
- package/skills/shared/harness/examples/audit-example.md +120 -0
- package/skills/shared/harness/references/agents-md-template.md +41 -0
- package/skills/shared/harness/references/audit-report-template.html +140 -0
- package/skills/shared/harness/references/audit-report-template.md +116 -0
- package/skills/shared/harness/references/claude-md-template.md +85 -0
- package/skills/shared/harness/references/daily-curation-automation.md +68 -0
- package/skills/shared/harness/references/inbox-readme-template.md +51 -0
- package/skills/shared/harness/references/ingest-formats.md +185 -0
- package/skills/shared/harness/references/ingest-ignore-defaults.md +48 -0
- package/skills/shared/harness/references/obsidian-scaffolding.md +103 -0
- package/skills/shared/harness/references/providers.yaml +3546 -0
- package/skills/shared/harness/references/tools-readme-template.md +88 -0
- package/skills/shared/harness/references/wiki-archive-template.html +81 -0
- package/skills/shared/harness/references/wiki-article-template.md +60 -0
- package/skills/shared/harness/references/wiki-dashboard-template.html +136 -0
- package/skills/shared/harness/references/wiki-deep-improve-report-template.html +126 -0
- package/skills/shared/harness/references/wiki-gaps-template.md +22 -0
- package/skills/shared/harness/references/wiki-index-template.md +32 -0
- package/skills/shared/harness/references/wiki-protocol.md +926 -0
- package/skills/shared/harness/references/wiki-raw-template.md +7 -0
- package/skills/shared/harness/references/wiki-worklog-template.md +60 -0
- package/skills/shared/hetzner/SKILL.md +203 -0
- package/skills/shared/hetzner/evals/README.md +35 -0
- package/skills/shared/hetzner/evals/cases.yaml +46 -0
- package/skills/shared/hetzner/references/cloud-init.md +120 -0
- package/skills/shared/hetzner/references/plans-and-locations.md +56 -0
- package/skills/shared/hetzner/scripts/verify.sh +122 -0
- package/skills/shared/htmx/SKILL.md +261 -0
- package/skills/shared/htmx/evals/README.md +3 -0
- package/skills/shared/htmx/evals/cases.yaml +38 -0
- package/skills/shared/htmx/references/patterns.md +113 -0
- package/skills/shared/htmx/references/server-contract.md +91 -0
- package/skills/shared/htmx/scripts/verify.sh +93 -0
- package/skills/shared/huggingface/SKILL.md +191 -0
- package/skills/shared/huggingface/evals/README.md +11 -0
- package/skills/shared/huggingface/evals/cases.yaml +41 -0
- package/skills/shared/huggingface/references/endpoints-and-spaces.md +99 -0
- package/skills/shared/huggingface/references/hub-and-cli.md +85 -0
- package/skills/shared/huggingface/references/inference-providers.md +115 -0
- package/skills/shared/huggingface/scripts/verify.sh +123 -0
- package/skills/shared/idea-refinement/SKILL.md +121 -0
- package/skills/shared/idea-refinement/evals/README.md +3 -0
- package/skills/shared/idea-refinement/evals/cases.yaml +42 -0
- package/skills/shared/implement/SKILL.md +383 -0
- package/skills/shared/implement/evals/README.md +56 -0
- package/skills/shared/implement/evals/cases.yaml +43 -0
- package/skills/shared/implement/references/per-task-review.md +46 -0
- package/skills/shared/implement/scripts/review-package +59 -0
- package/skills/shared/implement/scripts/sdd-workspace +47 -0
- package/skills/shared/implement/scripts/task-brief +77 -0
- package/skills/shared/init/SKILL.md +209 -0
- package/skills/shared/init/evals/README.md +49 -0
- package/skills/shared/init/evals/cases.yaml +74 -0
- package/skills/shared/init/references/accompaniment-and-profile.md +122 -0
- package/skills/shared/init/references/discovery.md +90 -0
- package/skills/shared/init/references/recommend-skills.md +115 -0
- package/skills/shared/init/scripts/verify.sh +118 -0
- package/skills/shared/java/SKILL.md +341 -0
- package/skills/shared/java/evals/README.md +23 -0
- package/skills/shared/java/evals/cases.yaml +43 -0
- package/skills/shared/java/references/builds.md +133 -0
- package/skills/shared/java/references/concurrency.md +108 -0
- package/skills/shared/java/references/streams.md +102 -0
- package/skills/shared/java/scripts/verify.sh +107 -0
- package/skills/shared/knowledge-ops/SKILL.md +122 -0
- package/skills/shared/knowledge-ops/evals/README.md +16 -0
- package/skills/shared/knowledge-ops/evals/cases.yaml +50 -0
- package/skills/shared/knowledge-ops/references/gardening-playbook.md +126 -0
- package/skills/shared/kotlin-android/SKILL.md +245 -0
- package/skills/shared/kotlin-android/evals/README.md +13 -0
- package/skills/shared/kotlin-android/evals/cases.yaml +56 -0
- package/skills/shared/kotlin-android/references/architecture.md +200 -0
- package/skills/shared/kotlin-android/references/gradle-setup.md +125 -0
- package/skills/shared/kotlin-android/scripts/verify.sh +109 -0
- package/skills/shared/laravel/SKILL.md +301 -0
- package/skills/shared/laravel/evals/README.md +10 -0
- package/skills/shared/laravel/evals/cases.yaml +45 -0
- package/skills/shared/laravel/references/eloquent-patterns.md +126 -0
- package/skills/shared/laravel/references/queues-and-scheduling.md +153 -0
- package/skills/shared/laravel/scripts/verify.sh +128 -0
- package/skills/shared/level-design/SKILL.md +143 -0
- package/skills/shared/level-design/evals/README.md +35 -0
- package/skills/shared/level-design/evals/cases.yaml +58 -0
- package/skills/shared/level-design/references/blockout-to-art.md +118 -0
- package/skills/shared/level-design/references/guidance-and-readability.md +152 -0
- package/skills/shared/level-design/references/pacing-and-encounters.md +142 -0
- package/skills/shared/llm-pipeline/SKILL.md +150 -0
- package/skills/shared/llm-pipeline/evals/README.md +3 -0
- package/skills/shared/llm-pipeline/evals/cases.yaml +44 -0
- package/skills/shared/llm-pipeline/references/caching-layers.md +60 -0
- package/skills/shared/llm-pipeline/references/litellm-router.md +101 -0
- package/skills/shared/llm-pipeline/scripts/verify.sh +169 -0
- package/skills/shared/machine-learning/SKILL.md +228 -0
- package/skills/shared/machine-learning/evals/README.md +15 -0
- package/skills/shared/machine-learning/evals/cases.yaml +54 -0
- package/skills/shared/machine-learning/references/gbdt-and-tuning.md +83 -0
- package/skills/shared/machine-learning/references/metrics-and-imbalance.md +82 -0
- package/skills/shared/machine-learning/references/pipelines-and-cv.md +135 -0
- package/skills/shared/modal/SKILL.md +290 -0
- package/skills/shared/modal/evals/README.md +29 -0
- package/skills/shared/modal/evals/cases.yaml +50 -0
- package/skills/shared/modal/references/images-gpu-cookbook.md +160 -0
- package/skills/shared/modal/references/web-and-scaling.md +138 -0
- package/skills/shared/modal/scripts/verify.sh +127 -0
- package/skills/shared/mongodb/SKILL.md +342 -0
- package/skills/shared/mongodb/evals/README.md +29 -0
- package/skills/shared/mongodb/evals/cases.yaml +41 -0
- package/skills/shared/mongodb/references/aggregation.md +115 -0
- package/skills/shared/mongodb/references/data-modeling.md +135 -0
- package/skills/shared/mongodb/references/transactions-and-ops.md +128 -0
- package/skills/shared/mongodb/scripts/verify.sh +151 -0
- package/skills/shared/monitoring/SKILL.md +155 -0
- package/skills/shared/monitoring/evals/README.md +3 -0
- package/skills/shared/monitoring/evals/cases.yaml +47 -0
- package/skills/shared/monitoring/references/burn-rate-and-oncall.md +128 -0
- package/skills/shared/monitoring/references/tool-setup.md +154 -0
- package/skills/shared/monitoring/scripts/verify.sh +145 -0
- package/skills/shared/mysql/SKILL.md +249 -0
- package/skills/shared/mysql/evals/README.md +12 -0
- package/skills/shared/mysql/evals/cases.yaml +49 -0
- package/skills/shared/mysql/references/indexing-and-explain.md +161 -0
- package/skills/shared/mysql/references/mysql-vs-mariadb.md +78 -0
- package/skills/shared/mysql/references/online-ddl-and-migrations.md +120 -0
- package/skills/shared/mysql/references/replication-and-ha.md +115 -0
- package/skills/shared/mysql/scripts/verify.sh +141 -0
- package/skills/shared/neon/SKILL.md +218 -0
- package/skills/shared/neon/evals/README.md +11 -0
- package/skills/shared/neon/evals/cases.yaml +45 -0
- package/skills/shared/neon/references/branching-ci.md +86 -0
- package/skills/shared/neon/scripts/verify.sh +78 -0
- package/skills/shared/nestjs/SKILL.md +217 -0
- package/skills/shared/nestjs/evals/README.md +3 -0
- package/skills/shared/nestjs/evals/cases.yaml +38 -0
- package/skills/shared/nestjs/references/cross-cutting.md +135 -0
- package/skills/shared/nestjs/references/testing-recipes.md +105 -0
- package/skills/shared/nestjs/scripts/verify.sh +98 -0
- package/skills/shared/netlify/SKILL.md +208 -0
- package/skills/shared/netlify/evals/README.md +13 -0
- package/skills/shared/netlify/evals/cases.yaml +43 -0
- package/skills/shared/netlify/references/functions.md +97 -0
- package/skills/shared/netlify/references/netlify-toml.md +115 -0
- package/skills/shared/netlify/scripts/verify.sh +95 -0
- package/skills/shared/nextjs/SKILL.md +400 -0
- package/skills/shared/nextjs/evals/README.md +59 -0
- package/skills/shared/nextjs/evals/cases.yaml +56 -0
- package/skills/shared/nextjs/references/data-and-caching.md +309 -0
- package/skills/shared/nextjs/references/metadata.md +208 -0
- package/skills/shared/nextjs/references/performance.md +325 -0
- package/skills/shared/nextjs/references/react.md +383 -0
- package/skills/shared/nextjs/references/security.md +239 -0
- package/skills/shared/nextjs/references/testing.md +290 -0
- package/skills/shared/nextjs/scripts/verify.sh +141 -0
- package/skills/shared/nlp/SKILL.md +225 -0
- package/skills/shared/nlp/evals/README.md +10 -0
- package/skills/shared/nlp/evals/cases.yaml +45 -0
- package/skills/shared/nlp/references/evaluation.md +107 -0
- package/skills/shared/nlp/references/tokenization.md +95 -0
- package/skills/shared/no-code-app/SKILL.md +145 -0
- package/skills/shared/no-code-app/evals/README.md +3 -0
- package/skills/shared/no-code-app/evals/cases.yaml +43 -0
- package/skills/shared/no-code-app/references/platform-limits.md +100 -0
- package/skills/shared/nodejs/SKILL.md +229 -0
- package/skills/shared/nodejs/evals/README.md +3 -0
- package/skills/shared/nodejs/evals/cases.yaml +39 -0
- package/skills/shared/nodejs/references/express5-migration.md +53 -0
- package/skills/shared/nodejs/references/graceful-shutdown.md +73 -0
- package/skills/shared/nodejs/scripts/verify.sh +122 -0
- package/skills/shared/observability/SKILL.md +235 -0
- package/skills/shared/observability/evals/README.md +3 -0
- package/skills/shared/observability/evals/cases.yaml +51 -0
- package/skills/shared/observability/references/collector-config.md +98 -0
- package/skills/shared/observability/references/instrumentation-recipes.md +115 -0
- package/skills/shared/observability/scripts/verify.sh +156 -0
- package/skills/shared/ollama/SKILL.md +213 -0
- package/skills/shared/ollama/evals/README.md +9 -0
- package/skills/shared/ollama/evals/cases.yaml +43 -0
- package/skills/shared/ollama/references/api.md +148 -0
- package/skills/shared/ollama/references/hardware-sizing.md +87 -0
- package/skills/shared/ollama/scripts/verify.sh +116 -0
- package/skills/shared/open-weights/SKILL.md +239 -0
- package/skills/shared/open-weights/evals/README.md +14 -0
- package/skills/shared/open-weights/evals/cases.yaml +42 -0
- package/skills/shared/open-weights/references/licenses.md +123 -0
- package/skills/shared/open-weights/references/model-families.md +83 -0
- package/skills/shared/open-weights/references/sizing-and-quant.md +89 -0
- package/skills/shared/orient/SKILL.md +92 -0
- package/skills/shared/orient/evals/README.md +18 -0
- package/skills/shared/orient/evals/cases.yaml +67 -0
- package/skills/shared/orient/references/explain-ladder.md +93 -0
- package/skills/shared/orient/references/orientation-contract.md +86 -0
- package/skills/shared/parallel/SKILL.md +168 -0
- package/skills/shared/parallel/evals/README.md +62 -0
- package/skills/shared/parallel/evals/cases.yaml +44 -0
- package/skills/shared/performance/SKILL.md +229 -0
- package/skills/shared/performance/evals/README.md +3 -0
- package/skills/shared/performance/evals/cases.yaml +49 -0
- package/skills/shared/performance/references/profiling-playbook.md +54 -0
- package/skills/shared/performance/scripts/verify.sh +94 -0
- package/skills/shared/phoenix/SKILL.md +169 -0
- package/skills/shared/phoenix/evals/README.md +3 -0
- package/skills/shared/phoenix/evals/cases.yaml +40 -0
- package/skills/shared/phoenix/references/auth-and-scopes.md +82 -0
- package/skills/shared/phoenix/references/ecto-patterns.md +93 -0
- package/skills/shared/phoenix/references/liveview.md +134 -0
- package/skills/shared/phoenix/scripts/verify.sh +73 -0
- package/skills/shared/php/SKILL.md +397 -0
- package/skills/shared/php/evals/README.md +12 -0
- package/skills/shared/php/evals/cases.yaml +45 -0
- package/skills/shared/php/references/tooling.md +170 -0
- package/skills/shared/php/references/type-system.md +220 -0
- package/skills/shared/php/scripts/verify.sh +155 -0
- package/skills/shared/plan/SKILL.md +166 -0
- package/skills/shared/plan/evals/README.md +62 -0
- package/skills/shared/plan/evals/cases.yaml +49 -0
- package/skills/shared/plan/references/plan-template.md +153 -0
- package/skills/shared/planetscale/SKILL.md +198 -0
- package/skills/shared/planetscale/evals/README.md +11 -0
- package/skills/shared/planetscale/evals/cases.yaml +46 -0
- package/skills/shared/planetscale/references/deploy-requests.md +75 -0
- package/skills/shared/planetscale/references/no-foreign-keys.md +88 -0
- package/skills/shared/planetscale/scripts/verify.sh +115 -0
- package/skills/shared/planning-with-files/SKILL.md +278 -0
- package/skills/shared/planning-with-files/examples.md +202 -0
- package/skills/shared/planning-with-files/reference.md +218 -0
- package/skills/shared/planning-with-files/scripts/attest-plan.ps1 +118 -0
- package/skills/shared/planning-with-files/scripts/attest-plan.sh +110 -0
- package/skills/shared/planning-with-files/scripts/check-complete.ps1 +44 -0
- package/skills/shared/planning-with-files/scripts/check-complete.sh +46 -0
- package/skills/shared/planning-with-files/scripts/init-session.ps1 +166 -0
- package/skills/shared/planning-with-files/scripts/init-session.sh +284 -0
- package/skills/shared/planning-with-files/scripts/resolve-plan-dir.ps1 +44 -0
- package/skills/shared/planning-with-files/scripts/resolve-plan-dir.sh +76 -0
- package/skills/shared/planning-with-files/scripts/session-catchup.py +438 -0
- package/skills/shared/planning-with-files/scripts/set-active-plan.ps1 +50 -0
- package/skills/shared/planning-with-files/scripts/set-active-plan.sh +50 -0
- package/skills/shared/planning-with-files/templates/findings.md +95 -0
- package/skills/shared/planning-with-files/templates/progress.md +114 -0
- package/skills/shared/planning-with-files/templates/task_plan.md +132 -0
- package/skills/shared/postgresdb/SKILL.md +354 -0
- package/skills/shared/postgresdb/evals/README.md +55 -0
- package/skills/shared/postgresdb/evals/cases.yaml +57 -0
- package/skills/shared/postgresdb/references/migrations.md +279 -0
- package/skills/shared/postgresdb/references/operations-and-security.md +267 -0
- package/skills/shared/postgresdb/references/query-optimization.md +374 -0
- package/skills/shared/postgresdb/references/schema-and-indexing.md +379 -0
- package/skills/shared/postgresdb/scripts/verify.sh +191 -0
- package/skills/shared/prisma-orm/SKILL.md +313 -0
- package/skills/shared/prisma-orm/evals/README.md +12 -0
- package/skills/shared/prisma-orm/evals/cases.yaml +56 -0
- package/skills/shared/prisma-orm/references/migrations-and-v7-upgrade.md +197 -0
- package/skills/shared/prisma-orm/references/queries-and-performance.md +169 -0
- package/skills/shared/prisma-orm/scripts/verify.sh +137 -0
- package/skills/shared/prompt-engineering/SKILL.md +127 -0
- package/skills/shared/prompt-engineering/evals/README.md +11 -0
- package/skills/shared/prompt-engineering/evals/cases.yaml +46 -0
- package/skills/shared/prompt-engineering/references/eval-templates.md +94 -0
- package/skills/shared/prompt-engineering/references/output-contracts.md +120 -0
- package/skills/shared/prompt-engineering/scripts/verify.sh +84 -0
- package/skills/shared/python/SKILL.md +320 -0
- package/skills/shared/python/evals/README.md +19 -0
- package/skills/shared/python/evals/cases.yaml +46 -0
- package/skills/shared/python/references/async.md +136 -0
- package/skills/shared/python/references/stdlib.md +162 -0
- package/skills/shared/python/references/typing.md +160 -0
- package/skills/shared/python/scripts/verify.sh +125 -0
- package/skills/shared/rag/SKILL.md +209 -0
- package/skills/shared/rag/evals/README.md +13 -0
- package/skills/shared/rag/evals/cases.yaml +45 -0
- package/skills/shared/rag/references/evaluation.md +99 -0
- package/skills/shared/rag/references/pipeline.md +151 -0
- package/skills/shared/rag/scripts/verify.sh +99 -0
- package/skills/shared/rails/SKILL.md +264 -0
- package/skills/shared/rails/evals/README.md +12 -0
- package/skills/shared/rails/evals/cases.yaml +47 -0
- package/skills/shared/rails/references/activerecord.md +148 -0
- package/skills/shared/rails/references/hotwire.md +139 -0
- package/skills/shared/rails/references/testing.md +110 -0
- package/skills/shared/rails/scripts/verify.sh +128 -0
- package/skills/shared/railway/SKILL.md +245 -0
- package/skills/shared/railway/evals/README.md +14 -0
- package/skills/shared/railway/evals/cases.yaml +44 -0
- package/skills/shared/railway/references/cli-cookbook.md +137 -0
- package/skills/shared/railway/references/config-as-code.md +120 -0
- package/skills/shared/railway/scripts/verify.sh +162 -0
- package/skills/shared/react/SKILL.md +182 -0
- package/skills/shared/react/evals/README.md +3 -0
- package/skills/shared/react/evals/cases.yaml +43 -0
- package/skills/shared/react/references/data-and-state.md +152 -0
- package/skills/shared/react/references/performance.md +75 -0
- package/skills/shared/react/references/routing.md +99 -0
- package/skills/shared/react/scripts/verify.sh +123 -0
- package/skills/shared/react-native/SKILL.md +215 -0
- package/skills/shared/react-native/evals/README.md +3 -0
- package/skills/shared/react-native/evals/cases.yaml +42 -0
- package/skills/shared/react-native/references/native-modules.md +123 -0
- package/skills/shared/react-native/references/performance-debugging.md +46 -0
- package/skills/shared/react-native/scripts/verify.sh +120 -0
- package/skills/shared/redis/SKILL.md +298 -0
- package/skills/shared/redis/evals/README.md +10 -0
- package/skills/shared/redis/evals/cases.yaml +43 -0
- package/skills/shared/redis/references/caching.md +116 -0
- package/skills/shared/redis/references/locks-and-rate-limiting.md +140 -0
- package/skills/shared/redis/references/queues.md +102 -0
- package/skills/shared/redis/scripts/verify.sh +164 -0
- package/skills/shared/render/SKILL.md +256 -0
- package/skills/shared/render/evals/README.md +12 -0
- package/skills/shared/render/evals/cases.yaml +45 -0
- package/skills/shared/render/references/blueprint-reference.md +203 -0
- package/skills/shared/render/scripts/verify.sh +167 -0
- package/skills/shared/replicate/SKILL.md +210 -0
- package/skills/shared/replicate/evals/README.md +9 -0
- package/skills/shared/replicate/evals/cases.yaml +45 -0
- package/skills/shared/replicate/references/cog-packaging.md +89 -0
- package/skills/shared/replicate/references/deployments-api.md +87 -0
- package/skills/shared/replicate/references/webhooks-and-async.md +110 -0
- package/skills/shared/replicate/scripts/verify.sh +162 -0
- package/skills/shared/research-ops/SKILL.md +200 -0
- package/skills/shared/research-ops/evals/README.md +13 -0
- package/skills/shared/research-ops/evals/cases.yaml +38 -0
- package/skills/shared/research-ops/references/credibility-rubric.md +78 -0
- package/skills/shared/research-ops/references/memo-template.md +63 -0
- package/skills/shared/research-ops/scripts/verify.sh +181 -0
- package/skills/shared/review/SKILL.md +314 -0
- package/skills/shared/review/evals/README.md +84 -0
- package/skills/shared/review/evals/cases.yaml +55 -0
- package/skills/shared/ruby/SKILL.md +295 -0
- package/skills/shared/ruby/evals/README.md +12 -0
- package/skills/shared/ruby/evals/cases.yaml +41 -0
- package/skills/shared/ruby/references/gems-and-testing.md +208 -0
- package/skills/shared/ruby/references/metaprogramming.md +161 -0
- package/skills/shared/ruby/scripts/verify.sh +83 -0
- package/skills/shared/runpod/SKILL.md +238 -0
- package/skills/shared/runpod/evals/README.md +11 -0
- package/skills/shared/runpod/evals/cases.yaml +47 -0
- package/skills/shared/runpod/references/cost-and-scaling.md +85 -0
- package/skills/shared/runpod/references/serverless-workers.md +101 -0
- package/skills/shared/runpod/scripts/verify.sh +126 -0
- package/skills/shared/rust/SKILL.md +320 -0
- package/skills/shared/rust/evals/README.md +12 -0
- package/skills/shared/rust/evals/cases.yaml +42 -0
- package/skills/shared/rust/references/async-tokio.md +141 -0
- package/skills/shared/rust/references/axum-service.md +132 -0
- package/skills/shared/rust/references/ownership.md +86 -0
- package/skills/shared/rust/references/testing.md +108 -0
- package/skills/shared/rust/scripts/verify.sh +91 -0
- package/skills/shared/scaling/SKILL.md +137 -0
- package/skills/shared/scaling/evals/README.md +3 -0
- package/skills/shared/scaling/evals/cases.yaml +42 -0
- package/skills/shared/scaling/references/load-testing-k6.md +127 -0
- package/skills/shared/scaling/scripts/example.load.js +24 -0
- package/skills/shared/scaling/scripts/verify.sh +70 -0
- package/skills/shared/sdd/SKILL.md +250 -0
- package/skills/shared/sdd/evals/README.md +60 -0
- package/skills/shared/sdd/evals/cases.yaml +90 -0
- package/skills/shared/sdd/references/model-routing.md +194 -0
- package/skills/shared/sdd-init/SKILL.md +189 -0
- package/skills/shared/sdd-init/evals/README.md +3 -0
- package/skills/shared/sdd-init/evals/cases.yaml +43 -0
- package/skills/shared/secure-coding/SKILL.md +336 -0
- package/skills/shared/secure-coding/evals/README.md +68 -0
- package/skills/shared/secure-coding/evals/cases.yaml +55 -0
- package/skills/shared/secure-coding/references/authn-authz.md +249 -0
- package/skills/shared/secure-coding/references/owasp-by-stack.md +574 -0
- package/skills/shared/secure-coding/references/secrets-and-supply-chain.md +205 -0
- package/skills/shared/secure-coding/references/threat-modeling.md +213 -0
- package/skills/shared/secure-coding/scripts/verify.sh +208 -0
- package/skills/shared/security-scan/SKILL.md +219 -0
- package/skills/shared/security-scan/evals/README.md +14 -0
- package/skills/shared/security-scan/evals/cases.yaml +50 -0
- package/skills/shared/security-scan/references/tools.md +97 -0
- package/skills/shared/security-scan/references/triage.md +92 -0
- package/skills/shared/security-scan/scripts/verify.sh +108 -0
- package/skills/shared/ship/SKILL.md +272 -0
- package/skills/shared/ship/evals/README.md +89 -0
- package/skills/shared/ship/evals/cases.yaml +44 -0
- package/skills/shared/shopify/SKILL.md +229 -0
- package/skills/shared/shopify/evals/README.md +14 -0
- package/skills/shared/shopify/evals/cases.yaml +41 -0
- package/skills/shared/shopify/references/apps-graphql.md +103 -0
- package/skills/shared/shopify/references/checkout-extensibility.md +71 -0
- package/skills/shared/shopify/references/liquid-themes.md +89 -0
- package/skills/shared/shopify/scripts/verify.sh +120 -0
- package/skills/shared/simplify-code/SKILL.md +101 -0
- package/skills/shared/simplify-code/evals/README.md +3 -0
- package/skills/shared/simplify-code/evals/cases.yaml +42 -0
- package/skills/shared/skill-scout/SKILL.md +169 -0
- package/skills/shared/skill-scout/evals/README.md +12 -0
- package/skills/shared/skill-scout/evals/cases.yaml +56 -0
- package/skills/shared/skill-scout/references/install-commands.md +76 -0
- package/skills/shared/skill-scout/scripts/verify.sh +154 -0
- package/skills/shared/solid-js/SKILL.md +260 -0
- package/skills/shared/solid-js/evals/README.md +3 -0
- package/skills/shared/solid-js/evals/cases.yaml +38 -0
- package/skills/shared/solid-js/references/reactivity-deep-dive.md +89 -0
- package/skills/shared/solid-js/references/router-and-start.md +93 -0
- package/skills/shared/solid-js/scripts/verify.sh +130 -0
- package/skills/shared/source-grounded-development/SKILL.md +108 -0
- package/skills/shared/source-grounded-development/evals/README.md +3 -0
- package/skills/shared/source-grounded-development/evals/cases.yaml +42 -0
- package/skills/shared/specify/SKILL.md +391 -0
- package/skills/shared/specify/evals/README.md +73 -0
- package/skills/shared/specify/evals/cases.yaml +93 -0
- package/skills/shared/specify/references/eliciting-requirements.md +117 -0
- package/skills/shared/specify/references/spec-template.md +101 -0
- package/skills/shared/speckit-analyze/SKILL.md +35 -0
- package/skills/shared/speckit-assess-decide/SKILL.md +36 -0
- package/skills/shared/speckit-assess-define/SKILL.md +36 -0
- package/skills/shared/speckit-assess-intake/SKILL.md +38 -0
- package/skills/shared/speckit-assess-research/SKILL.md +36 -0
- package/skills/shared/speckit-assess-shape/SKILL.md +36 -0
- package/skills/shared/speckit-bug-assess/SKILL.md +38 -0
- package/skills/shared/speckit-bug-fix/SKILL.md +37 -0
- package/skills/shared/speckit-bug-test/SKILL.md +37 -0
- package/skills/shared/speckit-checklist/SKILL.md +35 -0
- package/skills/shared/speckit-clarify/SKILL.md +32 -0
- package/skills/shared/speckit-constitution/SKILL.md +35 -0
- package/skills/shared/speckit-converge/SKILL.md +36 -0
- package/skills/shared/speckit-implement/SKILL.md +32 -0
- package/skills/shared/speckit-plan/SKILL.md +37 -0
- package/skills/shared/speckit-specify/SKILL.md +36 -0
- package/skills/shared/speckit-tasks/SKILL.md +34 -0
- package/skills/shared/spreadsheet-ops/SKILL.md +180 -0
- package/skills/shared/spreadsheet-ops/evals/README.md +33 -0
- package/skills/shared/spreadsheet-ops/evals/cases.yaml +42 -0
- package/skills/shared/spreadsheet-ops/references/formula-cookbook.md +70 -0
- package/skills/shared/spreadsheet-ops/references/python-excel.md +87 -0
- package/skills/shared/spreadsheet-ops/references/sheets-api-appsscript.md +118 -0
- package/skills/shared/spreadsheet-ops/scripts/verify.sh +152 -0
- package/skills/shared/spring-boot/SKILL.md +350 -0
- package/skills/shared/spring-boot/evals/README.md +11 -0
- package/skills/shared/spring-boot/evals/cases.yaml +49 -0
- package/skills/shared/spring-boot/references/jpa.md +94 -0
- package/skills/shared/spring-boot/references/security.md +92 -0
- package/skills/shared/spring-boot/references/testing.md +95 -0
- package/skills/shared/spring-boot/scripts/verify.sh +115 -0
- package/skills/shared/sql/SKILL.md +286 -0
- package/skills/shared/sql/evals/README.md +9 -0
- package/skills/shared/sql/evals/cases.yaml +49 -0
- package/skills/shared/sql/references/ctes-and-recursion.md +63 -0
- package/skills/shared/sql/references/joins-and-sets.md +71 -0
- package/skills/shared/sql/references/portability.md +38 -0
- package/skills/shared/sql/references/window-functions.md +72 -0
- package/skills/shared/sql/scripts/verify.sh +139 -0
- package/skills/shared/sqlite-turso/SKILL.md +214 -0
- package/skills/shared/sqlite-turso/evals/README.md +24 -0
- package/skills/shared/sqlite-turso/evals/cases.yaml +45 -0
- package/skills/shared/sqlite-turso/references/embedded-replicas.md +96 -0
- package/skills/shared/sqlite-turso/scripts/verify.sh +95 -0
- package/skills/shared/structured-extraction/SKILL.md +230 -0
- package/skills/shared/structured-extraction/evals/README.md +13 -0
- package/skills/shared/structured-extraction/evals/cases.yaml +70 -0
- package/skills/shared/structured-extraction/references/providers.md +152 -0
- package/skills/shared/structured-extraction/scripts/verify.sh +160 -0
- package/skills/shared/suggest/SKILL.md +123 -0
- package/skills/shared/suggest/evals/README.md +17 -0
- package/skills/shared/suggest/evals/cases.yaml +78 -0
- package/skills/shared/supabase/SKILL.md +268 -0
- package/skills/shared/supabase/evals/README.md +12 -0
- package/skills/shared/supabase/evals/cases.yaml +42 -0
- package/skills/shared/supabase/references/auth-ssr.md +173 -0
- package/skills/shared/supabase/references/rls-cookbook.md +122 -0
- package/skills/shared/supabase/scripts/verify.sh +149 -0
- package/skills/shared/svelte/SKILL.md +238 -0
- package/skills/shared/svelte/evals/README.md +3 -0
- package/skills/shared/svelte/evals/cases.yaml +41 -0
- package/skills/shared/svelte/references/runes.md +97 -0
- package/skills/shared/svelte/references/sveltekit-data.md +156 -0
- package/skills/shared/svelte/scripts/verify.sh +128 -0
- package/skills/shared/swift-ios/SKILL.md +224 -0
- package/skills/shared/swift-ios/evals/README.md +3 -0
- package/skills/shared/swift-ios/evals/cases.yaml +46 -0
- package/skills/shared/swift-ios/references/concurrency.md +132 -0
- package/skills/shared/swift-ios/references/testing.md +112 -0
- package/skills/shared/swift-ios/scripts/verify.sh +98 -0
- package/skills/shared/tasks/SKILL.md +265 -0
- package/skills/shared/tasks/evals/README.md +70 -0
- package/skills/shared/tasks/evals/cases.yaml +75 -0
- package/skills/shared/tauri/SKILL.md +219 -0
- package/skills/shared/tauri/evals/README.md +12 -0
- package/skills/shared/tauri/evals/cases.yaml +46 -0
- package/skills/shared/tauri/references/bundling-distribution.md +129 -0
- package/skills/shared/tauri/references/security.md +143 -0
- package/skills/shared/tauri/scripts/verify.sh +178 -0
- package/skills/shared/technical-writing/SKILL.md +230 -0
- package/skills/shared/technical-writing/evals/README.md +12 -0
- package/skills/shared/technical-writing/evals/cases.yaml +53 -0
- package/skills/shared/technical-writing/references/diataxis-modes.md +131 -0
- package/skills/shared/technical-writing/references/vale-starter.md +90 -0
- package/skills/shared/technical-writing/scripts/verify.sh +83 -0
- package/skills/shared/testing-go/SKILL.md +263 -0
- package/skills/shared/testing-go/evals/README.md +3 -0
- package/skills/shared/testing-go/evals/cases.yaml +46 -0
- package/skills/shared/testing-go/references/coverage-and-benchmarks.md +85 -0
- package/skills/shared/testing-go/references/mocks-and-fakes.md +140 -0
- package/skills/shared/testing-go/references/synctest-and-concurrency.md +82 -0
- package/skills/shared/testing-go/scripts/verify.sh +72 -0
- package/skills/shared/testing-py/SKILL.md +197 -0
- package/skills/shared/testing-py/evals/README.md +5 -0
- package/skills/shared/testing-py/evals/cases.yaml +44 -0
- package/skills/shared/testing-py/references/mocking.md +141 -0
- package/skills/shared/testing-py/references/property-testing.md +99 -0
- package/skills/shared/testing-py/scripts/verify.sh +117 -0
- package/skills/shared/testing-web/SKILL.md +244 -0
- package/skills/shared/testing-web/evals/README.md +11 -0
- package/skills/shared/testing-web/evals/cases.yaml +52 -0
- package/skills/shared/testing-web/references/jest-setup.md +88 -0
- package/skills/shared/testing-web/references/recipes.md +116 -0
- package/skills/shared/testing-web/scripts/verify.sh +111 -0
- package/skills/shared/together-fireworks/SKILL.md +176 -0
- package/skills/shared/together-fireworks/evals/README.md +3 -0
- package/skills/shared/together-fireworks/evals/cases.yaml +50 -0
- package/skills/shared/together-fireworks/references/batch-and-tuning.md +59 -0
- package/skills/shared/together-fireworks/references/models-and-pricing.md +79 -0
- package/skills/shared/together-fireworks/scripts/verify.sh +165 -0
- package/skills/shared/training-data/SKILL.md +226 -0
- package/skills/shared/training-data/evals/README.md +13 -0
- package/skills/shared/training-data/evals/cases.yaml +41 -0
- package/skills/shared/training-data/references/formats.md +118 -0
- package/skills/shared/training-data/references/synthesis-dedup-quality.md +134 -0
- package/skills/shared/translation-l10n/SKILL.md +229 -0
- package/skills/shared/translation-l10n/evals/README.md +3 -0
- package/skills/shared/translation-l10n/evals/cases.yaml +39 -0
- package/skills/shared/translation-l10n/references/icu-cookbook.md +82 -0
- package/skills/shared/translation-l10n/references/rtl-and-bidi.md +60 -0
- package/skills/shared/typescript/SKILL.md +225 -0
- package/skills/shared/typescript/evals/README.md +15 -0
- package/skills/shared/typescript/evals/cases.yaml +46 -0
- package/skills/shared/typescript/references/build-and-monorepo.md +141 -0
- package/skills/shared/typescript/references/type-system.md +162 -0
- package/skills/shared/typescript/scripts/verify.sh +52 -0
- package/skills/shared/ui-engineering/SKILL.md +113 -0
- package/skills/shared/ui-engineering/evals/cases.yaml +38 -0
- package/skills/shared/unity/SKILL.md +282 -0
- package/skills/shared/unity/evals/README.md +8 -0
- package/skills/shared/unity/evals/cases.yaml +43 -0
- package/skills/shared/unity/references/build-and-platforms.md +65 -0
- package/skills/shared/unity/references/input-system.md +102 -0
- package/skills/shared/unity/references/lifecycle-deep-dive.md +75 -0
- package/skills/shared/unreal/SKILL.md +270 -0
- package/skills/shared/unreal/evals/README.md +12 -0
- package/skills/shared/unreal/evals/cases.yaml +45 -0
- package/skills/shared/unreal/references/blueprint-cpp-parity.md +109 -0
- package/skills/shared/unreal/references/gameplay-framework.md +95 -0
- package/skills/shared/unreal/references/packaging.md +83 -0
- package/skills/shared/unslop/SKILL.md +143 -0
- package/skills/shared/unslop/evals/README.md +25 -0
- package/skills/shared/unslop/evals/cases.yaml +61 -0
- package/skills/shared/unsloth/SKILL.md +254 -0
- package/skills/shared/unsloth/evals/README.md +10 -0
- package/skills/shared/unsloth/evals/cases.yaml +42 -0
- package/skills/shared/unsloth/references/export.md +75 -0
- package/skills/shared/unsloth/references/grpo.md +91 -0
- package/skills/shared/unsloth/references/masking-and-templates.md +91 -0
- package/skills/shared/variant-explorer/SKILL.md +93 -0
- package/skills/shared/variant-explorer/evals/cases.yaml +38 -0
- package/skills/shared/vector-db/SKILL.md +189 -0
- package/skills/shared/vector-db/evals/README.md +10 -0
- package/skills/shared/vector-db/evals/cases.yaml +45 -0
- package/skills/shared/vector-db/references/engines.md +175 -0
- package/skills/shared/vector-db/references/tuning.md +62 -0
- package/skills/shared/vector-db/scripts/verify.sh +110 -0
- package/skills/shared/vercel/SKILL.md +242 -0
- package/skills/shared/vercel/evals/README.md +23 -0
- package/skills/shared/vercel/evals/cases.yaml +45 -0
- package/skills/shared/vercel/references/cli-cookbook.md +98 -0
- package/skills/shared/vercel/references/vercel-json.md +120 -0
- package/skills/shared/vercel/scripts/verify.sh +168 -0
- package/skills/shared/verify/SKILL.md +230 -0
- package/skills/shared/verify/evals/README.md +78 -0
- package/skills/shared/verify/evals/cases.yaml +104 -0
- package/skills/shared/vllm/SKILL.md +235 -0
- package/skills/shared/vllm/evals/README.md +9 -0
- package/skills/shared/vllm/evals/cases.yaml +47 -0
- package/skills/shared/vllm/references/flags-and-endpoints.md +105 -0
- package/skills/shared/vllm/references/memory-and-throughput.md +78 -0
- package/skills/shared/vue-nuxt/SKILL.md +323 -0
- package/skills/shared/vue-nuxt/evals/README.md +11 -0
- package/skills/shared/vue-nuxt/evals/cases.yaml +49 -0
- package/skills/shared/vue-nuxt/references/data-and-state.md +127 -0
- package/skills/shared/vue-nuxt/references/migration-nuxt4.md +79 -0
- package/skills/shared/vue-nuxt/references/nitro-and-rendering.md +117 -0
- package/skills/shared/vue-nuxt/references/reactivity.md +135 -0
- package/skills/shared/vue-nuxt/scripts/verify.sh +148 -0
- package/skills/shared/webhooks/SKILL.md +229 -0
- package/skills/shared/webhooks/evals/README.md +15 -0
- package/skills/shared/webhooks/evals/cases.yaml +46 -0
- package/skills/shared/webhooks/references/framework-raw-body.md +97 -0
- package/skills/shared/webhooks/references/signature-schemes.md +66 -0
- package/skills/shared/webhooks/scripts/verify.sh +142 -0
- package/skills/shared/wordpress/SKILL.md +224 -0
- package/skills/shared/wordpress/evals/README.md +3 -0
- package/skills/shared/wordpress/evals/cases.yaml +50 -0
- package/skills/shared/wordpress/references/hardening.md +108 -0
- package/skills/shared/wordpress/references/performance.md +80 -0
- package/skills/shared/wordpress/references/woocommerce.md +65 -0
- package/skills/shared/wordpress/scripts/verify.sh +96 -0
- package/skills/shared/worktrees/SKILL.md +204 -0
- package/skills/shared/worktrees/evals/README.md +78 -0
- package/skills/shared/worktrees/evals/cases.yaml +47 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: onna-architecture-angular
|
|
3
|
+
description: Define la arquitectura específica del frontend Angular en Onna/Doligestion. Activa este skill al crear o modificar componentes, servicios, DALs, guards, interceptors o cualquier fichero TypeScript del frontend. Complementa los skills angular-developer, angular-new-app y onna-architecture-common con las decisiones propias del cliente Angular.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Onna Angular Architecture Guidelines
|
|
8
|
+
|
|
9
|
+
Decisiones arquitectónicas propias del frontend Angular de Onna/Doligestion.
|
|
10
|
+
|
|
11
|
+
- Para buenas prácticas generales de Angular (signals, forms, routing, DI, testing, CLI): ver skill `angular-developer`.
|
|
12
|
+
- Para el contrato compartido con el BFF (dominio, errores, comunicación): ver skill `onna-architecture-common`.
|
|
13
|
+
- Para convenciones visuales de ventanas, formularios y listados: ver skill `onna-design-system`.
|
|
14
|
+
|
|
15
|
+
## Estructura de Carpetas
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
src/app/
|
|
19
|
+
<dominio>/ → Una carpeta por entidad (products, invoices, fichajes...)
|
|
20
|
+
domain/ → Interfaces, tipos, enumeraciones (idénticos al backend)
|
|
21
|
+
application/ → Application services (lógica de caso de uso)
|
|
22
|
+
infrastructure/
|
|
23
|
+
dal/ → Clases DAL: acceso al BFF, una por caso de uso
|
|
24
|
+
<resources>.dal.ts
|
|
25
|
+
components/ → Componentes Angular, uno por subcarpeta
|
|
26
|
+
<resources>-create/
|
|
27
|
+
<resources>-update/
|
|
28
|
+
<resources>-retrieve/
|
|
29
|
+
<resources>.service.ts → Service que orquesta los DALs
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Las carpetas de dominio son solo agrupadores. Ningún `.ts`, `.html` o `.css` de componente se coloca en la raíz — cada componente vive en su propia subcarpeta.
|
|
33
|
+
|
|
34
|
+
Dentro de `infrastructure/` la separación es estricta:
|
|
35
|
+
- `dal/` — solo clases DAL que se comunican con el BFF. Ningún componente ni lógica de UI aquí.
|
|
36
|
+
- `components/` — solo componentes Angular. Ninguna llamada directa a la API aquí.
|
|
37
|
+
|
|
38
|
+
## Capa DAL (Data Access Layer)
|
|
39
|
+
|
|
40
|
+
El componente nunca llama directamente a la API — siempre a través de `DAL → Service`.
|
|
41
|
+
|
|
42
|
+
- Los DALs viven en `infrastructure/dal/`
|
|
43
|
+
- Naming: `<resources>.dal.ts` (ej. `products.dal.ts`)
|
|
44
|
+
- Para casos de uso separados: `products-create.dal.ts` / `products-update.dal.ts`
|
|
45
|
+
- Los DALs se inyectan en los application services, no en los componentes directamente.
|
|
46
|
+
|
|
47
|
+
## Reglas de Tipado
|
|
48
|
+
|
|
49
|
+
- **Zero-Any Policy**: prohibido `any`. TypeScript estricto en todos los ficheros.
|
|
50
|
+
- Las interfaces de dominio viven en `<entidad>/domain/` y deben ser idénticas a las del backend (ver `onna-architecture-common`).
|
|
51
|
+
- Los tipos auxiliares de UI (`*Pagination`, `*ListResponse`, `*Stats`, payloads de formulario) pueden vivir en `domain/` pero en ficheros separados de la entidad principal.
|
|
52
|
+
|
|
53
|
+
## Diseño responsive — Mobile First
|
|
54
|
+
|
|
55
|
+
Toda la interfaz debe ser responsive. El diseño se construye primero para móvil y se adapta al escritorio con media queries o directivas de breakpoint de Angular Material.
|
|
56
|
+
|
|
57
|
+
- **Móvil**: los listados se muestran como **cards independientes**, una por elemento.
|
|
58
|
+
- **Escritorio**: los listados se muestran como **tabla** (`mat-table`).
|
|
59
|
+
- Usar `@if` con un breakpoint observer para alternar entre ambas vistas dentro del mismo componente.
|
|
60
|
+
|
|
61
|
+
## Convenciones de listados
|
|
62
|
+
|
|
63
|
+
### Paginación
|
|
64
|
+
|
|
65
|
+
- El tamaño de página por defecto es **50 elementos**.
|
|
66
|
+
- Las opciones de página disponibles son siempre: `[10, 25, 50, 100, 250, 500, 1000]`.
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
readonly pageSizeOptions = [10, 25, 50, 100, 250, 500, 1000];
|
|
70
|
+
readonly defaultPageSize = 50;
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Columna de estado (primera columna)
|
|
74
|
+
|
|
75
|
+
La primera columna de toda tabla no tiene cabecera y representa el **estado y tipo** del objeto listado mediante un icono con color.
|
|
76
|
+
|
|
77
|
+
- El color se obtiene de un **pipe** que recibe el objeto y devuelve un string de color.
|
|
78
|
+
- El icono se obtiene de otro **pipe** independiente que recibe el objeto y devuelve el nombre del icono Material.
|
|
79
|
+
- El icono debe llevar un `matTooltip` que explique su significado al usuario.
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
// Ejemplo de pipes
|
|
83
|
+
@Pipe({ name: 'productStatusColor', standalone: true })
|
|
84
|
+
export class ProductStatusColorPipe implements PipeTransform {
|
|
85
|
+
transform(product: Product): string { ... }
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
@Pipe({ name: 'productStatusIcon', standalone: true })
|
|
89
|
+
export class ProductStatusIconPipe implements PipeTransform {
|
|
90
|
+
transform(product: Product): string { ... }
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
```html
|
|
95
|
+
<!-- Primera columna sin cabecera -->
|
|
96
|
+
<ng-container matColumnDef="status">
|
|
97
|
+
<th mat-header-cell *matHeaderCellDef></th>
|
|
98
|
+
<td mat-cell *matCellDef="let row">
|
|
99
|
+
<mat-icon
|
|
100
|
+
[style.color]="row | productStatusColor"
|
|
101
|
+
[matTooltip]="row | productStatusIcon | productStatusTooltip">
|
|
102
|
+
{{ row | productStatusIcon }}
|
|
103
|
+
</mat-icon>
|
|
104
|
+
</td>
|
|
105
|
+
</ng-container>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Columna de acciones (última columna)
|
|
109
|
+
|
|
110
|
+
La última columna contiene los **iconos de acción** que redirigen a las operaciones disponibles sobre el elemento.
|
|
111
|
+
|
|
112
|
+
- Cada icono debe llevar un `matTooltip` que describa la acción.
|
|
113
|
+
- Usar los iconos estándar definidos en `onna-design-system` (`visibility`, `edit`, `add`, `delete` con `action-btn-delete`).
|
|
114
|
+
- No mostrar texto, solo iconos.
|
|
115
|
+
|
|
116
|
+
```html
|
|
117
|
+
<ng-container matColumnDef="actions">
|
|
118
|
+
<th mat-header-cell *matHeaderCellDef></th>
|
|
119
|
+
<td mat-cell *matCellDef="let row">
|
|
120
|
+
<button mat-icon-button [routerLink]="['/products', row.id]" matTooltip="Ver detalle">
|
|
121
|
+
<mat-icon>visibility</mat-icon>
|
|
122
|
+
</button>
|
|
123
|
+
<button mat-icon-button [routerLink]="['/products', row.id]" matTooltip="Editar">
|
|
124
|
+
<mat-icon>edit</mat-icon>
|
|
125
|
+
</button>
|
|
126
|
+
<button mat-icon-button (click)="onDelete(row)" matTooltip="Eliminar" class="action-btn-delete">
|
|
127
|
+
<mat-icon>delete</mat-icon>
|
|
128
|
+
</button>
|
|
129
|
+
</td>
|
|
130
|
+
</ng-container>
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Estructura interna de componentes create/update
|
|
134
|
+
|
|
135
|
+
Aplica **solo** a componentes `*-create`/`*-update` (formulario de un único registro, Signal Forms, extendiendo `AppServiceSignalBase`). No aplica a listados (`*-getall`), vistas de detalle de solo lectura, diálogos, ni ningún otro tipo de componente — esos no siguen esta estructura de secciones.
|
|
136
|
+
|
|
137
|
+
Todo componente `*-create`/`*-update` organiza sus miembros de clase en el siguiente orden, cada bloque precedido por su comentario de sección. El objetivo es que cualquier componente de este tipo se lea igual, independientemente del dominio.
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
export class ProductsUpdateComponent extends AppServiceSignalBase<...> {
|
|
141
|
+
// #region DALs
|
|
142
|
+
private productsUpdateDal = inject(ProductsUpdateDal);
|
|
143
|
+
private categoriesGetAllDal = inject(CategoriesGetAllDal);
|
|
144
|
+
// #endregion
|
|
145
|
+
|
|
146
|
+
// #region Services
|
|
147
|
+
private companyService = inject(CompanyService);
|
|
148
|
+
// #endregion
|
|
149
|
+
|
|
150
|
+
// #region Other members
|
|
151
|
+
private dialog = inject(MatDialog);
|
|
152
|
+
protected globalInfo = inject(GlobalInfoService);
|
|
153
|
+
private emailDal = inject(EmailDal);
|
|
154
|
+
// (router, route, snackBar ya vienen heredados de AppBase/AppServiceSignalBase — no
|
|
155
|
+
// se redeclaran aquí salvo que el comportamiento por defecto no sirva, ver más abajo)
|
|
156
|
+
// #endregion
|
|
157
|
+
|
|
158
|
+
// #region Model
|
|
159
|
+
isLoading = signal<boolean>(false);
|
|
160
|
+
// #endregion
|
|
161
|
+
|
|
162
|
+
// #region Forms
|
|
163
|
+
protected override configureSchema(p: SchemaPathTree<ProductFormModel>): void {
|
|
164
|
+
required(p.name, { message: 'El nombre es obligatorio' });
|
|
165
|
+
...
|
|
166
|
+
}
|
|
167
|
+
// #endregion
|
|
168
|
+
|
|
169
|
+
// #region Related categories
|
|
170
|
+
categories = signal<Category[]>([]);
|
|
171
|
+
categoryOptions = computed<SelectorResult[]>(() =>
|
|
172
|
+
this.categories().map((c) => ({ value: c.id, label: c.name })),
|
|
173
|
+
);
|
|
174
|
+
private loadCategories(): void {
|
|
175
|
+
this.categoriesGetAllDal.getAll().subscribe({
|
|
176
|
+
next: (data) => this.categories.set(data),
|
|
177
|
+
error: () => this.showSnackBar('Error al cargar categorías', 'Cerrar'),
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
// #endregion
|
|
181
|
+
|
|
182
|
+
// #region Constructor / onInit / onDestroy
|
|
183
|
+
constructor() {
|
|
184
|
+
super(new ProductFormModel());
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
override ngOnInit(): void {
|
|
188
|
+
super.ngOnInit();
|
|
189
|
+
this.loadCategories();
|
|
190
|
+
}
|
|
191
|
+
// #endregion
|
|
192
|
+
|
|
193
|
+
// #region Actions
|
|
194
|
+
protected override onSave(): void { ... }
|
|
195
|
+
protected override onCancel(): void { ... }
|
|
196
|
+
onDeleteClick(): void { ... }
|
|
197
|
+
// #endregion
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
Cada sección va envuelta en `// #region <Nombre>` / `// #endregion` (folding region nativo de VS Code, sin extensión ni equivalencia a JSDoc) para poder colapsarla en el editor — mismo comentario que hace de cabecera de sección, solo que ahora abre y cierra el bloque plegable.
|
|
202
|
+
|
|
203
|
+
Reglas del orden:
|
|
204
|
+
|
|
205
|
+
0. **Herencia obligatoria de `AppServiceSignalBase`** — todo componente `*-create`/`*-update` que use Signal Forms extiende `AppServiceSignalBase<TModel, T, TPayload>` (`frontend/src/app/common/infrastructure/app-service-signal-base.ts`), nunca reimplementa `model`/`fieldTree`/`onSave`/`load` desde cero. Si el flujo del componente no encaja 1:1 con el contrato genérico de la base (múltiples DAL de transición de estado, modo lectura/edición conmutable, `onSave` con lógica propia), se hereda igualmente solo para lo que sí encaja — como mínimo `model`/`fieldTree` vía `configureSchema()` — y el resto de métodos (`onSave`, `load`, etc.) se sobreescriben con `override` en vez de duplicarse fuera de la jerarquía. Ver `proposal-update.ts` como referencia de una herencia parcial bien resuelta (`model`/`fieldTree` heredados; `proposal`, `isLoading`, `isEditing`, `loadProposal()`, `onSave()` propios).
|
|
206
|
+
1. **DALs** — todas las inyecciones de clases `*Dal`, agrupadas primero.
|
|
207
|
+
2. **Services** — application services u otros servicios de dominio inyectados (`CompanyService`, `GlobalInfoService` si el componente lo trata como servicio de negocio, no como utilidad transversal).
|
|
208
|
+
3. **Other members** — el resto de inyecciones que no encajan arriba: `MatDialog` y cualquier referencia a diálogos, `GlobalInfoService` como utilidad transversal, `EmailDal`, `Injector`, etc. `router`, `route`, `snackBar`, `isMobile`, `onCancel` ya existen en `AppBase`/`AppServiceSignalBase`: no se re-inyectan ni redeclaran con el mismo nombre — se usan tal cual (`this.router`, `this.getId()`, `this.showSnackBar(...)`). Si el comportamiento heredado no encaja (breakpoint distinto, snackbar con opciones no soportadas), se resuelve extendiendo la base compartida, nunca duplicando el campo con otro nombre ad-hoc por componente.
|
|
209
|
+
4. **Model** — signals de estado propio del componente que no son el modelo de formulario ni un catálogo relacionado (`model`/`fieldTree` ya los aporta la base): flags (`isLoading`, `isEditing`), estado de UI propio de la pantalla.
|
|
210
|
+
5. **Forms** — `configureSchema()` (validadores del `SchemaPathTree`) y cualquier lógica de formulario adicional.
|
|
211
|
+
6. **Related `<nombre>`** — una subsección `#region`/`#endregion` por catálogo relacionado (`// #region Related clients`, `// #region Related products`, `// #region Related projects`...), cada una con TODO lo de ese catálogo junto: el signal fuente (`clients = signal<...>([])`), su(s) `computed` derivado(s) (`clientsList`, `clientOptions`, `productsOptions`/`servicesOptions` cuando derivan de un mismo signal, etc.) y su `load*()` privado — en ese orden, sin repartir el signal en «Model» y el resto en otra sección. Tantas subsecciones «Related» como catálogos tenga el componente.
|
|
212
|
+
7. **Constructor / onInit / onDestroy** — `super(...)` y suscripciones/`effect()` que deban existir desde la construcción, junto con el ciclo de vida Angular (`ngOnInit`/`ngOnDestroy`). Una única región: ambos bloques son inicialización del componente, solo que en momentos distintos del ciclo de vida.
|
|
213
|
+
8. **Actions** — `onSave`, `onCancel`, y cualquier acción disparada por botón del template (`onDeleteClick`, `onValidateClick`, etc.). `load()` (si se sobreescribe) y los helpers transversales sin acción propia asociada (`formatCurrency`, `formatDate`, `onBackToList`, `canManageProposal`) van sueltos, sin subregión. Cuando el componente tiene varias acciones de botón independientes (típico en `*-update` con workflow de estados: validar, aceptar, rechazar, convertir...), cada una se envuelve en su propia subsección `// #region Action <nombre>` que agrupa TODO lo de esa acción junto — el `xxxClick()` que abre el diálogo de confirmación, el `onXxx()` que hace la llamada al DAL, y cualquier `canXxx` que solo esa acción consulta — en vez de repartir click/handler/condición en puntos distintos del archivo. Si un `can*` condiciona más de una acción a la vez (p. ej. `canConvertProposal()` usado tanto por `createOrderClick` como por `createInvoiceClick`), vive en su propia subsección compartida (`// #region Action convertProposal`) en vez de duplicarse o adjuntarse arbitrariamente a una sola. Ver `proposal-update.ts` como referencia. En componentes sin ese patrón de múltiples acciones de workflow (p. ej. `*-create`, con un único flujo de guardado), no se fuerzan subregiones — la lista plana ya es clara.
|
|
214
|
+
|
|
215
|
+
## Nomenclatura
|
|
216
|
+
|
|
217
|
+
Regla general: **inglés y plural** en todo el código, salvo el dominio que es **inglés y singular**.
|
|
218
|
+
|
|
219
|
+
| Artefacto | Forma | Ejemplo |
|
|
220
|
+
|---|---|---|
|
|
221
|
+
| Carpeta de entidad | plural | `products/`, `invoices/` |
|
|
222
|
+
| Rutas URL | plural | `/products`, `/products/create` |
|
|
223
|
+
| Componentes | plural | `products-retrieve`, `products-create` |
|
|
224
|
+
| DALs | plural | `products.dal.ts` |
|
|
225
|
+
| Services | plural | `products.service.ts` |
|
|
226
|
+
| Application services | plural | `products-create.service.ts` |
|
|
227
|
+
| Interfaces de dominio | singular | `Product`, `Invoice` |
|
|
228
|
+
| Clases de dominio | singular | `Product`, `BomLine` |
|
|
229
|
+
| Enumeraciones | singular | `ProductStatus`, `InvoiceType` |
|
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: onna-architecture-bff
|
|
3
|
+
description: Define la arquitectura específica del BFF (Node.js + Express) de Onna/Doligestion. Activa este skill al crear o modificar rutas, middleware, DALs o cualquier fichero TypeScript del backend. Complementa onna-architecture-common con las decisiones propias del BFF.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Onna BFF Architecture Guidelines
|
|
8
|
+
|
|
9
|
+
Decisiones arquitectónicas propias del BFF (Node.js + Express). Para el contrato compartido con el frontend (dominio, DTOs, errores): ver `onna-architecture-common`.
|
|
10
|
+
|
|
11
|
+
## Rol del BFF
|
|
12
|
+
|
|
13
|
+
Orquestador entre Angular y Dolibarr/Kubernetes. Es el único punto de entrada desde el frontend:
|
|
14
|
+
- Inyecta el `dolikey` (API key de Dolibarr) en todas las peticiones salientes — nunca expuesto al frontend.
|
|
15
|
+
- Gestiona autenticación mediante cookies `httpOnly`, `secure`, `SameSite: Strict`.
|
|
16
|
+
- Tiene dos funciones muy imporntes:
|
|
17
|
+
- Recibe la llamada con el router de Nodejs + Express desde el frontend
|
|
18
|
+
- Transforma respuestas crudas de Dolibarr (PHP snake_case) en interfaces de dominio tipadas y envia las llamadas a los métodos de dolibarr a través de sus DTOs.
|
|
19
|
+
|
|
20
|
+
## Estructura de carpetas
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
src/
|
|
24
|
+
<dominio>/
|
|
25
|
+
domain/ → Interfaces, enums, DTOs (= frontend, ver onna-architecture-common)
|
|
26
|
+
infrastructure/
|
|
27
|
+
dal/dolibarr/
|
|
28
|
+
<entidad>DolibarrDto.ts → Shape crudo de la respuesta de Dolibarr
|
|
29
|
+
<Entidad>GetAllDal.ts → extends DolibarrDal, implements IQueryGetListDal
|
|
30
|
+
<Entidad>GetByIdDal.ts → instancia DolibarrClient directamente, implements IQueryGetItemDal
|
|
31
|
+
<Entidad>CreateDal.ts → extends DolibarrDal, implements IServiceDal
|
|
32
|
+
<Entidad>UpdateDal.ts → extends DolibarrDal, implements IServiceDal
|
|
33
|
+
<Entidad>DeleteDal.ts → extends DolibarrDal, implements IServiceDal
|
|
34
|
+
enums/ → Enums exclusivos de la capa DAL (ej. ProductMode para filtros)
|
|
35
|
+
mappers/
|
|
36
|
+
<entidad>Mapper.ts → toDomain() + fromDomain()
|
|
37
|
+
<entidad>StatusMapper.ts → fromDomain/toDomain para cada enum
|
|
38
|
+
router/
|
|
39
|
+
<entidad>Router.ts → Endpoints Express para este dominio
|
|
40
|
+
common/
|
|
41
|
+
infrastructure/dolibarr/
|
|
42
|
+
dolibarrClient.ts → Cliente HTTP a Dolibarr (create/read/update/delete/query2)
|
|
43
|
+
dolibarrDal.ts → Clase base abstracta con helpers de filtros SQL
|
|
44
|
+
dolibarrMapper.ts → Clase base vacía para mappers
|
|
45
|
+
container.ts → Registro Awilix (IoC) + createRequestScope
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Patrón DAL — Clases base
|
|
49
|
+
|
|
50
|
+
El patrón DAL (Data Access Layer) es una capa de adaptador para transformar las entidades de dominio en las del dominio subyacente (en nuestro caso principalmente Dolibrr) o realizar las llamadas a los métodos del sistema donde están los datos (principalmente Dolibarr).
|
|
51
|
+
|
|
52
|
+
### DolibarrDal (abstract)
|
|
53
|
+
|
|
54
|
+
Clase base para DALs que necesitan filtros SQL o acceso múltiple a Dolibarr:
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
export abstract class DolibarrDal {
|
|
58
|
+
protected dolibarr: DolibarrClient;
|
|
59
|
+
|
|
60
|
+
constructor(dolikey: string, entityId: number = 1) {
|
|
61
|
+
this.dolibarr = new DolibarrClient(dolikey, entityId);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Construye filtro SQL: strings → LIKE '%valor%', números → :=:valor
|
|
65
|
+
protected mapFiltersFromDomain(value: string | number | undefined | null, columns: string[]): string
|
|
66
|
+
|
|
67
|
+
// Combina múltiples filtros con AND (ignora los vacíos)
|
|
68
|
+
protected combineSqlFilters(...filters: string[]): string
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Cuándo extender DolibarrDal vs instanciar DolibarrClient directamente
|
|
73
|
+
|
|
74
|
+
- **Extender `DolibarrDal`**: GetAll, Create, Update, Delete — necesitan `combineSqlFilters` o varias llamadas.
|
|
75
|
+
- **Instanciar `DolibarrClient` directamente**: GetById — operación puntual sin filtros SQL.
|
|
76
|
+
|
|
77
|
+
## Patrón DAL — GetAll
|
|
78
|
+
|
|
79
|
+
Obtiene una colección paginada. Construye los filtros SQL a partir del DTO, llama a `query2` en Dolibarr, y transforma cada elemento crudo a dominio con el mapper. La proyección de campos (`fields`) se aplica en memoria mediante el operador `pick` de RxJS antes de devolver la lista.
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
export class ProductsGetAllDal extends DolibarrDal implements IQueryGetListDal<ProductsGetAllDto, Product> {
|
|
83
|
+
private endpoint = 'products';
|
|
84
|
+
private productMapper = new ProductMapper();
|
|
85
|
+
private productModeMapper = new ProductModeMapper();
|
|
86
|
+
private productStatusMapper = new ProductStatusMapper();
|
|
87
|
+
|
|
88
|
+
constructor(dolikey: string, entityId: number = 1) {
|
|
89
|
+
super(dolikey, entityId);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async run(request: ProductsGetAllDto): Promise<QueryListResult<Product>> {
|
|
93
|
+
request.sortfield = `t.${request.sortfield || 'rowid'}`;
|
|
94
|
+
|
|
95
|
+
const paramsSql = {
|
|
96
|
+
sqlfilters: this.combineSqlFilters(
|
|
97
|
+
this.mapFiltersFromDomain(request.filterBy.trim(), ['t.label', 't.ref']),
|
|
98
|
+
this.mapFiltersFromDomain(request.status, ['t.tosell'])
|
|
99
|
+
),
|
|
100
|
+
mode: this.productModeMapper.fromDomain(ProductMode.Products),
|
|
101
|
+
status: this.productStatusMapper.fromDomain(request.status),
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const responseRaw = await this.dolibarr.query2<ProductDolibarrDto>(this.endpoint, paramsSql, request);
|
|
105
|
+
const response = await lastValueFrom(
|
|
106
|
+
from(responseRaw.data).pipe(
|
|
107
|
+
map(item => this.productMapper.toDomain(item)),
|
|
108
|
+
pick(request.fields?.split(',') ?? []),
|
|
109
|
+
toArray()
|
|
110
|
+
)
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
return { data: response, pagination: responseRaw.pagination };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Patrón DAL — GetById
|
|
119
|
+
|
|
120
|
+
Obtiene un único registro por su `id`. No extiende `DolibarrDal` porque no necesita filtros SQL — instancia `DolibarrClient` directamente. Llama a `read` y transforma el resultado con el mapper.
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
export class ProductsGetByIdDal implements IQueryGetItemDal<ProductsGetByIdDto, Product> {
|
|
124
|
+
private dolibarr: DolibarrClient;
|
|
125
|
+
private productMapper = new ProductMapper();
|
|
126
|
+
|
|
127
|
+
constructor(dolikey: string, entityId: number = 1) {
|
|
128
|
+
this.dolibarr = new DolibarrClient(dolikey, entityId);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async run(request: ProductsGetByIdDto): Promise<QueryItemResult<Product>> {
|
|
132
|
+
const item = await this.dolibarr.read<ProductDolibarrDto>('products', request.id);
|
|
133
|
+
return { item: this.productMapper.toDomain(item) };
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Patrón DAL — Create / Update / Delete
|
|
139
|
+
|
|
140
|
+
Las tres operaciones siguen el mismo flujo: reciben el DTO de dominio, lo transforman al shape de Dolibarr con `fromDomain`, llaman al método correspondiente del cliente, y devuelven el request original (no la respuesta de Dolibarr, que en estos casos no aporta más información que la ya conocida). Delete es la excepción: no necesita mapper porque solo requiere el `id`.
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
// Create: mapea dominio → DTO Dolibarr y devuelve el request original
|
|
144
|
+
export class ProductsCreateDal extends DolibarrDal implements IServiceDal<ProductsCreateDto, Product> {
|
|
145
|
+
private productMapper = new ProductMapper();
|
|
146
|
+
|
|
147
|
+
constructor(dolikey: string, entityId: number = 1) {
|
|
148
|
+
super(dolikey, entityId);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async run(request: ProductsCreateDto): Promise<Product> {
|
|
152
|
+
const dto = this.productMapper.fromDomain(request);
|
|
153
|
+
await this.dolibarr.create<unknown>('products', dto);
|
|
154
|
+
return request;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Update: el id llega inyectado desde req.params junto al DTO — no forma parte del UpdateDto
|
|
159
|
+
export class ProductsUpdateDal extends DolibarrDal implements IServiceDal<{ id: number; dto: ProductsUpdateDto }, Product> {
|
|
160
|
+
private productMapper = new ProductMapper();
|
|
161
|
+
|
|
162
|
+
constructor(dolikey: string, entityId: number = 1) {
|
|
163
|
+
super(dolikey, entityId);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
async run({ id, dto }: { id: number; dto: ProductsUpdateDto }): Promise<Product> {
|
|
167
|
+
const dolibarrDto = this.productMapper.fromDomain(dto);
|
|
168
|
+
await this.dolibarr.update<unknown>('products', id, dolibarrDto);
|
|
169
|
+
return { id, ...dto };
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Delete: solo necesita el id — no requiere mapper
|
|
174
|
+
export class ProductsDeleteDal extends DolibarrDal implements IServiceDal<ProductsDeleteDto, Product> {
|
|
175
|
+
constructor(dolikey: string, entityId: number = 1) {
|
|
176
|
+
super(dolikey, entityId);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
async run(request: ProductsDeleteDto): Promise<ProductsDeleteDto> {
|
|
180
|
+
await this.dolibarr.delete('products', request.id);
|
|
181
|
+
return request;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Patrón Mapper
|
|
187
|
+
|
|
188
|
+
El mapper es la frontera entre la capa subyacente (Dolibarr) y el dominio de la aplicación. Contiene dos métodos:
|
|
189
|
+
- **`toDomain`**: transforma el DTO crudo de Dolibarr (`<Entidad>DolibarrDto`) en la entidad de dominio (`Product`, `Invoice`...). Convierte snake_case a camelCase, números a booleanos o enums, y garantiza que los strings nunca sean `undefined` (`?? ''`).
|
|
190
|
+
- **`fromDomain`**: transforma la entidad de dominio (o un DTO de Update/Create) en el shape que espera Dolibarr. El proceso inverso.
|
|
191
|
+
|
|
192
|
+
El `<Entidad>DolibarrDto` es el shape crudo tal como llega de Dolibarr: snake_case, tipos PHP mezclados (números donde el dominio usa booleanos, strings donde usa enums, etc.).
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
// Shape crudo de Dolibarr
|
|
196
|
+
export interface ProductDolibarrDto {
|
|
197
|
+
id: number;
|
|
198
|
+
ref?: string;
|
|
199
|
+
label?: string;
|
|
200
|
+
status?: number; // tosell: 1 = activo, 0 = inactivo
|
|
201
|
+
status_buy?: number; // tobuy
|
|
202
|
+
price?: number;
|
|
203
|
+
tva_tx?: number; // ivaRate
|
|
204
|
+
price_base_type?: string; // 'HT' | 'TTC'
|
|
205
|
+
cost_price?: number;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export class ProductMapper extends DolibarrMapper {
|
|
209
|
+
private productStatusMapper = new ProductStatusMapper();
|
|
210
|
+
private priceBaseTypeMapper = new ProductPriceBaseTypeMapper();
|
|
211
|
+
|
|
212
|
+
toDomain(item: ProductDolibarrDto): Product {
|
|
213
|
+
return {
|
|
214
|
+
id: Number(item.id),
|
|
215
|
+
ref: item.ref ?? '', // string → siempre ''
|
|
216
|
+
label: item.label ?? '', // string → siempre ''
|
|
217
|
+
status: this.productStatusMapper.toDomain(item.status),
|
|
218
|
+
toSell: item.status !== undefined ? Boolean(item.status) : undefined,
|
|
219
|
+
price: item.price !== undefined ? Number(item.price) : undefined,
|
|
220
|
+
ivaRate: item.tva_tx !== undefined ? Number(item.tva_tx) : undefined,
|
|
221
|
+
priceBaseType: this.priceBaseTypeMapper.toDomain(item.price_base_type),
|
|
222
|
+
toBuy: item.status_buy !== undefined ? Boolean(item.status_buy) : undefined,
|
|
223
|
+
costPrice: item.cost_price !== undefined ? Number(item.cost_price) : undefined,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
fromDomain(item: Partial<Product>): ProductDolibarrDto {
|
|
228
|
+
return {
|
|
229
|
+
id: item.id ?? 0,
|
|
230
|
+
ref: item.ref ?? '', // string → siempre ''
|
|
231
|
+
label: item.label ?? '', // string → siempre ''
|
|
232
|
+
status: item.toSell !== undefined ? Number(item.toSell) : undefined,
|
|
233
|
+
price: item.price ?? undefined,
|
|
234
|
+
tva_tx: item.ivaRate ?? undefined,
|
|
235
|
+
price_base_type: this.priceBaseTypeMapper.fromDomain(item.priceBaseType),
|
|
236
|
+
status_buy: item.toBuy !== undefined ? Number(item.toBuy) : undefined,
|
|
237
|
+
cost_price: item.costPrice ?? undefined,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Mapper de enum
|
|
243
|
+
export class ProductStatusMapper {
|
|
244
|
+
toDomain(value?: number): ProductStatus | undefined {
|
|
245
|
+
if (value === undefined) return undefined;
|
|
246
|
+
return value === 1 ? ProductStatus.Active : ProductStatus.Inactive;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
fromDomain(status?: ProductStatus): number | undefined {
|
|
250
|
+
if (status === undefined) return undefined;
|
|
251
|
+
return status === ProductStatus.Active ? 1 : 0;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### Reglas del Mapper
|
|
257
|
+
|
|
258
|
+
- `toDomain`: strings siempre con `?? ''` — nunca `undefined` para campos string en dominio.
|
|
259
|
+
- `toDomain`: números y booleanos con `!== undefined ? Number/Boolean(...) : undefined` — nunca colapsar el `0` o `false` con un `if (valor)`.
|
|
260
|
+
- `fromDomain`: recibe `Partial<Product>` para admitir tanto Create como Update sin duplicar el mapper.
|
|
261
|
+
- Los mappers de enum son clases separadas (`ProductStatusMapper`, `ProductPriceBaseTypeMapper`, etc.), instanciadas como atributos privados del mapper principal.
|
|
262
|
+
|
|
263
|
+
## Patrón Router (Express)
|
|
264
|
+
|
|
265
|
+
Un fichero por dominio. Incluye todos los endpoints CRUD del dominio.
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
import { Router, Request, Response, NextFunction } from 'express';
|
|
269
|
+
import { z } from 'zod';
|
|
270
|
+
import { buildZodSchema } from '../../common/infrastructure/buildZodSchema';
|
|
271
|
+
import { requireHttpRight } from '../../common/infrastructure/requireHttpRight';
|
|
272
|
+
import { AuthenticatedRequest, createRequestScope } from '../../container';
|
|
273
|
+
import { InjectionTokens } from '../../container';
|
|
274
|
+
import { productHttpRightPolicy } from './productHttpRightPolicy';
|
|
275
|
+
import { ProductsGetAllDto } from '../domain/productsGetAllDto';
|
|
276
|
+
import { ProductsGetByIdDto } from '../domain/productsGetByIdDto';
|
|
277
|
+
import { ProductsCreateDto } from '../domain/productsCreateDto';
|
|
278
|
+
import { ProductsUpdateDto } from '../domain/productsUpdateDto';
|
|
279
|
+
import { ProductsDeleteDto } from '../domain/productsDeleteDto';
|
|
280
|
+
|
|
281
|
+
const router = Router();
|
|
282
|
+
|
|
283
|
+
router.use(requireHttpRight(productHttpRightPolicy, 'No tienes permiso para gestionar productos'));
|
|
284
|
+
|
|
285
|
+
// GET /products — listado paginado
|
|
286
|
+
router.get('/', async (req: Request, res: Response, next: NextFunction) => {
|
|
287
|
+
try {
|
|
288
|
+
const { session, query } = req as AuthenticatedRequest;
|
|
289
|
+
const request = new ProductsGetAllDto(query);
|
|
290
|
+
|
|
291
|
+
const scope = createRequestScope(session.dolikey, session.entity);
|
|
292
|
+
const dal = scope.resolve(InjectionTokens.productsGetAllDal);
|
|
293
|
+
res.json(await dal.run(request));
|
|
294
|
+
} catch (error) {
|
|
295
|
+
next(error);
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
// GET /products/:id — detalle por id
|
|
300
|
+
router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {
|
|
301
|
+
try {
|
|
302
|
+
const { session } = req as AuthenticatedRequest;
|
|
303
|
+
const request = new ProductsGetByIdDto({ id: Number(req.params.id) });
|
|
304
|
+
|
|
305
|
+
const scope = createRequestScope(session.dolikey, session.entity);
|
|
306
|
+
const dal = scope.resolve(InjectionTokens.productsGetByIdDal);
|
|
307
|
+
res.json(await dal.run(request));
|
|
308
|
+
} catch (error) {
|
|
309
|
+
next(error);
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
// POST /products — crear
|
|
314
|
+
router.post('/', async (req: Request, res: Response, next: NextFunction) => {
|
|
315
|
+
try {
|
|
316
|
+
const parsed = buildZodSchema(ProductsCreateDto).safeParse(req.body);
|
|
317
|
+
if (!parsed.success) {
|
|
318
|
+
return res.status(400).json({ error: 'Payload inválido', statusCode: 400, details: z.flattenError(parsed.error) });
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
const { session } = req as AuthenticatedRequest;
|
|
322
|
+
const scope = createRequestScope(session.dolikey, session.entity);
|
|
323
|
+
const dal = scope.resolve(InjectionTokens.productsCreateDal);
|
|
324
|
+
res.json(await dal.run(parsed.data));
|
|
325
|
+
} catch (error) {
|
|
326
|
+
next(error);
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
// PUT /products/:id — actualizar
|
|
331
|
+
router.put('/:id', async (req: Request, res: Response, next: NextFunction) => {
|
|
332
|
+
try {
|
|
333
|
+
const parsed = buildZodSchema(ProductsUpdateDto).safeParse({ ...req.body, id: Number(req.params.id) });
|
|
334
|
+
if (!parsed.success) {
|
|
335
|
+
return res.status(400).json({ error: 'Payload inválido', statusCode: 400, details: z.flattenError(parsed.error) });
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
const { session } = req as AuthenticatedRequest;
|
|
339
|
+
const scope = createRequestScope(session.dolikey, session.entity);
|
|
340
|
+
const dal = scope.resolve(InjectionTokens.productsUpdateDal);
|
|
341
|
+
res.json(await dal.run(parsed.data));
|
|
342
|
+
} catch (error) {
|
|
343
|
+
next(error);
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
// DELETE /products/:id — eliminar
|
|
348
|
+
router.delete('/:id', async (req: Request, res: Response, next: NextFunction) => {
|
|
349
|
+
try {
|
|
350
|
+
const { session } = req as AuthenticatedRequest;
|
|
351
|
+
const request = new ProductsDeleteDto({ id: Number(req.params.id) }); // sin validación Zod — solo id
|
|
352
|
+
|
|
353
|
+
const scope = createRequestScope(session.dolikey, session.entity);
|
|
354
|
+
const dal = scope.resolve(InjectionTokens.productsDeleteDal);
|
|
355
|
+
res.json(await dal.run(request));
|
|
356
|
+
} catch (error) {
|
|
357
|
+
next(error);
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
export default router;
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### Reglas del Router
|
|
365
|
+
|
|
366
|
+
- `GET /` — construye el DTO desde `req.query` directamente con `new ProductsGetAllDto(query)`. Sin validación Zod (los parámetros de listado son opcionales).
|
|
367
|
+
- `GET /:id` — construye el DTO con `new ProductsGetByIdDto({ id: Number(req.params.id) })`. Sin validación Zod.
|
|
368
|
+
- `POST /` y `PUT /:id` — validan el body con `buildZodSchema(Dto).safeParse(...)`. El `id` en PUT se inyecta desde `req.params.id`.
|
|
369
|
+
- `DELETE /:id` — construye el DTO con `new ProductsDeleteDto({ id: Number(req.params.id) })`. Sin validación Zod.
|
|
370
|
+
- Siempre `next(error)` en el catch — el middleware global de Express formatea el error como `ErrorResult`.
|
|
371
|
+
|
|
372
|
+
## Sistema de validación con @Field + buildZodSchema
|
|
373
|
+
|
|
374
|
+
Los decoradores `@Field` de los DTOs generan automáticamente el esquema Zod. No escribir esquemas Zod a mano.
|
|
375
|
+
|
|
376
|
+
```typescript
|
|
377
|
+
// En el router:
|
|
378
|
+
const parsed = buildZodSchema(ProductsUpdateDto).safeParse(req.body);
|
|
379
|
+
if (!parsed.success) {
|
|
380
|
+
return res.status(400).json({
|
|
381
|
+
error: 'Payload inválido',
|
|
382
|
+
statusCode: 400,
|
|
383
|
+
details: z.flattenError(parsed.error)
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
Los DTOs de dominio definen los `@Field` — ver `onna-architecture-common` para el contrato completo.
|
|
389
|
+
|
|
390
|
+
## IoC Container (Awilix)
|
|
391
|
+
|
|
392
|
+
Todos los DALs se registran en `src/container.ts` y se resuelven por petición mediante `createRequestScope`:
|
|
393
|
+
|
|
394
|
+
```typescript
|
|
395
|
+
// container.ts — registro
|
|
396
|
+
const registrations = {
|
|
397
|
+
productsGetAllDal: asClass(ProductsGetAllDal, { lifetime: Lifetime.SCOPED }),
|
|
398
|
+
productsGetByIdDal: asClass(ProductsGetByIdDal, { lifetime: Lifetime.SCOPED }),
|
|
399
|
+
productsCreateDal: asClass(ProductsCreateDal, { lifetime: Lifetime.SCOPED }),
|
|
400
|
+
productsUpdateDal: asClass(ProductsUpdateDal, { lifetime: Lifetime.SCOPED }),
|
|
401
|
+
productsDeleteDal: asClass(ProductsDeleteDal, { lifetime: Lifetime.SCOPED }),
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
export const InjectionTokens = Object.fromEntries(
|
|
405
|
+
Object.keys(registrations).map(k => [k, k])
|
|
406
|
+
) as { [K in keyof typeof registrations]: K };
|
|
407
|
+
|
|
408
|
+
export function createRequestScope(dolikey: string, entityId: number) {
|
|
409
|
+
const scope = container.createScope<RequestCradle>();
|
|
410
|
+
scope.register({ dolikey: asValue(dolikey), entityId: asValue(entityId), ...registrations });
|
|
411
|
+
return scope;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// En el router:
|
|
415
|
+
const scope = createRequestScope(session.dolikey, session.entity);
|
|
416
|
+
const dal = scope.resolve(InjectionTokens.productsGetAllDal);
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
Al añadir un nuevo DAL: (1) importarlo en `container.ts`, (2) añadirlo a `registrations`, (3) `InjectionTokens` se genera automáticamente.
|
|
420
|
+
|
|
421
|
+
## Jerarquía de errores
|
|
422
|
+
|
|
423
|
+
| Clase | statusCode | Uso |
|
|
424
|
+
|-------|------------|-----|
|
|
425
|
+
| `ArgumentError` | 400 | Parámetro inválido |
|
|
426
|
+
| `NotAuthenticatedError` | 401 | Sin sesión |
|
|
427
|
+
| `ForbiddenError` | 403 | Sin permisos |
|
|
428
|
+
| `NotFoundError` | 404 | No encontrado |
|
|
429
|
+
| `IllegalOperationError` | 422 | Operación no permitida |
|
|
430
|
+
| `InternalError` | 500 | Error no controlado |
|
|
431
|
+
|
|
432
|
+
Los errores no controlados deben llegar a `next(error)` — el middleware global de Express los formatea como `ErrorResult`.
|
|
433
|
+
|
|
434
|
+
## Reglas de estilo
|
|
435
|
+
|
|
436
|
+
- **Zero-Any**: prohibido `any`. Usar el tipo de dominio o `unknown`.
|
|
437
|
+
- **Async/Await**: exclusivo. Prohibido `.then()/.catch()` encadenados.
|
|
438
|
+
- DALs son clases, no funciones. Un fichero por DAL.
|
|
439
|
+
- Los mappers son clases instanciadas como atributos privados del DAL que las usa (no singleton, no inyectados).
|
|
440
|
+
- Los enums exclusivos de la capa DAL (como `ProductMode` para el parámetro `mode` de Dolibarr) viven en `infrastructure/dal/dolibarr/enums/`, no en `domain/`.
|
|
441
|
+
|
|
442
|
+
## Verificación obligatoria tras cambios
|
|
443
|
+
|
|
444
|
+
```bash
|
|
445
|
+
cd backend && npx tsc --noEmit
|
|
446
|
+
```
|