aios-core 2.1.6 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.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 +702 -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 -10
- 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/.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,621 +1,621 @@
|
|
|
1
|
-
# Task: Test As User (RLS Testing)
|
|
2
|
-
|
|
3
|
-
**Purpose**: Emulate authenticated user for RLS policy testing
|
|
4
|
-
|
|
5
|
-
**Elicit**: true
|
|
6
|
-
|
|
7
|
-
**Renamed From (Story 6.1.2.3):**
|
|
8
|
-
- `db-impersonate.md` - Clearer name for RLS testing purpose
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Execution Modes
|
|
13
|
-
|
|
14
|
-
**Choose your execution mode:**
|
|
15
|
-
|
|
16
|
-
### 1. YOLO Mode - Fast, Autonomous (0-1 prompts)
|
|
17
|
-
- Autonomous decision making with logging
|
|
18
|
-
- Minimal user interaction
|
|
19
|
-
- **Best for:** Simple, deterministic tasks
|
|
20
|
-
|
|
21
|
-
### 2. Interactive Mode - Balanced, Educational (5-10 prompts) **[DEFAULT]**
|
|
22
|
-
- Explicit decision checkpoints
|
|
23
|
-
- Educational explanations
|
|
24
|
-
- **Best for:** Learning, complex decisions
|
|
25
|
-
|
|
26
|
-
### 3. Pre-Flight Planning - Comprehensive Upfront Planning
|
|
27
|
-
- Task analysis phase (identify all ambiguities)
|
|
28
|
-
- Zero ambiguity execution
|
|
29
|
-
- **Best for:** Ambiguous requirements, critical work
|
|
30
|
-
|
|
31
|
-
**Parameter:** `mode` (optional, default: `interactive`)
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## Task Definition (AIOS Task Format V1.0)
|
|
36
|
-
|
|
37
|
-
```yaml
|
|
38
|
-
task: testAsUser()
|
|
39
|
-
responsável: Quinn (Guardian)
|
|
40
|
-
responsavel_type: Agente
|
|
41
|
-
atomic_layer: Config
|
|
42
|
-
|
|
43
|
-
**Entrada:**
|
|
44
|
-
- campo: task
|
|
45
|
-
tipo: string
|
|
46
|
-
origem: User Input
|
|
47
|
-
obrigatório: true
|
|
48
|
-
validação: Must be registered task
|
|
49
|
-
|
|
50
|
-
- campo: parameters
|
|
51
|
-
tipo: object
|
|
52
|
-
origem: User Input
|
|
53
|
-
obrigatório: false
|
|
54
|
-
validação: Valid task parameters
|
|
55
|
-
|
|
56
|
-
- campo: mode
|
|
57
|
-
tipo: string
|
|
58
|
-
origem: User Input
|
|
59
|
-
obrigatório: false
|
|
60
|
-
validação: yolo|interactive|pre-flight
|
|
61
|
-
|
|
62
|
-
**Saída:**
|
|
63
|
-
- campo: execution_result
|
|
64
|
-
tipo: object
|
|
65
|
-
destino: Memory
|
|
66
|
-
persistido: false
|
|
67
|
-
|
|
68
|
-
- campo: logs
|
|
69
|
-
tipo: array
|
|
70
|
-
destino: File (.ai/logs/*)
|
|
71
|
-
persistido: true
|
|
72
|
-
|
|
73
|
-
- campo: state
|
|
74
|
-
tipo: object
|
|
75
|
-
destino: State management
|
|
76
|
-
persistido: true
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
## Pre-Conditions
|
|
82
|
-
|
|
83
|
-
**Purpose:** Validate prerequisites BEFORE task execution (blocking)
|
|
84
|
-
|
|
85
|
-
**Checklist:**
|
|
86
|
-
|
|
87
|
-
```yaml
|
|
88
|
-
pre-conditions:
|
|
89
|
-
- [ ] Task is registered; required parameters provided; dependencies met
|
|
90
|
-
tipo: pre-condition
|
|
91
|
-
blocker: true
|
|
92
|
-
validação: |
|
|
93
|
-
Check task is registered; required parameters provided; dependencies met
|
|
94
|
-
error_message: "Pre-condition failed: Task is registered; required parameters provided; dependencies met"
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
---
|
|
98
|
-
|
|
99
|
-
## Post-Conditions
|
|
100
|
-
|
|
101
|
-
**Purpose:** Validate execution success AFTER task completes
|
|
102
|
-
|
|
103
|
-
**Checklist:**
|
|
104
|
-
|
|
105
|
-
```yaml
|
|
106
|
-
post-conditions:
|
|
107
|
-
- [ ] Task completed; exit code 0; expected outputs created
|
|
108
|
-
tipo: post-condition
|
|
109
|
-
blocker: true
|
|
110
|
-
validação: |
|
|
111
|
-
Verify task completed; exit code 0; expected outputs created
|
|
112
|
-
error_message: "Post-condition failed: Task completed; exit code 0; expected outputs created"
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
---
|
|
116
|
-
|
|
117
|
-
## Acceptance Criteria
|
|
118
|
-
|
|
119
|
-
**Purpose:** Definitive pass/fail criteria for task completion
|
|
120
|
-
|
|
121
|
-
**Checklist:**
|
|
122
|
-
|
|
123
|
-
```yaml
|
|
124
|
-
acceptance-criteria:
|
|
125
|
-
- [ ] Task completed as expected; side effects documented
|
|
126
|
-
tipo: acceptance-criterion
|
|
127
|
-
blocker: true
|
|
128
|
-
validação: |
|
|
129
|
-
Assert task completed as expected; side effects documented
|
|
130
|
-
error_message: "Acceptance criterion not met: Task completed as expected; side effects documented"
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
---
|
|
134
|
-
|
|
135
|
-
## Tools
|
|
136
|
-
|
|
137
|
-
**External/shared resources used by this task:**
|
|
138
|
-
|
|
139
|
-
- **Tool:** task-runner
|
|
140
|
-
- **Purpose:** Task execution and orchestration
|
|
141
|
-
- **Source:** .aios-core/core/task-runner.js
|
|
142
|
-
|
|
143
|
-
- **Tool:** logger
|
|
144
|
-
- **Purpose:** Execution logging and error tracking
|
|
145
|
-
- **Source:** .aios-core/utils/logger.js
|
|
146
|
-
|
|
147
|
-
---
|
|
148
|
-
|
|
149
|
-
## Scripts
|
|
150
|
-
|
|
151
|
-
**Agent-specific code for this task:**
|
|
152
|
-
|
|
153
|
-
- **Script:** execute-task.js
|
|
154
|
-
- **Purpose:** Generic task execution wrapper
|
|
155
|
-
- **Language:** JavaScript
|
|
156
|
-
- **Location:** .aios-core/scripts/execute-task.js
|
|
157
|
-
|
|
158
|
-
---
|
|
159
|
-
|
|
160
|
-
## Error Handling
|
|
161
|
-
|
|
162
|
-
**Strategy:** retry
|
|
163
|
-
|
|
164
|
-
**Common Errors:**
|
|
165
|
-
|
|
166
|
-
1. **Error:** Task Not Found
|
|
167
|
-
- **Cause:** Specified task not registered in system
|
|
168
|
-
- **Resolution:** Verify task name and registration
|
|
169
|
-
- **Recovery:** List available tasks, suggest similar
|
|
170
|
-
|
|
171
|
-
2. **Error:** Invalid Parameters
|
|
172
|
-
- **Cause:** Task parameters do not match expected schema
|
|
173
|
-
- **Resolution:** Validate parameters against task definition
|
|
174
|
-
- **Recovery:** Provide parameter template, reject execution
|
|
175
|
-
|
|
176
|
-
3. **Error:** Execution Timeout
|
|
177
|
-
- **Cause:** Task exceeds maximum execution time
|
|
178
|
-
- **Resolution:** Optimize task or increase timeout
|
|
179
|
-
- **Recovery:** Kill task, cleanup resources, log state
|
|
180
|
-
|
|
181
|
-
---
|
|
182
|
-
|
|
183
|
-
## Performance
|
|
184
|
-
|
|
185
|
-
**Expected Metrics:**
|
|
186
|
-
|
|
187
|
-
```yaml
|
|
188
|
-
duration_expected: 2-10 min (estimated)
|
|
189
|
-
cost_estimated: $0.001-0.008
|
|
190
|
-
token_usage: ~800-2,500 tokens
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
**Optimization Notes:**
|
|
194
|
-
- Validate configuration early; use atomic writes; implement rollback checkpoints
|
|
195
|
-
|
|
196
|
-
---
|
|
197
|
-
|
|
198
|
-
## Metadata
|
|
199
|
-
|
|
200
|
-
```yaml
|
|
201
|
-
story: N/A
|
|
202
|
-
version: 1.0.0
|
|
203
|
-
dependencies:
|
|
204
|
-
- N/A
|
|
205
|
-
tags:
|
|
206
|
-
- automation
|
|
207
|
-
- workflow
|
|
208
|
-
updated_at: 2025-11-17
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
## Inputs
|
|
215
|
-
|
|
216
|
-
**Required:**
|
|
217
|
-
- `user_id` (uuid): User ID to emulate
|
|
218
|
-
|
|
219
|
-
**Optional:**
|
|
220
|
-
- `role` (text): Role to test (default: 'authenticated')
|
|
221
|
-
|
|
222
|
-
---
|
|
223
|
-
|
|
224
|
-
## Elicitation
|
|
225
|
-
|
|
226
|
-
**Prompt user:**
|
|
227
|
-
|
|
228
|
-
```
|
|
229
|
-
=== RLS Policy Testing ===
|
|
230
|
-
|
|
231
|
-
Enter user ID to emulate:
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
**Capture:** `{user_id}`
|
|
235
|
-
|
|
236
|
-
```
|
|
237
|
-
Enter role (default: authenticated):
|
|
238
|
-
Options: authenticated, anon, service_role
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
**Capture:** `{role}` (default: 'authenticated')
|
|
242
|
-
|
|
243
|
-
```
|
|
244
|
-
What are you testing?
|
|
245
|
-
(e.g., "User can only read own posts", "Admin can see all data")
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
**Capture:** `{test_purpose}`
|
|
249
|
-
|
|
250
|
-
**CRITICAL WARNING:** Display warning:
|
|
251
|
-
```
|
|
252
|
-
⚠️ WARNING: This is for RLS testing only!
|
|
253
|
-
- Never use in production application code
|
|
254
|
-
- Session claims are temporary (current session only)
|
|
255
|
-
- Use service_role key with extreme caution
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
**Confirm:** User acknowledges warning (y/n)
|
|
259
|
-
|
|
260
|
-
---
|
|
261
|
-
|
|
262
|
-
## Process
|
|
263
|
-
|
|
264
|
-
### Step 1: Set Session Claims
|
|
265
|
-
|
|
266
|
-
```bash
|
|
267
|
-
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 <<SQL
|
|
268
|
-
\echo '=== Setting Session Claims ==='
|
|
269
|
-
\echo ''
|
|
270
|
-
\echo 'User ID: {user_id}'
|
|
271
|
-
\echo 'Role: {role}'
|
|
272
|
-
\echo 'Purpose: {test_purpose}'
|
|
273
|
-
\echo ''
|
|
274
|
-
|
|
275
|
-
-- Set JWT claims for current session
|
|
276
|
-
SELECT
|
|
277
|
-
set_config('request.jwt.claims',
|
|
278
|
-
jsonb_build_object(
|
|
279
|
-
'sub', '{user_id}',
|
|
280
|
-
'role', '{role}',
|
|
281
|
-
'email', 'test-user@example.com'
|
|
282
|
-
)::text,
|
|
283
|
-
true
|
|
284
|
-
) AS jwt_claims_set;
|
|
285
|
-
|
|
286
|
-
-- Set individual claim for auth.uid() function
|
|
287
|
-
SELECT
|
|
288
|
-
set_config('request.jwt.claim.sub', '{user_id}', true) AS user_id_set,
|
|
289
|
-
set_config('role', '{role}', true) AS role_set;
|
|
290
|
-
|
|
291
|
-
\echo ''
|
|
292
|
-
\echo '=== Verification ==='
|
|
293
|
-
|
|
294
|
-
-- Verify settings
|
|
295
|
-
SELECT
|
|
296
|
-
current_setting('request.jwt.claims', true) AS jwt_claims,
|
|
297
|
-
current_setting('request.jwt.claim.sub', true) AS user_id,
|
|
298
|
-
current_setting('role', true) AS role,
|
|
299
|
-
auth.uid() AS auth_uid_function;
|
|
300
|
-
|
|
301
|
-
\echo ''
|
|
302
|
-
\echo '✓ Session configured for user: {user_id}'
|
|
303
|
-
\echo ''
|
|
304
|
-
|
|
305
|
-
SQL
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
### Step 2: Test Query Examples
|
|
309
|
-
|
|
310
|
-
**Provide user with test query templates:**
|
|
311
|
-
|
|
312
|
-
```sql
|
|
313
|
-
-- Example 1: Test SELECT access (users table)
|
|
314
|
-
SELECT id, email, created_at
|
|
315
|
-
FROM users
|
|
316
|
-
WHERE id = auth.uid();
|
|
317
|
-
-- Expected: Should return 1 row (current user only)
|
|
318
|
-
|
|
319
|
-
-- Example 2: Test SELECT access (posts table)
|
|
320
|
-
SELECT id, title, user_id, created_at
|
|
321
|
-
FROM posts
|
|
322
|
-
WHERE user_id = auth.uid();
|
|
323
|
-
-- Expected: Should return only posts created by this user
|
|
324
|
-
|
|
325
|
-
-- Example 3: Test INSERT access
|
|
326
|
-
INSERT INTO posts (title, content, user_id)
|
|
327
|
-
VALUES ('Test Post', 'Test Content', auth.uid());
|
|
328
|
-
-- Expected: Should succeed if RLS allows INSERT
|
|
329
|
-
|
|
330
|
-
-- Example 4: Test UPDATE access (own data)
|
|
331
|
-
UPDATE posts
|
|
332
|
-
SET title = 'Updated Title'
|
|
333
|
-
WHERE id = '...' AND user_id = auth.uid();
|
|
334
|
-
-- Expected: Should succeed only if post belongs to user
|
|
335
|
-
|
|
336
|
-
-- Example 5: Test UPDATE access (other user's data)
|
|
337
|
-
UPDATE posts
|
|
338
|
-
SET title = 'Hacked!'
|
|
339
|
-
WHERE user_id != auth.uid();
|
|
340
|
-
-- Expected: Should fail or affect 0 rows (RLS blocks)
|
|
341
|
-
|
|
342
|
-
-- Example 6: Test DELETE access
|
|
343
|
-
DELETE FROM posts
|
|
344
|
-
WHERE id = '...' AND user_id = auth.uid();
|
|
345
|
-
-- Expected: Should succeed only if post belongs to user
|
|
346
|
-
```
|
|
347
|
-
|
|
348
|
-
### Step 3: Interactive Testing Session
|
|
349
|
-
|
|
350
|
-
```bash
|
|
351
|
-
\echo ''
|
|
352
|
-
\echo '=== Interactive Testing ==='
|
|
353
|
-
\echo ''
|
|
354
|
-
\echo 'Entering interactive psql session...'
|
|
355
|
-
\echo 'You are now emulating user: {user_id}'
|
|
356
|
-
\echo ''
|
|
357
|
-
\echo 'Available commands:'
|
|
358
|
-
\echo ' - Run any SQL query to test RLS'
|
|
359
|
-
\echo ' - \d tablename - Show table structure'
|
|
360
|
-
\echo ' - \dp tablename - Show RLS policies'
|
|
361
|
-
\echo ' - SELECT auth.uid(); - Verify current user'
|
|
362
|
-
\echo ' - RESET ALL; - Exit emulation'
|
|
363
|
-
\echo ' - \q - Quit psql'
|
|
364
|
-
\echo ''
|
|
365
|
-
|
|
366
|
-
psql "$SUPABASE_DB_URL"
|
|
367
|
-
```
|
|
368
|
-
|
|
369
|
-
---
|
|
370
|
-
|
|
371
|
-
## Common Testing Scenarios
|
|
372
|
-
|
|
373
|
-
### Scenario 1: User Can Read Own Data Only
|
|
374
|
-
|
|
375
|
-
**Test:** Verify user can only SELECT their own rows
|
|
376
|
-
|
|
377
|
-
```sql
|
|
378
|
-
-- Should return only rows where user_id = auth.uid()
|
|
379
|
-
SELECT * FROM posts;
|
|
380
|
-
|
|
381
|
-
-- Verify auth.uid() is set correctly
|
|
382
|
-
SELECT auth.uid() AS current_user;
|
|
383
|
-
|
|
384
|
-
-- Check policy
|
|
385
|
-
\dp posts
|
|
386
|
-
```
|
|
387
|
-
|
|
388
|
-
**Expected Result:**
|
|
389
|
-
- Only rows with `user_id = '{user_id}'` returned
|
|
390
|
-
- Policy `users_read_own_posts` should be active
|
|
391
|
-
|
|
392
|
-
### Scenario 2: User Cannot Read Other Users' Data
|
|
393
|
-
|
|
394
|
-
**Test:** Verify RLS blocks access to other users' data
|
|
395
|
-
|
|
396
|
-
```sql
|
|
397
|
-
-- Attempt to read specific post from another user
|
|
398
|
-
SELECT * FROM posts WHERE user_id != auth.uid();
|
|
399
|
-
```
|
|
400
|
-
|
|
401
|
-
**Expected Result:**
|
|
402
|
-
- 0 rows returned (RLS blocks access)
|
|
403
|
-
- No error (just filtered out by RLS)
|
|
404
|
-
|
|
405
|
-
### Scenario 3: User Can Insert Own Data
|
|
406
|
-
|
|
407
|
-
**Test:** Verify user can INSERT with correct user_id
|
|
408
|
-
|
|
409
|
-
```sql
|
|
410
|
-
-- Should succeed (user_id matches auth.uid())
|
|
411
|
-
INSERT INTO posts (title, content, user_id)
|
|
412
|
-
VALUES ('My Post', 'Content', auth.uid());
|
|
413
|
-
|
|
414
|
-
-- Should fail (user_id does not match auth.uid())
|
|
415
|
-
INSERT INTO posts (title, content, user_id)
|
|
416
|
-
VALUES ('Hacked Post', 'Content', 'another-user-id');
|
|
417
|
-
```
|
|
418
|
-
|
|
419
|
-
**Expected Result:**
|
|
420
|
-
- First INSERT succeeds
|
|
421
|
-
- Second INSERT fails or is blocked by RLS `WITH CHECK` policy
|
|
422
|
-
|
|
423
|
-
### Scenario 4: User Cannot Update Other Users' Data
|
|
424
|
-
|
|
425
|
-
**Test:** Verify user cannot UPDATE rows they don't own
|
|
426
|
-
|
|
427
|
-
```sql
|
|
428
|
-
-- Should succeed (own post)
|
|
429
|
-
UPDATE posts SET title = 'Updated' WHERE id = 'my-post-id';
|
|
430
|
-
|
|
431
|
-
-- Should affect 0 rows (RLS filters out)
|
|
432
|
-
UPDATE posts SET title = 'Hacked' WHERE user_id != auth.uid();
|
|
433
|
-
```
|
|
434
|
-
|
|
435
|
-
**Expected Result:**
|
|
436
|
-
- First UPDATE succeeds
|
|
437
|
-
- Second UPDATE returns `UPDATE 0` (no rows modified)
|
|
438
|
-
|
|
439
|
-
### Scenario 5: Admin Can See All Data
|
|
440
|
-
|
|
441
|
-
**Test:** Verify admin/service role bypasses RLS
|
|
442
|
-
|
|
443
|
-
```sql
|
|
444
|
-
-- Re-run test with role = 'service_role'
|
|
445
|
-
-- (requires restarting test-as-user with different role)
|
|
446
|
-
|
|
447
|
-
SELECT * FROM posts; -- Should see ALL posts
|
|
448
|
-
```
|
|
449
|
-
|
|
450
|
-
**Expected Result:**
|
|
451
|
-
- All rows returned (service_role bypasses RLS)
|
|
452
|
-
- **WARNING:** Never use service_role in client code!
|
|
453
|
-
|
|
454
|
-
---
|
|
455
|
-
|
|
456
|
-
## Troubleshooting
|
|
457
|
-
|
|
458
|
-
### Issue: auth.uid() returns NULL
|
|
459
|
-
|
|
460
|
-
**Cause:** Session claims not set correctly
|
|
461
|
-
|
|
462
|
-
**Fix:**
|
|
463
|
-
```sql
|
|
464
|
-
-- Check current settings
|
|
465
|
-
SELECT
|
|
466
|
-
current_setting('request.jwt.claim.sub', true) AS sub,
|
|
467
|
-
auth.uid() AS auth_uid;
|
|
468
|
-
|
|
469
|
-
-- If sub is set but auth_uid is NULL, restart session
|
|
470
|
-
RESET ALL;
|
|
471
|
-
-- Re-run test-as-user command
|
|
472
|
-
```
|
|
473
|
-
|
|
474
|
-
### Issue: RLS policy not applying
|
|
475
|
-
|
|
476
|
-
**Cause:** RLS not enabled on table
|
|
477
|
-
|
|
478
|
-
**Fix:**
|
|
479
|
-
```sql
|
|
480
|
-
-- Check if RLS is enabled
|
|
481
|
-
SELECT tablename, rowsecurity
|
|
482
|
-
FROM pg_tables
|
|
483
|
-
WHERE schemaname = 'public';
|
|
484
|
-
|
|
485
|
-
-- Enable RLS
|
|
486
|
-
ALTER TABLE {tablename} ENABLE ROW LEVEL SECURITY;
|
|
487
|
-
```
|
|
488
|
-
|
|
489
|
-
### Issue: "Permission denied" error
|
|
490
|
-
|
|
491
|
-
**Cause:** Role doesn't have table permissions
|
|
492
|
-
|
|
493
|
-
**Fix:**
|
|
494
|
-
```sql
|
|
495
|
-
-- Grant table permissions to role
|
|
496
|
-
GRANT SELECT, INSERT, UPDATE, DELETE ON {tablename} TO authenticated;
|
|
497
|
-
```
|
|
498
|
-
|
|
499
|
-
### Issue: Can see other users' data
|
|
500
|
-
|
|
501
|
-
**Cause:** Missing or incorrect RLS policy
|
|
502
|
-
|
|
503
|
-
**Fix:**
|
|
504
|
-
```sql
|
|
505
|
-
-- Check existing policies
|
|
506
|
-
\dp {tablename}
|
|
507
|
-
|
|
508
|
-
-- Create missing policy (example)
|
|
509
|
-
CREATE POLICY users_read_own_data ON {tablename}
|
|
510
|
-
FOR SELECT
|
|
511
|
-
USING (user_id = auth.uid());
|
|
512
|
-
```
|
|
513
|
-
|
|
514
|
-
---
|
|
515
|
-
|
|
516
|
-
## Best Practices
|
|
517
|
-
|
|
518
|
-
### Before Testing
|
|
519
|
-
|
|
520
|
-
1. **Know your policies:** Review RLS policies before testing
|
|
521
|
-
```sql
|
|
522
|
-
\dp tablename
|
|
523
|
-
```
|
|
524
|
-
|
|
525
|
-
2. **Have test data:** Ensure test user has data to query
|
|
526
|
-
```sql
|
|
527
|
-
SELECT * FROM posts WHERE user_id = '{user_id}';
|
|
528
|
-
```
|
|
529
|
-
|
|
530
|
-
3. **Document test cases:** Write down what you expect to happen
|
|
531
|
-
|
|
532
|
-
### During Testing
|
|
533
|
-
|
|
534
|
-
1. **Test positive cases:** Verify user CAN access their own data
|
|
535
|
-
2. **Test negative cases:** Verify user CANNOT access others' data
|
|
536
|
-
3. **Test all operations:** SELECT, INSERT, UPDATE, DELETE
|
|
537
|
-
4. **Test edge cases:** NULL values, empty results, concurrent access
|
|
538
|
-
|
|
539
|
-
### After Testing
|
|
540
|
-
|
|
541
|
-
1. **Reset session:** Always run `RESET ALL;` or close session
|
|
542
|
-
2. **Document results:** Note any policy gaps or issues
|
|
543
|
-
3. **Fix policies:** Update RLS policies based on test results
|
|
544
|
-
4. **Re-test:** Verify fixes with another test run
|
|
545
|
-
|
|
546
|
-
---
|
|
547
|
-
|
|
548
|
-
## Security Notes
|
|
549
|
-
|
|
550
|
-
**NEVER do this in production:**
|
|
551
|
-
|
|
552
|
-
```javascript
|
|
553
|
-
// ❌ BAD: Setting JWT claims in application code
|
|
554
|
-
supabase.rpc('set_claims', { user_id: userId })
|
|
555
|
-
|
|
556
|
-
// ❌ BAD: Using service_role key in client
|
|
557
|
-
const supabase = createClient(url, SERVICE_ROLE_KEY)
|
|
558
|
-
```
|
|
559
|
-
|
|
560
|
-
**Testing workflow:**
|
|
561
|
-
|
|
562
|
-
```
|
|
563
|
-
Development DB → test-as-user command → Verify RLS
|
|
564
|
-
↓
|
|
565
|
-
Fix policies if needed
|
|
566
|
-
↓
|
|
567
|
-
Deploy to staging → Test with real auth
|
|
568
|
-
↓
|
|
569
|
-
Production (real JWT tokens)
|
|
570
|
-
```
|
|
571
|
-
|
|
572
|
-
---
|
|
573
|
-
|
|
574
|
-
## Related Commands
|
|
575
|
-
|
|
576
|
-
- `*security-audit rls` - Audit RLS coverage before testing
|
|
577
|
-
- `*policy-apply {table}` - Install RLS policies
|
|
578
|
-
- `*create-migration-plan` - Plan RLS policy migrations
|
|
579
|
-
- `*impersonate` - Legacy command (deprecated, use `*test-as-user`)
|
|
580
|
-
|
|
581
|
-
---
|
|
582
|
-
|
|
583
|
-
## Output Example
|
|
584
|
-
|
|
585
|
-
```
|
|
586
|
-
=== Setting Session Claims ===
|
|
587
|
-
|
|
588
|
-
User ID: 123e4567-e89b-12d3-a456-426614174000
|
|
589
|
-
Role: authenticated
|
|
590
|
-
Purpose: Test user can only read own posts
|
|
591
|
-
|
|
592
|
-
jwt_claims_set
|
|
593
|
-
----------------
|
|
594
|
-
t
|
|
595
|
-
|
|
596
|
-
user_id_set | role_set
|
|
597
|
-
-------------+----------
|
|
598
|
-
t | t
|
|
599
|
-
|
|
600
|
-
=== Verification ===
|
|
601
|
-
|
|
602
|
-
jwt_claims | user_id | role | auth_uid_function
|
|
603
|
-
-------------------------------------------------+--------------------------------------+---------------+----------------------------------
|
|
604
|
-
{"sub":"123e4567-e89b-12d3-a456-426614174000"...| 123e4567-e89b-12d3-a456-426614174000 | authenticated | 123e4567-e89b-12d3-a456-426614174000
|
|
605
|
-
|
|
606
|
-
✓ Session configured for user: 123e4567-e89b-12d3-a456-426614174000
|
|
607
|
-
|
|
608
|
-
=== Interactive Testing ===
|
|
609
|
-
|
|
610
|
-
Entering interactive psql session...
|
|
611
|
-
You are now emulating user: 123e4567-e89b-12d3-a456-426614174000
|
|
612
|
-
|
|
613
|
-
psql (14.5)
|
|
614
|
-
Type "help" for help.
|
|
615
|
-
|
|
616
|
-
database=>
|
|
617
|
-
```
|
|
618
|
-
|
|
619
|
-
---
|
|
620
|
-
|
|
621
|
-
**Note:** This task replaces `db-impersonate.md` with clearer naming (renamed in Story 6.1.2.3)
|
|
1
|
+
# Task: Test As User (RLS Testing)
|
|
2
|
+
|
|
3
|
+
**Purpose**: Emulate authenticated user for RLS policy testing
|
|
4
|
+
|
|
5
|
+
**Elicit**: true
|
|
6
|
+
|
|
7
|
+
**Renamed From (Story 6.1.2.3):**
|
|
8
|
+
- `db-impersonate.md` - Clearer name for RLS testing purpose
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Execution Modes
|
|
13
|
+
|
|
14
|
+
**Choose your execution mode:**
|
|
15
|
+
|
|
16
|
+
### 1. YOLO Mode - Fast, Autonomous (0-1 prompts)
|
|
17
|
+
- Autonomous decision making with logging
|
|
18
|
+
- Minimal user interaction
|
|
19
|
+
- **Best for:** Simple, deterministic tasks
|
|
20
|
+
|
|
21
|
+
### 2. Interactive Mode - Balanced, Educational (5-10 prompts) **[DEFAULT]**
|
|
22
|
+
- Explicit decision checkpoints
|
|
23
|
+
- Educational explanations
|
|
24
|
+
- **Best for:** Learning, complex decisions
|
|
25
|
+
|
|
26
|
+
### 3. Pre-Flight Planning - Comprehensive Upfront Planning
|
|
27
|
+
- Task analysis phase (identify all ambiguities)
|
|
28
|
+
- Zero ambiguity execution
|
|
29
|
+
- **Best for:** Ambiguous requirements, critical work
|
|
30
|
+
|
|
31
|
+
**Parameter:** `mode` (optional, default: `interactive`)
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Task Definition (AIOS Task Format V1.0)
|
|
36
|
+
|
|
37
|
+
```yaml
|
|
38
|
+
task: testAsUser()
|
|
39
|
+
responsável: Quinn (Guardian)
|
|
40
|
+
responsavel_type: Agente
|
|
41
|
+
atomic_layer: Config
|
|
42
|
+
|
|
43
|
+
**Entrada:**
|
|
44
|
+
- campo: task
|
|
45
|
+
tipo: string
|
|
46
|
+
origem: User Input
|
|
47
|
+
obrigatório: true
|
|
48
|
+
validação: Must be registered task
|
|
49
|
+
|
|
50
|
+
- campo: parameters
|
|
51
|
+
tipo: object
|
|
52
|
+
origem: User Input
|
|
53
|
+
obrigatório: false
|
|
54
|
+
validação: Valid task parameters
|
|
55
|
+
|
|
56
|
+
- campo: mode
|
|
57
|
+
tipo: string
|
|
58
|
+
origem: User Input
|
|
59
|
+
obrigatório: false
|
|
60
|
+
validação: yolo|interactive|pre-flight
|
|
61
|
+
|
|
62
|
+
**Saída:**
|
|
63
|
+
- campo: execution_result
|
|
64
|
+
tipo: object
|
|
65
|
+
destino: Memory
|
|
66
|
+
persistido: false
|
|
67
|
+
|
|
68
|
+
- campo: logs
|
|
69
|
+
tipo: array
|
|
70
|
+
destino: File (.ai/logs/*)
|
|
71
|
+
persistido: true
|
|
72
|
+
|
|
73
|
+
- campo: state
|
|
74
|
+
tipo: object
|
|
75
|
+
destino: State management
|
|
76
|
+
persistido: true
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Pre-Conditions
|
|
82
|
+
|
|
83
|
+
**Purpose:** Validate prerequisites BEFORE task execution (blocking)
|
|
84
|
+
|
|
85
|
+
**Checklist:**
|
|
86
|
+
|
|
87
|
+
```yaml
|
|
88
|
+
pre-conditions:
|
|
89
|
+
- [ ] Task is registered; required parameters provided; dependencies met
|
|
90
|
+
tipo: pre-condition
|
|
91
|
+
blocker: true
|
|
92
|
+
validação: |
|
|
93
|
+
Check task is registered; required parameters provided; dependencies met
|
|
94
|
+
error_message: "Pre-condition failed: Task is registered; required parameters provided; dependencies met"
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Post-Conditions
|
|
100
|
+
|
|
101
|
+
**Purpose:** Validate execution success AFTER task completes
|
|
102
|
+
|
|
103
|
+
**Checklist:**
|
|
104
|
+
|
|
105
|
+
```yaml
|
|
106
|
+
post-conditions:
|
|
107
|
+
- [ ] Task completed; exit code 0; expected outputs created
|
|
108
|
+
tipo: post-condition
|
|
109
|
+
blocker: true
|
|
110
|
+
validação: |
|
|
111
|
+
Verify task completed; exit code 0; expected outputs created
|
|
112
|
+
error_message: "Post-condition failed: Task completed; exit code 0; expected outputs created"
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Acceptance Criteria
|
|
118
|
+
|
|
119
|
+
**Purpose:** Definitive pass/fail criteria for task completion
|
|
120
|
+
|
|
121
|
+
**Checklist:**
|
|
122
|
+
|
|
123
|
+
```yaml
|
|
124
|
+
acceptance-criteria:
|
|
125
|
+
- [ ] Task completed as expected; side effects documented
|
|
126
|
+
tipo: acceptance-criterion
|
|
127
|
+
blocker: true
|
|
128
|
+
validação: |
|
|
129
|
+
Assert task completed as expected; side effects documented
|
|
130
|
+
error_message: "Acceptance criterion not met: Task completed as expected; side effects documented"
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Tools
|
|
136
|
+
|
|
137
|
+
**External/shared resources used by this task:**
|
|
138
|
+
|
|
139
|
+
- **Tool:** task-runner
|
|
140
|
+
- **Purpose:** Task execution and orchestration
|
|
141
|
+
- **Source:** .aios-core/core/task-runner.js
|
|
142
|
+
|
|
143
|
+
- **Tool:** logger
|
|
144
|
+
- **Purpose:** Execution logging and error tracking
|
|
145
|
+
- **Source:** .aios-core/utils/logger.js
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Scripts
|
|
150
|
+
|
|
151
|
+
**Agent-specific code for this task:**
|
|
152
|
+
|
|
153
|
+
- **Script:** execute-task.js
|
|
154
|
+
- **Purpose:** Generic task execution wrapper
|
|
155
|
+
- **Language:** JavaScript
|
|
156
|
+
- **Location:** .aios-core/scripts/execute-task.js
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Error Handling
|
|
161
|
+
|
|
162
|
+
**Strategy:** retry
|
|
163
|
+
|
|
164
|
+
**Common Errors:**
|
|
165
|
+
|
|
166
|
+
1. **Error:** Task Not Found
|
|
167
|
+
- **Cause:** Specified task not registered in system
|
|
168
|
+
- **Resolution:** Verify task name and registration
|
|
169
|
+
- **Recovery:** List available tasks, suggest similar
|
|
170
|
+
|
|
171
|
+
2. **Error:** Invalid Parameters
|
|
172
|
+
- **Cause:** Task parameters do not match expected schema
|
|
173
|
+
- **Resolution:** Validate parameters against task definition
|
|
174
|
+
- **Recovery:** Provide parameter template, reject execution
|
|
175
|
+
|
|
176
|
+
3. **Error:** Execution Timeout
|
|
177
|
+
- **Cause:** Task exceeds maximum execution time
|
|
178
|
+
- **Resolution:** Optimize task or increase timeout
|
|
179
|
+
- **Recovery:** Kill task, cleanup resources, log state
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Performance
|
|
184
|
+
|
|
185
|
+
**Expected Metrics:**
|
|
186
|
+
|
|
187
|
+
```yaml
|
|
188
|
+
duration_expected: 2-10 min (estimated)
|
|
189
|
+
cost_estimated: $0.001-0.008
|
|
190
|
+
token_usage: ~800-2,500 tokens
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**Optimization Notes:**
|
|
194
|
+
- Validate configuration early; use atomic writes; implement rollback checkpoints
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Metadata
|
|
199
|
+
|
|
200
|
+
```yaml
|
|
201
|
+
story: N/A
|
|
202
|
+
version: 1.0.0
|
|
203
|
+
dependencies:
|
|
204
|
+
- N/A
|
|
205
|
+
tags:
|
|
206
|
+
- automation
|
|
207
|
+
- workflow
|
|
208
|
+
updated_at: 2025-11-17
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
## Inputs
|
|
215
|
+
|
|
216
|
+
**Required:**
|
|
217
|
+
- `user_id` (uuid): User ID to emulate
|
|
218
|
+
|
|
219
|
+
**Optional:**
|
|
220
|
+
- `role` (text): Role to test (default: 'authenticated')
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Elicitation
|
|
225
|
+
|
|
226
|
+
**Prompt user:**
|
|
227
|
+
|
|
228
|
+
```
|
|
229
|
+
=== RLS Policy Testing ===
|
|
230
|
+
|
|
231
|
+
Enter user ID to emulate:
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**Capture:** `{user_id}`
|
|
235
|
+
|
|
236
|
+
```
|
|
237
|
+
Enter role (default: authenticated):
|
|
238
|
+
Options: authenticated, anon, service_role
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
**Capture:** `{role}` (default: 'authenticated')
|
|
242
|
+
|
|
243
|
+
```
|
|
244
|
+
What are you testing?
|
|
245
|
+
(e.g., "User can only read own posts", "Admin can see all data")
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**Capture:** `{test_purpose}`
|
|
249
|
+
|
|
250
|
+
**CRITICAL WARNING:** Display warning:
|
|
251
|
+
```
|
|
252
|
+
⚠️ WARNING: This is for RLS testing only!
|
|
253
|
+
- Never use in production application code
|
|
254
|
+
- Session claims are temporary (current session only)
|
|
255
|
+
- Use service_role key with extreme caution
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
**Confirm:** User acknowledges warning (y/n)
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## Process
|
|
263
|
+
|
|
264
|
+
### Step 1: Set Session Claims
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 <<SQL
|
|
268
|
+
\echo '=== Setting Session Claims ==='
|
|
269
|
+
\echo ''
|
|
270
|
+
\echo 'User ID: {user_id}'
|
|
271
|
+
\echo 'Role: {role}'
|
|
272
|
+
\echo 'Purpose: {test_purpose}'
|
|
273
|
+
\echo ''
|
|
274
|
+
|
|
275
|
+
-- Set JWT claims for current session
|
|
276
|
+
SELECT
|
|
277
|
+
set_config('request.jwt.claims',
|
|
278
|
+
jsonb_build_object(
|
|
279
|
+
'sub', '{user_id}',
|
|
280
|
+
'role', '{role}',
|
|
281
|
+
'email', 'test-user@example.com'
|
|
282
|
+
)::text,
|
|
283
|
+
true
|
|
284
|
+
) AS jwt_claims_set;
|
|
285
|
+
|
|
286
|
+
-- Set individual claim for auth.uid() function
|
|
287
|
+
SELECT
|
|
288
|
+
set_config('request.jwt.claim.sub', '{user_id}', true) AS user_id_set,
|
|
289
|
+
set_config('role', '{role}', true) AS role_set;
|
|
290
|
+
|
|
291
|
+
\echo ''
|
|
292
|
+
\echo '=== Verification ==='
|
|
293
|
+
|
|
294
|
+
-- Verify settings
|
|
295
|
+
SELECT
|
|
296
|
+
current_setting('request.jwt.claims', true) AS jwt_claims,
|
|
297
|
+
current_setting('request.jwt.claim.sub', true) AS user_id,
|
|
298
|
+
current_setting('role', true) AS role,
|
|
299
|
+
auth.uid() AS auth_uid_function;
|
|
300
|
+
|
|
301
|
+
\echo ''
|
|
302
|
+
\echo '✓ Session configured for user: {user_id}'
|
|
303
|
+
\echo ''
|
|
304
|
+
|
|
305
|
+
SQL
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Step 2: Test Query Examples
|
|
309
|
+
|
|
310
|
+
**Provide user with test query templates:**
|
|
311
|
+
|
|
312
|
+
```sql
|
|
313
|
+
-- Example 1: Test SELECT access (users table)
|
|
314
|
+
SELECT id, email, created_at
|
|
315
|
+
FROM users
|
|
316
|
+
WHERE id = auth.uid();
|
|
317
|
+
-- Expected: Should return 1 row (current user only)
|
|
318
|
+
|
|
319
|
+
-- Example 2: Test SELECT access (posts table)
|
|
320
|
+
SELECT id, title, user_id, created_at
|
|
321
|
+
FROM posts
|
|
322
|
+
WHERE user_id = auth.uid();
|
|
323
|
+
-- Expected: Should return only posts created by this user
|
|
324
|
+
|
|
325
|
+
-- Example 3: Test INSERT access
|
|
326
|
+
INSERT INTO posts (title, content, user_id)
|
|
327
|
+
VALUES ('Test Post', 'Test Content', auth.uid());
|
|
328
|
+
-- Expected: Should succeed if RLS allows INSERT
|
|
329
|
+
|
|
330
|
+
-- Example 4: Test UPDATE access (own data)
|
|
331
|
+
UPDATE posts
|
|
332
|
+
SET title = 'Updated Title'
|
|
333
|
+
WHERE id = '...' AND user_id = auth.uid();
|
|
334
|
+
-- Expected: Should succeed only if post belongs to user
|
|
335
|
+
|
|
336
|
+
-- Example 5: Test UPDATE access (other user's data)
|
|
337
|
+
UPDATE posts
|
|
338
|
+
SET title = 'Hacked!'
|
|
339
|
+
WHERE user_id != auth.uid();
|
|
340
|
+
-- Expected: Should fail or affect 0 rows (RLS blocks)
|
|
341
|
+
|
|
342
|
+
-- Example 6: Test DELETE access
|
|
343
|
+
DELETE FROM posts
|
|
344
|
+
WHERE id = '...' AND user_id = auth.uid();
|
|
345
|
+
-- Expected: Should succeed only if post belongs to user
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### Step 3: Interactive Testing Session
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
\echo ''
|
|
352
|
+
\echo '=== Interactive Testing ==='
|
|
353
|
+
\echo ''
|
|
354
|
+
\echo 'Entering interactive psql session...'
|
|
355
|
+
\echo 'You are now emulating user: {user_id}'
|
|
356
|
+
\echo ''
|
|
357
|
+
\echo 'Available commands:'
|
|
358
|
+
\echo ' - Run any SQL query to test RLS'
|
|
359
|
+
\echo ' - \d tablename - Show table structure'
|
|
360
|
+
\echo ' - \dp tablename - Show RLS policies'
|
|
361
|
+
\echo ' - SELECT auth.uid(); - Verify current user'
|
|
362
|
+
\echo ' - RESET ALL; - Exit emulation'
|
|
363
|
+
\echo ' - \q - Quit psql'
|
|
364
|
+
\echo ''
|
|
365
|
+
|
|
366
|
+
psql "$SUPABASE_DB_URL"
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## Common Testing Scenarios
|
|
372
|
+
|
|
373
|
+
### Scenario 1: User Can Read Own Data Only
|
|
374
|
+
|
|
375
|
+
**Test:** Verify user can only SELECT their own rows
|
|
376
|
+
|
|
377
|
+
```sql
|
|
378
|
+
-- Should return only rows where user_id = auth.uid()
|
|
379
|
+
SELECT * FROM posts;
|
|
380
|
+
|
|
381
|
+
-- Verify auth.uid() is set correctly
|
|
382
|
+
SELECT auth.uid() AS current_user;
|
|
383
|
+
|
|
384
|
+
-- Check policy
|
|
385
|
+
\dp posts
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
**Expected Result:**
|
|
389
|
+
- Only rows with `user_id = '{user_id}'` returned
|
|
390
|
+
- Policy `users_read_own_posts` should be active
|
|
391
|
+
|
|
392
|
+
### Scenario 2: User Cannot Read Other Users' Data
|
|
393
|
+
|
|
394
|
+
**Test:** Verify RLS blocks access to other users' data
|
|
395
|
+
|
|
396
|
+
```sql
|
|
397
|
+
-- Attempt to read specific post from another user
|
|
398
|
+
SELECT * FROM posts WHERE user_id != auth.uid();
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
**Expected Result:**
|
|
402
|
+
- 0 rows returned (RLS blocks access)
|
|
403
|
+
- No error (just filtered out by RLS)
|
|
404
|
+
|
|
405
|
+
### Scenario 3: User Can Insert Own Data
|
|
406
|
+
|
|
407
|
+
**Test:** Verify user can INSERT with correct user_id
|
|
408
|
+
|
|
409
|
+
```sql
|
|
410
|
+
-- Should succeed (user_id matches auth.uid())
|
|
411
|
+
INSERT INTO posts (title, content, user_id)
|
|
412
|
+
VALUES ('My Post', 'Content', auth.uid());
|
|
413
|
+
|
|
414
|
+
-- Should fail (user_id does not match auth.uid())
|
|
415
|
+
INSERT INTO posts (title, content, user_id)
|
|
416
|
+
VALUES ('Hacked Post', 'Content', 'another-user-id');
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
**Expected Result:**
|
|
420
|
+
- First INSERT succeeds
|
|
421
|
+
- Second INSERT fails or is blocked by RLS `WITH CHECK` policy
|
|
422
|
+
|
|
423
|
+
### Scenario 4: User Cannot Update Other Users' Data
|
|
424
|
+
|
|
425
|
+
**Test:** Verify user cannot UPDATE rows they don't own
|
|
426
|
+
|
|
427
|
+
```sql
|
|
428
|
+
-- Should succeed (own post)
|
|
429
|
+
UPDATE posts SET title = 'Updated' WHERE id = 'my-post-id';
|
|
430
|
+
|
|
431
|
+
-- Should affect 0 rows (RLS filters out)
|
|
432
|
+
UPDATE posts SET title = 'Hacked' WHERE user_id != auth.uid();
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
**Expected Result:**
|
|
436
|
+
- First UPDATE succeeds
|
|
437
|
+
- Second UPDATE returns `UPDATE 0` (no rows modified)
|
|
438
|
+
|
|
439
|
+
### Scenario 5: Admin Can See All Data
|
|
440
|
+
|
|
441
|
+
**Test:** Verify admin/service role bypasses RLS
|
|
442
|
+
|
|
443
|
+
```sql
|
|
444
|
+
-- Re-run test with role = 'service_role'
|
|
445
|
+
-- (requires restarting test-as-user with different role)
|
|
446
|
+
|
|
447
|
+
SELECT * FROM posts; -- Should see ALL posts
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
**Expected Result:**
|
|
451
|
+
- All rows returned (service_role bypasses RLS)
|
|
452
|
+
- **WARNING:** Never use service_role in client code!
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
## Troubleshooting
|
|
457
|
+
|
|
458
|
+
### Issue: auth.uid() returns NULL
|
|
459
|
+
|
|
460
|
+
**Cause:** Session claims not set correctly
|
|
461
|
+
|
|
462
|
+
**Fix:**
|
|
463
|
+
```sql
|
|
464
|
+
-- Check current settings
|
|
465
|
+
SELECT
|
|
466
|
+
current_setting('request.jwt.claim.sub', true) AS sub,
|
|
467
|
+
auth.uid() AS auth_uid;
|
|
468
|
+
|
|
469
|
+
-- If sub is set but auth_uid is NULL, restart session
|
|
470
|
+
RESET ALL;
|
|
471
|
+
-- Re-run test-as-user command
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
### Issue: RLS policy not applying
|
|
475
|
+
|
|
476
|
+
**Cause:** RLS not enabled on table
|
|
477
|
+
|
|
478
|
+
**Fix:**
|
|
479
|
+
```sql
|
|
480
|
+
-- Check if RLS is enabled
|
|
481
|
+
SELECT tablename, rowsecurity
|
|
482
|
+
FROM pg_tables
|
|
483
|
+
WHERE schemaname = 'public';
|
|
484
|
+
|
|
485
|
+
-- Enable RLS
|
|
486
|
+
ALTER TABLE {tablename} ENABLE ROW LEVEL SECURITY;
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
### Issue: "Permission denied" error
|
|
490
|
+
|
|
491
|
+
**Cause:** Role doesn't have table permissions
|
|
492
|
+
|
|
493
|
+
**Fix:**
|
|
494
|
+
```sql
|
|
495
|
+
-- Grant table permissions to role
|
|
496
|
+
GRANT SELECT, INSERT, UPDATE, DELETE ON {tablename} TO authenticated;
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
### Issue: Can see other users' data
|
|
500
|
+
|
|
501
|
+
**Cause:** Missing or incorrect RLS policy
|
|
502
|
+
|
|
503
|
+
**Fix:**
|
|
504
|
+
```sql
|
|
505
|
+
-- Check existing policies
|
|
506
|
+
\dp {tablename}
|
|
507
|
+
|
|
508
|
+
-- Create missing policy (example)
|
|
509
|
+
CREATE POLICY users_read_own_data ON {tablename}
|
|
510
|
+
FOR SELECT
|
|
511
|
+
USING (user_id = auth.uid());
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
---
|
|
515
|
+
|
|
516
|
+
## Best Practices
|
|
517
|
+
|
|
518
|
+
### Before Testing
|
|
519
|
+
|
|
520
|
+
1. **Know your policies:** Review RLS policies before testing
|
|
521
|
+
```sql
|
|
522
|
+
\dp tablename
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
2. **Have test data:** Ensure test user has data to query
|
|
526
|
+
```sql
|
|
527
|
+
SELECT * FROM posts WHERE user_id = '{user_id}';
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
3. **Document test cases:** Write down what you expect to happen
|
|
531
|
+
|
|
532
|
+
### During Testing
|
|
533
|
+
|
|
534
|
+
1. **Test positive cases:** Verify user CAN access their own data
|
|
535
|
+
2. **Test negative cases:** Verify user CANNOT access others' data
|
|
536
|
+
3. **Test all operations:** SELECT, INSERT, UPDATE, DELETE
|
|
537
|
+
4. **Test edge cases:** NULL values, empty results, concurrent access
|
|
538
|
+
|
|
539
|
+
### After Testing
|
|
540
|
+
|
|
541
|
+
1. **Reset session:** Always run `RESET ALL;` or close session
|
|
542
|
+
2. **Document results:** Note any policy gaps or issues
|
|
543
|
+
3. **Fix policies:** Update RLS policies based on test results
|
|
544
|
+
4. **Re-test:** Verify fixes with another test run
|
|
545
|
+
|
|
546
|
+
---
|
|
547
|
+
|
|
548
|
+
## Security Notes
|
|
549
|
+
|
|
550
|
+
**NEVER do this in production:**
|
|
551
|
+
|
|
552
|
+
```javascript
|
|
553
|
+
// ❌ BAD: Setting JWT claims in application code
|
|
554
|
+
supabase.rpc('set_claims', { user_id: userId })
|
|
555
|
+
|
|
556
|
+
// ❌ BAD: Using service_role key in client
|
|
557
|
+
const supabase = createClient(url, SERVICE_ROLE_KEY)
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
**Testing workflow:**
|
|
561
|
+
|
|
562
|
+
```
|
|
563
|
+
Development DB → test-as-user command → Verify RLS
|
|
564
|
+
↓
|
|
565
|
+
Fix policies if needed
|
|
566
|
+
↓
|
|
567
|
+
Deploy to staging → Test with real auth
|
|
568
|
+
↓
|
|
569
|
+
Production (real JWT tokens)
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
---
|
|
573
|
+
|
|
574
|
+
## Related Commands
|
|
575
|
+
|
|
576
|
+
- `*security-audit rls` - Audit RLS coverage before testing
|
|
577
|
+
- `*policy-apply {table}` - Install RLS policies
|
|
578
|
+
- `*create-migration-plan` - Plan RLS policy migrations
|
|
579
|
+
- `*impersonate` - Legacy command (deprecated, use `*test-as-user`)
|
|
580
|
+
|
|
581
|
+
---
|
|
582
|
+
|
|
583
|
+
## Output Example
|
|
584
|
+
|
|
585
|
+
```
|
|
586
|
+
=== Setting Session Claims ===
|
|
587
|
+
|
|
588
|
+
User ID: 123e4567-e89b-12d3-a456-426614174000
|
|
589
|
+
Role: authenticated
|
|
590
|
+
Purpose: Test user can only read own posts
|
|
591
|
+
|
|
592
|
+
jwt_claims_set
|
|
593
|
+
----------------
|
|
594
|
+
t
|
|
595
|
+
|
|
596
|
+
user_id_set | role_set
|
|
597
|
+
-------------+----------
|
|
598
|
+
t | t
|
|
599
|
+
|
|
600
|
+
=== Verification ===
|
|
601
|
+
|
|
602
|
+
jwt_claims | user_id | role | auth_uid_function
|
|
603
|
+
-------------------------------------------------+--------------------------------------+---------------+----------------------------------
|
|
604
|
+
{"sub":"123e4567-e89b-12d3-a456-426614174000"...| 123e4567-e89b-12d3-a456-426614174000 | authenticated | 123e4567-e89b-12d3-a456-426614174000
|
|
605
|
+
|
|
606
|
+
✓ Session configured for user: 123e4567-e89b-12d3-a456-426614174000
|
|
607
|
+
|
|
608
|
+
=== Interactive Testing ===
|
|
609
|
+
|
|
610
|
+
Entering interactive psql session...
|
|
611
|
+
You are now emulating user: 123e4567-e89b-12d3-a456-426614174000
|
|
612
|
+
|
|
613
|
+
psql (14.5)
|
|
614
|
+
Type "help" for help.
|
|
615
|
+
|
|
616
|
+
database=>
|
|
617
|
+
```
|
|
618
|
+
|
|
619
|
+
---
|
|
620
|
+
|
|
621
|
+
**Note:** This task replaces `db-impersonate.md` with clearer naming (renamed in Story 6.1.2.3)
|