@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,314 @@
|
|
|
1
|
+
# PowerShell Security Practices
|
|
2
|
+
|
|
3
|
+
Security best practices for PowerShell scripts and modules.
|
|
4
|
+
|
|
5
|
+
## Credential Management
|
|
6
|
+
|
|
7
|
+
### Use PSCredential Objects
|
|
8
|
+
|
|
9
|
+
```powershell
|
|
10
|
+
# ✅ Correct: Use PSCredential
|
|
11
|
+
function Connect-Service
|
|
12
|
+
{
|
|
13
|
+
[CmdletBinding()]
|
|
14
|
+
param(
|
|
15
|
+
[Parameter(Mandatory)]
|
|
16
|
+
[PSCredential]$Credential
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
$userName = $Credential.UserName
|
|
20
|
+
$password = $Credential.GetNetworkCredential().Password
|
|
21
|
+
|
|
22
|
+
# Use credentials securely
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
# Usage
|
|
26
|
+
$cred = Get-Credential -Message "Enter service credentials"
|
|
27
|
+
Connect-Service -Credential $cred
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Never Store Plain-Text Passwords
|
|
31
|
+
|
|
32
|
+
```powershell
|
|
33
|
+
# ❌ NEVER do this
|
|
34
|
+
$password = "MyPassword123"
|
|
35
|
+
$userName = "admin"
|
|
36
|
+
|
|
37
|
+
# ❌ NEVER do this
|
|
38
|
+
$password = "MyPassword123" | ConvertTo-SecureString -AsPlainText -Force
|
|
39
|
+
|
|
40
|
+
# ✅ Correct: Prompt for credentials
|
|
41
|
+
$cred = Get-Credential
|
|
42
|
+
|
|
43
|
+
# ✅ Correct: Use Windows Credential Manager
|
|
44
|
+
$cred = Get-StoredCredential -Target "MyService"
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Secure String Storage
|
|
48
|
+
|
|
49
|
+
```powershell
|
|
50
|
+
# Export encrypted credential (user-specific)
|
|
51
|
+
$cred = Get-Credential
|
|
52
|
+
$cred.Password | ConvertFrom-SecureString | Out-File "C:\Secure\cred.txt"
|
|
53
|
+
|
|
54
|
+
# Import encrypted credential
|
|
55
|
+
$password = Get-Content "C:\Secure\cred.txt" | ConvertTo-SecureString
|
|
56
|
+
$cred = New-Object PSCredential("username", $password)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**WARNING:** This encryption is user and machine-specific. Not portable.
|
|
60
|
+
|
|
61
|
+
### Azure Key Vault Integration
|
|
62
|
+
|
|
63
|
+
```powershell
|
|
64
|
+
# ✅ Best practice for production
|
|
65
|
+
function Get-SecurePassword
|
|
66
|
+
{
|
|
67
|
+
param([string]$SecretName)
|
|
68
|
+
|
|
69
|
+
$secret = Get-AzKeyVaultSecret -VaultName "MyVault" -Name $SecretName
|
|
70
|
+
return $secret.SecretValue
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Script Signing
|
|
75
|
+
|
|
76
|
+
### Sign Scripts for Production
|
|
77
|
+
|
|
78
|
+
```powershell
|
|
79
|
+
# Get code signing certificate
|
|
80
|
+
$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert
|
|
81
|
+
|
|
82
|
+
# Sign script
|
|
83
|
+
Set-AuthenticodeSignature -FilePath ".\MyScript.ps1" -Certificate $cert
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Verify Signatures
|
|
87
|
+
|
|
88
|
+
```powershell
|
|
89
|
+
# Check signature
|
|
90
|
+
$signature = Get-AuthenticodeSignature -FilePath ".\MyScript.ps1"
|
|
91
|
+
|
|
92
|
+
if ($signature.Status -eq 'Valid')
|
|
93
|
+
{
|
|
94
|
+
Write-Output "Script signature is valid"
|
|
95
|
+
}
|
|
96
|
+
else
|
|
97
|
+
{
|
|
98
|
+
Write-Warning "Script signature is invalid or missing"
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Execution Policies
|
|
103
|
+
|
|
104
|
+
### Understanding Execution Policies
|
|
105
|
+
|
|
106
|
+
```powershell
|
|
107
|
+
# Check current policy
|
|
108
|
+
Get-ExecutionPolicy
|
|
109
|
+
|
|
110
|
+
# Set execution policy (requires admin)
|
|
111
|
+
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
|
112
|
+
|
|
113
|
+
# Bypass for specific script (use cautiously)
|
|
114
|
+
PowerShell.exe -ExecutionPolicy Bypass -File ".\MyScript.ps1"
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**Execution Policy Levels:**
|
|
118
|
+
- `Restricted` - No scripts allowed
|
|
119
|
+
- `AllSigned` - Only signed scripts
|
|
120
|
+
- `RemoteSigned` - Downloaded scripts must be signed
|
|
121
|
+
- `Unrestricted` - All scripts allowed (prompts for downloaded)
|
|
122
|
+
- `Bypass` - No restrictions (dangerous)
|
|
123
|
+
|
|
124
|
+
### Recommended Settings
|
|
125
|
+
|
|
126
|
+
```powershell
|
|
127
|
+
# Development
|
|
128
|
+
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
|
129
|
+
|
|
130
|
+
# Production
|
|
131
|
+
Set-ExecutionPolicy -ExecutionPolicy AllSigned -Scope LocalMachine
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Input Validation
|
|
135
|
+
|
|
136
|
+
### Validate All Input
|
|
137
|
+
|
|
138
|
+
```powershell
|
|
139
|
+
function Remove-UserFiles
|
|
140
|
+
{
|
|
141
|
+
[CmdletBinding(SupportsShouldProcess)]
|
|
142
|
+
param(
|
|
143
|
+
[Parameter(Mandatory)]
|
|
144
|
+
[ValidateNotNullOrEmpty()]
|
|
145
|
+
[ValidatePattern('^[a-zA-Z0-9_-]+$')] # Alphanumeric only
|
|
146
|
+
[string]$UserName,
|
|
147
|
+
|
|
148
|
+
[Parameter(Mandatory)]
|
|
149
|
+
[ValidateScript({ Test-Path $_ -PathType Container })]
|
|
150
|
+
[string]$BasePath
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
# Prevent path traversal
|
|
154
|
+
$safePath = Join-Path $BasePath $UserName
|
|
155
|
+
$resolvedPath = Resolve-Path $safePath -ErrorAction Stop
|
|
156
|
+
|
|
157
|
+
if (-not $resolvedPath.Path.StartsWith($BasePath))
|
|
158
|
+
{
|
|
159
|
+
throw "Path traversal detected"
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if ($PSCmdlet.ShouldProcess($resolvedPath, "Remove files"))
|
|
163
|
+
{
|
|
164
|
+
Remove-Item -Path $resolvedPath -Recurse -Force
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Sanitize File Paths
|
|
170
|
+
|
|
171
|
+
```powershell
|
|
172
|
+
function Get-SafeFileName
|
|
173
|
+
{
|
|
174
|
+
param([string]$FileName)
|
|
175
|
+
|
|
176
|
+
# Remove invalid characters
|
|
177
|
+
$invalidChars = [System.IO.Path]::GetInvalidFileNameChars()
|
|
178
|
+
$safeName = $FileName
|
|
179
|
+
|
|
180
|
+
foreach ($char in $invalidChars)
|
|
181
|
+
{
|
|
182
|
+
$safeName = $safeName.Replace($char, '_')
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return $safeName
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Prevent Injection Attacks
|
|
190
|
+
|
|
191
|
+
### SQL Injection Prevention
|
|
192
|
+
|
|
193
|
+
```powershell
|
|
194
|
+
# ❌ Vulnerable to SQL injection
|
|
195
|
+
$query = "SELECT * FROM Users WHERE UserName = '$userName'"
|
|
196
|
+
|
|
197
|
+
# ✅ Use parameterized queries
|
|
198
|
+
$query = "SELECT * FROM Users WHERE UserName = @UserName"
|
|
199
|
+
$cmd = New-Object System.Data.SqlClient.SqlCommand($query, $connection)
|
|
200
|
+
$cmd.Parameters.AddWithValue("@UserName", $userName)
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Command Injection Prevention
|
|
204
|
+
|
|
205
|
+
```powershell
|
|
206
|
+
# ❌ Vulnerable to command injection
|
|
207
|
+
$output = cmd.exe /c "ping $hostName"
|
|
208
|
+
|
|
209
|
+
# ✅ Use native cmdlets
|
|
210
|
+
$output = Test-Connection -ComputerName $hostName -Count 4
|
|
211
|
+
|
|
212
|
+
# ✅ If external command needed, validate input
|
|
213
|
+
if ($hostName -match '^[a-zA-Z0-9.-]+$')
|
|
214
|
+
{
|
|
215
|
+
$output = & ping.exe $hostName
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Secure Coding Patterns
|
|
220
|
+
|
|
221
|
+
### Least Privilege
|
|
222
|
+
|
|
223
|
+
```powershell
|
|
224
|
+
# ✅ Check if admin rights are needed
|
|
225
|
+
function Test-IsAdmin
|
|
226
|
+
{
|
|
227
|
+
$currentUser = [Security.Principal.WindowsIdentity]::GetCurrent()
|
|
228
|
+
$principal = New-Object Security.Principal.WindowsPrincipal($currentUser)
|
|
229
|
+
return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
if (-not (Test-IsAdmin))
|
|
233
|
+
{
|
|
234
|
+
throw "This script requires administrator privileges"
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Secure Temporary Files
|
|
239
|
+
|
|
240
|
+
```powershell
|
|
241
|
+
# ✅ Use secure temp file creation
|
|
242
|
+
$tempFile = [System.IO.Path]::GetTempFileName()
|
|
243
|
+
|
|
244
|
+
try
|
|
245
|
+
{
|
|
246
|
+
# Use temp file
|
|
247
|
+
Set-Content -Path $tempFile -Value $data
|
|
248
|
+
# Process...
|
|
249
|
+
}
|
|
250
|
+
finally
|
|
251
|
+
{
|
|
252
|
+
# Always clean up
|
|
253
|
+
if (Test-Path $tempFile)
|
|
254
|
+
{
|
|
255
|
+
Remove-Item $tempFile -Force
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### Avoid Invoke-Expression
|
|
261
|
+
|
|
262
|
+
```powershell
|
|
263
|
+
# ❌ Dangerous: Arbitrary code execution
|
|
264
|
+
$command = "Get-Process"
|
|
265
|
+
Invoke-Expression $command
|
|
266
|
+
|
|
267
|
+
# ✅ Use safer alternatives
|
|
268
|
+
$command = "Get-Process"
|
|
269
|
+
& $command
|
|
270
|
+
|
|
271
|
+
# ✅ Or use scriptblock
|
|
272
|
+
$scriptBlock = { Get-Process }
|
|
273
|
+
& $scriptBlock
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
## Logging and Auditing
|
|
277
|
+
|
|
278
|
+
### Log Security Events
|
|
279
|
+
|
|
280
|
+
```powershell
|
|
281
|
+
function Write-SecurityLog
|
|
282
|
+
{
|
|
283
|
+
param(
|
|
284
|
+
[string]$Message,
|
|
285
|
+
[string]$User = $env:USERNAME
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
$logEntry = @{
|
|
289
|
+
Timestamp = Get-Date -Format 'o'
|
|
290
|
+
User = $User
|
|
291
|
+
Computer = $env:COMPUTERNAME
|
|
292
|
+
Message = $Message
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
$logEntry | ConvertTo-Json | Out-File "C:\Logs\security.log" -Append
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
# Usage
|
|
299
|
+
Write-SecurityLog -Message "User attempted to access restricted resource"
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
## Best Practices Summary
|
|
303
|
+
|
|
304
|
+
1. **Never store plain-text passwords** - Use PSCredential or Key Vault
|
|
305
|
+
2. **Sign production scripts** - Use code signing certificates
|
|
306
|
+
3. **Validate all input** - Use parameter validation attributes
|
|
307
|
+
4. **Prevent injection** - Use parameterized queries and native cmdlets
|
|
308
|
+
5. **Follow least privilege** - Request only necessary permissions
|
|
309
|
+
6. **Clean up resources** - Remove temp files and close connections
|
|
310
|
+
7. **Avoid Invoke-Expression** - Use safer alternatives
|
|
311
|
+
8. **Log security events** - Maintain audit trail
|
|
312
|
+
9. **Use execution policies** - RemoteSigned minimum for production
|
|
313
|
+
10. **Encrypt sensitive data** - Use SecureString or Key Vault
|
|
314
|
+
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
# PowerShell Testing Guidelines
|
|
2
|
+
|
|
3
|
+
Comprehensive testing standards using Pester framework for PowerShell code.
|
|
4
|
+
|
|
5
|
+
## Pester Framework
|
|
6
|
+
|
|
7
|
+
### Installation
|
|
8
|
+
|
|
9
|
+
```powershell
|
|
10
|
+
# Install Pester 5.x
|
|
11
|
+
Install-Module -Name Pester -Force -SkipPublisherCheck
|
|
12
|
+
|
|
13
|
+
# Verify installation
|
|
14
|
+
Get-Module -Name Pester -ListAvailable
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Test File Structure
|
|
18
|
+
|
|
19
|
+
**ALWAYS** follow these conventions:
|
|
20
|
+
|
|
21
|
+
```powershell
|
|
22
|
+
# Test files: *.Tests.ps1
|
|
23
|
+
Get-UserData.ps1 # Source file
|
|
24
|
+
Get-UserData.Tests.ps1 # Test file
|
|
25
|
+
|
|
26
|
+
# Directory structure
|
|
27
|
+
MyModule/
|
|
28
|
+
├── Public/
|
|
29
|
+
│ └── Get-UserData.ps1
|
|
30
|
+
├── Private/
|
|
31
|
+
│ └── Helper.ps1
|
|
32
|
+
└── Tests/
|
|
33
|
+
├── Public/
|
|
34
|
+
│ └── Get-UserData.Tests.ps1
|
|
35
|
+
└── Private/
|
|
36
|
+
└── Helper.Tests.ps1
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Test Structure (Pester 5.x)
|
|
40
|
+
|
|
41
|
+
### Describe, Context, It Blocks
|
|
42
|
+
|
|
43
|
+
```powershell
|
|
44
|
+
# ✅ GOOD: Proper test structure
|
|
45
|
+
Describe 'Get-UserData' {
|
|
46
|
+
BeforeAll {
|
|
47
|
+
# Setup runs once before all tests
|
|
48
|
+
$testUser = @{
|
|
49
|
+
Name = 'TestUser'
|
|
50
|
+
Email = 'test@example.com'
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
Context 'When user exists' {
|
|
55
|
+
It 'Should return user data' {
|
|
56
|
+
# Arrange
|
|
57
|
+
$userId = 1
|
|
58
|
+
|
|
59
|
+
# Act
|
|
60
|
+
$result = Get-UserData -UserId $userId
|
|
61
|
+
|
|
62
|
+
# Assert
|
|
63
|
+
$result.Name | Should -Be 'TestUser'
|
|
64
|
+
$result.Email | Should -Be 'test@example.com'
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
Context 'When user does not exist' {
|
|
69
|
+
It 'Should throw an error' {
|
|
70
|
+
# Arrange
|
|
71
|
+
$userId = 999
|
|
72
|
+
|
|
73
|
+
# Act & Assert
|
|
74
|
+
{ Get-UserData -UserId $userId } | Should -Throw
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
AfterAll {
|
|
79
|
+
# Cleanup runs once after all tests
|
|
80
|
+
Remove-Variable -Name testUser -ErrorAction SilentlyContinue
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### BeforeEach and AfterEach
|
|
86
|
+
|
|
87
|
+
```powershell
|
|
88
|
+
Describe 'Set-Configuration' {
|
|
89
|
+
BeforeEach {
|
|
90
|
+
# Runs before each test
|
|
91
|
+
$script:tempFile = New-TemporaryFile
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
It 'Should save configuration' {
|
|
95
|
+
Set-Configuration -Path $tempFile -Value 'test'
|
|
96
|
+
$tempFile | Should -Exist
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
AfterEach {
|
|
100
|
+
# Runs after each test
|
|
101
|
+
Remove-Item $tempFile -ErrorAction SilentlyContinue
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Assertions (Should)
|
|
107
|
+
|
|
108
|
+
### Common Assertions
|
|
109
|
+
|
|
110
|
+
```powershell
|
|
111
|
+
# Equality
|
|
112
|
+
$result | Should -Be 'expected'
|
|
113
|
+
$result | Should -Not -Be 'unexpected'
|
|
114
|
+
|
|
115
|
+
# Null checks
|
|
116
|
+
$result | Should -BeNullOrEmpty
|
|
117
|
+
$result | Should -Not -BeNullOrEmpty
|
|
118
|
+
|
|
119
|
+
# Type checks
|
|
120
|
+
$result | Should -BeOfType [string]
|
|
121
|
+
$result | Should -BeOfType [System.Collections.Hashtable]
|
|
122
|
+
|
|
123
|
+
# Boolean
|
|
124
|
+
$result | Should -BeTrue
|
|
125
|
+
$result | Should -BeFalse
|
|
126
|
+
|
|
127
|
+
# Exceptions
|
|
128
|
+
{ Get-Item 'C:\NonExistent' } | Should -Throw
|
|
129
|
+
{ Get-Item 'C:\NonExistent' } | Should -Throw -ExpectedMessage '*cannot find*'
|
|
130
|
+
|
|
131
|
+
# File/Path
|
|
132
|
+
'C:\Temp\file.txt' | Should -Exist
|
|
133
|
+
'C:\Temp\file.txt' | Should -FileContentMatch 'pattern'
|
|
134
|
+
|
|
135
|
+
# Collections
|
|
136
|
+
$array | Should -Contain 'item'
|
|
137
|
+
$array | Should -HaveCount 5
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Mocking
|
|
141
|
+
|
|
142
|
+
### Mock Functions and Cmdlets
|
|
143
|
+
|
|
144
|
+
```powershell
|
|
145
|
+
Describe 'Send-Notification' {
|
|
146
|
+
It 'Should call Send-MailMessage' {
|
|
147
|
+
# Arrange
|
|
148
|
+
Mock Send-MailMessage { }
|
|
149
|
+
|
|
150
|
+
# Act
|
|
151
|
+
Send-Notification -To 'user@example.com' -Message 'Test'
|
|
152
|
+
|
|
153
|
+
# Assert
|
|
154
|
+
Should -Invoke Send-MailMessage -Times 1 -Exactly
|
|
155
|
+
Should -Invoke Send-MailMessage -ParameterFilter {
|
|
156
|
+
$To -eq 'user@example.com'
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Mock Return Values
|
|
163
|
+
|
|
164
|
+
```powershell
|
|
165
|
+
Describe 'Get-ProcessedData' {
|
|
166
|
+
It 'Should process API response' {
|
|
167
|
+
# Arrange
|
|
168
|
+
Mock Invoke-RestMethod {
|
|
169
|
+
return @{
|
|
170
|
+
Status = 'Success'
|
|
171
|
+
Data = @('Item1', 'Item2')
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
# Act
|
|
176
|
+
$result = Get-ProcessedData
|
|
177
|
+
|
|
178
|
+
# Assert
|
|
179
|
+
$result.Data | Should -HaveCount 2
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## Test Organization
|
|
185
|
+
|
|
186
|
+
### Unit Tests
|
|
187
|
+
|
|
188
|
+
Test individual functions in isolation:
|
|
189
|
+
|
|
190
|
+
```powershell
|
|
191
|
+
Describe 'ConvertTo-TitleCase' -Tag 'Unit' {
|
|
192
|
+
It 'Should capitalize first letter of each word' {
|
|
193
|
+
$result = ConvertTo-TitleCase -Text 'hello world'
|
|
194
|
+
$result | Should -Be 'Hello World'
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### Integration Tests
|
|
200
|
+
|
|
201
|
+
Test multiple components together:
|
|
202
|
+
|
|
203
|
+
```powershell
|
|
204
|
+
Describe 'User Management Integration' -Tag 'Integration' {
|
|
205
|
+
It 'Should create and retrieve user' {
|
|
206
|
+
# Create user
|
|
207
|
+
New-User -Name 'TestUser' -Email 'test@example.com'
|
|
208
|
+
|
|
209
|
+
# Retrieve user
|
|
210
|
+
$user = Get-User -Name 'TestUser'
|
|
211
|
+
$user.Email | Should -Be 'test@example.com'
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Running Tests
|
|
217
|
+
|
|
218
|
+
### Command Line
|
|
219
|
+
|
|
220
|
+
```powershell
|
|
221
|
+
# Run all tests
|
|
222
|
+
Invoke-Pester
|
|
223
|
+
|
|
224
|
+
# Run specific file
|
|
225
|
+
Invoke-Pester -Path .\Tests\Get-UserData.Tests.ps1
|
|
226
|
+
|
|
227
|
+
# Run tests with tag
|
|
228
|
+
Invoke-Pester -Tag 'Unit'
|
|
229
|
+
|
|
230
|
+
# Generate code coverage
|
|
231
|
+
Invoke-Pester -CodeCoverage .\Public\*.ps1 -CodeCoverageOutputFile coverage.xml
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Configuration File
|
|
235
|
+
|
|
236
|
+
Create `PesterConfiguration.psd1`:
|
|
237
|
+
|
|
238
|
+
```powershell
|
|
239
|
+
@{
|
|
240
|
+
Run = @{
|
|
241
|
+
Path = './Tests'
|
|
242
|
+
Exit = $true
|
|
243
|
+
}
|
|
244
|
+
CodeCoverage = @{
|
|
245
|
+
Enabled = $true
|
|
246
|
+
Path = './Public/*.ps1', './Private/*.ps1'
|
|
247
|
+
OutputFormat = 'JaCoCo'
|
|
248
|
+
}
|
|
249
|
+
TestResult = @{
|
|
250
|
+
Enabled = $true
|
|
251
|
+
OutputFormat = 'NUnitXml'
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## Best Practices
|
|
257
|
+
|
|
258
|
+
1. **Use Pester 5.x** - Latest version with improved performance
|
|
259
|
+
2. **Follow AAA pattern** - Arrange, Act, Assert
|
|
260
|
+
3. **One assertion per test** - Keep tests focused
|
|
261
|
+
4. **Use descriptive names** - Test names should explain what is tested
|
|
262
|
+
5. **Mock external dependencies** - Isolate unit tests
|
|
263
|
+
6. **Use tags** - Organize tests (Unit, Integration, Slow)
|
|
264
|
+
7. **Test edge cases** - Null, empty, invalid inputs
|
|
265
|
+
8. **Aim for 80%+ coverage** - Use code coverage reports
|
|
266
|
+
9. **Run tests in CI/CD** - Automate testing
|
|
267
|
+
10. **Keep tests fast** - Unit tests should run in milliseconds
|
|
268
|
+
|