@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,248 @@
|
|
|
1
|
+
# PHP Coding Standards Module
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Comprehensive PHP coding standards module for Augment Extensions, providing guidelines for modern PHP development following PSR standards and best practices across various project types.
|
|
6
|
+
|
|
7
|
+
**Version:** 1.0.0
|
|
8
|
+
**Character Count:** ~186,539
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Key Benefits
|
|
13
|
+
|
|
14
|
+
✅ **PSR Compliance** - Full coverage of PSR-1, PSR-12, PSR-4, PSR-7, PSR-11, PSR-15, PSR-18
|
|
15
|
+
✅ **Category-Specific Rules** - Tailored guidelines for web, API, CLI, CMS, e-commerce, and legacy projects
|
|
16
|
+
✅ **Security-First** - OWASP PHP security best practices built-in
|
|
17
|
+
✅ **Modern PHP** - PHP 8+ features including typed properties, union types, attributes
|
|
18
|
+
✅ **Quality Tools** - Integration with PHPStan, Psalm, PHP-CS-Fixer, PHPUnit
|
|
19
|
+
✅ **Flexible Configuration** - Category selection system for project-specific needs
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
### With CLI (Future)
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
augx link coding-standards/php
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Manual Setup
|
|
32
|
+
|
|
33
|
+
1. Copy module contents to your project's `.augment/` folder
|
|
34
|
+
2. Create configuration file at `.augment/php-config.json`
|
|
35
|
+
3. Configure categories for your project type
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Configuration
|
|
40
|
+
|
|
41
|
+
Create `.augment/php-config.json` in your project root:
|
|
42
|
+
|
|
43
|
+
```json
|
|
44
|
+
{
|
|
45
|
+
"php_categories": ["web", "api"],
|
|
46
|
+
"psr_standards": ["PSR-1", "PSR-12", "PSR-4", "PSR-7"],
|
|
47
|
+
"php_version": "8.2",
|
|
48
|
+
"strict_types": true,
|
|
49
|
+
"static_analysis": {
|
|
50
|
+
"tool": "phpstan",
|
|
51
|
+
"level": 8
|
|
52
|
+
},
|
|
53
|
+
"code_style": {
|
|
54
|
+
"tool": "php-cs-fixer",
|
|
55
|
+
"ruleset": "PSR-12"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Supported Categories
|
|
61
|
+
|
|
62
|
+
- **web** - Web applications (MVC, template engines, form handling)
|
|
63
|
+
- **api** - RESTful APIs (HTTP methods, authentication, response formatting)
|
|
64
|
+
- **cli** - Command-line tools (Symfony Console, argument handling)
|
|
65
|
+
- **cms** - CMS integrations (WordPress, Drupal plugins/themes)
|
|
66
|
+
- **ecommerce** - E-commerce systems (shopping carts, payment gateways, WooCommerce)
|
|
67
|
+
- **legacy** - Legacy code migration (refactoring, namespace introduction, type hints)
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Directory Structure
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
augment-extensions/coding-standards/php/
|
|
75
|
+
├── module.json # Module metadata and configuration
|
|
76
|
+
├── README.md # This file
|
|
77
|
+
├── rules/ # Rule files
|
|
78
|
+
│ ├── psr-standards.md # PSR-1, PSR-12, PSR-4, PSR-7, PSR-11
|
|
79
|
+
│ ├── naming-conventions.md # Variables, functions, classes, constants
|
|
80
|
+
│ ├── type-declarations.md # Type hints, return types, strict types
|
|
81
|
+
│ ├── error-handling.md # Exceptions, logging, retry patterns
|
|
82
|
+
│ ├── security.md # OWASP guidelines, input validation, XSS/SQL injection
|
|
83
|
+
│ ├── performance.md # OPcache, database optimization, caching
|
|
84
|
+
│ ├── testing.md # PHPUnit, unit tests, integration tests
|
|
85
|
+
│ ├── documentation.md # PHPDoc standards, inline comments
|
|
86
|
+
│ ├── code-quality.md # PHPStan, PHP-CS-Fixer, Composer
|
|
87
|
+
│ ├── category-configuration.md # Category selection and configuration
|
|
88
|
+
│ ├── web-applications.md # MVC, template engines, form handling
|
|
89
|
+
│ ├── api-development.md # RESTful design, authentication, responses
|
|
90
|
+
│ ├── cli-tools.md # Symfony Console, argument handling
|
|
91
|
+
│ ├── cms-integration.md # WordPress, Drupal hooks and security
|
|
92
|
+
│ ├── ecommerce.md # Shopping carts, payment gateways, WooCommerce
|
|
93
|
+
│ └── legacy-migration.md # Refactoring strategies, type hints, DI
|
|
94
|
+
└── examples/ # Code examples
|
|
95
|
+
├── web-application-example.php
|
|
96
|
+
├── api-endpoint-example.php
|
|
97
|
+
├── cli-command-example.php
|
|
98
|
+
├── wordpress-plugin-example.php
|
|
99
|
+
├── woocommerce-extension-example.php
|
|
100
|
+
└── legacy-refactoring-example.php
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Core Workflows
|
|
106
|
+
|
|
107
|
+
### 1. New PHP Project
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
{
|
|
111
|
+
"php_categories": ["web"],
|
|
112
|
+
"php_version": "8.2",
|
|
113
|
+
"strict_types": true,
|
|
114
|
+
"static_analysis": {
|
|
115
|
+
"tool": "phpstan",
|
|
116
|
+
"level": 8
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 2. RESTful API
|
|
122
|
+
|
|
123
|
+
```json
|
|
124
|
+
{
|
|
125
|
+
"php_categories": ["api"],
|
|
126
|
+
"psr_standards": ["PSR-1", "PSR-12", "PSR-4", "PSR-7"],
|
|
127
|
+
"php_version": "8.2",
|
|
128
|
+
"strict_types": true
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 3. WordPress Plugin
|
|
133
|
+
|
|
134
|
+
```json
|
|
135
|
+
{
|
|
136
|
+
"php_categories": ["cms"],
|
|
137
|
+
"php_version": "7.4",
|
|
138
|
+
"strict_types": false,
|
|
139
|
+
"static_analysis": {
|
|
140
|
+
"tool": "phpstan",
|
|
141
|
+
"level": 4
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### 4. Legacy Migration
|
|
147
|
+
|
|
148
|
+
```json
|
|
149
|
+
{
|
|
150
|
+
"php_categories": ["legacy"],
|
|
151
|
+
"php_version": "7.4",
|
|
152
|
+
"strict_types": false,
|
|
153
|
+
"static_analysis": {
|
|
154
|
+
"tool": "phpstan",
|
|
155
|
+
"level": 2
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Universal Rules (Applied to All Categories)
|
|
163
|
+
|
|
164
|
+
1. **PSR Standards** - PSR-1, PSR-12, PSR-4, PSR-7, PSR-11
|
|
165
|
+
2. **Naming Conventions** - camelCase, PascalCase, UPPER_SNAKE_CASE
|
|
166
|
+
3. **Type Declarations** - Strict types, type hints, return types
|
|
167
|
+
4. **Error Handling** - Exceptions, PSR-3 logging, retry patterns
|
|
168
|
+
5. **Security** - OWASP guidelines, input validation, XSS/SQL injection prevention
|
|
169
|
+
6. **Performance** - OPcache, database optimization, caching strategies
|
|
170
|
+
7. **Testing** - PHPUnit, AAA pattern, mocks and stubs
|
|
171
|
+
8. **Documentation** - PHPDoc blocks, inline comments
|
|
172
|
+
9. **Code Quality** - PHPStan, PHP-CS-Fixer, Composer best practices
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Category-Specific Rules
|
|
177
|
+
|
|
178
|
+
### Web Applications
|
|
179
|
+
- MVC architecture patterns
|
|
180
|
+
- Template engine usage (Twig, Blade)
|
|
181
|
+
- Form handling and CSRF protection
|
|
182
|
+
- Session management
|
|
183
|
+
|
|
184
|
+
### API Development
|
|
185
|
+
- RESTful design principles
|
|
186
|
+
- HTTP method semantics
|
|
187
|
+
- Authentication (OAuth 2.0, JWT)
|
|
188
|
+
- Response formatting and pagination
|
|
189
|
+
|
|
190
|
+
### CLI Tools
|
|
191
|
+
- Symfony Console component
|
|
192
|
+
- Argument and option handling
|
|
193
|
+
- Exit codes and error handling
|
|
194
|
+
- Progress bars for long operations
|
|
195
|
+
|
|
196
|
+
### CMS Integration
|
|
197
|
+
- WordPress/Drupal coding standards
|
|
198
|
+
- Hook and filter usage
|
|
199
|
+
- Nonce verification
|
|
200
|
+
- Shortcode implementation
|
|
201
|
+
|
|
202
|
+
### E-commerce
|
|
203
|
+
- Shopping cart management
|
|
204
|
+
- Payment gateway integration (PCI DSS)
|
|
205
|
+
- Order processing with transactions
|
|
206
|
+
- WooCommerce hooks and classes
|
|
207
|
+
|
|
208
|
+
### Legacy Migration
|
|
209
|
+
- Incremental refactoring strategies
|
|
210
|
+
- Namespace introduction
|
|
211
|
+
- Type hint addition
|
|
212
|
+
- Dependency injection patterns
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Contents
|
|
217
|
+
|
|
218
|
+
- **15 rule files** covering all aspects of PHP development
|
|
219
|
+
- **6 code examples** demonstrating best practices for each category
|
|
220
|
+
- **Configuration system** for category selection
|
|
221
|
+
- **Conflict detection** for overlapping rules
|
|
222
|
+
- **PSR compliance** for all major standards
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Dependencies
|
|
227
|
+
|
|
228
|
+
### Recommended Composer Packages
|
|
229
|
+
|
|
230
|
+
```json
|
|
231
|
+
{
|
|
232
|
+
"require-dev": {
|
|
233
|
+
"phpunit/phpunit": "^10.0",
|
|
234
|
+
"phpstan/phpstan": "^1.10",
|
|
235
|
+
"friendsofphp/php-cs-fixer": "^3.0"
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## Links
|
|
243
|
+
|
|
244
|
+
- [PHP-FIG PSR Standards](https://www.php-fig.org/psr/)
|
|
245
|
+
- [PHPStan Documentation](https://phpstan.org/)
|
|
246
|
+
- [PHP-CS-Fixer Documentation](https://cs.symfony.com/)
|
|
247
|
+
- [OWASP PHP Security Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/PHP_Configuration_Cheat_Sheet.html)
|
|
248
|
+
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* RESTful API Endpoint Example - Product Resource CRUD
|
|
5
|
+
*
|
|
6
|
+
* This example demonstrates best practices for PHP API development including:
|
|
7
|
+
* - RESTful design with proper HTTP methods
|
|
8
|
+
* - PSR-7 compliant responses
|
|
9
|
+
* - JWT authentication
|
|
10
|
+
* - API Resources for consistent response formatting
|
|
11
|
+
* - HATEOAS links
|
|
12
|
+
* - Proper HTTP status codes
|
|
13
|
+
* - Input validation
|
|
14
|
+
* - Error handling
|
|
15
|
+
* - Rate limiting
|
|
16
|
+
* - Pagination
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
namespace App\Http\Controllers\Api\V1;
|
|
20
|
+
|
|
21
|
+
use App\Http\Requests\Api\StoreProductRequest;
|
|
22
|
+
use App\Http\Requests\Api\UpdateProductRequest;
|
|
23
|
+
use App\Http\Resources\ProductResource;
|
|
24
|
+
use App\Http\Resources\ProductCollection;
|
|
25
|
+
use App\Models\Product;
|
|
26
|
+
use Illuminate\Http\JsonResponse;
|
|
27
|
+
use Illuminate\Http\Request;
|
|
28
|
+
use Illuminate\Http\Response;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Product API Controller
|
|
32
|
+
*
|
|
33
|
+
* @OA\Tag(name="Products", description="Product management endpoints")
|
|
34
|
+
*/
|
|
35
|
+
class ProductController extends Controller
|
|
36
|
+
{
|
|
37
|
+
public function __construct()
|
|
38
|
+
{
|
|
39
|
+
$this->middleware('auth:api');
|
|
40
|
+
$this->middleware('throttle:60,1'); // Rate limiting: 60 requests per minute
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* List all products with pagination
|
|
45
|
+
*
|
|
46
|
+
* @OA\Get(
|
|
47
|
+
* path="/api/v1/products",
|
|
48
|
+
* summary="Get list of products",
|
|
49
|
+
* tags={"Products"},
|
|
50
|
+
* @OA\Parameter(
|
|
51
|
+
* name="page",
|
|
52
|
+
* in="query",
|
|
53
|
+
* description="Page number",
|
|
54
|
+
* required=false,
|
|
55
|
+
* @OA\Schema(type="integer")
|
|
56
|
+
* ),
|
|
57
|
+
* @OA\Parameter(
|
|
58
|
+
* name="per_page",
|
|
59
|
+
* in="query",
|
|
60
|
+
* description="Items per page",
|
|
61
|
+
* required=false,
|
|
62
|
+
* @OA\Schema(type="integer", default=20)
|
|
63
|
+
* ),
|
|
64
|
+
* @OA\Response(
|
|
65
|
+
* response=200,
|
|
66
|
+
* description="Successful operation"
|
|
67
|
+
* ),
|
|
68
|
+
* security={{"bearerAuth": {}}}
|
|
69
|
+
* )
|
|
70
|
+
*/
|
|
71
|
+
public function index(Request $request): JsonResponse
|
|
72
|
+
{
|
|
73
|
+
$perPage = $request->input('per_page', 20);
|
|
74
|
+
$products = Product::with('category')
|
|
75
|
+
->paginate($perPage);
|
|
76
|
+
|
|
77
|
+
return (new ProductCollection($products))
|
|
78
|
+
->response()
|
|
79
|
+
->setStatusCode(200);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Get a single product
|
|
84
|
+
*
|
|
85
|
+
* GET /api/v1/products/{id}
|
|
86
|
+
*/
|
|
87
|
+
public function show(int $id): JsonResponse
|
|
88
|
+
{
|
|
89
|
+
$product = Product::with(['category', 'reviews'])
|
|
90
|
+
->findOrFail($id);
|
|
91
|
+
|
|
92
|
+
return (new ProductResource($product))
|
|
93
|
+
->response()
|
|
94
|
+
->setStatusCode(200);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Create a new product
|
|
99
|
+
*
|
|
100
|
+
* POST /api/v1/products
|
|
101
|
+
*/
|
|
102
|
+
public function store(StoreProductRequest $request): JsonResponse
|
|
103
|
+
{
|
|
104
|
+
$product = Product::create($request->validated());
|
|
105
|
+
|
|
106
|
+
return (new ProductResource($product))
|
|
107
|
+
->response()
|
|
108
|
+
->setStatusCode(201)
|
|
109
|
+
->header('Location', route('api.v1.products.show', $product));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Update an existing product (full replacement)
|
|
114
|
+
*
|
|
115
|
+
* PUT /api/v1/products/{id}
|
|
116
|
+
*/
|
|
117
|
+
public function update(UpdateProductRequest $request, int $id): JsonResponse
|
|
118
|
+
{
|
|
119
|
+
$product = Product::findOrFail($id);
|
|
120
|
+
$product->update($request->validated());
|
|
121
|
+
|
|
122
|
+
return (new ProductResource($product))
|
|
123
|
+
->response()
|
|
124
|
+
->setStatusCode(200);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Partially update a product
|
|
129
|
+
*
|
|
130
|
+
* PATCH /api/v1/products/{id}
|
|
131
|
+
*/
|
|
132
|
+
public function patch(Request $request, int $id): JsonResponse
|
|
133
|
+
{
|
|
134
|
+
$product = Product::findOrFail($id);
|
|
135
|
+
|
|
136
|
+
$validated = $request->validate([
|
|
137
|
+
'name' => 'sometimes|string|max:255',
|
|
138
|
+
'price' => 'sometimes|numeric|min:0',
|
|
139
|
+
'stock' => 'sometimes|integer|min:0'
|
|
140
|
+
]);
|
|
141
|
+
|
|
142
|
+
$product->update($validated);
|
|
143
|
+
|
|
144
|
+
return (new ProductResource($product))
|
|
145
|
+
->response()
|
|
146
|
+
->setStatusCode(200);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Delete a product
|
|
151
|
+
*
|
|
152
|
+
* DELETE /api/v1/products/{id}
|
|
153
|
+
*/
|
|
154
|
+
public function destroy(int $id): Response
|
|
155
|
+
{
|
|
156
|
+
$product = Product::findOrFail($id);
|
|
157
|
+
$product->delete();
|
|
158
|
+
|
|
159
|
+
return response()->noContent(); // 204 No Content
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// ============================================================================
|
|
164
|
+
// API Resource - Response Formatting with HATEOAS
|
|
165
|
+
// ============================================================================
|
|
166
|
+
|
|
167
|
+
namespace App\Http\Resources;
|
|
168
|
+
|
|
169
|
+
use Illuminate\Http\Resources\Json\JsonResource;
|
|
170
|
+
|
|
171
|
+
class ProductResource extends JsonResource
|
|
172
|
+
{
|
|
173
|
+
/**
|
|
174
|
+
* Transform the resource into an array with HATEOAS links
|
|
175
|
+
*/
|
|
176
|
+
public function toArray($request): array
|
|
177
|
+
{
|
|
178
|
+
return [
|
|
179
|
+
'id' => $this->id,
|
|
180
|
+
'name' => $this->name,
|
|
181
|
+
'description' => $this->description,
|
|
182
|
+
'price' => [
|
|
183
|
+
'amount' => $this->price,
|
|
184
|
+
'currency' => 'USD',
|
|
185
|
+
'formatted' => '$' . number_format($this->price, 2)
|
|
186
|
+
],
|
|
187
|
+
'stock' => $this->stock,
|
|
188
|
+
'category' => [
|
|
189
|
+
'id' => $this->category->id,
|
|
190
|
+
'name' => $this->category->name
|
|
191
|
+
],
|
|
192
|
+
'created_at' => $this->created_at->toIso8601String(),
|
|
193
|
+
'updated_at' => $this->updated_at->toIso8601String(),
|
|
194
|
+
|
|
195
|
+
// HATEOAS links
|
|
196
|
+
'links' => [
|
|
197
|
+
'self' => route('api.v1.products.show', $this->id),
|
|
198
|
+
'category' => route('api.v1.categories.show', $this->category_id),
|
|
199
|
+
'reviews' => route('api.v1.products.reviews.index', $this->id)
|
|
200
|
+
]
|
|
201
|
+
];
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* CLI Command Example - Data Migration Script
|
|
5
|
+
*
|
|
6
|
+
* This example demonstrates best practices for PHP CLI tools including:
|
|
7
|
+
* - Symfony Console component usage
|
|
8
|
+
* - Argument and option handling with validation
|
|
9
|
+
* - Progress bars for long-running operations
|
|
10
|
+
* - Proper error handling and exit codes
|
|
11
|
+
* - Idempotency (can be run multiple times safely)
|
|
12
|
+
* - Database transactions
|
|
13
|
+
* - Logging
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
namespace App\Console\Commands;
|
|
17
|
+
|
|
18
|
+
use Symfony\Component\Console\Command\Command;
|
|
19
|
+
use Symfony\Component\Console\Input\InputInterface;
|
|
20
|
+
use Symfony\Component\Console\Input\InputArgument;
|
|
21
|
+
use Symfony\Component\Console\Input\InputOption;
|
|
22
|
+
use Symfony\Component\Console\Output\OutputInterface;
|
|
23
|
+
use Symfony\Component\Console\Helper\ProgressBar;
|
|
24
|
+
use Symfony\Component\Console\Question\ConfirmationQuestion;
|
|
25
|
+
use Illuminate\Support\Facades\DB;
|
|
26
|
+
use Illuminate\Support\Facades\Log;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Migrate user data from legacy system to new system
|
|
30
|
+
*
|
|
31
|
+
* Usage:
|
|
32
|
+
* php artisan users:migrate legacy_users.csv --batch-size=100 --dry-run
|
|
33
|
+
*/
|
|
34
|
+
class MigrateUsersCommand extends Command
|
|
35
|
+
{
|
|
36
|
+
protected static $defaultName = 'users:migrate';
|
|
37
|
+
protected static $defaultDescription = 'Migrate users from legacy CSV file to new system';
|
|
38
|
+
|
|
39
|
+
private int $successCount = 0;
|
|
40
|
+
private int $errorCount = 0;
|
|
41
|
+
private int $skippedCount = 0;
|
|
42
|
+
|
|
43
|
+
protected function configure(): void
|
|
44
|
+
{
|
|
45
|
+
$this
|
|
46
|
+
->setDescription('Migrate users from a CSV file to the new database')
|
|
47
|
+
->setHelp('This command migrates user data from a legacy CSV file...')
|
|
48
|
+
->addArgument(
|
|
49
|
+
'file',
|
|
50
|
+
InputArgument::REQUIRED,
|
|
51
|
+
'Path to the CSV file containing user data'
|
|
52
|
+
)
|
|
53
|
+
->addOption(
|
|
54
|
+
'batch-size',
|
|
55
|
+
'b',
|
|
56
|
+
InputOption::VALUE_REQUIRED,
|
|
57
|
+
'Number of records to process in each batch',
|
|
58
|
+
100
|
|
59
|
+
)
|
|
60
|
+
->addOption(
|
|
61
|
+
'dry-run',
|
|
62
|
+
null,
|
|
63
|
+
InputOption::VALUE_NONE,
|
|
64
|
+
'Run without making any changes to the database'
|
|
65
|
+
)
|
|
66
|
+
->addOption(
|
|
67
|
+
'force',
|
|
68
|
+
'f',
|
|
69
|
+
InputOption::VALUE_NONE,
|
|
70
|
+
'Skip confirmation prompt'
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
protected function execute(InputInterface $input, OutputInterface $output): int
|
|
75
|
+
{
|
|
76
|
+
$filename = $input->getArgument('file');
|
|
77
|
+
$batchSize = (int) $input->getOption('batch-size');
|
|
78
|
+
$isDryRun = $input->getOption('dry-run');
|
|
79
|
+
$force = $input->getOption('force');
|
|
80
|
+
|
|
81
|
+
// Validate file exists
|
|
82
|
+
if (!file_exists($filename)) {
|
|
83
|
+
$output->writeln("<error>File not found: {$filename}</error>");
|
|
84
|
+
return Command::FAILURE;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Validate file is readable
|
|
88
|
+
if (!is_readable($filename)) {
|
|
89
|
+
$output->writeln("<error>File is not readable: {$filename}</error>");
|
|
90
|
+
return Command::FAILURE;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Count total records
|
|
94
|
+
$totalRecords = $this->countRecords($filename);
|
|
95
|
+
|
|
96
|
+
$output->writeln("<info>Found {$totalRecords} records to migrate</info>");
|
|
97
|
+
|
|
98
|
+
if ($isDryRun) {
|
|
99
|
+
$output->writeln("<comment>DRY RUN MODE - No changes will be made</comment>");
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Confirmation prompt
|
|
103
|
+
if (!$force && !$isDryRun) {
|
|
104
|
+
$helper = $this->getHelper('question');
|
|
105
|
+
$question = new ConfirmationQuestion(
|
|
106
|
+
'Continue with migration? (y/n) ',
|
|
107
|
+
false
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
if (!$helper->ask($input, $output, $question)) {
|
|
111
|
+
$output->writeln('<comment>Migration cancelled</comment>');
|
|
112
|
+
return Command::SUCCESS;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Create progress bar
|
|
117
|
+
$progressBar = new ProgressBar($output, $totalRecords);
|
|
118
|
+
$progressBar->setFormat(' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% %memory:6s%');
|
|
119
|
+
$progressBar->start();
|
|
120
|
+
|
|
121
|
+
// Process file in batches
|
|
122
|
+
try {
|
|
123
|
+
$this->processFile($filename, $batchSize, $isDryRun, $progressBar);
|
|
124
|
+
|
|
125
|
+
$progressBar->finish();
|
|
126
|
+
$output->writeln('');
|
|
127
|
+
|
|
128
|
+
// Display summary
|
|
129
|
+
$this->displaySummary($output, $isDryRun);
|
|
130
|
+
|
|
131
|
+
// Log completion
|
|
132
|
+
Log::info('User migration completed', [
|
|
133
|
+
'file' => $filename,
|
|
134
|
+
'success' => $this->successCount,
|
|
135
|
+
'errors' => $this->errorCount,
|
|
136
|
+
'skipped' => $this->skippedCount,
|
|
137
|
+
'dry_run' => $isDryRun
|
|
138
|
+
]);
|
|
139
|
+
|
|
140
|
+
return Command::SUCCESS;
|
|
141
|
+
|
|
142
|
+
} catch (\Exception $e) {
|
|
143
|
+
$progressBar->finish();
|
|
144
|
+
$output->writeln('');
|
|
145
|
+
$output->writeln("<error>Migration failed: {$e->getMessage()}</error>");
|
|
146
|
+
|
|
147
|
+
Log::error('User migration failed', [
|
|
148
|
+
'file' => $filename,
|
|
149
|
+
'error' => $e->getMessage(),
|
|
150
|
+
'trace' => $e->getTraceAsString()
|
|
151
|
+
]);
|
|
152
|
+
|
|
153
|
+
return Command::FAILURE;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
private function countRecords(string $filename): int
|
|
158
|
+
{
|
|
159
|
+
$count = 0;
|
|
160
|
+
$handle = fopen($filename, 'r');
|
|
161
|
+
|
|
162
|
+
// Skip header
|
|
163
|
+
fgetcsv($handle);
|
|
164
|
+
|
|
165
|
+
while (fgetcsv($handle) !== false) {
|
|
166
|
+
$count++;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
fclose($handle);
|
|
170
|
+
return $count;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
private function processFile(
|
|
174
|
+
string $filename,
|
|
175
|
+
int $batchSize,
|
|
176
|
+
bool $isDryRun,
|
|
177
|
+
ProgressBar $progressBar
|
|
178
|
+
): void {
|
|
179
|
+
$handle = fopen($filename, 'r');
|
|
180
|
+
|
|
181
|
+
// Read header
|
|
182
|
+
$header = fgetcsv($handle);
|
|
183
|
+
|
|
184
|
+
$batch = [];
|
|
185
|
+
|
|
186
|
+
while (($row = fgetcsv($handle)) !== false) {
|
|
187
|
+
$data = array_combine($header, $row);
|
|
188
|
+
$batch[] = $data;
|
|
189
|
+
|
|
190
|
+
if (count($batch) >= $batchSize) {
|
|
191
|
+
$this->processBatch($batch, $isDryRun);
|
|
192
|
+
$progressBar->advance(count($batch));
|
|
193
|
+
$batch = [];
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Process remaining records
|
|
198
|
+
if (!empty($batch)) {
|
|
199
|
+
$this->processBatch($batch, $isDryRun);
|
|
200
|
+
$progressBar->advance(count($batch));
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
fclose($handle);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|