@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,234 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Legacy Code Refactoring Example
|
|
5
|
+
*
|
|
6
|
+
* This example demonstrates refactoring procedural PHP code to modern OOP with:
|
|
7
|
+
* - Namespaces (PSR-4)
|
|
8
|
+
* - Type hints (PHP 8+)
|
|
9
|
+
* - Dependency injection
|
|
10
|
+
* - Single responsibility principle
|
|
11
|
+
* - Proper error handling
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// BEFORE: Legacy Procedural Code
|
|
16
|
+
// ============================================================================
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Legacy user management functions (BAD EXAMPLE - DO NOT USE)
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
// Global database connection
|
|
23
|
+
$db = mysqli_connect('localhost', 'user', 'pass', 'database');
|
|
24
|
+
|
|
25
|
+
// Create user function with global dependency
|
|
26
|
+
function create_user($name, $email, $password)
|
|
27
|
+
{
|
|
28
|
+
global $db;
|
|
29
|
+
|
|
30
|
+
// No validation
|
|
31
|
+
$hashed_password = md5($password); // Weak hashing!
|
|
32
|
+
|
|
33
|
+
// SQL injection vulnerability!
|
|
34
|
+
$query = "INSERT INTO users (name, email, password)
|
|
35
|
+
VALUES ('$name', '$email', '$hashed_password')";
|
|
36
|
+
|
|
37
|
+
$result = mysqli_query($db, $query);
|
|
38
|
+
|
|
39
|
+
if ($result) {
|
|
40
|
+
$user_id = mysqli_insert_id($db);
|
|
41
|
+
|
|
42
|
+
// Send email (tightly coupled)
|
|
43
|
+
mail($email, 'Welcome', 'Welcome to our site!');
|
|
44
|
+
|
|
45
|
+
return $user_id;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Get user function
|
|
52
|
+
function get_user($id)
|
|
53
|
+
{
|
|
54
|
+
global $db;
|
|
55
|
+
|
|
56
|
+
// SQL injection vulnerability!
|
|
57
|
+
$query = "SELECT * FROM users WHERE id = $id";
|
|
58
|
+
$result = mysqli_query($db, $query);
|
|
59
|
+
|
|
60
|
+
return mysqli_fetch_assoc($result);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Update user function
|
|
64
|
+
function update_user($id, $name, $email)
|
|
65
|
+
{
|
|
66
|
+
global $db;
|
|
67
|
+
|
|
68
|
+
// SQL injection vulnerability!
|
|
69
|
+
$query = "UPDATE users SET name = '$name', email = '$email' WHERE id = $id";
|
|
70
|
+
|
|
71
|
+
return mysqli_query($db, $query);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Delete user function
|
|
75
|
+
function delete_user($id)
|
|
76
|
+
{
|
|
77
|
+
global $db;
|
|
78
|
+
|
|
79
|
+
// SQL injection vulnerability!
|
|
80
|
+
$query = "DELETE FROM users WHERE id = $id";
|
|
81
|
+
|
|
82
|
+
return mysqli_query($db, $query);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Usage (legacy)
|
|
86
|
+
$user_id = create_user('John Doe', 'john@example.com', 'password123');
|
|
87
|
+
$user = get_user($user_id);
|
|
88
|
+
update_user($user_id, 'Jane Doe', 'jane@example.com');
|
|
89
|
+
delete_user($user_id);
|
|
90
|
+
|
|
91
|
+
// ============================================================================
|
|
92
|
+
// AFTER: Modern OOP Code with Best Practices
|
|
93
|
+
// ============================================================================
|
|
94
|
+
|
|
95
|
+
declare(strict_types=1);
|
|
96
|
+
|
|
97
|
+
namespace App\Models;
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* User Model
|
|
101
|
+
*/
|
|
102
|
+
class User
|
|
103
|
+
{
|
|
104
|
+
public function __construct(
|
|
105
|
+
private ?int $id = null,
|
|
106
|
+
private string $name = '',
|
|
107
|
+
private string $email = '',
|
|
108
|
+
private string $passwordHash = '',
|
|
109
|
+
private ?\DateTimeImmutable $createdAt = null,
|
|
110
|
+
private ?\DateTimeImmutable $updatedAt = null
|
|
111
|
+
) {}
|
|
112
|
+
|
|
113
|
+
// Getters
|
|
114
|
+
public function getId(): ?int
|
|
115
|
+
{
|
|
116
|
+
return $this->id;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
public function getName(): string
|
|
120
|
+
{
|
|
121
|
+
return $this->name;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
public function getEmail(): string
|
|
125
|
+
{
|
|
126
|
+
return $this->email;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
public function getPasswordHash(): string
|
|
130
|
+
{
|
|
131
|
+
return $this->passwordHash;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Setters with validation
|
|
135
|
+
public function setName(string $name): self
|
|
136
|
+
{
|
|
137
|
+
if (empty($name)) {
|
|
138
|
+
throw new \InvalidArgumentException('Name cannot be empty');
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
$this->name = $name;
|
|
142
|
+
return $this;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
public function setEmail(string $email): self
|
|
146
|
+
{
|
|
147
|
+
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
|
148
|
+
throw new \InvalidArgumentException('Invalid email address');
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
$this->email = $email;
|
|
152
|
+
return $this;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
public function setPassword(string $password): self
|
|
156
|
+
{
|
|
157
|
+
if (strlen($password) < 8) {
|
|
158
|
+
throw new \InvalidArgumentException('Password must be at least 8 characters');
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Use secure password hashing
|
|
162
|
+
$this->passwordHash = password_hash($password, PASSWORD_ARGON2ID);
|
|
163
|
+
return $this;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
public function verifyPassword(string $password): bool
|
|
167
|
+
{
|
|
168
|
+
return password_verify($password, $this->passwordHash);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// ============================================================================
|
|
173
|
+
|
|
174
|
+
namespace App\Repositories;
|
|
175
|
+
|
|
176
|
+
use App\Models\User;
|
|
177
|
+
use PDO;
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* User Repository - Database operations
|
|
181
|
+
*/
|
|
182
|
+
class UserRepository
|
|
183
|
+
{
|
|
184
|
+
public function __construct(
|
|
185
|
+
private PDO $db
|
|
186
|
+
) {}
|
|
187
|
+
|
|
188
|
+
public function create(User $user): User
|
|
189
|
+
{
|
|
190
|
+
$stmt = $this->db->prepare(
|
|
191
|
+
"INSERT INTO users (name, email, password_hash, created_at, updated_at)
|
|
192
|
+
VALUES (:name, :email, :password_hash, NOW(), NOW())"
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
$stmt->execute([
|
|
196
|
+
'name' => $user->getName(),
|
|
197
|
+
'email' => $user->getEmail(),
|
|
198
|
+
'password_hash' => $user->getPasswordHash()
|
|
199
|
+
]);
|
|
200
|
+
|
|
201
|
+
$id = (int) $this->db->lastInsertId();
|
|
202
|
+
|
|
203
|
+
return $this->findById($id);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
public function findById(int $id): ?User
|
|
207
|
+
{
|
|
208
|
+
$stmt = $this->db->prepare("SELECT * FROM users WHERE id = :id");
|
|
209
|
+
$stmt->execute(['id' => $id]);
|
|
210
|
+
|
|
211
|
+
$data = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
212
|
+
|
|
213
|
+
if (!$data) {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return $this->hydrate($data);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
public function findByEmail(string $email): ?User
|
|
221
|
+
{
|
|
222
|
+
$stmt = $this->db->prepare("SELECT * FROM users WHERE email = :email");
|
|
223
|
+
$stmt->execute(['email' => $email]);
|
|
224
|
+
|
|
225
|
+
$data = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
226
|
+
|
|
227
|
+
if (!$data) {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return $this->hydrate($data);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Web Application Example - Laravel User Authentication Module
|
|
5
|
+
*
|
|
6
|
+
* This example demonstrates best practices for PHP web applications including:
|
|
7
|
+
* - MVC architecture with thin controllers
|
|
8
|
+
* - Eloquent ORM for database interactions
|
|
9
|
+
* - Form validation with Form Requests
|
|
10
|
+
* - Middleware for authentication and authorization
|
|
11
|
+
* - Blade templating with auto-escaping
|
|
12
|
+
* - CSRF protection
|
|
13
|
+
* - Session management
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
namespace App\Http\Controllers;
|
|
17
|
+
|
|
18
|
+
use App\Http\Requests\StoreUserRequest;
|
|
19
|
+
use App\Http\Requests\UpdateUserRequest;
|
|
20
|
+
use App\Services\UserService;
|
|
21
|
+
use Illuminate\Http\Request;
|
|
22
|
+
use Illuminate\Http\RedirectResponse;
|
|
23
|
+
use Illuminate\View\View;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* User Controller - Thin controller delegating to service layer
|
|
27
|
+
*/
|
|
28
|
+
class UserController extends Controller
|
|
29
|
+
{
|
|
30
|
+
public function __construct(
|
|
31
|
+
private UserService $userService
|
|
32
|
+
) {
|
|
33
|
+
$this->middleware('auth');
|
|
34
|
+
$this->middleware('can:manage-users')->except(['index', 'show']);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Display a listing of users
|
|
39
|
+
*/
|
|
40
|
+
public function index(Request $request): View
|
|
41
|
+
{
|
|
42
|
+
$users = $this->userService->getPaginatedUsers(
|
|
43
|
+
perPage: $request->input('per_page', 20),
|
|
44
|
+
search: $request->input('search')
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
return view('users.index', [
|
|
48
|
+
'users' => $users,
|
|
49
|
+
'search' => $request->input('search')
|
|
50
|
+
]);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Show the form for creating a new user
|
|
55
|
+
*/
|
|
56
|
+
public function create(): View
|
|
57
|
+
{
|
|
58
|
+
return view('users.create', [
|
|
59
|
+
'roles' => $this->userService->getAvailableRoles()
|
|
60
|
+
]);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Store a newly created user
|
|
65
|
+
*/
|
|
66
|
+
public function store(StoreUserRequest $request): RedirectResponse
|
|
67
|
+
{
|
|
68
|
+
$user = $this->userService->createUser($request->validated());
|
|
69
|
+
|
|
70
|
+
return redirect()
|
|
71
|
+
->route('users.show', $user)
|
|
72
|
+
->with('success', 'User created successfully!');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Display the specified user
|
|
77
|
+
*/
|
|
78
|
+
public function show(int $id): View
|
|
79
|
+
{
|
|
80
|
+
$user = $this->userService->findUserById($id);
|
|
81
|
+
|
|
82
|
+
return view('users.show', ['user' => $user]);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Show the form for editing the specified user
|
|
87
|
+
*/
|
|
88
|
+
public function edit(int $id): View
|
|
89
|
+
{
|
|
90
|
+
$user = $this->userService->findUserById($id);
|
|
91
|
+
|
|
92
|
+
return view('users.edit', [
|
|
93
|
+
'user' => $user,
|
|
94
|
+
'roles' => $this->userService->getAvailableRoles()
|
|
95
|
+
]);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Update the specified user
|
|
100
|
+
*/
|
|
101
|
+
public function update(UpdateUserRequest $request, int $id): RedirectResponse
|
|
102
|
+
{
|
|
103
|
+
$user = $this->userService->updateUser($id, $request->validated());
|
|
104
|
+
|
|
105
|
+
return redirect()
|
|
106
|
+
->route('users.show', $user)
|
|
107
|
+
->with('success', 'User updated successfully!');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Remove the specified user
|
|
112
|
+
*/
|
|
113
|
+
public function destroy(int $id): RedirectResponse
|
|
114
|
+
{
|
|
115
|
+
$this->userService->deleteUser($id);
|
|
116
|
+
|
|
117
|
+
return redirect()
|
|
118
|
+
->route('users.index')
|
|
119
|
+
->with('success', 'User deleted successfully!');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// ============================================================================
|
|
124
|
+
// Form Request - Validation Logic
|
|
125
|
+
// ============================================================================
|
|
126
|
+
|
|
127
|
+
namespace App\Http\Requests;
|
|
128
|
+
|
|
129
|
+
use Illuminate\Foundation\Http\FormRequest;
|
|
130
|
+
use Illuminate\Validation\Rule;
|
|
131
|
+
|
|
132
|
+
class StoreUserRequest extends FormRequest
|
|
133
|
+
{
|
|
134
|
+
public function authorize(): bool
|
|
135
|
+
{
|
|
136
|
+
return $this->user()->can('create', User::class);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
public function rules(): array
|
|
140
|
+
{
|
|
141
|
+
return [
|
|
142
|
+
'name' => 'required|string|max:255',
|
|
143
|
+
'email' => 'required|email|unique:users,email',
|
|
144
|
+
'password' => 'required|min:8|confirmed',
|
|
145
|
+
'role' => ['required', Rule::in(['user', 'admin', 'moderator'])],
|
|
146
|
+
'is_active' => 'boolean'
|
|
147
|
+
];
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
public function messages(): array
|
|
151
|
+
{
|
|
152
|
+
return [
|
|
153
|
+
'name.required' => 'Please provide a name for the user',
|
|
154
|
+
'email.unique' => 'This email address is already registered',
|
|
155
|
+
'password.min' => 'Password must be at least 8 characters long'
|
|
156
|
+
];
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// ============================================================================
|
|
161
|
+
// Service Layer - Business Logic
|
|
162
|
+
// ============================================================================
|
|
163
|
+
|
|
164
|
+
namespace App\Services;
|
|
165
|
+
|
|
166
|
+
use App\Models\User;
|
|
167
|
+
use App\Repositories\UserRepository;
|
|
168
|
+
use Illuminate\Pagination\LengthAwarePaginator;
|
|
169
|
+
use Illuminate\Support\Facades\Hash;
|
|
170
|
+
use Illuminate\Support\Facades\DB;
|
|
171
|
+
|
|
172
|
+
class UserService
|
|
173
|
+
{
|
|
174
|
+
public function __construct(
|
|
175
|
+
private UserRepository $userRepository
|
|
176
|
+
) {}
|
|
177
|
+
|
|
178
|
+
public function getPaginatedUsers(int $perPage = 20, ?string $search = null): LengthAwarePaginator
|
|
179
|
+
{
|
|
180
|
+
return $this->userRepository->paginate($perPage, $search);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
public function findUserById(int $id): User
|
|
184
|
+
{
|
|
185
|
+
return $this->userRepository->findOrFail($id);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
public function createUser(array $data): User
|
|
189
|
+
{
|
|
190
|
+
return DB::transaction(function () use ($data) {
|
|
191
|
+
$user = User::create([
|
|
192
|
+
'name' => $data['name'],
|
|
193
|
+
'email' => $data['email'],
|
|
194
|
+
'password' => Hash::make($data['password']),
|
|
195
|
+
'role' => $data['role'],
|
|
196
|
+
'is_active' => $data['is_active'] ?? true
|
|
197
|
+
]);
|
|
198
|
+
|
|
199
|
+
// Send welcome email
|
|
200
|
+
$user->sendWelcomeEmail();
|
|
201
|
+
|
|
202
|
+
// Log activity
|
|
203
|
+
activity()
|
|
204
|
+
->performedOn($user)
|
|
205
|
+
->log('User created');
|
|
206
|
+
|
|
207
|
+
return $user;
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
/**
|
|
3
|
+
* Plugin Name: WooCommerce Custom Cart Handler
|
|
4
|
+
* Plugin URI: https://example.com/woo-custom-cart
|
|
5
|
+
* Description: Custom shopping cart handler with stock validation and secure payment tokenization
|
|
6
|
+
* Version: 1.0.0
|
|
7
|
+
* Author: Your Name
|
|
8
|
+
* Author URI: https://example.com
|
|
9
|
+
* WC requires at least: 5.0
|
|
10
|
+
* WC tested up to: 7.0
|
|
11
|
+
* License: GPL v2 or later
|
|
12
|
+
* Text Domain: woo-custom-cart
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
// Prevent direct access
|
|
16
|
+
if (!defined('ABSPATH')) {
|
|
17
|
+
exit;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Check if WooCommerce is active
|
|
21
|
+
if (!in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Main Plugin Class
|
|
27
|
+
*/
|
|
28
|
+
class WC_Custom_Cart_Handler
|
|
29
|
+
{
|
|
30
|
+
private static $instance = null;
|
|
31
|
+
|
|
32
|
+
public static function get_instance()
|
|
33
|
+
{
|
|
34
|
+
if (null === self::$instance) {
|
|
35
|
+
self::$instance = new self();
|
|
36
|
+
}
|
|
37
|
+
return self::$instance;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
private function __construct()
|
|
41
|
+
{
|
|
42
|
+
$this->init_hooks();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
private function init_hooks()
|
|
46
|
+
{
|
|
47
|
+
// Cart hooks
|
|
48
|
+
add_filter('woocommerce_add_to_cart_validation', [$this, 'validate_add_to_cart'], 10, 3);
|
|
49
|
+
add_action('woocommerce_before_calculate_totals', [$this, 'modify_cart_prices']);
|
|
50
|
+
add_action('woocommerce_check_cart_items', [$this, 'validate_cart_stock']);
|
|
51
|
+
|
|
52
|
+
// Checkout hooks
|
|
53
|
+
add_action('woocommerce_checkout_process', [$this, 'validate_checkout']);
|
|
54
|
+
add_action('woocommerce_checkout_create_order', [$this, 'add_order_meta'], 10, 2);
|
|
55
|
+
add_action('woocommerce_checkout_order_processed', [$this, 'process_order'], 10, 3);
|
|
56
|
+
|
|
57
|
+
// Order status hooks
|
|
58
|
+
add_action('woocommerce_order_status_completed', [$this, 'handle_order_completed']);
|
|
59
|
+
add_action('woocommerce_order_status_cancelled', [$this, 'handle_order_cancelled']);
|
|
60
|
+
|
|
61
|
+
// Payment hooks
|
|
62
|
+
add_filter('woocommerce_payment_gateways', [$this, 'add_payment_gateway']);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Validate product before adding to cart
|
|
67
|
+
*/
|
|
68
|
+
public function validate_add_to_cart($passed, $product_id, $quantity)
|
|
69
|
+
{
|
|
70
|
+
$product = wc_get_product($product_id);
|
|
71
|
+
|
|
72
|
+
if (!$product) {
|
|
73
|
+
wc_add_notice(__('Product not found.', 'woo-custom-cart'), 'error');
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Check if product is purchasable
|
|
78
|
+
if (!$product->is_purchasable()) {
|
|
79
|
+
wc_add_notice(__('This product cannot be purchased.', 'woo-custom-cart'), 'error');
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Check stock availability
|
|
84
|
+
if (!$product->has_enough_stock($quantity)) {
|
|
85
|
+
wc_add_notice(
|
|
86
|
+
sprintf(
|
|
87
|
+
__('Sorry, we do not have enough "%s" in stock. Only %d available.', 'woo-custom-cart'),
|
|
88
|
+
$product->get_name(),
|
|
89
|
+
$product->get_stock_quantity()
|
|
90
|
+
),
|
|
91
|
+
'error'
|
|
92
|
+
);
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Custom validation: Check if user has already purchased this product
|
|
97
|
+
if ($this->user_already_purchased($product_id)) {
|
|
98
|
+
wc_add_notice(
|
|
99
|
+
__('You have already purchased this product.', 'woo-custom-cart'),
|
|
100
|
+
'error'
|
|
101
|
+
);
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return $passed;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Modify cart item prices based on custom logic
|
|
110
|
+
*/
|
|
111
|
+
public function modify_cart_prices($cart)
|
|
112
|
+
{
|
|
113
|
+
if (is_admin() && !defined('DOING_AJAX')) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
|
|
118
|
+
$product = $cart_item['data'];
|
|
119
|
+
|
|
120
|
+
// Apply volume discount
|
|
121
|
+
if ($cart_item['quantity'] >= 10) {
|
|
122
|
+
$discount_percentage = 10; // 10% discount for 10+ items
|
|
123
|
+
$original_price = $product->get_regular_price();
|
|
124
|
+
$discounted_price = $original_price * (1 - $discount_percentage / 100);
|
|
125
|
+
|
|
126
|
+
$product->set_price($discounted_price);
|
|
127
|
+
|
|
128
|
+
// Add notice about discount
|
|
129
|
+
if (!WC()->session->get('volume_discount_notice_shown')) {
|
|
130
|
+
wc_add_notice(
|
|
131
|
+
sprintf(
|
|
132
|
+
__('Volume discount applied: %d%% off!', 'woo-custom-cart'),
|
|
133
|
+
$discount_percentage
|
|
134
|
+
),
|
|
135
|
+
'success'
|
|
136
|
+
);
|
|
137
|
+
WC()->session->set('volume_discount_notice_shown', true);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Validate cart stock before checkout
|
|
145
|
+
*/
|
|
146
|
+
public function validate_cart_stock()
|
|
147
|
+
{
|
|
148
|
+
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
|
|
149
|
+
$product = $cart_item['data'];
|
|
150
|
+
$product_id = $cart_item['product_id'];
|
|
151
|
+
$quantity = $cart_item['quantity'];
|
|
152
|
+
|
|
153
|
+
// Re-check stock (in case it changed since adding to cart)
|
|
154
|
+
$fresh_product = wc_get_product($product_id);
|
|
155
|
+
|
|
156
|
+
if (!$fresh_product->has_enough_stock($quantity)) {
|
|
157
|
+
wc_add_notice(
|
|
158
|
+
sprintf(
|
|
159
|
+
__('Sorry, "%s" stock has changed. Only %d available.', 'woo-custom-cart'),
|
|
160
|
+
$product->get_name(),
|
|
161
|
+
$fresh_product->get_stock_quantity()
|
|
162
|
+
),
|
|
163
|
+
'error'
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Validate checkout fields
|
|
171
|
+
*/
|
|
172
|
+
public function validate_checkout()
|
|
173
|
+
{
|
|
174
|
+
// Custom field validation
|
|
175
|
+
if (empty($_POST['custom_delivery_instructions'])) {
|
|
176
|
+
wc_add_notice(
|
|
177
|
+
__('Please provide delivery instructions.', 'woo-custom-cart'),
|
|
178
|
+
'error'
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Validate minimum order amount
|
|
183
|
+
$cart_total = WC()->cart->get_total('');
|
|
184
|
+
$minimum_order = 50.00;
|
|
185
|
+
|
|
186
|
+
if ($cart_total < $minimum_order) {
|
|
187
|
+
wc_add_notice(
|
|
188
|
+
sprintf(
|
|
189
|
+
__('Minimum order amount is $%s. Your current total is $%s.', 'woo-custom-cart'),
|
|
190
|
+
number_format($minimum_order, 2),
|
|
191
|
+
number_format($cart_total, 2)
|
|
192
|
+
),
|
|
193
|
+
'error'
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Add custom meta to order
|
|
200
|
+
*/
|
|
201
|
+
public function add_order_meta($order, $data)
|
|
202
|
+
{
|
|
203
|
+
if (isset($_POST['custom_delivery_instructions'])) {
|
|
204
|
+
$order->update_meta_data(
|
|
205
|
+
'_delivery_instructions',
|
|
206
|
+
sanitize_textarea_field($_POST['custom_delivery_instructions'])
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Add custom order number
|
|
211
|
+
$custom_order_number = 'ORD-' . date('Ymd') . '-' . str_pad($order->get_id(), 6, '0', STR_PAD_LEFT);
|
|
212
|
+
$order->update_meta_data('_custom_order_number', $custom_order_number);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|