@dsalazardev/ai-hub-cli 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/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 +74 -0
- package/dist/cli/doctor.d.ts +14 -0
- package/dist/cli/doctor.js +200 -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 +262 -0
- package/dist/cli/memory.d.ts +2 -0
- package/dist/cli/memory.js +84 -0
- package/dist/cli/onboarding.d.ts +17 -0
- package/dist/cli/onboarding.js +234 -0
- package/dist/cli/run.d.ts +15 -0
- package/dist/cli/run.js +183 -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/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 +93 -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 +113 -0
- package/dist/manifest/manifest.js +202 -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 +18 -0
- package/dist/presets/materialize.js +101 -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 +255 -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 +393 -0
- package/package.json +61 -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 +55 -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 +27 -0
- package/presets/base/rules/core.md +35 -0
- package/presets/generic-ts/preset.yaml +46 -0
- package/presets/python/preset.yaml +47 -0
- package/presets/python/rules/python.md +10 -0
- package/schema/engine.schema.json +73 -0
- package/schema/manifest.schema.json +140 -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,860 @@
|
|
|
1
|
+
# Blueprint: módulo `products` — referencia para replicar en otros módulos
|
|
2
|
+
|
|
3
|
+
> **Audiencia**: agentes de implementación (Claude Sonnet 4.6 u otros) que deben crear o migrar módulos (`fichajes`, `users`, etc.) siguiendo el mismo patrón que `products`.
|
|
4
|
+
>
|
|
5
|
+
> **Fuente de verdad viva**: el código en `backend/src/products`, `frontend/src/app/products` y `common` en ambos lados.
|
|
6
|
+
>
|
|
7
|
+
> **Última revisión**: 2026-06-26
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 0. Reglas obligatorias para el agente
|
|
12
|
+
|
|
13
|
+
1. **No inventar código ni endpoints**. Si no está en este documento ni en el código de referencia, **preguntar al usuario** por chat antes de implementar.
|
|
14
|
+
2. **No fallbacks innecesarios** ni ramas defensivas para casos que el spec no define.
|
|
15
|
+
3. **No magic strings** sueltos: usar enums, constantes nombradas o valores documentados en dominio/DTO.
|
|
16
|
+
4. **Prohibido `any`**. Usar tipos explícitos o `unknown` con type guards.
|
|
17
|
+
5. **`id`**: en `domain/` y en `*DolibarrDto`, `id` es **siempre** `id: number` **sin** `?` (como `productDolibarrDto` / `serviceDolibarrDto`). Único campo obligatorio en la entidad; el resto con `?`. Prohibido `id?:`, `number | string`, `id: string` en dominio. Si Dolibarr envía `"1"` como string JSON, el mapper hace `Number(item.id)`. Detalle y checklist: [products-coding-standard.md](./products-coding-standard.md).
|
|
18
|
+
6. **No copiar archivos legacy** listados en la sección 12. Usar solo la ruta **canónica (nuevo patrón)**.
|
|
19
|
+
7. **Sincronía FE ↔ BE**: DTOs con `@Field` y la entidad `Product` deben ser **idénticos** en frontend y backend (salvo imports relativos vs `@app/`).
|
|
20
|
+
8. **Spec Kit obligatorio**: `/speckit.specify` → aprobación humana → `/speckit.implement`. No escribir código productivo sin spec.
|
|
21
|
+
9. Si `AppQueryBase` / `AppServiceBase` tienen mensajes hardcodeados a "Producto", **parametrizar o sobrescribir** en el módulo nuevo (deuda conocida).
|
|
22
|
+
10. **KPIs en listados**: calcular en **frontend** con `statusCounts` desde `response.data` en cada `load()`, UI con `KpiCardComponent` + pipes `{entity}Status*` del módulo (patrón `products-getall`).
|
|
23
|
+
11. **Regla de paridad products** (users, fichajes y cualquier módulo migrado): lo **general** se hace **igual** que en `products`; solo cambian los **datos del dominio** (entidad, enum, campos, endpoint, permisos). Ver sección 0.1.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 0.1 Regla de paridad products (general igual, datos distintos)
|
|
28
|
+
|
|
29
|
+
> Decisión proyecto (2026-06-26): **users** y **fichajes** (y el resto de módulos) replican el **mismo esqueleto** que `products`. No inventar variantes legacy en listados, DALs, KPIs o formularios si products ya define el patrón.
|
|
30
|
+
|
|
31
|
+
### Igual en todos los módulos (copiar de products)
|
|
32
|
+
|
|
33
|
+
| Área | Patrón canónico |
|
|
34
|
+
|------|-----------------|
|
|
35
|
+
| **Backend dominio** | `domain/{entity}.ts`, `domain/enums/`, DTOs `{Entity}s{Op}Dto`; **`id: number` sin `?`** (único obligatorio) |
|
|
36
|
+
| **Backend infra** | `{entity}DolibarrDto` snake_case, `mappers/` con `toDomain`/`fromDomain`, DAL `run(dto)`, `DolibarrDal` composición |
|
|
37
|
+
| **Backend router** | `createRequestScope` + Awilix, Zod en escritura, `AuthenticatedRequest` |
|
|
38
|
+
| **Frontend dominio** | Espejo byte-a-byte del backend |
|
|
39
|
+
| **Frontend DAL** | `infrastructure/dal/backend/`, `QueryBackendDal` / `ServiceBackendDal` |
|
|
40
|
+
| **Listado** | `extends AppQueryBase`, `load()` + `setStatus()`, **sin** `*RetrieveService` |
|
|
41
|
+
| **KPIs** | Mismo mecanismo: `statusCounts` en `load()`, `KpiCardComponent`, pipes `{entity}Status*`, `setStatus()` |
|
|
42
|
+
| **Tabla / UI** | `col-*`, `card-header`, `card-empty`, `form-field-*` desde **common** |
|
|
43
|
+
| **Create/Update** | `extends AppServiceBase`, `formGroupFromDto` |
|
|
44
|
+
| **Tests** | Vitest, mocks de DAL, sin `any` |
|
|
45
|
+
|
|
46
|
+
### Cambia por módulo (solo datos / negocio)
|
|
47
|
+
|
|
48
|
+
| Qué varía | products | users (employees) | fichajes (workdays / punches) |
|
|
49
|
+
|-----------|----------|-------------------|-------------------------------|
|
|
50
|
+
| Carpeta / URL BFF | `products` → `/api/products` | `users` → `/api/users/employees` | `workdays` → `/api/workdays`, `punches` → `/api/punches` |
|
|
51
|
+
| Entidad listado | `Product` | `EmployeeListItem` | `Workday`, `Punch` |
|
|
52
|
+
| Enum estado | `ProductStatus` | `UserStatus` | `WorkdayStatus`, `PunchStatus`, … |
|
|
53
|
+
| Pipes | `productStatus*` | `userStatus*` | `workdayStatus*`, `punchStatus*`, … |
|
|
54
|
+
| Campos `@Field` / filtros | `filterBy`, `status`, `ref`… | `filterBy`, `status`, `login`… | Según spec Dolibarr |
|
|
55
|
+
| Operaciones extra | `ChangePrice` | Auth, rights (fuera CRUD) | `clock-in`, `break-start`, … (`IServiceDal`) |
|
|
56
|
+
| Nº tarjetas KPI | 3 estado | 2 estado + 2 fichajes (opcional) | Según spec |
|
|
57
|
+
| API Dolibarr | `/products` estándar | `/users` + filtros employee | API custom `fichajestrabajadoresapi` |
|
|
58
|
+
|
|
59
|
+
**Prohibido** en migraciones: servicios retrieve paralelos, KPIs con `stats` del BFF, `<div class="kpi-card">` manual, `EstadosUsuario` en listados nuevos, DAL monolítico, tipos en routers.
|
|
60
|
+
|
|
61
|
+
**Permitido** solo si el spec lo documenta: operaciones no-CRUD (perfil B fichajes), rutas anidadas (`/users/employees`), **más o menos tarjetas KPI** que products si el módulo lo necesita (employees: 2 estado + 2 fichajes), extensiones de listado.
|
|
62
|
+
|
|
63
|
+
**Paridad ≠ copiar cantidad de KPIs**: products tiene 3 tarjetas de estado; employees puede tener 2 u otras — lo que debe ser **igual** es el **mecanismo** (`statusCounts` en `load()`, `KpiCardComponent`, pipes `{entity}Status*`, `setStatus()`), no el número de tarjetas.
|
|
64
|
+
|
|
65
|
+
## 1. Stack y versiones
|
|
66
|
+
|
|
67
|
+
| Entorno | Tecnología | Versión (package.json) |
|
|
68
|
+
|---------|------------|------------------------|
|
|
69
|
+
| Frontend | Angular | ^21.0.0 |
|
|
70
|
+
| Frontend | Angular Material | ^21.2.10 |
|
|
71
|
+
| Frontend | TypeScript | ~5.9.2 |
|
|
72
|
+
| Frontend | Tailwind CSS | ^4.1.12 |
|
|
73
|
+
| Frontend | Vitest | ^4.x (tests) |
|
|
74
|
+
| Backend | Node.js | 20+ (runtime Docker) |
|
|
75
|
+
| Backend | Express | ^5.2.1 |
|
|
76
|
+
| Backend | TypeScript | ^5.x |
|
|
77
|
+
| Backend | Awilix (DI) | ^13.0.3 |
|
|
78
|
+
| Backend | Zod | ^4.3.6 |
|
|
79
|
+
| Backend | RxJS | ^7.8.2 (solo en DALs de listado backend) |
|
|
80
|
+
| Backend | Vitest | tests |
|
|
81
|
+
|
|
82
|
+
**Angular obligatorio**: standalone components, `inject()`, `@if` / `@for` / `@switch` (prohibido `*ngIf`, `*ngFor`, `NgModule`).
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 2. Convenciones de nomenclatura e idioma
|
|
87
|
+
|
|
88
|
+
### 2.1 Idioma
|
|
89
|
+
|
|
90
|
+
| Qué | Idioma | Ejemplo |
|
|
91
|
+
|-----|--------|---------|
|
|
92
|
+
| Carpetas de módulo / URL / archivos de código | Inglés | `products`, `products-getall` |
|
|
93
|
+
| Interfaces y clases de dominio | Inglés | `Product`, `toSell`, `costPrice` |
|
|
94
|
+
| Labels `@Field` | Español | `'Referencia'`, `'Buscar por...'` |
|
|
95
|
+
| Mensajes HTTP / snackbar / diálogos | Español | `'Payload de producto invalido'` |
|
|
96
|
+
| Comentarios de código | Español o inglés técnico breve | Preferir autoexplicativo sin comentar |
|
|
97
|
+
|
|
98
|
+
### 2.2 Convenciones de casing
|
|
99
|
+
|
|
100
|
+
| Artefacto | Convención | Ejemplo |
|
|
101
|
+
|-----------|------------|---------|
|
|
102
|
+
| Carpeta módulo | kebab-case, plural (inglés) | `products/` |
|
|
103
|
+
| Carpeta componente | kebab-case, `{recurso}-{accion}` | `products-getall/`, `products-create/` |
|
|
104
|
+
| Archivo componente | igual que carpeta | `products-getall.ts` |
|
|
105
|
+
| Selector componente | kebab-case (inconsistente en products) | `products-getall`, `app-products-create` |
|
|
106
|
+
| Entidad dominio | PascalCase singular | `Product` |
|
|
107
|
+
| Enum | PascalCase | `ProductStatus` |
|
|
108
|
+
| Archivo enum | camelCase | `productStatus.ts` en `domain/enums/` |
|
|
109
|
+
| DTO operación | `{Recurso}s{Operacion}Dto` | `ProductsGetAllDto`, `ProductsCreateDto` |
|
|
110
|
+
| DTO Dolibarr (infra) | `{Entidad}DolibarrDto` | `ProductDolibarrDto` |
|
|
111
|
+
| DAL backend | `{Recurso}s{Operacion}Dal` | `ProductsGetAllDal` |
|
|
112
|
+
| DAL frontend activo | `{Recurso}s{Operacion}Dal` en `dal/backend/` | `ProductsGetAllDal` |
|
|
113
|
+
| Mapper | `{Entidad}Mapper` | `ProductMapper` |
|
|
114
|
+
| Mapper enum | `{Entidad}{Aspecto}Mapper` | `ProductStatusMapper` |
|
|
115
|
+
| Pipe | camelCase descriptivo | `productStatusLabel` |
|
|
116
|
+
| Router backend | `{recurso}Router.ts` | `productsRouter.ts` |
|
|
117
|
+
| Método DAL | `run(request: Dto): Promise/ Observable` | Un solo método público |
|
|
118
|
+
| Propiedades dominio | camelCase | `ivaRate`, `notePublic` |
|
|
119
|
+
| Campos API Dolibarr | snake_case | `tva_tx`, `cost_price` |
|
|
120
|
+
| Endpoint Dolibarr | string literal en propiedad privada | `private endpoint = "products"` |
|
|
121
|
+
| Ruta BFF | `/api/{recurso-plural}` | `/api/products` |
|
|
122
|
+
| Token Awilix | camelCase | `productsGetAllDal` |
|
|
123
|
+
|
|
124
|
+
### 2.3 Operaciones CRUD estándar
|
|
125
|
+
|
|
126
|
+
| Operación | Sufijo DTO | Sufijo DAL | HTTP |
|
|
127
|
+
|-----------|------------|------------|------|
|
|
128
|
+
| Listado | `GetAllDto` | `GetAllDal` | GET `/` |
|
|
129
|
+
| Detalle | `GetByIdDto` | `GetByIdDal` | GET `/:id` |
|
|
130
|
+
| Crear | `CreateDto` | `CreateDal` | POST `/` |
|
|
131
|
+
| Actualizar | `UpdateDto` | `UpdateDal` | PUT `/:id` |
|
|
132
|
+
| Eliminar | `DeleteDto` | `DeleteDal` | DELETE `/:id` |
|
|
133
|
+
|
|
134
|
+
`CreateDto` en products **extiende** `UpdateDto` sin campos extra.
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## 3. Estructura de carpetas canónica
|
|
139
|
+
|
|
140
|
+
### 3.1 Backend — `backend/src/products/`
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
products/
|
|
144
|
+
├── domain/
|
|
145
|
+
│ ├── product.ts # interface Product (dominio limpio)
|
|
146
|
+
│ ├── productsGetAllDto.ts
|
|
147
|
+
│ ├── productsGetByIdDto.ts
|
|
148
|
+
│ ├── productsCreateDto.ts # extends ProductsUpdateDto
|
|
149
|
+
│ ├── productsUpdateDto.ts # @Field para formularios + Zod
|
|
150
|
+
│ ├── productsDeleteDto.ts
|
|
151
|
+
│ └── enums/
|
|
152
|
+
│ ├── productType.ts
|
|
153
|
+
│ ├── productStatus.ts
|
|
154
|
+
│ └── productPriceBaseType.ts
|
|
155
|
+
└── infrastructure/
|
|
156
|
+
├── router/
|
|
157
|
+
│ └── productsRouter.ts
|
|
158
|
+
└── dal/
|
|
159
|
+
└── dolibarr/
|
|
160
|
+
├── productsGetAllDal.ts
|
|
161
|
+
├── productsGetByIdDal.ts
|
|
162
|
+
├── productsCreateDal.ts
|
|
163
|
+
├── productsUpdateDal.ts
|
|
164
|
+
├── productsDeleteDal.ts
|
|
165
|
+
├── productDolibarrDto.ts # shape API externa (snake_case)
|
|
166
|
+
├── enums/
|
|
167
|
+
│ └── productMode.ts # solo infra (filtro query Dolibarr)
|
|
168
|
+
└── mappers/
|
|
169
|
+
├── productMapper.ts
|
|
170
|
+
├── productStatusMapper.ts
|
|
171
|
+
├── productModeMapper.ts
|
|
172
|
+
└── productPriceBaseTypeMapper.ts
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
**Capas opcionales en products (no replicar salvo necesidad):**
|
|
176
|
+
|
|
177
|
+
- `application/catalogGetAllUseCase.ts` — orquesta productos + servicios
|
|
178
|
+
- `application/productSchemas.ts` — schemas adicionales
|
|
179
|
+
- Routers hermanos: `services.ts`, `catalogRouter.ts`
|
|
180
|
+
|
|
181
|
+
### 3.2 Frontend — `frontend/src/app/products/`
|
|
182
|
+
|
|
183
|
+
```
|
|
184
|
+
products/
|
|
185
|
+
├── domain/ # ESPEJO del backend (mismos DTOs y Product)
|
|
186
|
+
│ ├── product.ts
|
|
187
|
+
│ ├── productsGetAllDto.ts
|
|
188
|
+
│ ├── productsGetByIdDto.ts
|
|
189
|
+
│ ├── productsCreateDto.ts
|
|
190
|
+
│ ├── productsUpdateDto.ts
|
|
191
|
+
│ ├── productsDeleteDto.ts
|
|
192
|
+
│ └── enums/
|
|
193
|
+
│ ├── productType.ts
|
|
194
|
+
│ ├── productStatus.ts
|
|
195
|
+
│ └── productPriceBaseType.ts
|
|
196
|
+
├── application/ # LEGACY comentado — NO usar como referencia
|
|
197
|
+
└── infrastructure/
|
|
198
|
+
├── components/
|
|
199
|
+
│ ├── products-getall/
|
|
200
|
+
│ ├── products-create/
|
|
201
|
+
│ ├── products-update/
|
|
202
|
+
│ └── product-updateprice-dialog/ # modal específico del dominio
|
|
203
|
+
├── dal/
|
|
204
|
+
│ └── backend/ # CANÓNICO — DALs activos
|
|
205
|
+
│ ├── productsGetAllDal.ts
|
|
206
|
+
│ ├── productsGetByIdDal.ts
|
|
207
|
+
│ ├── productsCreate.dal.ts # nota: extensión .dal.ts en algunos archivos
|
|
208
|
+
│ ├── productsUpdate.dal.ts
|
|
209
|
+
│ └── productsChangePriceDal.ts
|
|
210
|
+
├── dal/products-retrieve.dal.ts # delete (nombre legacy pero activo)
|
|
211
|
+
└── pipes/
|
|
212
|
+
├── product-status-color.pipe.ts
|
|
213
|
+
├── product-status-icon.pipe.ts
|
|
214
|
+
├── product-status-label.pipe.ts
|
|
215
|
+
└── product-price-base-type-label.pipe.ts
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**Rutas**: definidas en `frontend/src/app/app.routes.ts` (no hay `products.routes.ts`).
|
|
219
|
+
|
|
220
|
+
Orden crítico: `create` **antes** de `:id`.
|
|
221
|
+
|
|
222
|
+
### 3.3 Qué va en cada carpeta (backend)
|
|
223
|
+
|
|
224
|
+
**Raíz del slice**: `backend/src/{modulo}/` (ej. `products/`, `users/`).
|
|
225
|
+
|
|
226
|
+
| Carpeta / archivo | DEBE contener | NO debe contener |
|
|
227
|
+
|-------------------|---------------|------------------|
|
|
228
|
+
| `domain/{entity}.ts` | `interface` dominio limpio (camelCase, composición de objetos) | snake_case, `fk_*`, tipos Dolibarr, clases, lógica HTTP |
|
|
229
|
+
| `domain/{entity}ListItem.ts` | Proyección de listado si la entidad completa es más grande (ej. `EmployeeListItem`) | Campos que solo existen en formulario CRUD |
|
|
230
|
+
| `domain/enums/{name}.ts` | Enums de **negocio** usados en dominio y DTOs (`ProductStatus`, `UserStatus`) | Valores solo de filtro API Dolibarr |
|
|
231
|
+
| `domain/{Entity}sGetAllDto.ts` | `class extends QueryListDto` + `@Field` en filtros | Validación Zod (va en router) |
|
|
232
|
+
| `domain/{Entity}sGetByIdDto.ts` | `extends QueryItemDto` | — |
|
|
233
|
+
| `domain/{Entity}sUpdateDto.ts` | Campos formulario con `@Field` (español en labels) | — |
|
|
234
|
+
| `domain/{Entity}sCreateDto.ts` | `extends UpdateDto` (products) | Campos distintos al update salvo spec |
|
|
235
|
+
| `domain/{Entity}sDeleteDto.ts` | `id` + metadata `@Field` si aplica | — |
|
|
236
|
+
| `infrastructure/router/{modulo}Router.ts` | Rutas Express, `buildZodSchema`, `createRequestScope`, `requireHttpRight` | Interfaces, DTOs definidos aquí, lógica de mapeo |
|
|
237
|
+
| `infrastructure/dal/dolibarr/{Entity}sGetAllDal.ts` | `class extends DolibarrDal implements IQueryGetListDal` + `run(dto)` | Tipos de dominio definidos aquí |
|
|
238
|
+
| `infrastructure/dal/dolibarr/{entity}DolibarrDto.ts` | Shape fila Dolibarr (snake_case, campos opcionales `?`) | camelCase de dominio |
|
|
239
|
+
| `infrastructure/dal/dolibarr/enums/` | Enums **solo infra** (ej. `productMode` para `sqlfilters`) | Enums que el frontend muestra al usuario |
|
|
240
|
+
| `infrastructure/dal/dolibarr/mappers/{entity}Mapper.ts` | `toDomain` / `fromDomain` **síncronos** | `async`, llamadas HTTP |
|
|
241
|
+
| `infrastructure/dal/dolibarr/mappers/{entity}{Aspect}Mapper.ts` | Traducción enum dominio ↔ valor Dolibarr | — |
|
|
242
|
+
|
|
243
|
+
**Legacy users (hasta migración router)**: rutas pueden vivir en `backend/routes/users.ts`; el **código nuevo** del slice va en `backend/src/users/` como arriba. Objetivo final: `usersRouter.ts` en `infrastructure/router/`.
|
|
244
|
+
|
|
245
|
+
**Fichajes (perfil B)**: mismo `domain/` + `infrastructure/dal/`; DALs pueden llamar API custom (`fichajestrabajadoresapi`). `application/` solo para orquestación que no encaja en un solo `run()` — no sustituye al DAL.
|
|
246
|
+
|
|
247
|
+
### 3.4 Qué va en cada carpeta (frontend)
|
|
248
|
+
|
|
249
|
+
**Raíz del slice**: `frontend/src/app/{modulo}/` (ej. `products/`, `users/`, `fichajes/`).
|
|
250
|
+
|
|
251
|
+
| Carpeta / archivo | DEBE contener | NO debe contener |
|
|
252
|
+
|-------------------|---------------|------------------|
|
|
253
|
+
| `domain/` | **Espejo byte-a-byte** del backend (mismas interfaces, enums, DTOs) | Servicios, HTTP, componentes |
|
|
254
|
+
| `domain/enums/` | Enums de negocio (`productStatus.ts`) | Carpeta `Enumerations/` PascalCase (legacy) |
|
|
255
|
+
| `application/` | Solo lógica pura: formatters, mappers de error API, validators de dominio | DALs, estado de listado, `HttpClient` (legacy en users — no replicar en módulos nuevos) |
|
|
256
|
+
| `infrastructure/components/{recurso}-{accion}/` | `.ts` + `.html` del componente standalone | `.css` en listados estándar (ver §3.5) |
|
|
257
|
+
| `infrastructure/components/.../*.ts` | `inject()`, signals, `extends AppQueryBase` / `AppServiceBase` | `constructor()`, NgModule, tipos definidos en el componente |
|
|
258
|
+
| `infrastructure/dal/backend/{Entity}sGetAllDal.ts` | `extends QueryBackendDal`, `basePath`, `run()` → `api.queryList` | Lógica de UI, snake_case en tipos de dominio |
|
|
259
|
+
| `infrastructure/dal/backend/{Entity}sGetByIdDal.ts` | `extends QueryBackendDal` o patrón item | — |
|
|
260
|
+
| `infrastructure/dal/backend/{Entity}sCreate.dal.ts` | `extends ServiceBackendDal`, `post` | — |
|
|
261
|
+
| `infrastructure/pipes/{entity}-{aspect}-label.pipe.ts` | Pipe standalone para labels de enum | Lógica de negocio pesada |
|
|
262
|
+
| `infrastructure/pipes/{entity}-status-color.pipe.ts` | Color hex / token para badge | — |
|
|
263
|
+
| `infrastructure/pipes/{entity}-status-icon.pipe.ts` | Nombre icono Lucide | — |
|
|
264
|
+
|
|
265
|
+
**Prohibido en módulos migrados al patrón products**:
|
|
266
|
+
|
|
267
|
+
- `infrastructure/dtos/` con shapes de API (usar `domain/` + `QueryResult`)
|
|
268
|
+
- `*-retrieve.service.ts` para listados (usar `AppQueryBase` en el componente)
|
|
269
|
+
- `infrastructure/dal/` en raíz del módulo sin `backend/` (legacy `empleados-retrieve.dal.ts`)
|
|
270
|
+
- Componente hijo solo para búsqueda (`empleados-filters`) — todo en `{modulo}-getall`
|
|
271
|
+
|
|
272
|
+
### 3.5 Estilos CSS — global primero (patrón products)
|
|
273
|
+
|
|
274
|
+
**Regla**: pantallas tipo listado/formulario CRUD siguen **products**: clases globales en el HTML, **sin** `styleUrl` en el componente salvo excepción documentada.
|
|
275
|
+
|
|
276
|
+
| Referencia | Ubicación |
|
|
277
|
+
|------------|-----------|
|
|
278
|
+
| Tokens, dark mode | `frontend/src/assets/styles/variables.css` |
|
|
279
|
+
| Utilidades layout, KPI, mobile-card | `frontend/src/assets/styles/design-system.css` |
|
|
280
|
+
| Tablas, acciones fila | `frontend/src/assets/styles/tables.css` |
|
|
281
|
+
| Cards, page-container | `frontend/src/assets/styles/panels.css` |
|
|
282
|
+
| Formularios ventana | `frontend/src/assets/styles/form-window.css`, `forms.css` |
|
|
283
|
+
| Componentes Material | `frontend/src/assets/styles/components.css` |
|
|
284
|
+
|
|
285
|
+
**Ejemplo canónico** — `products-getall` solo declara `templateUrl`; **no** tiene `products-getall.css`:
|
|
286
|
+
|
|
287
|
+
```typescript
|
|
288
|
+
@Component({
|
|
289
|
+
selector: 'products-getall',
|
|
290
|
+
standalone: true,
|
|
291
|
+
imports: [/* common + pipes */],
|
|
292
|
+
templateUrl: './products-getall.html',
|
|
293
|
+
})
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
**Clases habituales en templates** (Tailwind + utilidades globales):
|
|
297
|
+
|
|
298
|
+
- Contenedor: `page-container`
|
|
299
|
+
- KPIs: `kpi-grid`, `kpi-grid--cols-2`, `kpi-grid--cols-3` + `<kpi-card>`
|
|
300
|
+
- Card listado: `premium-card`, `mat-card`
|
|
301
|
+
- Cabecera: `card-header`, `card-header-title`, `card-header-subtitle`
|
|
302
|
+
- Tabla desktop: `table-container`, `col-status`, componentes `col-*`
|
|
303
|
+
- Móvil: `mobile-list-container`, `mobile-card`, `mobile-only` / `desktop-only`
|
|
304
|
+
- Vacío: `<card-empty>` (common)
|
|
305
|
+
|
|
306
|
+
**Cuándo SÍ crear `.css` local** en el componente:
|
|
307
|
+
|
|
308
|
+
- Modales/diálogos con layout propio (ej. `product-updateprice-dialog.component.css`)
|
|
309
|
+
- Posicionamiento o animación que **no** existe en global y no debe reutilizarse
|
|
310
|
+
- Overrides Material muy específicos del diálogo
|
|
311
|
+
|
|
312
|
+
**Cuándo NO crear `.css` local**:
|
|
313
|
+
|
|
314
|
+
- Listados (`{modulo}-getall`), create/update estándar si el HTML puede usar solo global + Tailwind
|
|
315
|
+
- Duplicar estilos ya en `design-system.css` / `panels.css`
|
|
316
|
+
|
|
317
|
+
Al migrar `employees-list`: eliminar `empleados-list.css` / `empleados-filters.css` si el HTML pasa a las mismas clases que `products-getall.html`.
|
|
318
|
+
|
|
319
|
+
### 3.6 Árbol objetivo por módulo (sustituir nombres, misma forma)
|
|
320
|
+
|
|
321
|
+
Sustituir `{entity}`, `{modulo}`, `{recurso}` manteniendo la **misma profundidad de carpetas**:
|
|
322
|
+
|
|
323
|
+
#### `users` — slice listado empleados (`migrate-employees-list`)
|
|
324
|
+
|
|
325
|
+
```
|
|
326
|
+
backend/src/users/
|
|
327
|
+
├── domain/
|
|
328
|
+
│ ├── employeeListItem.ts
|
|
329
|
+
│ ├── employeesGetAllDto.ts
|
|
330
|
+
│ ├── userGroup.ts # UserGroupRef existente
|
|
331
|
+
│ └── enums/
|
|
332
|
+
│ └── userStatus.ts
|
|
333
|
+
└── infrastructure/
|
|
334
|
+
└── dal/dolibarr/
|
|
335
|
+
├── employeesGetAllDal.ts
|
|
336
|
+
├── userDolibarrDto.ts
|
|
337
|
+
├── userGroupDolibarrDto.ts
|
|
338
|
+
└── mappers/
|
|
339
|
+
├── employeeListItemMapper.ts
|
|
340
|
+
├── userGroupMapper.ts
|
|
341
|
+
└── userStatusMapper.ts
|
|
342
|
+
# Router: GET /employees en usersRouter (legacy path) hasta move a infrastructure/router/
|
|
343
|
+
|
|
344
|
+
frontend/src/app/users/
|
|
345
|
+
├── domain/ # espejo de lo anterior
|
|
346
|
+
│ ├── employeeListItem.ts
|
|
347
|
+
│ ├── employeesGetAllDto.ts
|
|
348
|
+
│ ├── userGroup.ts
|
|
349
|
+
│ └── enums/userStatus.ts
|
|
350
|
+
├── application/ # solo form/validators legacy hasta CRUD migrate
|
|
351
|
+
└── infrastructure/
|
|
352
|
+
├── components/
|
|
353
|
+
│ └── employees-list/ # antes empleados-list; SIN employees-filters
|
|
354
|
+
│ ├── employees-list.ts
|
|
355
|
+
│ └── employees-list.html
|
|
356
|
+
├── dal/backend/
|
|
357
|
+
│ └── employeesGetAllDal.ts # basePath = 'users/employees'
|
|
358
|
+
├── pipes/
|
|
359
|
+
│ ├── user-status-label.pipe.ts
|
|
360
|
+
│ ├── user-status-color.pipe.ts
|
|
361
|
+
│ └── user-status-icon.pipe.ts
|
|
362
|
+
└── employees-export.service.ts
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
#### `fichajes` — objetivo (change futuro; nombres en inglés)
|
|
366
|
+
|
|
367
|
+
```
|
|
368
|
+
backend/src/fichajes/
|
|
369
|
+
├── domain/
|
|
370
|
+
│ ├── punch.ts / workday.ts # según spec punches + workdays
|
|
371
|
+
│ └── enums/
|
|
372
|
+
│ └── punchStatus.ts # migrar desde Enumerations/
|
|
373
|
+
└── infrastructure/
|
|
374
|
+
├── router/fichajesRouter.ts # objetivo
|
|
375
|
+
└── dal/dolibarr/ o dal/custom/
|
|
376
|
+
├── punchesClockInDal.ts
|
|
377
|
+
└── mappers/
|
|
378
|
+
|
|
379
|
+
frontend/src/app/fichajes/
|
|
380
|
+
├── domain/ # espejo
|
|
381
|
+
├── application/ # formatters puros (locationStatusMessage, etc.)
|
|
382
|
+
└── infrastructure/
|
|
383
|
+
├── components/
|
|
384
|
+
│ ├── punches-getall/ # ejemplo listado futuro
|
|
385
|
+
│ └── workdays-getall/
|
|
386
|
+
├── dal/backend/
|
|
387
|
+
└── pipes/
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
Hoy fichajes tiene más `.css` local y `Enumerations/` — al migrar, alinear enums a `domain/enums/` y reducir CSS a global donde coincida con products.
|
|
391
|
+
|
|
392
|
+
### 3.7 Plantilla de nombres al clonar products → otro módulo
|
|
393
|
+
|
|
394
|
+
| products | users (empleados) | fichajes (ejemplo) |
|
|
395
|
+
|----------|-------------------|---------------------|
|
|
396
|
+
| `Product` | `EmployeeListItem` (listado) / `User` (CRUD futuro) | `Punch`, `Workday` |
|
|
397
|
+
| `products-getall` | `employees-list` | `punches-getall` |
|
|
398
|
+
| `ProductsGetAllDto` | `EmployeesGetAllDto` | `PunchesGetAllDto` |
|
|
399
|
+
| `ProductsGetAllDal` (BE) | `EmployeesGetAllDal` | `PunchesGetAllDal` |
|
|
400
|
+
| `productsGetAllDal` (FE) | `employeesGetAllDal` | `punchesGetAllDal` |
|
|
401
|
+
| `productStatus` | `userStatus` | `punchStatus` |
|
|
402
|
+
| `product-status-label.pipe` | `user-status-label.pipe` | `punch-status-label.pipe` |
|
|
403
|
+
| `/api/products` | `/api/users/employees` | `/api/fichajes/...` |
|
|
404
|
+
|
|
405
|
+
---
|
|
406
|
+
|
|
407
|
+
## 4. Arquitectura backend (patrón products)
|
|
408
|
+
|
|
409
|
+
### 4.1 Separación de responsabilidades
|
|
410
|
+
|
|
411
|
+
```
|
|
412
|
+
HTTP Request
|
|
413
|
+
→ productsRouter.ts (validación Zod, permisos, scope DI)
|
|
414
|
+
→ ProductsXxxDal.run(dto) (orquestación Dolibarr)
|
|
415
|
+
→ ProductMapper (DolibarrDto ↔ Product)
|
|
416
|
+
→ DolibarrClient (HTTP axios)
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
| Capa | Qué va | Qué NO va |
|
|
420
|
+
|------|--------|-----------|
|
|
421
|
+
| `domain/` | `Product`, enums, DTOs | Tipos Dolibarr, lógica HTTP |
|
|
422
|
+
| `infrastructure/dal/` | DALs, mappers, `ProductDolibarrDto` | Interfaces de negocio nuevas |
|
|
423
|
+
| `infrastructure/router/` | Express, `buildZodSchema`, `createRequestScope` | Definir tipos/DTOs |
|
|
424
|
+
|
|
425
|
+
### 4.2 Interfaces DAL (`backend/src/common/domain/`)
|
|
426
|
+
|
|
427
|
+
```typescript
|
|
428
|
+
// Listado
|
|
429
|
+
interface IQueryGetListDal<P, T> {
|
|
430
|
+
run(request: P): Promise<QueryListResult<T>>;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// Detalle
|
|
434
|
+
interface IQueryGetItemDal<P, T> {
|
|
435
|
+
run(request: P): Promise<QueryItemResult<T>>;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// Comandos (create/update/delete)
|
|
439
|
+
interface IServiceDal<P, T> {
|
|
440
|
+
run(request: P): Promise<T>;
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
### 4.3 `DolibarrDal` (clase abstracta)
|
|
445
|
+
|
|
446
|
+
Ubicación: `backend/src/common/infrastructure/dolibarr/dolibarrDal.ts`
|
|
447
|
+
|
|
448
|
+
- Instancia `DolibarrClient` en constructor `(dolikey, entityId)`.
|
|
449
|
+
- Helpers protegidos:
|
|
450
|
+
- `mapFiltersFromDomain(value, columns[])` → fragmentos `sqlfilters` Dolibarr
|
|
451
|
+
- `combineSqlFilters(...filters)` → une con ` and `
|
|
452
|
+
- `mapStatusFilterFrom(status, column)`
|
|
453
|
+
|
|
454
|
+
**GetAll** extiende `DolibarrDal`. **GetById** usa `DolibarrClient` por composición directa (inconsistencia menor aceptada).
|
|
455
|
+
|
|
456
|
+
### 4.4 `ProductsGetAllDal` — patrón de listado (el más complejo)
|
|
457
|
+
|
|
458
|
+
Responsabilidades:
|
|
459
|
+
|
|
460
|
+
1. Normalizar `sortfield` → `t.${sortfield || "rowid"}`
|
|
461
|
+
2. Construir `paramsSql` (sqlfilters, mode, status)
|
|
462
|
+
3. `this.dolibarr.query2<ProductDolibarrDto>(endpoint, paramsSql, request)`
|
|
463
|
+
4. Pipeline RxJS: `map(toDomain)` → `pick(fields)` → `toArray()`
|
|
464
|
+
5. Retornar `{ data, pagination }`
|
|
465
|
+
|
|
466
|
+
**Por qué es más grande que GetById/Create**: paginación, ordenación, filtros SQL, proyección de campos y traducción masiva de filas.
|
|
467
|
+
|
|
468
|
+
### 4.5 Mappers
|
|
469
|
+
|
|
470
|
+
- `ProductMapper.toDomain(dto: ProductDolibarrDto): Product`
|
|
471
|
+
- `ProductMapper.fromDomain(product: Product): ProductDolibarrDto`
|
|
472
|
+
- Mappers pequeños para enums (`ProductStatusMapper`, `ProductModeMapper`, `ProductPriceBaseTypeMapper`)
|
|
473
|
+
- Todos extienden `DolibarrMapper` (marcador vacío en common)
|
|
474
|
+
|
|
475
|
+
**Regla**: dominio limpio en camelCase; DTO Dolibarr en snake_case. Nunca mezclar en `domain/product.ts`.
|
|
476
|
+
|
|
477
|
+
### 4.6 Router (`productsRouter.ts`)
|
|
478
|
+
|
|
479
|
+
Patrón por ruta:
|
|
480
|
+
|
|
481
|
+
```typescript
|
|
482
|
+
router.get("/", async (req, res, next) => {
|
|
483
|
+
const { session, query } = req as AuthenticatedRequest;
|
|
484
|
+
const queryRequest = new ProductsGetAllDto(query);
|
|
485
|
+
const scope = createRequestScope(session.dolikey, session.entity);
|
|
486
|
+
const dal = scope.resolve(InjectionTokens.productsGetAllDal);
|
|
487
|
+
const result = await dal.run(queryRequest);
|
|
488
|
+
res.json(result);
|
|
489
|
+
});
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
Mutaciones (POST/PUT/DELETE):
|
|
493
|
+
|
|
494
|
+
```typescript
|
|
495
|
+
const parsed = buildZodSchema(ProductsCreateDto).safeParse({ ...req.body, type: ProductType.Product });
|
|
496
|
+
if (!parsed.success) {
|
|
497
|
+
return res.status(400).json({ error: "Payload de producto invalido", statusCode: 400, details: z.flattenError(parsed.error) });
|
|
498
|
+
}
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
Middleware global del router: `requireHttpRight(productHttpRightPolicy, "No tienes permiso...")`.
|
|
502
|
+
|
|
503
|
+
### 4.7 DI Awilix (`backend/src/container.ts`)
|
|
504
|
+
|
|
505
|
+
```typescript
|
|
506
|
+
productsGetAllDal: asClass(ProductsGetAllDal, { lifetime: Lifetime.SCOPED }),
|
|
507
|
+
// ... una línea por DAL
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
Uso:
|
|
511
|
+
|
|
512
|
+
```typescript
|
|
513
|
+
const scope = createRequestScope(session.dolikey, session.entity);
|
|
514
|
+
const dal = scope.resolve(InjectionTokens.productsGetAllDal);
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
Constructor DAL: `constructor(dolikey: string, entityId: number = 1)` — Awilix inyecta por nombre.
|
|
518
|
+
|
|
519
|
+
Montaje: `server.ts` → `app.use('/api/products', productsRouter)`.
|
|
520
|
+
|
|
521
|
+
---
|
|
522
|
+
|
|
523
|
+
## 5. Arquitectura frontend (patrón products)
|
|
524
|
+
|
|
525
|
+
### 5.1 Flujo de datos
|
|
526
|
+
|
|
527
|
+
```
|
|
528
|
+
Componente (extends AppQueryBase / AppServiceBase)
|
|
529
|
+
→ DAL en dal/backend/ (extends QueryBackendDal / ServiceBackendDal)
|
|
530
|
+
→ ApiDalService.queryList | queryItem | post | put | delete
|
|
531
|
+
→ BFF /api/products
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
### 5.2 Bases comunes
|
|
535
|
+
|
|
536
|
+
| Clase | Archivo | Uso |
|
|
537
|
+
|-------|---------|-----|
|
|
538
|
+
| `AppBase` | `common/infrastructure/app-base.ts` | Snackbar, router, `isMobile` |
|
|
539
|
+
| `AppQueryBase<DTO, T>` | `app-query-base.ts` | Listados: `formGroupFromDto`, `dal.run()` |
|
|
540
|
+
| `AppServiceBase<DTO, T>` | `app-service-base.ts` | Create/Update: `loadDal` + `dal`, `form.disable()` en update |
|
|
541
|
+
|
|
542
|
+
Constructor en componente hijo:
|
|
543
|
+
|
|
544
|
+
```typescript
|
|
545
|
+
constructor() {
|
|
546
|
+
super(ProductsGetAllDto); // o ProductsUpdateDto
|
|
547
|
+
this.dal = this.productsGetAllDal;
|
|
548
|
+
// update además:
|
|
549
|
+
this.loadDal = this.productsGetByIdDal;
|
|
550
|
+
}
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
### 5.3 DAL frontend canónico
|
|
554
|
+
|
|
555
|
+
```typescript
|
|
556
|
+
@Injectable({ providedIn: 'root' })
|
|
557
|
+
export class ProductsGetAllDal extends QueryBackendDal<ProductsGetAllDto, QueryResult<Product>> {
|
|
558
|
+
private api = inject(ApiDalService);
|
|
559
|
+
private basePath = 'products';
|
|
560
|
+
|
|
561
|
+
run(request: ProductsGetAllDto): Observable<QueryResult<Product>> {
|
|
562
|
+
return this.api.queryList<QueryResult<Product>>(this.basePath, request);
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
- **Lectura lista**: `QueryBackendDal` + `api.queryList`
|
|
568
|
+
- **Lectura item**: `QueryBackendDal` + `api.queryItem`
|
|
569
|
+
- **Mutación**: `ServiceBackendDal` + `api.post` / `api.put` / `api.delete`
|
|
570
|
+
|
|
571
|
+
### 5.4 Componente listado (`ProductsGetAllComponent`)
|
|
572
|
+
|
|
573
|
+
Extiende `AppQueryBase<ProductsGetAllDto, QueryResult<Product>>`.
|
|
574
|
+
|
|
575
|
+
Patrones UI:
|
|
576
|
+
|
|
577
|
+
- KPIs (`kpi-card`) filtran por `status`
|
|
578
|
+
- Filtro texto en `filterBy` vía `form-field-text`
|
|
579
|
+
- Tabla desktop: `mat-table` + columnas `col-icon`, `col-text`, `col-currency`, `col-button`
|
|
580
|
+
- Mobile: cards expandibles con `selectedId` signal
|
|
581
|
+
- Permisos: `computed` desde `GlobalInfoService`
|
|
582
|
+
- `dataSource`: array directo `items()` (no `MatTableDataSource` en este módulo)
|
|
583
|
+
- Pipes de dominio para estado (color, icono, label)
|
|
584
|
+
|
|
585
|
+
### 5.5 Componentes create / update
|
|
586
|
+
|
|
587
|
+
Extienden `AppServiceBase<ProductsCreateDto | ProductsUpdateDto, Product>`.
|
|
588
|
+
|
|
589
|
+
- Formulario generado desde `@Field` en DTO (`formGroupFromDto`)
|
|
590
|
+
- Secciones: `mat-card` + `card-section` + `form-field-*`
|
|
591
|
+
- Update: `ngOnInit` → `this.form.disable()` → botón "Modificar" habilita edición
|
|
592
|
+
- Enums en selects: pipe con método `selector()` → `SelectorResult[]`
|
|
593
|
+
|
|
594
|
+
### 5.6 Pipes de dominio (patrón)
|
|
595
|
+
|
|
596
|
+
```typescript
|
|
597
|
+
@Pipe({ name: 'productStatusLabel', standalone: true })
|
|
598
|
+
export class ProductStatusLabelPipe implements PipeTransform {
|
|
599
|
+
transform(status?: ProductStatus): string { /* español */ }
|
|
600
|
+
selector(): SelectorResult[] { /* para mat-select */ }
|
|
601
|
+
}
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
Replicar por cada enum visible en UI: `color`, `icon`, `label` si aplica.
|
|
605
|
+
|
|
606
|
+
### 5.7 Rutas y guards (`app.routes.ts`)
|
|
607
|
+
|
|
608
|
+
```typescript
|
|
609
|
+
{
|
|
610
|
+
path: 'products',
|
|
611
|
+
children: [
|
|
612
|
+
{ path: '', loadComponent: () => import('...products-getall')..., canActivate: [canReadProductsGuard] },
|
|
613
|
+
{ path: 'create', loadComponent: () => import('...products-create')..., canActivate: [canCreateProductsGuard] },
|
|
614
|
+
{ path: ':id', loadComponent: () => import('...products-update')..., canActivate: [canCreateProductsGuard] },
|
|
615
|
+
]
|
|
616
|
+
}
|
|
617
|
+
```
|
|
618
|
+
|
|
619
|
+
Guards: `common/infrastructure/guards/commercial-module.guards.ts`.
|
|
620
|
+
|
|
621
|
+
---
|
|
622
|
+
|
|
623
|
+
## 6. `common` — qué reutilizar (DRY / KISS)
|
|
624
|
+
|
|
625
|
+
### 6.1 Backend `backend/src/common/`
|
|
626
|
+
|
|
627
|
+
| Artefacto | Ruta | Cuándo usar |
|
|
628
|
+
|-----------|------|-------------|
|
|
629
|
+
| `QueryListDto` | `domain/queryListDto.ts` | Todo listado paginado |
|
|
630
|
+
| `QueryItemDto` | `domain/queryItemDto.ts` | GET por id |
|
|
631
|
+
| `QueryListResult` / `QueryItemResult` | `domain/` | Respuestas DAL |
|
|
632
|
+
| `field-meta` + `@Field` | `domain/field-meta.ts` | DTOs con metadata |
|
|
633
|
+
| `buildZodSchema` | `infrastructure/zodSchemas.ts` | Validación router |
|
|
634
|
+
| `DolibarrDal` | `infrastructure/dolibarr/dolibarrDal.ts` | DALs con filtros SQL |
|
|
635
|
+
| `DolibarrClient` | `infrastructure/dolibarr/dolibarrClient.ts` | HTTP Dolibarr |
|
|
636
|
+
| `DolibarrMapper` | `infrastructure/dolibarr/dolibarrMapper.ts` | Base mappers |
|
|
637
|
+
| `AuthenticatedRequest` | `domain/AuthenticatedRequest.ts` | Routers |
|
|
638
|
+
| `pick` (RxJS) | `utils/rxjs-utils.ts` | Proyección `fields` en GetAll |
|
|
639
|
+
| `EntityResolver` | `infrastructure/EntityResolver.ts` | Hidratar relaciones (órdenes, facturas) |
|
|
640
|
+
| Errores tipados | `backend/src/errors/domain/` | Jerarquía `BaseError` |
|
|
641
|
+
|
|
642
|
+
**No duplicar** en el módulo: lógica de paginación, generación Zod, filtros SQL base.
|
|
643
|
+
|
|
644
|
+
### 6.2 Frontend `frontend/src/app/common/`
|
|
645
|
+
|
|
646
|
+
| Artefacto | Cuándo usar |
|
|
647
|
+
|-----------|-------------|
|
|
648
|
+
| `ApiDalService` | Único HTTP al BFF (`withCredentials: true`) |
|
|
649
|
+
| `QueryBackendDal` / `ServiceBackendDal` | Bases DAL |
|
|
650
|
+
| `AppQueryBase` / `AppServiceBase` | Componentes listado / formulario |
|
|
651
|
+
| `formGroupFromDto` | Formularios desde `@Field` |
|
|
652
|
+
| `col-*`, `form-field-*`, `card-*`, `kpi-card` | UI listados y formularios |
|
|
653
|
+
| `confirm-dialog` | Borrados |
|
|
654
|
+
| Guards en `guards/` | Permisos por módulo |
|
|
655
|
+
| DTOs base (`QueryListDto`, etc.) | Espejo backend |
|
|
656
|
+
|
|
657
|
+
**Imports**: preferir alias `@app/common/...` y `@app/{modulo}/...`.
|
|
658
|
+
|
|
659
|
+
### 6.3 Contrato `@Field` (un DTO, dos usos)
|
|
660
|
+
|
|
661
|
+
```
|
|
662
|
+
ProductsUpdateDto con @Field
|
|
663
|
+
├─ buildZodSchema() → validación backend (router)
|
|
664
|
+
└─ formGroupFromDto() → FormGroup Angular (frontend)
|
|
665
|
+
```
|
|
666
|
+
|
|
667
|
+
Labels en **español**; nombres de propiedad en **inglés camelCase**.
|
|
668
|
+
|
|
669
|
+
---
|
|
670
|
+
|
|
671
|
+
## 7. Flujo end-to-end (listado)
|
|
672
|
+
|
|
673
|
+
```
|
|
674
|
+
Browser GET /api/products?page=0&limit=50&filterBy=mesa&status=1
|
|
675
|
+
→ productsRouter: new ProductsGetAllDto(query)
|
|
676
|
+
→ ProductsGetAllDal.run(dto)
|
|
677
|
+
→ sqlfilters + query2 → Dolibarr /products
|
|
678
|
+
→ ProductDolibarrDto[] → ProductMapper.toDomain → Product[]
|
|
679
|
+
→ JSON { data: Product[], pagination: {...} }
|
|
680
|
+
|
|
681
|
+
Angular ProductsGetAllComponent.load()
|
|
682
|
+
→ ProductsGetAllDal.run(dto)
|
|
683
|
+
→ ApiDalService.queryList('products', dto)
|
|
684
|
+
→ mismo JSON
|
|
685
|
+
→ items.set(response.data)
|
|
686
|
+
```
|
|
687
|
+
|
|
688
|
+
---
|
|
689
|
+
|
|
690
|
+
## 8. Checklist para replicar un módulo CRUD (ej. `users`, `fichajes`)
|
|
691
|
+
|
|
692
|
+
### Backend
|
|
693
|
+
|
|
694
|
+
- [ ] `domain/{entity}.ts` — interface dominio
|
|
695
|
+
- [ ] `domain/enums/` — enums de negocio
|
|
696
|
+
- [ ] `domain/{Entity}sGetAllDto.ts` extends `QueryListDto` + filtros `@Field`
|
|
697
|
+
- [ ] `domain/{Entity}sGetByIdDto.ts` extends `QueryItemDto`
|
|
698
|
+
- [ ] `domain/{Entity}sCreateDto.ts` / `UpdateDto` con `@Field`
|
|
699
|
+
- [ ] `domain/{Entity}sDeleteDto.ts`
|
|
700
|
+
- [ ] `infrastructure/dal/dolibarr/{entity}DolibarrDto.ts`
|
|
701
|
+
- [ ] `infrastructure/dal/dolibarr/mappers/{entity}Mapper.ts`
|
|
702
|
+
- [ ] 5 DALs (GetAll, GetById, Create, Update, Delete)
|
|
703
|
+
- [ ] `infrastructure/router/{entity}Router.ts`
|
|
704
|
+
- [ ] Registrar DALs en `container.ts` (`Lifetime.SCOPED`)
|
|
705
|
+
- [ ] Montar en `server.ts` `/api/{entities}`
|
|
706
|
+
- [ ] Policy `requireHttpRight` del módulo
|
|
707
|
+
- [ ] Tests Vitest (DAL + routes)
|
|
708
|
+
- [ ] Verificar: `cd backend && npx tsc --noEmit`
|
|
709
|
+
|
|
710
|
+
### Frontend
|
|
711
|
+
|
|
712
|
+
- [ ] Espejar `domain/` del backend
|
|
713
|
+
- [ ] `infrastructure/dal/backend/{Entity}sGetAllDal.ts` etc.
|
|
714
|
+
- [ ] `{entity}s-getall` extends `AppQueryBase`
|
|
715
|
+
- [ ] `{entity}s-create` / `{entity}s-update` extends `AppServiceBase`
|
|
716
|
+
- [ ] Pipes de enums si hay estados visibles
|
|
717
|
+
- [ ] Rutas en `app.routes.ts` (estáticas antes de dinámicas)
|
|
718
|
+
- [ ] Guards existentes o nuevos en `common/guards/`
|
|
719
|
+
- [ ] Verificar: `cd frontend && ng build`
|
|
720
|
+
|
|
721
|
+
---
|
|
722
|
+
|
|
723
|
+
## 9. Variaciones esperadas por módulo
|
|
724
|
+
|
|
725
|
+
| Aspecto | products | users (`migrate-employees-list`) | fichajes (esperado) |
|
|
726
|
+
|---------|----------|-----------------------------------|---------------------|
|
|
727
|
+
| Patrón | Nuevo (referencia) | En curso — listado GetAll | Legacy hoy — migrar |
|
|
728
|
+
| DI Awilix | Sí | Solo `employeesGetAllDal` en listado | No aún — añadir |
|
|
729
|
+
| API Dolibarr | `/products` estándar | `/users` + filtros employee | API custom `fichajestrabajadoresapi` |
|
|
730
|
+
| CRUD puro | Sí | Parcial (solo listado en change 1) | No — acciones (`clock-in`, etc.) |
|
|
731
|
+
| Entidad listado | `Product` completa | `EmployeeListItem` (proyección) | `Punch` / `Workday` |
|
|
732
|
+
| KPIs estado | `statusCounts` página | **Igual** (`statusCounts` + `kpi-card`) | FE (definir en spec) |
|
|
733
|
+
| DTOs `@Field` | Sí | Sí en `EmployeesGetAllDto` | Migrar formularios de acción |
|
|
734
|
+
| Common UI | col-*, form-field-* | Reutilizar + pipes `userStatus*` | `punch-card`, `time-hm-input` |
|
|
735
|
+
| EntityResolver | Sí (otros módulos) | No en listado (grupos N+1 legacy) | Si hidrata `User` |
|
|
736
|
+
|
|
737
|
+
**Fichajes**: modelar cada acción como `IServiceDal` con su DTO (`PunchesClockInDto`, etc.), no forzar CRUD si la API no lo es.
|
|
738
|
+
|
|
739
|
+
**Users**: spec `migrate-employees-list` cerrado — sin `stats` en BFF; `UserGroupRef` en `userGroup.ts`; ruta FE DAL `users/employees`.
|
|
740
|
+
|
|
741
|
+
---
|
|
742
|
+
|
|
743
|
+
## 10. Archivos de referencia (leer antes de codificar)
|
|
744
|
+
|
|
745
|
+
### Backend
|
|
746
|
+
|
|
747
|
+
| Propósito | Archivo |
|
|
748
|
+
|-----------|---------|
|
|
749
|
+
| Router + Zod + DI | `products/infrastructure/router/productsRouter.ts` |
|
|
750
|
+
| List DAL completo | `products/infrastructure/dal/dolibarr/productsGetAllDal.ts` |
|
|
751
|
+
| GetById DAL | `products/infrastructure/dal/dolibarr/productsGetByIdDal.ts` |
|
|
752
|
+
| Mapper principal | `products/infrastructure/dal/dolibarr/mappers/productMapper.ts` |
|
|
753
|
+
| DTO formulario | `products/domain/productsUpdateDto.ts` |
|
|
754
|
+
| DTO listado | `products/domain/productsGetAllDto.ts` |
|
|
755
|
+
| DI | `container.ts` |
|
|
756
|
+
| Filtros SQL | `common/infrastructure/dolibarr/dolibarrDal.ts` |
|
|
757
|
+
| Zod desde @Field | `common/infrastructure/zodSchemas.ts` |
|
|
758
|
+
|
|
759
|
+
### Frontend
|
|
760
|
+
|
|
761
|
+
| Propósito | Archivo |
|
|
762
|
+
|-----------|---------|
|
|
763
|
+
| Listado | `products/infrastructure/components/products-getall/products-getall.ts` + `.html` (**sin .css**) |
|
|
764
|
+
| Create | `products/infrastructure/components/products-create/products-create.ts` |
|
|
765
|
+
| Update | `products/infrastructure/components/products-update/products-update.ts` |
|
|
766
|
+
| DAL listado | `products/infrastructure/dal/backend/productsGetAllDal.ts` |
|
|
767
|
+
| AppQueryBase | `common/infrastructure/app-query-base.ts` |
|
|
768
|
+
| AppServiceBase | `common/infrastructure/app-service-base.ts` |
|
|
769
|
+
| ApiDalService | `common/infrastructure/api.dal.service.ts` |
|
|
770
|
+
| Form desde DTO | `common/infrastructure/formField.ts` |
|
|
771
|
+
|
|
772
|
+
---
|
|
773
|
+
|
|
774
|
+
## 11. Estado de madurez en `products` (no replicar bugs)
|
|
775
|
+
|
|
776
|
+
| Área | Estado |
|
|
777
|
+
|------|--------|
|
|
778
|
+
| GetAll + GetById + mappers | Referencia estable |
|
|
779
|
+
| Create / Update / Delete backend | **WIP** — mapper/retornos incompletos |
|
|
780
|
+
| Delete frontend en listado | UI preparada, llamada comentada |
|
|
781
|
+
| Paginador en template | Comentado |
|
|
782
|
+
| `application/*.service.ts` frontend | Comentado — no usar |
|
|
783
|
+
| DALs duplicados en `dal/` raíz vs `dal/backend/` | Usar solo `dal/backend/` |
|
|
784
|
+
| `domain/Enumerations/` (PascalCase) | Legacy — usar `domain/enums/` |
|
|
785
|
+
| `AppServiceBase.onSave` mensajes | Hardcodeados a "Producto" |
|
|
786
|
+
| GetById no extiende `DolibarrDal` | Inconsistencia menor |
|
|
787
|
+
|
|
788
|
+
Antes de replicar mutaciones, **confirmar con usuario** si products debe terminarse primero o si el nuevo módulo debe implementar Create/Update/Delete completos desde el inicio.
|
|
789
|
+
|
|
790
|
+
---
|
|
791
|
+
|
|
792
|
+
## 12. Archivos legacy — NO usar como plantilla
|
|
793
|
+
|
|
794
|
+
### Backend
|
|
795
|
+
|
|
796
|
+
- `products/infrastructure/dal/dolibarr/productsDal.ts`
|
|
797
|
+
- `productMappers.ts`, `productMapper.ts` (raíz dolibarr, fuera de `mappers/`)
|
|
798
|
+
- `domain/Enumerations/*` (duplicado de `domain/enums/`)
|
|
799
|
+
- `DolibarrProductResponse.ts` si existe duplicado con `productDolibarrDto.ts`
|
|
800
|
+
|
|
801
|
+
### Frontend
|
|
802
|
+
|
|
803
|
+
- `application/productsGetAllService.ts` (comentado)
|
|
804
|
+
- `application/products-update.service.ts` (comentado)
|
|
805
|
+
- `infrastructure/dal/productsGetAllDal.ts` (raíz, usar `dal/backend/`)
|
|
806
|
+
- `infrastructure/dal/products-update.dal.ts` (legacy ApiDalService)
|
|
807
|
+
- `domain/Enumerations/` vs `domain/enums/` — consolidar en `enums/`
|
|
808
|
+
|
|
809
|
+
---
|
|
810
|
+
|
|
811
|
+
## 13. Verificación obligatoria
|
|
812
|
+
|
|
813
|
+
```bash
|
|
814
|
+
# Backend
|
|
815
|
+
cd backend && npx tsc --noEmit
|
|
816
|
+
cd backend && npm test -- tests/products # si existen tests del módulo
|
|
817
|
+
|
|
818
|
+
# Frontend
|
|
819
|
+
cd frontend && ng build
|
|
820
|
+
|
|
821
|
+
# Zero-Any (muestra debe estar vacía en código productivo)
|
|
822
|
+
rg "\bany\b" backend/src/{modulo}/ frontend/src/app/{modulo}/
|
|
823
|
+
```
|
|
824
|
+
|
|
825
|
+
Backend Docker tras cambios BFF:
|
|
826
|
+
|
|
827
|
+
```bash
|
|
828
|
+
docker compose down && docker compose build --no-cache backend && docker compose up -d backend
|
|
829
|
+
```
|
|
830
|
+
|
|
831
|
+
---
|
|
832
|
+
|
|
833
|
+
## 14. Preguntas abiertas — escalar al usuario
|
|
834
|
+
|
|
835
|
+
El agente **debe preguntar** si no tiene respuesta en spec ni en este documento:
|
|
836
|
+
|
|
837
|
+
1. ¿El módulo nuevo es CRUD estándar Dolibarr o API custom (como fichajes)?
|
|
838
|
+
2. ¿Qué política de permisos `requireHttpRight` / guards aplicar?
|
|
839
|
+
3. ¿Los KPIs del listado vienen del backend o se calculan en frontend (como products hoy con `statusCounts`)?
|
|
840
|
+
4. ¿Campos del formulario y filtros exactos (lista de `@Field`)?
|
|
841
|
+
5. ¿El módulo necesita `EntityResolver` / objetos compuestos en dominio?
|
|
842
|
+
6. ¿Create/Update/Delete deben estar completos en la primera entrega o solo listado + detalle?
|
|
843
|
+
7. ¿Endpoint Dolibarr exacto y parámetros documentados en `backend/doc/swagger.json`?
|
|
844
|
+
|
|
845
|
+
---
|
|
846
|
+
|
|
847
|
+
## 15. Documentos relacionados
|
|
848
|
+
|
|
849
|
+
| Documento | Propósito |
|
|
850
|
+
|-----------|-----------|
|
|
851
|
+
| `AGENTS.md` | Constitución global |
|
|
852
|
+
| [module-implementation-flow.md](./module-implementation-flow.md) | Orden paso a paso (domain → BE → FE) |
|
|
853
|
+
| [common-imports-catalog.md](./common-imports-catalog.md) | Imports de common usados por products |
|
|
854
|
+
| [fichajes-migration-notes.md](./fichajes-migration-notes.md) | Plan fichajes (renombres, endpoints) |
|
|
855
|
+
| [users-migration-notes.md](./users-migration-notes.md) | Plan users/employees |
|
|
856
|
+
| [replicate-module-checklist.md](./replicate-module-checklist.md) | Checklist corto |
|
|
857
|
+
|
|
858
|
+
---
|
|
859
|
+
|
|
860
|
+
*Mantener este archivo actualizado cuando `products` evolucione o cuando un módulo migrado establezca un patrón nuevo validado.*
|