proagents 1.0.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/README.md +170 -0
- package/bin/proagents.js +90 -0
- package/lib/commands/feature.js +125 -0
- package/lib/commands/fix.js +60 -0
- package/lib/commands/help.js +76 -0
- package/lib/commands/init.js +64 -0
- package/lib/commands/status.js +91 -0
- package/lib/index.js +28 -0
- package/package.json +52 -0
- package/proagents/.learning/global/common-patterns.json +77 -0
- package/proagents/.learning/global/user-preferences.json +76 -0
- package/proagents/.learning/projects/example-project/corrections.json +99 -0
- package/proagents/.learning/projects/example-project/feedback.json +109 -0
- package/proagents/.learning/projects/example-project/metrics.json +101 -0
- package/proagents/.learning/projects/example-project/patterns.json +102 -0
- package/proagents/.learning/schemas/README.md +48 -0
- package/proagents/.learning/schemas/corrections-schema.json +100 -0
- package/proagents/.learning/schemas/feedback-schema.json +144 -0
- package/proagents/.learning/schemas/metrics-schema.json +96 -0
- package/proagents/.learning/schemas/patterns-schema.json +82 -0
- package/proagents/.learning/schemas/project-patterns-schema.json +125 -0
- package/proagents/.learning/schemas/user-preferences-schema.json +136 -0
- package/proagents/GETTING-STARTED-STORY.md +708 -0
- package/proagents/README.md +99 -0
- package/proagents/WORKFLOW.md +1234 -0
- package/proagents/active-features/.gitkeep +0 -0
- package/proagents/active-features/README.md +176 -0
- package/proagents/active-features/_index.json +74 -0
- package/proagents/active-features/feature-user-auth/dependencies.json +81 -0
- package/proagents/active-features/feature-user-auth/files-modified.json +126 -0
- package/proagents/active-features/feature-user-auth/status.json +122 -0
- package/proagents/active-features/schemas/dependencies-schema.json +119 -0
- package/proagents/active-features/schemas/feature-schema.json +132 -0
- package/proagents/active-features/schemas/files-schema.json +100 -0
- package/proagents/active-features/schemas/index-schema.json +95 -0
- package/proagents/adr/README.md +302 -0
- package/proagents/adr/examples/api-versioning.md +297 -0
- package/proagents/adr/examples/database-choice.md +264 -0
- package/proagents/adr/template.md +273 -0
- package/proagents/ai-models/README.md +141 -0
- package/proagents/ai-models/cost-management.md +362 -0
- package/proagents/ai-models/fallbacks.md +342 -0
- package/proagents/ai-models/model-config.md +318 -0
- package/proagents/ai-models/task-routing.md +503 -0
- package/proagents/ai-training/README.md +155 -0
- package/proagents/ai-training/continuous-learning.md +413 -0
- package/proagents/ai-training/domain-knowledge.md +378 -0
- package/proagents/ai-training/pattern-learning.md +455 -0
- package/proagents/ai-training/training-data.md +337 -0
- package/proagents/ai-training/user-preferences.md +346 -0
- package/proagents/api-versioning/README.md +257 -0
- package/proagents/api-versioning/changelog-template.md +225 -0
- package/proagents/api-versioning/deprecation-workflow.md +470 -0
- package/proagents/api-versioning/versioning-strategy.md +291 -0
- package/proagents/approval-workflows/README.md +146 -0
- package/proagents/approval-workflows/approval-config.md +332 -0
- package/proagents/approval-workflows/approval-stages.md +503 -0
- package/proagents/approval-workflows/emergency-bypass.md +351 -0
- package/proagents/approval-workflows/examples.md +859 -0
- package/proagents/approval-workflows/notifications.md +320 -0
- package/proagents/automation/README.md +38 -0
- package/proagents/automation/ai-behavior-rules.md +339 -0
- package/proagents/automation/ai-prompt-injection.md +331 -0
- package/proagents/automation/auto-decisions.md +535 -0
- package/proagents/automation/decision-defaults.yaml +317 -0
- package/proagents/cache/README.md +110 -0
- package/proagents/cache/analysis-metadata.json +76 -0
- package/proagents/cache/conventions.json +125 -0
- package/proagents/cache/dependencies.json +85 -0
- package/proagents/cache/features.json +115 -0
- package/proagents/cache/patterns.json +105 -0
- package/proagents/cache/schemas/conventions-schema.json +138 -0
- package/proagents/cache/schemas/dependencies-schema.json +95 -0
- package/proagents/cache/schemas/features-schema.json +104 -0
- package/proagents/cache/schemas/metadata-schema.json +83 -0
- package/proagents/cache/schemas/patterns-schema.json +136 -0
- package/proagents/cache/schemas/structure-schema.json +72 -0
- package/proagents/cache/structure.json +109 -0
- package/proagents/changelog/2024/01/2024-01-10-api-url-config.md +41 -0
- package/proagents/changelog/2024/01/2024-01-12-login-bug-fix.md +69 -0
- package/proagents/changelog/2024/01/2024-01-15-user-auth-feature.md +99 -0
- package/proagents/changelog/CHANGELOG.md +82 -0
- package/proagents/changelog/README.md +327 -0
- package/proagents/changelog/entry-template.md +283 -0
- package/proagents/checklists/README.md +261 -0
- package/proagents/checklists/code-quality.md +137 -0
- package/proagents/checklists/code-review.md +148 -0
- package/proagents/checklists/pr-checklist.md +78 -0
- package/proagents/checklists/pre-deployment.md +132 -0
- package/proagents/checklists/pre-implementation.md +80 -0
- package/proagents/checklists/testing.md +120 -0
- package/proagents/cicd/README.md +338 -0
- package/proagents/cicd/azure-devops.md +267 -0
- package/proagents/cicd/github-actions.md +375 -0
- package/proagents/cicd/gitlab-ci.md +278 -0
- package/proagents/cicd/jenkins.md +317 -0
- package/proagents/cli/README.md +392 -0
- package/proagents/cli/commands-reference.md +893 -0
- package/proagents/cli/ide-integration.md +584 -0
- package/proagents/cli/shortcuts.md +394 -0
- package/proagents/cli/slash-commands.md +507 -0
- package/proagents/collaboration/README.md +143 -0
- package/proagents/collaboration/roles.md +248 -0
- package/proagents/collaboration/sessions.md +390 -0
- package/proagents/collaboration/sync.md +358 -0
- package/proagents/compliance/README.md +206 -0
- package/proagents/compliance/access-control.md +310 -0
- package/proagents/compliance/audit-logging.md +444 -0
- package/proagents/compliance/compliance-frameworks.md +429 -0
- package/proagents/compliance/reports.md +491 -0
- package/proagents/compliance/retention-policies.md +454 -0
- package/proagents/config/README.md +181 -0
- package/proagents/config/integrations/README.md +68 -0
- package/proagents/config/integrations/github.yaml +211 -0
- package/proagents/config/integrations/jira.yaml +144 -0
- package/proagents/config/integrations/linear.yaml +157 -0
- package/proagents/config/integrations/notion.yaml +203 -0
- package/proagents/config/integrations/slack.yaml +230 -0
- package/proagents/config/rules/README.md +73 -0
- package/proagents/config/rules/custom-rules.template.yaml +188 -0
- package/proagents/config/rules/validation-rules.template.yaml +177 -0
- package/proagents/config/standards/README.md +58 -0
- package/proagents/config/standards/architecture-rules.template.md +124 -0
- package/proagents/config/standards/coding-standards.template.md +107 -0
- package/proagents/config/standards/naming-conventions.template.md +114 -0
- package/proagents/config/standards/testing-standards.template.md +213 -0
- package/proagents/config/templates/README.md +74 -0
- package/proagents/config/templates/api-route.template.ts +142 -0
- package/proagents/config/templates/component.template.tsx +55 -0
- package/proagents/config/templates/hook.template.ts +93 -0
- package/proagents/config/templates/test.template.ts +171 -0
- package/proagents/config-versioning/README.md +120 -0
- package/proagents/config-versioning/changelog.md +300 -0
- package/proagents/config-versioning/rollback.md +283 -0
- package/proagents/config-versioning/versioning.md +330 -0
- package/proagents/contract-testing/README.md +223 -0
- package/proagents/contract-testing/contract-testing.md +614 -0
- package/proagents/contract-testing/pact-integration.md +507 -0
- package/proagents/contract-testing/schema-validation.md +565 -0
- package/proagents/cost/README.md +48 -0
- package/proagents/cost/cost-template.md +283 -0
- package/proagents/cost/estimation-framework.md +287 -0
- package/proagents/database/README.md +72 -0
- package/proagents/database/examples/001-create-users.sql +129 -0
- package/proagents/database/examples/002-add-preferences.sql +94 -0
- package/proagents/database/examples/003-add-index.sql +105 -0
- package/proagents/database/examples/004-rename-column.sql +122 -0
- package/proagents/database/examples/005-add-foreign-key.sql +142 -0
- package/proagents/database/examples/006-data-migration.sql +196 -0
- package/proagents/database/examples/007-drop-column.sql +163 -0
- package/proagents/database/examples/README.md +89 -0
- package/proagents/database/migration-workflow.md +478 -0
- package/proagents/database/rollback-scripts.md +487 -0
- package/proagents/database/safety-checks.md +447 -0
- package/proagents/dependency-management/README.md +140 -0
- package/proagents/dependency-management/automation.md +363 -0
- package/proagents/dependency-management/compatibility.md +319 -0
- package/proagents/dependency-management/security-scanning.md +413 -0
- package/proagents/dependency-management/update-policies.md +374 -0
- package/proagents/disaster-recovery/README.md +247 -0
- package/proagents/disaster-recovery/automation.md +366 -0
- package/proagents/disaster-recovery/backup-recovery.md +571 -0
- package/proagents/disaster-recovery/incident-response.md +565 -0
- package/proagents/disaster-recovery/rollback-procedures.md +499 -0
- package/proagents/disaster-recovery/runbooks.md +603 -0
- package/proagents/disaster-recovery/scenarios.md +892 -0
- package/proagents/disaster-recovery/testing.md +438 -0
- package/proagents/environments/README.md +244 -0
- package/proagents/environments/configuration.md +437 -0
- package/proagents/environments/promotion.md +434 -0
- package/proagents/environments/setup.md +420 -0
- package/proagents/examples/README.md +55 -0
- package/proagents/examples/backend-nodejs/README.md +188 -0
- package/proagents/examples/backend-nodejs/complete-conversation.md +601 -0
- package/proagents/examples/backend-nodejs/proagents.config.yaml +415 -0
- package/proagents/examples/backend-nodejs/workflow-example.md +909 -0
- package/proagents/examples/fullstack-nextjs/README.md +155 -0
- package/proagents/examples/fullstack-nextjs/complete-conversation.md +604 -0
- package/proagents/examples/fullstack-nextjs/proagents.config.yaml +287 -0
- package/proagents/examples/fullstack-nextjs/workflow-example.md +553 -0
- package/proagents/examples/mobile-react-native/README.md +171 -0
- package/proagents/examples/mobile-react-native/complete-conversation.md +825 -0
- package/proagents/examples/mobile-react-native/proagents.config.yaml +330 -0
- package/proagents/examples/mobile-react-native/workflow-example.md +723 -0
- package/proagents/examples/web-frontend-react/README.md +125 -0
- package/proagents/examples/web-frontend-react/complete-conversation.md +556 -0
- package/proagents/examples/web-frontend-react/proagents.config.yaml +183 -0
- package/proagents/examples/web-frontend-react/workflow-example.md +603 -0
- package/proagents/existing-projects/README.md +65 -0
- package/proagents/existing-projects/challenges.md +861 -0
- package/proagents/existing-projects/coexistence-mode.md +483 -0
- package/proagents/existing-projects/compatibility-assessment.md +541 -0
- package/proagents/existing-projects/gradual-adoption.md +515 -0
- package/proagents/existing-projects/migration-strategies.md +788 -0
- package/proagents/existing-projects/pattern-reconciliation.md +489 -0
- package/proagents/existing-projects/team-onboarding.md +617 -0
- package/proagents/existing-projects/technical-debt-handling.md +644 -0
- package/proagents/feature-flags/README.md +263 -0
- package/proagents/feature-flags/ab-testing.md +413 -0
- package/proagents/feature-flags/configuration.md +420 -0
- package/proagents/feature-flags/kill-switches.md +444 -0
- package/proagents/feature-flags/rollout-strategies.md +392 -0
- package/proagents/getting-started/README.md +60 -0
- package/proagents/getting-started/ai-training-setup.md +380 -0
- package/proagents/getting-started/ide-setup.md +195 -0
- package/proagents/getting-started/mcp-setup.md +239 -0
- package/proagents/getting-started/pm-integration.md +336 -0
- package/proagents/getting-started/prompt-engineering.md +478 -0
- package/proagents/getting-started/team-onboarding.md +236 -0
- package/proagents/git/README.md +68 -0
- package/proagents/git/branch-strategy.md +164 -0
- package/proagents/git/commit-conventions.md +241 -0
- package/proagents/git/pr-workflow.md +286 -0
- package/proagents/git/rollback-procedures.md +416 -0
- package/proagents/i18n/README.md +133 -0
- package/proagents/i18n/extraction.md +433 -0
- package/proagents/i18n/tms-integration.md +332 -0
- package/proagents/i18n/translation-workflow.md +413 -0
- package/proagents/i18n/validation.md +355 -0
- package/proagents/ide-integration/README.md +124 -0
- package/proagents/ide-integration/cline-config.md +429 -0
- package/proagents/ide-integration/continue-config.md +380 -0
- package/proagents/ide-integration/cursor-rules.md +280 -0
- package/proagents/ide-integration/github-copilot.md +384 -0
- package/proagents/ide-integration/windsurf-rules.md +314 -0
- package/proagents/integrations/README.md +97 -0
- package/proagents/integrations/pm/README.md +344 -0
- package/proagents/learning/README.md +136 -0
- package/proagents/learning/adaptation.md +305 -0
- package/proagents/learning/data-collection.md +283 -0
- package/proagents/learning/implementation-guide.md +865 -0
- package/proagents/learning/reports.md +306 -0
- package/proagents/logging/README.md +276 -0
- package/proagents/logging/aggregation.md +475 -0
- package/proagents/logging/log-levels.md +376 -0
- package/proagents/logging/sensitive-data.md +423 -0
- package/proagents/logging/structured-logging.md +406 -0
- package/proagents/mcp/README.md +133 -0
- package/proagents/mcp/context-providers.md +442 -0
- package/proagents/mcp/server-config.md +306 -0
- package/proagents/mcp/tools-definition.md +513 -0
- package/proagents/metrics/README.md +174 -0
- package/proagents/metrics/code-quality-kpis.md +461 -0
- package/proagents/metrics/deployment-metrics.md +517 -0
- package/proagents/metrics/developer-productivity.md +368 -0
- package/proagents/metrics/learning-effectiveness.md +478 -0
- package/proagents/migrations/README.md +77 -0
- package/proagents/migrations/from-claude-projects.md +312 -0
- package/proagents/migrations/from-cursor-rules.md +345 -0
- package/proagents/migrations/from-custom-workflows.md +410 -0
- package/proagents/monitoring/README.md +308 -0
- package/proagents/monitoring/alerting.md +449 -0
- package/proagents/monitoring/dashboards.md +454 -0
- package/proagents/monitoring/health-checks.md +436 -0
- package/proagents/monitoring/metrics.md +434 -0
- package/proagents/multi-project/README.md +170 -0
- package/proagents/multi-project/coordinated-deploy.md +510 -0
- package/proagents/multi-project/cross-project-deps.md +395 -0
- package/proagents/multi-project/unified-changelog.md +477 -0
- package/proagents/multi-project/walkthroughs/monorepo-setup.md +787 -0
- package/proagents/multi-project/workspace-config.md +408 -0
- package/proagents/notifications/README.md +151 -0
- package/proagents/notifications/channels.md +457 -0
- package/proagents/notifications/preferences.md +415 -0
- package/proagents/notifications/routing.md +449 -0
- package/proagents/notifications/scheduling.md +425 -0
- package/proagents/notifications/templates.md +446 -0
- package/proagents/offline-mode/README.md +145 -0
- package/proagents/offline-mode/caching.md +344 -0
- package/proagents/offline-mode/offline-operations.md +312 -0
- package/proagents/offline-mode/queue-specifications.md +679 -0
- package/proagents/offline-mode/sync.md +475 -0
- package/proagents/parallel-features/README.md +85 -0
- package/proagents/parallel-features/conflict-detection.md +226 -0
- package/proagents/parallel-features/dependency-management.md +392 -0
- package/proagents/parallel-features/merge-coordination.md +506 -0
- package/proagents/parallel-features/tracking-system.md +416 -0
- package/proagents/patterns/README.md +305 -0
- package/proagents/patterns/api-errors.md +453 -0
- package/proagents/patterns/async-errors.md +521 -0
- package/proagents/patterns/error-types.md +437 -0
- package/proagents/patterns/ui-errors.md +595 -0
- package/proagents/performance/README.md +59 -0
- package/proagents/performance/bundle-analysis.md +375 -0
- package/proagents/performance/load-testing.md +563 -0
- package/proagents/performance/runtime-metrics.md +489 -0
- package/proagents/performance/web-vitals.md +425 -0
- package/proagents/plugins/README.md +139 -0
- package/proagents/plugins/creating-plugins.md +504 -0
- package/proagents/plugins/plugin-api.md +467 -0
- package/proagents/plugins/plugin-registry.md +276 -0
- package/proagents/pm-integration/README.md +151 -0
- package/proagents/pm-integration/asana.md +346 -0
- package/proagents/pm-integration/github-issues.md +308 -0
- package/proagents/pm-integration/gitlab-issues.md +482 -0
- package/proagents/pm-integration/jira.md +364 -0
- package/proagents/pm-integration/linear.md +409 -0
- package/proagents/pm-integration/notion.md +275 -0
- package/proagents/pm-integration/sync-config.md +533 -0
- package/proagents/pm-integration/trello.md +159 -0
- package/proagents/proagents.config.yaml +213 -0
- package/proagents/prompts/00-init-wizard.md +426 -0
- package/proagents/prompts/00-init.md +219 -0
- package/proagents/prompts/01-analysis.md +244 -0
- package/proagents/prompts/02-requirements.md +399 -0
- package/proagents/prompts/03-ui-design.md +493 -0
- package/proagents/prompts/04-planning.md +505 -0
- package/proagents/prompts/05-implementation.md +518 -0
- package/proagents/prompts/06-testing.md +620 -0
- package/proagents/prompts/06.5-code-review.md +512 -0
- package/proagents/prompts/07-documentation.md +673 -0
- package/proagents/prompts/08-deployment.md +539 -0
- package/proagents/prompts/09-rollback.md +554 -0
- package/proagents/prompts/README.md +51 -0
- package/proagents/prompts/accessibility/README.md +146 -0
- package/proagents/prompts/accessibility/aria.md +276 -0
- package/proagents/prompts/accessibility/audit.md +233 -0
- package/proagents/prompts/accessibility/keyboard.md +392 -0
- package/proagents/prompts/accessibility/wcag.md +189 -0
- package/proagents/prompts/debugging/README.md +51 -0
- package/proagents/prompts/debugging/error-analysis.md +385 -0
- package/proagents/prompts/debugging/performance-debug.md +381 -0
- package/proagents/prompts/debugging/systematic.md +270 -0
- package/proagents/prompts/performance/README.md +47 -0
- package/proagents/prompts/performance/analyze.md +265 -0
- package/proagents/prompts/performance/optimize.md +347 -0
- package/proagents/prompts/refactoring/README.md +51 -0
- package/proagents/prompts/refactoring/architecture.md +531 -0
- package/proagents/prompts/refactoring/code-smells.md +174 -0
- package/proagents/prompts/refactoring/patterns.md +516 -0
- package/proagents/prompts/security-audit/README.md +197 -0
- package/proagents/prompts/security-audit/code-review.md +260 -0
- package/proagents/prompts/security-audit/vulnerability-scan.md +288 -0
- package/proagents/reporting/README.md +158 -0
- package/proagents/reporting/dashboards.md +366 -0
- package/proagents/reporting/exports.md +524 -0
- package/proagents/reporting/quality-metrics.md +385 -0
- package/proagents/reporting/templates/README.md +56 -0
- package/proagents/reporting/templates/dashboard-config.json +187 -0
- package/proagents/reporting/templates/metrics-queries.md +427 -0
- package/proagents/reporting/templates/react-dashboard.tsx +544 -0
- package/proagents/reporting/templates/widgets.md +451 -0
- package/proagents/reporting/velocity-metrics.md +340 -0
- package/proagents/reverse-engineering/README.md +151 -0
- package/proagents/reverse-engineering/architecture-extraction.md +325 -0
- package/proagents/reverse-engineering/code-analysis.md +377 -0
- package/proagents/reverse-engineering/dependency-mapping.md +567 -0
- package/proagents/reverse-engineering/diagram-generation.md +586 -0
- package/proagents/reverse-engineering/documentation-generation.md +468 -0
- package/proagents/reverse-engineering/pattern-detection.md +569 -0
- package/proagents/reverse-engineering/quality-assessment.md +733 -0
- package/proagents/rules/README.md +179 -0
- package/proagents/rules/custom-rules-template.yaml +286 -0
- package/proagents/rules/custom-rules.md +754 -0
- package/proagents/rules/validation-rules-template.yaml +517 -0
- package/proagents/runbooks/README.md +219 -0
- package/proagents/runbooks/dependency-vulnerability.md +505 -0
- package/proagents/runbooks/incident-response.md +451 -0
- package/proagents/runbooks/performance-degradation.md +584 -0
- package/proagents/runbooks/production-debugging.md +489 -0
- package/proagents/scaffolding/README.md +64 -0
- package/proagents/scaffolding/nextjs/README.md +578 -0
- package/proagents/scaffolding/nextjs/templates/api-route.ts.template +185 -0
- package/proagents/scaffolding/nextjs/templates/page.tsx.template +109 -0
- package/proagents/scaffolding/nextjs/templates/server-action.ts.template +204 -0
- package/proagents/scaffolding/nodejs/README.md +558 -0
- package/proagents/scaffolding/nodejs/templates/controller.ts.template +167 -0
- package/proagents/scaffolding/nodejs/templates/repository.ts.template +155 -0
- package/proagents/scaffolding/nodejs/templates/service.ts.template +207 -0
- package/proagents/scaffolding/project-types.md +401 -0
- package/proagents/scaffolding/react/README.md +399 -0
- package/proagents/scaffolding/react/templates/component.tsx.template +88 -0
- package/proagents/scaffolding/react/templates/hook.ts.template +127 -0
- package/proagents/scaffolding/react/templates/service.ts.template +155 -0
- package/proagents/scaffolding/react/templates/test.tsx.template +149 -0
- package/proagents/scaffolding/react-native/README.md +476 -0
- package/proagents/scaffolding/react-native/templates/hook.ts.template +226 -0
- package/proagents/scaffolding/react-native/templates/screen.tsx.template +247 -0
- package/proagents/secrets/README.md +278 -0
- package/proagents/secrets/access-control.md +443 -0
- package/proagents/secrets/rotation.md +403 -0
- package/proagents/secrets/scanning.md +487 -0
- package/proagents/secrets/storage.md +394 -0
- package/proagents/security/README.md +71 -0
- package/proagents/security/owasp-checklist.md +390 -0
- package/proagents/security/sast-guide.md +473 -0
- package/proagents/security/security-report-template.md +343 -0
- package/proagents/security/vulnerability-scanning.md +329 -0
- package/proagents/slash-commands.json +161 -0
- package/proagents/standards/README.md +120 -0
- package/proagents/standards/architecture-patterns.md +728 -0
- package/proagents/standards/architecture-rules-template.md +489 -0
- package/proagents/standards/coding-standards-template.md +489 -0
- package/proagents/standards/examples/README.md +61 -0
- package/proagents/standards/examples/nodejs-api.md +560 -0
- package/proagents/standards/examples/react-nextjs.md +428 -0
- package/proagents/standards/naming-conventions-template.md +526 -0
- package/proagents/standards/override-system.md +717 -0
- package/proagents/standards/testing-standards-template.md +220 -0
- package/proagents/team/README.md +256 -0
- package/proagents/team/code-ownership.md +306 -0
- package/proagents/team/communication-templates.md +441 -0
- package/proagents/team/handoff-protocol.md +380 -0
- package/proagents/team/ide-setup/README.md +103 -0
- package/proagents/team/ide-setup/cursor.md +276 -0
- package/proagents/team/ide-setup/jetbrains.md +330 -0
- package/proagents/team/ide-setup/neovim.md +640 -0
- package/proagents/team/ide-setup/vscode.md +348 -0
- package/proagents/team/onboarding.md +278 -0
- package/proagents/templates/README.md +57 -0
- package/proagents/templates/code-review-report.md +255 -0
- package/proagents/templates/codebase-analysis-report.md +315 -0
- package/proagents/templates/deployment-checklist.md +277 -0
- package/proagents/templates/feature-requirements.md +142 -0
- package/proagents/templates/feature-status.md +231 -0
- package/proagents/templates/implementation-plan.md +373 -0
- package/proagents/templates/rollback-plan.md +331 -0
- package/proagents/templates/test-plan.md +336 -0
- package/proagents/templates/ui-specification.md +431 -0
- package/proagents/testing-standards/README.md +229 -0
- package/proagents/testing-standards/coverage-requirements.md +198 -0
- package/proagents/testing-standards/mocking-guidelines.md +478 -0
- package/proagents/testing-standards/test-naming.md +485 -0
- package/proagents/testing-standards/test-patterns.md +488 -0
- package/proagents/troubleshooting/README.md +730 -0
- package/proagents/troubleshooting/ai-issues.md +601 -0
- package/proagents/troubleshooting/workflow-issues.md +571 -0
- package/proagents/ui-integration/README.md +77 -0
- package/proagents/ui-integration/figma-guide.md +217 -0
- package/proagents/ui-integration/manual-export-guide.md +358 -0
- package/proagents/ui-integration/sketch-interpretation.md +471 -0
- package/proagents/webhooks/README.md +126 -0
- package/proagents/webhooks/endpoints.md +298 -0
- package/proagents/webhooks/events.md +316 -0
- package/proagents/webhooks/payloads.md +325 -0
- package/proagents/webhooks/reliability.md +363 -0
- package/proagents/webhooks/security.md +380 -0
- package/proagents/workflow-modes/README.md +136 -0
- package/proagents/workflow-modes/deferred-tracking.md +405 -0
- package/proagents/workflow-modes/entry-modes.md +397 -0
- package/proagents/workflow-modes/guardrails.md +405 -0
- package/proagents/workflow-modes/mode-detection.md +358 -0
- package/proagents/workflow-modes/mode-switching.md +372 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
-- Migration: Create users table
|
|
2
|
+
-- Author: ProAgents
|
|
3
|
+
-- Date: 2024-01-15
|
|
4
|
+
-- Risk Level: Low
|
|
5
|
+
-- Requires Approval: No
|
|
6
|
+
-- Estimated Duration: < 1 second
|
|
7
|
+
|
|
8
|
+
-- Description:
|
|
9
|
+
-- Creates the core users table with essential fields for authentication
|
|
10
|
+
-- and profile information. This is typically one of the first migrations
|
|
11
|
+
-- in a new project.
|
|
12
|
+
|
|
13
|
+
-- ============================================
|
|
14
|
+
-- UP MIGRATION
|
|
15
|
+
-- ============================================
|
|
16
|
+
|
|
17
|
+
-- Create enum for user status
|
|
18
|
+
CREATE TYPE user_status AS ENUM ('active', 'inactive', 'suspended', 'pending');
|
|
19
|
+
|
|
20
|
+
-- Create enum for user role
|
|
21
|
+
CREATE TYPE user_role AS ENUM ('admin', 'developer', 'viewer', 'guest');
|
|
22
|
+
|
|
23
|
+
-- Create users table
|
|
24
|
+
CREATE TABLE users (
|
|
25
|
+
-- Primary key
|
|
26
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
27
|
+
|
|
28
|
+
-- Authentication fields
|
|
29
|
+
email VARCHAR(255) NOT NULL,
|
|
30
|
+
password_hash VARCHAR(255) NOT NULL,
|
|
31
|
+
|
|
32
|
+
-- Profile fields
|
|
33
|
+
first_name VARCHAR(100),
|
|
34
|
+
last_name VARCHAR(100),
|
|
35
|
+
display_name VARCHAR(100),
|
|
36
|
+
avatar_url TEXT,
|
|
37
|
+
|
|
38
|
+
-- Status and role
|
|
39
|
+
status user_status NOT NULL DEFAULT 'pending',
|
|
40
|
+
role user_role NOT NULL DEFAULT 'viewer',
|
|
41
|
+
|
|
42
|
+
-- Email verification
|
|
43
|
+
email_verified BOOLEAN NOT NULL DEFAULT FALSE,
|
|
44
|
+
email_verified_at TIMESTAMP WITH TIME ZONE,
|
|
45
|
+
|
|
46
|
+
-- Timestamps
|
|
47
|
+
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
|
48
|
+
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
|
49
|
+
last_login_at TIMESTAMP WITH TIME ZONE,
|
|
50
|
+
|
|
51
|
+
-- Soft delete
|
|
52
|
+
deleted_at TIMESTAMP WITH TIME ZONE
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
-- Create unique index on email (excluding soft-deleted users)
|
|
56
|
+
CREATE UNIQUE INDEX idx_users_email_unique
|
|
57
|
+
ON users (email)
|
|
58
|
+
WHERE deleted_at IS NULL;
|
|
59
|
+
|
|
60
|
+
-- Create index for common queries
|
|
61
|
+
CREATE INDEX idx_users_status ON users (status) WHERE deleted_at IS NULL;
|
|
62
|
+
CREATE INDEX idx_users_role ON users (role) WHERE deleted_at IS NULL;
|
|
63
|
+
CREATE INDEX idx_users_created_at ON users (created_at);
|
|
64
|
+
|
|
65
|
+
-- Create updated_at trigger function (reusable)
|
|
66
|
+
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
|
67
|
+
RETURNS TRIGGER AS $$
|
|
68
|
+
BEGIN
|
|
69
|
+
NEW.updated_at = NOW();
|
|
70
|
+
RETURN NEW;
|
|
71
|
+
END;
|
|
72
|
+
$$ LANGUAGE plpgsql;
|
|
73
|
+
|
|
74
|
+
-- Apply trigger to users table
|
|
75
|
+
CREATE TRIGGER trigger_users_updated_at
|
|
76
|
+
BEFORE UPDATE ON users
|
|
77
|
+
FOR EACH ROW
|
|
78
|
+
EXECUTE FUNCTION update_updated_at_column();
|
|
79
|
+
|
|
80
|
+
-- Add table comment
|
|
81
|
+
COMMENT ON TABLE users IS 'Core user accounts for authentication and authorization';
|
|
82
|
+
|
|
83
|
+
-- ============================================
|
|
84
|
+
-- DOWN MIGRATION (Rollback)
|
|
85
|
+
-- ============================================
|
|
86
|
+
|
|
87
|
+
-- WARNING: This will delete all user data!
|
|
88
|
+
-- Ensure you have a backup before running rollback.
|
|
89
|
+
|
|
90
|
+
-- Drop trigger
|
|
91
|
+
DROP TRIGGER IF EXISTS trigger_users_updated_at ON users;
|
|
92
|
+
|
|
93
|
+
-- Drop function (only if not used by other tables)
|
|
94
|
+
-- DROP FUNCTION IF EXISTS update_updated_at_column();
|
|
95
|
+
|
|
96
|
+
-- Drop table
|
|
97
|
+
DROP TABLE IF EXISTS users;
|
|
98
|
+
|
|
99
|
+
-- Drop enums
|
|
100
|
+
DROP TYPE IF EXISTS user_role;
|
|
101
|
+
DROP TYPE IF EXISTS user_status;
|
|
102
|
+
|
|
103
|
+
-- ============================================
|
|
104
|
+
-- VERIFICATION
|
|
105
|
+
-- ============================================
|
|
106
|
+
|
|
107
|
+
-- Run these queries to verify the migration succeeded:
|
|
108
|
+
|
|
109
|
+
-- Check table exists
|
|
110
|
+
SELECT EXISTS (
|
|
111
|
+
SELECT FROM information_schema.tables
|
|
112
|
+
WHERE table_name = 'users'
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
-- Check columns
|
|
116
|
+
SELECT column_name, data_type, is_nullable
|
|
117
|
+
FROM information_schema.columns
|
|
118
|
+
WHERE table_name = 'users'
|
|
119
|
+
ORDER BY ordinal_position;
|
|
120
|
+
|
|
121
|
+
-- Check indexes
|
|
122
|
+
SELECT indexname, indexdef
|
|
123
|
+
FROM pg_indexes
|
|
124
|
+
WHERE tablename = 'users';
|
|
125
|
+
|
|
126
|
+
-- Check trigger
|
|
127
|
+
SELECT trigger_name
|
|
128
|
+
FROM information_schema.triggers
|
|
129
|
+
WHERE event_object_table = 'users';
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
-- Migration: Add user preferences column
|
|
2
|
+
-- Author: ProAgents
|
|
3
|
+
-- Date: 2024-01-16
|
|
4
|
+
-- Risk Level: Low
|
|
5
|
+
-- Requires Approval: No
|
|
6
|
+
-- Estimated Duration: < 1 second
|
|
7
|
+
|
|
8
|
+
-- Description:
|
|
9
|
+
-- Adds a JSONB column to store user preferences like theme, language,
|
|
10
|
+
-- notification settings, etc. Using JSONB allows flexible schema-less
|
|
11
|
+
-- storage with indexing capabilities.
|
|
12
|
+
|
|
13
|
+
-- ============================================
|
|
14
|
+
-- UP MIGRATION
|
|
15
|
+
-- ============================================
|
|
16
|
+
|
|
17
|
+
-- Add preferences column with default empty object
|
|
18
|
+
ALTER TABLE users
|
|
19
|
+
ADD COLUMN preferences JSONB NOT NULL DEFAULT '{}'::jsonb;
|
|
20
|
+
|
|
21
|
+
-- Add GIN index for JSONB queries
|
|
22
|
+
-- This enables fast queries like: WHERE preferences @> '{"theme": "dark"}'
|
|
23
|
+
CREATE INDEX idx_users_preferences
|
|
24
|
+
ON users USING GIN (preferences);
|
|
25
|
+
|
|
26
|
+
-- Add specific index for common preference queries
|
|
27
|
+
CREATE INDEX idx_users_preferences_theme
|
|
28
|
+
ON users ((preferences->>'theme'))
|
|
29
|
+
WHERE preferences->>'theme' IS NOT NULL;
|
|
30
|
+
|
|
31
|
+
-- Add column comment
|
|
32
|
+
COMMENT ON COLUMN users.preferences IS 'User preferences stored as JSONB. Keys: theme, language, notifications, timezone, etc.';
|
|
33
|
+
|
|
34
|
+
-- Optionally set default preferences for existing users
|
|
35
|
+
UPDATE users
|
|
36
|
+
SET preferences = jsonb_build_object(
|
|
37
|
+
'theme', 'light',
|
|
38
|
+
'language', 'en',
|
|
39
|
+
'notifications', jsonb_build_object(
|
|
40
|
+
'email', true,
|
|
41
|
+
'push', true,
|
|
42
|
+
'weekly_digest', false
|
|
43
|
+
),
|
|
44
|
+
'timezone', 'UTC'
|
|
45
|
+
)
|
|
46
|
+
WHERE preferences = '{}'::jsonb;
|
|
47
|
+
|
|
48
|
+
-- ============================================
|
|
49
|
+
-- DOWN MIGRATION (Rollback)
|
|
50
|
+
-- ============================================
|
|
51
|
+
|
|
52
|
+
-- Drop indexes first
|
|
53
|
+
DROP INDEX IF EXISTS idx_users_preferences_theme;
|
|
54
|
+
DROP INDEX IF EXISTS idx_users_preferences;
|
|
55
|
+
|
|
56
|
+
-- Remove column
|
|
57
|
+
ALTER TABLE users DROP COLUMN IF EXISTS preferences;
|
|
58
|
+
|
|
59
|
+
-- ============================================
|
|
60
|
+
-- VERIFICATION
|
|
61
|
+
-- ============================================
|
|
62
|
+
|
|
63
|
+
-- Check column exists
|
|
64
|
+
SELECT column_name, data_type, column_default
|
|
65
|
+
FROM information_schema.columns
|
|
66
|
+
WHERE table_name = 'users' AND column_name = 'preferences';
|
|
67
|
+
|
|
68
|
+
-- Check indexes exist
|
|
69
|
+
SELECT indexname
|
|
70
|
+
FROM pg_indexes
|
|
71
|
+
WHERE tablename = 'users' AND indexname LIKE '%preferences%';
|
|
72
|
+
|
|
73
|
+
-- Test JSONB query performance
|
|
74
|
+
EXPLAIN ANALYZE
|
|
75
|
+
SELECT id, email, preferences->>'theme' as theme
|
|
76
|
+
FROM users
|
|
77
|
+
WHERE preferences @> '{"theme": "dark"}';
|
|
78
|
+
|
|
79
|
+
-- ============================================
|
|
80
|
+
-- EXAMPLE USAGE
|
|
81
|
+
-- ============================================
|
|
82
|
+
|
|
83
|
+
-- Query users by preference
|
|
84
|
+
-- SELECT * FROM users WHERE preferences->>'theme' = 'dark';
|
|
85
|
+
|
|
86
|
+
-- Update a single preference
|
|
87
|
+
-- UPDATE users
|
|
88
|
+
-- SET preferences = jsonb_set(preferences, '{theme}', '"dark"')
|
|
89
|
+
-- WHERE id = '...';
|
|
90
|
+
|
|
91
|
+
-- Add new preference key
|
|
92
|
+
-- UPDATE users
|
|
93
|
+
-- SET preferences = preferences || '{"sidebar_collapsed": true}'::jsonb
|
|
94
|
+
-- WHERE id = '...';
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
-- Migration: Add performance index on users.email
|
|
2
|
+
-- Author: ProAgents
|
|
3
|
+
-- Date: 2024-01-17
|
|
4
|
+
-- Risk Level: Medium
|
|
5
|
+
-- Requires Approval: Team Lead
|
|
6
|
+
-- Estimated Duration: Depends on table size (1-5 minutes for large tables)
|
|
7
|
+
|
|
8
|
+
-- Description:
|
|
9
|
+
-- Adds a B-tree index on the email column to improve login query performance.
|
|
10
|
+
-- Uses CONCURRENTLY to avoid locking the table during index creation.
|
|
11
|
+
--
|
|
12
|
+
-- IMPORTANT: CONCURRENTLY cannot be used inside a transaction block.
|
|
13
|
+
-- Run this migration outside of a transaction.
|
|
14
|
+
|
|
15
|
+
-- ============================================
|
|
16
|
+
-- PRE-FLIGHT CHECKS
|
|
17
|
+
-- ============================================
|
|
18
|
+
|
|
19
|
+
-- Check table size before creating index
|
|
20
|
+
SELECT
|
|
21
|
+
pg_size_pretty(pg_total_relation_size('users')) as table_size,
|
|
22
|
+
(SELECT count(*) FROM users) as row_count;
|
|
23
|
+
|
|
24
|
+
-- Estimate index creation time (rough)
|
|
25
|
+
-- Rule of thumb: ~1 minute per 10 million rows
|
|
26
|
+
|
|
27
|
+
-- ============================================
|
|
28
|
+
-- UP MIGRATION
|
|
29
|
+
-- ============================================
|
|
30
|
+
|
|
31
|
+
-- Create index concurrently (non-blocking)
|
|
32
|
+
-- NOTE: Cannot run inside transaction
|
|
33
|
+
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_users_email_lookup
|
|
34
|
+
ON users (LOWER(email))
|
|
35
|
+
WHERE deleted_at IS NULL;
|
|
36
|
+
|
|
37
|
+
-- Create composite index for common queries
|
|
38
|
+
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_users_status_created
|
|
39
|
+
ON users (status, created_at DESC)
|
|
40
|
+
WHERE deleted_at IS NULL;
|
|
41
|
+
|
|
42
|
+
-- Create partial index for active users only
|
|
43
|
+
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_users_active
|
|
44
|
+
ON users (last_login_at DESC)
|
|
45
|
+
WHERE status = 'active' AND deleted_at IS NULL;
|
|
46
|
+
|
|
47
|
+
-- ============================================
|
|
48
|
+
-- DOWN MIGRATION (Rollback)
|
|
49
|
+
-- ============================================
|
|
50
|
+
|
|
51
|
+
-- Drop indexes (also use CONCURRENTLY for safety)
|
|
52
|
+
DROP INDEX CONCURRENTLY IF EXISTS idx_users_active;
|
|
53
|
+
DROP INDEX CONCURRENTLY IF EXISTS idx_users_status_created;
|
|
54
|
+
DROP INDEX CONCURRENTLY IF EXISTS idx_users_email_lookup;
|
|
55
|
+
|
|
56
|
+
-- ============================================
|
|
57
|
+
-- VERIFICATION
|
|
58
|
+
-- ============================================
|
|
59
|
+
|
|
60
|
+
-- Check indexes were created
|
|
61
|
+
SELECT
|
|
62
|
+
indexname,
|
|
63
|
+
indexdef,
|
|
64
|
+
pg_size_pretty(pg_relation_size(indexname::regclass)) as index_size
|
|
65
|
+
FROM pg_indexes
|
|
66
|
+
WHERE tablename = 'users'
|
|
67
|
+
ORDER BY indexname;
|
|
68
|
+
|
|
69
|
+
-- Verify index is being used
|
|
70
|
+
EXPLAIN ANALYZE
|
|
71
|
+
SELECT id, email
|
|
72
|
+
FROM users
|
|
73
|
+
WHERE LOWER(email) = 'test@example.com'
|
|
74
|
+
AND deleted_at IS NULL;
|
|
75
|
+
|
|
76
|
+
-- Check for invalid indexes (failed CONCURRENTLY)
|
|
77
|
+
SELECT indexrelid::regclass as index_name, indisvalid
|
|
78
|
+
FROM pg_index
|
|
79
|
+
WHERE NOT indisvalid;
|
|
80
|
+
|
|
81
|
+
-- ============================================
|
|
82
|
+
-- TROUBLESHOOTING
|
|
83
|
+
-- ============================================
|
|
84
|
+
|
|
85
|
+
-- If CONCURRENTLY fails, the index may be in invalid state.
|
|
86
|
+
-- Check and drop invalid indexes:
|
|
87
|
+
--
|
|
88
|
+
-- SELECT indexrelid::regclass
|
|
89
|
+
-- FROM pg_index
|
|
90
|
+
-- WHERE NOT indisvalid;
|
|
91
|
+
--
|
|
92
|
+
-- DROP INDEX CONCURRENTLY idx_users_email_lookup;
|
|
93
|
+
-- Then retry the CREATE INDEX CONCURRENTLY.
|
|
94
|
+
|
|
95
|
+
-- ============================================
|
|
96
|
+
-- PERFORMANCE COMPARISON
|
|
97
|
+
-- ============================================
|
|
98
|
+
|
|
99
|
+
-- Before index (sequential scan):
|
|
100
|
+
-- Seq Scan on users (cost=0.00..1234.00 rows=1 width=36)
|
|
101
|
+
-- Filter: (lower((email)::text) = 'test@example.com'::text)
|
|
102
|
+
|
|
103
|
+
-- After index (index scan):
|
|
104
|
+
-- Index Scan using idx_users_email_lookup on users (cost=0.42..8.44 rows=1 width=36)
|
|
105
|
+
-- Index Cond: (lower((email)::text) = 'test@example.com'::text)
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
-- Migration: Rename column from 'name' to 'display_name'
|
|
2
|
+
-- Author: ProAgents
|
|
3
|
+
-- Date: 2024-01-18
|
|
4
|
+
-- Risk Level: Medium
|
|
5
|
+
-- Requires Approval: Team Lead
|
|
6
|
+
-- Estimated Duration: < 1 second (metadata only)
|
|
7
|
+
|
|
8
|
+
-- Description:
|
|
9
|
+
-- Renames the 'name' column to 'display_name' for clarity.
|
|
10
|
+
-- Column rename is a metadata-only operation in PostgreSQL,
|
|
11
|
+
-- but requires application code updates.
|
|
12
|
+
--
|
|
13
|
+
-- IMPORTANT: Coordinate this migration with application deployment.
|
|
14
|
+
-- Consider using the expand-contract pattern for zero-downtime.
|
|
15
|
+
|
|
16
|
+
-- ============================================
|
|
17
|
+
-- EXPAND-CONTRACT PATTERN (Zero Downtime)
|
|
18
|
+
-- ============================================
|
|
19
|
+
|
|
20
|
+
-- Phase 1: EXPAND - Add new column (this migration)
|
|
21
|
+
-- Phase 2: MIGRATE - Update application to write to both columns
|
|
22
|
+
-- Phase 3: BACKFILL - Copy data from old to new column
|
|
23
|
+
-- Phase 4: CONTRACT - Update application to read from new column only
|
|
24
|
+
-- Phase 5: CLEANUP - Drop old column (separate migration)
|
|
25
|
+
|
|
26
|
+
-- ============================================
|
|
27
|
+
-- UP MIGRATION (Simple approach - requires brief downtime)
|
|
28
|
+
-- ============================================
|
|
29
|
+
|
|
30
|
+
-- Option A: Direct rename (brief lock, simple)
|
|
31
|
+
ALTER TABLE users
|
|
32
|
+
RENAME COLUMN name TO display_name;
|
|
33
|
+
|
|
34
|
+
-- Update any views that reference this column
|
|
35
|
+
-- (Example if you have views)
|
|
36
|
+
-- CREATE OR REPLACE VIEW user_profiles AS
|
|
37
|
+
-- SELECT id, display_name, email FROM users;
|
|
38
|
+
|
|
39
|
+
-- ============================================
|
|
40
|
+
-- UP MIGRATION (Zero-downtime approach)
|
|
41
|
+
-- ============================================
|
|
42
|
+
|
|
43
|
+
-- -- Step 1: Add new column
|
|
44
|
+
-- ALTER TABLE users ADD COLUMN display_name VARCHAR(100);
|
|
45
|
+
--
|
|
46
|
+
-- -- Step 2: Create trigger to sync columns during transition
|
|
47
|
+
-- CREATE OR REPLACE FUNCTION sync_name_columns()
|
|
48
|
+
-- RETURNS TRIGGER AS $$
|
|
49
|
+
-- BEGIN
|
|
50
|
+
-- IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN
|
|
51
|
+
-- IF NEW.display_name IS NULL AND NEW.name IS NOT NULL THEN
|
|
52
|
+
-- NEW.display_name = NEW.name;
|
|
53
|
+
-- ELSIF NEW.name IS NULL AND NEW.display_name IS NOT NULL THEN
|
|
54
|
+
-- NEW.name = NEW.display_name;
|
|
55
|
+
-- END IF;
|
|
56
|
+
-- END IF;
|
|
57
|
+
-- RETURN NEW;
|
|
58
|
+
-- END;
|
|
59
|
+
-- $$ LANGUAGE plpgsql;
|
|
60
|
+
--
|
|
61
|
+
-- CREATE TRIGGER trigger_sync_name_columns
|
|
62
|
+
-- BEFORE INSERT OR UPDATE ON users
|
|
63
|
+
-- FOR EACH ROW
|
|
64
|
+
-- EXECUTE FUNCTION sync_name_columns();
|
|
65
|
+
--
|
|
66
|
+
-- -- Step 3: Backfill existing data
|
|
67
|
+
-- UPDATE users SET display_name = name WHERE display_name IS NULL;
|
|
68
|
+
--
|
|
69
|
+
-- -- Step 4: After application updated, drop trigger and old column
|
|
70
|
+
-- DROP TRIGGER IF EXISTS trigger_sync_name_columns ON users;
|
|
71
|
+
-- DROP FUNCTION IF EXISTS sync_name_columns();
|
|
72
|
+
-- ALTER TABLE users DROP COLUMN name;
|
|
73
|
+
|
|
74
|
+
-- ============================================
|
|
75
|
+
-- DOWN MIGRATION (Rollback)
|
|
76
|
+
-- ============================================
|
|
77
|
+
|
|
78
|
+
-- Option A: Simple rollback
|
|
79
|
+
ALTER TABLE users
|
|
80
|
+
RENAME COLUMN display_name TO name;
|
|
81
|
+
|
|
82
|
+
-- Option B: Zero-downtime rollback (reverse the expand)
|
|
83
|
+
-- ALTER TABLE users DROP COLUMN display_name;
|
|
84
|
+
|
|
85
|
+
-- ============================================
|
|
86
|
+
-- VERIFICATION
|
|
87
|
+
-- ============================================
|
|
88
|
+
|
|
89
|
+
-- Check column was renamed
|
|
90
|
+
SELECT column_name
|
|
91
|
+
FROM information_schema.columns
|
|
92
|
+
WHERE table_name = 'users'
|
|
93
|
+
AND column_name IN ('name', 'display_name');
|
|
94
|
+
|
|
95
|
+
-- Verify no broken views
|
|
96
|
+
SELECT viewname
|
|
97
|
+
FROM pg_views
|
|
98
|
+
WHERE definition LIKE '%users.name%';
|
|
99
|
+
|
|
100
|
+
-- Check for broken functions/procedures
|
|
101
|
+
SELECT proname
|
|
102
|
+
FROM pg_proc
|
|
103
|
+
WHERE prosrc LIKE '%users.name%';
|
|
104
|
+
|
|
105
|
+
-- ============================================
|
|
106
|
+
-- APPLICATION CODE UPDATES REQUIRED
|
|
107
|
+
-- ============================================
|
|
108
|
+
|
|
109
|
+
-- Before migration:
|
|
110
|
+
-- const user = await db.user.findUnique({ where: { id } });
|
|
111
|
+
-- console.log(user.name);
|
|
112
|
+
|
|
113
|
+
-- After migration:
|
|
114
|
+
-- const user = await db.user.findUnique({ where: { id } });
|
|
115
|
+
-- console.log(user.display_name); // Updated field name
|
|
116
|
+
|
|
117
|
+
-- ORM model update (Prisma example):
|
|
118
|
+
-- model User {
|
|
119
|
+
-- id String @id @default(uuid())
|
|
120
|
+
-- display_name String? @map("display_name") // Updated from "name"
|
|
121
|
+
-- email String @unique
|
|
122
|
+
-- }
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
-- Migration: Add foreign key relationship (users -> teams)
|
|
2
|
+
-- Author: ProAgents
|
|
3
|
+
-- Date: 2024-01-19
|
|
4
|
+
-- Risk Level: Medium
|
|
5
|
+
-- Requires Approval: Team Lead
|
|
6
|
+
-- Estimated Duration: Depends on table size
|
|
7
|
+
|
|
8
|
+
-- Description:
|
|
9
|
+
-- Adds a team_id foreign key to the users table, establishing a
|
|
10
|
+
-- many-to-one relationship between users and teams.
|
|
11
|
+
--
|
|
12
|
+
-- IMPORTANT: Existing users will have NULL team_id unless backfilled.
|
|
13
|
+
|
|
14
|
+
-- ============================================
|
|
15
|
+
-- PRE-FLIGHT CHECKS
|
|
16
|
+
-- ============================================
|
|
17
|
+
|
|
18
|
+
-- Ensure teams table exists
|
|
19
|
+
SELECT EXISTS (
|
|
20
|
+
SELECT FROM information_schema.tables
|
|
21
|
+
WHERE table_name = 'teams'
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
-- Check for orphan data that would violate constraint
|
|
25
|
+
-- (Run this BEFORE adding constraint)
|
|
26
|
+
SELECT COUNT(*) as orphan_count
|
|
27
|
+
FROM users u
|
|
28
|
+
WHERE u.team_id IS NOT NULL
|
|
29
|
+
AND NOT EXISTS (SELECT 1 FROM teams t WHERE t.id = u.team_id);
|
|
30
|
+
|
|
31
|
+
-- ============================================
|
|
32
|
+
-- UP MIGRATION
|
|
33
|
+
-- ============================================
|
|
34
|
+
|
|
35
|
+
-- Step 1: Add the column (nullable first for safety)
|
|
36
|
+
ALTER TABLE users
|
|
37
|
+
ADD COLUMN team_id UUID;
|
|
38
|
+
|
|
39
|
+
-- Step 2: Add index on foreign key column (important for JOIN performance)
|
|
40
|
+
CREATE INDEX CONCURRENTLY idx_users_team_id
|
|
41
|
+
ON users (team_id)
|
|
42
|
+
WHERE team_id IS NOT NULL;
|
|
43
|
+
|
|
44
|
+
-- Step 3: Add foreign key constraint
|
|
45
|
+
-- Using NOT VALID first to avoid full table scan
|
|
46
|
+
ALTER TABLE users
|
|
47
|
+
ADD CONSTRAINT fk_users_team
|
|
48
|
+
FOREIGN KEY (team_id)
|
|
49
|
+
REFERENCES teams(id)
|
|
50
|
+
ON DELETE SET NULL -- When team deleted, set user's team_id to NULL
|
|
51
|
+
ON UPDATE CASCADE -- When team id changes, update users
|
|
52
|
+
NOT VALID; -- Don't validate existing rows yet
|
|
53
|
+
|
|
54
|
+
-- Step 4: Validate the constraint (can be done later, non-blocking)
|
|
55
|
+
ALTER TABLE users
|
|
56
|
+
VALIDATE CONSTRAINT fk_users_team;
|
|
57
|
+
|
|
58
|
+
-- Add column comment
|
|
59
|
+
COMMENT ON COLUMN users.team_id IS 'Reference to the team this user belongs to';
|
|
60
|
+
|
|
61
|
+
-- ============================================
|
|
62
|
+
-- ALTERNATIVE: Strict relationship (required team)
|
|
63
|
+
-- ============================================
|
|
64
|
+
|
|
65
|
+
-- If team_id should be required:
|
|
66
|
+
--
|
|
67
|
+
-- Step 1: Create default team
|
|
68
|
+
-- INSERT INTO teams (id, name) VALUES ('00000000-0000-0000-0000-000000000000', 'Default');
|
|
69
|
+
--
|
|
70
|
+
-- Step 2: Add column with default
|
|
71
|
+
-- ALTER TABLE users
|
|
72
|
+
-- ADD COLUMN team_id UUID NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
|
|
73
|
+
--
|
|
74
|
+
-- Step 3: Add foreign key with RESTRICT
|
|
75
|
+
-- ALTER TABLE users
|
|
76
|
+
-- ADD CONSTRAINT fk_users_team
|
|
77
|
+
-- FOREIGN KEY (team_id)
|
|
78
|
+
-- REFERENCES teams(id)
|
|
79
|
+
-- ON DELETE RESTRICT -- Prevent team deletion if users exist
|
|
80
|
+
-- ON UPDATE CASCADE;
|
|
81
|
+
|
|
82
|
+
-- ============================================
|
|
83
|
+
-- DOWN MIGRATION (Rollback)
|
|
84
|
+
-- ============================================
|
|
85
|
+
|
|
86
|
+
-- Drop constraint first
|
|
87
|
+
ALTER TABLE users
|
|
88
|
+
DROP CONSTRAINT IF EXISTS fk_users_team;
|
|
89
|
+
|
|
90
|
+
-- Drop index
|
|
91
|
+
DROP INDEX CONCURRENTLY IF EXISTS idx_users_team_id;
|
|
92
|
+
|
|
93
|
+
-- Drop column
|
|
94
|
+
ALTER TABLE users
|
|
95
|
+
DROP COLUMN IF EXISTS team_id;
|
|
96
|
+
|
|
97
|
+
-- ============================================
|
|
98
|
+
-- VERIFICATION
|
|
99
|
+
-- ============================================
|
|
100
|
+
|
|
101
|
+
-- Check constraint exists
|
|
102
|
+
SELECT constraint_name, constraint_type
|
|
103
|
+
FROM information_schema.table_constraints
|
|
104
|
+
WHERE table_name = 'users'
|
|
105
|
+
AND constraint_name = 'fk_users_team';
|
|
106
|
+
|
|
107
|
+
-- Check foreign key details
|
|
108
|
+
SELECT
|
|
109
|
+
kcu.column_name,
|
|
110
|
+
ccu.table_name AS foreign_table_name,
|
|
111
|
+
ccu.column_name AS foreign_column_name,
|
|
112
|
+
rc.delete_rule,
|
|
113
|
+
rc.update_rule
|
|
114
|
+
FROM information_schema.key_column_usage kcu
|
|
115
|
+
JOIN information_schema.constraint_column_usage ccu
|
|
116
|
+
ON kcu.constraint_name = ccu.constraint_name
|
|
117
|
+
JOIN information_schema.referential_constraints rc
|
|
118
|
+
ON kcu.constraint_name = rc.constraint_name
|
|
119
|
+
WHERE kcu.table_name = 'users'
|
|
120
|
+
AND kcu.constraint_name = 'fk_users_team';
|
|
121
|
+
|
|
122
|
+
-- Test constraint enforcement
|
|
123
|
+
-- This should fail:
|
|
124
|
+
-- INSERT INTO users (email, password_hash, team_id)
|
|
125
|
+
-- VALUES ('test@example.com', 'hash', '00000000-0000-0000-0000-000000000001');
|
|
126
|
+
-- Error: insert or update on table "users" violates foreign key constraint
|
|
127
|
+
|
|
128
|
+
-- ============================================
|
|
129
|
+
-- BACKFILL EXISTING USERS
|
|
130
|
+
-- ============================================
|
|
131
|
+
|
|
132
|
+
-- Option 1: Assign all existing users to a default team
|
|
133
|
+
-- UPDATE users
|
|
134
|
+
-- SET team_id = (SELECT id FROM teams WHERE name = 'Default' LIMIT 1)
|
|
135
|
+
-- WHERE team_id IS NULL;
|
|
136
|
+
|
|
137
|
+
-- Option 2: Assign users based on email domain
|
|
138
|
+
-- UPDATE users
|
|
139
|
+
-- SET team_id = t.id
|
|
140
|
+
-- FROM teams t
|
|
141
|
+
-- WHERE users.email LIKE '%@' || t.domain
|
|
142
|
+
-- AND users.team_id IS NULL;
|