aios-core 2.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/.aios-core/.session/current-session.json +14 -0
- package/.aios-core/cli/commands/generate/index.js +222 -0
- package/.aios-core/cli/commands/manifest/index.js +46 -0
- package/.aios-core/cli/commands/manifest/regenerate.js +96 -0
- package/.aios-core/cli/commands/manifest/validate.js +66 -0
- package/.aios-core/cli/commands/mcp/add.js +234 -0
- package/.aios-core/cli/commands/mcp/index.js +76 -0
- package/.aios-core/cli/commands/mcp/link.js +217 -0
- package/.aios-core/cli/commands/mcp/setup.js +164 -0
- package/.aios-core/cli/commands/mcp/status.js +183 -0
- package/.aios-core/cli/commands/metrics/cleanup.js +91 -0
- package/.aios-core/cli/commands/metrics/index.js +65 -0
- package/.aios-core/cli/commands/metrics/record.js +154 -0
- package/.aios-core/cli/commands/metrics/seed.js +126 -0
- package/.aios-core/cli/commands/metrics/show.js +209 -0
- package/.aios-core/cli/commands/migrate/analyze.js +353 -0
- package/.aios-core/cli/commands/migrate/backup.js +352 -0
- package/.aios-core/cli/commands/migrate/execute.js +292 -0
- package/.aios-core/cli/commands/migrate/index.js +441 -0
- package/.aios-core/cli/commands/migrate/rollback.js +323 -0
- package/.aios-core/cli/commands/migrate/update-imports.js +396 -0
- package/.aios-core/cli/commands/migrate/validate.js +452 -0
- package/.aios-core/cli/commands/qa/index.js +56 -0
- package/.aios-core/cli/commands/qa/run.js +163 -0
- package/.aios-core/cli/commands/qa/status.js +195 -0
- package/.aios-core/cli/commands/workers/formatters/info-formatter.js +274 -0
- package/.aios-core/cli/commands/workers/formatters/list-table.js +265 -0
- package/.aios-core/cli/commands/workers/formatters/list-tree.js +159 -0
- package/.aios-core/cli/commands/workers/index.js +56 -0
- package/.aios-core/cli/commands/workers/info.js +194 -0
- package/.aios-core/cli/commands/workers/list.js +214 -0
- package/.aios-core/cli/commands/workers/search-filters.js +185 -0
- package/.aios-core/cli/commands/workers/search-keyword.js +310 -0
- package/.aios-core/cli/commands/workers/search-semantic.js +293 -0
- package/.aios-core/cli/commands/workers/search.js +154 -0
- package/.aios-core/cli/commands/workers/utils/pagination.js +102 -0
- package/.aios-core/cli/index.js +128 -0
- package/.aios-core/cli/utils/output-formatter-cli.js +232 -0
- package/.aios-core/cli/utils/score-calculator.js +221 -0
- package/.aios-core/core/README.md +229 -0
- package/.aios-core/core/config/config-cache.js +233 -0
- package/.aios-core/core/config/config-loader.js +277 -0
- package/.aios-core/core/data/agent-config-requirements.yaml +368 -0
- package/.aios-core/core/data/aios-kb.md +924 -0
- package/.aios-core/core/data/workflow-patterns.yaml +267 -0
- package/.aios-core/core/docs/SHARD-TRANSLATION-GUIDE.md +335 -0
- package/.aios-core/core/docs/component-creation-guide.md +458 -0
- package/.aios-core/core/docs/session-update-pattern.md +307 -0
- package/.aios-core/core/docs/template-syntax.md +267 -0
- package/.aios-core/core/docs/troubleshooting-guide.md +625 -0
- package/.aios-core/core/elicitation/agent-elicitation.js +272 -0
- package/.aios-core/core/elicitation/elicitation-engine.js +479 -0
- package/.aios-core/core/elicitation/session-manager.js +320 -0
- package/.aios-core/core/elicitation/task-elicitation.js +281 -0
- package/.aios-core/core/elicitation/workflow-elicitation.js +315 -0
- package/.aios-core/core/index.esm.js +42 -0
- package/.aios-core/core/index.js +76 -0
- package/.aios-core/core/manifest/manifest-generator.js +386 -0
- package/.aios-core/core/manifest/manifest-validator.js +429 -0
- package/.aios-core/core/mcp/config-migrator.js +340 -0
- package/.aios-core/core/mcp/global-config-manager.js +369 -0
- package/.aios-core/core/mcp/index.js +34 -0
- package/.aios-core/core/mcp/os-detector.js +188 -0
- package/.aios-core/core/mcp/symlink-manager.js +413 -0
- package/.aios-core/core/migration/migration-config.yaml +83 -0
- package/.aios-core/core/migration/module-mapping.yaml +89 -0
- package/.aios-core/core/quality-gates/base-layer.js +134 -0
- package/.aios-core/core/quality-gates/checklist-generator.js +329 -0
- package/.aios-core/core/quality-gates/focus-area-recommender.js +359 -0
- package/.aios-core/core/quality-gates/human-review-orchestrator.js +529 -0
- package/.aios-core/core/quality-gates/layer1-precommit.js +336 -0
- package/.aios-core/core/quality-gates/layer2-pr-automation.js +324 -0
- package/.aios-core/core/quality-gates/layer3-human-review.js +348 -0
- package/.aios-core/core/quality-gates/notification-manager.js +550 -0
- package/.aios-core/core/quality-gates/quality-gate-config.yaml +86 -0
- package/.aios-core/core/quality-gates/quality-gate-manager.js +601 -0
- package/.aios-core/core/registry/README.md +179 -0
- package/.aios-core/core/registry/build-registry.js +452 -0
- package/.aios-core/core/registry/registry-loader.js +330 -0
- package/.aios-core/core/registry/registry-schema.json +166 -0
- package/.aios-core/core/registry/service-registry.json +6586 -0
- package/.aios-core/core/registry/validate-registry.js +340 -0
- package/.aios-core/core/session/context-detector.js +229 -0
- package/.aios-core/core/session/context-loader.js +288 -0
- package/.aios-core/core/utils/output-formatter.js +298 -0
- package/.aios-core/core/utils/security-utils.js +333 -0
- package/.aios-core/core/utils/yaml-validator.js +419 -0
- package/.aios-core/core-config.yaml +382 -0
- package/.aios-core/data/agent-config-requirements.yaml +368 -0
- package/.aios-core/data/aios-kb.md +924 -0
- package/.aios-core/data/technical-preferences.md +4 -0
- package/.aios-core/data/workflow-patterns.yaml +267 -0
- package/.aios-core/development/README.md +142 -0
- package/.aios-core/development/agent-teams/team-all.yaml +15 -0
- package/.aios-core/development/agent-teams/team-fullstack.yaml +18 -0
- package/.aios-core/development/agent-teams/team-ide-minimal.yaml +10 -0
- package/.aios-core/development/agent-teams/team-no-ui.yaml +13 -0
- package/.aios-core/development/agent-teams/team-qa-focused.yaml +155 -0
- package/.aios-core/development/agents/aios-master.md +339 -0
- package/.aios-core/development/agents/analyst.md +195 -0
- package/.aios-core/development/agents/architect.md +359 -0
- package/.aios-core/development/agents/data-engineer.md +468 -0
- package/.aios-core/development/agents/dev.md +390 -0
- package/.aios-core/development/agents/devops.md +398 -0
- package/.aios-core/development/agents/pm.md +198 -0
- package/.aios-core/development/agents/po.md +256 -0
- package/.aios-core/development/agents/qa.md +312 -0
- package/.aios-core/development/agents/sm.md +220 -0
- package/.aios-core/development/agents/ux-design-expert.md +451 -0
- package/.aios-core/development/scripts/agent-assignment-resolver.js +231 -0
- package/.aios-core/development/scripts/agent-config-loader.js +624 -0
- package/.aios-core/development/scripts/agent-exit-hooks.js +96 -0
- package/.aios-core/development/scripts/apply-inline-greeting-all-agents.js +146 -0
- package/.aios-core/development/scripts/audit-agent-config.js +380 -0
- package/.aios-core/development/scripts/backlog-manager.js +404 -0
- package/.aios-core/development/scripts/batch-update-agents-session-context.js +95 -0
- package/.aios-core/development/scripts/decision-context.js +228 -0
- package/.aios-core/development/scripts/decision-log-generator.js +293 -0
- package/.aios-core/development/scripts/decision-log-indexer.js +284 -0
- package/.aios-core/development/scripts/decision-recorder.js +168 -0
- package/.aios-core/development/scripts/dev-context-loader.js +297 -0
- package/.aios-core/development/scripts/generate-greeting.js +160 -0
- package/.aios-core/development/scripts/greeting-builder.js +866 -0
- package/.aios-core/development/scripts/greeting-config-cli.js +85 -0
- package/.aios-core/development/scripts/greeting-preference-manager.js +145 -0
- package/.aios-core/development/scripts/migrate-task-to-v2.js +377 -0
- package/.aios-core/development/scripts/story-index-generator.js +337 -0
- package/.aios-core/development/scripts/story-manager.js +375 -0
- package/.aios-core/development/scripts/story-update-hook.js +259 -0
- package/.aios-core/development/scripts/task-identifier-resolver.js +145 -0
- package/.aios-core/development/scripts/test-greeting-system.js +142 -0
- package/.aios-core/development/scripts/validate-task-v2.js +319 -0
- package/.aios-core/development/scripts/workflow-navigator.js +214 -0
- package/.aios-core/development/tasks/add-mcp.md +319 -0
- package/.aios-core/development/tasks/advanced-elicitation.md +319 -0
- package/.aios-core/development/tasks/analyst-facilitate-brainstorming.md +342 -0
- package/.aios-core/development/tasks/analyze-framework.md +697 -0
- package/.aios-core/development/tasks/analyze-performance.md +637 -0
- package/.aios-core/development/tasks/apply-qa-fixes.md +340 -0
- package/.aios-core/development/tasks/architect-analyze-impact.md +827 -0
- package/.aios-core/development/tasks/audit-codebase.md +429 -0
- package/.aios-core/development/tasks/audit-tailwind-config.md +270 -0
- package/.aios-core/development/tasks/audit-utilities.md +358 -0
- package/.aios-core/development/tasks/bootstrap-shadcn-library.md +286 -0
- package/.aios-core/development/tasks/brownfield-create-epic.md +486 -0
- package/.aios-core/development/tasks/brownfield-create-story.md +357 -0
- package/.aios-core/development/tasks/build-component.md +478 -0
- package/.aios-core/development/tasks/calculate-roi.md +455 -0
- package/.aios-core/development/tasks/ci-cd-configuration.md +764 -0
- package/.aios-core/development/tasks/cleanup-utilities.md +670 -0
- package/.aios-core/development/tasks/collaborative-edit.md +1109 -0
- package/.aios-core/development/tasks/compose-molecule.md +284 -0
- package/.aios-core/development/tasks/consolidate-patterns.md +414 -0
- package/.aios-core/development/tasks/correct-course.md +280 -0
- package/.aios-core/development/tasks/create-agent.md +322 -0
- package/.aios-core/development/tasks/create-brownfield-story.md +727 -0
- package/.aios-core/development/tasks/create-deep-research-prompt.md +499 -0
- package/.aios-core/development/tasks/create-doc.md +316 -0
- package/.aios-core/development/tasks/create-next-story.md +774 -0
- package/.aios-core/development/tasks/create-suite.md +284 -0
- package/.aios-core/development/tasks/create-task.md +372 -0
- package/.aios-core/development/tasks/create-workflow.md +371 -0
- package/.aios-core/development/tasks/db-analyze-hotpaths.md +572 -0
- package/.aios-core/development/tasks/db-apply-migration.md +381 -0
- package/.aios-core/development/tasks/db-bootstrap.md +642 -0
- package/.aios-core/development/tasks/db-domain-modeling.md +693 -0
- package/.aios-core/development/tasks/db-dry-run.md +293 -0
- package/.aios-core/development/tasks/db-env-check.md +260 -0
- package/.aios-core/development/tasks/db-expansion-pack-integration.md +663 -0
- package/.aios-core/development/tasks/db-explain.md +631 -0
- package/.aios-core/development/tasks/db-impersonate.md +495 -0
- package/.aios-core/development/tasks/db-load-csv.md +593 -0
- package/.aios-core/development/tasks/db-policy-apply.md +653 -0
- package/.aios-core/development/tasks/db-rls-audit.md +411 -0
- package/.aios-core/development/tasks/db-rollback.md +739 -0
- package/.aios-core/development/tasks/db-run-sql.md +613 -0
- package/.aios-core/development/tasks/db-schema-audit.md +1011 -0
- package/.aios-core/development/tasks/db-seed.md +390 -0
- package/.aios-core/development/tasks/db-smoke-test.md +351 -0
- package/.aios-core/development/tasks/db-snapshot.md +569 -0
- package/.aios-core/development/tasks/db-supabase-setup.md +712 -0
- package/.aios-core/development/tasks/db-verify-order.md +515 -0
- package/.aios-core/development/tasks/deprecate-component.md +957 -0
- package/.aios-core/development/tasks/dev-apply-qa-fixes.md +318 -0
- package/.aios-core/development/tasks/dev-backlog-debt.md +469 -0
- package/.aios-core/development/tasks/dev-develop-story.md +846 -0
- package/.aios-core/development/tasks/dev-improve-code-quality.md +873 -0
- package/.aios-core/development/tasks/dev-optimize-performance.md +1034 -0
- package/.aios-core/development/tasks/dev-suggest-refactoring.md +871 -0
- package/.aios-core/development/tasks/dev-validate-next-story.md +349 -0
- package/.aios-core/development/tasks/document-project.md +553 -0
- package/.aios-core/development/tasks/environment-bootstrap.md +1311 -0
- package/.aios-core/development/tasks/execute-checklist.md +301 -0
- package/.aios-core/development/tasks/export-design-tokens-dtcg.md +274 -0
- package/.aios-core/development/tasks/extend-pattern.md +269 -0
- package/.aios-core/development/tasks/extract-tokens.md +467 -0
- package/.aios-core/development/tasks/facilitate-brainstorming-session.md +518 -0
- package/.aios-core/development/tasks/generate-ai-frontend-prompt.md +261 -0
- package/.aios-core/development/tasks/generate-documentation.md +284 -0
- package/.aios-core/development/tasks/generate-migration-strategy.md +522 -0
- package/.aios-core/development/tasks/generate-shock-report.md +501 -0
- package/.aios-core/development/tasks/github-devops-github-pr-automation.md +427 -0
- package/.aios-core/development/tasks/github-devops-pre-push-quality-gate.md +733 -0
- package/.aios-core/development/tasks/github-devops-repository-cleanup.md +374 -0
- package/.aios-core/development/tasks/github-devops-version-management.md +483 -0
- package/.aios-core/development/tasks/improve-self.md +823 -0
- package/.aios-core/development/tasks/index-docs.md +388 -0
- package/.aios-core/development/tasks/init-project-status.md +506 -0
- package/.aios-core/development/tasks/integrate-expansion-pack.md +314 -0
- package/.aios-core/development/tasks/kb-mode-interaction.md +284 -0
- package/.aios-core/development/tasks/learn-patterns.md +901 -0
- package/.aios-core/development/tasks/mcp-workflow.md +437 -0
- package/.aios-core/development/tasks/modify-agent.md +382 -0
- package/.aios-core/development/tasks/modify-task.md +425 -0
- package/.aios-core/development/tasks/modify-workflow.md +466 -0
- package/.aios-core/development/tasks/po-backlog-add.md +370 -0
- package/.aios-core/development/tasks/po-manage-story-backlog.md +523 -0
- package/.aios-core/development/tasks/po-pull-story-from-clickup.md +540 -0
- package/.aios-core/development/tasks/po-pull-story.md +316 -0
- package/.aios-core/development/tasks/po-stories-index.md +351 -0
- package/.aios-core/development/tasks/po-sync-story-to-clickup.md +457 -0
- package/.aios-core/development/tasks/po-sync-story.md +303 -0
- package/.aios-core/development/tasks/pr-automation.md +701 -0
- package/.aios-core/development/tasks/propose-modification.md +843 -0
- package/.aios-core/development/tasks/qa-backlog-add-followup.md +425 -0
- package/.aios-core/development/tasks/qa-gate.md +374 -0
- package/.aios-core/development/tasks/qa-generate-tests.md +1175 -0
- package/.aios-core/development/tasks/qa-nfr-assess.md +558 -0
- package/.aios-core/development/tasks/qa-review-proposal.md +1158 -0
- package/.aios-core/development/tasks/qa-review-story.md +683 -0
- package/.aios-core/development/tasks/qa-risk-profile.md +567 -0
- package/.aios-core/development/tasks/qa-run-tests.md +277 -0
- package/.aios-core/development/tasks/qa-test-design.md +388 -0
- package/.aios-core/development/tasks/qa-trace-requirements.md +477 -0
- package/.aios-core/development/tasks/release-management.md +723 -0
- package/.aios-core/development/tasks/security-audit.md +554 -0
- package/.aios-core/development/tasks/security-scan.md +790 -0
- package/.aios-core/development/tasks/setup-database.md +741 -0
- package/.aios-core/development/tasks/setup-design-system.md +462 -0
- package/.aios-core/development/tasks/setup-github.md +874 -0
- package/.aios-core/development/tasks/setup-llm-routing.md +229 -0
- package/.aios-core/development/tasks/setup-mcp-docker.md +584 -0
- package/.aios-core/development/tasks/shard-doc.md +538 -0
- package/.aios-core/development/tasks/sm-create-next-story.md +480 -0
- package/.aios-core/development/tasks/sync-documentation.md +865 -0
- package/.aios-core/development/tasks/tailwind-upgrade.md +294 -0
- package/.aios-core/development/tasks/test-as-user.md +621 -0
- package/.aios-core/development/tasks/test-validation-task.md +171 -0
- package/.aios-core/development/tasks/undo-last.md +347 -0
- package/.aios-core/development/tasks/update-manifest.md +410 -0
- package/.aios-core/development/tasks/ux-create-wireframe.md +617 -0
- package/.aios-core/development/tasks/ux-ds-scan-artifact.md +672 -0
- package/.aios-core/development/tasks/ux-user-research.md +559 -0
- package/.aios-core/development/tasks/validate-next-story.md +423 -0
- package/.aios-core/development/tasks/validate-structure.md +243 -0
- package/.aios-core/development/workflows/README.md +84 -0
- package/.aios-core/development/workflows/brownfield-fullstack.yaml +297 -0
- package/.aios-core/development/workflows/brownfield-service.yaml +187 -0
- package/.aios-core/development/workflows/brownfield-ui.yaml +197 -0
- package/.aios-core/development/workflows/greenfield-fullstack.yaml +333 -0
- package/.aios-core/development/workflows/greenfield-service.yaml +206 -0
- package/.aios-core/development/workflows/greenfield-ui.yaml +235 -0
- package/.aios-core/docs/SHARD-TRANSLATION-GUIDE.md +335 -0
- package/.aios-core/docs/component-creation-guide.md +458 -0
- package/.aios-core/docs/session-update-pattern.md +307 -0
- package/.aios-core/docs/standards/AGENT-PERSONALIZATION-STANDARD-V1.md +572 -0
- package/.aios-core/docs/standards/AIOS-COLOR-PALETTE-QUICK-REFERENCE.md +185 -0
- package/.aios-core/docs/standards/AIOS-COLOR-PALETTE-V2.1.md +354 -0
- package/.aios-core/docs/standards/AIOS-FRAMEWORK-MASTER.md +1963 -0
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md +821 -0
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-SUMMARY.md +1190 -0
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1.md +439 -0
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.2-SUMMARY.md +1339 -0
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO.md +5398 -0
- package/.aios-core/docs/standards/EXECUTOR-DECISION-TREE.md +697 -0
- package/.aios-core/docs/standards/OPEN-SOURCE-VS-SERVICE-DIFFERENCES.md +511 -0
- package/.aios-core/docs/standards/QUALITY-GATES-SPECIFICATION.md +556 -0
- package/.aios-core/docs/standards/STANDARDS-INDEX.md +210 -0
- package/.aios-core/docs/standards/STORY-TEMPLATE-V2-SPECIFICATION.md +550 -0
- package/.aios-core/docs/standards/TASK-FORMAT-SPECIFICATION-V1.md +1414 -0
- package/.aios-core/docs/standards/V3-ARCHITECTURAL-DECISIONS.md +523 -0
- package/.aios-core/docs/template-syntax.md +267 -0
- package/.aios-core/docs/troubleshooting-guide.md +625 -0
- package/.aios-core/elicitation/agent-elicitation.js +272 -0
- package/.aios-core/elicitation/task-elicitation.js +281 -0
- package/.aios-core/elicitation/workflow-elicitation.js +315 -0
- package/.aios-core/index.d.ts +8 -0
- package/.aios-core/index.esm.js +16 -0
- package/.aios-core/index.js +16 -0
- package/.aios-core/infrastructure/README.md +126 -0
- package/.aios-core/infrastructure/index.js +199 -0
- package/.aios-core/infrastructure/integrations/pm-adapters/README.md +59 -0
- package/.aios-core/infrastructure/integrations/pm-adapters/clickup-adapter.js +345 -0
- package/.aios-core/infrastructure/integrations/pm-adapters/github-adapter.js +392 -0
- package/.aios-core/infrastructure/integrations/pm-adapters/jira-adapter.js +448 -0
- package/.aios-core/infrastructure/integrations/pm-adapters/local-adapter.js +175 -0
- package/.aios-core/infrastructure/scripts/_archived/final-todo-count.js +122 -0
- package/.aios-core/infrastructure/scripts/_archived/fix-yaml-formatting.js +89 -0
- package/.aios-core/infrastructure/scripts/_archived/migration-generator.js +780 -0
- package/.aios-core/infrastructure/scripts/_archived/migration-path-generator.js +950 -0
- package/.aios-core/infrastructure/scripts/_archived/phase2-entrada-saida-errors.js +425 -0
- package/.aios-core/infrastructure/scripts/_archived/phase2-spot-check.js +132 -0
- package/.aios-core/infrastructure/scripts/_archived/phase3-tools-scripts-validation.js +381 -0
- package/.aios-core/infrastructure/scripts/_archived/phase4-metadata-performance.js +203 -0
- package/.aios-core/infrastructure/scripts/_archived/test-yaml-parsing.js +24 -0
- package/.aios-core/infrastructure/scripts/_archived/verify-yaml-fix.js +51 -0
- package/.aios-core/infrastructure/scripts/aios-validator.js +294 -0
- package/.aios-core/infrastructure/scripts/approval-workflow.js +643 -0
- package/.aios-core/infrastructure/scripts/atomic-layer-classifier.js +308 -0
- package/.aios-core/infrastructure/scripts/backup-manager.js +607 -0
- package/.aios-core/infrastructure/scripts/batch-creator.js +608 -0
- package/.aios-core/infrastructure/scripts/branch-manager.js +391 -0
- package/.aios-core/infrastructure/scripts/capability-analyzer.js +535 -0
- package/.aios-core/infrastructure/scripts/clickup-helpers.js +226 -0
- package/.aios-core/infrastructure/scripts/code-quality-improver.js +1312 -0
- package/.aios-core/infrastructure/scripts/commit-message-generator.js +850 -0
- package/.aios-core/infrastructure/scripts/component-generator.js +738 -0
- package/.aios-core/infrastructure/scripts/component-metadata.js +627 -0
- package/.aios-core/infrastructure/scripts/component-search.js +277 -0
- package/.aios-core/infrastructure/scripts/config-cache.js +322 -0
- package/.aios-core/infrastructure/scripts/config-loader.js +349 -0
- package/.aios-core/infrastructure/scripts/conflict-resolver.js +675 -0
- package/.aios-core/infrastructure/scripts/coverage-analyzer.js +882 -0
- package/.aios-core/infrastructure/scripts/dependency-analyzer.js +638 -0
- package/.aios-core/infrastructure/scripts/dependency-impact-analyzer.js +703 -0
- package/.aios-core/infrastructure/scripts/diff-generator.js +129 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/brownfield-analyzer.js +501 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/config-generator.js +329 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/deployment-config-loader.js +282 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/doc-generator.js +331 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/gitignore-generator.js +313 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/index.js +74 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/mode-detector.js +358 -0
- package/.aios-core/infrastructure/scripts/documentation-synchronizer.js +1432 -0
- package/.aios-core/infrastructure/scripts/framework-analyzer.js +746 -0
- package/.aios-core/infrastructure/scripts/git-config-detector.js +293 -0
- package/.aios-core/infrastructure/scripts/git-wrapper.js +443 -0
- package/.aios-core/infrastructure/scripts/improvement-engine.js +758 -0
- package/.aios-core/infrastructure/scripts/improvement-validator.js +710 -0
- package/.aios-core/infrastructure/scripts/llm-routing/install-llm-routing.js +267 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-free.cmd +80 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-free.sh +62 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-max.cmd +26 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-max.sh +18 -0
- package/.aios-core/infrastructure/scripts/modification-risk-assessment.js +970 -0
- package/.aios-core/infrastructure/scripts/modification-validator.js +555 -0
- package/.aios-core/infrastructure/scripts/output-formatter.js +297 -0
- package/.aios-core/infrastructure/scripts/performance-analyzer.js +758 -0
- package/.aios-core/infrastructure/scripts/performance-and-error-resolver.js +258 -0
- package/.aios-core/infrastructure/scripts/performance-optimizer.js +1902 -0
- package/.aios-core/infrastructure/scripts/performance-tracker.js +452 -0
- package/.aios-core/infrastructure/scripts/pm-adapter-factory.js +181 -0
- package/.aios-core/infrastructure/scripts/pm-adapter.js +134 -0
- package/.aios-core/infrastructure/scripts/project-status-loader.js +445 -0
- package/.aios-core/infrastructure/scripts/refactoring-suggester.js +1139 -0
- package/.aios-core/infrastructure/scripts/repository-detector.js +64 -0
- package/.aios-core/infrastructure/scripts/sandbox-tester.js +618 -0
- package/.aios-core/infrastructure/scripts/security-checker.js +359 -0
- package/.aios-core/infrastructure/scripts/source-tree-guardian/index.js +375 -0
- package/.aios-core/infrastructure/scripts/source-tree-guardian/manifest-generator.js +410 -0
- package/.aios-core/infrastructure/scripts/source-tree-guardian/rules/naming-rules.yaml +285 -0
- package/.aios-core/infrastructure/scripts/source-tree-guardian/rules/placement-rules.yaml +262 -0
- package/.aios-core/infrastructure/scripts/source-tree-guardian/validator.js +468 -0
- package/.aios-core/infrastructure/scripts/spot-check-validator.js +149 -0
- package/.aios-core/infrastructure/scripts/status-mapper.js +115 -0
- package/.aios-core/infrastructure/scripts/template-engine.js +240 -0
- package/.aios-core/infrastructure/scripts/template-validator.js +279 -0
- package/.aios-core/infrastructure/scripts/test-generator.js +844 -0
- package/.aios-core/infrastructure/scripts/test-quality-assessment.js +1081 -0
- package/.aios-core/infrastructure/scripts/test-utilities-fast.js +126 -0
- package/.aios-core/infrastructure/scripts/test-utilities.js +200 -0
- package/.aios-core/infrastructure/scripts/tool-resolver.js +360 -0
- package/.aios-core/infrastructure/scripts/transaction-manager.js +590 -0
- package/.aios-core/infrastructure/scripts/usage-analytics.js +634 -0
- package/.aios-core/infrastructure/scripts/validate-output-pattern.js +213 -0
- package/.aios-core/infrastructure/scripts/visual-impact-generator.js +1056 -0
- package/.aios-core/infrastructure/scripts/yaml-validator.js +397 -0
- package/.aios-core/infrastructure/templates/coderabbit.yaml.template +279 -0
- package/.aios-core/infrastructure/templates/core-config/core-config-brownfield.tmpl.yaml +182 -0
- package/.aios-core/infrastructure/templates/core-config/core-config-greenfield.tmpl.yaml +127 -0
- package/.aios-core/infrastructure/templates/github-workflows/README.md +109 -0
- package/.aios-core/infrastructure/templates/github-workflows/ci.yml.template +169 -0
- package/.aios-core/infrastructure/templates/github-workflows/pr-automation.yml.template +330 -0
- package/.aios-core/infrastructure/templates/github-workflows/release.yml.template +196 -0
- package/.aios-core/infrastructure/templates/gitignore/gitignore-aios-base.tmpl +63 -0
- package/.aios-core/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +18 -0
- package/.aios-core/infrastructure/templates/gitignore/gitignore-node.tmpl +85 -0
- package/.aios-core/infrastructure/templates/gitignore/gitignore-python.tmpl +145 -0
- package/.aios-core/infrastructure/templates/project-docs/coding-standards-tmpl.md +346 -0
- package/.aios-core/infrastructure/templates/project-docs/source-tree-tmpl.md +177 -0
- package/.aios-core/infrastructure/templates/project-docs/tech-stack-tmpl.md +267 -0
- package/.aios-core/infrastructure/tests/project-status-loader.test.js +394 -0
- package/.aios-core/infrastructure/tests/regression-suite-v2.md +621 -0
- package/.aios-core/infrastructure/tests/utilities-audit-results.json +501 -0
- package/.aios-core/infrastructure/tests/validate-module.js +97 -0
- package/.aios-core/infrastructure/tools/README.md +222 -0
- package/.aios-core/infrastructure/tools/cli/github-cli.yaml +200 -0
- package/.aios-core/infrastructure/tools/cli/llm-routing.yaml +126 -0
- package/.aios-core/infrastructure/tools/cli/railway-cli.yaml +260 -0
- package/.aios-core/infrastructure/tools/cli/supabase-cli.yaml +224 -0
- package/.aios-core/infrastructure/tools/local/ffmpeg.yaml +261 -0
- package/.aios-core/infrastructure/tools/mcp/21st-dev-magic.yaml +127 -0
- package/.aios-core/infrastructure/tools/mcp/browser.yaml +103 -0
- package/.aios-core/infrastructure/tools/mcp/clickup.yaml +534 -0
- package/.aios-core/infrastructure/tools/mcp/context7.yaml +78 -0
- package/.aios-core/infrastructure/tools/mcp/desktop-commander.yaml +180 -0
- package/.aios-core/infrastructure/tools/mcp/exa.yaml +103 -0
- package/.aios-core/infrastructure/tools/mcp/google-workspace.yaml +930 -0
- package/.aios-core/infrastructure/tools/mcp/n8n.yaml +551 -0
- package/.aios-core/infrastructure/tools/mcp/supabase.yaml +808 -0
- package/.aios-core/install-manifest.yaml +347 -0
- package/.aios-core/manifests/agents.csv +1 -0
- package/.aios-core/manifests/schema/manifest-schema.json +190 -0
- package/.aios-core/manifests/tasks.csv +121 -0
- package/.aios-core/manifests/workers.csv +204 -0
- package/.aios-core/package.json +103 -0
- package/.aios-core/product/README.md +56 -0
- package/.aios-core/product/checklists/architect-checklist.md +444 -0
- package/.aios-core/product/checklists/change-checklist.md +183 -0
- package/.aios-core/product/checklists/database-design-checklist.md +119 -0
- package/.aios-core/product/checklists/dba-predeploy-checklist.md +97 -0
- package/.aios-core/product/checklists/dba-rollback-checklist.md +99 -0
- package/.aios-core/product/checklists/pm-checklist.md +376 -0
- package/.aios-core/product/checklists/po-master-checklist.md +442 -0
- package/.aios-core/product/checklists/pre-push-checklist.md +108 -0
- package/.aios-core/product/checklists/release-checklist.md +122 -0
- package/.aios-core/product/checklists/story-dod-checklist.md +102 -0
- package/.aios-core/product/checklists/story-draft-checklist.md +216 -0
- package/.aios-core/product/data/brainstorming-techniques.md +37 -0
- package/.aios-core/product/data/elicitation-methods.md +135 -0
- package/.aios-core/product/data/mode-selection-best-practices.md +471 -0
- package/.aios-core/product/data/test-levels-framework.md +149 -0
- package/.aios-core/product/data/test-priorities-matrix.md +175 -0
- package/.aios-core/product/templates/1mcp-config.yaml +225 -0
- package/.aios-core/product/templates/activation-instructions-inline-greeting.yaml +63 -0
- package/.aios-core/product/templates/activation-instructions-template.md +258 -0
- package/.aios-core/product/templates/adr.hbs +125 -0
- package/.aios-core/product/templates/agent-template.yaml +121 -0
- package/.aios-core/product/templates/architecture-tmpl.yaml +651 -0
- package/.aios-core/product/templates/brainstorming-output-tmpl.yaml +156 -0
- package/.aios-core/product/templates/brownfield-architecture-tmpl.yaml +476 -0
- package/.aios-core/product/templates/brownfield-prd-tmpl.yaml +280 -0
- package/.aios-core/product/templates/changelog-template.md +134 -0
- package/.aios-core/product/templates/command-rationalization-matrix.md +152 -0
- package/.aios-core/product/templates/competitor-analysis-tmpl.yaml +293 -0
- package/.aios-core/product/templates/component-react-tmpl.tsx +98 -0
- package/.aios-core/product/templates/dbdr.hbs +241 -0
- package/.aios-core/product/templates/design-story-tmpl.yaml +587 -0
- package/.aios-core/product/templates/ds-artifact-analysis.md +70 -0
- package/.aios-core/product/templates/engine/elicitation.js +298 -0
- package/.aios-core/product/templates/engine/index.js +308 -0
- package/.aios-core/product/templates/engine/loader.js +231 -0
- package/.aios-core/product/templates/engine/renderer.js +343 -0
- package/.aios-core/product/templates/engine/schemas/adr.schema.json +102 -0
- package/.aios-core/product/templates/engine/schemas/dbdr.schema.json +205 -0
- package/.aios-core/product/templates/engine/schemas/epic.schema.json +175 -0
- package/.aios-core/product/templates/engine/schemas/pmdr.schema.json +175 -0
- package/.aios-core/product/templates/engine/schemas/prd-v2.schema.json +300 -0
- package/.aios-core/product/templates/engine/schemas/prd.schema.json +152 -0
- package/.aios-core/product/templates/engine/schemas/story.schema.json +222 -0
- package/.aios-core/product/templates/engine/schemas/task.schema.json +154 -0
- package/.aios-core/product/templates/engine/validator.js +294 -0
- package/.aios-core/product/templates/epic.hbs +212 -0
- package/.aios-core/product/templates/eslintrc-security.json +32 -0
- package/.aios-core/product/templates/front-end-architecture-tmpl.yaml +206 -0
- package/.aios-core/product/templates/front-end-spec-tmpl.yaml +349 -0
- package/.aios-core/product/templates/fullstack-architecture-tmpl.yaml +805 -0
- package/.aios-core/product/templates/github-actions-cd.yml +212 -0
- package/.aios-core/product/templates/github-actions-ci.yml +172 -0
- package/.aios-core/product/templates/github-pr-template.md +67 -0
- package/.aios-core/product/templates/gordon-mcp.yaml +140 -0
- package/.aios-core/product/templates/ide-rules/antigravity-rules.md +115 -0
- package/.aios-core/product/templates/ide-rules/claude-rules.md +221 -0
- package/.aios-core/product/templates/ide-rules/cline-rules.md +84 -0
- package/.aios-core/product/templates/ide-rules/copilot-rules.md +92 -0
- package/.aios-core/product/templates/ide-rules/cursor-rules.md +115 -0
- package/.aios-core/product/templates/ide-rules/gemini-rules.md +85 -0
- package/.aios-core/product/templates/ide-rules/roo-rules.md +86 -0
- package/.aios-core/product/templates/ide-rules/trae-rules.md +104 -0
- package/.aios-core/product/templates/ide-rules/windsurf-rules.md +80 -0
- package/.aios-core/product/templates/index-strategy-tmpl.yaml +53 -0
- package/.aios-core/product/templates/market-research-tmpl.yaml +252 -0
- package/.aios-core/product/templates/mcp-workflow.js +271 -0
- package/.aios-core/product/templates/migration-plan-tmpl.yaml +1022 -0
- package/.aios-core/product/templates/migration-strategy-tmpl.md +524 -0
- package/.aios-core/product/templates/personalized-agent-template.md +258 -0
- package/.aios-core/product/templates/personalized-checklist-template.md +340 -0
- package/.aios-core/product/templates/personalized-task-template-v2.md +905 -0
- package/.aios-core/product/templates/personalized-task-template.md +344 -0
- package/.aios-core/product/templates/personalized-template-file.yaml +322 -0
- package/.aios-core/product/templates/personalized-workflow-template.yaml +460 -0
- package/.aios-core/product/templates/pmdr.hbs +186 -0
- package/.aios-core/product/templates/prd-tmpl.yaml +202 -0
- package/.aios-core/product/templates/prd-v2.0.hbs +216 -0
- package/.aios-core/product/templates/prd.hbs +201 -0
- package/.aios-core/product/templates/project-brief-tmpl.yaml +221 -0
- package/.aios-core/product/templates/qa-gate-tmpl.yaml +240 -0
- package/.aios-core/product/templates/rls-policies-tmpl.yaml +1203 -0
- package/.aios-core/product/templates/schema-design-tmpl.yaml +428 -0
- package/.aios-core/product/templates/shock-report-tmpl.html +502 -0
- package/.aios-core/product/templates/state-persistence-tmpl.yaml +219 -0
- package/.aios-core/product/templates/story-tmpl.yaml +332 -0
- package/.aios-core/product/templates/story.hbs +263 -0
- package/.aios-core/product/templates/task-execution-report.md +495 -0
- package/.aios-core/product/templates/task-template.md +123 -0
- package/.aios-core/product/templates/task.hbs +170 -0
- package/.aios-core/product/templates/tmpl-comment-on-examples.sql +158 -0
- package/.aios-core/product/templates/tmpl-migration-script.sql +91 -0
- package/.aios-core/product/templates/tmpl-rls-granular-policies.sql +104 -0
- package/.aios-core/product/templates/tmpl-rls-kiss-policy.sql +10 -0
- package/.aios-core/product/templates/tmpl-rls-roles.sql +135 -0
- package/.aios-core/product/templates/tmpl-rls-simple.sql +77 -0
- package/.aios-core/product/templates/tmpl-rls-tenant.sql +152 -0
- package/.aios-core/product/templates/tmpl-rollback-script.sql +77 -0
- package/.aios-core/product/templates/tmpl-seed-data.sql +140 -0
- package/.aios-core/product/templates/tmpl-smoke-test.sql +16 -0
- package/.aios-core/product/templates/tmpl-staging-copy-merge.sql +139 -0
- package/.aios-core/product/templates/tmpl-stored-proc.sql +140 -0
- package/.aios-core/product/templates/tmpl-trigger.sql +152 -0
- package/.aios-core/product/templates/tmpl-view-materialized.sql +133 -0
- package/.aios-core/product/templates/tmpl-view.sql +177 -0
- package/.aios-core/product/templates/token-exports-css-tmpl.css +240 -0
- package/.aios-core/product/templates/token-exports-tailwind-tmpl.js +395 -0
- package/.aios-core/product/templates/tokens-schema-tmpl.yaml +305 -0
- package/.aios-core/product/templates/workflow-template.yaml +134 -0
- package/.aios-core/quality/metrics-collector.js +572 -0
- package/.aios-core/quality/metrics-hook.js +260 -0
- package/.aios-core/quality/schemas/quality-metrics.schema.json +233 -0
- package/.aios-core/quality/seed-metrics.js +336 -0
- package/.aios-core/scripts/README.md +354 -0
- package/.aios-core/scripts/aios-doc-template.md +325 -0
- package/.aios-core/scripts/batch-migrate-phase1.ps1 +36 -0
- package/.aios-core/scripts/batch-migrate-phase2.ps1 +88 -0
- package/.aios-core/scripts/batch-migrate-phase3.ps1 +45 -0
- package/.aios-core/scripts/command-execution-hook.js +201 -0
- package/.aios-core/scripts/context-detector.js +226 -0
- package/.aios-core/scripts/elicitation-engine.js +385 -0
- package/.aios-core/scripts/elicitation-session-manager.js +300 -0
- package/.aios-core/scripts/migrate-framework-docs.sh +300 -0
- package/.aios-core/scripts/session-context-loader.js +286 -0
- package/.aios-core/scripts/test-template-system.js +941 -0
- package/.aios-core/scripts/validate-phase1.ps1 +35 -0
- package/.aios-core/scripts/workflow-management.md +69 -0
- package/.aios-core/tasks/find-component.md.legacy +391 -0
- package/.aios-core/tasks/generate-commit-message.md.legacy +426 -0
- package/.aios-core/tasks/generate-migration.md.legacy +382 -0
- package/.aios-core/tasks/rollback-modification.md.legacy +307 -0
- package/.aios-core/tasks/update-tests.md.legacy +283 -0
- package/.aios-core/user-guide.md +1413 -0
- package/.aios-core/working-in-the-brownfield.md +361 -0
- package/.claude/CLAUDE.md +221 -0
- package/LICENSE +48 -0
- package/README.md +703 -0
- package/bin/aios-init-old.js +532 -0
- package/bin/aios-init-v4.js +390 -0
- package/bin/aios-init.backup-v1.1.4.js +352 -0
- package/bin/aios-init.js +736 -0
- package/bin/aios-minimal.js +26 -0
- package/bin/aios.js +279 -0
- package/bin/migrate-pm-config.js +219 -0
- package/bin/modules/env-config.js +436 -0
- package/bin/modules/mcp-installer.js +383 -0
- package/bin/utils/install-errors.js +339 -0
- package/bin/utils/install-transaction.js +445 -0
- package/index.d.ts +19 -0
- package/index.esm.js +21 -0
- package/index.js +94 -0
- package/package.json +161 -0
- package/packages/installer/package.json +39 -0
- package/packages/installer/src/config/configure-environment.js +312 -0
- package/packages/installer/src/config/templates/core-config-template.js +183 -0
- package/packages/installer/src/config/templates/env-template.js +127 -0
- package/packages/installer/src/config/validation/config-validator.js +243 -0
- package/packages/installer/src/detection/detect-project-type.js +81 -0
- package/packages/installer/src/wizard/wizard.js +244 -0
- package/packages/installer/tests/integration/environment-configuration.test.js +328 -0
- package/packages/installer/tests/integration/wizard-detection.test.js +349 -0
- package/packages/installer/tests/unit/config-validator.test.js +315 -0
- package/packages/installer/tests/unit/detection/detect-project-type.test.js +401 -0
- package/packages/installer/tests/unit/env-template.test.js +185 -0
- package/src/config/ide-configs.js +189 -0
- package/src/installer/aios-core-installer.js +319 -0
- package/src/installer/dependency-installer.js +335 -0
- package/src/utils/aios-colors.js +234 -0
- package/src/wizard/feedback.js +218 -0
- package/src/wizard/ide-config-generator.js +488 -0
- package/src/wizard/ide-selector.js +84 -0
- package/src/wizard/index.js +589 -0
- package/src/wizard/questions.js +249 -0
- package/src/wizard/validation/index.js +120 -0
- package/src/wizard/validation/report-generator.js +269 -0
- package/src/wizard/validation/troubleshooting-system.js +346 -0
- package/src/wizard/validation/validators/config-validator.js +362 -0
- package/src/wizard/validation/validators/dependency-validator.js +333 -0
- package/src/wizard/validation/validators/file-structure-validator.js +181 -0
- package/src/wizard/validation/validators/mcp-health-checker.js +310 -0
- package/src/wizard/validators.js +274 -0
- package/templates/squad/LICENSE +21 -0
- package/templates/squad/README.md +37 -0
- package/templates/squad/agents/example-agent.yaml +36 -0
- package/templates/squad/package.json +19 -0
- package/templates/squad/squad.yaml +25 -0
- package/templates/squad/tasks/example-task.yaml +46 -0
- package/templates/squad/templates/example-template.md +24 -0
- package/templates/squad/tests/example-agent.test.js +53 -0
- package/templates/squad/workflows/example-workflow.yaml +54 -0
- package/tools/package-builder.js +35 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
-- Simple RLS Policy Template
|
|
2
|
+
-- Table: :table_name
|
|
3
|
+
-- Security Model: Simple owner-based access
|
|
4
|
+
-- Created: :created_date
|
|
5
|
+
--
|
|
6
|
+
-- This template creates a simple RLS policy where users can only
|
|
7
|
+
-- access rows they own (based on user_id column)
|
|
8
|
+
|
|
9
|
+
-- Enable RLS on table
|
|
10
|
+
ALTER TABLE :table_name ENABLE ROW LEVEL SECURITY;
|
|
11
|
+
|
|
12
|
+
-- =============================================================================
|
|
13
|
+
-- SIMPLE OWNER-BASED POLICY
|
|
14
|
+
-- =============================================================================
|
|
15
|
+
|
|
16
|
+
-- Drop existing policies if re-running
|
|
17
|
+
DROP POLICY IF EXISTS ":table_name_owner_policy" ON :table_name;
|
|
18
|
+
|
|
19
|
+
-- Single policy for all operations (SELECT, INSERT, UPDATE, DELETE)
|
|
20
|
+
-- Users can only access rows where user_id matches their auth.uid()
|
|
21
|
+
CREATE POLICY ":table_name_owner_policy"
|
|
22
|
+
ON :table_name
|
|
23
|
+
FOR ALL
|
|
24
|
+
TO authenticated
|
|
25
|
+
USING (auth.uid() = user_id)
|
|
26
|
+
WITH CHECK (auth.uid() = user_id);
|
|
27
|
+
|
|
28
|
+
-- =============================================================================
|
|
29
|
+
-- OPTIONAL: Allow service role to bypass RLS
|
|
30
|
+
-- =============================================================================
|
|
31
|
+
-- Note: This is enabled by default in Supabase
|
|
32
|
+
-- The service_role can access all rows regardless of RLS policies
|
|
33
|
+
-- Be careful with service_role key exposure
|
|
34
|
+
|
|
35
|
+
-- =============================================================================
|
|
36
|
+
-- OPTIONAL: Public read access (if needed)
|
|
37
|
+
-- =============================================================================
|
|
38
|
+
-- Uncomment if you want anonymous users to read data
|
|
39
|
+
--
|
|
40
|
+
-- DROP POLICY IF EXISTS ":table_name_public_read" ON :table_name;
|
|
41
|
+
-- CREATE POLICY ":table_name_public_read"
|
|
42
|
+
-- ON :table_name
|
|
43
|
+
-- FOR SELECT
|
|
44
|
+
-- TO anon
|
|
45
|
+
-- USING (is_public = true);
|
|
46
|
+
|
|
47
|
+
-- =============================================================================
|
|
48
|
+
-- VERIFICATION
|
|
49
|
+
-- =============================================================================
|
|
50
|
+
-- Test the policy:
|
|
51
|
+
--
|
|
52
|
+
-- 1. As authenticated user (should see only their rows):
|
|
53
|
+
-- SET LOCAL ROLE authenticated;
|
|
54
|
+
-- SET LOCAL request.jwt.claims = '{"sub": "user-uuid-here"}';
|
|
55
|
+
-- SELECT * FROM :table_name;
|
|
56
|
+
--
|
|
57
|
+
-- 2. As service role (should see all rows):
|
|
58
|
+
-- SET LOCAL ROLE service_role;
|
|
59
|
+
-- SELECT * FROM :table_name;
|
|
60
|
+
--
|
|
61
|
+
-- 3. As anonymous (should see nothing unless public_read enabled):
|
|
62
|
+
-- SET LOCAL ROLE anon;
|
|
63
|
+
-- SELECT * FROM :table_name;
|
|
64
|
+
|
|
65
|
+
-- =============================================================================
|
|
66
|
+
-- TABLE REQUIREMENTS
|
|
67
|
+
-- =============================================================================
|
|
68
|
+
-- This template assumes :table_name has a user_id column:
|
|
69
|
+
--
|
|
70
|
+
-- CREATE TABLE :table_name (
|
|
71
|
+
-- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
72
|
+
-- user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
73
|
+
-- -- other columns...
|
|
74
|
+
-- created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
75
|
+
-- );
|
|
76
|
+
--
|
|
77
|
+
-- CREATE INDEX idx_:table_name_user_id ON :table_name(user_id);
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
-- Multi-Tenant RLS Policy Template
|
|
2
|
+
-- Table: :table_name
|
|
3
|
+
-- Security Model: Tenant isolation with user permissions
|
|
4
|
+
-- Created: :created_date
|
|
5
|
+
--
|
|
6
|
+
-- This template creates RLS policies for multi-tenant applications
|
|
7
|
+
-- where data is isolated by organization/tenant
|
|
8
|
+
|
|
9
|
+
-- =============================================================================
|
|
10
|
+
-- PREREQUISITES: Tenant Infrastructure
|
|
11
|
+
-- =============================================================================
|
|
12
|
+
|
|
13
|
+
-- Tenants/Organizations table (if not exists)
|
|
14
|
+
CREATE TABLE IF NOT EXISTS tenants (
|
|
15
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
16
|
+
name TEXT NOT NULL,
|
|
17
|
+
slug TEXT UNIQUE NOT NULL,
|
|
18
|
+
settings JSONB DEFAULT '{}'::JSONB,
|
|
19
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
20
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
-- Tenant memberships (which users belong to which tenants)
|
|
24
|
+
CREATE TABLE IF NOT EXISTS tenant_members (
|
|
25
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
26
|
+
tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
|
27
|
+
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
28
|
+
role TEXT NOT NULL DEFAULT 'member' CHECK (role IN ('owner', 'admin', 'member', 'viewer')),
|
|
29
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
30
|
+
|
|
31
|
+
UNIQUE(tenant_id, user_id)
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_tenant_members_user ON tenant_members(user_id);
|
|
35
|
+
CREATE INDEX IF NOT EXISTS idx_tenant_members_tenant ON tenant_members(tenant_id);
|
|
36
|
+
|
|
37
|
+
-- =============================================================================
|
|
38
|
+
-- HELPER FUNCTIONS
|
|
39
|
+
-- =============================================================================
|
|
40
|
+
|
|
41
|
+
-- Get current user's tenant IDs
|
|
42
|
+
CREATE OR REPLACE FUNCTION get_user_tenant_ids()
|
|
43
|
+
RETURNS UUID[] AS $$
|
|
44
|
+
BEGIN
|
|
45
|
+
RETURN ARRAY(
|
|
46
|
+
SELECT tenant_id
|
|
47
|
+
FROM tenant_members
|
|
48
|
+
WHERE user_id = auth.uid()
|
|
49
|
+
);
|
|
50
|
+
END;
|
|
51
|
+
$$ LANGUAGE plpgsql SECURITY DEFINER STABLE;
|
|
52
|
+
|
|
53
|
+
-- Check if user is member of tenant
|
|
54
|
+
CREATE OR REPLACE FUNCTION is_tenant_member(check_tenant_id UUID)
|
|
55
|
+
RETURNS BOOLEAN AS $$
|
|
56
|
+
BEGIN
|
|
57
|
+
RETURN EXISTS (
|
|
58
|
+
SELECT 1
|
|
59
|
+
FROM tenant_members
|
|
60
|
+
WHERE tenant_id = check_tenant_id
|
|
61
|
+
AND user_id = auth.uid()
|
|
62
|
+
);
|
|
63
|
+
END;
|
|
64
|
+
$$ LANGUAGE plpgsql SECURITY DEFINER STABLE;
|
|
65
|
+
|
|
66
|
+
-- Check user's role in tenant
|
|
67
|
+
CREATE OR REPLACE FUNCTION get_tenant_role(check_tenant_id UUID)
|
|
68
|
+
RETURNS TEXT AS $$
|
|
69
|
+
BEGIN
|
|
70
|
+
RETURN (
|
|
71
|
+
SELECT role
|
|
72
|
+
FROM tenant_members
|
|
73
|
+
WHERE tenant_id = check_tenant_id
|
|
74
|
+
AND user_id = auth.uid()
|
|
75
|
+
);
|
|
76
|
+
END;
|
|
77
|
+
$$ LANGUAGE plpgsql SECURITY DEFINER STABLE;
|
|
78
|
+
|
|
79
|
+
-- =============================================================================
|
|
80
|
+
-- TABLE WITH TENANT COLUMN
|
|
81
|
+
-- =============================================================================
|
|
82
|
+
-- Your table should have a tenant_id column:
|
|
83
|
+
--
|
|
84
|
+
-- ALTER TABLE :table_name ADD COLUMN IF NOT EXISTS tenant_id UUID REFERENCES tenants(id);
|
|
85
|
+
-- CREATE INDEX IF NOT EXISTS idx_:table_name_tenant ON :table_name(tenant_id);
|
|
86
|
+
|
|
87
|
+
-- =============================================================================
|
|
88
|
+
-- RLS POLICIES FOR TENANT ISOLATION
|
|
89
|
+
-- =============================================================================
|
|
90
|
+
|
|
91
|
+
ALTER TABLE :table_name ENABLE ROW LEVEL SECURITY;
|
|
92
|
+
|
|
93
|
+
-- SELECT: Users can only see rows from their tenants
|
|
94
|
+
DROP POLICY IF EXISTS ":table_name_tenant_select" ON :table_name;
|
|
95
|
+
CREATE POLICY ":table_name_tenant_select"
|
|
96
|
+
ON :table_name
|
|
97
|
+
FOR SELECT
|
|
98
|
+
TO authenticated
|
|
99
|
+
USING (
|
|
100
|
+
tenant_id = ANY(get_user_tenant_ids())
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
-- INSERT: Users can only insert into tenants they belong to
|
|
104
|
+
DROP POLICY IF EXISTS ":table_name_tenant_insert" ON :table_name;
|
|
105
|
+
CREATE POLICY ":table_name_tenant_insert"
|
|
106
|
+
ON :table_name
|
|
107
|
+
FOR INSERT
|
|
108
|
+
TO authenticated
|
|
109
|
+
WITH CHECK (
|
|
110
|
+
is_tenant_member(tenant_id)
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
-- UPDATE: Only admins/owners can update
|
|
114
|
+
DROP POLICY IF EXISTS ":table_name_tenant_update" ON :table_name;
|
|
115
|
+
CREATE POLICY ":table_name_tenant_update"
|
|
116
|
+
ON :table_name
|
|
117
|
+
FOR UPDATE
|
|
118
|
+
TO authenticated
|
|
119
|
+
USING (
|
|
120
|
+
tenant_id = ANY(get_user_tenant_ids())
|
|
121
|
+
AND get_tenant_role(tenant_id) IN ('owner', 'admin')
|
|
122
|
+
)
|
|
123
|
+
WITH CHECK (
|
|
124
|
+
tenant_id = ANY(get_user_tenant_ids())
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
-- DELETE: Only owners can delete
|
|
128
|
+
DROP POLICY IF EXISTS ":table_name_tenant_delete" ON :table_name;
|
|
129
|
+
CREATE POLICY ":table_name_tenant_delete"
|
|
130
|
+
ON :table_name
|
|
131
|
+
FOR DELETE
|
|
132
|
+
TO authenticated
|
|
133
|
+
USING (
|
|
134
|
+
get_tenant_role(tenant_id) = 'owner'
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
-- =============================================================================
|
|
138
|
+
-- RLS ON TENANT TABLES THEMSELVES
|
|
139
|
+
-- =============================================================================
|
|
140
|
+
|
|
141
|
+
ALTER TABLE tenants ENABLE ROW LEVEL SECURITY;
|
|
142
|
+
ALTER TABLE tenant_members ENABLE ROW LEVEL SECURITY;
|
|
143
|
+
|
|
144
|
+
-- Tenants: Members can see their tenants
|
|
145
|
+
CREATE POLICY "tenants_member_select" ON tenants
|
|
146
|
+
FOR SELECT TO authenticated
|
|
147
|
+
USING (id = ANY(get_user_tenant_ids()));
|
|
148
|
+
|
|
149
|
+
-- Tenant members: Members can see their tenant's members
|
|
150
|
+
CREATE POLICY "tenant_members_select" ON tenant_members
|
|
151
|
+
FOR SELECT TO authenticated
|
|
152
|
+
USING (tenant_id = ANY(get_user_tenant_ids()));
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
-- Rollback Script Template
|
|
2
|
+
-- Rollback for Migration: :migration_name
|
|
3
|
+
-- Created: :created_date
|
|
4
|
+
-- Author: :author
|
|
5
|
+
-- Description: Reverses the changes made by :migration_name
|
|
6
|
+
--
|
|
7
|
+
-- IMPORTANT: Test this rollback in development before using in production
|
|
8
|
+
-- WARNING: Data migrations may not be fully reversible
|
|
9
|
+
|
|
10
|
+
BEGIN;
|
|
11
|
+
|
|
12
|
+
-- =============================================================================
|
|
13
|
+
-- PRE-ROLLBACK VERIFICATION
|
|
14
|
+
-- =============================================================================
|
|
15
|
+
|
|
16
|
+
DO $$
|
|
17
|
+
BEGIN
|
|
18
|
+
-- Verify we're rolling back the correct migration
|
|
19
|
+
RAISE NOTICE 'Starting rollback of migration: :migration_name';
|
|
20
|
+
|
|
21
|
+
-- Add any safety checks here
|
|
22
|
+
-- Example: Check if dependent objects exist
|
|
23
|
+
END $$;
|
|
24
|
+
|
|
25
|
+
-- =============================================================================
|
|
26
|
+
-- REVERSE DATA MIGRATION (if applicable)
|
|
27
|
+
-- =============================================================================
|
|
28
|
+
|
|
29
|
+
-- If data was migrated, restore from backup or reverse transformation
|
|
30
|
+
-- WARNING: This may result in data loss if no backup exists
|
|
31
|
+
-- INSERT INTO :old_table (old_col1, old_col2)
|
|
32
|
+
-- SELECT col1, col2 FROM :new_table;
|
|
33
|
+
|
|
34
|
+
-- =============================================================================
|
|
35
|
+
-- REVERSE SCHEMA CHANGES
|
|
36
|
+
-- =============================================================================
|
|
37
|
+
|
|
38
|
+
-- Remove triggers
|
|
39
|
+
DROP TRIGGER IF EXISTS trigger_update_:table_name_updated_at ON :table_name;
|
|
40
|
+
|
|
41
|
+
-- Remove indexes
|
|
42
|
+
-- DROP INDEX IF EXISTS idx_:table_:column;
|
|
43
|
+
|
|
44
|
+
-- Remove columns from existing tables
|
|
45
|
+
-- ALTER TABLE :existing_table DROP COLUMN IF EXISTS :new_column;
|
|
46
|
+
|
|
47
|
+
-- Drop tables (DANGEROUS - ensure data is backed up)
|
|
48
|
+
-- DROP TABLE IF EXISTS :table_name CASCADE;
|
|
49
|
+
|
|
50
|
+
-- =============================================================================
|
|
51
|
+
-- POST-ROLLBACK VERIFICATION
|
|
52
|
+
-- =============================================================================
|
|
53
|
+
|
|
54
|
+
DO $$
|
|
55
|
+
BEGIN
|
|
56
|
+
-- Verify rollback was successful
|
|
57
|
+
-- Example: Verify table no longer exists
|
|
58
|
+
-- ASSERT NOT (SELECT EXISTS (
|
|
59
|
+
-- SELECT 1 FROM information_schema.tables
|
|
60
|
+
-- WHERE table_name = ':table_name'
|
|
61
|
+
-- )), 'Table :table_name still exists after rollback';
|
|
62
|
+
|
|
63
|
+
RAISE NOTICE 'Rollback completed successfully';
|
|
64
|
+
END $$;
|
|
65
|
+
|
|
66
|
+
COMMIT;
|
|
67
|
+
|
|
68
|
+
-- =============================================================================
|
|
69
|
+
-- POST-ROLLBACK NOTES
|
|
70
|
+
-- =============================================================================
|
|
71
|
+
--
|
|
72
|
+
-- After running this rollback:
|
|
73
|
+
-- 1. Verify application still functions correctly
|
|
74
|
+
-- 2. Check for any orphaned data
|
|
75
|
+
-- 3. Update migration tracking if applicable
|
|
76
|
+
-- 4. Document reason for rollback
|
|
77
|
+
--
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
-- Seed Data Template
|
|
2
|
+
-- Purpose: Idempotent seed data for development and testing
|
|
3
|
+
-- Created: :created_date
|
|
4
|
+
-- Author: :author
|
|
5
|
+
--
|
|
6
|
+
-- IMPORTANT: All seed operations should be idempotent (safe to run multiple times)
|
|
7
|
+
|
|
8
|
+
-- =============================================================================
|
|
9
|
+
-- SEED CONFIGURATION
|
|
10
|
+
-- =============================================================================
|
|
11
|
+
|
|
12
|
+
-- Disable triggers during seeding (optional, speeds up bulk insert)
|
|
13
|
+
-- SET session_replication_role = replica;
|
|
14
|
+
|
|
15
|
+
BEGIN;
|
|
16
|
+
|
|
17
|
+
-- =============================================================================
|
|
18
|
+
-- SEED: REFERENCE DATA (Lookup tables, static data)
|
|
19
|
+
-- =============================================================================
|
|
20
|
+
|
|
21
|
+
-- Example: Status types
|
|
22
|
+
INSERT INTO status_types (id, name, description, sort_order)
|
|
23
|
+
VALUES
|
|
24
|
+
('11111111-1111-1111-1111-111111111001', 'draft', 'Initial draft state', 1),
|
|
25
|
+
('11111111-1111-1111-1111-111111111002', 'pending', 'Awaiting action', 2),
|
|
26
|
+
('11111111-1111-1111-1111-111111111003', 'active', 'Currently active', 3),
|
|
27
|
+
('11111111-1111-1111-1111-111111111004', 'completed', 'Work completed', 4),
|
|
28
|
+
('11111111-1111-1111-1111-111111111005', 'archived', 'No longer active', 5)
|
|
29
|
+
ON CONFLICT (id) DO UPDATE SET
|
|
30
|
+
name = EXCLUDED.name,
|
|
31
|
+
description = EXCLUDED.description,
|
|
32
|
+
sort_order = EXCLUDED.sort_order;
|
|
33
|
+
|
|
34
|
+
-- Example: Categories
|
|
35
|
+
INSERT INTO categories (id, name, slug, parent_id)
|
|
36
|
+
VALUES
|
|
37
|
+
('22222222-2222-2222-2222-222222222001', 'General', 'general', NULL),
|
|
38
|
+
('22222222-2222-2222-2222-222222222002', 'Development', 'development', NULL),
|
|
39
|
+
('22222222-2222-2222-2222-222222222003', 'Frontend', 'frontend', '22222222-2222-2222-2222-222222222002'),
|
|
40
|
+
('22222222-2222-2222-2222-222222222004', 'Backend', 'backend', '22222222-2222-2222-2222-222222222002')
|
|
41
|
+
ON CONFLICT (id) DO UPDATE SET
|
|
42
|
+
name = EXCLUDED.name,
|
|
43
|
+
slug = EXCLUDED.slug,
|
|
44
|
+
parent_id = EXCLUDED.parent_id;
|
|
45
|
+
|
|
46
|
+
-- =============================================================================
|
|
47
|
+
-- SEED: ROLES AND PERMISSIONS
|
|
48
|
+
-- =============================================================================
|
|
49
|
+
|
|
50
|
+
INSERT INTO roles (id, name, description, permissions)
|
|
51
|
+
VALUES
|
|
52
|
+
('33333333-3333-3333-3333-333333333001', 'admin', 'Full system access', '["*"]'::JSONB),
|
|
53
|
+
('33333333-3333-3333-3333-333333333002', 'editor', 'Can edit content', '["read", "write", "update"]'::JSONB),
|
|
54
|
+
('33333333-3333-3333-3333-333333333003', 'viewer', 'Read-only access', '["read"]'::JSONB)
|
|
55
|
+
ON CONFLICT (id) DO UPDATE SET
|
|
56
|
+
description = EXCLUDED.description,
|
|
57
|
+
permissions = EXCLUDED.permissions;
|
|
58
|
+
|
|
59
|
+
-- =============================================================================
|
|
60
|
+
-- SEED: TEST USERS (Development only!)
|
|
61
|
+
-- =============================================================================
|
|
62
|
+
|
|
63
|
+
-- NOTE: Only run in development environment
|
|
64
|
+
-- These are fake users for testing - DO NOT use in production
|
|
65
|
+
|
|
66
|
+
-- Check environment before inserting test data
|
|
67
|
+
DO $$
|
|
68
|
+
BEGIN
|
|
69
|
+
-- Only seed test users if this appears to be a dev environment
|
|
70
|
+
IF current_database() LIKE '%dev%' OR current_database() LIKE '%test%' THEN
|
|
71
|
+
-- Test Admin User
|
|
72
|
+
INSERT INTO auth.users (
|
|
73
|
+
id,
|
|
74
|
+
email,
|
|
75
|
+
encrypted_password,
|
|
76
|
+
email_confirmed_at,
|
|
77
|
+
raw_user_meta_data
|
|
78
|
+
) VALUES (
|
|
79
|
+
'00000000-0000-0000-0000-000000000001',
|
|
80
|
+
'admin@test.local',
|
|
81
|
+
crypt('testpassword123', gen_salt('bf')),
|
|
82
|
+
NOW(),
|
|
83
|
+
'{"full_name": "Test Admin"}'::JSONB
|
|
84
|
+
) ON CONFLICT (id) DO NOTHING;
|
|
85
|
+
|
|
86
|
+
-- Test Regular User
|
|
87
|
+
INSERT INTO auth.users (
|
|
88
|
+
id,
|
|
89
|
+
email,
|
|
90
|
+
encrypted_password,
|
|
91
|
+
email_confirmed_at,
|
|
92
|
+
raw_user_meta_data
|
|
93
|
+
) VALUES (
|
|
94
|
+
'00000000-0000-0000-0000-000000000002',
|
|
95
|
+
'user@test.local',
|
|
96
|
+
crypt('testpassword123', gen_salt('bf')),
|
|
97
|
+
NOW(),
|
|
98
|
+
'{"full_name": "Test User"}'::JSONB
|
|
99
|
+
) ON CONFLICT (id) DO NOTHING;
|
|
100
|
+
|
|
101
|
+
RAISE NOTICE 'Test users seeded successfully';
|
|
102
|
+
ELSE
|
|
103
|
+
RAISE NOTICE 'Skipping test user seeding - not a dev/test environment';
|
|
104
|
+
END IF;
|
|
105
|
+
END $$;
|
|
106
|
+
|
|
107
|
+
-- =============================================================================
|
|
108
|
+
-- SEED: SAMPLE DATA (Development only!)
|
|
109
|
+
-- =============================================================================
|
|
110
|
+
|
|
111
|
+
-- Example: Sample projects for testing
|
|
112
|
+
INSERT INTO :table_name (id, name, description, user_id, status, created_at)
|
|
113
|
+
VALUES
|
|
114
|
+
('44444444-4444-4444-4444-444444444001', 'Sample Project 1', 'First sample project for testing', '00000000-0000-0000-0000-000000000001', 'active', NOW()),
|
|
115
|
+
('44444444-4444-4444-4444-444444444002', 'Sample Project 2', 'Second sample project for testing', '00000000-0000-0000-0000-000000000002', 'draft', NOW())
|
|
116
|
+
ON CONFLICT (id) DO UPDATE SET
|
|
117
|
+
name = EXCLUDED.name,
|
|
118
|
+
description = EXCLUDED.description,
|
|
119
|
+
updated_at = NOW();
|
|
120
|
+
|
|
121
|
+
COMMIT;
|
|
122
|
+
|
|
123
|
+
-- =============================================================================
|
|
124
|
+
-- RE-ENABLE TRIGGERS
|
|
125
|
+
-- =============================================================================
|
|
126
|
+
|
|
127
|
+
-- SET session_replication_role = DEFAULT;
|
|
128
|
+
|
|
129
|
+
-- =============================================================================
|
|
130
|
+
-- VERIFICATION
|
|
131
|
+
-- =============================================================================
|
|
132
|
+
|
|
133
|
+
SELECT
|
|
134
|
+
'status_types' as table_name,
|
|
135
|
+
COUNT(*) as row_count
|
|
136
|
+
FROM status_types
|
|
137
|
+
UNION ALL
|
|
138
|
+
SELECT 'categories', COUNT(*) FROM categories
|
|
139
|
+
UNION ALL
|
|
140
|
+
SELECT 'roles', COUNT(*) FROM roles;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
-- Basic post-migration checks (fill placeholders)
|
|
2
|
+
SET client_min_messages = warning;
|
|
3
|
+
|
|
4
|
+
-- Count tables/policies/functions expected
|
|
5
|
+
SELECT COUNT(*) AS tables FROM information_schema.tables WHERE table_schema='public';
|
|
6
|
+
SELECT COUNT(*) AS policies FROM pg_policies WHERE schemaname='public';
|
|
7
|
+
SELECT proname FROM pg_proc WHERE pronamespace = 'public'::regnamespace
|
|
8
|
+
AND proname IN ('current_mind_id','provision_user_profile','set_fragment_mind_id');
|
|
9
|
+
|
|
10
|
+
-- Sanity queries (examples)
|
|
11
|
+
-- SELECT * FROM categories LIMIT 5;
|
|
12
|
+
-- SELECT * FROM minds LIMIT 5;
|
|
13
|
+
|
|
14
|
+
-- RLS sanity (should not error even if it returns 0)
|
|
15
|
+
-- SET LOCAL request.jwt.claims = '{"sub":"<user-uuid>","role":"authenticated"}';
|
|
16
|
+
-- SELECT 1 FROM fragments WHERE false;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
-- Staging Copy Merge Template
|
|
2
|
+
-- Purpose: Safely load external data through staging table and merge to target
|
|
3
|
+
-- Created: :created_date
|
|
4
|
+
-- Author: :author
|
|
5
|
+
--
|
|
6
|
+
-- This pattern prevents data corruption by validating in staging before merge
|
|
7
|
+
|
|
8
|
+
-- =============================================================================
|
|
9
|
+
-- STEP 1: CREATE STAGING TABLE (temporary)
|
|
10
|
+
-- =============================================================================
|
|
11
|
+
|
|
12
|
+
-- Create staging table mirroring target structure
|
|
13
|
+
CREATE TEMP TABLE IF NOT EXISTS :staging_table (
|
|
14
|
+
-- Match target table columns
|
|
15
|
+
id UUID,
|
|
16
|
+
:column1 :type1,
|
|
17
|
+
:column2 :type2,
|
|
18
|
+
-- Metadata for import tracking
|
|
19
|
+
_row_number INTEGER,
|
|
20
|
+
_import_status TEXT DEFAULT 'pending',
|
|
21
|
+
_import_error TEXT
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
-- =============================================================================
|
|
25
|
+
-- STEP 2: COPY DATA TO STAGING
|
|
26
|
+
-- =============================================================================
|
|
27
|
+
|
|
28
|
+
-- Option A: From CSV file
|
|
29
|
+
-- COPY :staging_table (id, :column1, :column2)
|
|
30
|
+
-- FROM '/path/to/file.csv'
|
|
31
|
+
-- WITH (FORMAT csv, HEADER true);
|
|
32
|
+
|
|
33
|
+
-- Option B: From STDIN (programmatic)
|
|
34
|
+
-- COPY :staging_table (id, :column1, :column2) FROM STDIN;
|
|
35
|
+
|
|
36
|
+
-- Option C: Insert from another query
|
|
37
|
+
-- INSERT INTO :staging_table (id, :column1, :column2)
|
|
38
|
+
-- SELECT id, col1, col2 FROM external_source;
|
|
39
|
+
|
|
40
|
+
-- =============================================================================
|
|
41
|
+
-- STEP 3: VALIDATE STAGING DATA
|
|
42
|
+
-- =============================================================================
|
|
43
|
+
|
|
44
|
+
-- Mark rows with validation errors
|
|
45
|
+
UPDATE :staging_table
|
|
46
|
+
SET
|
|
47
|
+
_import_status = 'error',
|
|
48
|
+
_import_error = 'Missing required field'
|
|
49
|
+
WHERE :column1 IS NULL;
|
|
50
|
+
|
|
51
|
+
-- Check for duplicates
|
|
52
|
+
UPDATE :staging_table s
|
|
53
|
+
SET
|
|
54
|
+
_import_status = 'duplicate',
|
|
55
|
+
_import_error = 'Duplicate ID found'
|
|
56
|
+
WHERE EXISTS (
|
|
57
|
+
SELECT 1 FROM :staging_table s2
|
|
58
|
+
WHERE s2.id = s.id
|
|
59
|
+
AND s2._row_number < s._row_number
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
-- Check for existing records (will update instead of insert)
|
|
63
|
+
UPDATE :staging_table s
|
|
64
|
+
SET _import_status = 'update'
|
|
65
|
+
WHERE EXISTS (
|
|
66
|
+
SELECT 1 FROM :target_table t
|
|
67
|
+
WHERE t.id = s.id
|
|
68
|
+
)
|
|
69
|
+
AND s._import_status = 'pending';
|
|
70
|
+
|
|
71
|
+
-- Mark remaining as new inserts
|
|
72
|
+
UPDATE :staging_table
|
|
73
|
+
SET _import_status = 'insert'
|
|
74
|
+
WHERE _import_status = 'pending';
|
|
75
|
+
|
|
76
|
+
-- =============================================================================
|
|
77
|
+
-- STEP 4: REPORT VALIDATION RESULTS
|
|
78
|
+
-- =============================================================================
|
|
79
|
+
|
|
80
|
+
-- Get summary of staging data
|
|
81
|
+
SELECT
|
|
82
|
+
_import_status,
|
|
83
|
+
COUNT(*) as count,
|
|
84
|
+
STRING_AGG(DISTINCT _import_error, ', ') as errors
|
|
85
|
+
FROM :staging_table
|
|
86
|
+
GROUP BY _import_status
|
|
87
|
+
ORDER BY _import_status;
|
|
88
|
+
|
|
89
|
+
-- =============================================================================
|
|
90
|
+
-- STEP 5: MERGE TO TARGET (UPSERT)
|
|
91
|
+
-- =============================================================================
|
|
92
|
+
|
|
93
|
+
BEGIN;
|
|
94
|
+
|
|
95
|
+
-- Insert new records
|
|
96
|
+
INSERT INTO :target_table (id, :column1, :column2, created_at)
|
|
97
|
+
SELECT id, :column1, :column2, NOW()
|
|
98
|
+
FROM :staging_table
|
|
99
|
+
WHERE _import_status = 'insert';
|
|
100
|
+
|
|
101
|
+
-- Update existing records
|
|
102
|
+
UPDATE :target_table t
|
|
103
|
+
SET
|
|
104
|
+
:column1 = s.:column1,
|
|
105
|
+
:column2 = s.:column2,
|
|
106
|
+
updated_at = NOW()
|
|
107
|
+
FROM :staging_table s
|
|
108
|
+
WHERE t.id = s.id
|
|
109
|
+
AND s._import_status = 'update';
|
|
110
|
+
|
|
111
|
+
COMMIT;
|
|
112
|
+
|
|
113
|
+
-- =============================================================================
|
|
114
|
+
-- STEP 6: VERIFY AND CLEANUP
|
|
115
|
+
-- =============================================================================
|
|
116
|
+
|
|
117
|
+
-- Verify merge results
|
|
118
|
+
SELECT
|
|
119
|
+
'inserted' as operation,
|
|
120
|
+
COUNT(*) as count
|
|
121
|
+
FROM :staging_table WHERE _import_status = 'insert'
|
|
122
|
+
UNION ALL
|
|
123
|
+
SELECT
|
|
124
|
+
'updated' as operation,
|
|
125
|
+
COUNT(*) as count
|
|
126
|
+
FROM :staging_table WHERE _import_status = 'update'
|
|
127
|
+
UNION ALL
|
|
128
|
+
SELECT
|
|
129
|
+
'errors' as operation,
|
|
130
|
+
COUNT(*) as count
|
|
131
|
+
FROM :staging_table WHERE _import_status = 'error';
|
|
132
|
+
|
|
133
|
+
-- Get error details for review
|
|
134
|
+
SELECT id, :column1, _import_error
|
|
135
|
+
FROM :staging_table
|
|
136
|
+
WHERE _import_status = 'error';
|
|
137
|
+
|
|
138
|
+
-- Drop staging table (automatic for TEMP, but explicit is clearer)
|
|
139
|
+
DROP TABLE IF EXISTS :staging_table;
|