@mytechtoday/augment-extensions 0.1.2 → 0.4.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/README.md +614 -39
- package/augment-extensions/coding-standards/bash/README.md +196 -0
- package/augment-extensions/coding-standards/bash/module.json +163 -0
- package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -0
- package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -0
- package/augment-extensions/coding-standards/css/README.md +40 -0
- package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/css/module.json +44 -0
- package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html/README.md +40 -0
- package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html/module.json +44 -0
- package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/README.md +194 -0
- package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html-css-js/module.json +48 -0
- package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/js/README.md +46 -0
- package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/js/module.json +49 -0
- package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/php/README.md +248 -0
- package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -0
- package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -0
- package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -0
- package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -0
- package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -0
- package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -0
- package/augment-extensions/coding-standards/php/module.json +166 -0
- package/augment-extensions/coding-standards/php/rules/api-development.md +480 -0
- package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -0
- package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -0
- package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -0
- package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -0
- package/augment-extensions/coding-standards/php/rules/documentation.md +425 -0
- package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -0
- package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -0
- package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -0
- package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -0
- package/augment-extensions/coding-standards/php/rules/performance.md +392 -0
- package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -0
- package/augment-extensions/coding-standards/php/rules/security.md +358 -0
- package/augment-extensions/coding-standards/php/rules/testing.md +403 -0
- package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -0
- package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -0
- package/augment-extensions/coding-standards/powershell/README.md +154 -0
- package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -0
- package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -0
- package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -0
- package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -0
- package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -0
- package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -0
- package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -0
- package/augment-extensions/coding-standards/powershell/module.json +165 -0
- package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -0
- package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -0
- package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -0
- package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -0
- package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -0
- package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -0
- package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -0
- package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -0
- package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -0
- package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -0
- package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -0
- package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -0
- package/augment-extensions/coding-standards/python/README.md +12 -8
- package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -0
- package/augment-extensions/coding-standards/python/module.json +8 -4
- package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -0
- package/augment-extensions/coding-standards/python/rules/documentation.md +831 -0
- package/augment-extensions/coding-standards/python/rules/error-handling.md +855 -68
- package/augment-extensions/coding-standards/python/rules/testing.md +409 -0
- package/augment-extensions/coding-standards/python/rules/tooling.md +446 -0
- package/augment-extensions/coding-standards/python/rules/type-hints.md +115 -50
- package/augment-extensions/collections/html-css-js/README.md +82 -0
- package/augment-extensions/collections/html-css-js/collection.json +41 -0
- package/augment-extensions/domain-rules/database/README.md +161 -0
- package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -0
- package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -0
- package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -0
- package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -0
- package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -0
- package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -0
- package/augment-extensions/domain-rules/database/module.json +28 -0
- package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -0
- package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -0
- package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -0
- package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -0
- package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -0
- package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -0
- package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -0
- package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -0
- package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -0
- package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -0
- package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -0
- package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -0
- package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -0
- package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -0
- package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -0
- package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -0
- package/augment-extensions/domain-rules/mcp/README.md +150 -0
- package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -0
- package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -0
- package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -0
- package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -0
- package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -0
- package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -0
- package/augment-extensions/domain-rules/mcp/module.json +49 -0
- package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -0
- package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -0
- package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -0
- package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -0
- package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -0
- package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -0
- package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -0
- package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -0
- package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -0
- package/augment-extensions/domain-rules/wordpress/README.md +163 -0
- package/augment-extensions/domain-rules/wordpress/module.json +32 -0
- package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -0
- package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -0
- package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -0
- package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -0
- package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -0
- package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -0
- package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -0
- package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -0
- package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -0
- package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -0
- package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -0
- package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -0
- package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -0
- package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -0
- package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -0
- package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -0
- package/augment-extensions/examples/rest-api-plugin/README.md +98 -0
- package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -0
- package/augment-extensions/examples/rest-api-plugin/module.json +40 -0
- package/augment-extensions/examples/woocommerce-extension/README.md +98 -0
- package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -0
- package/augment-extensions/examples/woocommerce-extension/module.json +40 -0
- package/augment-extensions/workflows/beads/module.json +4 -3
- package/augment-extensions/workflows/database/README.md +195 -0
- package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -0
- package/augment-extensions/workflows/database/examples/migration-example.md +498 -0
- package/augment-extensions/workflows/database/examples/optimization-example.md +496 -0
- package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -0
- package/augment-extensions/workflows/database/module.json +42 -0
- package/augment-extensions/workflows/database/rules/data-migration.md +249 -0
- package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -0
- package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -0
- package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -0
- package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -0
- package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -0
- package/augment-extensions/workflows/database/rules/workflow.md +458 -0
- package/augment-extensions/workflows/openspec/module.json +4 -3
- package/augment-extensions/workflows/wordpress-plugin/README.md +232 -0
- package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -0
- package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -0
- package/augment-extensions/workflows/wordpress-plugin/module.json +49 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -0
- package/augment-extensions/writing-standards/screenplay/README.md +171 -0
- package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -0
- package/augment-extensions/writing-standards/screenplay/module.json +124 -0
- package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -0
- package/cli/MODULES.md +302 -0
- package/cli/dist/cli.js +142 -9
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/catalog.d.ts +13 -0
- package/cli/dist/commands/catalog.d.ts.map +1 -0
- package/cli/dist/commands/catalog.js +104 -0
- package/cli/dist/commands/catalog.js.map +1 -0
- package/cli/dist/commands/gui.d.ts +6 -0
- package/cli/dist/commands/gui.d.ts.map +1 -0
- package/cli/dist/commands/gui.js +211 -0
- package/cli/dist/commands/gui.js.map +1 -0
- package/cli/dist/commands/init.d.ts.map +1 -1
- package/cli/dist/commands/init.js +12 -0
- package/cli/dist/commands/init.js.map +1 -1
- package/cli/dist/commands/install-rules.d.ts +14 -0
- package/cli/dist/commands/install-rules.d.ts.map +1 -0
- package/cli/dist/commands/install-rules.js +127 -0
- package/cli/dist/commands/install-rules.js.map +1 -0
- package/cli/dist/commands/link.d.ts.map +1 -1
- package/cli/dist/commands/link.js +9 -11
- package/cli/dist/commands/link.js.map +1 -1
- package/cli/dist/commands/list.d.ts.map +1 -1
- package/cli/dist/commands/list.js +11 -28
- package/cli/dist/commands/list.js.map +1 -1
- package/cli/dist/commands/mcp.d.ts +48 -0
- package/cli/dist/commands/mcp.d.ts.map +1 -0
- package/cli/dist/commands/mcp.js +229 -0
- package/cli/dist/commands/mcp.js.map +1 -0
- package/cli/dist/commands/self-remove.d.ts +7 -0
- package/cli/dist/commands/self-remove.d.ts.map +1 -0
- package/cli/dist/commands/self-remove.js +179 -0
- package/cli/dist/commands/self-remove.js.map +1 -0
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +42 -71
- package/cli/dist/commands/show.js.map +1 -1
- package/cli/dist/commands/skill.d.ts +67 -0
- package/cli/dist/commands/skill.d.ts.map +1 -0
- package/cli/dist/commands/skill.js +513 -0
- package/cli/dist/commands/skill.js.map +1 -0
- package/cli/dist/commands/unlink.d.ts +6 -0
- package/cli/dist/commands/unlink.d.ts.map +1 -0
- package/cli/dist/commands/unlink.js +115 -0
- package/cli/dist/commands/unlink.js.map +1 -0
- package/cli/dist/commands/validate.d.ts +6 -0
- package/cli/dist/commands/validate.d.ts.map +1 -0
- package/cli/dist/commands/validate.js +159 -0
- package/cli/dist/commands/validate.js.map +1 -0
- package/cli/dist/utils/catalog-sync.d.ts +22 -0
- package/cli/dist/utils/catalog-sync.d.ts.map +1 -0
- package/cli/dist/utils/catalog-sync.js +157 -0
- package/cli/dist/utils/catalog-sync.js.map +1 -0
- package/cli/dist/utils/character-count.d.ts +56 -0
- package/cli/dist/utils/character-count.d.ts.map +1 -0
- package/cli/dist/utils/character-count.js +190 -0
- package/cli/dist/utils/character-count.js.map +1 -0
- package/cli/dist/utils/documentation-validator.d.ts +18 -0
- package/cli/dist/utils/documentation-validator.d.ts.map +1 -0
- package/cli/dist/utils/documentation-validator.js +233 -0
- package/cli/dist/utils/documentation-validator.js.map +1 -0
- package/cli/dist/utils/install-rules.d.ts +32 -0
- package/cli/dist/utils/install-rules.d.ts.map +1 -0
- package/cli/dist/utils/install-rules.js +375 -0
- package/cli/dist/utils/install-rules.js.map +1 -0
- package/cli/dist/utils/mcp-integration.d.ts +70 -0
- package/cli/dist/utils/mcp-integration.d.ts.map +1 -0
- package/cli/dist/utils/mcp-integration.js +292 -0
- package/cli/dist/utils/mcp-integration.js.map +1 -0
- package/cli/dist/utils/module-system.d.ts +153 -0
- package/cli/dist/utils/module-system.d.ts.map +1 -0
- package/cli/dist/utils/module-system.js +528 -0
- package/cli/dist/utils/module-system.js.map +1 -0
- package/cli/dist/utils/modules-catalog.d.ts +33 -0
- package/cli/dist/utils/modules-catalog.d.ts.map +1 -0
- package/cli/dist/utils/modules-catalog.js +163 -0
- package/cli/dist/utils/modules-catalog.js.map +1 -0
- package/cli/dist/utils/rule-install-hooks.d.ts +19 -0
- package/cli/dist/utils/rule-install-hooks.d.ts.map +1 -0
- package/cli/dist/utils/rule-install-hooks.js +224 -0
- package/cli/dist/utils/rule-install-hooks.js.map +1 -0
- package/cli/dist/utils/skill-system.d.ts +95 -0
- package/cli/dist/utils/skill-system.d.ts.map +1 -0
- package/cli/dist/utils/skill-system.js +313 -0
- package/cli/dist/utils/skill-system.js.map +1 -0
- package/modules.md +534 -70
- package/package.json +12 -3
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# PSR Standards
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
PHP Standards Recommendations (PSR) are coding standards established by the PHP Framework Interop Group (PHP-FIG). This document covers the essential PSR standards that all PHP code should follow.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## PSR-1: Basic Coding Standard
|
|
10
|
+
|
|
11
|
+
### File Requirements
|
|
12
|
+
|
|
13
|
+
**PHP Tags:**
|
|
14
|
+
- Files MUST use only `<?php` and `<?=` tags
|
|
15
|
+
- Short tags (`<?`) MUST NOT be used
|
|
16
|
+
- ASP-style tags (`<%`) MUST NOT be used
|
|
17
|
+
|
|
18
|
+
**File Encoding:**
|
|
19
|
+
- Files MUST use UTF-8 without BOM for PHP code
|
|
20
|
+
- No byte order mark (BOM) should be present
|
|
21
|
+
|
|
22
|
+
**File Purpose:**
|
|
23
|
+
- Files SHOULD either declare symbols (classes, functions, constants) OR cause side-effects (generate output, modify settings)
|
|
24
|
+
- Files SHOULD NOT do both
|
|
25
|
+
|
|
26
|
+
### Naming Conventions
|
|
27
|
+
|
|
28
|
+
**Namespaces and Classes:**
|
|
29
|
+
- Namespaces and classes MUST follow PSR-4 autoloading standard
|
|
30
|
+
- Class names MUST be declared in PascalCase (e.g., `UserController`)
|
|
31
|
+
- Namespace names MUST match directory structure
|
|
32
|
+
|
|
33
|
+
**Constants:**
|
|
34
|
+
- Class constants MUST be declared in UPPER_SNAKE_CASE
|
|
35
|
+
- Example: `const MAX_RETRY_COUNT = 3;`
|
|
36
|
+
|
|
37
|
+
**Methods:**
|
|
38
|
+
- Method names MUST be declared in camelCase
|
|
39
|
+
- Example: `public function getUserById(int $id): ?User`
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## PSR-12: Extended Coding Style
|
|
44
|
+
|
|
45
|
+
### Indentation and Spacing
|
|
46
|
+
|
|
47
|
+
**Indentation:**
|
|
48
|
+
- Code MUST use 4 spaces for indentation
|
|
49
|
+
- Tabs MUST NOT be used
|
|
50
|
+
|
|
51
|
+
**Line Length:**
|
|
52
|
+
- There MUST be no hard limit on line length
|
|
53
|
+
- Soft limit is 120 characters
|
|
54
|
+
- Lines SHOULD NOT exceed 80 characters when practical
|
|
55
|
+
|
|
56
|
+
**Blank Lines:**
|
|
57
|
+
- There MUST be one blank line after namespace declaration
|
|
58
|
+
- There MUST be one blank line after use declarations block
|
|
59
|
+
- There MUST NOT be more than one statement per line
|
|
60
|
+
|
|
61
|
+
### Braces and Control Structures
|
|
62
|
+
|
|
63
|
+
**Class and Method Braces:**
|
|
64
|
+
- Opening braces for classes MUST be on the next line
|
|
65
|
+
- Opening braces for methods MUST be on the next line
|
|
66
|
+
- Closing braces MUST be on their own line
|
|
67
|
+
|
|
68
|
+
**Control Structure Braces:**
|
|
69
|
+
- Opening braces for control structures MUST be on the same line
|
|
70
|
+
- Closing braces MUST be on the next line after the body
|
|
71
|
+
- Control structure keywords MUST have one space after them
|
|
72
|
+
- Opening parentheses MUST NOT have a space after them
|
|
73
|
+
- Closing parentheses MUST NOT have a space before them
|
|
74
|
+
|
|
75
|
+
**Example:**
|
|
76
|
+
```php
|
|
77
|
+
<?php
|
|
78
|
+
|
|
79
|
+
namespace App\Controllers;
|
|
80
|
+
|
|
81
|
+
use App\Models\User;
|
|
82
|
+
use App\Services\UserService;
|
|
83
|
+
|
|
84
|
+
class UserController
|
|
85
|
+
{
|
|
86
|
+
public function show(int $id): ?User
|
|
87
|
+
{
|
|
88
|
+
if ($id <= 0) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return User::find($id);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Visibility and Type Declarations
|
|
98
|
+
|
|
99
|
+
**Visibility:**
|
|
100
|
+
- Visibility MUST be declared on all properties and methods
|
|
101
|
+
- `abstract` and `final` MUST be declared before visibility
|
|
102
|
+
- `static` MUST be declared after visibility
|
|
103
|
+
|
|
104
|
+
**Type Declarations:**
|
|
105
|
+
- Type hints SHOULD be used for all parameters
|
|
106
|
+
- Return types SHOULD be declared for all methods
|
|
107
|
+
- There MUST NOT be a space before the colon in return type declarations
|
|
108
|
+
- There MUST be one space after the colon in return type declarations
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## PSR-4: Autoloading
|
|
113
|
+
|
|
114
|
+
### Namespace Structure
|
|
115
|
+
|
|
116
|
+
**Directory Mapping:**
|
|
117
|
+
- Namespace structure MUST match directory structure
|
|
118
|
+
- Each namespace separator corresponds to a directory separator
|
|
119
|
+
- Class names MUST match file names exactly (case-sensitive)
|
|
120
|
+
|
|
121
|
+
**Example:**
|
|
122
|
+
```
|
|
123
|
+
Namespace: App\Services\Payment
|
|
124
|
+
File path: src/Services/Payment/PaymentService.php
|
|
125
|
+
Class name: PaymentService
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Autoloader Configuration
|
|
129
|
+
|
|
130
|
+
**Composer autoload:**
|
|
131
|
+
```json
|
|
132
|
+
{
|
|
133
|
+
"autoload": {
|
|
134
|
+
"psr-4": {
|
|
135
|
+
"App\\": "src/"
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## PSR-7: HTTP Messages
|
|
144
|
+
|
|
145
|
+
### Request and Response Objects
|
|
146
|
+
|
|
147
|
+
**Immutability:**
|
|
148
|
+
- HTTP message objects MUST be immutable
|
|
149
|
+
- Methods that modify state MUST return new instances
|
|
150
|
+
|
|
151
|
+
**Interfaces:**
|
|
152
|
+
- Use `Psr\Http\Message\RequestInterface` for requests
|
|
153
|
+
- Use `Psr\Http\Message\ResponseInterface` for responses
|
|
154
|
+
- Use `Psr\Http\Message\StreamInterface` for message bodies
|
|
155
|
+
|
|
156
|
+
**Example:**
|
|
157
|
+
```php
|
|
158
|
+
use Psr\Http\Message\ResponseInterface;
|
|
159
|
+
use Psr\Http\Message\ServerRequestInterface;
|
|
160
|
+
|
|
161
|
+
function handleRequest(ServerRequestInterface $request): ResponseInterface
|
|
162
|
+
{
|
|
163
|
+
$response = new Response();
|
|
164
|
+
return $response
|
|
165
|
+
->withStatus(200)
|
|
166
|
+
->withHeader('Content-Type', 'application/json')
|
|
167
|
+
->withBody($stream);
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## PSR-11: Container Interface
|
|
174
|
+
|
|
175
|
+
### Dependency Injection Container
|
|
176
|
+
|
|
177
|
+
**Container Interface:**
|
|
178
|
+
- Implement `Psr\Container\ContainerInterface`
|
|
179
|
+
- `get($id)` method retrieves entries
|
|
180
|
+
- `has($id)` method checks if entry exists
|
|
181
|
+
|
|
182
|
+
**Exception Handling:**
|
|
183
|
+
- Throw `Psr\Container\NotFoundExceptionInterface` when entry not found
|
|
184
|
+
- Throw `Psr\Container\ContainerExceptionInterface` for other errors
|
|
185
|
+
|
|
186
|
+
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
# Security Best Practices
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Security is paramount in PHP development. This document defines security standards following OWASP PHP Security Cheat Sheet guidelines.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Input Validation and Sanitization
|
|
10
|
+
|
|
11
|
+
### Validate All Input
|
|
12
|
+
|
|
13
|
+
**Rules:**
|
|
14
|
+
- ALL user input MUST be validated
|
|
15
|
+
- Validate on the server side (never trust client-side validation)
|
|
16
|
+
- Use whitelist validation (allow known good) over blacklist (block known bad)
|
|
17
|
+
- Validate data type, length, format, and range
|
|
18
|
+
|
|
19
|
+
**Examples:**
|
|
20
|
+
```php
|
|
21
|
+
// ✅ Good
|
|
22
|
+
function validateEmail(string $email): bool
|
|
23
|
+
{
|
|
24
|
+
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function validateAge(mixed $age): bool
|
|
28
|
+
{
|
|
29
|
+
return filter_var($age, FILTER_VALIDATE_INT, [
|
|
30
|
+
'options' => ['min_range' => 0, 'max_range' => 150]
|
|
31
|
+
]) !== false;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function processUserInput(array $data): array
|
|
35
|
+
{
|
|
36
|
+
$validated = [];
|
|
37
|
+
|
|
38
|
+
if (!isset($data['email']) || !validateEmail($data['email'])) {
|
|
39
|
+
throw new ValidationException('Invalid email');
|
|
40
|
+
}
|
|
41
|
+
$validated['email'] = $data['email'];
|
|
42
|
+
|
|
43
|
+
if (!isset($data['age']) || !validateAge($data['age'])) {
|
|
44
|
+
throw new ValidationException('Invalid age');
|
|
45
|
+
}
|
|
46
|
+
$validated['age'] = (int)$data['age'];
|
|
47
|
+
|
|
48
|
+
return $validated;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// ❌ Bad
|
|
52
|
+
function processUserInput(array $data): array
|
|
53
|
+
{
|
|
54
|
+
return $data; // No validation!
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Sanitize Input
|
|
59
|
+
|
|
60
|
+
**Rules:**
|
|
61
|
+
- Sanitize input after validation
|
|
62
|
+
- Use appropriate sanitization for context
|
|
63
|
+
- Use `filter_var()` with sanitization filters
|
|
64
|
+
|
|
65
|
+
**Examples:**
|
|
66
|
+
```php
|
|
67
|
+
// ✅ Good
|
|
68
|
+
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
|
|
69
|
+
$url = filter_var($_POST['url'], FILTER_SANITIZE_URL);
|
|
70
|
+
$string = filter_var($_POST['name'], FILTER_SANITIZE_SPECIAL_CHARS);
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## SQL Injection Prevention
|
|
76
|
+
|
|
77
|
+
### Use Prepared Statements
|
|
78
|
+
|
|
79
|
+
**Rules:**
|
|
80
|
+
- ALWAYS use prepared statements with parameter binding
|
|
81
|
+
- NEVER concatenate user input into SQL queries
|
|
82
|
+
- Use ORM query builders when available
|
|
83
|
+
|
|
84
|
+
**Examples:**
|
|
85
|
+
```php
|
|
86
|
+
// ✅ Good - PDO prepared statement
|
|
87
|
+
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
|
|
88
|
+
$stmt->execute(['email' => $email]);
|
|
89
|
+
$user = $stmt->fetch();
|
|
90
|
+
|
|
91
|
+
// ✅ Good - ORM query builder
|
|
92
|
+
$user = User::where('email', $email)->first();
|
|
93
|
+
|
|
94
|
+
// ✅ Good - Eloquent with bindings
|
|
95
|
+
$users = DB::select('SELECT * FROM users WHERE status = ?', [$status]);
|
|
96
|
+
|
|
97
|
+
// ❌ CRITICAL VULNERABILITY - SQL Injection
|
|
98
|
+
$query = "SELECT * FROM users WHERE email = '$email'";
|
|
99
|
+
$result = mysqli_query($conn, $query);
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Escape Output in SQL Context
|
|
103
|
+
|
|
104
|
+
**Rules:**
|
|
105
|
+
- When dynamic SQL is unavoidable, escape properly
|
|
106
|
+
- Use database-specific escaping functions
|
|
107
|
+
- Prefer parameterized queries over escaping
|
|
108
|
+
|
|
109
|
+
**Examples:**
|
|
110
|
+
```php
|
|
111
|
+
// ✅ Acceptable (but prepared statements are better)
|
|
112
|
+
$email = $pdo->quote($email);
|
|
113
|
+
$query = "SELECT * FROM users WHERE email = $email";
|
|
114
|
+
|
|
115
|
+
// ❌ Bad
|
|
116
|
+
$email = addslashes($email); // Not sufficient!
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Cross-Site Scripting (XSS) Prevention
|
|
122
|
+
|
|
123
|
+
### Escape Output
|
|
124
|
+
|
|
125
|
+
**Rules:**
|
|
126
|
+
- Escape ALL output to HTML
|
|
127
|
+
- Use context-appropriate escaping
|
|
128
|
+
- Use template engines with auto-escaping
|
|
129
|
+
|
|
130
|
+
**Escaping Functions:**
|
|
131
|
+
- `htmlspecialchars()` - HTML context
|
|
132
|
+
- `htmlentities()` - HTML entities
|
|
133
|
+
- `json_encode()` - JavaScript context
|
|
134
|
+
- `urlencode()` - URL context
|
|
135
|
+
|
|
136
|
+
**Examples:**
|
|
137
|
+
```php
|
|
138
|
+
// ✅ Good - HTML context
|
|
139
|
+
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
|
|
140
|
+
|
|
141
|
+
// ✅ Good - JavaScript context
|
|
142
|
+
echo '<script>var name = ' . json_encode($userName) . ';</script>';
|
|
143
|
+
|
|
144
|
+
// ✅ Good - URL context
|
|
145
|
+
echo '<a href="?search=' . urlencode($searchTerm) . '">Search</a>';
|
|
146
|
+
|
|
147
|
+
// ✅ Good - Template engine (Blade)
|
|
148
|
+
{{ $userInput }} // Auto-escaped
|
|
149
|
+
|
|
150
|
+
// ❌ CRITICAL VULNERABILITY - XSS
|
|
151
|
+
echo $userInput; // Not escaped!
|
|
152
|
+
echo "<div>$userInput</div>"; // Not escaped!
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Content Security Policy
|
|
156
|
+
|
|
157
|
+
**Rules:**
|
|
158
|
+
- Implement Content Security Policy (CSP) headers
|
|
159
|
+
- Restrict script sources
|
|
160
|
+
- Disable inline scripts when possible
|
|
161
|
+
|
|
162
|
+
**Examples:**
|
|
163
|
+
```php
|
|
164
|
+
// ✅ Good
|
|
165
|
+
header("Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com");
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Cross-Site Request Forgery (CSRF) Prevention
|
|
171
|
+
|
|
172
|
+
### CSRF Tokens
|
|
173
|
+
|
|
174
|
+
**Rules:**
|
|
175
|
+
- Use CSRF tokens for all state-changing requests
|
|
176
|
+
- Validate tokens on the server side
|
|
177
|
+
- Regenerate tokens after authentication
|
|
178
|
+
|
|
179
|
+
**Examples:**
|
|
180
|
+
```php
|
|
181
|
+
// ✅ Good - Generate token
|
|
182
|
+
session_start();
|
|
183
|
+
if (empty($_SESSION['csrf_token'])) {
|
|
184
|
+
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// ✅ Good - Validate token
|
|
188
|
+
function validateCsrfToken(string $token): bool
|
|
189
|
+
{
|
|
190
|
+
return isset($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
194
|
+
if (!validateCsrfToken($_POST['csrf_token'] ?? '')) {
|
|
195
|
+
throw new SecurityException('Invalid CSRF token');
|
|
196
|
+
}
|
|
197
|
+
// Process form
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// HTML form
|
|
201
|
+
echo '<input type="hidden" name="csrf_token" value="' . htmlspecialchars($_SESSION['csrf_token']) . '">';
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Session Security
|
|
207
|
+
|
|
208
|
+
### Secure Session Configuration
|
|
209
|
+
|
|
210
|
+
**Rules:**
|
|
211
|
+
- Regenerate session ID after authentication
|
|
212
|
+
- Set secure and httponly flags on cookies
|
|
213
|
+
- Implement session timeout
|
|
214
|
+
- Validate session data on each request
|
|
215
|
+
|
|
216
|
+
**Examples:**
|
|
217
|
+
```php
|
|
218
|
+
// ✅ Good - Secure session configuration
|
|
219
|
+
ini_set('session.cookie_httponly', 1);
|
|
220
|
+
ini_set('session.cookie_secure', 1); // HTTPS only
|
|
221
|
+
ini_set('session.cookie_samesite', 'Strict');
|
|
222
|
+
ini_set('session.use_strict_mode', 1);
|
|
223
|
+
|
|
224
|
+
session_start();
|
|
225
|
+
|
|
226
|
+
// ✅ Good - Regenerate after login
|
|
227
|
+
function loginUser(User $user): void
|
|
228
|
+
{
|
|
229
|
+
session_regenerate_id(true);
|
|
230
|
+
$_SESSION['user_id'] = $user->id;
|
|
231
|
+
$_SESSION['login_time'] = time();
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// ✅ Good - Session timeout
|
|
235
|
+
function validateSession(): bool
|
|
236
|
+
{
|
|
237
|
+
$timeout = 3600; // 1 hour
|
|
238
|
+
|
|
239
|
+
if (isset($_SESSION['login_time']) && (time() - $_SESSION['login_time']) > $timeout) {
|
|
240
|
+
session_destroy();
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
$_SESSION['login_time'] = time(); // Refresh
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## Password Security
|
|
252
|
+
|
|
253
|
+
### Password Hashing
|
|
254
|
+
|
|
255
|
+
**Rules:**
|
|
256
|
+
- Use `password_hash()` with bcrypt or argon2
|
|
257
|
+
- NEVER store passwords in plain text
|
|
258
|
+
- Use `password_verify()` for verification
|
|
259
|
+
- Rehash passwords when algorithm changes
|
|
260
|
+
|
|
261
|
+
**Examples:**
|
|
262
|
+
```php
|
|
263
|
+
// ✅ Good - Hash password
|
|
264
|
+
$hashedPassword = password_hash($password, PASSWORD_ARGON2ID);
|
|
265
|
+
|
|
266
|
+
// ✅ Good - Verify password
|
|
267
|
+
if (password_verify($inputPassword, $user->password)) {
|
|
268
|
+
// Password correct
|
|
269
|
+
|
|
270
|
+
// Rehash if needed
|
|
271
|
+
if (password_needs_rehash($user->password, PASSWORD_ARGON2ID)) {
|
|
272
|
+
$user->password = password_hash($inputPassword, PASSWORD_ARGON2ID);
|
|
273
|
+
$user->save();
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// ❌ CRITICAL VULNERABILITY
|
|
278
|
+
$password = md5($password); // Weak hashing!
|
|
279
|
+
$password = sha1($password); // Still weak!
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## File Upload Security
|
|
285
|
+
|
|
286
|
+
### Validate Uploads
|
|
287
|
+
|
|
288
|
+
**Rules:**
|
|
289
|
+
- Validate file type (MIME type and extension)
|
|
290
|
+
- Limit file size
|
|
291
|
+
- Store uploads outside web root
|
|
292
|
+
- Generate random filenames
|
|
293
|
+
- Scan for malware when possible
|
|
294
|
+
|
|
295
|
+
**Examples:**
|
|
296
|
+
```php
|
|
297
|
+
// ✅ Good
|
|
298
|
+
function handleFileUpload(array $file): string
|
|
299
|
+
{
|
|
300
|
+
$allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
|
|
301
|
+
$maxSize = 5 * 1024 * 1024; // 5MB
|
|
302
|
+
|
|
303
|
+
if (!in_array($file['type'], $allowedTypes)) {
|
|
304
|
+
throw new ValidationException('Invalid file type');
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
if ($file['size'] > $maxSize) {
|
|
308
|
+
throw new ValidationException('File too large');
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
$extension = pathinfo($file['name'], PATHINFO_EXTENSION);
|
|
312
|
+
$filename = bin2hex(random_bytes(16)) . '.' . $extension;
|
|
313
|
+
$uploadPath = '/var/uploads/' . $filename; // Outside web root
|
|
314
|
+
|
|
315
|
+
if (!move_uploaded_file($file['tmp_name'], $uploadPath)) {
|
|
316
|
+
throw new RuntimeException('Upload failed');
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
return $filename;
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## Authentication and Authorization
|
|
326
|
+
|
|
327
|
+
### Secure Authentication
|
|
328
|
+
|
|
329
|
+
**Rules:**
|
|
330
|
+
- Implement rate limiting for login attempts
|
|
331
|
+
- Use multi-factor authentication when possible
|
|
332
|
+
- Lock accounts after failed attempts
|
|
333
|
+
- Log authentication events
|
|
334
|
+
|
|
335
|
+
**Examples:**
|
|
336
|
+
```php
|
|
337
|
+
// ✅ Good
|
|
338
|
+
function attemptLogin(string $email, string $password): bool
|
|
339
|
+
{
|
|
340
|
+
if ($this->isRateLimited($email)) {
|
|
341
|
+
throw new TooManyAttemptsException('Too many login attempts');
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
$user = User::where('email', $email)->first();
|
|
345
|
+
|
|
346
|
+
if (!$user || !password_verify($password, $user->password)) {
|
|
347
|
+
$this->incrementFailedAttempts($email);
|
|
348
|
+
$this->logger->warning('Failed login attempt', ['email' => $email]);
|
|
349
|
+
return false;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
$this->clearFailedAttempts($email);
|
|
353
|
+
$this->logger->info('Successful login', ['user_id' => $user->id]);
|
|
354
|
+
loginUser($user);
|
|
355
|
+
return true;
|
|
356
|
+
}
|
|
357
|
+
```
|
|
358
|
+
|