aios-core 2.1.6 → 2.2.1
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/core/README.md +229 -229
- package/.aios-core/core/data/agent-config-requirements.yaml +368 -368
- package/.aios-core/core/data/aios-kb.md +923 -923
- package/.aios-core/core/data/workflow-patterns.yaml +267 -267
- package/.aios-core/core/docs/SHARD-TRANSLATION-GUIDE.md +335 -335
- package/.aios-core/core/docs/component-creation-guide.md +457 -457
- package/.aios-core/core/docs/session-update-pattern.md +307 -307
- package/.aios-core/core/docs/template-syntax.md +266 -266
- package/.aios-core/core/docs/troubleshooting-guide.md +624 -624
- package/.aios-core/core/elicitation/elicitation-engine.js +1 -1
- package/.aios-core/core/index.esm.js +42 -42
- package/.aios-core/core/index.js +1 -1
- package/.aios-core/core/migration/migration-config.yaml +83 -83
- package/.aios-core/core/migration/module-mapping.yaml +89 -89
- package/.aios-core/core/quality-gates/layer2-pr-automation.js +1 -1
- package/.aios-core/core/quality-gates/quality-gate-config.yaml +86 -86
- package/.aios-core/core/registry/README.md +179 -179
- package/.aios-core/core/utils/security-utils.js +1 -1
- package/.aios-core/core-config.yaml +391 -382
- package/.aios-core/data/agent-config-requirements.yaml +368 -368
- package/.aios-core/data/aios-kb.md +923 -923
- package/.aios-core/data/technical-preferences.md +3 -3
- package/.aios-core/data/workflow-patterns.yaml +267 -267
- package/.aios-core/development/README.md +142 -142
- package/.aios-core/development/agent-teams/team-all.yaml +15 -15
- package/.aios-core/development/agent-teams/team-fullstack.yaml +18 -18
- package/.aios-core/development/agent-teams/team-ide-minimal.yaml +10 -10
- package/.aios-core/development/agent-teams/team-no-ui.yaml +13 -13
- package/.aios-core/development/agent-teams/team-qa-focused.yaml +155 -155
- package/.aios-core/development/agents/aios-master.md +339 -339
- package/.aios-core/development/agents/analyst.md +195 -195
- package/.aios-core/development/agents/architect.md +359 -359
- package/.aios-core/development/agents/data-engineer.md +468 -468
- package/.aios-core/development/agents/dev.md +390 -390
- package/.aios-core/development/agents/devops.md +398 -398
- package/.aios-core/development/agents/pm.md +198 -198
- package/.aios-core/development/agents/po.md +256 -256
- package/.aios-core/development/agents/qa.md +312 -312
- package/.aios-core/development/agents/sm.md +220 -220
- package/.aios-core/development/agents/ux-design-expert.md +451 -451
- package/.aios-core/development/scripts/greeting-config-cli.js +85 -85
- package/.aios-core/development/tasks/add-mcp.md +319 -319
- package/.aios-core/development/tasks/advanced-elicitation.md +318 -318
- package/.aios-core/development/tasks/analyst-facilitate-brainstorming.md +341 -341
- package/.aios-core/development/tasks/analyze-framework.md +696 -696
- package/.aios-core/development/tasks/analyze-performance.md +637 -637
- package/.aios-core/development/tasks/apply-qa-fixes.md +340 -340
- package/.aios-core/development/tasks/architect-analyze-impact.md +826 -826
- package/.aios-core/development/tasks/audit-codebase.md +429 -429
- package/.aios-core/development/tasks/audit-tailwind-config.md +270 -270
- package/.aios-core/development/tasks/audit-utilities.md +358 -358
- package/.aios-core/development/tasks/bootstrap-shadcn-library.md +286 -286
- package/.aios-core/development/tasks/brownfield-create-epic.md +485 -485
- package/.aios-core/development/tasks/brownfield-create-story.md +356 -356
- package/.aios-core/development/tasks/build-component.md +478 -478
- package/.aios-core/development/tasks/calculate-roi.md +455 -455
- package/.aios-core/development/tasks/ci-cd-configuration.md +764 -764
- package/.aios-core/development/tasks/cleanup-utilities.md +670 -670
- package/.aios-core/development/tasks/collaborative-edit.md +1108 -1108
- package/.aios-core/development/tasks/compose-molecule.md +284 -284
- package/.aios-core/development/tasks/consolidate-patterns.md +414 -414
- package/.aios-core/development/tasks/correct-course.md +279 -279
- package/.aios-core/development/tasks/create-agent.md +321 -321
- package/.aios-core/development/tasks/create-brownfield-story.md +726 -726
- package/.aios-core/development/tasks/create-deep-research-prompt.md +498 -498
- package/.aios-core/development/tasks/create-doc.md +316 -316
- package/.aios-core/development/tasks/create-next-story.md +774 -774
- package/.aios-core/development/tasks/create-suite.md +283 -283
- package/.aios-core/development/tasks/create-task.md +371 -371
- package/.aios-core/development/tasks/create-workflow.md +370 -370
- package/.aios-core/development/tasks/db-analyze-hotpaths.md +572 -572
- package/.aios-core/development/tasks/db-apply-migration.md +381 -381
- package/.aios-core/development/tasks/db-bootstrap.md +642 -642
- package/.aios-core/development/tasks/db-domain-modeling.md +693 -693
- package/.aios-core/development/tasks/db-dry-run.md +293 -293
- package/.aios-core/development/tasks/db-env-check.md +260 -260
- package/.aios-core/development/tasks/db-expansion-pack-integration.md +663 -663
- package/.aios-core/development/tasks/db-explain.md +631 -631
- package/.aios-core/development/tasks/db-impersonate.md +495 -495
- package/.aios-core/development/tasks/db-load-csv.md +593 -593
- package/.aios-core/development/tasks/db-policy-apply.md +653 -653
- package/.aios-core/development/tasks/db-rls-audit.md +411 -411
- package/.aios-core/development/tasks/db-rollback.md +739 -739
- package/.aios-core/development/tasks/db-run-sql.md +613 -613
- package/.aios-core/development/tasks/db-schema-audit.md +1011 -1011
- package/.aios-core/development/tasks/db-seed.md +390 -390
- package/.aios-core/development/tasks/db-smoke-test.md +351 -351
- package/.aios-core/development/tasks/db-snapshot.md +569 -569
- package/.aios-core/development/tasks/db-supabase-setup.md +712 -712
- package/.aios-core/development/tasks/db-verify-order.md +515 -515
- package/.aios-core/development/tasks/deprecate-component.md +956 -956
- package/.aios-core/development/tasks/dev-apply-qa-fixes.md +318 -318
- package/.aios-core/development/tasks/dev-backlog-debt.md +469 -469
- package/.aios-core/development/tasks/dev-develop-story.md +846 -846
- package/.aios-core/development/tasks/dev-improve-code-quality.md +872 -872
- package/.aios-core/development/tasks/dev-optimize-performance.md +1033 -1033
- package/.aios-core/development/tasks/dev-suggest-refactoring.md +870 -870
- package/.aios-core/development/tasks/dev-validate-next-story.md +348 -348
- package/.aios-core/development/tasks/document-project.md +552 -552
- package/.aios-core/development/tasks/environment-bootstrap.md +1311 -1311
- package/.aios-core/development/tasks/execute-checklist.md +301 -301
- package/.aios-core/development/tasks/export-design-tokens-dtcg.md +274 -274
- package/.aios-core/development/tasks/extend-pattern.md +269 -269
- package/.aios-core/development/tasks/extract-tokens.md +467 -467
- package/.aios-core/development/tasks/facilitate-brainstorming-session.md +518 -518
- package/.aios-core/development/tasks/generate-ai-frontend-prompt.md +260 -260
- package/.aios-core/development/tasks/generate-documentation.md +284 -284
- package/.aios-core/development/tasks/generate-migration-strategy.md +522 -522
- package/.aios-core/development/tasks/generate-shock-report.md +501 -501
- package/.aios-core/development/tasks/github-devops-github-pr-automation.md +427 -427
- package/.aios-core/development/tasks/github-devops-pre-push-quality-gate.md +733 -733
- package/.aios-core/development/tasks/github-devops-repository-cleanup.md +374 -374
- package/.aios-core/development/tasks/github-devops-version-management.md +483 -483
- package/.aios-core/development/tasks/improve-self.md +822 -822
- package/.aios-core/development/tasks/index-docs.md +387 -387
- package/.aios-core/development/tasks/init-project-status.md +506 -506
- package/.aios-core/development/tasks/integrate-expansion-pack.md +314 -314
- package/.aios-core/development/tasks/kb-mode-interaction.md +283 -283
- package/.aios-core/development/tasks/learn-patterns.md +900 -900
- package/.aios-core/development/tasks/mcp-workflow.md +437 -437
- package/.aios-core/development/tasks/modify-agent.md +381 -381
- package/.aios-core/development/tasks/modify-task.md +424 -424
- package/.aios-core/development/tasks/modify-workflow.md +465 -465
- package/.aios-core/development/tasks/po-backlog-add.md +370 -370
- package/.aios-core/development/tasks/po-manage-story-backlog.md +523 -523
- package/.aios-core/development/tasks/po-pull-story-from-clickup.md +540 -540
- package/.aios-core/development/tasks/po-pull-story.md +316 -316
- package/.aios-core/development/tasks/po-stories-index.md +351 -351
- package/.aios-core/development/tasks/po-sync-story-to-clickup.md +457 -457
- package/.aios-core/development/tasks/po-sync-story.md +303 -303
- package/.aios-core/development/tasks/pr-automation.md +701 -701
- package/.aios-core/development/tasks/propose-modification.md +842 -842
- package/.aios-core/development/tasks/qa-backlog-add-followup.md +425 -425
- package/.aios-core/development/tasks/qa-gate.md +373 -373
- package/.aios-core/development/tasks/qa-generate-tests.md +1174 -1174
- package/.aios-core/development/tasks/qa-nfr-assess.md +557 -557
- package/.aios-core/development/tasks/qa-review-proposal.md +1157 -1157
- package/.aios-core/development/tasks/qa-review-story.md +682 -682
- package/.aios-core/development/tasks/qa-risk-profile.md +566 -566
- package/.aios-core/development/tasks/qa-run-tests.md +277 -277
- package/.aios-core/development/tasks/qa-test-design.md +387 -387
- package/.aios-core/development/tasks/qa-trace-requirements.md +476 -476
- package/.aios-core/development/tasks/release-management.md +723 -723
- package/.aios-core/development/tasks/security-audit.md +554 -554
- package/.aios-core/development/tasks/security-scan.md +790 -790
- package/.aios-core/development/tasks/setup-database.md +741 -741
- package/.aios-core/development/tasks/setup-design-system.md +462 -462
- package/.aios-core/development/tasks/setup-github.md +874 -874
- package/.aios-core/development/tasks/setup-llm-routing.md +1 -1
- package/.aios-core/development/tasks/setup-mcp-docker.md +584 -584
- package/.aios-core/development/tasks/setup-project-docs.md +1 -1
- package/.aios-core/development/tasks/shard-doc.md +537 -537
- package/.aios-core/development/tasks/sm-create-next-story.md +480 -480
- package/.aios-core/development/tasks/sync-documentation.md +864 -864
- package/.aios-core/development/tasks/tailwind-upgrade.md +294 -294
- package/.aios-core/development/tasks/test-as-user.md +621 -621
- package/.aios-core/development/tasks/test-validation-task.md +171 -171
- package/.aios-core/development/tasks/undo-last.md +346 -346
- package/.aios-core/development/tasks/update-manifest.md +409 -409
- package/.aios-core/development/tasks/ux-create-wireframe.md +617 -617
- package/.aios-core/development/tasks/ux-ds-scan-artifact.md +672 -672
- package/.aios-core/development/tasks/ux-user-research.md +559 -559
- package/.aios-core/development/tasks/validate-next-story.md +422 -422
- package/.aios-core/development/workflows/README.md +83 -83
- package/.aios-core/development/workflows/brownfield-fullstack.yaml +297 -297
- package/.aios-core/development/workflows/brownfield-service.yaml +187 -187
- package/.aios-core/development/workflows/brownfield-ui.yaml +197 -197
- package/.aios-core/development/workflows/greenfield-fullstack.yaml +333 -333
- package/.aios-core/development/workflows/greenfield-service.yaml +206 -206
- package/.aios-core/development/workflows/greenfield-ui.yaml +235 -235
- package/.aios-core/docs/SHARD-TRANSLATION-GUIDE.md +335 -335
- package/.aios-core/docs/component-creation-guide.md +457 -457
- package/.aios-core/docs/session-update-pattern.md +307 -307
- package/.aios-core/docs/standards/AGENT-PERSONALIZATION-STANDARD-V1.md +572 -572
- package/.aios-core/docs/standards/AIOS-COLOR-PALETTE-QUICK-REFERENCE.md +185 -185
- package/.aios-core/docs/standards/AIOS-COLOR-PALETTE-V2.1.md +354 -354
- package/.aios-core/docs/standards/AIOS-FRAMEWORK-MASTER.md +1963 -1963
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md +821 -821
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-SUMMARY.md +1190 -1190
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1.md +439 -439
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.2-SUMMARY.md +1339 -1339
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO.md +5398 -5398
- package/.aios-core/docs/standards/EXECUTOR-DECISION-TREE.md +697 -697
- package/.aios-core/docs/standards/OPEN-SOURCE-VS-SERVICE-DIFFERENCES.md +511 -511
- package/.aios-core/docs/standards/QUALITY-GATES-SPECIFICATION.md +556 -556
- package/.aios-core/docs/standards/STANDARDS-INDEX.md +210 -210
- package/.aios-core/docs/standards/STORY-TEMPLATE-V2-SPECIFICATION.md +550 -550
- package/.aios-core/docs/standards/TASK-FORMAT-SPECIFICATION-V1.md +1414 -1414
- package/.aios-core/docs/standards/V3-ARCHITECTURAL-DECISIONS.md +523 -523
- package/.aios-core/docs/template-syntax.md +266 -266
- package/.aios-core/docs/troubleshooting-guide.md +624 -624
- package/.aios-core/index.esm.js +15 -15
- package/.aios-core/index.js +1 -1
- package/.aios-core/infrastructure/README.md +126 -126
- package/.aios-core/infrastructure/integrations/pm-adapters/README.md +59 -59
- package/.aios-core/infrastructure/scripts/approval-workflow.js +1 -1
- package/.aios-core/infrastructure/scripts/batch-creator.js +1 -1
- package/.aios-core/infrastructure/scripts/component-generator.js +3 -3
- package/.aios-core/infrastructure/scripts/component-metadata.js +1 -1
- package/.aios-core/infrastructure/scripts/component-search.js +1 -1
- package/.aios-core/infrastructure/scripts/coverage-analyzer.js +1 -1
- package/.aios-core/infrastructure/scripts/dependency-analyzer.js +1 -1
- package/.aios-core/infrastructure/scripts/dependency-impact-analyzer.js +1 -1
- package/.aios-core/infrastructure/scripts/framework-analyzer.js +1 -1
- package/.aios-core/infrastructure/scripts/improvement-engine.js +1 -1
- package/.aios-core/infrastructure/scripts/llm-routing/install-llm-routing.js +26 -13
- package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-free-tracked.cmd +127 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-free-tracked.sh +108 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/deepseek-proxy.cmd +71 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/deepseek-proxy.sh +65 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/deepseek-usage.cmd +51 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/deepseek-usage.sh +16 -0
- package/.aios-core/infrastructure/scripts/llm-routing/usage-tracker/index.js +549 -0
- package/.aios-core/infrastructure/scripts/modification-risk-assessment.js +1 -1
- package/.aios-core/infrastructure/scripts/performance-analyzer.js +1 -1
- package/.aios-core/infrastructure/scripts/pm-adapter.js +134 -134
- package/.aios-core/infrastructure/scripts/repository-detector.js +3 -3
- package/.aios-core/infrastructure/scripts/template-engine.js +1 -1
- package/.aios-core/infrastructure/scripts/template-validator.js +1 -1
- package/.aios-core/infrastructure/scripts/test-generator.js +1 -1
- package/.aios-core/infrastructure/scripts/test-quality-assessment.js +1 -1
- package/.aios-core/infrastructure/scripts/transaction-manager.js +1 -1
- package/.aios-core/infrastructure/scripts/usage-analytics.js +1 -1
- package/.aios-core/infrastructure/scripts/visual-impact-generator.js +2 -2
- package/.aios-core/infrastructure/templates/github-workflows/README.md +109 -109
- package/.aios-core/infrastructure/tests/regression-suite-v2.md +621 -621
- package/.aios-core/infrastructure/tools/README.md +222 -222
- package/.aios-core/infrastructure/tools/cli/github-cli.yaml +200 -200
- package/.aios-core/infrastructure/tools/cli/railway-cli.yaml +260 -260
- package/.aios-core/infrastructure/tools/cli/supabase-cli.yaml +224 -224
- package/.aios-core/infrastructure/tools/local/ffmpeg.yaml +261 -261
- package/.aios-core/infrastructure/tools/mcp/21st-dev-magic.yaml +127 -127
- package/.aios-core/infrastructure/tools/mcp/browser.yaml +103 -103
- package/.aios-core/infrastructure/tools/mcp/clickup.yaml +534 -534
- package/.aios-core/infrastructure/tools/mcp/context7.yaml +78 -78
- package/.aios-core/infrastructure/tools/mcp/desktop-commander.yaml +180 -180
- package/.aios-core/infrastructure/tools/mcp/exa.yaml +103 -103
- package/.aios-core/infrastructure/tools/mcp/google-workspace.yaml +930 -930
- package/.aios-core/infrastructure/tools/mcp/n8n.yaml +551 -551
- package/.aios-core/infrastructure/tools/mcp/supabase.yaml +808 -808
- package/.aios-core/install-manifest.yaml +347 -347
- package/.aios-core/product/README.md +56 -56
- package/.aios-core/product/checklists/accessibility-wcag-checklist.md +80 -0
- package/.aios-core/product/checklists/architect-checklist.md +443 -443
- package/.aios-core/product/checklists/change-checklist.md +182 -182
- package/.aios-core/product/checklists/component-quality-checklist.md +74 -0
- package/.aios-core/product/checklists/database-design-checklist.md +119 -119
- package/.aios-core/product/checklists/dba-predeploy-checklist.md +97 -97
- package/.aios-core/product/checklists/dba-rollback-checklist.md +99 -99
- package/.aios-core/product/checklists/migration-readiness-checklist.md +75 -0
- package/.aios-core/product/checklists/pattern-audit-checklist.md +88 -0
- package/.aios-core/product/checklists/pm-checklist.md +375 -375
- package/.aios-core/product/checklists/po-master-checklist.md +441 -441
- package/.aios-core/product/checklists/pre-push-checklist.md +108 -108
- package/.aios-core/product/checklists/release-checklist.md +122 -122
- package/.aios-core/product/checklists/story-dod-checklist.md +101 -101
- package/.aios-core/product/checklists/story-draft-checklist.md +215 -215
- package/.aios-core/product/data/atomic-design-principles.md +108 -0
- package/.aios-core/product/data/brainstorming-techniques.md +36 -36
- package/.aios-core/product/data/consolidation-algorithms.md +142 -0
- package/.aios-core/product/data/database-best-practices.md +182 -0
- package/.aios-core/product/data/design-token-best-practices.md +107 -0
- package/.aios-core/product/data/elicitation-methods.md +134 -134
- package/.aios-core/product/data/integration-patterns.md +207 -0
- package/.aios-core/product/data/migration-safety-guide.md +329 -0
- package/.aios-core/product/data/mode-selection-best-practices.md +471 -471
- package/.aios-core/product/data/postgres-tuning-guide.md +300 -0
- package/.aios-core/product/data/rls-security-patterns.md +333 -0
- package/.aios-core/product/data/roi-calculation-guide.md +142 -0
- package/.aios-core/product/data/supabase-patterns.md +330 -0
- package/.aios-core/product/data/test-levels-framework.md +148 -148
- package/.aios-core/product/data/test-priorities-matrix.md +174 -174
- package/.aios-core/product/data/wcag-compliance-guide.md +267 -0
- package/.aios-core/product/templates/1mcp-config.yaml +225 -225
- package/.aios-core/product/templates/activation-instructions-inline-greeting.yaml +63 -63
- package/.aios-core/product/templates/activation-instructions-template.md +258 -258
- package/.aios-core/product/templates/agent-template.yaml +120 -120
- package/.aios-core/product/templates/architecture-tmpl.yaml +650 -650
- package/.aios-core/product/templates/brainstorming-output-tmpl.yaml +155 -155
- package/.aios-core/product/templates/brownfield-architecture-tmpl.yaml +475 -475
- package/.aios-core/product/templates/brownfield-prd-tmpl.yaml +279 -279
- package/.aios-core/product/templates/changelog-template.md +134 -134
- package/.aios-core/product/templates/command-rationalization-matrix.md +152 -152
- package/.aios-core/product/templates/competitor-analysis-tmpl.yaml +292 -292
- package/.aios-core/product/templates/design-story-tmpl.yaml +587 -587
- package/.aios-core/product/templates/ds-artifact-analysis.md +70 -70
- package/.aios-core/product/templates/front-end-architecture-tmpl.yaml +205 -205
- package/.aios-core/product/templates/front-end-spec-tmpl.yaml +348 -348
- package/.aios-core/product/templates/fullstack-architecture-tmpl.yaml +804 -804
- package/.aios-core/product/templates/github-pr-template.md +67 -67
- package/.aios-core/product/templates/gordon-mcp.yaml +140 -140
- package/.aios-core/product/templates/ide-rules/antigravity-rules.md +115 -115
- package/.aios-core/product/templates/ide-rules/claude-rules.md +221 -221
- package/.aios-core/product/templates/ide-rules/cline-rules.md +84 -84
- package/.aios-core/product/templates/ide-rules/copilot-rules.md +92 -92
- package/.aios-core/product/templates/ide-rules/cursor-rules.md +115 -115
- package/.aios-core/product/templates/ide-rules/gemini-rules.md +85 -85
- package/.aios-core/product/templates/ide-rules/roo-rules.md +86 -86
- package/.aios-core/product/templates/ide-rules/trae-rules.md +104 -104
- package/.aios-core/product/templates/ide-rules/windsurf-rules.md +80 -80
- package/.aios-core/product/templates/index-strategy-tmpl.yaml +53 -53
- package/.aios-core/product/templates/market-research-tmpl.yaml +251 -251
- package/.aios-core/product/templates/mcp-workflow.js +271 -271
- package/.aios-core/product/templates/migration-plan-tmpl.yaml +1022 -1022
- package/.aios-core/product/templates/migration-strategy-tmpl.md +524 -524
- package/.aios-core/product/templates/personalized-agent-template.md +258 -258
- package/.aios-core/product/templates/personalized-checklist-template.md +340 -340
- package/.aios-core/product/templates/personalized-task-template-v2.md +905 -905
- package/.aios-core/product/templates/personalized-task-template.md +344 -344
- package/.aios-core/product/templates/personalized-template-file.yaml +322 -322
- package/.aios-core/product/templates/personalized-workflow-template.yaml +460 -460
- package/.aios-core/product/templates/prd-tmpl.yaml +201 -201
- package/.aios-core/product/templates/project-brief-tmpl.yaml +220 -220
- package/.aios-core/product/templates/qa-gate-tmpl.yaml +240 -240
- package/.aios-core/product/templates/rls-policies-tmpl.yaml +1203 -1203
- package/.aios-core/product/templates/schema-design-tmpl.yaml +428 -428
- package/.aios-core/product/templates/state-persistence-tmpl.yaml +219 -219
- package/.aios-core/product/templates/story-tmpl.yaml +331 -331
- package/.aios-core/product/templates/task-execution-report.md +495 -495
- package/.aios-core/product/templates/task-template.md +122 -122
- package/.aios-core/product/templates/token-exports-tailwind-tmpl.js +395 -395
- package/.aios-core/product/templates/tokens-schema-tmpl.yaml +305 -305
- package/.aios-core/product/templates/workflow-template.yaml +133 -133
- package/.aios-core/scripts/README.md +354 -354
- package/.aios-core/scripts/aios-doc-template.md +325 -325
- package/.aios-core/scripts/elicitation-engine.js +1 -1
- package/.aios-core/scripts/test-template-system.js +1 -1
- package/.aios-core/scripts/workflow-management.md +69 -69
- package/.aios-core/user-guide.md +1413 -1413
- package/.aios-core/working-in-the-brownfield.md +361 -361
- package/LICENSE +1 -1
- package/README.md +704 -703
- package/bin/aios-init-old.js +3 -3
- package/bin/aios-init-v4.js +1 -1
- package/bin/aios-init.backup-v1.1.4.js +1 -1
- package/bin/aios-init.js +3 -3
- package/bin/aios.js +279 -279
- package/bin/utils/install-errors.js +339 -339
- package/bin/utils/install-transaction.js +445 -445
- package/index.d.ts +18 -18
- package/index.esm.js +20 -20
- package/index.js +6 -6
- package/package.json +8 -11
- package/packages/installer/src/config/templates/env-template.js +27 -4
- package/packages/installer/src/detection/detect-project-type.js +81 -81
- package/packages/installer/tests/integration/wizard-detection.test.js +8 -6
- package/packages/installer/tests/unit/env-template.test.js +8 -8
- package/src/config/ide-configs.js +1 -1
- package/src/wizard/feedback.js +2 -2
- package/src/wizard/index.js +1 -1
- package/src/wizard/validation/report-generator.js +1 -1
- package/src/wizard/validation/troubleshooting-system.js +13 -13
- package/tools/diagnose-installation.js +266 -0
- package/tools/diagnose-npx-issue.ps1 +96 -0
- package/tools/quick-diagnose.cmd +85 -0
- package/tools/quick-diagnose.ps1 +117 -0
- package/.aios-core/infrastructure/scripts/_archived/final-todo-count.js +0 -122
- package/.aios-core/infrastructure/scripts/_archived/fix-yaml-formatting.js +0 -89
- package/.aios-core/infrastructure/scripts/_archived/migration-generator.js +0 -780
- package/.aios-core/infrastructure/scripts/_archived/migration-path-generator.js +0 -950
- package/.aios-core/infrastructure/scripts/_archived/phase2-entrada-saida-errors.js +0 -425
- package/.aios-core/infrastructure/scripts/_archived/phase2-spot-check.js +0 -132
- package/.aios-core/infrastructure/scripts/_archived/phase3-tools-scripts-validation.js +0 -381
- package/.aios-core/infrastructure/scripts/_archived/phase4-metadata-performance.js +0 -203
- package/.aios-core/infrastructure/scripts/_archived/test-yaml-parsing.js +0 -24
- package/.aios-core/infrastructure/scripts/_archived/verify-yaml-fix.js +0 -51
- package/.aios-core/tasks/find-component.md.legacy +0 -391
- package/.aios-core/tasks/generate-commit-message.md.legacy +0 -426
- package/.aios-core/tasks/generate-migration.md.legacy +0 -382
- package/.aios-core/tasks/rollback-modification.md.legacy +0 -307
- package/.aios-core/tasks/update-tests.md.legacy +0 -283
|
@@ -1,653 +1,653 @@
|
|
|
1
|
-
# Task: Apply RLS Policy Template
|
|
2
|
-
|
|
3
|
-
**Purpose**: Install KISS or granular RLS policies on a table
|
|
4
|
-
|
|
5
|
-
**Elicit**: true
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Execution Modes
|
|
10
|
-
|
|
11
|
-
**Choose your execution mode:**
|
|
12
|
-
|
|
13
|
-
### 1. YOLO Mode - Fast, Autonomous (0-1 prompts)
|
|
14
|
-
- Autonomous decision making with logging
|
|
15
|
-
- Minimal user interaction
|
|
16
|
-
- **Best for:** Simple, deterministic tasks
|
|
17
|
-
|
|
18
|
-
### 2. Interactive Mode - Balanced, Educational (5-10 prompts) **[DEFAULT]**
|
|
19
|
-
- Explicit decision checkpoints
|
|
20
|
-
- Educational explanations
|
|
21
|
-
- **Best for:** Learning, complex decisions
|
|
22
|
-
|
|
23
|
-
### 3. Pre-Flight Planning - Comprehensive Upfront Planning
|
|
24
|
-
- Task analysis phase (identify all ambiguities)
|
|
25
|
-
- Zero ambiguity execution
|
|
26
|
-
- **Best for:** Ambiguous requirements, critical work
|
|
27
|
-
|
|
28
|
-
**Parameter:** `mode` (optional, default: `interactive`)
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## Task Definition (AIOS Task Format V1.0)
|
|
33
|
-
|
|
34
|
-
```yaml
|
|
35
|
-
task: dbPolicyApply()
|
|
36
|
-
responsável: Dara (Sage)
|
|
37
|
-
responsavel_type: Agente
|
|
38
|
-
atomic_layer: Config
|
|
39
|
-
|
|
40
|
-
**Entrada:**
|
|
41
|
-
- campo: query
|
|
42
|
-
tipo: string
|
|
43
|
-
origem: User Input
|
|
44
|
-
obrigatório: true
|
|
45
|
-
validação: Valid SQL query
|
|
46
|
-
|
|
47
|
-
- campo: params
|
|
48
|
-
tipo: object
|
|
49
|
-
origem: User Input
|
|
50
|
-
obrigatório: false
|
|
51
|
-
validação: Query parameters
|
|
52
|
-
|
|
53
|
-
- campo: connection
|
|
54
|
-
tipo: object
|
|
55
|
-
origem: config
|
|
56
|
-
obrigatório: true
|
|
57
|
-
validação: Valid PostgreSQL connection via Supabase
|
|
58
|
-
|
|
59
|
-
**Saída:**
|
|
60
|
-
- campo: query_result
|
|
61
|
-
tipo: array
|
|
62
|
-
destino: Memory
|
|
63
|
-
persistido: false
|
|
64
|
-
|
|
65
|
-
- campo: records_affected
|
|
66
|
-
tipo: number
|
|
67
|
-
destino: Return value
|
|
68
|
-
persistido: false
|
|
69
|
-
|
|
70
|
-
- campo: execution_time
|
|
71
|
-
tipo: number
|
|
72
|
-
destino: Memory
|
|
73
|
-
persistido: false
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
---
|
|
77
|
-
|
|
78
|
-
## Pre-Conditions
|
|
79
|
-
|
|
80
|
-
**Purpose:** Validate prerequisites BEFORE task execution (blocking)
|
|
81
|
-
|
|
82
|
-
**Checklist:**
|
|
83
|
-
|
|
84
|
-
```yaml
|
|
85
|
-
pre-conditions:
|
|
86
|
-
- [ ] Database connection established; query syntax valid
|
|
87
|
-
tipo: pre-condition
|
|
88
|
-
blocker: true
|
|
89
|
-
validação: |
|
|
90
|
-
Check database connection established; query syntax valid
|
|
91
|
-
error_message: "Pre-condition failed: Database connection established; query syntax valid"
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
---
|
|
95
|
-
|
|
96
|
-
## Post-Conditions
|
|
97
|
-
|
|
98
|
-
**Purpose:** Validate execution success AFTER task completes
|
|
99
|
-
|
|
100
|
-
**Checklist:**
|
|
101
|
-
|
|
102
|
-
```yaml
|
|
103
|
-
post-conditions:
|
|
104
|
-
- [ ] Query executed; results returned; transaction committed
|
|
105
|
-
tipo: post-condition
|
|
106
|
-
blocker: true
|
|
107
|
-
validação: |
|
|
108
|
-
Verify query executed; results returned; transaction committed
|
|
109
|
-
error_message: "Post-condition failed: Query executed; results returned; transaction committed"
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
## Acceptance Criteria
|
|
115
|
-
|
|
116
|
-
**Purpose:** Definitive pass/fail criteria for task completion
|
|
117
|
-
|
|
118
|
-
**Checklist:**
|
|
119
|
-
|
|
120
|
-
```yaml
|
|
121
|
-
acceptance-criteria:
|
|
122
|
-
- [ ] Data persisted correctly; constraints respected; no orphaned data
|
|
123
|
-
tipo: acceptance-criterion
|
|
124
|
-
blocker: true
|
|
125
|
-
validação: |
|
|
126
|
-
Assert data persisted correctly; constraints respected; no orphaned data
|
|
127
|
-
error_message: "Acceptance criterion not met: Data persisted correctly; constraints respected; no orphaned data"
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
---
|
|
131
|
-
|
|
132
|
-
## Tools
|
|
133
|
-
|
|
134
|
-
**External/shared resources used by this task:**
|
|
135
|
-
|
|
136
|
-
- **Tool:** neo4j-driver
|
|
137
|
-
- **Purpose:** Neo4j database connection and query execution
|
|
138
|
-
- **Source:** npm: neo4j-driver
|
|
139
|
-
|
|
140
|
-
- **Tool:** query-validator
|
|
141
|
-
- **Purpose:** Cypher query syntax validation
|
|
142
|
-
- **Source:** .aios-core/utils/db-query-validator.js
|
|
143
|
-
|
|
144
|
-
---
|
|
145
|
-
|
|
146
|
-
## Scripts
|
|
147
|
-
|
|
148
|
-
**Agent-specific code for this task:**
|
|
149
|
-
|
|
150
|
-
- **Script:** db-query.js
|
|
151
|
-
- **Purpose:** Execute Neo4j queries with error handling
|
|
152
|
-
- **Language:** JavaScript
|
|
153
|
-
- **Location:** .aios-core/scripts/db-query.js
|
|
154
|
-
|
|
155
|
-
---
|
|
156
|
-
|
|
157
|
-
## Error Handling
|
|
158
|
-
|
|
159
|
-
**Strategy:** abort
|
|
160
|
-
|
|
161
|
-
**Common Errors:**
|
|
162
|
-
|
|
163
|
-
1. **Error:** Connection Failed
|
|
164
|
-
- **Cause:** Unable to connect to Neo4j database
|
|
165
|
-
- **Resolution:** Check connection string, credentials, network
|
|
166
|
-
- **Recovery:** Retry with exponential backoff (max 3 attempts)
|
|
167
|
-
|
|
168
|
-
2. **Error:** Query Syntax Error
|
|
169
|
-
- **Cause:** Invalid Cypher query syntax
|
|
170
|
-
- **Resolution:** Validate query syntax before execution
|
|
171
|
-
- **Recovery:** Return detailed syntax error, suggest fix
|
|
172
|
-
|
|
173
|
-
3. **Error:** Transaction Rollback
|
|
174
|
-
- **Cause:** Query violates constraints or timeout
|
|
175
|
-
- **Resolution:** Review query logic and constraints
|
|
176
|
-
- **Recovery:** Automatic rollback, preserve data integrity
|
|
177
|
-
|
|
178
|
-
---
|
|
179
|
-
|
|
180
|
-
## Performance
|
|
181
|
-
|
|
182
|
-
**Expected Metrics:**
|
|
183
|
-
|
|
184
|
-
```yaml
|
|
185
|
-
duration_expected: 2-10 min (estimated)
|
|
186
|
-
cost_estimated: $0.001-0.008
|
|
187
|
-
token_usage: ~800-2,500 tokens
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
**Optimization Notes:**
|
|
191
|
-
- Validate configuration early; use atomic writes; implement rollback checkpoints
|
|
192
|
-
|
|
193
|
-
---
|
|
194
|
-
|
|
195
|
-
## Metadata
|
|
196
|
-
|
|
197
|
-
```yaml
|
|
198
|
-
story: N/A
|
|
199
|
-
version: 1.0.0
|
|
200
|
-
dependencies:
|
|
201
|
-
- N/A
|
|
202
|
-
tags:
|
|
203
|
-
- database
|
|
204
|
-
- infrastructure
|
|
205
|
-
updated_at: 2025-11-17
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
---
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
## 🚀 NEW: Use Automated RLS Policy Installer (RECOMMENDED)
|
|
212
|
-
|
|
213
|
-
**Token Savings: 89% | Time Savings: ~85%**
|
|
214
|
-
|
|
215
|
-
```bash
|
|
216
|
-
# Use the rls-policy-installer script
|
|
217
|
-
./
|
|
218
|
-
|
|
219
|
-
# Examples:
|
|
220
|
-
./
|
|
221
|
-
./
|
|
222
|
-
./
|
|
223
|
-
|
|
224
|
-
# Available modes: kiss, read-only, private, team, custom
|
|
225
|
-
|
|
226
|
-
# Benefits:
|
|
227
|
-
# - Standardized policy templates
|
|
228
|
-
# - Automatic testing after installation
|
|
229
|
-
# - Safety checks for existing policies
|
|
230
|
-
# - 89% token savings
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
**OR continue with manual policy installation below:**
|
|
234
|
-
|
|
235
|
-
---
|
|
236
|
-
|
|
237
|
-
## Inputs
|
|
238
|
-
|
|
239
|
-
- `table` (string): Table name to apply policy to
|
|
240
|
-
- `mode` (string): 'kiss' or 'granular' - policy type
|
|
241
|
-
|
|
242
|
-
---
|
|
243
|
-
|
|
244
|
-
## Process (Manual Method)
|
|
245
|
-
|
|
246
|
-
### 1. Validate Inputs
|
|
247
|
-
|
|
248
|
-
Check table exists and mode is valid:
|
|
249
|
-
|
|
250
|
-
```bash
|
|
251
|
-
echo "Validating inputs..."
|
|
252
|
-
|
|
253
|
-
# Check table exists
|
|
254
|
-
psql "$SUPABASE_DB_URL" -c \
|
|
255
|
-
"SELECT EXISTS (
|
|
256
|
-
SELECT 1 FROM information_schema.tables
|
|
257
|
-
WHERE table_schema = 'public' AND table_name = '{table}'
|
|
258
|
-
);" | grep -q t || {
|
|
259
|
-
echo "❌ Table '{table}' not found"
|
|
260
|
-
exit 1
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
# Check mode
|
|
264
|
-
if [[ "{mode}" != "kiss" && "{mode}" != "granular" ]]; then
|
|
265
|
-
echo "❌ Invalid mode: {mode}"
|
|
266
|
-
echo " Use 'kiss' or 'granular'"
|
|
267
|
-
exit 1
|
|
268
|
-
fi
|
|
269
|
-
|
|
270
|
-
echo "✓ Table exists: {table}"
|
|
271
|
-
echo "✓ Mode: {mode}"
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
### 2. Check Existing Policies
|
|
275
|
-
|
|
276
|
-
Display current RLS status:
|
|
277
|
-
|
|
278
|
-
```bash
|
|
279
|
-
echo "Checking existing RLS policies..."
|
|
280
|
-
|
|
281
|
-
psql "$SUPABASE_DB_URL" << EOF
|
|
282
|
-
SELECT
|
|
283
|
-
schemaname,
|
|
284
|
-
tablename,
|
|
285
|
-
policyname,
|
|
286
|
-
permissive,
|
|
287
|
-
roles,
|
|
288
|
-
cmd,
|
|
289
|
-
qual,
|
|
290
|
-
with_check
|
|
291
|
-
FROM pg_policies
|
|
292
|
-
WHERE tablename = '{table}';
|
|
293
|
-
EOF
|
|
294
|
-
|
|
295
|
-
echo ""
|
|
296
|
-
echo "RLS enabled on {table}?"
|
|
297
|
-
psql "$SUPABASE_DB_URL" -c \
|
|
298
|
-
"SELECT relrowsecurity FROM pg_class WHERE relname = '{table}';" \
|
|
299
|
-
| grep -q t && echo "✓ Yes" || echo "⚠️ No (will be enabled)"
|
|
300
|
-
```
|
|
301
|
-
|
|
302
|
-
### 3. Ask User Confirmation
|
|
303
|
-
|
|
304
|
-
Present policy that will be applied based on mode:
|
|
305
|
-
|
|
306
|
-
**If mode = 'kiss':**
|
|
307
|
-
```
|
|
308
|
-
Will apply KISS policy to {table}:
|
|
309
|
-
- Enable RLS
|
|
310
|
-
- Single policy: users can only access their own rows
|
|
311
|
-
- Uses: (select auth.uid()) = user_id [PERFORMANCE OPTIMIZED]
|
|
312
|
-
- Applies to: SELECT, INSERT, UPDATE, DELETE
|
|
313
|
-
|
|
314
|
-
⚠️ CRITICAL PERFORMANCE NOTE:
|
|
315
|
-
Wrapping auth.uid() in SELECT provides 99.99% performance improvement
|
|
316
|
-
by allowing PostgreSQL to cache the function result.
|
|
317
|
-
|
|
318
|
-
Continue? (yes/no)
|
|
319
|
-
```
|
|
320
|
-
|
|
321
|
-
**If mode = 'granular':**
|
|
322
|
-
```
|
|
323
|
-
Will apply granular policies to {table}:
|
|
324
|
-
- Enable RLS
|
|
325
|
-
- Separate policies for each operation (SELECT, INSERT, UPDATE, DELETE)
|
|
326
|
-
- Fine-grained control
|
|
327
|
-
- Uses: auth.uid() = user_id
|
|
328
|
-
|
|
329
|
-
Continue? (yes/no)
|
|
330
|
-
```
|
|
331
|
-
|
|
332
|
-
Get confirmation before proceeding.
|
|
333
|
-
|
|
334
|
-
### 4. Generate Policy SQL
|
|
335
|
-
|
|
336
|
-
Based on mode, generate appropriate SQL:
|
|
337
|
-
|
|
338
|
-
**KISS Mode:**
|
|
339
|
-
```sql
|
|
340
|
-
-- Enable RLS
|
|
341
|
-
ALTER TABLE {table} ENABLE ROW LEVEL SECURITY;
|
|
342
|
-
|
|
343
|
-
-- Drop existing policies (if any)
|
|
344
|
-
DROP POLICY IF EXISTS "{table}_policy" ON {table};
|
|
345
|
-
|
|
346
|
-
-- Create single KISS policy (PERFORMANCE OPTIMIZED)
|
|
347
|
-
CREATE POLICY "{table}_policy"
|
|
348
|
-
ON {table}
|
|
349
|
-
FOR ALL
|
|
350
|
-
TO authenticated
|
|
351
|
-
USING (
|
|
352
|
-
-- ✅ CRITICAL: Wrap auth.uid() in SELECT for 99.99% performance gain
|
|
353
|
-
-- This allows PostgreSQL to cache the function result per statement
|
|
354
|
-
(select auth.uid()) IS NOT NULL AND
|
|
355
|
-
(select auth.uid()) = user_id
|
|
356
|
-
)
|
|
357
|
-
WITH CHECK (
|
|
358
|
-
(select auth.uid()) IS NOT NULL AND
|
|
359
|
-
(select auth.uid()) = user_id
|
|
360
|
-
);
|
|
361
|
-
|
|
362
|
-
-- Add helpful comment
|
|
363
|
-
COMMENT ON POLICY "{table}_policy" ON {table} IS
|
|
364
|
-
'KISS policy: users can only access their own rows (performance optimized with cached auth.uid())';
|
|
365
|
-
```
|
|
366
|
-
|
|
367
|
-
**Granular Mode (PERFORMANCE OPTIMIZED):**
|
|
368
|
-
```sql
|
|
369
|
-
-- Enable RLS
|
|
370
|
-
ALTER TABLE {table} ENABLE ROW LEVEL SECURITY;
|
|
371
|
-
|
|
372
|
-
-- Drop existing policies (if any)
|
|
373
|
-
DROP POLICY IF EXISTS "{table}_select" ON {table};
|
|
374
|
-
DROP POLICY IF EXISTS "{table}_insert" ON {table};
|
|
375
|
-
DROP POLICY IF EXISTS "{table}_update" ON {table};
|
|
376
|
-
DROP POLICY IF EXISTS "{table}_delete" ON {table};
|
|
377
|
-
|
|
378
|
-
-- SELECT: Users read own rows
|
|
379
|
-
-- ✅ Wrapping auth.uid() in SELECT provides 99.99% performance improvement
|
|
380
|
-
CREATE POLICY "{table}_select"
|
|
381
|
-
ON {table}
|
|
382
|
-
FOR SELECT
|
|
383
|
-
TO authenticated
|
|
384
|
-
USING (
|
|
385
|
-
(select auth.uid()) IS NOT NULL AND
|
|
386
|
-
(select auth.uid()) = user_id
|
|
387
|
-
);
|
|
388
|
-
|
|
389
|
-
-- INSERT: Users create own rows
|
|
390
|
-
CREATE POLICY "{table}_insert"
|
|
391
|
-
ON {table}
|
|
392
|
-
FOR INSERT
|
|
393
|
-
TO authenticated
|
|
394
|
-
WITH CHECK (
|
|
395
|
-
(select auth.uid()) IS NOT NULL AND
|
|
396
|
-
(select auth.uid()) = user_id
|
|
397
|
-
);
|
|
398
|
-
|
|
399
|
-
-- UPDATE: Users update own rows
|
|
400
|
-
CREATE POLICY "{table}_update"
|
|
401
|
-
ON {table}
|
|
402
|
-
FOR UPDATE
|
|
403
|
-
TO authenticated
|
|
404
|
-
USING (
|
|
405
|
-
(select auth.uid()) IS NOT NULL AND
|
|
406
|
-
(select auth.uid()) = user_id
|
|
407
|
-
)
|
|
408
|
-
WITH CHECK (
|
|
409
|
-
(select auth.uid()) IS NOT NULL AND
|
|
410
|
-
(select auth.uid()) = user_id
|
|
411
|
-
);
|
|
412
|
-
|
|
413
|
-
-- DELETE: Users delete own rows
|
|
414
|
-
CREATE POLICY "{table}_delete"
|
|
415
|
-
ON {table}
|
|
416
|
-
FOR DELETE
|
|
417
|
-
TO authenticated
|
|
418
|
-
USING (
|
|
419
|
-
(select auth.uid()) IS NOT NULL AND
|
|
420
|
-
(select auth.uid()) = user_id
|
|
421
|
-
);
|
|
422
|
-
|
|
423
|
-
-- Add helpful comments
|
|
424
|
-
COMMENT ON POLICY "{table}_select" ON {table} IS 'Users can read own rows (cached auth.uid())';
|
|
425
|
-
COMMENT ON POLICY "{table}_insert" ON {table} IS 'Users can insert own rows (cached auth.uid())';
|
|
426
|
-
COMMENT ON POLICY "{table}_update" ON {table} IS 'Users can update own rows (cached auth.uid())';
|
|
427
|
-
COMMENT ON POLICY "{table}_delete" ON {table} IS 'Users can delete own rows (cached auth.uid())';
|
|
428
|
-
```
|
|
429
|
-
|
|
430
|
-
### 5. Create Migration File
|
|
431
|
-
|
|
432
|
-
Save policy SQL to migration file:
|
|
433
|
-
|
|
434
|
-
```bash
|
|
435
|
-
TS=$(date +%Y%m%d%H%M%S)
|
|
436
|
-
MIGRATION_FILE="supabase/migrations/${TS}_rls_${mode}__{table}.sql"
|
|
437
|
-
|
|
438
|
-
mkdir -p supabase/migrations
|
|
439
|
-
|
|
440
|
-
cat > "$MIGRATION_FILE" << 'EOF'
|
|
441
|
-
-- Migration: Apply {mode} RLS policy to {table}
|
|
442
|
-
-- Generated: $(date -u +"%Y-%m-%d %H:%M:%S UTC")
|
|
443
|
-
-- Table: {table}
|
|
444
|
-
-- Mode: {mode}
|
|
445
|
-
|
|
446
|
-
BEGIN;
|
|
447
|
-
|
|
448
|
-
[... SQL from step 4 ...]
|
|
449
|
-
|
|
450
|
-
COMMIT;
|
|
451
|
-
EOF
|
|
452
|
-
|
|
453
|
-
echo "✓ Migration created: $MIGRATION_FILE"
|
|
454
|
-
```
|
|
455
|
-
|
|
456
|
-
### 6. Apply Migration
|
|
457
|
-
|
|
458
|
-
Use existing db-apply-migration task:
|
|
459
|
-
|
|
460
|
-
```bash
|
|
461
|
-
echo "Applying migration..."
|
|
462
|
-
# Execute db-apply-migration task internally
|
|
463
|
-
# (This will create snapshots, apply, verify)
|
|
464
|
-
```
|
|
465
|
-
|
|
466
|
-
### 7. Test Policies
|
|
467
|
-
|
|
468
|
-
Verify policies work correctly:
|
|
469
|
-
|
|
470
|
-
```bash
|
|
471
|
-
echo "Testing RLS policies..."
|
|
472
|
-
|
|
473
|
-
# Test 1: Anonymous user should see nothing
|
|
474
|
-
psql "$SUPABASE_DB_URL" << EOF
|
|
475
|
-
SET ROLE anon;
|
|
476
|
-
SELECT COUNT(*) AS anon_count FROM {table};
|
|
477
|
-
RESET ROLE;
|
|
478
|
-
EOF
|
|
479
|
-
|
|
480
|
-
# Test 2: Authenticated user should see only their rows
|
|
481
|
-
# (Requires setting up test user - provide instructions)
|
|
482
|
-
|
|
483
|
-
echo ""
|
|
484
|
-
echo "✓ Policy tests complete"
|
|
485
|
-
echo " ⚠️ Manual testing recommended:"
|
|
486
|
-
echo " - Use *impersonate to test as specific user"
|
|
487
|
-
echo " - Verify each operation (SELECT, INSERT, UPDATE, DELETE)"
|
|
488
|
-
```
|
|
489
|
-
|
|
490
|
-
---
|
|
491
|
-
|
|
492
|
-
## Output
|
|
493
|
-
|
|
494
|
-
Display summary:
|
|
495
|
-
```
|
|
496
|
-
✅ RLS POLICY APPLIED
|
|
497
|
-
|
|
498
|
-
Table: {table}
|
|
499
|
-
Mode: {mode}
|
|
500
|
-
Migration: supabase/migrations/{TS}_rls_{mode}__{table}.sql
|
|
501
|
-
Policies: [list created policies]
|
|
502
|
-
|
|
503
|
-
Next steps:
|
|
504
|
-
1. Test policies manually: *impersonate {user_id}
|
|
505
|
-
2. Run RLS audit: *rls-audit
|
|
506
|
-
3. Update documentation
|
|
507
|
-
4. Commit migration to git
|
|
508
|
-
```
|
|
509
|
-
|
|
510
|
-
---
|
|
511
|
-
|
|
512
|
-
## Notes
|
|
513
|
-
|
|
514
|
-
### KISS vs Granular
|
|
515
|
-
|
|
516
|
-
**KISS** (Keep It Simple, Stupid):
|
|
517
|
-
- ✅ Single policy for all operations
|
|
518
|
-
- ✅ Easier to understand
|
|
519
|
-
- ✅ Less verbose
|
|
520
|
-
- ❌ Less flexible
|
|
521
|
-
|
|
522
|
-
**Granular**:
|
|
523
|
-
- ✅ Separate policies per operation
|
|
524
|
-
- ✅ Fine-grained control
|
|
525
|
-
- ✅ Can have different logic per operation
|
|
526
|
-
- ❌ More verbose
|
|
527
|
-
|
|
528
|
-
### Common Patterns
|
|
529
|
-
|
|
530
|
-
**Public Read, Authenticated Write (Performance Optimized):**
|
|
531
|
-
```sql
|
|
532
|
-
-- SELECT: Public
|
|
533
|
-
CREATE POLICY "{table}_select" ON {table}
|
|
534
|
-
FOR SELECT TO public
|
|
535
|
-
USING (true);
|
|
536
|
-
|
|
537
|
-
-- INSERT/UPDATE/DELETE: Authenticated users only
|
|
538
|
-
CREATE POLICY "{table}_write" ON {table}
|
|
539
|
-
FOR ALL TO authenticated
|
|
540
|
-
USING (
|
|
541
|
-
(select auth.uid()) IS NOT NULL AND
|
|
542
|
-
(select auth.uid()) = user_id
|
|
543
|
-
)
|
|
544
|
-
WITH CHECK (
|
|
545
|
-
(select auth.uid()) IS NOT NULL AND
|
|
546
|
-
(select auth.uid()) = user_id
|
|
547
|
-
);
|
|
548
|
-
```
|
|
549
|
-
|
|
550
|
-
**Tenant-Based (Performance Optimized):**
|
|
551
|
-
```sql
|
|
552
|
-
CREATE POLICY "{table}_tenant" ON {table}
|
|
553
|
-
FOR ALL TO authenticated
|
|
554
|
-
USING (
|
|
555
|
-
(select auth.uid()) IS NOT NULL AND
|
|
556
|
-
tenant_id IN (
|
|
557
|
-
SELECT tenant_id FROM user_tenants
|
|
558
|
-
WHERE user_id = (select auth.uid())
|
|
559
|
-
)
|
|
560
|
-
);
|
|
561
|
-
```
|
|
562
|
-
|
|
563
|
-
### Performance Tips
|
|
564
|
-
|
|
565
|
-
**Critical Performance Optimization:**
|
|
566
|
-
Always wrap `auth.uid()` in a `SELECT` statement:
|
|
567
|
-
```sql
|
|
568
|
-
-- ❌ SLOW (99.99% slower)
|
|
569
|
-
USING (auth.uid() = user_id)
|
|
570
|
-
|
|
571
|
-
-- ✅ FAST (cached per statement)
|
|
572
|
-
USING ((select auth.uid()) = user_id)
|
|
573
|
-
```
|
|
574
|
-
|
|
575
|
-
**Why it matters:**
|
|
576
|
-
- Without SELECT: PostgreSQL calls `auth.uid()` for EVERY row
|
|
577
|
-
- With SELECT: PostgreSQL caches the result for the entire statement
|
|
578
|
-
- Performance improvement: **99.99%** (essentially 10,000x faster on large tables)
|
|
579
|
-
|
|
580
|
-
**Index Recommendations:**
|
|
581
|
-
- Always index columns used in policies (e.g., `user_id`, `tenant_id`)
|
|
582
|
-
- Example: `CREATE INDEX idx_{table}_user_id ON {table}(user_id);`
|
|
583
|
-
- Performance improvement: **99.94%** when combined with wrapped auth functions
|
|
584
|
-
|
|
585
|
-
---
|
|
586
|
-
|
|
587
|
-
## Security Warnings ⚠️
|
|
588
|
-
|
|
589
|
-
### CRITICAL: Do NOT Use raw_user_meta_data in Policies
|
|
590
|
-
|
|
591
|
-
```sql
|
|
592
|
-
-- ❌ DANGEROUS - User can modify this data!
|
|
593
|
-
CREATE POLICY "bad_policy" ON {table}
|
|
594
|
-
USING (
|
|
595
|
-
(auth.jwt() -> 'user_metadata' ->> 'role') = 'admin'
|
|
596
|
-
);
|
|
597
|
-
```
|
|
598
|
-
|
|
599
|
-
**Why dangerous:** `raw_user_meta_data` can be modified by the user through Supabase Auth client. An attacker can set `{ "role": "admin" }` and bypass security!
|
|
600
|
-
|
|
601
|
-
**Safe alternative:** Use `raw_app_meta_data` (server-only):
|
|
602
|
-
```sql
|
|
603
|
-
-- ✅ SAFE - Only server can modify app_metadata
|
|
604
|
-
CREATE POLICY "safe_policy" ON {table}
|
|
605
|
-
USING (
|
|
606
|
-
(auth.jwt() -> 'app_metadata' ->> 'role') = 'admin'
|
|
607
|
-
);
|
|
608
|
-
```
|
|
609
|
-
|
|
610
|
-
### Auth NULL Check
|
|
611
|
-
|
|
612
|
-
Always check if user is authenticated:
|
|
613
|
-
```sql
|
|
614
|
-
-- ❌ Missing NULL check
|
|
615
|
-
USING (auth.uid() = user_id) -- Fails silently for anon users
|
|
616
|
-
|
|
617
|
-
-- ✅ Explicit authentication check
|
|
618
|
-
USING (
|
|
619
|
-
(select auth.uid()) IS NOT NULL AND
|
|
620
|
-
(select auth.uid()) = user_id
|
|
621
|
-
)
|
|
622
|
-
```
|
|
623
|
-
|
|
624
|
-
### Policy Debugging
|
|
625
|
-
|
|
626
|
-
Enable RLS policies in SQL Editor (dev only):
|
|
627
|
-
```sql
|
|
628
|
-
-- Temporarily disable RLS for debugging (DANGEROUS - dev only!)
|
|
629
|
-
ALTER TABLE {table} DISABLE ROW LEVEL SECURITY;
|
|
630
|
-
|
|
631
|
-
-- Re-enable when done
|
|
632
|
-
ALTER TABLE {table} ENABLE ROW LEVEL SECURITY;
|
|
633
|
-
```
|
|
634
|
-
|
|
635
|
-
---
|
|
636
|
-
|
|
637
|
-
## Prerequisites
|
|
638
|
-
|
|
639
|
-
Table must have:
|
|
640
|
-
- `user_id UUID` column (for user-based policies)
|
|
641
|
-
- Or `tenant_id` column (for tenant-based policies)
|
|
642
|
-
- **Indexes on all policy filter columns** (critical for performance!)
|
|
643
|
-
- `CREATE INDEX idx_{table}_user_id ON {table}(user_id);`
|
|
644
|
-
|
|
645
|
-
---
|
|
646
|
-
|
|
647
|
-
## Error Handling
|
|
648
|
-
|
|
649
|
-
If policy application fails:
|
|
650
|
-
1. Check table has required columns (user_id, etc.)
|
|
651
|
-
2. Verify auth.uid() is available (Supabase)
|
|
652
|
-
3. Check for existing policies with same names
|
|
653
|
-
4. Rollback migration if needed: `*rollback`
|
|
1
|
+
# Task: Apply RLS Policy Template
|
|
2
|
+
|
|
3
|
+
**Purpose**: Install KISS or granular RLS policies on a table
|
|
4
|
+
|
|
5
|
+
**Elicit**: true
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Execution Modes
|
|
10
|
+
|
|
11
|
+
**Choose your execution mode:**
|
|
12
|
+
|
|
13
|
+
### 1. YOLO Mode - Fast, Autonomous (0-1 prompts)
|
|
14
|
+
- Autonomous decision making with logging
|
|
15
|
+
- Minimal user interaction
|
|
16
|
+
- **Best for:** Simple, deterministic tasks
|
|
17
|
+
|
|
18
|
+
### 2. Interactive Mode - Balanced, Educational (5-10 prompts) **[DEFAULT]**
|
|
19
|
+
- Explicit decision checkpoints
|
|
20
|
+
- Educational explanations
|
|
21
|
+
- **Best for:** Learning, complex decisions
|
|
22
|
+
|
|
23
|
+
### 3. Pre-Flight Planning - Comprehensive Upfront Planning
|
|
24
|
+
- Task analysis phase (identify all ambiguities)
|
|
25
|
+
- Zero ambiguity execution
|
|
26
|
+
- **Best for:** Ambiguous requirements, critical work
|
|
27
|
+
|
|
28
|
+
**Parameter:** `mode` (optional, default: `interactive`)
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Task Definition (AIOS Task Format V1.0)
|
|
33
|
+
|
|
34
|
+
```yaml
|
|
35
|
+
task: dbPolicyApply()
|
|
36
|
+
responsável: Dara (Sage)
|
|
37
|
+
responsavel_type: Agente
|
|
38
|
+
atomic_layer: Config
|
|
39
|
+
|
|
40
|
+
**Entrada:**
|
|
41
|
+
- campo: query
|
|
42
|
+
tipo: string
|
|
43
|
+
origem: User Input
|
|
44
|
+
obrigatório: true
|
|
45
|
+
validação: Valid SQL query
|
|
46
|
+
|
|
47
|
+
- campo: params
|
|
48
|
+
tipo: object
|
|
49
|
+
origem: User Input
|
|
50
|
+
obrigatório: false
|
|
51
|
+
validação: Query parameters
|
|
52
|
+
|
|
53
|
+
- campo: connection
|
|
54
|
+
tipo: object
|
|
55
|
+
origem: config
|
|
56
|
+
obrigatório: true
|
|
57
|
+
validação: Valid PostgreSQL connection via Supabase
|
|
58
|
+
|
|
59
|
+
**Saída:**
|
|
60
|
+
- campo: query_result
|
|
61
|
+
tipo: array
|
|
62
|
+
destino: Memory
|
|
63
|
+
persistido: false
|
|
64
|
+
|
|
65
|
+
- campo: records_affected
|
|
66
|
+
tipo: number
|
|
67
|
+
destino: Return value
|
|
68
|
+
persistido: false
|
|
69
|
+
|
|
70
|
+
- campo: execution_time
|
|
71
|
+
tipo: number
|
|
72
|
+
destino: Memory
|
|
73
|
+
persistido: false
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Pre-Conditions
|
|
79
|
+
|
|
80
|
+
**Purpose:** Validate prerequisites BEFORE task execution (blocking)
|
|
81
|
+
|
|
82
|
+
**Checklist:**
|
|
83
|
+
|
|
84
|
+
```yaml
|
|
85
|
+
pre-conditions:
|
|
86
|
+
- [ ] Database connection established; query syntax valid
|
|
87
|
+
tipo: pre-condition
|
|
88
|
+
blocker: true
|
|
89
|
+
validação: |
|
|
90
|
+
Check database connection established; query syntax valid
|
|
91
|
+
error_message: "Pre-condition failed: Database connection established; query syntax valid"
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Post-Conditions
|
|
97
|
+
|
|
98
|
+
**Purpose:** Validate execution success AFTER task completes
|
|
99
|
+
|
|
100
|
+
**Checklist:**
|
|
101
|
+
|
|
102
|
+
```yaml
|
|
103
|
+
post-conditions:
|
|
104
|
+
- [ ] Query executed; results returned; transaction committed
|
|
105
|
+
tipo: post-condition
|
|
106
|
+
blocker: true
|
|
107
|
+
validação: |
|
|
108
|
+
Verify query executed; results returned; transaction committed
|
|
109
|
+
error_message: "Post-condition failed: Query executed; results returned; transaction committed"
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Acceptance Criteria
|
|
115
|
+
|
|
116
|
+
**Purpose:** Definitive pass/fail criteria for task completion
|
|
117
|
+
|
|
118
|
+
**Checklist:**
|
|
119
|
+
|
|
120
|
+
```yaml
|
|
121
|
+
acceptance-criteria:
|
|
122
|
+
- [ ] Data persisted correctly; constraints respected; no orphaned data
|
|
123
|
+
tipo: acceptance-criterion
|
|
124
|
+
blocker: true
|
|
125
|
+
validação: |
|
|
126
|
+
Assert data persisted correctly; constraints respected; no orphaned data
|
|
127
|
+
error_message: "Acceptance criterion not met: Data persisted correctly; constraints respected; no orphaned data"
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Tools
|
|
133
|
+
|
|
134
|
+
**External/shared resources used by this task:**
|
|
135
|
+
|
|
136
|
+
- **Tool:** neo4j-driver
|
|
137
|
+
- **Purpose:** Neo4j database connection and query execution
|
|
138
|
+
- **Source:** npm: neo4j-driver
|
|
139
|
+
|
|
140
|
+
- **Tool:** query-validator
|
|
141
|
+
- **Purpose:** Cypher query syntax validation
|
|
142
|
+
- **Source:** .aios-core/utils/db-query-validator.js
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Scripts
|
|
147
|
+
|
|
148
|
+
**Agent-specific code for this task:**
|
|
149
|
+
|
|
150
|
+
- **Script:** db-query.js
|
|
151
|
+
- **Purpose:** Execute Neo4j queries with error handling
|
|
152
|
+
- **Language:** JavaScript
|
|
153
|
+
- **Location:** .aios-core/scripts/db-query.js
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Error Handling
|
|
158
|
+
|
|
159
|
+
**Strategy:** abort
|
|
160
|
+
|
|
161
|
+
**Common Errors:**
|
|
162
|
+
|
|
163
|
+
1. **Error:** Connection Failed
|
|
164
|
+
- **Cause:** Unable to connect to Neo4j database
|
|
165
|
+
- **Resolution:** Check connection string, credentials, network
|
|
166
|
+
- **Recovery:** Retry with exponential backoff (max 3 attempts)
|
|
167
|
+
|
|
168
|
+
2. **Error:** Query Syntax Error
|
|
169
|
+
- **Cause:** Invalid Cypher query syntax
|
|
170
|
+
- **Resolution:** Validate query syntax before execution
|
|
171
|
+
- **Recovery:** Return detailed syntax error, suggest fix
|
|
172
|
+
|
|
173
|
+
3. **Error:** Transaction Rollback
|
|
174
|
+
- **Cause:** Query violates constraints or timeout
|
|
175
|
+
- **Resolution:** Review query logic and constraints
|
|
176
|
+
- **Recovery:** Automatic rollback, preserve data integrity
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Performance
|
|
181
|
+
|
|
182
|
+
**Expected Metrics:**
|
|
183
|
+
|
|
184
|
+
```yaml
|
|
185
|
+
duration_expected: 2-10 min (estimated)
|
|
186
|
+
cost_estimated: $0.001-0.008
|
|
187
|
+
token_usage: ~800-2,500 tokens
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Optimization Notes:**
|
|
191
|
+
- Validate configuration early; use atomic writes; implement rollback checkpoints
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Metadata
|
|
196
|
+
|
|
197
|
+
```yaml
|
|
198
|
+
story: N/A
|
|
199
|
+
version: 1.0.0
|
|
200
|
+
dependencies:
|
|
201
|
+
- N/A
|
|
202
|
+
tags:
|
|
203
|
+
- database
|
|
204
|
+
- infrastructure
|
|
205
|
+
updated_at: 2025-11-17
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
## 🚀 NEW: Use Automated RLS Policy Installer (RECOMMENDED)
|
|
212
|
+
|
|
213
|
+
**Token Savings: 89% | Time Savings: ~85%**
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
# Use the rls-policy-installer script
|
|
217
|
+
./Squads/super-agentes/scripts/database-operations/rls-policy-installer.sh {table} {mode}
|
|
218
|
+
|
|
219
|
+
# Examples:
|
|
220
|
+
./Squads/super-agentes/scripts/database-operations/rls-policy-installer.sh minds kiss
|
|
221
|
+
./Squads/super-agentes/scripts/database-operations/rls-policy-installer.sh sources read-only
|
|
222
|
+
./Squads/super-agentes/scripts/database-operations/rls-policy-installer.sh fragments private
|
|
223
|
+
|
|
224
|
+
# Available modes: kiss, read-only, private, team, custom
|
|
225
|
+
|
|
226
|
+
# Benefits:
|
|
227
|
+
# - Standardized policy templates
|
|
228
|
+
# - Automatic testing after installation
|
|
229
|
+
# - Safety checks for existing policies
|
|
230
|
+
# - 89% token savings
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**OR continue with manual policy installation below:**
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## Inputs
|
|
238
|
+
|
|
239
|
+
- `table` (string): Table name to apply policy to
|
|
240
|
+
- `mode` (string): 'kiss' or 'granular' - policy type
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Process (Manual Method)
|
|
245
|
+
|
|
246
|
+
### 1. Validate Inputs
|
|
247
|
+
|
|
248
|
+
Check table exists and mode is valid:
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
echo "Validating inputs..."
|
|
252
|
+
|
|
253
|
+
# Check table exists
|
|
254
|
+
psql "$SUPABASE_DB_URL" -c \
|
|
255
|
+
"SELECT EXISTS (
|
|
256
|
+
SELECT 1 FROM information_schema.tables
|
|
257
|
+
WHERE table_schema = 'public' AND table_name = '{table}'
|
|
258
|
+
);" | grep -q t || {
|
|
259
|
+
echo "❌ Table '{table}' not found"
|
|
260
|
+
exit 1
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
# Check mode
|
|
264
|
+
if [[ "{mode}" != "kiss" && "{mode}" != "granular" ]]; then
|
|
265
|
+
echo "❌ Invalid mode: {mode}"
|
|
266
|
+
echo " Use 'kiss' or 'granular'"
|
|
267
|
+
exit 1
|
|
268
|
+
fi
|
|
269
|
+
|
|
270
|
+
echo "✓ Table exists: {table}"
|
|
271
|
+
echo "✓ Mode: {mode}"
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### 2. Check Existing Policies
|
|
275
|
+
|
|
276
|
+
Display current RLS status:
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
echo "Checking existing RLS policies..."
|
|
280
|
+
|
|
281
|
+
psql "$SUPABASE_DB_URL" << EOF
|
|
282
|
+
SELECT
|
|
283
|
+
schemaname,
|
|
284
|
+
tablename,
|
|
285
|
+
policyname,
|
|
286
|
+
permissive,
|
|
287
|
+
roles,
|
|
288
|
+
cmd,
|
|
289
|
+
qual,
|
|
290
|
+
with_check
|
|
291
|
+
FROM pg_policies
|
|
292
|
+
WHERE tablename = '{table}';
|
|
293
|
+
EOF
|
|
294
|
+
|
|
295
|
+
echo ""
|
|
296
|
+
echo "RLS enabled on {table}?"
|
|
297
|
+
psql "$SUPABASE_DB_URL" -c \
|
|
298
|
+
"SELECT relrowsecurity FROM pg_class WHERE relname = '{table}';" \
|
|
299
|
+
| grep -q t && echo "✓ Yes" || echo "⚠️ No (will be enabled)"
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### 3. Ask User Confirmation
|
|
303
|
+
|
|
304
|
+
Present policy that will be applied based on mode:
|
|
305
|
+
|
|
306
|
+
**If mode = 'kiss':**
|
|
307
|
+
```
|
|
308
|
+
Will apply KISS policy to {table}:
|
|
309
|
+
- Enable RLS
|
|
310
|
+
- Single policy: users can only access their own rows
|
|
311
|
+
- Uses: (select auth.uid()) = user_id [PERFORMANCE OPTIMIZED]
|
|
312
|
+
- Applies to: SELECT, INSERT, UPDATE, DELETE
|
|
313
|
+
|
|
314
|
+
⚠️ CRITICAL PERFORMANCE NOTE:
|
|
315
|
+
Wrapping auth.uid() in SELECT provides 99.99% performance improvement
|
|
316
|
+
by allowing PostgreSQL to cache the function result.
|
|
317
|
+
|
|
318
|
+
Continue? (yes/no)
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
**If mode = 'granular':**
|
|
322
|
+
```
|
|
323
|
+
Will apply granular policies to {table}:
|
|
324
|
+
- Enable RLS
|
|
325
|
+
- Separate policies for each operation (SELECT, INSERT, UPDATE, DELETE)
|
|
326
|
+
- Fine-grained control
|
|
327
|
+
- Uses: auth.uid() = user_id
|
|
328
|
+
|
|
329
|
+
Continue? (yes/no)
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
Get confirmation before proceeding.
|
|
333
|
+
|
|
334
|
+
### 4. Generate Policy SQL
|
|
335
|
+
|
|
336
|
+
Based on mode, generate appropriate SQL:
|
|
337
|
+
|
|
338
|
+
**KISS Mode:**
|
|
339
|
+
```sql
|
|
340
|
+
-- Enable RLS
|
|
341
|
+
ALTER TABLE {table} ENABLE ROW LEVEL SECURITY;
|
|
342
|
+
|
|
343
|
+
-- Drop existing policies (if any)
|
|
344
|
+
DROP POLICY IF EXISTS "{table}_policy" ON {table};
|
|
345
|
+
|
|
346
|
+
-- Create single KISS policy (PERFORMANCE OPTIMIZED)
|
|
347
|
+
CREATE POLICY "{table}_policy"
|
|
348
|
+
ON {table}
|
|
349
|
+
FOR ALL
|
|
350
|
+
TO authenticated
|
|
351
|
+
USING (
|
|
352
|
+
-- ✅ CRITICAL: Wrap auth.uid() in SELECT for 99.99% performance gain
|
|
353
|
+
-- This allows PostgreSQL to cache the function result per statement
|
|
354
|
+
(select auth.uid()) IS NOT NULL AND
|
|
355
|
+
(select auth.uid()) = user_id
|
|
356
|
+
)
|
|
357
|
+
WITH CHECK (
|
|
358
|
+
(select auth.uid()) IS NOT NULL AND
|
|
359
|
+
(select auth.uid()) = user_id
|
|
360
|
+
);
|
|
361
|
+
|
|
362
|
+
-- Add helpful comment
|
|
363
|
+
COMMENT ON POLICY "{table}_policy" ON {table} IS
|
|
364
|
+
'KISS policy: users can only access their own rows (performance optimized with cached auth.uid())';
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
**Granular Mode (PERFORMANCE OPTIMIZED):**
|
|
368
|
+
```sql
|
|
369
|
+
-- Enable RLS
|
|
370
|
+
ALTER TABLE {table} ENABLE ROW LEVEL SECURITY;
|
|
371
|
+
|
|
372
|
+
-- Drop existing policies (if any)
|
|
373
|
+
DROP POLICY IF EXISTS "{table}_select" ON {table};
|
|
374
|
+
DROP POLICY IF EXISTS "{table}_insert" ON {table};
|
|
375
|
+
DROP POLICY IF EXISTS "{table}_update" ON {table};
|
|
376
|
+
DROP POLICY IF EXISTS "{table}_delete" ON {table};
|
|
377
|
+
|
|
378
|
+
-- SELECT: Users read own rows
|
|
379
|
+
-- ✅ Wrapping auth.uid() in SELECT provides 99.99% performance improvement
|
|
380
|
+
CREATE POLICY "{table}_select"
|
|
381
|
+
ON {table}
|
|
382
|
+
FOR SELECT
|
|
383
|
+
TO authenticated
|
|
384
|
+
USING (
|
|
385
|
+
(select auth.uid()) IS NOT NULL AND
|
|
386
|
+
(select auth.uid()) = user_id
|
|
387
|
+
);
|
|
388
|
+
|
|
389
|
+
-- INSERT: Users create own rows
|
|
390
|
+
CREATE POLICY "{table}_insert"
|
|
391
|
+
ON {table}
|
|
392
|
+
FOR INSERT
|
|
393
|
+
TO authenticated
|
|
394
|
+
WITH CHECK (
|
|
395
|
+
(select auth.uid()) IS NOT NULL AND
|
|
396
|
+
(select auth.uid()) = user_id
|
|
397
|
+
);
|
|
398
|
+
|
|
399
|
+
-- UPDATE: Users update own rows
|
|
400
|
+
CREATE POLICY "{table}_update"
|
|
401
|
+
ON {table}
|
|
402
|
+
FOR UPDATE
|
|
403
|
+
TO authenticated
|
|
404
|
+
USING (
|
|
405
|
+
(select auth.uid()) IS NOT NULL AND
|
|
406
|
+
(select auth.uid()) = user_id
|
|
407
|
+
)
|
|
408
|
+
WITH CHECK (
|
|
409
|
+
(select auth.uid()) IS NOT NULL AND
|
|
410
|
+
(select auth.uid()) = user_id
|
|
411
|
+
);
|
|
412
|
+
|
|
413
|
+
-- DELETE: Users delete own rows
|
|
414
|
+
CREATE POLICY "{table}_delete"
|
|
415
|
+
ON {table}
|
|
416
|
+
FOR DELETE
|
|
417
|
+
TO authenticated
|
|
418
|
+
USING (
|
|
419
|
+
(select auth.uid()) IS NOT NULL AND
|
|
420
|
+
(select auth.uid()) = user_id
|
|
421
|
+
);
|
|
422
|
+
|
|
423
|
+
-- Add helpful comments
|
|
424
|
+
COMMENT ON POLICY "{table}_select" ON {table} IS 'Users can read own rows (cached auth.uid())';
|
|
425
|
+
COMMENT ON POLICY "{table}_insert" ON {table} IS 'Users can insert own rows (cached auth.uid())';
|
|
426
|
+
COMMENT ON POLICY "{table}_update" ON {table} IS 'Users can update own rows (cached auth.uid())';
|
|
427
|
+
COMMENT ON POLICY "{table}_delete" ON {table} IS 'Users can delete own rows (cached auth.uid())';
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
### 5. Create Migration File
|
|
431
|
+
|
|
432
|
+
Save policy SQL to migration file:
|
|
433
|
+
|
|
434
|
+
```bash
|
|
435
|
+
TS=$(date +%Y%m%d%H%M%S)
|
|
436
|
+
MIGRATION_FILE="supabase/migrations/${TS}_rls_${mode}__{table}.sql"
|
|
437
|
+
|
|
438
|
+
mkdir -p supabase/migrations
|
|
439
|
+
|
|
440
|
+
cat > "$MIGRATION_FILE" << 'EOF'
|
|
441
|
+
-- Migration: Apply {mode} RLS policy to {table}
|
|
442
|
+
-- Generated: $(date -u +"%Y-%m-%d %H:%M:%S UTC")
|
|
443
|
+
-- Table: {table}
|
|
444
|
+
-- Mode: {mode}
|
|
445
|
+
|
|
446
|
+
BEGIN;
|
|
447
|
+
|
|
448
|
+
[... SQL from step 4 ...]
|
|
449
|
+
|
|
450
|
+
COMMIT;
|
|
451
|
+
EOF
|
|
452
|
+
|
|
453
|
+
echo "✓ Migration created: $MIGRATION_FILE"
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
### 6. Apply Migration
|
|
457
|
+
|
|
458
|
+
Use existing db-apply-migration task:
|
|
459
|
+
|
|
460
|
+
```bash
|
|
461
|
+
echo "Applying migration..."
|
|
462
|
+
# Execute db-apply-migration task internally
|
|
463
|
+
# (This will create snapshots, apply, verify)
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### 7. Test Policies
|
|
467
|
+
|
|
468
|
+
Verify policies work correctly:
|
|
469
|
+
|
|
470
|
+
```bash
|
|
471
|
+
echo "Testing RLS policies..."
|
|
472
|
+
|
|
473
|
+
# Test 1: Anonymous user should see nothing
|
|
474
|
+
psql "$SUPABASE_DB_URL" << EOF
|
|
475
|
+
SET ROLE anon;
|
|
476
|
+
SELECT COUNT(*) AS anon_count FROM {table};
|
|
477
|
+
RESET ROLE;
|
|
478
|
+
EOF
|
|
479
|
+
|
|
480
|
+
# Test 2: Authenticated user should see only their rows
|
|
481
|
+
# (Requires setting up test user - provide instructions)
|
|
482
|
+
|
|
483
|
+
echo ""
|
|
484
|
+
echo "✓ Policy tests complete"
|
|
485
|
+
echo " ⚠️ Manual testing recommended:"
|
|
486
|
+
echo " - Use *impersonate to test as specific user"
|
|
487
|
+
echo " - Verify each operation (SELECT, INSERT, UPDATE, DELETE)"
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
---
|
|
491
|
+
|
|
492
|
+
## Output
|
|
493
|
+
|
|
494
|
+
Display summary:
|
|
495
|
+
```
|
|
496
|
+
✅ RLS POLICY APPLIED
|
|
497
|
+
|
|
498
|
+
Table: {table}
|
|
499
|
+
Mode: {mode}
|
|
500
|
+
Migration: supabase/migrations/{TS}_rls_{mode}__{table}.sql
|
|
501
|
+
Policies: [list created policies]
|
|
502
|
+
|
|
503
|
+
Next steps:
|
|
504
|
+
1. Test policies manually: *impersonate {user_id}
|
|
505
|
+
2. Run RLS audit: *rls-audit
|
|
506
|
+
3. Update documentation
|
|
507
|
+
4. Commit migration to git
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
---
|
|
511
|
+
|
|
512
|
+
## Notes
|
|
513
|
+
|
|
514
|
+
### KISS vs Granular
|
|
515
|
+
|
|
516
|
+
**KISS** (Keep It Simple, Stupid):
|
|
517
|
+
- ✅ Single policy for all operations
|
|
518
|
+
- ✅ Easier to understand
|
|
519
|
+
- ✅ Less verbose
|
|
520
|
+
- ❌ Less flexible
|
|
521
|
+
|
|
522
|
+
**Granular**:
|
|
523
|
+
- ✅ Separate policies per operation
|
|
524
|
+
- ✅ Fine-grained control
|
|
525
|
+
- ✅ Can have different logic per operation
|
|
526
|
+
- ❌ More verbose
|
|
527
|
+
|
|
528
|
+
### Common Patterns
|
|
529
|
+
|
|
530
|
+
**Public Read, Authenticated Write (Performance Optimized):**
|
|
531
|
+
```sql
|
|
532
|
+
-- SELECT: Public
|
|
533
|
+
CREATE POLICY "{table}_select" ON {table}
|
|
534
|
+
FOR SELECT TO public
|
|
535
|
+
USING (true);
|
|
536
|
+
|
|
537
|
+
-- INSERT/UPDATE/DELETE: Authenticated users only
|
|
538
|
+
CREATE POLICY "{table}_write" ON {table}
|
|
539
|
+
FOR ALL TO authenticated
|
|
540
|
+
USING (
|
|
541
|
+
(select auth.uid()) IS NOT NULL AND
|
|
542
|
+
(select auth.uid()) = user_id
|
|
543
|
+
)
|
|
544
|
+
WITH CHECK (
|
|
545
|
+
(select auth.uid()) IS NOT NULL AND
|
|
546
|
+
(select auth.uid()) = user_id
|
|
547
|
+
);
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
**Tenant-Based (Performance Optimized):**
|
|
551
|
+
```sql
|
|
552
|
+
CREATE POLICY "{table}_tenant" ON {table}
|
|
553
|
+
FOR ALL TO authenticated
|
|
554
|
+
USING (
|
|
555
|
+
(select auth.uid()) IS NOT NULL AND
|
|
556
|
+
tenant_id IN (
|
|
557
|
+
SELECT tenant_id FROM user_tenants
|
|
558
|
+
WHERE user_id = (select auth.uid())
|
|
559
|
+
)
|
|
560
|
+
);
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
### Performance Tips
|
|
564
|
+
|
|
565
|
+
**Critical Performance Optimization:**
|
|
566
|
+
Always wrap `auth.uid()` in a `SELECT` statement:
|
|
567
|
+
```sql
|
|
568
|
+
-- ❌ SLOW (99.99% slower)
|
|
569
|
+
USING (auth.uid() = user_id)
|
|
570
|
+
|
|
571
|
+
-- ✅ FAST (cached per statement)
|
|
572
|
+
USING ((select auth.uid()) = user_id)
|
|
573
|
+
```
|
|
574
|
+
|
|
575
|
+
**Why it matters:**
|
|
576
|
+
- Without SELECT: PostgreSQL calls `auth.uid()` for EVERY row
|
|
577
|
+
- With SELECT: PostgreSQL caches the result for the entire statement
|
|
578
|
+
- Performance improvement: **99.99%** (essentially 10,000x faster on large tables)
|
|
579
|
+
|
|
580
|
+
**Index Recommendations:**
|
|
581
|
+
- Always index columns used in policies (e.g., `user_id`, `tenant_id`)
|
|
582
|
+
- Example: `CREATE INDEX idx_{table}_user_id ON {table}(user_id);`
|
|
583
|
+
- Performance improvement: **99.94%** when combined with wrapped auth functions
|
|
584
|
+
|
|
585
|
+
---
|
|
586
|
+
|
|
587
|
+
## Security Warnings ⚠️
|
|
588
|
+
|
|
589
|
+
### CRITICAL: Do NOT Use raw_user_meta_data in Policies
|
|
590
|
+
|
|
591
|
+
```sql
|
|
592
|
+
-- ❌ DANGEROUS - User can modify this data!
|
|
593
|
+
CREATE POLICY "bad_policy" ON {table}
|
|
594
|
+
USING (
|
|
595
|
+
(auth.jwt() -> 'user_metadata' ->> 'role') = 'admin'
|
|
596
|
+
);
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
**Why dangerous:** `raw_user_meta_data` can be modified by the user through Supabase Auth client. An attacker can set `{ "role": "admin" }` and bypass security!
|
|
600
|
+
|
|
601
|
+
**Safe alternative:** Use `raw_app_meta_data` (server-only):
|
|
602
|
+
```sql
|
|
603
|
+
-- ✅ SAFE - Only server can modify app_metadata
|
|
604
|
+
CREATE POLICY "safe_policy" ON {table}
|
|
605
|
+
USING (
|
|
606
|
+
(auth.jwt() -> 'app_metadata' ->> 'role') = 'admin'
|
|
607
|
+
);
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
### Auth NULL Check
|
|
611
|
+
|
|
612
|
+
Always check if user is authenticated:
|
|
613
|
+
```sql
|
|
614
|
+
-- ❌ Missing NULL check
|
|
615
|
+
USING (auth.uid() = user_id) -- Fails silently for anon users
|
|
616
|
+
|
|
617
|
+
-- ✅ Explicit authentication check
|
|
618
|
+
USING (
|
|
619
|
+
(select auth.uid()) IS NOT NULL AND
|
|
620
|
+
(select auth.uid()) = user_id
|
|
621
|
+
)
|
|
622
|
+
```
|
|
623
|
+
|
|
624
|
+
### Policy Debugging
|
|
625
|
+
|
|
626
|
+
Enable RLS policies in SQL Editor (dev only):
|
|
627
|
+
```sql
|
|
628
|
+
-- Temporarily disable RLS for debugging (DANGEROUS - dev only!)
|
|
629
|
+
ALTER TABLE {table} DISABLE ROW LEVEL SECURITY;
|
|
630
|
+
|
|
631
|
+
-- Re-enable when done
|
|
632
|
+
ALTER TABLE {table} ENABLE ROW LEVEL SECURITY;
|
|
633
|
+
```
|
|
634
|
+
|
|
635
|
+
---
|
|
636
|
+
|
|
637
|
+
## Prerequisites
|
|
638
|
+
|
|
639
|
+
Table must have:
|
|
640
|
+
- `user_id UUID` column (for user-based policies)
|
|
641
|
+
- Or `tenant_id` column (for tenant-based policies)
|
|
642
|
+
- **Indexes on all policy filter columns** (critical for performance!)
|
|
643
|
+
- `CREATE INDEX idx_{table}_user_id ON {table}(user_id);`
|
|
644
|
+
|
|
645
|
+
---
|
|
646
|
+
|
|
647
|
+
## Error Handling
|
|
648
|
+
|
|
649
|
+
If policy application fails:
|
|
650
|
+
1. Check table has required columns (user_id, etc.)
|
|
651
|
+
2. Verify auth.uid() is available (Supabase)
|
|
652
|
+
3. Check for existing policies with same names
|
|
653
|
+
4. Rollback migration if needed: `*rollback`
|