shmakk 1.1.0 → 1.2.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 +16 -1
- package/package.json +6 -3
- package/scripts/import-skills.js +536 -0
- package/scripts/install-skills.js +64 -0
- package/skills/ai-elements.md +482 -0
- package/skills/architecture.md +151 -0
- package/skills/backend-adapter-aws-lambda.md +204 -0
- package/skills/backend-adapter-express.md +177 -0
- package/skills/backend-adapter-fastify.md +222 -0
- package/skills/backend-adapter-fetch.md +200 -0
- package/skills/backend-api-docs.md +22 -0
- package/skills/backend-aspire.md +232 -0
- package/skills/backend-aspnet-core.md +62 -0
- package/skills/backend-build-chatgpt-app.md +321 -0
- package/skills/backend-build-mcp-app.md +393 -0
- package/skills/backend-build-mcp-server.md +222 -0
- package/skills/backend-build-mcpb.md +200 -0
- package/skills/backend-building-ai-agent-on-cloudflare.md +401 -0
- package/skills/backend-caching.md +206 -0
- package/skills/backend-chatgpt-app-submission.md +157 -0
- package/skills/backend-chatgpt-apps.md +321 -0
- package/skills/backend-client-setup.md +318 -0
- package/skills/backend-containerize-aspnet-framework.md +455 -0
- package/skills/backend-create-spring-boot-java-project.md +164 -0
- package/skills/backend-create-spring-boot-kotlin-project.md +148 -0
- package/skills/backend-csharp-async.md +50 -0
- package/skills/backend-csharp-docs.md +63 -0
- package/skills/backend-csharp-mcp-server-generator.md +60 -0
- package/skills/backend-dotenv.md +201 -0
- package/skills/backend-dotenvx.md +119 -0
- package/skills/backend-env-vars.md +259 -0
- package/skills/backend-error-handling.md +254 -0
- package/skills/backend-fastapi.md +437 -0
- package/skills/backend-go-mcp-server-generator.md +335 -0
- package/skills/backend-java-mcp-server-generator.md +757 -0
- package/skills/backend-kotlin-mcp-server-generator.md +450 -0
- package/skills/backend-middlewares.md +243 -0
- package/skills/backend-multi-stage-dockerfile.md +47 -0
- package/skills/backend-nestjs.md +192 -0
- package/skills/backend-next-forge.md +375 -0
- package/skills/backend-nextjs.md +746 -0
- package/skills/backend-openapi-to-application-code.md +113 -0
- package/skills/backend-php-mcp-server-generator.md +523 -0
- package/skills/backend-python-mcp-server-generator.md +106 -0
- package/skills/backend-routing-middleware.md +251 -0
- package/skills/backend-ruby-mcp-server-generator.md +661 -0
- package/skills/backend-rust-mcp-server-generator.md +578 -0
- package/skills/backend-semantic-kernel.md +57 -0
- package/skills/backend-server-setup.md +379 -0
- package/skills/backend-server-side-calls.md +250 -0
- package/skills/backend-subscriptions.md +407 -0
- package/skills/backend-swift-mcp-server-generator.md +670 -0
- package/skills/backend-trpc-router.md +152 -0
- package/skills/backend-typescript-mcp-server-generator.md +91 -0
- package/skills/backend-validators.md +229 -0
- package/skills/backend.md +76 -0
- package/skills/backup.md +165 -0
- package/skills/budget.md +140 -0
- package/skills/business-gtm-0-to-1-launch.md +322 -0
- package/skills/business-gtm-operating-cadence.md +421 -0
- package/skills/business-gtm-positioning-strategy.md +439 -0
- package/skills/business-gtm-product-led-growth.md +340 -0
- package/skills/calendar.md +95 -0
- package/skills/code-review.md +130 -0
- package/skills/compliance.md +168 -0
- package/skills/contracts.md +130 -0
- package/skills/daily-job-run.md +46 -0
- package/skills/daily-webdesign.md +187 -0
- package/skills/database-bigquery-pipeline-audit.md +130 -0
- package/skills/database-cosmosdb-datamodeling.md +1046 -0
- package/skills/database-durable-objects.md +187 -0
- package/skills/database-ef-core.md +76 -0
- package/skills/database-fabric-lakehouse.md +107 -0
- package/skills/database-neon-postgres-egress-optimizer.md +213 -0
- package/skills/database-neon-postgres.md +218 -0
- package/skills/database-postgresql-code-review.md +213 -0
- package/skills/database-postgresql-optimization.md +405 -0
- package/skills/database-sql-code-review.md +302 -0
- package/skills/database-sql-optimization.md +297 -0
- package/skills/dependency-audit.md +165 -0
- package/skills/design-kami-landing.md +234 -0
- package/skills/design.md +221 -0
- package/skills/dev-acquire-codebase-knowledge.md +175 -0
- package/skills/dev-add-educational-comments.md +129 -0
- package/skills/dev-add-model-descriptions.md +74 -0
- package/skills/dev-adr-review.md +56 -0
- package/skills/dev-boost-prompt.md +26 -0
- package/skills/dev-build-run-debug.md +130 -0
- package/skills/dev-chunk.md +49 -0
- package/skills/dev-claude-md-improver.md +180 -0
- package/skills/dev-code-exemplars-blueprint-generator.md +127 -0
- package/skills/dev-code-tour.md +434 -0
- package/skills/dev-comment-code-generate-a-tutorial.md +27 -0
- package/skills/dev-commit.md +81 -0
- package/skills/dev-context-map.md +53 -0
- package/skills/dev-conventional-commit.md +73 -0
- package/skills/dev-create-architectural-decision-record.md +98 -0
- package/skills/dev-create-draft-pr.md +17 -0
- package/skills/dev-create-pr.md +17 -0
- package/skills/dev-create-readme.md +22 -0
- package/skills/dev-csharp-mstest.md +479 -0
- package/skills/dev-csharp-nunit.md +72 -0
- package/skills/dev-csharp-tunit.md +101 -0
- package/skills/dev-csharp-xunit.md +69 -0
- package/skills/dev-debug-failing-test.md +90 -0
- package/skills/dev-diff-analyze.md +32 -0
- package/skills/dev-diffs.md +24 -0
- package/skills/dev-dotnet-best-practices.md +86 -0
- package/skills/dev-dotnet-design-pattern-review.md +43 -0
- package/skills/dev-dotnet-timezone.md +110 -0
- package/skills/dev-dotnet-upgrade.md +117 -0
- package/skills/dev-doublecheck.md +278 -0
- package/skills/dev-explain-error.md +15 -0
- package/skills/dev-finding-discovery.md +164 -0
- package/skills/dev-fix-finding.md +111 -0
- package/skills/dev-full-file-edit.md +25 -0
- package/skills/dev-git-commit.md +125 -0
- package/skills/dev-git-flow-branch-creator.md +293 -0
- package/skills/dev-git-workflow.md +46 -0
- package/skills/dev-github-automation.md +64 -0
- package/skills/dev-github-code-review.md +1140 -0
- package/skills/dev-github-issues.md +202 -0
- package/skills/dev-gpt-5-4-prompting.md +55 -0
- package/skills/dev-investigation-mode.md +277 -0
- package/skills/dev-java-add-graalvm-native-image-support.md +450 -0
- package/skills/dev-java-docs.md +24 -0
- package/skills/dev-java-refactoring-extract-method.md +105 -0
- package/skills/dev-java-refactoring-remove-parameter.md +85 -0
- package/skills/dev-merge.md +73 -0
- package/skills/dev-migrate-create.md +36 -0
- package/skills/dev-migrate-validate.md +36 -0
- package/skills/dev-my-issues.md +9 -0
- package/skills/dev-my-pull-requests.md +15 -0
- package/skills/dev-planning-oracle-to-postgres-migration-integration-testing.md +45 -0
- package/skills/dev-playwright-generate-test.md +18 -0
- package/skills/dev-playwright.md +148 -0
- package/skills/dev-prompt-builder.md +142 -0
- package/skills/dev-pytest-coverage.md +29 -0
- package/skills/dev-python-manager-discovery.md +330 -0
- package/skills/dev-python-pypi-package-builder.md +445 -0
- package/skills/dev-readme-blueprint-generator.md +79 -0
- package/skills/dev-refactor-method-complexity-reduce.md +99 -0
- package/skills/dev-refactor-plan.md +66 -0
- package/skills/dev-refactor.md +646 -0
- package/skills/dev-review-and-refactor.md +16 -0
- package/skills/dev-reviewing-oracle-to-postgres-migration.md +68 -0
- package/skills/dev-ruff-recursive-fix.md +201 -0
- package/skills/dev-run-e2e-tests.md +126 -0
- package/skills/dev-run-pre-commit-checks.md +133 -0
- package/skills/dev-run-smoke-tests.md +127 -0
- package/skills/dev-scaffolding-oracle-to-postgres-migration-test-project.md +55 -0
- package/skills/dev-spring-boot-testing.md +190 -0
- package/skills/dev-sync-upstream.md +32 -0
- package/skills/dev-sync.md +74 -0
- package/skills/dev-tdd-workflow.md +23 -0
- package/skills/dev-terraform-azurerm-set-diff-analyzer.md +49 -0
- package/skills/dev-test-driven-development.md +372 -0
- package/skills/dev-test-gaps.md +18 -0
- package/skills/dev-test-triage.md +55 -0
- package/skills/dev-typer.md +267 -0
- package/skills/dev-typescript-setup.md +25 -0
- package/skills/dev-unified-diff-edit.md +16 -0
- package/skills/dev-unit-test-vue-pinia.md +198 -0
- package/skills/dev-using-git-worktrees.md +216 -0
- package/skills/dev-validation.md +99 -0
- package/skills/dev-verification.md +168 -0
- package/skills/dev-webapp-testing.md +134 -0
- package/skills/dev-write-coding-standards-from-file.md +317 -0
- package/skills/dev-write-tests.md +16 -0
- package/skills/devops-appinsights-instrumentation.md +49 -0
- package/skills/devops-az-cost-optimize.md +306 -0
- package/skills/devops-chronicle.md +154 -0
- package/skills/devops-deployments-cicd.md +331 -0
- package/skills/devops-devops-rollout-plan.md +118 -0
- package/skills/devops-geistdocs.md +276 -0
- package/skills/devops-observability.md +774 -0
- package/skills/devops-observe-metrics.md +35 -0
- package/skills/devops-observe-trace.md +30 -0
- package/skills/devops-phoenix-cli.md +163 -0
- package/skills/devops-phoenix-tracing.md +140 -0
- package/skills/devops-publish-to-pages.md +108 -0
- package/skills/devops-telemetry.md +87 -0
- package/skills/devops-update-avm-modules-in-bicep.md +61 -0
- package/skills/devops.md +81 -0
- package/skills/diagrams-canvas.md +204 -0
- package/skills/diagrams-draw-io-diagram-generator.md +463 -0
- package/skills/diagrams-excalidraw-diagram-generator.md +614 -0
- package/skills/diagrams-graphify.md +1277 -0
- package/skills/docs-bear-notes.md +108 -0
- package/skills/docs-create-llms.md +211 -0
- package/skills/docs-doc-gen.md +20 -0
- package/skills/docs-documentation-writer.md +46 -0
- package/skills/docs-llm-config.md +33 -0
- package/skills/docs-mkdocs-translations.md +109 -0
- package/skills/docs-obsidian-vault-maintainer.md +14 -0
- package/skills/docs-obsidian.md +82 -0
- package/skills/docs-prose.md +324 -0
- package/skills/docs-update-llms.md +217 -0
- package/skills/docs-update-markdown-file-index.md +77 -0
- package/skills/docs-wiki-maintainer.md +20 -0
- package/skills/documents.md +120 -0
- package/skills/email.md +113 -0
- package/skills/expenses.md +140 -0
- package/skills/file-ops.md +149 -0
- package/skills/files-convert-plaintext-to-md.md +363 -0
- package/skills/files-doc.md +81 -0
- package/skills/files-docx.md +594 -0
- package/skills/files-markdown-to-html.md +917 -0
- package/skills/files-nano-pdf.md +39 -0
- package/skills/files-pdf.md +315 -0
- package/skills/files-pdftk-server.md +163 -0
- package/skills/files-pptx-html-fidelity-audit.md +255 -0
- package/skills/files-pptx.md +231 -0
- package/skills/files-xlsx.md +301 -0
- package/skills/find-jobs.md +78 -0
- package/skills/format-conversion.md +157 -0
- package/skills/frontend-ai-elements.md +483 -0
- package/skills/frontend-ai-gateway.md +563 -0
- package/skills/frontend-ai-generation-persistence.md +242 -0
- package/skills/frontend-ai-sdk.md +799 -0
- package/skills/frontend-ai-visibility.md +127 -0
- package/skills/frontend-angular-developer.md +130 -0
- package/skills/frontend-aspnet-minimal-api-openapi.md +42 -0
- package/skills/frontend-bencium-innovative-ux-designer.md +719 -0
- package/skills/frontend-chat-sdk.md +666 -0
- package/skills/frontend-chrome-devtools.md +98 -0
- package/skills/frontend-frontend-app-builder.md +186 -0
- package/skills/frontend-frontend-design.md +43 -0
- package/skills/frontend-frontend-testing-debugging.md +143 -0
- package/skills/frontend-gsap-framer-scroll-animation.md +152 -0
- package/skills/frontend-internal-linking.md +109 -0
- package/skills/frontend-json-render.md +335 -0
- package/skills/frontend-keyword-clustering.md +118 -0
- package/skills/frontend-next-intl-add-language.md +20 -0
- package/skills/frontend-on-page-seo.md +112 -0
- package/skills/frontend-premium-frontend-ui.md +114 -0
- package/skills/frontend-react-best-practices.md +143 -0
- package/skills/frontend-schema-markup.md +160 -0
- package/skills/frontend-seo-audit.md +110 -0
- package/skills/frontend-swr.md +215 -0
- package/skills/frontend-technical-seo.md +162 -0
- package/skills/frontend-use-dom.md +418 -0
- package/skills/frontend-web-coder.md +564 -0
- package/skills/frontend-web-design-reviewer.md +369 -0
- package/skills/frontend-web-perf.md +202 -0
- package/skills/frontend.md +125 -0
- package/skills/general-adapter-standalone.md +199 -0
- package/skills/general-auth.md +356 -0
- package/skills/general-containerize-aspnetcore.md +393 -0
- package/skills/general-create-technical-spike.md +231 -0
- package/skills/general-cron-jobs.md +72 -0
- package/skills/general-ddd-aggregate.md +52 -0
- package/skills/general-ddd-context.md +46 -0
- package/skills/general-ddd-validate.md +51 -0
- package/skills/general-dependency-check.md +26 -0
- package/skills/general-email-marketing.md +86 -0
- package/skills/general-healthcheck.md +246 -0
- package/skills/general-import-infrastructure-as-code.md +368 -0
- package/skills/general-init.md +49 -0
- package/skills/general-java-junit.md +64 -0
- package/skills/general-java-springboot.md +66 -0
- package/skills/general-javascript-typescript-jest.md +45 -0
- package/skills/general-kotlin-springboot.md +71 -0
- package/skills/general-make-repo-contribution.md +91 -0
- package/skills/general-market-research.md +78 -0
- package/skills/general-marketplace.md +468 -0
- package/skills/general-model-recommendation.md +673 -0
- package/skills/general-payments.md +352 -0
- package/skills/general-quality-playbook.md +480 -0
- package/skills/general-run-integration-tests.md +113 -0
- package/skills/general-superjson.md +274 -0
- package/skills/general-swiftpm-macos.md +51 -0
- package/skills/general-threat-model.md +61 -0
- package/skills/invoices.md +167 -0
- package/skills/licenses.md +159 -0
- package/skills/logs.md +156 -0
- package/skills/marketing.md +139 -0
- package/skills/media-image-manipulation-image-magick.md +253 -0
- package/skills/media-imagegen.md +357 -0
- package/skills/media-openai-whisper-api.md +63 -0
- package/skills/media-openai-whisper.md +39 -0
- package/skills/media-peekaboo.md +191 -0
- package/skills/media-screenshot.md +268 -0
- package/skills/media-speech.md +145 -0
- package/skills/media-transcribe.md +82 -0
- package/skills/media-video-frames.md +47 -0
- package/skills/mobile-android-emulator-qa.md +81 -0
- package/skills/mobile-android-performance.md +280 -0
- package/skills/mobile-building-mcp-server-on-cloudflare.md +267 -0
- package/skills/mobile-building-native-ui.md +322 -0
- package/skills/mobile-expo-api-routes.md +369 -0
- package/skills/mobile-expo-cicd-workflows.md +92 -0
- package/skills/mobile-expo-deployment.md +191 -0
- package/skills/mobile-expo-dev-client.md +165 -0
- package/skills/mobile-expo-module.md +177 -0
- package/skills/mobile-expo-tailwind-setup.md +481 -0
- package/skills/mobile-expo-ui-jetpack-compose.md +41 -0
- package/skills/mobile-expo-ui-swift-ui.md +40 -0
- package/skills/mobile-ios-app-intents.md +78 -0
- package/skills/mobile-ios-debugger-agent.md +52 -0
- package/skills/mobile-ios-ettrace-performance.md +198 -0
- package/skills/mobile-ios-memgraph-leaks.md +77 -0
- package/skills/mobile-native-data-fetching.md +508 -0
- package/skills/mobile-packaging-notarization.md +48 -0
- package/skills/mobile-react-native-architecture.md +672 -0
- package/skills/mobile-react-native-mobile-design.md +438 -0
- package/skills/mobile-signing-entitlements.md +59 -0
- package/skills/mobile-swiftui-liquid-glass.md +91 -0
- package/skills/mobile-swiftui-patterns.md +210 -0
- package/skills/mobile-swiftui-performance-audit.md +108 -0
- package/skills/mobile-swiftui-ui-patterns.md +97 -0
- package/skills/mobile-swiftui-view-refactor.md +204 -0
- package/skills/mobile-upgrading-expo.md +134 -0
- package/skills/mobile.md +183 -0
- package/skills/notes.md +106 -0
- package/skills/planning-adr-create.md +62 -0
- package/skills/planning-adr-index.md +67 -0
- package/skills/planning-architecture-blueprint-generator.md +323 -0
- package/skills/planning-brainstorming.md +165 -0
- package/skills/planning-breakdown-epic-arch.md +67 -0
- package/skills/planning-breakdown-epic-pm.md +59 -0
- package/skills/planning-breakdown-feature-implementation.md +129 -0
- package/skills/planning-breakdown-feature-prd.md +62 -0
- package/skills/planning-breakdown-plan.md +510 -0
- package/skills/planning-breakdown-test.md +366 -0
- package/skills/planning-cloud-design-patterns.md +63 -0
- package/skills/planning-content-brief.md +128 -0
- package/skills/planning-content-strategy.md +138 -0
- package/skills/planning-content-translation.md +143 -0
- package/skills/planning-create-github-action-workflow-specification.md +277 -0
- package/skills/planning-create-github-issues-feature-from-implementation-plan.md +29 -0
- package/skills/planning-create-github-issues-for-unmet-specification-requirements.md +36 -0
- package/skills/planning-create-github-pull-request-from-specification.md +25 -0
- package/skills/planning-create-implementation-plan.md +158 -0
- package/skills/planning-create-specification.md +128 -0
- package/skills/planning-first-ask.md +31 -0
- package/skills/planning-folder-structure-blueprint-generator.md +406 -0
- package/skills/planning-gen-specs-as-issues.md +166 -0
- package/skills/planning-generate-snapshot.md +144 -0
- package/skills/planning-generate-status-report.md +336 -0
- package/skills/planning-metric-pack-designer.md +27 -0
- package/skills/planning-pm-spec.md +53 -0
- package/skills/planning-prd.md +144 -0
- package/skills/planning-project-assessment.md +182 -0
- package/skills/planning-project-setup-info-local.md +128 -0
- package/skills/planning-project-workflow-analysis-blueprint-generator.md +294 -0
- package/skills/planning-service-oriented-architecture.md +248 -0
- package/skills/planning-spec-to-backlog.md +544 -0
- package/skills/planning-technology-stack-blueprint-generator.md +243 -0
- package/skills/planning-update-implementation-plan.md +158 -0
- package/skills/planning-update-specification.md +128 -0
- package/skills/planning-what-context-needed.md +40 -0
- package/skills/planning-writing-plans.md +153 -0
- package/skills/prepare-application.md +81 -0
- package/skills/productivity-apple-notes.md +78 -0
- package/skills/productivity-apple-reminders.md +119 -0
- package/skills/productivity-capture-tasks-from-meeting-notes.md +680 -0
- package/skills/productivity-daily-prep.md +156 -0
- package/skills/productivity-email-drafter.md +101 -0
- package/skills/productivity-hr-onboarding.md +53 -0
- package/skills/productivity-things-mac.md +87 -0
- package/skills/productivity-update.md +169 -0
- package/skills/reminders.md +109 -0
- package/skills/research-dossier-collect.md +71 -0
- package/skills/research-kg-extract.md +37 -0
- package/skills/research-openai-docs.md +89 -0
- package/skills/research-research-add-items.md +31 -0
- package/skills/research-research-report.md +94 -0
- package/skills/research-research-synthesize.md +63 -0
- package/skills/research-summarize.md +88 -0
- package/skills/research-transformers-js.md +635 -0
- package/skills/research.md +119 -0
- package/skills/security-ai-prompt-engineering-safety-review.md +231 -0
- package/skills/security-attack-path-analysis.md +182 -0
- package/skills/security-gdpr-compliant.md +284 -0
- package/skills/security-mcp-security-audit.md +279 -0
- package/skills/security-pii-detect.md +31 -0
- package/skills/security-secret-scanning.md +243 -0
- package/skills/security-security-best-practices.md +87 -0
- package/skills/security-security-ownership-map.md +207 -0
- package/skills/security-security-review.md +169 -0
- package/skills/security-security-scan.md +138 -0
- package/skills/security-security-threat-model.md +82 -0
- package/skills/security-threat-model-analyst.md +76 -0
- package/skills/sysmon.md +181 -0
- package/skills/system-arch-linux-triage.md +32 -0
- package/skills/system-centos-linux-triage.md +32 -0
- package/skills/system-debian-linux-triage.md +32 -0
- package/skills/system-fedora-linux-triage.md +32 -0
- package/skills/system-geofeed-tuner.md +865 -0
- package/skills/system-iot-anomalies.md +15 -0
- package/skills/system-iot-firmware.md +16 -0
- package/skills/system-iot-fleet.md +14 -0
- package/skills/system-iot-register.md +19 -0
- package/skills/system-iot-witness-verify.md +15 -0
- package/skills/system-tmux.md +171 -0
- package/skills/system-window-management.md +228 -0
- package/skills/task-management.md +90 -0
- package/skills/tasks.md +102 -0
- package/skills/test-coverage.md +188 -0
- package/skills/ux-ui.md +128 -0
- package/skills/web.md +186 -0
- package/skills/workflow-act-on-feedback.md +15 -0
- package/skills/workflow-automate-this.md +245 -0
- package/skills/workflow-autoresearch.md +276 -0
- package/skills/workflow-coding-agent.md +317 -0
- package/skills/workflow-deep-research.md +44 -0
- package/skills/workflow-dispatching-parallel-agents.md +183 -0
- package/skills/workflow-eval-driven-dev.md +148 -0
- package/skills/workflow-executing-plans.md +71 -0
- package/skills/workflow-mentoring-juniors.md +311 -0
- package/skills/workflow-receiving-code-review.md +214 -0
- package/skills/workflow-repo-story-time.md +155 -0
- package/skills/workflow-requesting-code-review.md +104 -0
- package/skills/workflow-session-report.md +43 -0
- package/skills/workflow-structured-autonomy-generate.md +126 -0
- package/skills/workflow-subagent-driven-development.md +280 -0
- package/skills/writing.md +106 -0
- package/src/agent.js +0 -0
- package/src/browser.js +297 -0
- package/src/cli.js +25 -4
- package/src/code-reviewer.js +119 -0
- package/src/completions.js +1 -1
- package/src/control.js +222 -30
- package/src/coordinator.js +303 -0
- package/src/correction.js +29 -8
- package/src/edit-tracker.js +21 -0
- package/src/edit-viewer.js +414 -0
- package/src/endpoints.js +64 -15
- package/src/index.js +45 -11
- package/src/llm.js +86 -2
- package/src/mcp-client.js +416 -0
- package/src/memory.js +182 -0
- package/src/planner.js +216 -0
- package/src/rules.js +90 -0
- package/src/self-commands.js +757 -0
- package/src/services/voice.js +10 -7
- package/src/session-search.js +427 -0
- package/src/session.js +487 -99
- package/src/shmakk-server.js +91 -0
- package/src/skills.js +410 -3
- package/src/subagent.js +4 -1
- package/src/system-prompt.js +13 -5
- package/src/task-file.js +114 -0
- package/src/taskClassifier.js +246 -0
- package/src/team.js +752 -0
- package/src/tools.js +142 -21
- package/src/web.js +35 -5
- package/src/workflows.js +261 -0
- package/src/workspace-index.js +25 -6
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: create-architectural-decision-record
|
|
3
|
+
description: 'Create an Architectural Decision Record (ADR) document for AI-optimized decision documentation.'
|
|
4
|
+
category: dev
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Create Architectural Decision Record
|
|
8
|
+
|
|
9
|
+
Create an ADR document for `${input:DecisionTitle}` using structured formatting optimized for AI consumption and human readability.
|
|
10
|
+
|
|
11
|
+
## Inputs
|
|
12
|
+
|
|
13
|
+
- **Context**: `${input:Context}`
|
|
14
|
+
- **Decision**: `${input:Decision}`
|
|
15
|
+
- **Alternatives**: `${input:Alternatives}`
|
|
16
|
+
- **Stakeholders**: `${input:Stakeholders}`
|
|
17
|
+
|
|
18
|
+
## Input Validation
|
|
19
|
+
If any of the required inputs are not provided or cannot be determined from the conversation history, ask the user to provide the missing information before proceeding with ADR generation.
|
|
20
|
+
|
|
21
|
+
## Requirements
|
|
22
|
+
|
|
23
|
+
- Use precise, unambiguous language
|
|
24
|
+
- Follow standardized ADR format with front matter
|
|
25
|
+
- Include both positive and negative consequences
|
|
26
|
+
- Document alternatives with rejection rationale
|
|
27
|
+
- Structure for machine parsing and human reference
|
|
28
|
+
- Use coded bullet points (3-4 letter codes + 3-digit numbers) for multi-item sections
|
|
29
|
+
|
|
30
|
+
The ADR must be saved in the `/docs/adr/` directory using the naming convention: `adr-NNNN-[title-slug].md`, where NNNN is the next sequential 4-digit number (e.g., `adr-0001-database-selection.md`).
|
|
31
|
+
|
|
32
|
+
## Required Documentation Structure
|
|
33
|
+
|
|
34
|
+
The documentation file must follow the template below, ensuring that all sections are filled out appropriately. The front matter for the markdown should be structured correctly as per the example following:
|
|
35
|
+
|
|
36
|
+
```md
|
|
37
|
+
---
|
|
38
|
+
title: "ADR-NNNN: [Decision Title]"
|
|
39
|
+
status: "Proposed"
|
|
40
|
+
date: "YYYY-MM-DD"
|
|
41
|
+
authors: "[Stakeholder Names/Roles]"
|
|
42
|
+
tags: ["architecture", "decision"]
|
|
43
|
+
supersedes: ""
|
|
44
|
+
superseded_by: ""
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
# ADR-NNNN: [Decision Title]
|
|
48
|
+
|
|
49
|
+
## Status
|
|
50
|
+
|
|
51
|
+
**Proposed** | Accepted | Rejected | Superseded | Deprecated
|
|
52
|
+
|
|
53
|
+
## Context
|
|
54
|
+
|
|
55
|
+
[Problem statement, technical constraints, business requirements, and environmental factors requiring this decision.]
|
|
56
|
+
|
|
57
|
+
## Decision
|
|
58
|
+
|
|
59
|
+
[Chosen solution with clear rationale for selection.]
|
|
60
|
+
|
|
61
|
+
## Consequences
|
|
62
|
+
|
|
63
|
+
### Positive
|
|
64
|
+
|
|
65
|
+
- **POS-001**: [Beneficial outcomes and advantages]
|
|
66
|
+
- **POS-002**: [Performance, maintainability, scalability improvements]
|
|
67
|
+
- **POS-003**: [Alignment with architectural principles]
|
|
68
|
+
|
|
69
|
+
### Negative
|
|
70
|
+
|
|
71
|
+
- **NEG-001**: [Trade-offs, limitations, drawbacks]
|
|
72
|
+
- **NEG-002**: [Technical debt or complexity introduced]
|
|
73
|
+
- **NEG-003**: [Risks and future challenges]
|
|
74
|
+
|
|
75
|
+
## Alternatives Considered
|
|
76
|
+
|
|
77
|
+
### [Alternative 1 Name]
|
|
78
|
+
|
|
79
|
+
- **ALT-001**: **Description**: [Brief technical description]
|
|
80
|
+
- **ALT-002**: **Rejection Reason**: [Why this option was not selected]
|
|
81
|
+
|
|
82
|
+
### [Alternative 2 Name]
|
|
83
|
+
|
|
84
|
+
- **ALT-003**: **Description**: [Brief technical description]
|
|
85
|
+
- **ALT-004**: **Rejection Reason**: [Why this option was not selected]
|
|
86
|
+
|
|
87
|
+
## Implementation Notes
|
|
88
|
+
|
|
89
|
+
- **IMP-001**: [Key implementation considerations]
|
|
90
|
+
- **IMP-002**: [Migration or rollout strategy if applicable]
|
|
91
|
+
- **IMP-003**: [Monitoring and success criteria]
|
|
92
|
+
|
|
93
|
+
## References
|
|
94
|
+
|
|
95
|
+
- **REF-001**: [Related ADRs]
|
|
96
|
+
- **REF-002**: [External documentation]
|
|
97
|
+
- **REF-003**: [Standards or frameworks referenced]
|
|
98
|
+
```
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: create-draft-pr
|
|
3
|
+
description: Create a draft pull request for the current session. Use when the user wants to open a draft PR with the session's changes.
|
|
4
|
+
category: dev
|
|
5
|
+
---
|
|
6
|
+
<!-- Customize this skill and select save to override its behavior. Delete that copy to restore the built-in behavior. -->
|
|
7
|
+
|
|
8
|
+
# Create Draft Pull Request
|
|
9
|
+
|
|
10
|
+
Use the GitHub MCP server to create a draft pull request — do NOT use the `gh` CLI.
|
|
11
|
+
|
|
12
|
+
1. Run the compile and hygiene tasks (fixing any errors)
|
|
13
|
+
2. If there are any uncommitted changes, use the `/commit` skill to commit them
|
|
14
|
+
3. Review all changes in the current session
|
|
15
|
+
4. Write a clear, concise PR title with a short area prefix (e.g. "sessions: …", "editor: …")
|
|
16
|
+
5. Write a description covering what changed, why, and anything reviewers should know
|
|
17
|
+
6. Create the draft pull request
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: create-pr
|
|
3
|
+
description: Create a pull request for the current session. Use when the user wants to open a PR with the session's changes.
|
|
4
|
+
category: dev
|
|
5
|
+
---
|
|
6
|
+
<!-- Customize this skill and select save to override its behavior. Delete that copy to restore the built-in behavior. -->
|
|
7
|
+
|
|
8
|
+
# Create Pull Request
|
|
9
|
+
|
|
10
|
+
Use the GitHub MCP server to create a pull request — do NOT use the `gh` CLI.
|
|
11
|
+
|
|
12
|
+
1. Run the compile and hygiene tasks (fixing any errors)
|
|
13
|
+
2. If there are any uncommitted changes, use the `/commit` skill to commit them
|
|
14
|
+
3. Review all changes in the current session
|
|
15
|
+
4. Write a clear, concise PR title with a short area prefix (e.g. "sessions: …", "editor: …")
|
|
16
|
+
5. Write a description covering what changed, why, and anything reviewers should know
|
|
17
|
+
6. Create the pull request
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: create-readme
|
|
3
|
+
description: 'Create a README.md file for the project'
|
|
4
|
+
category: dev
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Role
|
|
8
|
+
|
|
9
|
+
You're a senior expert software engineer with extensive experience in open source projects. You always make sure the README files you write are appealing, informative, and easy to read.
|
|
10
|
+
|
|
11
|
+
## Task
|
|
12
|
+
|
|
13
|
+
1. Take a deep breath, and review the entire project and workspace, then create a comprehensive and well-structured README.md file for the project.
|
|
14
|
+
2. Take inspiration from these readme files for the structure, tone and content:
|
|
15
|
+
- https://raw.githubusercontent.com/Azure-Samples/serverless-chat-langchainjs/refs/heads/main/README.md
|
|
16
|
+
- https://raw.githubusercontent.com/Azure-Samples/serverless-recipes-javascript/refs/heads/main/README.md
|
|
17
|
+
- https://raw.githubusercontent.com/sinedied/run-on-output/refs/heads/main/README.md
|
|
18
|
+
- https://raw.githubusercontent.com/sinedied/smoke/refs/heads/main/README.md
|
|
19
|
+
3. Do not overuse emojis, and keep the readme concise and to the point.
|
|
20
|
+
4. Do not include sections like "LICENSE", "CONTRIBUTING", "CHANGELOG", etc. There are dedicated files for those sections.
|
|
21
|
+
5. Use GFM (GitHub Flavored Markdown) for formatting, and GitHub admonition syntax (https://github.com/orgs/community/discussions/16925) where appropriate.
|
|
22
|
+
6. If you find a logo or icon for the project, use it in the readme's header.
|
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: csharp-mstest
|
|
3
|
+
description: 'Get best practices for MSTest 3.x/4.x unit testing, including modern assertion APIs and data-driven tests'
|
|
4
|
+
category: dev
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# MSTest Best Practices (MSTest 3.x/4.x)
|
|
8
|
+
|
|
9
|
+
Your goal is to help me write effective unit tests with modern MSTest, using current APIs and best practices.
|
|
10
|
+
|
|
11
|
+
## Project Setup
|
|
12
|
+
|
|
13
|
+
- Use a separate test project with naming convention `[ProjectName].Tests`
|
|
14
|
+
- Reference MSTest 3.x+ NuGet packages (includes analyzers)
|
|
15
|
+
- Consider using MSTest.Sdk for simplified project setup
|
|
16
|
+
- Run tests with `dotnet test`
|
|
17
|
+
|
|
18
|
+
## Test Class Structure
|
|
19
|
+
|
|
20
|
+
- Use `[TestClass]` attribute for test classes
|
|
21
|
+
- **Seal test classes by default** for performance and design clarity
|
|
22
|
+
- Use `[TestMethod]` for test methods (prefer over `[DataTestMethod]`)
|
|
23
|
+
- Follow Arrange-Act-Assert (AAA) pattern
|
|
24
|
+
- Name tests using pattern `MethodName_Scenario_ExpectedBehavior`
|
|
25
|
+
|
|
26
|
+
```csharp
|
|
27
|
+
[TestClass]
|
|
28
|
+
public sealed class CalculatorTests
|
|
29
|
+
{
|
|
30
|
+
[TestMethod]
|
|
31
|
+
public void Add_TwoPositiveNumbers_ReturnsSum()
|
|
32
|
+
{
|
|
33
|
+
// Arrange
|
|
34
|
+
var calculator = new Calculator();
|
|
35
|
+
|
|
36
|
+
// Act
|
|
37
|
+
var result = calculator.Add(2, 3);
|
|
38
|
+
|
|
39
|
+
// Assert
|
|
40
|
+
Assert.AreEqual(5, result);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Test Lifecycle
|
|
46
|
+
|
|
47
|
+
- **Prefer constructors over `[TestInitialize]`** - enables `readonly` fields and follows standard C# patterns
|
|
48
|
+
- Use `[TestCleanup]` for cleanup that must run even if test fails
|
|
49
|
+
- Combine constructor with async `[TestInitialize]` when async setup is needed
|
|
50
|
+
|
|
51
|
+
```csharp
|
|
52
|
+
[TestClass]
|
|
53
|
+
public sealed class ServiceTests
|
|
54
|
+
{
|
|
55
|
+
private readonly MyService _service; // readonly enabled by constructor
|
|
56
|
+
|
|
57
|
+
public ServiceTests()
|
|
58
|
+
{
|
|
59
|
+
_service = new MyService();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
[TestInitialize]
|
|
63
|
+
public async Task InitAsync()
|
|
64
|
+
{
|
|
65
|
+
// Use for async initialization only
|
|
66
|
+
await _service.WarmupAsync();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
[TestCleanup]
|
|
70
|
+
public void Cleanup() => _service.Reset();
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Execution Order
|
|
75
|
+
|
|
76
|
+
1. **Assembly Initialization** - `[AssemblyInitialize]` (once per test assembly)
|
|
77
|
+
2. **Class Initialization** - `[ClassInitialize]` (once per test class)
|
|
78
|
+
3. **Test Initialization** (for every test method):
|
|
79
|
+
1. Constructor
|
|
80
|
+
2. Set `TestContext` property
|
|
81
|
+
3. `[TestInitialize]`
|
|
82
|
+
4. **Test Execution** - test method runs
|
|
83
|
+
5. **Test Cleanup** (for every test method):
|
|
84
|
+
1. `[TestCleanup]`
|
|
85
|
+
2. `DisposeAsync` (if implemented)
|
|
86
|
+
3. `Dispose` (if implemented)
|
|
87
|
+
6. **Class Cleanup** - `[ClassCleanup]` (once per test class)
|
|
88
|
+
7. **Assembly Cleanup** - `[AssemblyCleanup]` (once per test assembly)
|
|
89
|
+
|
|
90
|
+
## Modern Assertion APIs
|
|
91
|
+
|
|
92
|
+
MSTest provides three assertion classes: `Assert`, `StringAssert`, and `CollectionAssert`.
|
|
93
|
+
|
|
94
|
+
### Assert Class - Core Assertions
|
|
95
|
+
|
|
96
|
+
```csharp
|
|
97
|
+
// Equality
|
|
98
|
+
Assert.AreEqual(expected, actual);
|
|
99
|
+
Assert.AreNotEqual(notExpected, actual);
|
|
100
|
+
Assert.AreSame(expectedObject, actualObject); // Reference equality
|
|
101
|
+
Assert.AreNotSame(notExpectedObject, actualObject);
|
|
102
|
+
|
|
103
|
+
// Null checks
|
|
104
|
+
Assert.IsNull(value);
|
|
105
|
+
Assert.IsNotNull(value);
|
|
106
|
+
|
|
107
|
+
// Boolean
|
|
108
|
+
Assert.IsTrue(condition);
|
|
109
|
+
Assert.IsFalse(condition);
|
|
110
|
+
|
|
111
|
+
// Fail/Inconclusive
|
|
112
|
+
Assert.Fail("Test failed due to...");
|
|
113
|
+
Assert.Inconclusive("Test cannot be completed because...");
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Exception Testing (Prefer over `[ExpectedException]`)
|
|
117
|
+
|
|
118
|
+
```csharp
|
|
119
|
+
// Assert.Throws - matches TException or derived types
|
|
120
|
+
var ex = Assert.Throws<ArgumentException>(() => Method(null));
|
|
121
|
+
Assert.AreEqual("Value cannot be null.", ex.Message);
|
|
122
|
+
|
|
123
|
+
// Assert.ThrowsExactly - matches exact type only
|
|
124
|
+
var ex = Assert.ThrowsExactly<InvalidOperationException>(() => Method());
|
|
125
|
+
|
|
126
|
+
// Async versions
|
|
127
|
+
var ex = await Assert.ThrowsAsync<HttpRequestException>(async () => await client.GetAsync(url));
|
|
128
|
+
var ex = await Assert.ThrowsExactlyAsync<InvalidOperationException>(async () => await Method());
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Collection Assertions (Assert class)
|
|
132
|
+
|
|
133
|
+
```csharp
|
|
134
|
+
Assert.Contains(expectedItem, collection);
|
|
135
|
+
Assert.DoesNotContain(unexpectedItem, collection);
|
|
136
|
+
Assert.ContainsSingle(collection); // exactly one element
|
|
137
|
+
Assert.HasCount(5, collection);
|
|
138
|
+
Assert.IsEmpty(collection);
|
|
139
|
+
Assert.IsNotEmpty(collection);
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### String Assertions (Assert class)
|
|
143
|
+
|
|
144
|
+
```csharp
|
|
145
|
+
Assert.Contains("expected", actualString);
|
|
146
|
+
Assert.StartsWith("prefix", actualString);
|
|
147
|
+
Assert.EndsWith("suffix", actualString);
|
|
148
|
+
Assert.DoesNotStartWith("prefix", actualString);
|
|
149
|
+
Assert.DoesNotEndWith("suffix", actualString);
|
|
150
|
+
Assert.MatchesRegex(@"\d{3}-\d{4}", phoneNumber);
|
|
151
|
+
Assert.DoesNotMatchRegex(@"\d+", textOnly);
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Comparison Assertions
|
|
155
|
+
|
|
156
|
+
```csharp
|
|
157
|
+
Assert.IsGreaterThan(lowerBound, actual);
|
|
158
|
+
Assert.IsGreaterThanOrEqualTo(lowerBound, actual);
|
|
159
|
+
Assert.IsLessThan(upperBound, actual);
|
|
160
|
+
Assert.IsLessThanOrEqualTo(upperBound, actual);
|
|
161
|
+
Assert.IsInRange(actual, low, high);
|
|
162
|
+
Assert.IsPositive(number);
|
|
163
|
+
Assert.IsNegative(number);
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Type Assertions
|
|
167
|
+
|
|
168
|
+
```csharp
|
|
169
|
+
// MSTest 3.x - uses out parameter
|
|
170
|
+
Assert.IsInstanceOfType<MyClass>(obj, out var typed);
|
|
171
|
+
typed.DoSomething();
|
|
172
|
+
|
|
173
|
+
// MSTest 4.x - returns typed result directly
|
|
174
|
+
var typed = Assert.IsInstanceOfType<MyClass>(obj);
|
|
175
|
+
typed.DoSomething();
|
|
176
|
+
|
|
177
|
+
Assert.IsNotInstanceOfType<WrongType>(obj);
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Assert.That (MSTest 4.0+)
|
|
181
|
+
|
|
182
|
+
```csharp
|
|
183
|
+
Assert.That(result.Count > 0); // Auto-captures expression in failure message
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### StringAssert Class
|
|
187
|
+
|
|
188
|
+
> **Note:** Prefer `Assert` class equivalents when available (e.g., `Assert.Contains("expected", actual)` over `StringAssert.Contains(actual, "expected")`).
|
|
189
|
+
|
|
190
|
+
```csharp
|
|
191
|
+
StringAssert.Contains(actualString, "expected");
|
|
192
|
+
StringAssert.StartsWith(actualString, "prefix");
|
|
193
|
+
StringAssert.EndsWith(actualString, "suffix");
|
|
194
|
+
StringAssert.Matches(actualString, new Regex(@"\d{3}-\d{4}"));
|
|
195
|
+
StringAssert.DoesNotMatch(actualString, new Regex(@"\d+"));
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### CollectionAssert Class
|
|
199
|
+
|
|
200
|
+
> **Note:** Prefer `Assert` class equivalents when available (e.g., `Assert.Contains`).
|
|
201
|
+
|
|
202
|
+
```csharp
|
|
203
|
+
// Containment
|
|
204
|
+
CollectionAssert.Contains(collection, expectedItem);
|
|
205
|
+
CollectionAssert.DoesNotContain(collection, unexpectedItem);
|
|
206
|
+
|
|
207
|
+
// Equality (same elements, same order)
|
|
208
|
+
CollectionAssert.AreEqual(expectedCollection, actualCollection);
|
|
209
|
+
CollectionAssert.AreNotEqual(unexpectedCollection, actualCollection);
|
|
210
|
+
|
|
211
|
+
// Equivalence (same elements, any order)
|
|
212
|
+
CollectionAssert.AreEquivalent(expectedCollection, actualCollection);
|
|
213
|
+
CollectionAssert.AreNotEquivalent(unexpectedCollection, actualCollection);
|
|
214
|
+
|
|
215
|
+
// Subset checks
|
|
216
|
+
CollectionAssert.IsSubsetOf(subset, superset);
|
|
217
|
+
CollectionAssert.IsNotSubsetOf(notSubset, collection);
|
|
218
|
+
|
|
219
|
+
// Element validation
|
|
220
|
+
CollectionAssert.AllItemsAreInstancesOfType(collection, typeof(MyClass));
|
|
221
|
+
CollectionAssert.AllItemsAreNotNull(collection);
|
|
222
|
+
CollectionAssert.AllItemsAreUnique(collection);
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## Data-Driven Tests
|
|
226
|
+
|
|
227
|
+
### DataRow
|
|
228
|
+
|
|
229
|
+
```csharp
|
|
230
|
+
[TestMethod]
|
|
231
|
+
[DataRow(1, 2, 3)]
|
|
232
|
+
[DataRow(0, 0, 0, DisplayName = "Zeros")]
|
|
233
|
+
[DataRow(-1, 1, 0, IgnoreMessage = "Known issue #123")] // MSTest 3.8+
|
|
234
|
+
public void Add_ReturnsSum(int a, int b, int expected)
|
|
235
|
+
{
|
|
236
|
+
Assert.AreEqual(expected, Calculator.Add(a, b));
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### DynamicData
|
|
241
|
+
|
|
242
|
+
The data source can return any of the following types:
|
|
243
|
+
|
|
244
|
+
- `IEnumerable<(T1, T2, ...)>` (ValueTuple) - **preferred**, provides type safety (MSTest 3.7+)
|
|
245
|
+
- `IEnumerable<Tuple<T1, T2, ...>>` - provides type safety
|
|
246
|
+
- `IEnumerable<TestDataRow>` - provides type safety plus control over test metadata (display name, categories)
|
|
247
|
+
- `IEnumerable<object[]>` - **least preferred**, no type safety
|
|
248
|
+
|
|
249
|
+
> **Note:** When creating new test data methods, prefer `ValueTuple` or `TestDataRow` over `IEnumerable<object[]>`. The `object[]` approach provides no compile-time type checking and can lead to runtime errors from type mismatches.
|
|
250
|
+
|
|
251
|
+
```csharp
|
|
252
|
+
[TestMethod]
|
|
253
|
+
[DynamicData(nameof(TestData))]
|
|
254
|
+
public void DynamicTest(int a, int b, int expected)
|
|
255
|
+
{
|
|
256
|
+
Assert.AreEqual(expected, Calculator.Add(a, b));
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// ValueTuple - preferred (MSTest 3.7+)
|
|
260
|
+
public static IEnumerable<(int a, int b, int expected)> TestData =>
|
|
261
|
+
[
|
|
262
|
+
(1, 2, 3),
|
|
263
|
+
(0, 0, 0),
|
|
264
|
+
];
|
|
265
|
+
|
|
266
|
+
// TestDataRow - when you need custom display names or metadata
|
|
267
|
+
public static IEnumerable<TestDataRow<(int a, int b, int expected)>> TestDataWithMetadata =>
|
|
268
|
+
[
|
|
269
|
+
new((1, 2, 3)) { DisplayName = "Positive numbers" },
|
|
270
|
+
new((0, 0, 0)) { DisplayName = "Zeros" },
|
|
271
|
+
new((-1, 1, 0)) { DisplayName = "Mixed signs", IgnoreMessage = "Known issue #123" },
|
|
272
|
+
];
|
|
273
|
+
|
|
274
|
+
// IEnumerable<object[]> - avoid for new code (no type safety)
|
|
275
|
+
public static IEnumerable<object[]> LegacyTestData =>
|
|
276
|
+
[
|
|
277
|
+
[1, 2, 3],
|
|
278
|
+
[0, 0, 0],
|
|
279
|
+
];
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
## TestContext
|
|
283
|
+
|
|
284
|
+
The `TestContext` class provides test run information, cancellation support, and output methods.
|
|
285
|
+
See [TestContext documentation](https://learn.microsoft.com/dotnet/core/testing/unit-testing-mstest-writing-tests-testcontext) for complete reference.
|
|
286
|
+
|
|
287
|
+
### Accessing TestContext
|
|
288
|
+
|
|
289
|
+
```csharp
|
|
290
|
+
// Property (MSTest suppresses CS8618 - don't use nullable or = null!)
|
|
291
|
+
public TestContext TestContext { get; set; }
|
|
292
|
+
|
|
293
|
+
// Constructor injection (MSTest 3.6+) - preferred for immutability
|
|
294
|
+
[TestClass]
|
|
295
|
+
public sealed class MyTests
|
|
296
|
+
{
|
|
297
|
+
private readonly TestContext _testContext;
|
|
298
|
+
|
|
299
|
+
public MyTests(TestContext testContext)
|
|
300
|
+
{
|
|
301
|
+
_testContext = testContext;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// Static methods receive it as parameter
|
|
306
|
+
[ClassInitialize]
|
|
307
|
+
public static void ClassInit(TestContext context) { }
|
|
308
|
+
|
|
309
|
+
// Optional for cleanup methods (MSTest 3.6+)
|
|
310
|
+
[ClassCleanup]
|
|
311
|
+
public static void ClassCleanup(TestContext context) { }
|
|
312
|
+
|
|
313
|
+
[AssemblyCleanup]
|
|
314
|
+
public static void AssemblyCleanup(TestContext context) { }
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Cancellation Token
|
|
318
|
+
|
|
319
|
+
Always use `TestContext.CancellationToken` for cooperative cancellation with `[Timeout]`:
|
|
320
|
+
|
|
321
|
+
```csharp
|
|
322
|
+
[TestMethod]
|
|
323
|
+
[Timeout(5000)]
|
|
324
|
+
public async Task LongRunningTest()
|
|
325
|
+
{
|
|
326
|
+
await _httpClient.GetAsync(url, TestContext.CancellationToken);
|
|
327
|
+
}
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### Test Run Properties
|
|
331
|
+
|
|
332
|
+
```csharp
|
|
333
|
+
TestContext.TestName // Current test method name
|
|
334
|
+
TestContext.TestDisplayName // Display name (3.7+)
|
|
335
|
+
TestContext.CurrentTestOutcome // Pass/Fail/InProgress
|
|
336
|
+
TestContext.TestData // Parameterized test data (3.7+, in TestInitialize/Cleanup)
|
|
337
|
+
TestContext.TestException // Exception if test failed (3.7+, in TestCleanup)
|
|
338
|
+
TestContext.DeploymentDirectory // Directory with deployment items
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### Output and Result Files
|
|
342
|
+
|
|
343
|
+
```csharp
|
|
344
|
+
// Write to test output (useful for debugging)
|
|
345
|
+
TestContext.WriteLine("Processing item {0}", itemId);
|
|
346
|
+
|
|
347
|
+
// Attach files to test results (logs, screenshots)
|
|
348
|
+
TestContext.AddResultFile(screenshotPath);
|
|
349
|
+
|
|
350
|
+
// Store/retrieve data across test methods
|
|
351
|
+
TestContext.Properties["SharedKey"] = computedValue;
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
## Advanced Features
|
|
355
|
+
|
|
356
|
+
### Retry for Flaky Tests (MSTest 3.9+)
|
|
357
|
+
|
|
358
|
+
```csharp
|
|
359
|
+
[TestMethod]
|
|
360
|
+
[Retry(3)]
|
|
361
|
+
public void FlakyTest() { }
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### Conditional Execution (MSTest 3.10+)
|
|
365
|
+
|
|
366
|
+
Skip or run tests based on OS or CI environment:
|
|
367
|
+
|
|
368
|
+
```csharp
|
|
369
|
+
// OS-specific tests
|
|
370
|
+
[TestMethod]
|
|
371
|
+
[OSCondition(OperatingSystems.Windows)]
|
|
372
|
+
public void WindowsOnlyTest() { }
|
|
373
|
+
|
|
374
|
+
[TestMethod]
|
|
375
|
+
[OSCondition(OperatingSystems.Linux | OperatingSystems.MacOS)]
|
|
376
|
+
public void UnixOnlyTest() { }
|
|
377
|
+
|
|
378
|
+
[TestMethod]
|
|
379
|
+
[OSCondition(ConditionMode.Exclude, OperatingSystems.Windows)]
|
|
380
|
+
public void SkipOnWindowsTest() { }
|
|
381
|
+
|
|
382
|
+
// CI environment tests
|
|
383
|
+
[TestMethod]
|
|
384
|
+
[CICondition] // Runs only in CI (default: ConditionMode.Include)
|
|
385
|
+
public void CIOnlyTest() { }
|
|
386
|
+
|
|
387
|
+
[TestMethod]
|
|
388
|
+
[CICondition(ConditionMode.Exclude)] // Skips in CI, runs locally
|
|
389
|
+
public void LocalOnlyTest() { }
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### Parallelization
|
|
393
|
+
|
|
394
|
+
```csharp
|
|
395
|
+
// Assembly level
|
|
396
|
+
[assembly: Parallelize(Workers = 4, Scope = ExecutionScope.MethodLevel)]
|
|
397
|
+
|
|
398
|
+
// Disable for specific class
|
|
399
|
+
[TestClass]
|
|
400
|
+
[DoNotParallelize]
|
|
401
|
+
public sealed class SequentialTests { }
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
### Work Item Traceability (MSTest 3.8+)
|
|
405
|
+
|
|
406
|
+
Link tests to work items for traceability in test reports:
|
|
407
|
+
|
|
408
|
+
```csharp
|
|
409
|
+
// Azure DevOps work items
|
|
410
|
+
[TestMethod]
|
|
411
|
+
[WorkItem(12345)] // Links to work item #12345
|
|
412
|
+
public void Feature_Scenario_ExpectedBehavior() { }
|
|
413
|
+
|
|
414
|
+
// Multiple work items
|
|
415
|
+
[TestMethod]
|
|
416
|
+
[WorkItem(12345)]
|
|
417
|
+
[WorkItem(67890)]
|
|
418
|
+
public void Feature_CoversMultipleRequirements() { }
|
|
419
|
+
|
|
420
|
+
// GitHub issues (MSTest 3.8+)
|
|
421
|
+
[TestMethod]
|
|
422
|
+
[GitHubWorkItem("https://github.com/owner/repo/issues/42")]
|
|
423
|
+
public void BugFix_Issue42_IsResolved() { }
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
Work item associations appear in test results and can be used for:
|
|
427
|
+
- Tracing test coverage to requirements
|
|
428
|
+
- Linking bug fixes to regression tests
|
|
429
|
+
- Generating traceability reports in CI/CD pipelines
|
|
430
|
+
|
|
431
|
+
## Common Mistakes to Avoid
|
|
432
|
+
|
|
433
|
+
```csharp
|
|
434
|
+
// ❌ Wrong argument order
|
|
435
|
+
Assert.AreEqual(actual, expected);
|
|
436
|
+
// ✅ Correct
|
|
437
|
+
Assert.AreEqual(expected, actual);
|
|
438
|
+
|
|
439
|
+
// ❌ Using ExpectedException (obsolete)
|
|
440
|
+
[ExpectedException(typeof(ArgumentException))]
|
|
441
|
+
// ✅ Use Assert.Throws
|
|
442
|
+
Assert.Throws<ArgumentException>(() => Method());
|
|
443
|
+
|
|
444
|
+
// ❌ Using LINQ Single() - unclear exception
|
|
445
|
+
var item = items.Single();
|
|
446
|
+
// ✅ Use ContainsSingle - better failure message
|
|
447
|
+
var item = Assert.ContainsSingle(items);
|
|
448
|
+
|
|
449
|
+
// ❌ Hard cast - unclear exception
|
|
450
|
+
var handler = (MyHandler)result;
|
|
451
|
+
// ✅ Type assertion - shows actual type on failure
|
|
452
|
+
var handler = Assert.IsInstanceOfType<MyHandler>(result);
|
|
453
|
+
|
|
454
|
+
// ❌ Ignoring cancellation token
|
|
455
|
+
await client.GetAsync(url, CancellationToken.None);
|
|
456
|
+
// ✅ Flow test cancellation
|
|
457
|
+
await client.GetAsync(url, TestContext.CancellationToken);
|
|
458
|
+
|
|
459
|
+
// ❌ Making TestContext nullable - leads to unnecessary null checks
|
|
460
|
+
public TestContext? TestContext { get; set; }
|
|
461
|
+
// ❌ Using null! - MSTest already suppresses CS8618 for this property
|
|
462
|
+
public TestContext TestContext { get; set; } = null!;
|
|
463
|
+
// ✅ Declare without nullable or initializer - MSTest handles the warning
|
|
464
|
+
public TestContext TestContext { get; set; }
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
## Test Organization
|
|
468
|
+
|
|
469
|
+
- Group tests by feature or component
|
|
470
|
+
- Use `[TestCategory("Category")]` for filtering
|
|
471
|
+
- Use `[TestProperty("Name", "Value")]` for custom metadata (e.g., `[TestProperty("Bug", "12345")]`)
|
|
472
|
+
- Use `[Priority(1)]` for critical tests
|
|
473
|
+
- Enable relevant MSTest analyzers (MSTEST0020 for constructor preference)
|
|
474
|
+
|
|
475
|
+
## Mocking and Isolation
|
|
476
|
+
|
|
477
|
+
- Use Moq or NSubstitute for mocking dependencies
|
|
478
|
+
- Use interfaces to facilitate mocking
|
|
479
|
+
- Mock dependencies to isolate units under test
|