@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,466 @@
|
|
|
1
|
+
# PowerShell Legacy Migrations
|
|
2
|
+
|
|
3
|
+
Best practices for migrating from Windows PowerShell to PowerShell Core, handling deprecated features, and compatibility testing.
|
|
4
|
+
|
|
5
|
+
## Migration Strategy
|
|
6
|
+
|
|
7
|
+
### Assessment Phase
|
|
8
|
+
|
|
9
|
+
```powershell
|
|
10
|
+
# Check PowerShell version
|
|
11
|
+
function Get-PowerShellVersion
|
|
12
|
+
{
|
|
13
|
+
[CmdletBinding()]
|
|
14
|
+
param()
|
|
15
|
+
|
|
16
|
+
$version = $PSVersionTable.PSVersion
|
|
17
|
+
$edition = $PSVersionTable.PSEdition
|
|
18
|
+
|
|
19
|
+
[PSCustomObject]@{
|
|
20
|
+
Version = $version
|
|
21
|
+
Edition = $edition
|
|
22
|
+
IsCore = $edition -eq 'Core'
|
|
23
|
+
IsDesktop = $edition -eq 'Desktop'
|
|
24
|
+
Platform = if ($IsWindows) { 'Windows' }
|
|
25
|
+
elseif ($IsLinux) { 'Linux' }
|
|
26
|
+
elseif ($IsMacOS) { 'macOS' }
|
|
27
|
+
else { 'Unknown' }
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
# Scan for compatibility issues
|
|
32
|
+
function Test-ScriptCompatibility
|
|
33
|
+
{
|
|
34
|
+
[CmdletBinding()]
|
|
35
|
+
param(
|
|
36
|
+
[Parameter(Mandatory)]
|
|
37
|
+
[ValidateScript({ Test-Path $_ })]
|
|
38
|
+
[string]$ScriptPath
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
$issues = @()
|
|
42
|
+
$content = Get-Content -Path $ScriptPath -Raw
|
|
43
|
+
|
|
44
|
+
# Check for deprecated cmdlets
|
|
45
|
+
$deprecatedCmdlets = @(
|
|
46
|
+
'ConvertTo-SecureString -AsPlainText',
|
|
47
|
+
'New-WebServiceProxy',
|
|
48
|
+
'Register-PSSessionConfiguration',
|
|
49
|
+
'Get-WmiObject',
|
|
50
|
+
'Set-WmiInstance'
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
foreach ($deprecated in $deprecatedCmdlets)
|
|
54
|
+
{
|
|
55
|
+
if ($content -match [regex]::Escape($deprecated))
|
|
56
|
+
{
|
|
57
|
+
$issues += "Found deprecated: $deprecated"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
# Check for Windows-only cmdlets
|
|
62
|
+
$windowsOnlyCmdlets = @(
|
|
63
|
+
'Get-EventLog',
|
|
64
|
+
'Get-Counter',
|
|
65
|
+
'Get-WinEvent'
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
foreach ($cmdlet in $windowsOnlyCmdlets)
|
|
69
|
+
{
|
|
70
|
+
if ($content -match "\b$cmdlet\b")
|
|
71
|
+
{
|
|
72
|
+
$issues += "Windows-only cmdlet: $cmdlet"
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return $issues
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Deprecated Feature Handling
|
|
81
|
+
|
|
82
|
+
### WMI to CIM Migration
|
|
83
|
+
|
|
84
|
+
```powershell
|
|
85
|
+
# ❌ OLD: Windows PowerShell (WMI)
|
|
86
|
+
# Get-WmiObject -Class Win32_OperatingSystem
|
|
87
|
+
|
|
88
|
+
# ✅ NEW: PowerShell Core (CIM)
|
|
89
|
+
function Get-OperatingSystemInfo
|
|
90
|
+
{
|
|
91
|
+
[CmdletBinding()]
|
|
92
|
+
param()
|
|
93
|
+
|
|
94
|
+
try
|
|
95
|
+
{
|
|
96
|
+
$os = Get-CimInstance -ClassName Win32_OperatingSystem -ErrorAction Stop
|
|
97
|
+
|
|
98
|
+
[PSCustomObject]@{
|
|
99
|
+
Caption = $os.Caption
|
|
100
|
+
Version = $os.Version
|
|
101
|
+
BuildNumber = $os.BuildNumber
|
|
102
|
+
OSArchitecture = $os.OSArchitecture
|
|
103
|
+
LastBootUpTime = $os.LastBootUpTime
|
|
104
|
+
FreePhysicalMemory = $os.FreePhysicalMemory
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch
|
|
108
|
+
{
|
|
109
|
+
Write-Error "Failed to get OS info: $_"
|
|
110
|
+
throw
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Event Log Migration
|
|
116
|
+
|
|
117
|
+
```powershell
|
|
118
|
+
# ❌ OLD: Get-EventLog (not available in PowerShell Core)
|
|
119
|
+
# Get-EventLog -LogName Application -Newest 100
|
|
120
|
+
|
|
121
|
+
# ✅ NEW: Get-WinEvent (cross-platform where available)
|
|
122
|
+
function Get-ApplicationEvents
|
|
123
|
+
{
|
|
124
|
+
[CmdletBinding()]
|
|
125
|
+
param(
|
|
126
|
+
[Parameter()]
|
|
127
|
+
[int]$MaxEvents = 100,
|
|
128
|
+
|
|
129
|
+
[Parameter()]
|
|
130
|
+
[string]$LogName = 'Application'
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
if (-not $IsWindows)
|
|
134
|
+
{
|
|
135
|
+
Write-Warning "Event logs are only available on Windows"
|
|
136
|
+
return
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
try
|
|
140
|
+
{
|
|
141
|
+
$filterHash = @{
|
|
142
|
+
LogName = $LogName
|
|
143
|
+
MaxEvents = $MaxEvents
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
Get-WinEvent -FilterHashtable $filterHash -ErrorAction Stop
|
|
147
|
+
}
|
|
148
|
+
catch
|
|
149
|
+
{
|
|
150
|
+
Write-Error "Failed to get events: $_"
|
|
151
|
+
throw
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Secure String Handling
|
|
157
|
+
|
|
158
|
+
```powershell
|
|
159
|
+
# ❌ OLD: ConvertTo-SecureString with -AsPlainText (deprecated)
|
|
160
|
+
# $securePassword = ConvertTo-SecureString 'P@ssw0rd' -AsPlainText -Force
|
|
161
|
+
|
|
162
|
+
# ✅ NEW: Use Read-Host or certificate-based encryption
|
|
163
|
+
function New-SecureCredential
|
|
164
|
+
{
|
|
165
|
+
[CmdletBinding()]
|
|
166
|
+
param(
|
|
167
|
+
[Parameter(Mandatory)]
|
|
168
|
+
[string]$UserName
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
# Prompt for password securely
|
|
172
|
+
$securePassword = Read-Host -Prompt "Enter password for $UserName" -AsSecureString
|
|
173
|
+
|
|
174
|
+
$credential = [PSCredential]::new($UserName, $securePassword)
|
|
175
|
+
|
|
176
|
+
return $credential
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Compatibility Testing
|
|
181
|
+
|
|
182
|
+
### Multi-Version Testing
|
|
183
|
+
|
|
184
|
+
```powershell
|
|
185
|
+
function Test-ScriptOnMultipleVersions
|
|
186
|
+
{
|
|
187
|
+
[CmdletBinding()]
|
|
188
|
+
param(
|
|
189
|
+
[Parameter(Mandatory)]
|
|
190
|
+
[string]$ScriptPath,
|
|
191
|
+
|
|
192
|
+
[Parameter()]
|
|
193
|
+
[string[]]$PowerShellVersions = @('5.1', '7.4')
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
$results = @()
|
|
197
|
+
|
|
198
|
+
foreach ($version in $PowerShellVersions)
|
|
199
|
+
{
|
|
200
|
+
Write-Verbose "Testing on PowerShell $version"
|
|
201
|
+
|
|
202
|
+
$pwshPath = if ($version -like '5.*')
|
|
203
|
+
{
|
|
204
|
+
'powershell.exe'
|
|
205
|
+
}
|
|
206
|
+
else
|
|
207
|
+
{
|
|
208
|
+
'pwsh.exe'
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
try
|
|
212
|
+
{
|
|
213
|
+
$output = & $pwshPath -File $ScriptPath -ErrorAction Stop
|
|
214
|
+
|
|
215
|
+
$results += [PSCustomObject]@{
|
|
216
|
+
Version = $version
|
|
217
|
+
Success = $true
|
|
218
|
+
Output = $output
|
|
219
|
+
Error = $null
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
catch
|
|
223
|
+
{
|
|
224
|
+
$results += [PSCustomObject]@{
|
|
225
|
+
Version = $version
|
|
226
|
+
Success = $false
|
|
227
|
+
Output = $null
|
|
228
|
+
Error = $_.Exception.Message
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return $results
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Compatibility Wrapper Functions
|
|
238
|
+
|
|
239
|
+
```powershell
|
|
240
|
+
function Get-ComputerInfoCompat
|
|
241
|
+
{
|
|
242
|
+
[CmdletBinding()]
|
|
243
|
+
param()
|
|
244
|
+
|
|
245
|
+
if ($PSVersionTable.PSVersion.Major -ge 7)
|
|
246
|
+
{
|
|
247
|
+
# PowerShell Core
|
|
248
|
+
if ($IsWindows)
|
|
249
|
+
{
|
|
250
|
+
Get-ComputerInfo
|
|
251
|
+
}
|
|
252
|
+
else
|
|
253
|
+
{
|
|
254
|
+
Write-Warning "Get-ComputerInfo is Windows-only"
|
|
255
|
+
return $null
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
else
|
|
259
|
+
{
|
|
260
|
+
# Windows PowerShell
|
|
261
|
+
Get-ComputerInfo
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
## Module Compatibility
|
|
267
|
+
|
|
268
|
+
### Conditional Module Loading
|
|
269
|
+
|
|
270
|
+
```powershell
|
|
271
|
+
function Import-ModuleCompat
|
|
272
|
+
{
|
|
273
|
+
[CmdletBinding()]
|
|
274
|
+
param(
|
|
275
|
+
[Parameter(Mandatory)]
|
|
276
|
+
[string]$ModuleName,
|
|
277
|
+
|
|
278
|
+
[Parameter()]
|
|
279
|
+
[string]$AlternativeModule
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
try
|
|
283
|
+
{
|
|
284
|
+
Import-Module $ModuleName -ErrorAction Stop
|
|
285
|
+
Write-Verbose "Loaded module: $ModuleName"
|
|
286
|
+
}
|
|
287
|
+
catch
|
|
288
|
+
{
|
|
289
|
+
if ($AlternativeModule)
|
|
290
|
+
{
|
|
291
|
+
Write-Warning "Failed to load $ModuleName, trying $AlternativeModule"
|
|
292
|
+
Import-Module $AlternativeModule -ErrorAction Stop
|
|
293
|
+
}
|
|
294
|
+
else
|
|
295
|
+
{
|
|
296
|
+
throw
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
# Usage
|
|
302
|
+
Import-ModuleCompat -ModuleName 'ActiveDirectory' -AlternativeModule 'Microsoft.Graph.Identity.DirectoryManagement'
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### Windows Compatibility Module
|
|
306
|
+
|
|
307
|
+
```powershell
|
|
308
|
+
# For PowerShell Core on Windows, use Windows Compatibility
|
|
309
|
+
if ($PSVersionTable.PSVersion.Major -ge 7 -and $IsWindows)
|
|
310
|
+
{
|
|
311
|
+
# Import Windows PowerShell modules via compatibility layer
|
|
312
|
+
Import-Module -Name ActiveDirectory -UseWindowsPowerShell -ErrorAction SilentlyContinue
|
|
313
|
+
}
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
## Migration Patterns
|
|
317
|
+
|
|
318
|
+
### Gradual Migration Approach
|
|
319
|
+
|
|
320
|
+
```powershell
|
|
321
|
+
# Step 1: Add version detection
|
|
322
|
+
#Requires -Version 5.1
|
|
323
|
+
|
|
324
|
+
$isPowerShellCore = $PSVersionTable.PSEdition -eq 'Core'
|
|
325
|
+
|
|
326
|
+
# Step 2: Use conditional logic for version-specific code
|
|
327
|
+
if ($isPowerShellCore)
|
|
328
|
+
{
|
|
329
|
+
# PowerShell Core implementation
|
|
330
|
+
$os = Get-CimInstance -ClassName Win32_OperatingSystem
|
|
331
|
+
}
|
|
332
|
+
else
|
|
333
|
+
{
|
|
334
|
+
# Windows PowerShell implementation
|
|
335
|
+
$os = Get-WmiObject -Class Win32_OperatingSystem
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
# Step 3: Gradually replace with Core-compatible code
|
|
339
|
+
# Eventually remove conditional logic once fully migrated
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### Feature Detection Over Version Detection
|
|
343
|
+
|
|
344
|
+
```powershell
|
|
345
|
+
# ✅ GOOD: Feature detection
|
|
346
|
+
function Invoke-CommandWithFeatureDetection
|
|
347
|
+
{
|
|
348
|
+
[CmdletBinding()]
|
|
349
|
+
param()
|
|
350
|
+
|
|
351
|
+
# Check if cmdlet exists
|
|
352
|
+
if (Get-Command -Name Get-CimInstance -ErrorAction SilentlyContinue)
|
|
353
|
+
{
|
|
354
|
+
Get-CimInstance -ClassName Win32_OperatingSystem
|
|
355
|
+
}
|
|
356
|
+
elseif (Get-Command -Name Get-WmiObject -ErrorAction SilentlyContinue)
|
|
357
|
+
{
|
|
358
|
+
Get-WmiObject -Class Win32_OperatingSystem
|
|
359
|
+
}
|
|
360
|
+
else
|
|
361
|
+
{
|
|
362
|
+
throw "No compatible cmdlet found"
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
# ❌ BAD: Hard version checks
|
|
367
|
+
# if ($PSVersionTable.PSVersion.Major -eq 5) { ... }
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
## Common Migration Issues
|
|
371
|
+
|
|
372
|
+
### Issue 1: .NET Framework vs .NET Core
|
|
373
|
+
|
|
374
|
+
```powershell
|
|
375
|
+
# Windows PowerShell uses .NET Framework
|
|
376
|
+
# PowerShell Core uses .NET Core/.NET 5+
|
|
377
|
+
|
|
378
|
+
# Check .NET runtime
|
|
379
|
+
$runtime = [System.Runtime.InteropServices.RuntimeInformation]::FrameworkDescription
|
|
380
|
+
Write-Output "Running on: $runtime"
|
|
381
|
+
|
|
382
|
+
# Some .NET Framework APIs are not available in .NET Core
|
|
383
|
+
# Use cross-platform alternatives
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
### Issue 2: Default Encoding Changes
|
|
387
|
+
|
|
388
|
+
```powershell
|
|
389
|
+
# Windows PowerShell: Default encoding varies
|
|
390
|
+
# PowerShell Core: Default encoding is UTF-8 (no BOM)
|
|
391
|
+
|
|
392
|
+
# ✅ GOOD: Explicitly specify encoding
|
|
393
|
+
function Write-FileWithEncoding
|
|
394
|
+
{
|
|
395
|
+
[CmdletBinding()]
|
|
396
|
+
param(
|
|
397
|
+
[Parameter(Mandatory)]
|
|
398
|
+
[string]$Path,
|
|
399
|
+
|
|
400
|
+
[Parameter(Mandatory)]
|
|
401
|
+
[string]$Content
|
|
402
|
+
)
|
|
403
|
+
|
|
404
|
+
# Use UTF-8 without BOM for cross-platform compatibility
|
|
405
|
+
$utf8NoBom = [System.Text.UTF8Encoding]::new($false)
|
|
406
|
+
[System.IO.File]::WriteAllText($Path, $Content, $utf8NoBom)
|
|
407
|
+
}
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
### Issue 3: Remoting Differences
|
|
411
|
+
|
|
412
|
+
```powershell
|
|
413
|
+
# Windows PowerShell: Uses WSMan by default
|
|
414
|
+
# PowerShell Core: Supports WSMan and SSH
|
|
415
|
+
|
|
416
|
+
function New-RemoteSessionCompat
|
|
417
|
+
{
|
|
418
|
+
[CmdletBinding()]
|
|
419
|
+
param(
|
|
420
|
+
[Parameter(Mandatory)]
|
|
421
|
+
[string]$ComputerName,
|
|
422
|
+
|
|
423
|
+
[Parameter()]
|
|
424
|
+
[PSCredential]$Credential,
|
|
425
|
+
|
|
426
|
+
[Parameter()]
|
|
427
|
+
[ValidateSet('WSMan', 'SSH')]
|
|
428
|
+
[string]$Protocol = 'WSMan'
|
|
429
|
+
)
|
|
430
|
+
|
|
431
|
+
$sessionParams = @{
|
|
432
|
+
ComputerName = $ComputerName
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
if ($Credential)
|
|
436
|
+
{
|
|
437
|
+
$sessionParams['Credential'] = $Credential
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
if ($Protocol -eq 'SSH' -and $PSVersionTable.PSVersion.Major -ge 7)
|
|
441
|
+
{
|
|
442
|
+
$sessionParams['HostName'] = $ComputerName
|
|
443
|
+
$sessionParams.Remove('ComputerName')
|
|
444
|
+
New-PSSession @sessionParams -SSHTransport
|
|
445
|
+
}
|
|
446
|
+
else
|
|
447
|
+
{
|
|
448
|
+
New-PSSession @sessionParams
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
## Best Practices
|
|
454
|
+
|
|
455
|
+
1. **Test on both versions** - Validate scripts on Windows PowerShell 5.1 and PowerShell Core 7.4+
|
|
456
|
+
2. **Use CIM instead of WMI** - CIM cmdlets are cross-platform
|
|
457
|
+
3. **Avoid deprecated cmdlets** - Replace with modern equivalents
|
|
458
|
+
4. **Feature detection over version detection** - Check for cmdlet availability
|
|
459
|
+
5. **Explicit encoding** - Always specify UTF-8 encoding
|
|
460
|
+
6. **Use compatibility modules** - Leverage Windows Compatibility when needed
|
|
461
|
+
7. **Gradual migration** - Migrate incrementally, not all at once
|
|
462
|
+
8. **Document compatibility** - Note minimum PowerShell version requirements
|
|
463
|
+
9. **Use #Requires statements** - Specify minimum version and modules
|
|
464
|
+
10. **Automated testing** - Test on multiple PowerShell versions in CI/CD
|
|
465
|
+
|
|
466
|
+
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
# PowerShell Modules and Advanced Functions
|
|
2
|
+
|
|
3
|
+
Best practices for PowerShell module development and advanced function patterns.
|
|
4
|
+
|
|
5
|
+
## Advanced Functions
|
|
6
|
+
|
|
7
|
+
### CmdletBinding Attribute
|
|
8
|
+
|
|
9
|
+
**ALWAYS** use `[CmdletBinding()]` for advanced functions:
|
|
10
|
+
|
|
11
|
+
```powershell
|
|
12
|
+
function Get-UserData
|
|
13
|
+
{
|
|
14
|
+
[CmdletBinding()]
|
|
15
|
+
param(
|
|
16
|
+
[Parameter(Mandatory, ValueFromPipeline)]
|
|
17
|
+
[string]$UserName
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
begin
|
|
21
|
+
{
|
|
22
|
+
Write-Verbose "Starting Get-UserData"
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
process
|
|
26
|
+
{
|
|
27
|
+
Write-Verbose "Processing user: $UserName"
|
|
28
|
+
# Function logic
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
{
|
|
33
|
+
Write-Verbose "Completed Get-UserData"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Parameter Attributes
|
|
39
|
+
|
|
40
|
+
```powershell
|
|
41
|
+
function Set-Configuration
|
|
42
|
+
{
|
|
43
|
+
[CmdletBinding()]
|
|
44
|
+
param(
|
|
45
|
+
# Mandatory parameter
|
|
46
|
+
[Parameter(Mandatory)]
|
|
47
|
+
[string]$ConfigPath,
|
|
48
|
+
|
|
49
|
+
# Pipeline input by value
|
|
50
|
+
[Parameter(ValueFromPipeline)]
|
|
51
|
+
[string]$Value,
|
|
52
|
+
|
|
53
|
+
# Pipeline input by property name
|
|
54
|
+
[Parameter(ValueFromPipelineByPropertyName)]
|
|
55
|
+
[string]$Name,
|
|
56
|
+
|
|
57
|
+
# Parameter validation
|
|
58
|
+
[Parameter()]
|
|
59
|
+
[ValidateSet('Development', 'Staging', 'Production')]
|
|
60
|
+
[string]$Environment = 'Development',
|
|
61
|
+
|
|
62
|
+
# Range validation
|
|
63
|
+
[Parameter()]
|
|
64
|
+
[ValidateRange(1, 100)]
|
|
65
|
+
[int]$RetryCount = 3,
|
|
66
|
+
|
|
67
|
+
# Script validation
|
|
68
|
+
[Parameter()]
|
|
69
|
+
[ValidateScript({ Test-Path $_ })]
|
|
70
|
+
[string]$LogPath
|
|
71
|
+
)
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Parameter Sets
|
|
76
|
+
|
|
77
|
+
### Multiple Parameter Sets
|
|
78
|
+
|
|
79
|
+
```powershell
|
|
80
|
+
function Get-Data
|
|
81
|
+
{
|
|
82
|
+
[CmdletBinding(DefaultParameterSetName = 'ByName')]
|
|
83
|
+
param(
|
|
84
|
+
[Parameter(Mandatory, ParameterSetName = 'ByName')]
|
|
85
|
+
[string]$Name,
|
|
86
|
+
|
|
87
|
+
[Parameter(Mandatory, ParameterSetName = 'ById')]
|
|
88
|
+
[int]$Id,
|
|
89
|
+
|
|
90
|
+
[Parameter(ParameterSetName = 'ByName')]
|
|
91
|
+
[Parameter(ParameterSetName = 'ById')]
|
|
92
|
+
[switch]$IncludeDetails
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
switch ($PSCmdlet.ParameterSetName)
|
|
96
|
+
{
|
|
97
|
+
'ByName' { Write-Output "Getting data by name: $Name" }
|
|
98
|
+
'ById' { Write-Output "Getting data by ID: $Id" }
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
# Usage
|
|
103
|
+
Get-Data -Name 'User1'
|
|
104
|
+
Get-Data -Id 123
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## SupportsShouldProcess
|
|
108
|
+
|
|
109
|
+
### WhatIf and Confirm Support
|
|
110
|
+
|
|
111
|
+
```powershell
|
|
112
|
+
function Remove-UserData
|
|
113
|
+
{
|
|
114
|
+
[CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')]
|
|
115
|
+
param(
|
|
116
|
+
[Parameter(Mandatory)]
|
|
117
|
+
[string]$UserName
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
if ($PSCmdlet.ShouldProcess($UserName, 'Remove user data'))
|
|
121
|
+
{
|
|
122
|
+
# Perform deletion
|
|
123
|
+
Write-Output "Removing data for $UserName"
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
# Usage
|
|
128
|
+
Remove-UserData -UserName 'TestUser' -WhatIf
|
|
129
|
+
Remove-UserData -UserName 'TestUser' -Confirm:$false
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Module Structure
|
|
133
|
+
|
|
134
|
+
### Module Directory Layout
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
MyModule/
|
|
138
|
+
├── MyModule.psd1 # Module manifest
|
|
139
|
+
├── MyModule.psm1 # Module script
|
|
140
|
+
├── Public/ # Exported functions
|
|
141
|
+
│ ├── Get-Something.ps1
|
|
142
|
+
│ └── Set-Something.ps1
|
|
143
|
+
├── Private/ # Internal functions
|
|
144
|
+
│ └── Helper.ps1
|
|
145
|
+
├── Classes/ # PowerShell classes
|
|
146
|
+
│ └── MyClass.ps1
|
|
147
|
+
├── Data/ # Data files
|
|
148
|
+
│ └── config.json
|
|
149
|
+
└── Tests/ # Pester tests
|
|
150
|
+
└── MyModule.Tests.ps1
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Module Manifest (.psd1)
|
|
154
|
+
|
|
155
|
+
```powershell
|
|
156
|
+
@{
|
|
157
|
+
RootModule = 'MyModule.psm1'
|
|
158
|
+
ModuleVersion = '1.0.0'
|
|
159
|
+
GUID = 'a1b2c3d4-e5f6-7890-abcd-ef1234567890'
|
|
160
|
+
Author = 'Your Name'
|
|
161
|
+
CompanyName = 'Your Company'
|
|
162
|
+
Copyright = '(c) 2024. All rights reserved.'
|
|
163
|
+
Description = 'Module description'
|
|
164
|
+
|
|
165
|
+
PowerShellVersion = '7.4'
|
|
166
|
+
|
|
167
|
+
FunctionsToExport = @('Get-Something', 'Set-Something')
|
|
168
|
+
CmdletsToExport = @()
|
|
169
|
+
VariablesToExport = @()
|
|
170
|
+
AliasesToExport = @()
|
|
171
|
+
|
|
172
|
+
PrivateData = @{
|
|
173
|
+
PSData = @{
|
|
174
|
+
Tags = @('Tag1', 'Tag2')
|
|
175
|
+
LicenseUri = 'https://github.com/user/repo/blob/main/LICENSE'
|
|
176
|
+
ProjectUri = 'https://github.com/user/repo'
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Module Script (.psm1)
|
|
183
|
+
|
|
184
|
+
```powershell
|
|
185
|
+
#Requires -Version 7.4
|
|
186
|
+
|
|
187
|
+
# Import public functions
|
|
188
|
+
$publicFunctions = @(Get-ChildItem -Path $PSScriptRoot\Public\*.ps1 -ErrorAction SilentlyContinue)
|
|
189
|
+
|
|
190
|
+
# Import private functions
|
|
191
|
+
$privateFunctions = @(Get-ChildItem -Path $PSScriptRoot\Private\*.ps1 -ErrorAction SilentlyContinue)
|
|
192
|
+
|
|
193
|
+
# Dot source the files
|
|
194
|
+
foreach ($import in @($publicFunctions + $privateFunctions))
|
|
195
|
+
{
|
|
196
|
+
try
|
|
197
|
+
{
|
|
198
|
+
. $import.FullName
|
|
199
|
+
}
|
|
200
|
+
catch
|
|
201
|
+
{
|
|
202
|
+
Write-Error "Failed to import function $($import.FullName): $_"
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
# Export public functions
|
|
207
|
+
Export-ModuleMember -Function $publicFunctions.BaseName
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Output Types
|
|
211
|
+
|
|
212
|
+
### Specify Output Type
|
|
213
|
+
|
|
214
|
+
```powershell
|
|
215
|
+
function Get-UserInfo
|
|
216
|
+
{
|
|
217
|
+
[CmdletBinding()]
|
|
218
|
+
[OutputType([PSCustomObject])]
|
|
219
|
+
param(
|
|
220
|
+
[Parameter(Mandatory)]
|
|
221
|
+
[string]$UserName
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
[PSCustomObject]@{
|
|
225
|
+
UserName = $UserName
|
|
226
|
+
Email = "$UserName@example.com"
|
|
227
|
+
Created = Get-Date
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Best Practices
|
|
233
|
+
|
|
234
|
+
1. **Use CmdletBinding** - Enable advanced function features
|
|
235
|
+
2. **Validate parameters** - Use validation attributes
|
|
236
|
+
3. **Support pipeline** - Use ValueFromPipeline
|
|
237
|
+
4. **Use parameter sets** - For mutually exclusive parameters
|
|
238
|
+
5. **Implement ShouldProcess** - For destructive operations
|
|
239
|
+
6. **Specify output types** - Use [OutputType()] attribute
|
|
240
|
+
7. **Export selectively** - Only export public functions
|
|
241
|
+
8. **Use begin/process/end** - For pipeline processing
|
|
242
|
+
9. **Write verbose output** - Use Write-Verbose
|
|
243
|
+
10. **Follow naming conventions** - Verb-Noun format
|
|
244
|
+
|