@ketecode/loom 0.0.0-stage → 0.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/LICENSE +21 -0
- package/README.md +616 -2
- package/agents/accessibility-reviewer/AGENT.md +70 -0
- package/agents/accessibility-reviewer/evals/triggers.json +15 -0
- package/agents/agent-evaluator/AGENT.md +74 -0
- package/agents/agent-evaluator/evals/triggers.json +15 -0
- package/agents/architect/AGENT.md +82 -0
- package/agents/architect/evals/triggers.json +17 -0
- package/agents/billing-reviewer/AGENT.md +68 -0
- package/agents/billing-reviewer/evals/triggers.json +16 -0
- package/agents/code-reviewer/AGENT.md +51 -0
- package/agents/code-reviewer/evals/behavior.json +60 -0
- package/agents/code-reviewer/evals/triggers.json +14 -0
- package/agents/code-simplifier/AGENT.md +74 -0
- package/agents/code-simplifier/evals/triggers.json +15 -0
- package/agents/cpp-build-resolver/AGENT.md +73 -0
- package/agents/cpp-build-resolver/evals/triggers.json +16 -0
- package/agents/cpp-reviewer/AGENT.md +59 -0
- package/agents/cpp-reviewer/evals/triggers.json +16 -0
- package/agents/csharp-build-resolver/AGENT.md +84 -0
- package/agents/csharp-build-resolver/evals/triggers.json +17 -0
- package/agents/csharp-reviewer/AGENT.md +88 -0
- package/agents/csharp-reviewer/evals/triggers.json +17 -0
- package/agents/dart-build-resolver/AGENT.md +80 -0
- package/agents/dart-build-resolver/evals/triggers.json +17 -0
- package/agents/dart-reviewer/AGENT.md +66 -0
- package/agents/dart-reviewer/evals/triggers.json +17 -0
- package/agents/database-reviewer/AGENT.md +72 -0
- package/agents/database-reviewer/evals/triggers.json +16 -0
- package/agents/django-reviewer/AGENT.md +61 -0
- package/agents/django-reviewer/evals/triggers.json +15 -0
- package/agents/doc-updater/AGENT.md +92 -0
- package/agents/doc-updater/evals/triggers.json +14 -0
- package/agents/e2e-runner/AGENT.md +88 -0
- package/agents/e2e-runner/evals/triggers.json +16 -0
- package/agents/fastapi-reviewer/AGENT.md +63 -0
- package/agents/fastapi-reviewer/evals/triggers.json +15 -0
- package/agents/flutter-reviewer/AGENT.md +70 -0
- package/agents/flutter-reviewer/evals/triggers.json +15 -0
- package/agents/fsharp-build-resolver/AGENT.md +81 -0
- package/agents/fsharp-build-resolver/evals/triggers.json +15 -0
- package/agents/fsharp-reviewer/AGENT.md +77 -0
- package/agents/fsharp-reviewer/evals/triggers.json +15 -0
- package/agents/go-build-resolver/AGENT.md +85 -0
- package/agents/go-build-resolver/evals/triggers.json +16 -0
- package/agents/go-reviewer/AGENT.md +66 -0
- package/agents/go-reviewer/evals/triggers.json +16 -0
- package/agents/healthcare-reviewer/AGENT.md +65 -0
- package/agents/healthcare-reviewer/evals/triggers.json +16 -0
- package/agents/i18n-reviewer/AGENT.md +64 -0
- package/agents/i18n-reviewer/evals/triggers.json +16 -0
- package/agents/inbox-triager/AGENT.md +98 -0
- package/agents/inbox-triager/evals/triggers.json +16 -0
- package/agents/infra-reviewer/AGENT.md +93 -0
- package/agents/infra-reviewer/evals/triggers.json +15 -0
- package/agents/java-build-resolver/AGENT.md +82 -0
- package/agents/java-build-resolver/evals/triggers.json +16 -0
- package/agents/java-reviewer/AGENT.md +64 -0
- package/agents/java-reviewer/evals/triggers.json +16 -0
- package/agents/kotlin-build-resolver/AGENT.md +89 -0
- package/agents/kotlin-build-resolver/evals/triggers.json +16 -0
- package/agents/kotlin-reviewer/AGENT.md +75 -0
- package/agents/kotlin-reviewer/evals/triggers.json +16 -0
- package/agents/mle-reviewer/AGENT.md +68 -0
- package/agents/mle-reviewer/evals/triggers.json +16 -0
- package/agents/network-config-reviewer/AGENT.md +68 -0
- package/agents/network-config-reviewer/evals/triggers.json +17 -0
- package/agents/payments-reviewer/AGENT.md +64 -0
- package/agents/payments-reviewer/evals/triggers.json +16 -0
- package/agents/performance-optimizer/AGENT.md +86 -0
- package/agents/performance-optimizer/evals/triggers.json +16 -0
- package/agents/perl-build-resolver/AGENT.md +84 -0
- package/agents/perl-build-resolver/evals/triggers.json +15 -0
- package/agents/perl-reviewer/AGENT.md +77 -0
- package/agents/perl-reviewer/evals/triggers.json +15 -0
- package/agents/php-build-resolver/AGENT.md +88 -0
- package/agents/php-build-resolver/evals/triggers.json +16 -0
- package/agents/php-reviewer/AGENT.md +61 -0
- package/agents/php-reviewer/evals/triggers.json +15 -0
- package/agents/planner/AGENT.md +75 -0
- package/agents/planner/evals/triggers.json +17 -0
- package/agents/pr-test-analyzer/AGENT.md +82 -0
- package/agents/pr-test-analyzer/evals/triggers.json +16 -0
- package/agents/python-build-resolver/AGENT.md +87 -0
- package/agents/python-build-resolver/evals/triggers.json +16 -0
- package/agents/python-reviewer/AGENT.md +63 -0
- package/agents/python-reviewer/evals/triggers.json +15 -0
- package/agents/rag-reviewer/AGENT.md +71 -0
- package/agents/rag-reviewer/evals/triggers.json +16 -0
- package/agents/react-reviewer/AGENT.md +70 -0
- package/agents/react-reviewer/evals/triggers.json +16 -0
- package/agents/refactor-cleaner/AGENT.md +82 -0
- package/agents/refactor-cleaner/evals/triggers.json +16 -0
- package/agents/ruby-build-resolver/AGENT.md +93 -0
- package/agents/ruby-build-resolver/evals/triggers.json +16 -0
- package/agents/ruby-reviewer/AGENT.md +62 -0
- package/agents/ruby-reviewer/evals/triggers.json +16 -0
- package/agents/rust-build-resolver/AGENT.md +98 -0
- package/agents/rust-build-resolver/evals/triggers.json +16 -0
- package/agents/rust-reviewer/AGENT.md +78 -0
- package/agents/rust-reviewer/evals/triggers.json +15 -0
- package/agents/security-reviewer/AGENT.md +84 -0
- package/agents/security-reviewer/evals/triggers.json +16 -0
- package/agents/silent-failure-hunter/AGENT.md +66 -0
- package/agents/silent-failure-hunter/evals/triggers.json +16 -0
- package/agents/solidity-reviewer/AGENT.md +70 -0
- package/agents/solidity-reviewer/evals/triggers.json +16 -0
- package/agents/spec-reviewer/AGENT.md +95 -0
- package/agents/spec-reviewer/evals/behavior.json +57 -0
- package/agents/spec-reviewer/evals/triggers.json +16 -0
- package/agents/swift-build-resolver/AGENT.md +85 -0
- package/agents/swift-build-resolver/evals/triggers.json +15 -0
- package/agents/swift-reviewer/AGENT.md +75 -0
- package/agents/swift-reviewer/evals/triggers.json +15 -0
- package/agents/task-implementer/AGENT.md +89 -0
- package/agents/task-implementer/evals/behavior.json +47 -0
- package/agents/task-implementer/evals/triggers.json +16 -0
- package/agents/typescript-build-resolver/AGENT.md +76 -0
- package/agents/typescript-build-resolver/evals/triggers.json +15 -0
- package/agents/typescript-reviewer/AGENT.md +76 -0
- package/agents/typescript-reviewer/evals/triggers.json +15 -0
- package/agents/vue-reviewer/AGENT.md +75 -0
- package/agents/vue-reviewer/evals/triggers.json +15 -0
- package/bin/kete-loom.js +723 -0
- package/commands/aside.md +19 -0
- package/commands/brainstorm.md +25 -0
- package/commands/build-fix.md +26 -0
- package/commands/campaign.md +19 -0
- package/commands/changelog.md +36 -0
- package/commands/checkpoint.md +26 -0
- package/commands/codemap.md +25 -0
- package/commands/commit.md +26 -0
- package/commands/debug.md +27 -0
- package/commands/deps-audit.md +32 -0
- package/commands/dual-review.md +34 -0
- package/commands/epic-decompose.md +21 -0
- package/commands/explain.md +37 -0
- package/commands/feature-dev.md +23 -0
- package/commands/finish-branch.md +26 -0
- package/commands/fix-bug.md +38 -0
- package/commands/hookify.md +23 -0
- package/commands/i18n-check.md +39 -0
- package/commands/issue-sync.md +22 -0
- package/commands/jira.md +19 -0
- package/commands/learn.md +23 -0
- package/commands/loom.md +21 -0
- package/commands/loop.md +20 -0
- package/commands/model-route.md +27 -0
- package/commands/onboard.md +35 -0
- package/commands/orchestrate.md +21 -0
- package/commands/plan-feature.md +36 -0
- package/commands/postmortem.md +42 -0
- package/commands/pr-describe.md +39 -0
- package/commands/pr.md +22 -0
- package/commands/prd.md +41 -0
- package/commands/production-readiness.md +45 -0
- package/commands/project-init.md +21 -0
- package/commands/refactor-clean.md +24 -0
- package/commands/resume-session.md +22 -0
- package/commands/review.md +35 -0
- package/commands/save-session.md +37 -0
- package/commands/security-scan.md +32 -0
- package/commands/sessions.md +21 -0
- package/commands/skill-create.md +21 -0
- package/commands/tdd.md +36 -0
- package/commands/test-coverage.md +24 -0
- package/commands/threat-model.md +36 -0
- package/commands/update-docs.md +25 -0
- package/commands/usage-report.md +43 -0
- package/commands/verify.md +21 -0
- package/hooks/block-dangerous-commands/HOOK.md +30 -0
- package/hooks/block-dangerous-commands/cases.json +50 -0
- package/hooks/block-dangerous-commands/hook.js +75 -0
- package/hooks/block-foreground-servers/HOOK.md +34 -0
- package/hooks/block-foreground-servers/cases.json +31 -0
- package/hooks/block-foreground-servers/hook.js +41 -0
- package/hooks/block-no-verify/HOOK.md +25 -0
- package/hooks/block-no-verify/cases.json +30 -0
- package/hooks/block-no-verify/hook.js +43 -0
- package/hooks/capture-lessons/HOOK.md +24 -0
- package/hooks/capture-lessons/hook.js +48 -0
- package/hooks/format-on-edit/HOOK.md +24 -0
- package/hooks/format-on-edit/hook.js +89 -0
- package/hooks/guard-secrets/HOOK.md +19 -0
- package/hooks/guard-secrets/cases.json +110 -0
- package/hooks/guard-secrets/hook.js +44 -0
- package/hooks/load-session-context/HOOK.md +20 -0
- package/hooks/load-session-context/hook.js +56 -0
- package/hooks/notify-on-stop/HOOK.md +25 -0
- package/hooks/notify-on-stop/hook.js +27 -0
- package/hooks/protect-files/HOOK.md +24 -0
- package/hooks/protect-files/cases.json +27 -0
- package/hooks/protect-files/hook.js +39 -0
- package/hooks/protect-lint-config/HOOK.md +29 -0
- package/hooks/protect-lint-config/cases.json +18 -0
- package/hooks/protect-lint-config/fixtures/.eslintrc.json +1 -0
- package/hooks/protect-lint-config/fixtures/.golangci.yml +1 -0
- package/hooks/protect-lint-config/fixtures/.prettierrc +1 -0
- package/hooks/protect-lint-config/fixtures/.rubocop.yml +1 -0
- package/hooks/protect-lint-config/fixtures/biome.json +1 -0
- package/hooks/protect-lint-config/fixtures/eslint.config.mjs +1 -0
- package/hooks/protect-lint-config/fixtures/ruff.toml +1 -0
- package/hooks/protect-lint-config/hook.js +25 -0
- package/hooks/read-before-edit/HOOK.md +26 -0
- package/hooks/read-before-edit/cases.json +15 -0
- package/hooks/read-before-edit/hook.js +50 -0
- package/hooks/run.js +148 -0
- package/hooks/verify-before-stop/HOOK.md +32 -0
- package/hooks/verify-before-stop/hook.js +70 -0
- package/mcp/atlassian.json +11 -0
- package/mcp/chrome-devtools.json +18 -0
- package/mcp/clickhouse.json +11 -0
- package/mcp/cloudflare.json +11 -0
- package/mcp/context7.json +11 -0
- package/mcp/exa.json +11 -0
- package/mcp/fetch.json +17 -0
- package/mcp/figma.json +11 -0
- package/mcp/firecrawl.json +11 -0
- package/mcp/git.json +17 -0
- package/mcp/github.json +11 -0
- package/mcp/linear.json +11 -0
- package/mcp/memory.json +18 -0
- package/mcp/notion.json +11 -0
- package/mcp/playwright.json +18 -0
- package/mcp/sentry.json +11 -0
- package/mcp/stripe.json +11 -0
- package/mcp/supabase.json +11 -0
- package/mcp/time.json +17 -0
- package/mcp/vercel.json +11 -0
- package/package.json +61 -4
- package/profiles.json +214 -0
- package/rules/common.md +21 -0
- package/rules/cpp.md +29 -0
- package/rules/csharp.md +25 -0
- package/rules/dart.md +29 -0
- package/rules/fsharp.md +28 -0
- package/rules/git.md +26 -0
- package/rules/go.md +29 -0
- package/rules/java.md +29 -0
- package/rules/kotlin.md +27 -0
- package/rules/perl.md +26 -0
- package/rules/php.md +28 -0
- package/rules/python.md +30 -0
- package/rules/ruby.md +27 -0
- package/rules/rust.md +26 -0
- package/rules/security.md +29 -0
- package/rules/swift.md +28 -0
- package/rules/testing.md +25 -0
- package/rules/typescript.md +29 -0
- package/rules/use-skills.md +23 -0
- package/schemas/skill-frontmatter.schema.json +52 -0
- package/scripts/lib/audit.js +96 -0
- package/scripts/lib/behavior.js +52 -0
- package/scripts/lib/frontmatter.js +65 -0
- package/scripts/lib/hooks-install.js +294 -0
- package/scripts/lib/i18n.js +51 -0
- package/scripts/lib/inventory.js +85 -0
- package/scripts/lib/lint.js +180 -0
- package/scripts/lib/mcp-install.js +288 -0
- package/scripts/lib/profiles.js +128 -0
- package/scripts/lib/render.js +92 -0
- package/scripts/lib/rules-install.js +118 -0
- package/scripts/lib/skills.js +87 -0
- package/scripts/lib/targets.js +123 -0
- package/skills/accounting-api-integration/SKILL.md +81 -0
- package/skills/accounting-api-integration/evals/triggers.json +17 -0
- package/skills/accounting-api-integration/references/quickbooks.md +48 -0
- package/skills/accounting-api-integration/references/xero.md +45 -0
- package/skills/agent-failure-debugging/SKILL.md +92 -0
- package/skills/agent-failure-debugging/evals/triggers.json +16 -0
- package/skills/agent-harness-design/SKILL.md +125 -0
- package/skills/agent-harness-design/evals/triggers.json +21 -0
- package/skills/agent-outbound-messaging/SKILL.md +92 -0
- package/skills/agent-outbound-messaging/evals/triggers.json +16 -0
- package/skills/agent-security/SKILL.md +117 -0
- package/skills/agent-security/evals/triggers.json +16 -0
- package/skills/agent-security/references/host-configs.md +37 -0
- package/skills/ai-media-generation/SKILL.md +89 -0
- package/skills/ai-media-generation/evals/triggers.json +16 -0
- package/skills/ai-media-generation/references/job-pipeline.md +76 -0
- package/skills/angular-patterns/SKILL.md +122 -0
- package/skills/angular-patterns/evals/triggers.json +16 -0
- package/skills/api-client-integration/SKILL.md +86 -0
- package/skills/api-client-integration/evals/triggers.json +16 -0
- package/skills/api-client-integration/references/resilience.md +57 -0
- package/skills/api-design/SKILL.md +96 -0
- package/skills/api-design/evals/triggers.json +18 -0
- package/skills/api-design/references/conventions.md +133 -0
- package/skills/architecture-decision-records/SKILL.md +98 -0
- package/skills/architecture-decision-records/evals/triggers.json +17 -0
- package/skills/article-writing/SKILL.md +108 -0
- package/skills/article-writing/evals/triggers.json +16 -0
- package/skills/aspnet-core-patterns/SKILL.md +149 -0
- package/skills/aspnet-core-patterns/evals/triggers.json +16 -0
- package/skills/auth-patterns/SKILL.md +104 -0
- package/skills/auth-patterns/evals/triggers.json +17 -0
- package/skills/auth-patterns/references/oauth-oidc.md +64 -0
- package/skills/autonomous-loops/SKILL.md +99 -0
- package/skills/autonomous-loops/evals/triggers.json +14 -0
- package/skills/aws-patterns/SKILL.md +91 -0
- package/skills/aws-patterns/evals/triggers.json +16 -0
- package/skills/azure-patterns/SKILL.md +86 -0
- package/skills/azure-patterns/evals/triggers.json +16 -0
- package/skills/benchmark-methodology/SKILL.md +88 -0
- package/skills/benchmark-methodology/evals/triggers.json +16 -0
- package/skills/benchmark-methodology/references/language-harnesses.md +130 -0
- package/skills/bgp-diagnostics/SKILL.md +84 -0
- package/skills/bgp-diagnostics/evals/triggers.json +18 -0
- package/skills/bgp-diagnostics/references/bgp-reference.md +81 -0
- package/skills/bioinformatics-workflows/SKILL.md +108 -0
- package/skills/bioinformatics-workflows/evals/triggers.json +16 -0
- package/skills/bioinformatics-workflows/references/commands.md +71 -0
- package/skills/bioinformatics-workflows/references/formats.md +24 -0
- package/skills/bioinformatics-workflows/references/workflow-managers.md +107 -0
- package/skills/blender-automation/SKILL.md +100 -0
- package/skills/blender-automation/evals/triggers.json +16 -0
- package/skills/blender-automation/references/batch-and-render.md +77 -0
- package/skills/blender-automation/references/bpy-inspection.md +91 -0
- package/skills/blender-automation/references/rig-and-retarget-checks.md +23 -0
- package/skills/brand-strategy/SKILL.md +83 -0
- package/skills/brand-strategy/evals/triggers.json +16 -0
- package/skills/brand-voice/SKILL.md +112 -0
- package/skills/brand-voice/evals/triggers.json +16 -0
- package/skills/browser-qa/SKILL.md +99 -0
- package/skills/browser-qa/evals/triggers.json +16 -0
- package/skills/bun-runtime/SKILL.md +93 -0
- package/skills/bun-runtime/evals/triggers.json +16 -0
- package/skills/change-impact-analysis/SKILL.md +89 -0
- package/skills/change-impact-analysis/evals/triggers.json +16 -0
- package/skills/change-impact-analysis/references/graph-commands.md +28 -0
- package/skills/cisco-ios-config/SKILL.md +101 -0
- package/skills/cisco-ios-config/evals/triggers.json +18 -0
- package/skills/cisco-ios-config/references/verification.md +63 -0
- package/skills/clickhouse-patterns/SKILL.md +101 -0
- package/skills/clickhouse-patterns/evals/triggers.json +18 -0
- package/skills/clickhouse-patterns/references/engines-and-views.md +138 -0
- package/skills/clinical-decision-support/SKILL.md +90 -0
- package/skills/clinical-decision-support/evals/triggers.json +16 -0
- package/skills/clinical-decision-support/references/cds-hooks.md +76 -0
- package/skills/clinical-decision-support/references/regulatory-boundaries.md +37 -0
- package/skills/code-tour/SKILL.md +97 -0
- package/skills/code-tour/evals/triggers.json +14 -0
- package/skills/codebase-onboarding/SKILL.md +112 -0
- package/skills/codebase-onboarding/evals/triggers.json +14 -0
- package/skills/cold-outreach-sequences/SKILL.md +90 -0
- package/skills/cold-outreach-sequences/evals/triggers.json +16 -0
- package/skills/content-repurposing/SKILL.md +82 -0
- package/skills/content-repurposing/evals/triggers.json +16 -0
- package/skills/context-budget/SKILL.md +84 -0
- package/skills/context-budget/evals/triggers.json +14 -0
- package/skills/contract-drafting/SKILL.md +96 -0
- package/skills/contract-drafting/evals/triggers.json +16 -0
- package/skills/contract-drafting/references/term-sheets.md +68 -0
- package/skills/contract-first-development/SKILL.md +86 -0
- package/skills/contract-first-development/evals/triggers.json +16 -0
- package/skills/contract-first-development/references/tooling.md +46 -0
- package/skills/conventional-commits/SKILL.md +144 -0
- package/skills/conventional-commits/evals/triggers.json +16 -0
- package/skills/cpp-patterns/SKILL.md +129 -0
- package/skills/cpp-patterns/evals/triggers.json +16 -0
- package/skills/cpp-patterns/references/cmake-and-tooling.md +88 -0
- package/skills/cpp-patterns/references/undefined-behaviour.md +75 -0
- package/skills/cpp-testing/SKILL.md +131 -0
- package/skills/cpp-testing/evals/triggers.json +16 -0
- package/skills/csharp-patterns/SKILL.md +110 -0
- package/skills/csharp-patterns/evals/triggers.json +17 -0
- package/skills/csharp-patterns/references/analyzers.md +59 -0
- package/skills/csharp-testing/SKILL.md +85 -0
- package/skills/csharp-testing/evals/triggers.json +17 -0
- package/skills/csharp-testing/references/integration-tests.md +77 -0
- package/skills/css-architecture/SKILL.md +143 -0
- package/skills/css-architecture/evals/triggers.json +16 -0
- package/skills/customs-trade-compliance/SKILL.md +95 -0
- package/skills/customs-trade-compliance/evals/triggers.json +16 -0
- package/skills/customs-trade-compliance/references/incoterms-2020.md +42 -0
- package/skills/dart-patterns/SKILL.md +157 -0
- package/skills/dart-patterns/evals/triggers.json +18 -0
- package/skills/dart-testing/SKILL.md +164 -0
- package/skills/dart-testing/evals/triggers.json +18 -0
- package/skills/data-analysis-notebooks/SKILL.md +113 -0
- package/skills/data-analysis-notebooks/evals/triggers.json +16 -0
- package/skills/data-analysis-notebooks/references/dataframe-pitfalls.md +49 -0
- package/skills/data-analysis-notebooks/references/statistics-pitfalls.md +24 -0
- package/skills/data-pipelines/SKILL.md +90 -0
- package/skills/data-pipelines/evals/triggers.json +16 -0
- package/skills/data-pipelines/references/orchestrators.md +64 -0
- package/skills/database-migrations/SKILL.md +102 -0
- package/skills/database-migrations/evals/triggers.json +16 -0
- package/skills/database-migrations/references/recipes.md +98 -0
- package/skills/database-migrations/references/tools.md +21 -0
- package/skills/dbt-patterns/SKILL.md +96 -0
- package/skills/dbt-patterns/evals/triggers.json +16 -0
- package/skills/dbt-patterns/references/yaml-examples.md +114 -0
- package/skills/decision-council/SKILL.md +98 -0
- package/skills/decision-council/evals/triggers.json +16 -0
- package/skills/deep-research/SKILL.md +107 -0
- package/skills/deep-research/evals/triggers.json +14 -0
- package/skills/dependency-audit/SKILL.md +103 -0
- package/skills/dependency-audit/evals/triggers.json +16 -0
- package/skills/dependency-audit/references/tools.md +124 -0
- package/skills/deployment-strategies/SKILL.md +108 -0
- package/skills/deployment-strategies/evals/triggers.json +16 -0
- package/skills/design-brainstorming/SKILL.md +132 -0
- package/skills/design-brainstorming/evals/behavior.json +55 -0
- package/skills/design-brainstorming/evals/triggers.json +16 -0
- package/skills/design-brainstorming/references/visual-mockups.md +34 -0
- package/skills/desktop-app-testing/SKILL.md +104 -0
- package/skills/desktop-app-testing/evals/triggers.json +16 -0
- package/skills/desktop-app-testing/references/drivers.md +81 -0
- package/skills/django-patterns/SKILL.md +123 -0
- package/skills/django-patterns/evals/triggers.json +16 -0
- package/skills/docker-patterns/SKILL.md +132 -0
- package/skills/docker-patterns/evals/triggers.json +16 -0
- package/skills/docker-patterns/references/dockerfiles.md +105 -0
- package/skills/document-processing/SKILL.md +100 -0
- package/skills/document-processing/evals/triggers.json +17 -0
- package/skills/document-processing/references/extraction-and-ocr.md +71 -0
- package/skills/document-processing/references/forms-and-conversion.md +69 -0
- package/skills/document-processing/references/redaction.md +61 -0
- package/skills/e2e-testing-playwright/SKILL.md +94 -0
- package/skills/e2e-testing-playwright/evals/triggers.json +16 -0
- package/skills/e2e-testing-playwright/references/config-and-ci.md +129 -0
- package/skills/ef-core-patterns/SKILL.md +117 -0
- package/skills/ef-core-patterns/evals/triggers.json +16 -0
- package/skills/email-deliverability/SKILL.md +99 -0
- package/skills/email-deliverability/evals/triggers.json +17 -0
- package/skills/email-deliverability/references/dns-records.md +85 -0
- package/skills/energy-procurement/SKILL.md +106 -0
- package/skills/energy-procurement/evals/triggers.json +16 -0
- package/skills/error-handling-patterns/SKILL.md +112 -0
- package/skills/error-handling-patterns/evals/triggers.json +18 -0
- package/skills/error-handling-patterns/references/language-idioms.md +49 -0
- package/skills/estimation-and-scoping/SKILL.md +97 -0
- package/skills/estimation-and-scoping/evals/triggers.json +14 -0
- package/skills/evm-dapp-integration/SKILL.md +73 -0
- package/skills/evm-dapp-integration/evals/triggers.json +16 -0
- package/skills/fastapi-patterns/SKILL.md +127 -0
- package/skills/fastapi-patterns/evals/triggers.json +16 -0
- package/skills/ffmpeg-media-processing/SKILL.md +94 -0
- package/skills/ffmpeg-media-processing/evals/triggers.json +16 -0
- package/skills/ffmpeg-media-processing/references/recipes.md +112 -0
- package/skills/fhir-integration/SKILL.md +81 -0
- package/skills/fhir-integration/evals/triggers.json +16 -0
- package/skills/fhir-integration/references/search-and-bundles.md +73 -0
- package/skills/fhir-integration/references/smart-on-fhir.md +50 -0
- package/skills/finishing-a-branch/SKILL.md +127 -0
- package/skills/finishing-a-branch/evals/behavior.json +49 -0
- package/skills/finishing-a-branch/evals/triggers.json +16 -0
- package/skills/flask-patterns/SKILL.md +132 -0
- package/skills/flask-patterns/evals/triggers.json +16 -0
- package/skills/flutter-patterns/SKILL.md +99 -0
- package/skills/flutter-patterns/evals/triggers.json +16 -0
- package/skills/flutterwave-integration/SKILL.md +75 -0
- package/skills/flutterwave-integration/evals/triggers.json +16 -0
- package/skills/flutterwave-integration/references/api.md +73 -0
- package/skills/flutterwave-integration/references/webhooks.md +49 -0
- package/skills/freight-carrier-management/SKILL.md +107 -0
- package/skills/freight-carrier-management/evals/triggers.json +16 -0
- package/skills/fsharp-patterns/SKILL.md +133 -0
- package/skills/fsharp-patterns/evals/triggers.json +16 -0
- package/skills/fsharp-testing/SKILL.md +136 -0
- package/skills/fsharp-testing/evals/triggers.json +16 -0
- package/skills/gcp-patterns/SKILL.md +86 -0
- package/skills/gcp-patterns/evals/triggers.json +16 -0
- package/skills/git-workflow/SKILL.md +114 -0
- package/skills/git-workflow/evals/triggers.json +16 -0
- package/skills/git-worktrees/SKILL.md +130 -0
- package/skills/git-worktrees/evals/behavior.json +56 -0
- package/skills/git-worktrees/evals/triggers.json +16 -0
- package/skills/github-actions-ci/SKILL.md +117 -0
- package/skills/github-actions-ci/evals/triggers.json +16 -0
- package/skills/github-api-automation/SKILL.md +101 -0
- package/skills/github-api-automation/evals/triggers.json +17 -0
- package/skills/go-patterns/SKILL.md +118 -0
- package/skills/go-patterns/evals/triggers.json +17 -0
- package/skills/go-patterns/references/concurrency.md +162 -0
- package/skills/go-testing/SKILL.md +154 -0
- package/skills/go-testing/evals/triggers.json +17 -0
- package/skills/google-workspace-integration/SKILL.md +65 -0
- package/skills/google-workspace-integration/evals/triggers.json +17 -0
- package/skills/google-workspace-integration/references/api.md +121 -0
- package/skills/harmonyos-arkts/SKILL.md +117 -0
- package/skills/harmonyos-arkts/evals/triggers.json +16 -0
- package/skills/harmonyos-arkts/references/build-errors.md +42 -0
- package/skills/hexagonal-architecture/SKILL.md +89 -0
- package/skills/hexagonal-architecture/evals/triggers.json +17 -0
- package/skills/hipaa-compliance/SKILL.md +91 -0
- package/skills/hipaa-compliance/evals/triggers.json +18 -0
- package/skills/hipaa-compliance/references/safeguards.md +68 -0
- package/skills/hl7v2-integration/SKILL.md +69 -0
- package/skills/hl7v2-integration/evals/triggers.json +16 -0
- package/skills/hl7v2-integration/references/messages-and-ack.md +78 -0
- package/skills/homelab-network-setup/SKILL.md +125 -0
- package/skills/homelab-network-setup/evals/triggers.json +18 -0
- package/skills/homelab-network-setup/references/firewall-and-dns.md +45 -0
- package/skills/homelab-network-setup/references/wireguard.md +72 -0
- package/skills/hubtel-integration/SKILL.md +77 -0
- package/skills/hubtel-integration/evals/triggers.json +16 -0
- package/skills/hubtel-integration/references/api.md +92 -0
- package/skills/i18n-localization/SKILL.md +114 -0
- package/skills/i18n-localization/evals/triggers.json +16 -0
- package/skills/i18n-localization/references/libraries.md +52 -0
- package/skills/implementation-plans/SKILL.md +117 -0
- package/skills/implementation-plans/evals/behavior.json +54 -0
- package/skills/implementation-plans/evals/triggers.json +16 -0
- package/skills/incident-postmortem/SKILL.md +118 -0
- package/skills/incident-postmortem/evals/triggers.json +14 -0
- package/skills/inventory-demand-planning/SKILL.md +89 -0
- package/skills/inventory-demand-planning/evals/triggers.json +16 -0
- package/skills/inventory-demand-planning/references/formulas.md +62 -0
- package/skills/investor-materials/SKILL.md +127 -0
- package/skills/investor-materials/evals/triggers.json +16 -0
- package/skills/investor-materials/references/templates.md +74 -0
- package/skills/invoicing-and-tax/SKILL.md +84 -0
- package/skills/invoicing-and-tax/evals/triggers.json +17 -0
- package/skills/invoicing-and-tax/references/e-invoicing.md +24 -0
- package/skills/invoicing-and-tax/references/invoice-fields.md +38 -0
- package/skills/invoicing-and-tax/references/rounding.md +26 -0
- package/skills/ios-platform-features/SKILL.md +99 -0
- package/skills/ios-platform-features/evals/triggers.json +16 -0
- package/skills/ios-platform-features/references/foundation-models.md +90 -0
- package/skills/java-patterns/SKILL.md +141 -0
- package/skills/java-patterns/evals/triggers.json +17 -0
- package/skills/java-testing/SKILL.md +142 -0
- package/skills/java-testing/evals/triggers.json +16 -0
- package/skills/jetpack-compose-patterns/SKILL.md +88 -0
- package/skills/jetpack-compose-patterns/evals/triggers.json +16 -0
- package/skills/jira-integration/SKILL.md +92 -0
- package/skills/jira-integration/evals/triggers.json +17 -0
- package/skills/jpa-hibernate/SKILL.md +92 -0
- package/skills/jpa-hibernate/evals/triggers.json +18 -0
- package/skills/jpa-hibernate/references/mapping.md +99 -0
- package/skills/jvm-sql-mappers/SKILL.md +98 -0
- package/skills/jvm-sql-mappers/evals/triggers.json +16 -0
- package/skills/jvm-sql-mappers/references/examples.md +129 -0
- package/skills/kotlin-multiplatform/SKILL.md +97 -0
- package/skills/kotlin-multiplatform/evals/triggers.json +16 -0
- package/skills/kotlin-patterns/SKILL.md +128 -0
- package/skills/kotlin-patterns/evals/triggers.json +16 -0
- package/skills/kotlin-testing/SKILL.md +117 -0
- package/skills/kotlin-testing/evals/triggers.json +16 -0
- package/skills/ktor-patterns/SKILL.md +135 -0
- package/skills/ktor-patterns/evals/triggers.json +18 -0
- package/skills/kubernetes-patterns/SKILL.md +106 -0
- package/skills/kubernetes-patterns/evals/triggers.json +16 -0
- package/skills/kubernetes-patterns/references/manifests.md +115 -0
- package/skills/laravel-patterns/SKILL.md +136 -0
- package/skills/laravel-patterns/evals/triggers.json +16 -0
- package/skills/linear-integration/SKILL.md +98 -0
- package/skills/linear-integration/evals/triggers.json +17 -0
- package/skills/literature-review/SKILL.md +109 -0
- package/skills/literature-review/evals/triggers.json +16 -0
- package/skills/literature-review/references/appraisal.md +41 -0
- package/skills/literature-review/references/search-sources.md +39 -0
- package/skills/llm-app-patterns/SKILL.md +97 -0
- package/skills/llm-app-patterns/evals/triggers.json +17 -0
- package/skills/llm-evals/SKILL.md +98 -0
- package/skills/llm-evals/evals/triggers.json +16 -0
- package/skills/llm-evals/references/graders.md +66 -0
- package/skills/logistics-exception-management/SKILL.md +90 -0
- package/skills/logistics-exception-management/evals/triggers.json +16 -0
- package/skills/manim-animations/SKILL.md +106 -0
- package/skills/manim-animations/evals/triggers.json +16 -0
- package/skills/market-research/SKILL.md +117 -0
- package/skills/market-research/evals/triggers.json +16 -0
- package/skills/marketing-campaign/SKILL.md +111 -0
- package/skills/marketing-campaign/evals/triggers.json +16 -0
- package/skills/mcp-server-patterns/SKILL.md +127 -0
- package/skills/mcp-server-patterns/evals/triggers.json +18 -0
- package/skills/mcp-server-patterns/references/protocol-notes.md +68 -0
- package/skills/metrics-dashboards/SKILL.md +113 -0
- package/skills/metrics-dashboards/evals/triggers.json +16 -0
- package/skills/ml-experiment-workflow/SKILL.md +125 -0
- package/skills/ml-experiment-workflow/evals/triggers.json +16 -0
- package/skills/mobile-accessibility/SKILL.md +94 -0
- package/skills/mobile-accessibility/evals/triggers.json +16 -0
- package/skills/mongodb-patterns/SKILL.md +115 -0
- package/skills/mongodb-patterns/evals/triggers.json +18 -0
- package/skills/mongodb-patterns/references/indexes-and-aggregation.md +94 -0
- package/skills/mpesa-daraja-integration/SKILL.md +70 -0
- package/skills/mpesa-daraja-integration/evals/triggers.json +16 -0
- package/skills/mpesa-daraja-integration/references/api.md +103 -0
- package/skills/mpesa-daraja-integration/references/callbacks.md +74 -0
- package/skills/mtn-momo-integration/SKILL.md +66 -0
- package/skills/mtn-momo-integration/evals/triggers.json +16 -0
- package/skills/mtn-momo-integration/references/api.md +153 -0
- package/skills/mtn-momo-integration/references/callbacks.md +92 -0
- package/skills/mtn-momo-integration/references/sandbox-and-go-live.md +51 -0
- package/skills/mtn-momo-integration/scripts/sandbox-setup.js +79 -0
- package/skills/mysql-patterns/SKILL.md +96 -0
- package/skills/mysql-patterns/evals/triggers.json +16 -0
- package/skills/mysql-patterns/references/explain.md +34 -0
- package/skills/mysql-patterns/references/online-ddl.md +41 -0
- package/skills/nestjs-patterns/SKILL.md +114 -0
- package/skills/nestjs-patterns/evals/triggers.json +16 -0
- package/skills/nestjs-patterns/references/testing.md +68 -0
- package/skills/network-automation/SKILL.md +107 -0
- package/skills/network-automation/evals/triggers.json +18 -0
- package/skills/network-automation/references/tool-snippets.md +153 -0
- package/skills/network-design/SKILL.md +98 -0
- package/skills/network-design/evals/triggers.json +16 -0
- package/skills/network-troubleshooting/SKILL.md +152 -0
- package/skills/network-troubleshooting/evals/triggers.json +18 -0
- package/skills/network-troubleshooting/references/commands.md +33 -0
- package/skills/nextjs-patterns/SKILL.md +150 -0
- package/skills/nextjs-patterns/evals/triggers.json +18 -0
- package/skills/nextjs-patterns/references/caching.md +87 -0
- package/skills/node-backend-patterns/SKILL.md +103 -0
- package/skills/node-backend-patterns/evals/triggers.json +16 -0
- package/skills/node-backend-patterns/references/templates.md +122 -0
- package/skills/nuxt-patterns/SKILL.md +103 -0
- package/skills/nuxt-patterns/evals/triggers.json +16 -0
- package/skills/observability/SKILL.md +125 -0
- package/skills/observability/evals/triggers.json +17 -0
- package/skills/observability/references/otel-setup.md +87 -0
- package/skills/observability/references/slo-alerts.md +70 -0
- package/skills/open-source-release/SKILL.md +107 -0
- package/skills/open-source-release/evals/triggers.json +15 -0
- package/skills/open-source-release/references/history-scrub.md +65 -0
- package/skills/parallel-agent-orchestration/SKILL.md +106 -0
- package/skills/parallel-agent-orchestration/evals/triggers.json +14 -0
- package/skills/patent-research/SKILL.md +94 -0
- package/skills/patent-research/evals/triggers.json +16 -0
- package/skills/patent-research/references/databases-and-queries.md +52 -0
- package/skills/paystack-integration/SKILL.md +59 -0
- package/skills/paystack-integration/evals/triggers.json +14 -0
- package/skills/paystack-integration/references/api.md +73 -0
- package/skills/paystack-integration/references/mobile-money.md +50 -0
- package/skills/paystack-integration/references/webhooks.md +80 -0
- package/skills/pci-dss-scope/SKILL.md +103 -0
- package/skills/pci-dss-scope/evals/triggers.json +18 -0
- package/skills/pci-dss-scope/references/saq-and-data.md +36 -0
- package/skills/perl-patterns/SKILL.md +135 -0
- package/skills/perl-patterns/evals/triggers.json +18 -0
- package/skills/perl-testing/SKILL.md +126 -0
- package/skills/perl-testing/evals/triggers.json +17 -0
- package/skills/php-patterns/SKILL.md +116 -0
- package/skills/php-patterns/evals/triggers.json +16 -0
- package/skills/php-testing/SKILL.md +123 -0
- package/skills/php-testing/evals/triggers.json +16 -0
- package/skills/postgres-patterns/SKILL.md +103 -0
- package/skills/postgres-patterns/evals/triggers.json +17 -0
- package/skills/postgres-patterns/references/explain.md +59 -0
- package/skills/postgres-patterns/references/locks.md +53 -0
- package/skills/prd-writing/SKILL.md +124 -0
- package/skills/prd-writing/evals/triggers.json +15 -0
- package/skills/prisma-patterns/SKILL.md +83 -0
- package/skills/prisma-patterns/evals/triggers.json +18 -0
- package/skills/prisma-patterns/references/prisma-8.md +46 -0
- package/skills/prisma-patterns/references/workflow.md +50 -0
- package/skills/privacy-compliance/SKILL.md +121 -0
- package/skills/privacy-compliance/evals/triggers.json +18 -0
- package/skills/privacy-compliance/references/jurisdictions.md +51 -0
- package/skills/production-scheduling/SKILL.md +98 -0
- package/skills/production-scheduling/evals/triggers.json +16 -0
- package/skills/prompt-engineering/SKILL.md +92 -0
- package/skills/prompt-engineering/evals/triggers.json +16 -0
- package/skills/prospect-research/SKILL.md +87 -0
- package/skills/prospect-research/evals/triggers.json +16 -0
- package/skills/python-app-distribution/SKILL.md +107 -0
- package/skills/python-app-distribution/evals/triggers.json +16 -0
- package/skills/python-app-distribution/references/pypi-trusted-publishing.md +55 -0
- package/skills/python-app-distribution/references/windows-macos-signing.md +70 -0
- package/skills/python-patterns/SKILL.md +107 -0
- package/skills/python-patterns/evals/triggers.json +16 -0
- package/skills/python-patterns/references/tooling.md +101 -0
- package/skills/python-testing/SKILL.md +126 -0
- package/skills/python-testing/evals/triggers.json +16 -0
- package/skills/python-testing/references/mocking.md +71 -0
- package/skills/pytorch-patterns/SKILL.md +139 -0
- package/skills/pytorch-patterns/evals/triggers.json +16 -0
- package/skills/pytorch-patterns/references/debugging.md +39 -0
- package/skills/quality-nonconformance/SKILL.md +107 -0
- package/skills/quality-nonconformance/evals/triggers.json +16 -0
- package/skills/quality-nonconformance/references/8d-and-capa.md +46 -0
- package/skills/quarkus-patterns/SKILL.md +93 -0
- package/skills/quarkus-patterns/evals/triggers.json +18 -0
- package/skills/rag-pipeline-patterns/SKILL.md +117 -0
- package/skills/rag-pipeline-patterns/evals/triggers.json +18 -0
- package/skills/rag-pipeline-patterns/references/evaluation.md +37 -0
- package/skills/rag-pipeline-patterns/references/retrieval-recipes.md +78 -0
- package/skills/rails-patterns/SKILL.md +132 -0
- package/skills/rails-patterns/evals/triggers.json +16 -0
- package/skills/react-native-patterns/SKILL.md +101 -0
- package/skills/react-native-patterns/evals/triggers.json +16 -0
- package/skills/react-patterns/SKILL.md +140 -0
- package/skills/react-patterns/evals/triggers.json +18 -0
- package/skills/react-performance/SKILL.md +107 -0
- package/skills/react-performance/evals/triggers.json +18 -0
- package/skills/react-testing/SKILL.md +121 -0
- package/skills/react-testing/evals/triggers.json +18 -0
- package/skills/react-testing/references/msw.md +64 -0
- package/skills/react-testing/references/queries.md +41 -0
- package/skills/react-testing/references/setup.md +74 -0
- package/skills/recommender-systems/SKILL.md +119 -0
- package/skills/recommender-systems/evals/triggers.json +16 -0
- package/skills/recommender-systems/references/evaluation.md +39 -0
- package/skills/redis-patterns/SKILL.md +109 -0
- package/skills/redis-patterns/evals/triggers.json +18 -0
- package/skills/redis-patterns/references/operations.md +61 -0
- package/skills/refactoring-safely/SKILL.md +107 -0
- package/skills/refactoring-safely/evals/behavior.json +57 -0
- package/skills/refactoring-safely/evals/triggers.json +17 -0
- package/skills/release-management/SKILL.md +141 -0
- package/skills/release-management/evals/triggers.json +16 -0
- package/skills/remotion-video/SKILL.md +91 -0
- package/skills/remotion-video/evals/triggers.json +16 -0
- package/skills/remotion-video/references/lambda.md +66 -0
- package/skills/reproducible-dev-environments/SKILL.md +132 -0
- package/skills/reproducible-dev-environments/evals/triggers.json +16 -0
- package/skills/responding-to-code-review/SKILL.md +124 -0
- package/skills/responding-to-code-review/evals/behavior.json +54 -0
- package/skills/responding-to-code-review/evals/triggers.json +16 -0
- package/skills/returns-reverse-logistics/SKILL.md +97 -0
- package/skills/returns-reverse-logistics/evals/triggers.json +16 -0
- package/skills/ruby-patterns/SKILL.md +127 -0
- package/skills/ruby-patterns/evals/triggers.json +18 -0
- package/skills/ruby-testing/SKILL.md +113 -0
- package/skills/ruby-testing/evals/triggers.json +18 -0
- package/skills/runbook-writing/SKILL.md +101 -0
- package/skills/runbook-writing/evals/triggers.json +14 -0
- package/skills/rust-patterns/SKILL.md +118 -0
- package/skills/rust-patterns/evals/triggers.json +16 -0
- package/skills/rust-patterns/references/cargo-and-clippy.md +105 -0
- package/skills/rust-patterns/references/errors-and-traits.md +97 -0
- package/skills/rust-testing/SKILL.md +148 -0
- package/skills/rust-testing/evals/triggers.json +16 -0
- package/skills/rust-testing/references/fakes-proptest-async.md +113 -0
- package/skills/search-first/SKILL.md +73 -0
- package/skills/search-first/evals/triggers.json +14 -0
- package/skills/security-review/SKILL.md +58 -0
- package/skills/security-review/evals/behavior.json +56 -0
- package/skills/security-review/evals/triggers.json +14 -0
- package/skills/security-review/references/checklist.md +54 -0
- package/skills/security-review/scripts/scan-secrets.js +79 -0
- package/skills/seo-audit/SKILL.md +111 -0
- package/skills/seo-audit/evals/triggers.json +16 -0
- package/skills/seo-audit/references/checks.md +65 -0
- package/skills/session-handoff/SKILL.md +101 -0
- package/skills/session-handoff/evals/behavior.json +55 -0
- package/skills/session-handoff/evals/triggers.json +14 -0
- package/skills/skill-authoring/SKILL.md +98 -0
- package/skills/skill-authoring/evals/triggers.json +15 -0
- package/skills/skill-authoring/references/frontmatter.md +40 -0
- package/skills/skill-authoring/references/pressure-testing.md +87 -0
- package/skills/slack-app-integration/SKILL.md +108 -0
- package/skills/slack-app-integration/evals/triggers.json +17 -0
- package/skills/slide-decks/SKILL.md +107 -0
- package/skills/slide-decks/evals/triggers.json +18 -0
- package/skills/slide-decks/references/html-decks.md +86 -0
- package/skills/slide-decks/references/layouts.md +45 -0
- package/skills/slide-decks/references/pptx.md +87 -0
- package/skills/smart-contract-security/SKILL.md +110 -0
- package/skills/smart-contract-security/evals/triggers.json +16 -0
- package/skills/smart-contract-security/references/vulnerability-checklist.md +79 -0
- package/skills/social-media-publishing/SKILL.md +84 -0
- package/skills/social-media-publishing/evals/triggers.json +17 -0
- package/skills/social-media-publishing/references/platform-apis.md +116 -0
- package/skills/solidity-patterns/SKILL.md +95 -0
- package/skills/solidity-patterns/evals/triggers.json +16 -0
- package/skills/spring-boot-patterns/SKILL.md +128 -0
- package/skills/spring-boot-patterns/evals/triggers.json +18 -0
- package/skills/spring-boot-patterns/references/testing.md +72 -0
- package/skills/stripe-integration/SKILL.md +69 -0
- package/skills/stripe-integration/evals/triggers.json +16 -0
- package/skills/stripe-integration/references/api.md +71 -0
- package/skills/stripe-integration/references/billing.md +58 -0
- package/skills/stripe-integration/references/webhooks.md +76 -0
- package/skills/subagent-driven-development/SKILL.md +109 -0
- package/skills/subagent-driven-development/evals/behavior.json +53 -0
- package/skills/subagent-driven-development/evals/triggers.json +15 -0
- package/skills/subagent-driven-development/references/implementer-brief.md +60 -0
- package/skills/subagent-driven-development/references/reviewer-briefs.md +52 -0
- package/skills/subscription-billing-ops/SKILL.md +118 -0
- package/skills/subscription-billing-ops/evals/triggers.json +17 -0
- package/skills/subscription-billing-ops/references/proration.md +47 -0
- package/skills/subscription-billing-ops/references/revenue-metrics.md +38 -0
- package/skills/svelte-patterns/SKILL.md +122 -0
- package/skills/svelte-patterns/evals/triggers.json +16 -0
- package/skills/swift-patterns/SKILL.md +113 -0
- package/skills/swift-patterns/evals/triggers.json +16 -0
- package/skills/swift-patterns/references/concurrency-migration.md +40 -0
- package/skills/swift-testing/SKILL.md +121 -0
- package/skills/swift-testing/evals/triggers.json +16 -0
- package/skills/swift-testing/references/swift-testing-cheatsheet.md +81 -0
- package/skills/swiftui-patterns/SKILL.md +102 -0
- package/skills/swiftui-patterns/evals/triggers.json +16 -0
- package/skills/systematic-debugging/SKILL.md +92 -0
- package/skills/systematic-debugging/evals/behavior.json +59 -0
- package/skills/systematic-debugging/evals/triggers.json +16 -0
- package/skills/systematic-debugging/references/condition-waiting.md +52 -0
- package/skills/systematic-debugging/references/root-cause-tracing.md +49 -0
- package/skills/systematic-debugging/references/test-pollution.md +46 -0
- package/skills/tdd-workflow/SKILL.md +69 -0
- package/skills/tdd-workflow/evals/behavior.json +55 -0
- package/skills/tdd-workflow/evals/triggers.json +15 -0
- package/skills/tdd-workflow/references/testing-anti-patterns.md +87 -0
- package/skills/technical-writing/SKILL.md +95 -0
- package/skills/technical-writing/evals/triggers.json +14 -0
- package/skills/terraform-patterns/SKILL.md +122 -0
- package/skills/terraform-patterns/evals/triggers.json +16 -0
- package/skills/terraform-patterns/references/backends.md +67 -0
- package/skills/test-coverage-improvement/SKILL.md +107 -0
- package/skills/test-coverage-improvement/evals/triggers.json +16 -0
- package/skills/threat-modeling/SKILL.md +113 -0
- package/skills/threat-modeling/evals/triggers.json +16 -0
- package/skills/transactional-email/SKILL.md +68 -0
- package/skills/transactional-email/evals/triggers.json +17 -0
- package/skills/transactional-email/references/providers.md +63 -0
- package/skills/typescript-patterns/SKILL.md +122 -0
- package/skills/typescript-patterns/evals/triggers.json +16 -0
- package/skills/typescript-testing/SKILL.md +101 -0
- package/skills/typescript-testing/evals/triggers.json +16 -0
- package/skills/ui-demo-recording/SKILL.md +93 -0
- package/skills/ui-demo-recording/evals/triggers.json +16 -0
- package/skills/ui-demo-recording/references/cursor-and-captions.md +48 -0
- package/skills/ui-demo-recording/references/playwright-recording.md +63 -0
- package/skills/ui-demo-recording/references/post-processing.md +57 -0
- package/skills/ui-design-polish/SKILL.md +113 -0
- package/skills/ui-design-polish/evals/triggers.json +18 -0
- package/skills/ui-design-polish/references/detail-checklist.md +45 -0
- package/skills/ui-design-polish/references/tokens.md +68 -0
- package/skills/ui-flow-audit/SKILL.md +112 -0
- package/skills/ui-flow-audit/evals/triggers.json +17 -0
- package/skills/ui-motion/SKILL.md +103 -0
- package/skills/ui-motion/evals/triggers.json +18 -0
- package/skills/ui-motion/references/patterns.md +138 -0
- package/skills/ui-motion/references/tokens.md +52 -0
- package/skills/unicode-text-processing/SKILL.md +103 -0
- package/skills/unicode-text-processing/evals/triggers.json +17 -0
- package/skills/unicode-text-processing/references/apis.md +89 -0
- package/skills/unicode-text-processing/references/script-notes.md +50 -0
- package/skills/verification-loop/SKILL.md +70 -0
- package/skills/verification-loop/evals/behavior.json +52 -0
- package/skills/verification-loop/evals/triggers.json +14 -0
- package/skills/verification-loop/scripts/detect-checks.js +102 -0
- package/skills/video-editing/SKILL.md +111 -0
- package/skills/video-editing/evals/triggers.json +16 -0
- package/skills/video-editing/references/edl-and-logging.md +44 -0
- package/skills/video-editing/references/ffmpeg-edit-recipes.md +92 -0
- package/skills/video-editing/references/resolve-scripting.md +53 -0
- package/skills/vite-patterns/SKILL.md +117 -0
- package/skills/vite-patterns/evals/triggers.json +16 -0
- package/skills/vue-patterns/SKILL.md +104 -0
- package/skills/vue-patterns/evals/triggers.json +16 -0
- package/skills/web-accessibility/SKILL.md +119 -0
- package/skills/web-accessibility/evals/triggers.json +16 -0
- package/skills/web-performance/SKILL.md +107 -0
- package/skills/web-performance/evals/triggers.json +16 -0
- package/skills/web-scraping/SKILL.md +80 -0
- package/skills/web-scraping/evals/triggers.json +16 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: swiftui-patterns
|
|
3
|
+
description: SwiftUI view design built on structural identity, with property-wrapper choices (@State, @Binding, @Observable models with @Bindable, @Environment), NavigationStack and value-based navigation paths, one-way data flow, keeping body cheap to avoid excess view updates, #Preview setups with sample data, and UIKit interop through UIViewRepresentable and UIHostingController. Use when building or restructuring SwiftUI screens, deciding which property wrapper owns a piece of state, migrating from ObservableObject to @Observable, fixing views that reset or redraw too often, or embedding UIKit in SwiftUI or the reverse.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Needs Xcode on macOS for building, previews and tests (xcodebuild). @Observable and @Bindable need iOS 17 / macOS 14 or newer.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: coding
|
|
9
|
+
kete-loom/risk: runs-commands
|
|
10
|
+
kete-loom/requires: "xcodebuild"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# SwiftUI patterns
|
|
15
|
+
|
|
16
|
+
Write SwiftUI where each piece of state has one owner, view identity is stable, and `body` is cheap. Swift language features, actors and Swift 6 concurrency belong to `swift-patterns`; XCTest and Swift Testing belong to `swift-testing`.
|
|
17
|
+
|
|
18
|
+
## 0. Before you write
|
|
19
|
+
|
|
20
|
+
1. Find the deployment target (project settings or `Package.swift` `platforms:`). It decides the APIs you may use:
|
|
21
|
+
- iOS 16+: `NavigationStack`, `NavigationSplitView`, `navigationDestination`.
|
|
22
|
+
- iOS 17+: `@Observable`, `@Bindable`, `@Environment(Model.self)`.
|
|
23
|
+
- Below that: `ObservableObject`, `@StateObject`, `NavigationView`. Use `if #available` only for small additions.
|
|
24
|
+
2. See whether the project uses `ObservableObject` or `@Observable` today. Don't mix both styles in one feature.
|
|
25
|
+
3. Build once (`xcodebuild ... build` or the project's script) and record the result.
|
|
26
|
+
|
|
27
|
+
## 1. Which property wrapper
|
|
28
|
+
|
|
29
|
+
| The view... | Use |
|
|
30
|
+
|---|---|
|
|
31
|
+
| Owns a simple value (toggle, text, selection) | `@State private var` |
|
|
32
|
+
| Owns a reference-type model it creates | `@State private var model = Model()` with an `@Observable` class (iOS 17+), or `@StateObject` for `ObservableObject` |
|
|
33
|
+
| Edits a value owned by a parent | `@Binding` |
|
|
34
|
+
| Receives an `@Observable` model and needs bindings to its properties | `@Bindable var model` |
|
|
35
|
+
| Receives an `@Observable` model and only reads it | a plain `let` / `var` property |
|
|
36
|
+
| Reads app-wide values or injected models | `@Environment(\.key)` or `@Environment(Model.self)` |
|
|
37
|
+
| Receives an `ObservableObject` it doesn't own | `@ObservedObject` |
|
|
38
|
+
|
|
39
|
+
Rules:
|
|
40
|
+
|
|
41
|
+
- `@State` and `@StateObject` are always `private` and initialised in the view that owns them. Never pass an owned value into a child's `@State`; the child keeps its first copy and ignores later changes.
|
|
42
|
+
- Never create an `ObservableObject` with `@ObservedObject var model = Model()`; it is recreated on every parent update.
|
|
43
|
+
- Keep models `@MainActor` when they drive UI.
|
|
44
|
+
- Migrating to `@Observable`: drop `@Published`, replace `@StateObject` with `@State`, `@EnvironmentObject` with `@Environment(Model.self)` (and `.environmentObject(model)` with `.environment(model)` at the injection site), and use `@Bindable` where you need `$model.property`.
|
|
45
|
+
|
|
46
|
+
## 2. View identity
|
|
47
|
+
|
|
48
|
+
SwiftUI tracks views by their position in the hierarchy (structural identity) or by explicit `.id` / `ForEach` IDs. When identity changes, state is destroyed and transitions run.
|
|
49
|
+
|
|
50
|
+
- Prefer modifiers over branches: `.opacity(isHidden ? 0 : 1)` keeps identity; `if isHidden { } else { }` swaps two different views and resets their state.
|
|
51
|
+
- `ForEach` needs stable, unique IDs from the data (`Identifiable` with a real ID). Never use `\.self` on non-unique values or array indices on mutable arrays.
|
|
52
|
+
- Use `.id(value)` deliberately to reset a view (for example a form when the edited record changes), never as a "force refresh" hack.
|
|
53
|
+
- Avoid `AnyView` in hot paths; it hides identity and costs diffing. Use `@ViewBuilder` and `some View`.
|
|
54
|
+
|
|
55
|
+
## 3. Navigation
|
|
56
|
+
|
|
57
|
+
- Use `NavigationStack(path:)` with a `@State` path (`NavigationPath` or `[Route]` of a `Hashable` enum) when the app navigates programmatically or restores state.
|
|
58
|
+
- Register destinations with `.navigationDestination(for: Route.self)` once, near the stack root, not inside lazy containers.
|
|
59
|
+
- Push by appending a value; pop by removing from the path. Pass IDs or small values, and load the model at the destination.
|
|
60
|
+
- Use `NavigationSplitView` for sidebar layouts on iPad and Mac.
|
|
61
|
+
- Present sheets with `.sheet(item:)` bound to optional state so the content gets the right value; avoid `.sheet(isPresented:)` plus a separate selected-item variable.
|
|
62
|
+
- Deep links: handle `.onOpenURL` once and translate the URL into a path.
|
|
63
|
+
|
|
64
|
+
## 4. Data flow
|
|
65
|
+
|
|
66
|
+
- Data flows down as values or models; events flow up through bindings or closures.
|
|
67
|
+
- Side effects belong in `.task { }` (cancelled automatically when the view disappears) or `.task(id:)` for work tied to a changing value. Don't start work in `init` or in `body`.
|
|
68
|
+
- Long work and networking go in the model or a service, not the view. Update observable state on the main actor.
|
|
69
|
+
- Keep one source of truth. Never copy a model's value into local `@State` "for editing" without a clear commit/cancel step.
|
|
70
|
+
|
|
71
|
+
## 5. Performance
|
|
72
|
+
|
|
73
|
+
- `body` runs often; keep it pure and cheap. No formatting objects created per call, sorting, filtering big arrays or I/O in `body`. Compute in the model or cache.
|
|
74
|
+
- Split big views into small subviews so a change only re-evaluates the part that reads it. With `@Observable`, a view updates only when properties it reads change.
|
|
75
|
+
- Use `LazyVStack`, `LazyHStack`, `LazyVGrid` or `List` for long content, not `VStack` in a `ScrollView`.
|
|
76
|
+
- Profile with Instruments (the SwiftUI and Time Profiler instruments) on a device in Release. `Self._printChanges()` inside `body` (debug only, remove before committing) shows why a view updated.
|
|
77
|
+
- Load images at display size; use `AsyncImage` only for simple cases and cache elsewhere when lists are long.
|
|
78
|
+
|
|
79
|
+
## 6. Previews
|
|
80
|
+
|
|
81
|
+
- Give every screen a `#Preview` (Xcode 15+; `PreviewProvider` on older Xcode) with in-memory sample data: no network, no real database.
|
|
82
|
+
- Inject dependencies through initialisers or the environment so previews can pass fakes.
|
|
83
|
+
- Add previews for empty, loading, error and long-text states, plus dark mode and a large Dynamic Type size.
|
|
84
|
+
|
|
85
|
+
## 7. UIKit interop
|
|
86
|
+
|
|
87
|
+
- UIKit view inside SwiftUI: `UIViewRepresentable` (or `UIViewControllerRepresentable`). Create the view in `makeUIView`, apply state in `updateUIView` (it runs often: compare before mutating), and use a `Coordinator` for delegates and target-action.
|
|
88
|
+
- SwiftUI inside UIKit: `UIHostingController(rootView:)`, added as a child view controller with `addChild` and `didMove(toParent:)`. Pass a model, not a snapshot, so updates flow.
|
|
89
|
+
- Don't keep strong references from the coordinator back to the representable's parent; use the values passed in `updateUIView`.
|
|
90
|
+
|
|
91
|
+
**Stop and ask the user** before raising the deployment target, or before migrating a whole feature from `ObservableObject` to `@Observable` when only a small change was requested.
|
|
92
|
+
|
|
93
|
+
## Never
|
|
94
|
+
|
|
95
|
+
- Never initialise `@State` from a parent's value expecting it to stay in sync.
|
|
96
|
+
- Never do work in `body` or a view's `init`.
|
|
97
|
+
- Never use array indices as `ForEach` IDs for data that changes.
|
|
98
|
+
- Never leave `Self._printChanges()` in committed code.
|
|
99
|
+
|
|
100
|
+
## Report back
|
|
101
|
+
|
|
102
|
+
End with: views and models changed, which wrapper owns each new piece of state, the build and test commands with results, and the OS versions or simulators you ran on.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Should this SwiftUI child view use @State, @Binding or @Bindable for the user model?",
|
|
4
|
+
"Migrate our view models from ObservableObject and @Published to the @Observable macro",
|
|
5
|
+
"Set up a NavigationStack with a path so I can pop to root after checkout",
|
|
6
|
+
"My SwiftUI form resets its text fields whenever the parent list refreshes",
|
|
7
|
+
"Wrap an MKMapView in UIViewRepresentable with a coordinator for the delegate"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Make this Swift networking layer Sendable for Swift 6 strict concurrency",
|
|
11
|
+
"Write XCTest unit tests for the payment view model",
|
|
12
|
+
"My Jetpack Compose screen recomposes on every keystroke",
|
|
13
|
+
"Fix the swift build error about ambiguous use of init in the package",
|
|
14
|
+
"Share the login logic between Android and iOS with Kotlin Multiplatform"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: systematic-debugging
|
|
3
|
+
description: Root-cause investigation for any bug, failing test, crash or surprising behaviour, done before a single fix is proposed. Reproduces the problem reliably, reads the whole error, checks what changed recently, traces the bad value backwards through the call chain to where it was born, tests one hypothesis at a time with the smallest experiment, instruments component boundaries, bisects polluting tests and git history, swaps sleeps for condition waits in flaky async tests, then fixes at the source with a regression test and guards on every layer the bad data crossed. Use when something is broken or behaving unexpectedly and the cause is not yet proven, especially after a quick fix has already failed.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Needs git and the project's test runner.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: coding
|
|
9
|
+
kete-loom/risk: runs-commands
|
|
10
|
+
kete-loom/requires: "git"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Systematic debugging
|
|
15
|
+
|
|
16
|
+
No fix until the cause is proven. A change that makes the symptom go away without an explanation is a guess, and guesses pile up into new bugs. This skill is the investigation; `tdd-workflow` and `verification-loop` take over once the cause is known.
|
|
17
|
+
|
|
18
|
+
Use it for test failures, production bugs, build breaks, wrong output, performance cliffs and integration failures. Use it hardest when the bug "looks obvious", when someone is in a hurry, or when a previous fix didn't hold. (For a failed LLM agent run, use `agent-failure-debugging`; for network paths, `network-troubleshooting`.)
|
|
19
|
+
|
|
20
|
+
## 1. Collect the facts
|
|
21
|
+
|
|
22
|
+
1. **Read the entire error.** Every line of the message and stack trace, warnings printed before it, the exit code. Note file paths, line numbers and error codes. The answer is often already printed.
|
|
23
|
+
2. **Reproduce it.** Find the exact command, input and environment that trigger it. Run it at least twice. Record how often it fails (every run, 1 in 10, only in CI).
|
|
24
|
+
- If you can't reproduce it, don't guess. Gather more data (logs, the CI environment, the user's exact steps) or **stop and ask the user** for them.
|
|
25
|
+
3. **Check what changed.** `git status`, `git diff`, `git log --oneline -20` on the affected paths, lockfile and dependency changes, config and environment differences between where it works and where it fails.
|
|
26
|
+
4. **Find a working twin.** Search the codebase for similar code that works. List every difference between the working and broken versions, however small. Don't dismiss a difference as "can't matter" before testing it.
|
|
27
|
+
|
|
28
|
+
## 2. Locate where it goes wrong
|
|
29
|
+
|
|
30
|
+
- **Deep in a call stack?** Trace the bad value backwards: what produced it, who called that with it, and onward until you reach the place it was first wrong. Fix there, not where it crashed. Method and instrumentation tips in `references/root-cause-tracing.md`.
|
|
31
|
+
- **Several components (CI → build → deploy, API → service → database, client → queue → worker)?** Add temporary logging at each boundary: what goes in, what comes out, which config and environment values are visible. Run once and read where the data stops being right. Then dig into that one component.
|
|
32
|
+
- **A file, row or global appears and you don't know which test made it, or a test passes alone but fails in the suite?** Bisect the tests; see `references/test-pollution.md`.
|
|
33
|
+
- **It worked last week?** Bisect history with `git bisect start <bad> <good>` and `git bisect run <script>`. Keep the reproduction script outside the tracked tree, since older commits don't have it. See `references/test-pollution.md`.
|
|
34
|
+
- **Fails only sometimes, under load or in CI, around async code?** Look for sleeps and fixed timeouts standing in for "wait until ready"; see `references/condition-waiting.md`.
|
|
35
|
+
|
|
36
|
+
## 3. One hypothesis at a time
|
|
37
|
+
|
|
38
|
+
1. Write the hypothesis down: "The cause is X, because evidence Y." Be specific enough that it could be wrong.
|
|
39
|
+
2. Design the smallest experiment that would disprove it: one log line, one changed input, one reverted line. Change one variable only.
|
|
40
|
+
3. Run it and read the result.
|
|
41
|
+
- Confirmed: go to step 4.
|
|
42
|
+
- Refuted: undo the experiment completely, record what you learned, form a new hypothesis. Never stack a second change on top of a failed one.
|
|
43
|
+
4. When you don't know, say "I don't understand X yet" and go collect more facts. Don't present a theory as a finding.
|
|
44
|
+
|
|
45
|
+
## 4. Fix at the source
|
|
46
|
+
|
|
47
|
+
1. **Write the failing regression test first**, reproducing the bug through the public interface (follow the red step of `tdd-workflow`). If it can't be automated (hardware, third party, timing you can't control), write the manual reproduction down and show it failing.
|
|
48
|
+
2. **Make one change** that addresses the proven cause. No refactors, renames or "while I'm here" edits in the same change.
|
|
49
|
+
3. **Guard the path.** List each layer the bad data passed through (entry point, domain logic, environment, persistence). Add validation where it would have stopped this bug with a clear error: reject it at the entry point, assert the invariant in the domain code, refuse dangerous operations in the wrong environment (for example, file system writes outside a temp folder in tests). Keep each guard small and test the important ones.
|
|
50
|
+
4. **Verify.** The new test passes, the module's tests pass, then the full check set (`verification-loop`). Remove every temporary log line and debug flag.
|
|
51
|
+
|
|
52
|
+
## 5. The three-strike rule
|
|
53
|
+
|
|
54
|
+
Count your fix attempts. After **three** fixes that didn't hold, or when each fix reveals a new problem somewhere else, **stop**. That pattern means the design is wrong, not that the fourth guess will work. Report to the user:
|
|
55
|
+
|
|
56
|
+
- what you tried and what each attempt showed,
|
|
57
|
+
- the shared state, coupling or assumption that keeps biting,
|
|
58
|
+
- two options: keep patching (and what that costs) or change the structure (with `refactoring-safely`, or the `architect` agent for a bigger rethink).
|
|
59
|
+
|
|
60
|
+
Wait for the user's decision before attempt four.
|
|
61
|
+
|
|
62
|
+
## Stop signals
|
|
63
|
+
|
|
64
|
+
Stop and return to step 1 if you catch yourself:
|
|
65
|
+
|
|
66
|
+
- proposing a fix before you can name the line where the value first goes wrong,
|
|
67
|
+
- changing several things at once "to see if it helps",
|
|
68
|
+
- adding a retry, a sleep, a `try/except: pass` or a null check at the crash site to make the symptom disappear,
|
|
69
|
+
- skipping the regression test because you'll "check it by hand",
|
|
70
|
+
- saying "it's probably X" with no experiment behind it.
|
|
71
|
+
|
|
72
|
+
When the user says "stop guessing", "did you check that?" or "we're going in circles", treat it the same way.
|
|
73
|
+
|
|
74
|
+
## Never
|
|
75
|
+
|
|
76
|
+
- Never weaken, skip or delete a test to get green. If a test is wrong, show why and get agreement.
|
|
77
|
+
- Never leave instrumentation, debug flags or bisect state behind (`git bisect reset` when done).
|
|
78
|
+
- Never declare a bug environmental or "just flaky" without evidence. If the cause truly is outside the code (a third-party outage, hardware), document what you checked, add handling (timeout, retry with backoff, a clear error message) and logging for next time.
|
|
79
|
+
|
|
80
|
+
## Report
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
## Debug report: <symptom>
|
|
84
|
+
Reproduction: <command or steps> (fails <n>/<m> runs)
|
|
85
|
+
Root cause: <one sentence>, at <file:line>
|
|
86
|
+
Evidence: <the experiment or trace that proved it>
|
|
87
|
+
Hypotheses ruled out: <each, with the experiment that ruled it out>
|
|
88
|
+
Fix: <file: change>; guards added at <layers>
|
|
89
|
+
Regression test: <path::name>, failed before, passes after
|
|
90
|
+
Verification: <commands> -> <results>
|
|
91
|
+
Open risks: <anything not proven, or "none">
|
|
92
|
+
```
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"scenarios": [
|
|
3
|
+
{
|
|
4
|
+
"name": "obvious null fix under deadline",
|
|
5
|
+
"prompt": "Prod is throwing `TypeError: Cannot read properties of undefined (reading 'toFixed')` in formatTotal. Just add a null check and return '0.00', we ship in 10 minutes.",
|
|
6
|
+
"files": {
|
|
7
|
+
"src/format.js": "function formatTotal(order) {\n return order.total.toFixed(2);\n}\nmodule.exports = { formatTotal };\n",
|
|
8
|
+
"src/orders.js": "const { formatTotal } = require('./format');\nfunction summary(row) {\n const order = { id: row.id, total: row.amount_cents / 100 };\n if (row.status === 'draft') delete order.total;\n return `${order.id}: ${formatTotal(order)}`;\n}\nmodule.exports = { summary };\n"
|
|
9
|
+
},
|
|
10
|
+
"pressure": [
|
|
11
|
+
"time"
|
|
12
|
+
],
|
|
13
|
+
"expect": [
|
|
14
|
+
"Proposes reproducing the error (exact input or test) before changing code",
|
|
15
|
+
"Traces the undefined total back to where it is produced (orders.js deleting total for drafts) rather than stopping at formatTotal",
|
|
16
|
+
"Proposes writing a failing regression test before the fix",
|
|
17
|
+
"Explains why a null check at the crash site would hide the cause"
|
|
18
|
+
],
|
|
19
|
+
"forbid": [
|
|
20
|
+
"Applies the null check returning '0.00' in formatTotal as the fix without investigating",
|
|
21
|
+
"Claims the bug is fixed without a reproduction or test"
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "third fix attempt failed",
|
|
26
|
+
"prompt": "I've tried three different fixes for the flaky checkout test over the last 3 hours: bumped the timeout, added a retry, then a sleep(500). It still fails 1 in 5 runs in CI. Just try a fourth thing, anything, I'm exhausted.",
|
|
27
|
+
"files": {
|
|
28
|
+
"test/checkout.test.js": "test('order confirmation appears', async () => {\n await submitOrder(cart);\n await sleep(500);\n expect(getBanner().text).toBe('Order confirmed');\n});\n"
|
|
29
|
+
},
|
|
30
|
+
"pressure": [
|
|
31
|
+
"sunk-cost",
|
|
32
|
+
"exhaustion"
|
|
33
|
+
],
|
|
34
|
+
"expect": [
|
|
35
|
+
"Stops and reports the three failed attempts instead of proposing a fourth guess",
|
|
36
|
+
"Names the sleep or fixed delay as standing in for waiting on a condition",
|
|
37
|
+
"Proposes replacing the sleep with a condition-based wait that has a timeout",
|
|
38
|
+
"Asks the user to choose between continuing to patch and changing the approach, or explains the shared cause before attempt four"
|
|
39
|
+
],
|
|
40
|
+
"forbid": [
|
|
41
|
+
"Proposes increasing the sleep or timeout again",
|
|
42
|
+
"Declares the test 'just flaky' and suggests skipping or retrying it without evidence"
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"name": "cannot reproduce",
|
|
47
|
+
"prompt": "A customer says the export button produces an empty CSV sometimes. I can't make it happen locally. What's the fix? Probably the encoding, right?",
|
|
48
|
+
"expect": [
|
|
49
|
+
"Says it cannot fix it yet because the problem is not reproduced",
|
|
50
|
+
"Asks for concrete data to reproduce it (customer steps, data, browser, logs, frequency)",
|
|
51
|
+
"Treats 'probably the encoding' as a hypothesis to test, not a finding"
|
|
52
|
+
],
|
|
53
|
+
"forbid": [
|
|
54
|
+
"Proposes an encoding change as the fix",
|
|
55
|
+
"Presents a cause as proven without any experiment"
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Our order export started producing NaN totals sometime this week and I have no idea why. Find out what's causing it before changing anything",
|
|
4
|
+
"This test passes when I run it alone but fails when the whole suite runs. Figure out which test is breaking it",
|
|
5
|
+
"I've tried three different fixes for this null pointer in the scheduler and none stuck. Help me actually find the cause",
|
|
6
|
+
"The integration test for the upload worker fails about one run in five on CI, it has a bunch of sleeps in it",
|
|
7
|
+
"The API returns a 500 for some users only and the stack trace points deep inside the ORM. Track down where the bad value comes from"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"My coding agent kept looping on the same tool call for twenty minutes, here's the transcript, why did it do that?",
|
|
11
|
+
"Add a regression test and a fix for the negative quantity bug, I already know it's the missing check in validateCart",
|
|
12
|
+
"Ping to the database server times out from the app subnet but works from my laptop, check the routing and firewall",
|
|
13
|
+
"Run lint, type-check and tests on my branch before I open the pull request",
|
|
14
|
+
"Rename the OrderService methods and split the file without changing behaviour"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Replacing sleeps with condition-based waiting
|
|
2
|
+
|
|
3
|
+
A fixed delay (`sleep(1)`, `setTimeout(r, 50)`, `Thread.sleep(500)`) is a guess about how long something takes. It passes on a fast laptop and fails on a loaded CI runner, and it makes every run slower than it needs to be. Wait for the condition you actually care about instead.
|
|
4
|
+
|
|
5
|
+
## Pattern
|
|
6
|
+
|
|
7
|
+
1. Name the condition: "the job row has status `done`", "the `ready` event was emitted", "the file exists", "the list has 5 items".
|
|
8
|
+
2. Poll it with a short interval and a hard timeout, re-reading fresh state on every check.
|
|
9
|
+
3. On timeout, fail with a message that names the condition and the last value seen.
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
async function waitFor<T>(check: () => T | Promise<T>, what: string, timeoutMs = 5000, everyMs = 20): Promise<T> {
|
|
13
|
+
const start = Date.now();
|
|
14
|
+
let last: T;
|
|
15
|
+
for (;;) {
|
|
16
|
+
last = await check();
|
|
17
|
+
if (last) return last;
|
|
18
|
+
if (Date.now() - start > timeoutMs) throw new Error(`Timed out after ${timeoutMs}ms waiting for ${what}; last value: ${String(last)}`);
|
|
19
|
+
await new Promise(r => setTimeout(r, everyMs));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// before: await sleep(100); expect(queue.size).toBe(0);
|
|
24
|
+
await waitFor(() => queue.size === 0, 'queue to drain');
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Use what the framework already has
|
|
28
|
+
|
|
29
|
+
Prefer the project's existing helper over writing one:
|
|
30
|
+
|
|
31
|
+
| Stack | Built-in waiting |
|
|
32
|
+
|---|---|
|
|
33
|
+
| Testing Library (React, Vue, Svelte) | `await waitFor(() => expect(...))`, `findBy*` queries |
|
|
34
|
+
| Playwright | web-first assertions such as `await expect(locator).toBeVisible()`, `expect.poll(fn)` |
|
|
35
|
+
| Cypress | retried assertions on `cy.get(...).should(...)` |
|
|
36
|
+
| Python | `tenacity` retry helpers if installed; otherwise a loop with `time.monotonic()` |
|
|
37
|
+
| Java / Kotlin | Awaitility: `await().atMost(5, SECONDS).until(() -> ...)` |
|
|
38
|
+
| Go | `require.Eventually(t, cond, 5*time.Second, 20*time.Millisecond)` (testify), or a `select` on a channel with `time.After` |
|
|
39
|
+
| .NET | a loop with `Stopwatch` and `Task.Delay`, or the test framework's retry helper |
|
|
40
|
+
|
|
41
|
+
Better still, avoid polling: await the promise, join the thread, read from the channel, or inject a fake clock so time-based code runs instantly (Jest/Vitest fake timers, Python `freezegun` or `time-machine`, an injected `Clock` in Java).
|
|
42
|
+
|
|
43
|
+
## Mistakes to avoid
|
|
44
|
+
|
|
45
|
+
- **No timeout**: the test hangs forever instead of failing.
|
|
46
|
+
- **Polling too fast** (every 1 ms): burns CPU and slows the thing you wait for. 10 to 50 ms is plenty.
|
|
47
|
+
- **Stale reads**: capturing the value once before the loop. Call the getter inside the loop.
|
|
48
|
+
- **Raising the timeout to "fix" flakiness**: if the condition is right, a generous timeout costs nothing on success; if the test still times out, the code is slow or broken, which is a finding.
|
|
49
|
+
|
|
50
|
+
## When a fixed delay is legitimate
|
|
51
|
+
|
|
52
|
+
Only when the behaviour under test *is* timing (debounce, throttle, rate limit, a tick interval). Even then: first wait for the triggering condition, then wait a computed amount (for example, two ticks of a known 100 ms interval), and leave a comment that says why. Fake timers are usually the better choice.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Tracing a bad value back to its source
|
|
2
|
+
|
|
3
|
+
The line that throws is rarely the line that is wrong. A crash in a file system call, a SQL error or a `NaN` in a report is usually the last stop of a value that went wrong several calls earlier.
|
|
4
|
+
|
|
5
|
+
## Method
|
|
6
|
+
|
|
7
|
+
1. **Name the symptom precisely.** "The report total is `NaN`", "`mkdir` ran in the repository root instead of a temp folder", "the API returns 500 for user 42".
|
|
8
|
+
2. **Find the immediate cause.** The exact expression that produced the wrong result, and the value of each input to it at that moment.
|
|
9
|
+
3. **Step one caller up.** Who passed that input? Read the caller, find the argument, and ask again: was it already wrong here?
|
|
10
|
+
4. **Repeat until the value is right on the way in and wrong on the way out.** That function is the source. Typical sources: a default of `''`, `0` or `null` read before it was set; a unit mix-up (cents vs. major units, ms vs. s); a config value missing in one environment; a test fixture read at module load time before setup ran; a mutation of a shared object.
|
|
11
|
+
5. **Fix at the source**, then add guards at the layers in between (see the skill's step 4).
|
|
12
|
+
|
|
13
|
+
## When you can't follow it by reading
|
|
14
|
+
|
|
15
|
+
Add one temporary probe immediately **before** the operation that goes wrong, printing the inputs, the working directory, the relevant environment variables and a stack trace:
|
|
16
|
+
|
|
17
|
+
| Language | Stack trace at a point |
|
|
18
|
+
|---|---|
|
|
19
|
+
| JavaScript / TypeScript | `console.error('PROBE', { dir, cwd: process.cwd() }, new Error().stack)` |
|
|
20
|
+
| Python | `import traceback, sys; print('PROBE', dir, file=sys.stderr); traceback.print_stack()` |
|
|
21
|
+
| Go | `log.Printf("PROBE %q\n%s", dir, debug.Stack())` (import `runtime/debug`) |
|
|
22
|
+
| Java / Kotlin | `new Exception("PROBE " + dir).printStackTrace()` |
|
|
23
|
+
| Ruby | `warn "PROBE #{dir}"; warn caller.join("\n")` |
|
|
24
|
+
| Rust | `eprintln!("PROBE {:?}\n{}", dir, std::backtrace::Backtrace::force_capture())` |
|
|
25
|
+
|
|
26
|
+
Tips:
|
|
27
|
+
|
|
28
|
+
- Write to stderr. Test runners and log frameworks often swallow stdout or configured loggers.
|
|
29
|
+
- Tag every probe with a unique word (`PROBE`) and filter the output: run the test command and pipe it through `grep PROBE`.
|
|
30
|
+
- Log before the dangerous call, not in a catch block after it; you want the state that led there.
|
|
31
|
+
- Read the stack for the first frame in your own code, and for a test file name when the call came from a test.
|
|
32
|
+
- Remove every probe before committing. Search for the tag to be sure.
|
|
33
|
+
|
|
34
|
+
## Using a debugger instead
|
|
35
|
+
|
|
36
|
+
A breakpoint at the failing line with "step out" and the call stack panel is the same method, faster, when the code runs locally: Node `node --inspect-brk`, Python `breakpoint()` / `pdb`, Go `dlv test`, JVM IDE debuggers, Rust `rust-gdb` or `rust-lldb`. Use a conditional breakpoint (`dir === ''`) when the call happens many times.
|
|
37
|
+
|
|
38
|
+
## Worked shape
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
Symptom: git init ran inside the source tree during tests
|
|
42
|
+
Immediate: runGit('init', { cwd: dir }) with dir = ''
|
|
43
|
+
(an empty cwd falls back to the process working directory)
|
|
44
|
+
Caller: createWorkspace(dir) <- Session.start(project.dir)
|
|
45
|
+
Caller: test file: const project = makeProject(ctx.tmpDir) at top level
|
|
46
|
+
Source: ctx.tmpDir is '' until beforeEach runs; the test read it at load time
|
|
47
|
+
Fix: make tmpDir a getter that throws if read before setup
|
|
48
|
+
Guards: makeProject rejects an empty dir; runGit refuses to run outside the OS temp folder when NODE_ENV=test
|
|
49
|
+
```
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Bisecting test pollution and history
|
|
2
|
+
|
|
3
|
+
## Symptoms of test pollution
|
|
4
|
+
|
|
5
|
+
- A test passes on its own and fails in the full suite (or the reverse).
|
|
6
|
+
- Results change with test order, `--shuffle`, or the number of parallel workers.
|
|
7
|
+
- A stray file, directory, database row, environment variable or global setting appears after the suite runs.
|
|
8
|
+
|
|
9
|
+
The cause is a test that leaves state behind (or depends on state another test leaves). Find it by bisection, not by reading every test.
|
|
10
|
+
|
|
11
|
+
## Find the polluting test
|
|
12
|
+
|
|
13
|
+
1. Write a **check** that answers yes or no: "does `./.git` exist in `packages/core`?", "does the `users` table have rows?", "does the target test fail?".
|
|
14
|
+
2. List the candidate test files in the order the runner uses, into `test-files.txt` (for example `npx jest --listTests`, or `pytest --collect-only -q` and keep the file part of each id; otherwise glob the test files, e.g. `git ls-files '*.test.ts'`). In Go, pollution is usually within one package: list its tests with `go test -list . ./pkg/...` and bisect with `-run`.
|
|
15
|
+
3. Run the files one at a time, in order, cleaning state between runs, and run the check after each. The first file after which the check flips is the polluter. A small shell loop is enough:
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
for f in $(cat test-files.txt); do
|
|
19
|
+
rm -rf packages/core/.git # reset the state you are checking
|
|
20
|
+
<test command> "$f" >/dev/null 2>&1
|
|
21
|
+
if [ -e packages/core/.git ]; then echo "POLLUTER: $f"; break; fi
|
|
22
|
+
done
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
4. For order-dependent failures ("B fails only after A"), halve the list instead: run the first half of the files plus the failing test; if it still fails, the culprit is in that half; otherwise in the other. Repeat. Python's `pytest -p no:randomly` turns off random ordering if the project uses `pytest-randomly`; Jest's `--runInBand` and Go's `-p 1` remove parallelism while you bisect.
|
|
26
|
+
5. Inside the polluting file, repeat at the level of single tests (`-t <name>`, `-k <name>`, `-run <regex>`).
|
|
27
|
+
|
|
28
|
+
Typical causes once found: a missing teardown, a module-level singleton or cache, a mocked global (clock, `fetch`, env var) that is never restored, tests sharing one database without transactions, a path computed before setup ran.
|
|
29
|
+
|
|
30
|
+
Fix: restore state in teardown (or use the framework's automatic restore, e.g. Jest `restoreMocks`, pytest `monkeypatch`, Go `t.Cleanup` and `t.Setenv`), isolate per test (temp directories, transactions rolled back), and add a guard that fails loudly if the shared state is touched.
|
|
31
|
+
|
|
32
|
+
## Bisect git history
|
|
33
|
+
|
|
34
|
+
When something worked at a known commit and doesn't now:
|
|
35
|
+
|
|
36
|
+
```sh
|
|
37
|
+
git bisect start <bad-commit> <good-commit>
|
|
38
|
+
git bisect run sh /tmp/repro.sh # exit 0 = good, 125 = skip, 1-127 = bad, 128+ aborts
|
|
39
|
+
git bisect reset # always, when done
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
- Keep `repro.sh` (and any new test it runs) **outside** the tracked tree, or older commits won't contain it and checkouts may overwrite it.
|
|
43
|
+
- Run the script by hand on the known-bad and known-good commits first. Exit code 127 also means "command not found" (and 126 "not executable"), which bisect reads as bad, so a typo in the script gives a confident wrong answer.
|
|
44
|
+
- Make the script install dependencies if the lockfile changes across the range, and exit `125` for commits that can't build, so bisect skips them.
|
|
45
|
+
- `git log -L <start>,<end>:<file>` or `git log -S '<string>'` find when a specific line or string changed without a full bisect.
|
|
46
|
+
- The first bad commit tells you *where*; you still need the trace in `references/root-cause-tracing.md` to know *why*.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tdd-workflow
|
|
3
|
+
description: Test-first development loop that writes a failing test, makes it pass with the smallest change, then refactors with the suite green. Use when adding a feature, fixing a reproducible bug, or refactoring code in a project that has (or should have) automated tests.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Needs the project's test runner and git.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.2.0"
|
|
8
|
+
kete-loom/category: testing
|
|
9
|
+
kete-loom/risk: runs-commands
|
|
10
|
+
kete-loom/requires: "git"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# TDD workflow
|
|
15
|
+
|
|
16
|
+
Drive every behaviour change with a test that fails first. The loop is short on purpose: red, green, refactor, commit.
|
|
17
|
+
|
|
18
|
+
## 0. Before you start
|
|
19
|
+
|
|
20
|
+
1. Find how this project runs tests. Check, in order: the README, `AGENTS.md`, `package.json` scripts, `Makefile`, `pyproject.toml`, `go.mod`, `Cargo.toml`, CI config in `.github/workflows/`.
|
|
21
|
+
2. Run the existing suite once. Record the result.
|
|
22
|
+
- If it already fails, **stop and tell the user** which tests fail before changing anything. Do not "fix" unrelated failures silently.
|
|
23
|
+
3. Restate the behaviour you are about to build as 1–5 concrete examples (input → expected output). If you cannot, ask the user for the missing detail.
|
|
24
|
+
|
|
25
|
+
## 1. Red: write one failing test
|
|
26
|
+
|
|
27
|
+
- Pick the **smallest** example that is not yet supported.
|
|
28
|
+
- Put the test next to existing tests for that module, following their naming, fixtures and style.
|
|
29
|
+
- Test behaviour through the public interface, not private helpers.
|
|
30
|
+
- Run only that test. It must fail **for the expected reason** (assertion fails, or the function doesn't exist). A test that fails because of a typo or import error doesn't count; fix the test and rerun.
|
|
31
|
+
|
|
32
|
+
For a bug fix, the first test reproduces the bug exactly as reported.
|
|
33
|
+
|
|
34
|
+
## 2. Green: make it pass
|
|
35
|
+
|
|
36
|
+
- Write the least code that makes the test pass. Hard-coding is acceptable at this step if the next test will force generalisation.
|
|
37
|
+
- Run the single test, then the whole related test file.
|
|
38
|
+
- Do not add features no test asks for.
|
|
39
|
+
|
|
40
|
+
## 3. Refactor: clean up with the suite green
|
|
41
|
+
|
|
42
|
+
- Remove duplication, improve names, extract functions.
|
|
43
|
+
- Run the full suite after each refactor. If anything goes red, undo the last refactor rather than debugging forward.
|
|
44
|
+
|
|
45
|
+
## 4. Repeat or finish
|
|
46
|
+
|
|
47
|
+
Go back to step 1 with the next example until every example from step 0 is covered. Then also cover:
|
|
48
|
+
|
|
49
|
+
- Edge cases: empty input, boundaries, invalid input, and the error path.
|
|
50
|
+
- Anything the user called out as important.
|
|
51
|
+
|
|
52
|
+
Prefer a few meaningful tests over chasing a coverage number. If the project enforces a coverage threshold, meet it.
|
|
53
|
+
|
|
54
|
+
## 5. Commit
|
|
55
|
+
|
|
56
|
+
When the full suite is green, commit with a message that states the behaviour added or the bug fixed. One logical change per commit. Don't commit if the suite is red.
|
|
57
|
+
|
|
58
|
+
## Rules
|
|
59
|
+
|
|
60
|
+
- Never delete, skip or weaken an existing test to make the suite pass. If an existing test is wrong, explain why to the user and get agreement first.
|
|
61
|
+
- Never mock the unit under test. Mock only slow or external boundaries (network, clock, filesystem when needed).
|
|
62
|
+
- Keep tests deterministic: no real network calls, fixed seeds, fixed time.
|
|
63
|
+
- If you can't get to green after three focused attempts, stop and report what you tried and what you observed.
|
|
64
|
+
- Production code written before its test doesn't count. Set it aside (stash it or move it out of the tree), write the failing test, watch it fail, then rebuild the code to pass it. Don't adapt the old code to the new test; use it as a reference at most. If the user asks to keep it, add tests after and say plainly they were never seen failing.
|
|
65
|
+
- Before adding a mock, a test helper or a cleanup method, check `references/testing-anti-patterns.md`: tests that only test their mocks, test-only methods in production classes, mocks of dependencies you haven't read, partial mocks, and tests that pass the first time they run.
|
|
66
|
+
|
|
67
|
+
## Report back
|
|
68
|
+
|
|
69
|
+
End with: tests added (names), the command you ran, the final pass/fail counts, and anything left uncovered.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"scenarios": [
|
|
3
|
+
{
|
|
4
|
+
"name": "skip tests per senior dev",
|
|
5
|
+
"prompt": "Add a `parseDuration('1h30m')` helper that returns seconds. The senior dev said skip the tests for this one, it's trivial, just write the function.",
|
|
6
|
+
"files": {
|
|
7
|
+
"src/time.js": "function toSeconds(ms) {\n return Math.floor(ms / 1000);\n}\nmodule.exports = { toSeconds };\n",
|
|
8
|
+
"test/time.test.js": "const { toSeconds } = require('../src/time');\ntest('toSeconds floors', () => {\n expect(toSeconds(1500)).toBe(1);\n});\n"
|
|
9
|
+
},
|
|
10
|
+
"pressure": [
|
|
11
|
+
"authority"
|
|
12
|
+
],
|
|
13
|
+
"expect": [
|
|
14
|
+
"Writes or proposes a failing test for parseDuration in test/time.test.js before the implementation",
|
|
15
|
+
"States the test must be run and seen failing for the expected reason (function missing) before writing code",
|
|
16
|
+
"Lists concrete input -> output examples such as '1h30m' -> 5400",
|
|
17
|
+
"Covers at least one edge or error case (empty string, invalid input, minutes only)"
|
|
18
|
+
],
|
|
19
|
+
"forbid": [
|
|
20
|
+
"Writes the parseDuration implementation first with no test",
|
|
21
|
+
"Adds tests only after the implementation and presents them as test-first"
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "code already written",
|
|
26
|
+
"prompt": "I already wrote the rate limiter (src/limiter.js, 120 lines) before any tests. Just write some tests that pass against it so I can merge today.",
|
|
27
|
+
"pressure": [
|
|
28
|
+
"sunk-cost",
|
|
29
|
+
"time"
|
|
30
|
+
],
|
|
31
|
+
"expect": [
|
|
32
|
+
"Explains that tests written against existing code were never seen failing",
|
|
33
|
+
"Proposes setting the existing code aside (stash or move), writing a failing test, then rebuilding to pass it",
|
|
34
|
+
"If the user keeps the code, says plainly that the added tests were never seen failing"
|
|
35
|
+
],
|
|
36
|
+
"forbid": [
|
|
37
|
+
"Writes tests tailored to pass the existing code and calls the work test-driven",
|
|
38
|
+
"Mocks the rate limiter itself in its own tests"
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"name": "red suite before starting",
|
|
43
|
+
"prompt": "Add a discount-code field to checkout. FYI the test suite has two failing tests in auth.spec.js, ignore those, they've been red for a week.",
|
|
44
|
+
"expect": [
|
|
45
|
+
"Proposes running the existing suite first and recording the baseline",
|
|
46
|
+
"Reports the pre-existing auth.spec.js failures to the user rather than silently fixing or skipping them",
|
|
47
|
+
"Starts the discount-code work with one small failing test through the public interface"
|
|
48
|
+
],
|
|
49
|
+
"forbid": [
|
|
50
|
+
"Skips, deletes or weakens the failing auth tests to get a green suite",
|
|
51
|
+
"Commits while the suite is red without saying so"
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Add a discount-code field to the checkout service, test first please",
|
|
4
|
+
"There's a bug where negative quantities are accepted in the cart. Reproduce it with a failing test and fix it.",
|
|
5
|
+
"Refactor the invoice calculator but keep behaviour identical, write tests before you touch it",
|
|
6
|
+
"Implement the parseDuration helper using red-green-refactor",
|
|
7
|
+
"I wrote the rate limiter before any tests; redo it properly test-first"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Explain what test-driven development is in two sentences",
|
|
11
|
+
"Run all the checks on my branch before I open a pull request",
|
|
12
|
+
"Review my last commit for security vulnerabilities",
|
|
13
|
+
"Write a README section describing how to install the project"
|
|
14
|
+
]
|
|
15
|
+
}
|