@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,472 @@
|
|
|
1
|
+
# PHP CLI Tools Best Practices
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This guide provides best practices for developing command-line interface (CLI) tools in PHP using the Symfony Console component, including command structure, argument handling, error handling, and user interaction.
|
|
6
|
+
|
|
7
|
+
## Symfony Console Component
|
|
8
|
+
|
|
9
|
+
### Basic Command Structure
|
|
10
|
+
|
|
11
|
+
```php
|
|
12
|
+
<?php
|
|
13
|
+
|
|
14
|
+
namespace App\Console\Commands;
|
|
15
|
+
|
|
16
|
+
use Symfony\Component\Console\Command\Command;
|
|
17
|
+
use Symfony\Component\Console\Input\InputInterface;
|
|
18
|
+
use Symfony\Component\Console\Input\InputArgument;
|
|
19
|
+
use Symfony\Component\Console\Input\InputOption;
|
|
20
|
+
use Symfony\Component\Console\Output\OutputInterface;
|
|
21
|
+
|
|
22
|
+
class UserCreateCommand extends Command
|
|
23
|
+
{
|
|
24
|
+
protected static $defaultName = 'user:create';
|
|
25
|
+
protected static $defaultDescription = 'Create a new user';
|
|
26
|
+
|
|
27
|
+
protected function configure(): void
|
|
28
|
+
{
|
|
29
|
+
$this
|
|
30
|
+
->setDescription('Create a new user in the system')
|
|
31
|
+
->setHelp('This command allows you to create a user...')
|
|
32
|
+
->addArgument('name', InputArgument::REQUIRED, 'The name of the user')
|
|
33
|
+
->addArgument('email', InputArgument::REQUIRED, 'The email of the user')
|
|
34
|
+
->addOption('admin', 'a', InputOption::VALUE_NONE, 'Make the user an admin')
|
|
35
|
+
->addOption('role', 'r', InputOption::VALUE_REQUIRED, 'User role', 'user');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
protected function execute(InputInterface $input, OutputInterface $output): int
|
|
39
|
+
{
|
|
40
|
+
$name = $input->getArgument('name');
|
|
41
|
+
$email = $input->getArgument('email');
|
|
42
|
+
$isAdmin = $input->getOption('admin');
|
|
43
|
+
$role = $input->getOption('role');
|
|
44
|
+
|
|
45
|
+
$output->writeln("<info>Creating user: {$name}</info>");
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
// Create user logic here
|
|
49
|
+
$user = $this->createUser($name, $email, $role, $isAdmin);
|
|
50
|
+
|
|
51
|
+
$output->writeln("<info>User created successfully!</info>");
|
|
52
|
+
$output->writeln("ID: {$user->id}");
|
|
53
|
+
|
|
54
|
+
return Command::SUCCESS;
|
|
55
|
+
} catch (\Exception $e) {
|
|
56
|
+
$output->writeln("<error>Error: {$e->getMessage()}</error>");
|
|
57
|
+
return Command::FAILURE;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
private function createUser(string $name, string $email, string $role, bool $isAdmin): object
|
|
62
|
+
{
|
|
63
|
+
// Implementation
|
|
64
|
+
return (object)['id' => 123, 'name' => $name, 'email' => $email];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Command Naming Conventions
|
|
70
|
+
|
|
71
|
+
Use **namespace:action** format:
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
✅ Good:
|
|
75
|
+
user:create
|
|
76
|
+
user:delete
|
|
77
|
+
cache:clear
|
|
78
|
+
db:migrate
|
|
79
|
+
report:generate
|
|
80
|
+
|
|
81
|
+
❌ Bad:
|
|
82
|
+
createUser
|
|
83
|
+
deleteuser
|
|
84
|
+
clear_cache
|
|
85
|
+
migrate
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Arguments and Options
|
|
89
|
+
|
|
90
|
+
### Arguments
|
|
91
|
+
|
|
92
|
+
**Arguments are positional and can be required or optional:**
|
|
93
|
+
|
|
94
|
+
```php
|
|
95
|
+
<?php
|
|
96
|
+
|
|
97
|
+
// Required argument
|
|
98
|
+
$this->addArgument('filename', InputArgument::REQUIRED, 'The file to process');
|
|
99
|
+
|
|
100
|
+
// Optional argument
|
|
101
|
+
$this->addArgument('output', InputArgument::OPTIONAL, 'Output file', 'output.txt');
|
|
102
|
+
|
|
103
|
+
// Array argument (must be last)
|
|
104
|
+
$this->addArgument('files', InputArgument::IS_ARRAY, 'Files to process');
|
|
105
|
+
|
|
106
|
+
// Usage in execute()
|
|
107
|
+
$filename = $input->getArgument('filename');
|
|
108
|
+
$output = $input->getArgument('output');
|
|
109
|
+
$files = $input->getArgument('files'); // Returns array
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Options
|
|
113
|
+
|
|
114
|
+
**Options are named and always optional:**
|
|
115
|
+
|
|
116
|
+
```php
|
|
117
|
+
<?php
|
|
118
|
+
|
|
119
|
+
// Flag option (no value)
|
|
120
|
+
$this->addOption('force', 'f', InputOption::VALUE_NONE, 'Force the operation');
|
|
121
|
+
|
|
122
|
+
// Option with required value
|
|
123
|
+
$this->addOption('format', null, InputOption::VALUE_REQUIRED, 'Output format');
|
|
124
|
+
|
|
125
|
+
// Option with optional value
|
|
126
|
+
$this->addOption('verbose', 'v', InputOption::VALUE_OPTIONAL, 'Verbosity level', 1);
|
|
127
|
+
|
|
128
|
+
// Option with default value
|
|
129
|
+
$this->addOption('limit', 'l', InputOption::VALUE_REQUIRED, 'Limit results', 100);
|
|
130
|
+
|
|
131
|
+
// Array option (can be specified multiple times)
|
|
132
|
+
$this->addOption('exclude', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Exclude patterns');
|
|
133
|
+
|
|
134
|
+
// Usage in execute()
|
|
135
|
+
$force = $input->getOption('force');
|
|
136
|
+
$format = $input->getOption('format');
|
|
137
|
+
$excludes = $input->getOption('exclude'); // Returns array
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Input/Output Handling
|
|
141
|
+
|
|
142
|
+
### Output Formatting
|
|
143
|
+
|
|
144
|
+
```php
|
|
145
|
+
<?php
|
|
146
|
+
|
|
147
|
+
protected function execute(InputInterface $input, OutputInterface $output): int
|
|
148
|
+
{
|
|
149
|
+
// Basic output
|
|
150
|
+
$output->writeln('Normal text');
|
|
151
|
+
|
|
152
|
+
// Styled output
|
|
153
|
+
$output->writeln('<info>Info message</info>');
|
|
154
|
+
$output->writeln('<comment>Comment message</comment>');
|
|
155
|
+
$output->writeln('<question>Question message</question>');
|
|
156
|
+
$output->writeln('<error>Error message</error>');
|
|
157
|
+
|
|
158
|
+
// Custom styles
|
|
159
|
+
$output->writeln('<fg=green>Green text</>');
|
|
160
|
+
$output->writeln('<bg=yellow;fg=black>Yellow background</>');
|
|
161
|
+
$output->writeln('<options=bold>Bold text</>');
|
|
162
|
+
|
|
163
|
+
// Verbosity levels
|
|
164
|
+
$output->writeln('Always shown');
|
|
165
|
+
$output->writeln('Verbose', OutputInterface::VERBOSITY_VERBOSE);
|
|
166
|
+
$output->writeln('Very verbose', OutputInterface::VERBOSITY_VERY_VERBOSE);
|
|
167
|
+
$output->writeln('Debug', OutputInterface::VERBOSITY_DEBUG);
|
|
168
|
+
|
|
169
|
+
return Command::SUCCESS;
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Interactive Input
|
|
174
|
+
|
|
175
|
+
```php
|
|
176
|
+
<?php
|
|
177
|
+
|
|
178
|
+
use Symfony\Component\Console\Question\Question;
|
|
179
|
+
use Symfony\Component\Console\Question\ConfirmationQuestion;
|
|
180
|
+
use Symfony\Component\Console\Question\ChoiceQuestion;
|
|
181
|
+
|
|
182
|
+
protected function execute(InputInterface $input, OutputInterface $output): int
|
|
183
|
+
{
|
|
184
|
+
$helper = $this->getHelper('question');
|
|
185
|
+
|
|
186
|
+
// Simple question
|
|
187
|
+
$question = new Question('Please enter your name: ', 'John Doe');
|
|
188
|
+
$name = $helper->ask($input, $output, $question);
|
|
189
|
+
|
|
190
|
+
// Hidden input (for passwords)
|
|
191
|
+
$question = new Question('Please enter your password: ');
|
|
192
|
+
$question->setHidden(true);
|
|
193
|
+
$question->setHiddenFallback(false);
|
|
194
|
+
$password = $helper->ask($input, $output, $question);
|
|
195
|
+
|
|
196
|
+
// Confirmation question
|
|
197
|
+
$question = new ConfirmationQuestion('Continue with this action? (y/n) ', false);
|
|
198
|
+
if (!$helper->ask($input, $output, $question)) {
|
|
199
|
+
return Command::SUCCESS;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Choice question
|
|
203
|
+
$question = new ChoiceQuestion(
|
|
204
|
+
'Please select your role',
|
|
205
|
+
['user', 'admin', 'moderator'],
|
|
206
|
+
0 // Default index
|
|
207
|
+
);
|
|
208
|
+
$role = $helper->ask($input, $output, $question);
|
|
209
|
+
|
|
210
|
+
return Command::SUCCESS;
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## Progress Indicators
|
|
215
|
+
|
|
216
|
+
### Progress Bar
|
|
217
|
+
|
|
218
|
+
```php
|
|
219
|
+
<?php
|
|
220
|
+
|
|
221
|
+
use Symfony\Component\Console\Helper\ProgressBar;
|
|
222
|
+
|
|
223
|
+
protected function execute(InputInterface $input, OutputInterface $output): int
|
|
224
|
+
{
|
|
225
|
+
$items = range(1, 100);
|
|
226
|
+
|
|
227
|
+
$progressBar = new ProgressBar($output, count($items));
|
|
228
|
+
$progressBar->start();
|
|
229
|
+
|
|
230
|
+
foreach ($items as $item) {
|
|
231
|
+
// Process item
|
|
232
|
+
sleep(1);
|
|
233
|
+
|
|
234
|
+
$progressBar->advance();
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
$progressBar->finish();
|
|
238
|
+
$output->writeln(''); // New line after progress bar
|
|
239
|
+
|
|
240
|
+
return Command::SUCCESS;
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### Custom Progress Bar Format
|
|
245
|
+
|
|
246
|
+
```php
|
|
247
|
+
<?php
|
|
248
|
+
|
|
249
|
+
$progressBar = new ProgressBar($output, 100);
|
|
250
|
+
$progressBar->setFormat(' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% %memory:6s%');
|
|
251
|
+
$progressBar->start();
|
|
252
|
+
|
|
253
|
+
// Or use predefined formats
|
|
254
|
+
$progressBar->setFormat('verbose');
|
|
255
|
+
$progressBar->setFormat('very_verbose');
|
|
256
|
+
$progressBar->setFormat('debug');
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### Spinner for Indeterminate Progress
|
|
260
|
+
|
|
261
|
+
```php
|
|
262
|
+
<?php
|
|
263
|
+
|
|
264
|
+
use Symfony\Component\Console\Helper\ProgressIndicator;
|
|
265
|
+
|
|
266
|
+
protected function execute(InputInterface $input, OutputInterface $output): int
|
|
267
|
+
{
|
|
268
|
+
$spinner = new ProgressIndicator($output);
|
|
269
|
+
$spinner->start('Processing...');
|
|
270
|
+
|
|
271
|
+
while ($condition) {
|
|
272
|
+
// Do work
|
|
273
|
+
usleep(100000);
|
|
274
|
+
$spinner->advance();
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
$spinner->finish('Done!');
|
|
278
|
+
|
|
279
|
+
return Command::SUCCESS;
|
|
280
|
+
}
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## Error Handling and Exit Codes
|
|
284
|
+
|
|
285
|
+
### Exit Codes
|
|
286
|
+
|
|
287
|
+
```php
|
|
288
|
+
<?php
|
|
289
|
+
|
|
290
|
+
protected function execute(InputInterface $input, OutputInterface $output): int
|
|
291
|
+
{
|
|
292
|
+
try {
|
|
293
|
+
// Successful execution
|
|
294
|
+
return Command::SUCCESS; // 0
|
|
295
|
+
|
|
296
|
+
} catch (ValidationException $e) {
|
|
297
|
+
$output->writeln("<error>Validation error: {$e->getMessage()}</error>");
|
|
298
|
+
return Command::INVALID; // 2
|
|
299
|
+
|
|
300
|
+
} catch (\Exception $e) {
|
|
301
|
+
$output->writeln("<error>Error: {$e->getMessage()}</error>");
|
|
302
|
+
return Command::FAILURE; // 1
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Custom Exit Codes
|
|
308
|
+
|
|
309
|
+
```php
|
|
310
|
+
<?php
|
|
311
|
+
|
|
312
|
+
class MyCommand extends Command
|
|
313
|
+
{
|
|
314
|
+
public const EXIT_SUCCESS = 0;
|
|
315
|
+
public const EXIT_GENERAL_ERROR = 1;
|
|
316
|
+
public const EXIT_INVALID_INPUT = 2;
|
|
317
|
+
public const EXIT_FILE_NOT_FOUND = 3;
|
|
318
|
+
public const EXIT_PERMISSION_DENIED = 4;
|
|
319
|
+
|
|
320
|
+
protected function execute(InputInterface $input, OutputInterface $output): int
|
|
321
|
+
{
|
|
322
|
+
if (!file_exists($filename)) {
|
|
323
|
+
$output->writeln("<error>File not found: {$filename}</error>");
|
|
324
|
+
return self::EXIT_FILE_NOT_FOUND;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
if (!is_readable($filename)) {
|
|
328
|
+
$output->writeln("<error>Permission denied: {$filename}</error>");
|
|
329
|
+
return self::EXIT_PERMISSION_DENIED;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
return self::EXIT_SUCCESS;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
## Tables
|
|
338
|
+
|
|
339
|
+
### Displaying Tabular Data
|
|
340
|
+
|
|
341
|
+
```php
|
|
342
|
+
<?php
|
|
343
|
+
|
|
344
|
+
use Symfony\Component\Console\Helper\Table;
|
|
345
|
+
|
|
346
|
+
protected function execute(InputInterface $input, OutputInterface $output): int
|
|
347
|
+
{
|
|
348
|
+
$table = new Table($output);
|
|
349
|
+
$table
|
|
350
|
+
->setHeaders(['ID', 'Name', 'Email', 'Status'])
|
|
351
|
+
->setRows([
|
|
352
|
+
[1, 'John Doe', 'john@example.com', 'Active'],
|
|
353
|
+
[2, 'Jane Smith', 'jane@example.com', 'Inactive'],
|
|
354
|
+
[3, 'Bob Johnson', 'bob@example.com', 'Active'],
|
|
355
|
+
]);
|
|
356
|
+
|
|
357
|
+
$table->render();
|
|
358
|
+
|
|
359
|
+
return Command::SUCCESS;
|
|
360
|
+
}
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
## Idempotency
|
|
364
|
+
|
|
365
|
+
### Making Commands Idempotent
|
|
366
|
+
|
|
367
|
+
```php
|
|
368
|
+
<?php
|
|
369
|
+
|
|
370
|
+
class ImportDataCommand extends Command
|
|
371
|
+
{
|
|
372
|
+
protected function execute(InputInterface $input, OutputInterface $output): int
|
|
373
|
+
{
|
|
374
|
+
$filename = $input->getArgument('filename');
|
|
375
|
+
|
|
376
|
+
// Check if already imported
|
|
377
|
+
if ($this->isAlreadyImported($filename)) {
|
|
378
|
+
$output->writeln('<comment>File already imported. Skipping.</comment>');
|
|
379
|
+
return Command::SUCCESS;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// Use transactions for database operations
|
|
383
|
+
DB::beginTransaction();
|
|
384
|
+
|
|
385
|
+
try {
|
|
386
|
+
$this->importData($filename);
|
|
387
|
+
|
|
388
|
+
// Mark as imported
|
|
389
|
+
$this->markAsImported($filename);
|
|
390
|
+
|
|
391
|
+
DB::commit();
|
|
392
|
+
$output->writeln('<info>Import completed successfully</info>');
|
|
393
|
+
return Command::SUCCESS;
|
|
394
|
+
|
|
395
|
+
} catch (\Exception $e) {
|
|
396
|
+
DB::rollBack();
|
|
397
|
+
$output->writeln("<error>Import failed: {$e->getMessage()}</error>");
|
|
398
|
+
return Command::FAILURE;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
private function isAlreadyImported(string $filename): bool
|
|
403
|
+
{
|
|
404
|
+
return ImportLog::where('filename', $filename)->exists();
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
private function markAsImported(string $filename): void
|
|
408
|
+
{
|
|
409
|
+
ImportLog::create([
|
|
410
|
+
'filename' => $filename,
|
|
411
|
+
'imported_at' => now()
|
|
412
|
+
]);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
## Best Practices
|
|
418
|
+
|
|
419
|
+
### ✅ DO
|
|
420
|
+
|
|
421
|
+
- Use descriptive command names with namespace:action format
|
|
422
|
+
- Provide clear help text and descriptions
|
|
423
|
+
- Validate input arguments and options
|
|
424
|
+
- Use appropriate exit codes
|
|
425
|
+
- Show progress for long-running operations
|
|
426
|
+
- Make commands idempotent when possible
|
|
427
|
+
- Use transactions for database operations
|
|
428
|
+
- Log command execution and errors
|
|
429
|
+
- Provide verbose output options
|
|
430
|
+
- Handle interruptions gracefully (SIGINT, SIGTERM)
|
|
431
|
+
- Use dependency injection for services
|
|
432
|
+
- Write tests for commands
|
|
433
|
+
|
|
434
|
+
### ❌ DON'T
|
|
435
|
+
|
|
436
|
+
- Use generic command names without namespaces
|
|
437
|
+
- Ignore user input validation
|
|
438
|
+
- Always return 0 (success) regardless of outcome
|
|
439
|
+
- Run long operations without progress indicators
|
|
440
|
+
- Modify data without confirmation in destructive operations
|
|
441
|
+
- Use global state or static methods
|
|
442
|
+
- Hardcode configuration values
|
|
443
|
+
- Suppress error messages
|
|
444
|
+
- Use echo/print instead of OutputInterface
|
|
445
|
+
- Perform operations that can't be rolled back
|
|
446
|
+
|
|
447
|
+
## Security Checklist
|
|
448
|
+
|
|
449
|
+
- [ ] Validate all input arguments and options
|
|
450
|
+
- [ ] Sanitize file paths to prevent directory traversal
|
|
451
|
+
- [ ] Use parameterized queries for database operations
|
|
452
|
+
- [ ] Don't expose sensitive data in output
|
|
453
|
+
- [ ] Implement proper permission checks
|
|
454
|
+
- [ ] Use secure temporary file handling
|
|
455
|
+
- [ ] Validate file uploads and imports
|
|
456
|
+
- [ ] Log security-relevant events
|
|
457
|
+
- [ ] Don't execute arbitrary code from input
|
|
458
|
+
- [ ] Use environment variables for credentials
|
|
459
|
+
|
|
460
|
+
## Performance Tips
|
|
461
|
+
|
|
462
|
+
- Use batch processing for large datasets
|
|
463
|
+
- Implement chunking for memory-intensive operations
|
|
464
|
+
- Use database transactions efficiently
|
|
465
|
+
- Optimize queries (avoid N+1 problems)
|
|
466
|
+
- Use caching where appropriate
|
|
467
|
+
- Implement timeout handling for external services
|
|
468
|
+
- Use async operations for I/O-bound tasks
|
|
469
|
+
- Profile long-running commands
|
|
470
|
+
- Implement graceful shutdown on signals
|
|
471
|
+
- Use memory-efficient data structures
|
|
472
|
+
|