@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,87 @@
|
|
|
1
|
+
# Testing anti-patterns
|
|
2
|
+
|
|
3
|
+
Read this before adding a mock, a test helper, a cleanup method, or a test for code that already exists. Each pattern below produces tests that stay green while the real behaviour breaks.
|
|
4
|
+
|
|
5
|
+
## 1. Testing the mock instead of the behaviour
|
|
6
|
+
|
|
7
|
+
**Symptom:** the assertion checks that a mock was rendered, called or returned its canned value, and nothing else.
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
// Bad: passes as long as the mock exists
|
|
11
|
+
jest.mock('./PriceBadge', () => () => <div data-testid="price-badge" />);
|
|
12
|
+
expect(screen.getByTestId('price-badge')).toBeInTheDocument();
|
|
13
|
+
|
|
14
|
+
// Good: asserts what the user sees, using the real component
|
|
15
|
+
expect(screen.getByText('GHS 120.00')).toBeInTheDocument();
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Check:** "If I deleted the production code this test covers, would it fail?" If the answer is no, the test is about the mock.
|
|
19
|
+
|
|
20
|
+
**Fix:** use the real collaborator, or assert on the observable result of the unit under test (return value, state change, output, message sent). An assertion on a mock is only valid when the call itself is the behaviour, for example "the payment gateway was asked to refund exactly 50.00", and even then assert the arguments, not just that a call happened.
|
|
21
|
+
|
|
22
|
+
## 2. Test-only methods in production code
|
|
23
|
+
|
|
24
|
+
**Symptom:** a production class grows `reset()`, `_setStateForTest()`, `destroyForTests()` or a public getter that only tests call.
|
|
25
|
+
|
|
26
|
+
**Why it hurts:** production callers can reach it, it couples the class to the test suite, and it often bypasses invariants the real API enforces.
|
|
27
|
+
|
|
28
|
+
**Fix:**
|
|
29
|
+
|
|
30
|
+
- Search the codebase for callers. If only tests call it, move it out.
|
|
31
|
+
- Build the state through the public API, or create a fresh instance per test.
|
|
32
|
+
- Put cleanup in test helpers or fixtures (`afterEach`, a pytest fixture, a `t.Cleanup` func).
|
|
33
|
+
- If the class truly cannot be tested without a back door, the design is telling you something: inject the dependency instead.
|
|
34
|
+
|
|
35
|
+
## 3. Mocking without understanding the dependency
|
|
36
|
+
|
|
37
|
+
**Symptom:** a method is mocked "to be safe" or "because it's slow", and the test then passes or fails for reasons nobody can explain.
|
|
38
|
+
|
|
39
|
+
**Before mocking anything:**
|
|
40
|
+
|
|
41
|
+
1. Read the real dependency. List its side effects (writes a file, updates a cache, emits an event, sets config) and its return shape.
|
|
42
|
+
2. Decide which of those the test relies on. Mocking a method also removes every side effect the test may need.
|
|
43
|
+
3. Run the test with the real dependency first. Mock only if it is slow, non-deterministic or external (network, clock, payment provider), and only at that boundary.
|
|
44
|
+
|
|
45
|
+
**Rule:** mock at the lowest level that removes the slow or external part, not the high-level method the test is about.
|
|
46
|
+
|
|
47
|
+
## 4. Incomplete mocks
|
|
48
|
+
|
|
49
|
+
**Symptom:** a mocked response contains only the fields the current code reads.
|
|
50
|
+
|
|
51
|
+
```py
|
|
52
|
+
# Bad: real API also returns "currency" and "metadata"; code that reads them later
|
|
53
|
+
# fails in production while this test stays green
|
|
54
|
+
fake_charge = {"id": "ch_1", "status": "succeeded"}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**Fix:** copy the full shape from the real API's documented response, a recorded fixture or the type definition. Prefer a typed factory (`makeCharge(overrides)`) that fills every field with realistic defaults, so a mock can't silently drift from the real structure. When the real shape changes, update the factory, not every test.
|
|
58
|
+
|
|
59
|
+
## 5. Tests written after the code
|
|
60
|
+
|
|
61
|
+
**Symptom:** the test passes the first time it runs.
|
|
62
|
+
|
|
63
|
+
**Why it hurts:** a test you never saw fail may not be able to fail. It may assert the wrong thing, hit a different code path, or be shaped around what the code happens to do rather than what it should do.
|
|
64
|
+
|
|
65
|
+
**Fix:**
|
|
66
|
+
|
|
67
|
+
1. If you wrote production code before its test, set the code aside (stash it or move it out of the tree).
|
|
68
|
+
2. Write the test. Run it. It must fail for the expected reason.
|
|
69
|
+
3. Rebuild the code to make it pass. Use the set-aside version as a reference at most; don't paste it back and call it done.
|
|
70
|
+
4. If the user decides to keep code that was written first, add the tests, then prove each one can fail: temporarily break the line it covers (invert a condition, return a wrong value), run it, see it fail, restore. Tell the user these tests were added after the code.
|
|
71
|
+
|
|
72
|
+
## 6. Smaller traps
|
|
73
|
+
|
|
74
|
+
| Trap | Fix |
|
|
75
|
+
|---|---|
|
|
76
|
+
| Expected value computed by the code under test (`expect(f(x)).toBe(f(x))`) | Use a literal or a hand-checked fixture |
|
|
77
|
+
| Asserting on log text or exact error wording only | Assert the behaviour: the returned error type, the status code, the state left behind |
|
|
78
|
+
| One test checks five behaviours | Split it so a failure names the broken behaviour |
|
|
79
|
+
| Shared mutable fixture across tests | Fresh setup per test; tests must pass in any order |
|
|
80
|
+
| Sleeping to wait for async work | Await the promise, use fake timers, or poll for the condition with a timeout |
|
|
81
|
+
|
|
82
|
+
## Quick gate before committing a test
|
|
83
|
+
|
|
84
|
+
- Did I see it fail, for the right reason?
|
|
85
|
+
- Would it fail if the behaviour broke, but not if I renamed an internal?
|
|
86
|
+
- Does every mock stand in for something slow or external, with the full real shape?
|
|
87
|
+
- Is every method it calls also used by production code?
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: technical-writing
|
|
3
|
+
description: Writes and restructures developer-facing documentation people actually use, such as READMEs, how-to guides, tutorials and API reference, by naming the audience first, organising around the reader's task, shipping copy-paste examples that are run before publishing, and keeping docs beside the code they describe. Use when drafting or rewriting a README, a getting-started or how-to guide, reference docs for a library, CLI or HTTP API, or when docs are confusing, stale or nobody reads them.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Running examples needs the project's own toolchain.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: docs
|
|
9
|
+
kete-loom/risk: runs-commands
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Technical writing
|
|
14
|
+
|
|
15
|
+
Docs exist so a reader can finish a task. Every decision below follows from that: know who reads, know what they're trying to do, show them a working path, and keep it true.
|
|
16
|
+
|
|
17
|
+
## 1. Pin down audience and job
|
|
18
|
+
|
|
19
|
+
Before writing, answer these. Ask the user for any you can't infer from the repo:
|
|
20
|
+
|
|
21
|
+
1. **Who reads it?** First-time user, integrating developer, operator, contributor. One primary reader per document.
|
|
22
|
+
2. **What are they trying to do?** Install, try it, solve one specific problem, look up an exact detail, understand a design.
|
|
23
|
+
3. **What do they already know?** Language, framework, domain terms.
|
|
24
|
+
|
|
25
|
+
The answer to question 2 picks the document type. Don't mix types in one page.
|
|
26
|
+
|
|
27
|
+
| Reader wants to | Write a | Shape |
|
|
28
|
+
|---|---|---|
|
|
29
|
+
| learn by doing, first time | tutorial | one guided path, every step succeeds, no choices |
|
|
30
|
+
| solve a specific problem | how-to guide | goal in the title, prerequisites, numbered steps, result |
|
|
31
|
+
| look up an exact fact | reference | complete, consistent, structured like the code |
|
|
32
|
+
| understand why | explanation | prose, trade-offs, diagrams, links to the rest |
|
|
33
|
+
|
|
34
|
+
This is the Diátaxis split. Use it to decide, not as jargon in the docs.
|
|
35
|
+
|
|
36
|
+
## 2. Structure task-first
|
|
37
|
+
|
|
38
|
+
- Title says the task or the thing: "Send a webhook test event", not "Webhooks overview".
|
|
39
|
+
- Put the shortest successful path first. Options, edge cases and theory come after.
|
|
40
|
+
- Number steps that must happen in order. One action per step. Put the expected result after the step that produces it.
|
|
41
|
+
- State prerequisites up front (versions, accounts, permissions), never halfway down.
|
|
42
|
+
- Use headings a reader would search for. Keep paragraphs short.
|
|
43
|
+
|
|
44
|
+
### README order
|
|
45
|
+
|
|
46
|
+
1. Name and one sentence on what it does and for whom.
|
|
47
|
+
2. Install (one command where possible).
|
|
48
|
+
3. Quick start: the smallest example that does something real, with its output.
|
|
49
|
+
4. Common tasks or a link to guides.
|
|
50
|
+
5. Configuration (table: key, default, meaning).
|
|
51
|
+
6. Links: full docs, contributing, license, support.
|
|
52
|
+
|
|
53
|
+
Badges, history and architecture go below this or in other files.
|
|
54
|
+
|
|
55
|
+
## 3. Examples that run
|
|
56
|
+
|
|
57
|
+
- Every example is complete enough to paste and run: imports, setup, and placeholder values that are obviously placeholders (`YOUR_API_KEY`, `example.com`).
|
|
58
|
+
- Show the expected output or response.
|
|
59
|
+
- Run every example before you publish it, using the project's toolchain. If you can't run one, mark it "not run" in your report and tell the user.
|
|
60
|
+
- Use the project's real names, flags and defaults. Search the code to confirm each one; don't recall them.
|
|
61
|
+
- Label code blocks with their language. Split commands from their output.
|
|
62
|
+
- Never put real secrets, tokens, internal hostnames or customer data in examples.
|
|
63
|
+
|
|
64
|
+
## 4. Reference docs
|
|
65
|
+
|
|
66
|
+
- Generate from the source where the project already has a generator (docstrings, OpenAPI, typedoc-style tools). Fix the source comments, not the generated output.
|
|
67
|
+
- For each item: signature or endpoint, parameters (name, type, required, default, meaning), return value or response, errors, one example.
|
|
68
|
+
- Keep the same order and wording pattern for every entry so readers can scan.
|
|
69
|
+
- Document behaviour callers depend on: units, limits, side effects, idempotency, thread safety, deprecation and what replaces it.
|
|
70
|
+
|
|
71
|
+
## 5. Keep docs with the code
|
|
72
|
+
|
|
73
|
+
- Put docs in the repo, next to what they describe (`README.md` at package roots, `docs/` for guides, docstrings for reference).
|
|
74
|
+
- When code and docs disagree, the code is the truth. Fix the docs, or tell the user if the code looks wrong.
|
|
75
|
+
- Prefer links over copies. Duplicate text goes stale in one place first.
|
|
76
|
+
- If the project has docs linting, link checking or doctests, run them.
|
|
77
|
+
- When a code change alters behaviour, update docs in the same change. For that job, delegate to the `doc-updater` agent if it's available.
|
|
78
|
+
|
|
79
|
+
## 6. Style
|
|
80
|
+
|
|
81
|
+
- Second person, active voice, present tense: "Run `make test`", not "The tests can be run".
|
|
82
|
+
- Plain words. Define a term the first time, then use it the same way every time.
|
|
83
|
+
- Be specific: "takes about 2 minutes", not "may take some time"; "requires Node 18 or later" only after checking the project's engines field or CI.
|
|
84
|
+
- Cut filler: "simply", "just", "easy", "obviously". They insult the reader who's stuck.
|
|
85
|
+
- Follow the project's existing style guide and spelling if it has one.
|
|
86
|
+
|
|
87
|
+
## Stop and ask
|
|
88
|
+
|
|
89
|
+
- The audience or document type is unclear and changes the outcome.
|
|
90
|
+
- The docs would describe behaviour you can't confirm in the code.
|
|
91
|
+
- You'd delete or restructure existing docs that other pages or external sites may link to.
|
|
92
|
+
|
|
93
|
+
## Report back
|
|
94
|
+
|
|
95
|
+
Return the files you wrote or changed, the reader and document type each targets, which examples you ran (with the command) and which you didn't, and any doc-versus-code mismatches you found. For a guided walkthrough of code, use `code-tour`; for getting oriented yourself, use `codebase-onboarding`.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Rewrite our README so someone new can install the CLI and run their first command in five minutes",
|
|
4
|
+
"Write a how-to guide for rotating API keys in our service",
|
|
5
|
+
"Our API reference is a mess, restructure the docs for the REST endpoints with examples for each",
|
|
6
|
+
"Nobody reads our getting-started docs. Can you make them task-first with runnable code samples?"
|
|
7
|
+
],
|
|
8
|
+
"should_not_trigger": [
|
|
9
|
+
"I renamed the --verbose flag to --debug in this commit, sync the docs and changelog with that change",
|
|
10
|
+
"Walk me through this unfamiliar repo so I know how to build and run it",
|
|
11
|
+
"Create a file-by-file tour of the auth flow for new contributors",
|
|
12
|
+
"Write a blog post announcing our product launch for the marketing site"
|
|
13
|
+
]
|
|
14
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: terraform-patterns
|
|
3
|
+
description: Terraform and OpenTofu infrastructure-as-code practice, from root and child module layout, pinned providers and remote state with locking, through per-environment variables, reading a plan before apply, detecting drift, adopting existing resources with import blocks, and renaming or moving resources safely with moved and removed blocks instead of destroy and recreate. Use when writing or restructuring .tf code, setting up a state backend, reviewing what terraform plan will replace or destroy, or bringing hand-made cloud resources under Terraform.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Needs terraform or tofu on PATH and cloud credentials for plan and apply. Commands are the same for both CLIs; substitute tofu for terraform when the project uses OpenTofu.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: devops
|
|
9
|
+
kete-loom/risk: runs-commands
|
|
10
|
+
kete-loom/requires: "terraform"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Terraform patterns
|
|
15
|
+
|
|
16
|
+
Change infrastructure through code that plans cleanly, keeps state safe, and never destroys something by accident. Cloud-specific service choices belong to `aws-patterns`, `gcp-patterns` or `azure-patterns`; this skill covers the Terraform layer itself.
|
|
17
|
+
|
|
18
|
+
## 0. Orient
|
|
19
|
+
|
|
20
|
+
1. Detect the CLI: `.terraform.lock.hcl`, `required_version`, a `.terraform-version` / `.opentofu-version` file, or CI steps tell you whether it is `terraform` or `tofu`, and which version. Use that one throughout.
|
|
21
|
+
2. Find the root modules (directories with a `backend` block or that CI runs `plan` in), the child modules (`modules/`), and how environments are split (separate root directories per env, workspaces, or a wrapper such as Terragrunt).
|
|
22
|
+
3. Read the backend block. Note where state lives and whether locking is on.
|
|
23
|
+
4. **Stop and ask the user** before `apply`, `destroy`, `import` on the CLI, any `state` subcommand that writes (`mv`, `rm`, `push`), `force-unlock`, or `init -migrate-state`. `fmt`, `validate`, `init` (without migration) and `plan` are fine.
|
|
24
|
+
|
|
25
|
+
## 1. Layout
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
modules/
|
|
29
|
+
network/ main.tf variables.tf outputs.tf versions.tf README.md
|
|
30
|
+
service/
|
|
31
|
+
envs/
|
|
32
|
+
dev/ main.tf backend.tf terraform.tfvars versions.tf
|
|
33
|
+
prod/
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
- One root module per environment (or per environment and component) with its own state. Keep blast radius small: networking, data stores and apps in separate states when they change at different rates.
|
|
37
|
+
- Child modules take inputs and return outputs; they don't configure providers or backends. Pass providers explicitly (`providers = { aws = aws.eu }`) when a module needs an aliased one.
|
|
38
|
+
- Pin versions: `required_version` in every root, and `required_providers` with a `~>` constraint. Commit `.terraform.lock.hcl` for root modules.
|
|
39
|
+
- Pin module sources: registry modules with `version = "~> x.y"`, git sources with `?ref=<tag>`.
|
|
40
|
+
- Prefer `for_each` over `count` for anything that has identity, so removing one item doesn't shift the indexes of every other.
|
|
41
|
+
|
|
42
|
+
## 2. Variables and environments
|
|
43
|
+
|
|
44
|
+
- Declare a `type` and `description` for every variable; add `validation` blocks for values with rules (CIDRs, allowed names).
|
|
45
|
+
- Mark secrets `sensitive = true`, and better, don't pass them as variables at all: read them from a secret manager data source or have the service fetch them at runtime. Sensitive values are still stored in state in plain text.
|
|
46
|
+
- Per-environment values in `envs/<env>/terraform.tfvars` or `-var-file`. Never commit a tfvars file containing secrets.
|
|
47
|
+
- Use `locals` for derived names and common tags instead of repeating expressions.
|
|
48
|
+
|
|
49
|
+
## 3. Remote state and locking
|
|
50
|
+
|
|
51
|
+
- Never keep state for shared infrastructure on a laptop or in git. Use a remote backend with locking and encryption: S3 (with `use_lockfile = true` for S3-native locking on current Terraform; the older `dynamodb_table` locking is deprecated), GCS, `azurerm`, HCP Terraform, or the backend the team already uses. Examples are in `references/backends.md`.
|
|
52
|
+
- Turn on versioning for the state bucket so a bad write can be recovered.
|
|
53
|
+
- Restrict who can read state: it contains every attribute of every resource, including secrets.
|
|
54
|
+
- Read another stack's outputs with `terraform_remote_state` or, better, a data source that looks the resource up, rather than copying IDs by hand.
|
|
55
|
+
- If a lock is stale (a crashed run), confirm with the user that no run is in progress before `force-unlock <LOCK_ID>`.
|
|
56
|
+
|
|
57
|
+
## 4. The plan is the review
|
|
58
|
+
|
|
59
|
+
Run `terraform plan -out=tfplan` and read it before anything is applied.
|
|
60
|
+
|
|
61
|
+
1. Read the summary line: `Plan: X to add, Y to change, Z to destroy`.
|
|
62
|
+
2. Search the plan for `must be replaced`, `forces replacement` and `will be destroyed`. For each, name the attribute that forces it.
|
|
63
|
+
3. Treat replacement or destruction of a stateful resource (databases, buckets, disks, DNS zones, KMS keys, clusters, IAM roles other systems depend on) as a stop: explain it to the user and propose an alternative (a `moved` block, `ignore_changes` for an attribute managed elsewhere, or an in-place change).
|
|
64
|
+
4. Check for unexpected changes to resources you didn't touch: that is drift or a provider upgrade, not your change. Report it separately.
|
|
65
|
+
5. Apply only the saved plan (`terraform apply tfplan`), so what runs is exactly what was reviewed.
|
|
66
|
+
|
|
67
|
+
For machine-readable checks: `terraform show -json tfplan` and look at `resource_changes[].change.actions` for `"delete"`.
|
|
68
|
+
|
|
69
|
+
Protect critical resources with `lifecycle { prevent_destroy = true }`, and use `create_before_destroy = true` where a replacement must not cause downtime.
|
|
70
|
+
|
|
71
|
+
## 5. Drift
|
|
72
|
+
|
|
73
|
+
- `terraform plan -refresh-only` shows what changed outside Terraform without proposing to revert it.
|
|
74
|
+
- Decide per item with the user: bring the code in line with reality, or let the next apply revert the manual change. Don't silently revert a hotfix someone made in the console.
|
|
75
|
+
- `-detailed-exitcode` (exit 2 means changes) lets CI detect drift on a schedule.
|
|
76
|
+
|
|
77
|
+
## 6. Safe refactors
|
|
78
|
+
|
|
79
|
+
Renaming or moving a resource address without telling Terraform plans a destroy and a create. Use config-driven blocks, which show up in the plan and get reviewed like any other change:
|
|
80
|
+
|
|
81
|
+
```hcl
|
|
82
|
+
moved {
|
|
83
|
+
from = aws_s3_bucket.logs
|
|
84
|
+
to = module.logging.aws_s3_bucket.this
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
import {
|
|
88
|
+
to = aws_s3_bucket.assets
|
|
89
|
+
id = "my-existing-assets-bucket"
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
removed {
|
|
93
|
+
from = aws_instance.legacy
|
|
94
|
+
lifecycle { destroy = false } # forget it, keep the real resource
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
- `moved` for renames, `count` → `for_each`, and moving resources into or out of modules. The plan should then show no destroy for those addresses.
|
|
99
|
+
- `import` blocks to adopt existing resources; `terraform plan -generate-config-out=generated.tf` drafts the matching configuration. Edit the generated code until plan shows no changes for the imported resource.
|
|
100
|
+
- `removed` with `destroy = false` to stop managing something without deleting it.
|
|
101
|
+
- These blocks need a reasonably recent CLI, and Terraform and OpenTofu added them (and options such as `removed`'s `lifecycle { destroy = false }`) in different releases. Check the docs for the CLI and version in `required_version`; if not, stop and ask before falling back to `terraform state mv` / `state rm`, which change state immediately and skip review.
|
|
102
|
+
- Keep `moved` blocks in shared modules for at least one release so every caller's state migrates; remove `import` and `removed` blocks after the apply.
|
|
103
|
+
|
|
104
|
+
## 7. Verify
|
|
105
|
+
|
|
106
|
+
Run, and report each as pass or fail:
|
|
107
|
+
|
|
108
|
+
1. `terraform fmt -check -recursive`
|
|
109
|
+
2. `terraform init -backend=false` then `terraform validate` in each changed root (no credentials needed).
|
|
110
|
+
3. Linters the project already uses (`tflint`, `checkov`, `trivy config`).
|
|
111
|
+
4. `terraform plan` in each affected environment if credentials are available; paste the summary line and every replace or destroy.
|
|
112
|
+
|
|
113
|
+
## Never
|
|
114
|
+
|
|
115
|
+
- Never run `apply -auto-approve` or `destroy` on the user's behalf without explicit approval for that environment.
|
|
116
|
+
- Never edit a state file by hand or commit `*.tfstate`, `.terraform/` or secret-bearing tfvars.
|
|
117
|
+
- Never use `-target` as a routine workflow; it is for recovery, and leaves the rest of the config unreviewed.
|
|
118
|
+
- Never upgrade a provider's major version as a side effect of another change.
|
|
119
|
+
|
|
120
|
+
## Report back
|
|
121
|
+
|
|
122
|
+
End with: CLI and version, roots changed, the plan summary per environment (add/change/destroy) with every replacement or destroy named and justified, the verification commands with pass or fail, and anything you could not plan because of missing credentials.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"I renamed a resource in our Terraform and now plan wants to destroy and recreate the database",
|
|
4
|
+
"Set up an S3 remote state backend with locking for our Terraform project",
|
|
5
|
+
"We created a bunch of buckets by hand in the console, how do I bring them under Terraform?",
|
|
6
|
+
"Restructure our tf code into reusable modules with separate dev and prod environments",
|
|
7
|
+
"terraform plan shows changes nobody made, how do I check for drift?"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Should we use Cloud Run or GKE for this service on Google Cloud?",
|
|
11
|
+
"Write a Kubernetes Deployment with resource limits for the API",
|
|
12
|
+
"Review this terraform plan output and the k8s manifests for risky or destructive changes",
|
|
13
|
+
"Add a GitHub Actions job that builds and pushes our Docker image",
|
|
14
|
+
"Containerise the Python worker with a slim base image"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Remote state backends
|
|
2
|
+
|
|
3
|
+
Check the backend's docs for your CLI version before copying; argument names change between releases.
|
|
4
|
+
|
|
5
|
+
## AWS S3 (S3-native locking)
|
|
6
|
+
|
|
7
|
+
```hcl
|
|
8
|
+
terraform {
|
|
9
|
+
backend "s3" {
|
|
10
|
+
bucket = "acme-terraform-state"
|
|
11
|
+
key = "prod/network/terraform.tfstate"
|
|
12
|
+
region = "eu-west-1"
|
|
13
|
+
encrypt = true
|
|
14
|
+
use_lockfile = true # writes a .tflock object next to the state
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
- The bucket should have versioning on, public access blocked, and default encryption (SSE-S3 or SSE-KMS).
|
|
20
|
+
- With `use_lockfile`, the caller needs `s3:GetObject`, `s3:PutObject` and `s3:DeleteObject` on the lock object as well as the state object.
|
|
21
|
+
- Migrating from `dynamodb_table` locking: the two can be set together during the transition. Add `use_lockfile = true`, run `terraform init -reconfigure`, confirm runs create the `.tflock` object, then remove `dynamodb_table`.
|
|
22
|
+
|
|
23
|
+
## Google Cloud Storage
|
|
24
|
+
|
|
25
|
+
```hcl
|
|
26
|
+
terraform {
|
|
27
|
+
backend "gcs" {
|
|
28
|
+
bucket = "acme-terraform-state"
|
|
29
|
+
prefix = "prod/network"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
GCS locks natively. Enable object versioning on the bucket.
|
|
35
|
+
|
|
36
|
+
## Azure Storage
|
|
37
|
+
|
|
38
|
+
```hcl
|
|
39
|
+
terraform {
|
|
40
|
+
backend "azurerm" {
|
|
41
|
+
resource_group_name = "rg-terraform"
|
|
42
|
+
storage_account_name = "acmetfstate"
|
|
43
|
+
container_name = "tfstate"
|
|
44
|
+
key = "prod/network.tfstate"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Azure locks via blob leases. Enable blob versioning or soft delete on the storage account.
|
|
50
|
+
|
|
51
|
+
## Partial configuration
|
|
52
|
+
|
|
53
|
+
Keep environment-specific backend values out of shared code:
|
|
54
|
+
|
|
55
|
+
```hcl
|
|
56
|
+
terraform {
|
|
57
|
+
backend "s3" {}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
```sh
|
|
62
|
+
terraform init -backend-config=backend.prod.hcl
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Changing backends
|
|
66
|
+
|
|
67
|
+
`terraform init -migrate-state` copies state to the new backend. Before running it: confirm with the user, take a copy with `terraform state pull > backup.tfstate` (store it securely, it contains secrets), and make sure no other run is in progress.
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test-coverage-improvement
|
|
3
|
+
description: Raises meaningful test coverage by measuring line and branch coverage, ranking untested code by risk and churn, adding tests that pin observable behaviour rather than executing lines, and using mutation testing (Stryker, PIT, mutmut, cargo-mutants, Infection) to prove the new tests catch faults. Use when coverage is low or below a CI threshold, when asked where tests are missing in a module, or when a team wants coverage numbers they can trust.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Needs the project's test runner and its coverage tool; mutation testing tools are optional.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: testing
|
|
9
|
+
kete-loom/risk: runs-commands
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Test coverage improvement
|
|
14
|
+
|
|
15
|
+
Coverage tells you what code ran during tests, not what was checked. The goal is fewer escaped bugs, so spend tests where a bug would hurt and make every test assert something a user or caller would notice.
|
|
16
|
+
|
|
17
|
+
## 1. Measure the baseline
|
|
18
|
+
|
|
19
|
+
1. Find the existing coverage command in CI, package scripts or the Makefile. Use it if it exists.
|
|
20
|
+
2. Otherwise run the language default with **branch** coverage on where the tool supports it (Go reports statement coverage only; `cargo llvm-cov --branch` needs a nightly toolchain):
|
|
21
|
+
|
|
22
|
+
| Stack | Command |
|
|
23
|
+
|---|---|
|
|
24
|
+
| Jest | `npx jest --coverage` |
|
|
25
|
+
| Vitest | `npx vitest run --coverage` (needs `@vitest/coverage-v8`) |
|
|
26
|
+
| Python | `pytest --cov=<pkg> --cov-branch --cov-report=term-missing` (pytest-cov) |
|
|
27
|
+
| Go | `go test -coverprofile=cover.out ./...` then `go tool cover -func=cover.out` |
|
|
28
|
+
| Rust | `cargo llvm-cov` (cargo-llvm-cov) or `cargo tarpaulin` |
|
|
29
|
+
| Java | JaCoCo via `mvn verify` or `gradle jacocoTestReport` |
|
|
30
|
+
| .NET | `dotnet test --collect:"XPlat Code Coverage"` |
|
|
31
|
+
| PHP | `vendor/bin/phpunit --coverage-text` (needs Xdebug or PCOV) |
|
|
32
|
+
|
|
33
|
+
3. Record: total line %, branch %, and the per-file numbers. If the suite fails, **stop and tell the user** first; coverage from a red suite is meaningless.
|
|
34
|
+
4. If adding a coverage tool would add a dependency the project doesn't have, ask before installing it.
|
|
35
|
+
|
|
36
|
+
## 2. Find the risky gaps
|
|
37
|
+
|
|
38
|
+
Do not sort by "lowest %". Rank untested code by risk:
|
|
39
|
+
|
|
40
|
+
1. **Money, auth, permissions, data deletion, migrations** and anything security-sensitive.
|
|
41
|
+
2. **Branches with no test**: `else` paths, error handlers, early returns, `catch` blocks, default cases. Branch coverage reports show these as partial lines.
|
|
42
|
+
3. **High churn**: files changed often recently (`git log --since=6.months --name-only --format= | sort | uniq -c | sort -rn | head -20`). Churn plus low coverage is where regressions come from.
|
|
43
|
+
4. **Recent bugs**: code touched by recent fix commits.
|
|
44
|
+
5. Public API used by many callers.
|
|
45
|
+
|
|
46
|
+
Skip, and say you skipped: generated code, trivial getters and setters, framework glue with no logic, and code scheduled for deletion. Prefer excluding them in coverage config (with a comment) over writing hollow tests.
|
|
47
|
+
|
|
48
|
+
Write the top 5 to 10 targets as a list with the reason each one is risky, and confirm with the user if the list is long.
|
|
49
|
+
|
|
50
|
+
## 3. Write behaviour tests
|
|
51
|
+
|
|
52
|
+
For each target:
|
|
53
|
+
|
|
54
|
+
- Name the behaviour: "rejects a refund larger than the original charge", not "test refund function".
|
|
55
|
+
- Drive it through the public interface the callers use.
|
|
56
|
+
- Assert the observable result: return value, raised error and its type or message, state persisted, message sent. One behaviour per test.
|
|
57
|
+
- Cover the branch you found: the error path, the boundary (0, 1, max, empty, null), the permission denied case.
|
|
58
|
+
- Mock only external boundaries (network, clock, randomness, third-party services). Never mock the unit under test or its own collaborators just to reach a line.
|
|
59
|
+
- Follow the existing test style, folders and fixtures.
|
|
60
|
+
|
|
61
|
+
A test that would pass if the code under test returned a wrong value is not a test. Avoid:
|
|
62
|
+
|
|
63
|
+
- No assertion, or `expect(result).toBeDefined()` / `assert result is not None` as the only check.
|
|
64
|
+
- Snapshotting large output nobody reviews.
|
|
65
|
+
- Asserting that a mock was called, without checking the outcome.
|
|
66
|
+
- Calling a function in a loop over inputs just to light up lines.
|
|
67
|
+
|
|
68
|
+
## 4. Check with mutation testing
|
|
69
|
+
|
|
70
|
+
Mutation testing changes the code (flips `>` to `>=`, removes a call, returns a constant) and reruns the tests. A surviving mutant is a fault your tests don't catch.
|
|
71
|
+
|
|
72
|
+
| Stack | Tool | Run |
|
|
73
|
+
|---|---|---|
|
|
74
|
+
| JS/TS | StrykerJS | `npx stryker run` |
|
|
75
|
+
| Java/Kotlin (JVM) | PIT | `mvn org.pitest:pitest-maven:mutationCoverage` |
|
|
76
|
+
| Python | mutmut | `mutmut run`, then `mutmut results` |
|
|
77
|
+
| Rust | cargo-mutants | `cargo mutants` |
|
|
78
|
+
| PHP | Infection | `vendor/bin/infection` |
|
|
79
|
+
| C# | Stryker.NET | `dotnet stryker` |
|
|
80
|
+
|
|
81
|
+
- Scope it to the files you just tested; a full-repo run can take hours.
|
|
82
|
+
- For each surviving mutant: add or sharpen an assertion that kills it, or note it as equivalent (the change cannot alter behaviour).
|
|
83
|
+
- If no tool exists for the stack, do it by hand for the riskiest function: break one condition, run the tests, confirm one fails, revert.
|
|
84
|
+
|
|
85
|
+
## 5. Re-measure and lock in
|
|
86
|
+
|
|
87
|
+
1. Rerun the coverage command. Report before and after for the files you touched, line and branch.
|
|
88
|
+
2. If CI has a threshold, meet it. If it has none, suggest a ratchet (fail only if coverage drops) rather than an arbitrary target.
|
|
89
|
+
3. Run the full suite twice to check the new tests are deterministic.
|
|
90
|
+
|
|
91
|
+
## Rules
|
|
92
|
+
|
|
93
|
+
- Never delete, skip or weaken existing tests to change the number.
|
|
94
|
+
- Never add tests that assert current buggy behaviour without flagging it. If you find a bug, **stop and tell the user**, and write the test for the correct behaviour marked as expected-to-fail only if they agree.
|
|
95
|
+
- Never exclude risky code from coverage to raise the percentage.
|
|
96
|
+
- Don't chase 100 %. Stop when the risky list is covered and mutants are killed.
|
|
97
|
+
|
|
98
|
+
## Report back
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
Coverage: <line>% → <line>% lines, <branch>% → <branch>% branches (files touched)
|
|
102
|
+
Tests added: <file>: <test names>
|
|
103
|
+
Mutation: <killed>/<total> killed in <files>; survivors: <list or none>
|
|
104
|
+
Bugs found: <list or none>
|
|
105
|
+
Not covered, on purpose: <items and why>
|
|
106
|
+
Command: <exact commands run>
|
|
107
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Our coverage is stuck at 52% and CI wants 70, add tests where they actually matter",
|
|
4
|
+
"Which parts of the billing module have no tests? Fill the important gaps",
|
|
5
|
+
"Run mutation testing on the discount rules and tighten the tests that let mutants survive",
|
|
6
|
+
"We have 90% line coverage but bugs still slip through, make the tests mean something",
|
|
7
|
+
"Find the untested error-handling branches in src/payments and cover them"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Implement the CSV export feature test-first",
|
|
11
|
+
"Look at the tests in this PR and list the cases that are missing for the changed code",
|
|
12
|
+
"Add a Playwright test for the password reset journey",
|
|
13
|
+
"Benchmark the new JSON parser against the old one",
|
|
14
|
+
"Run the build, lint and tests and tell me if my branch is green"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: threat-modeling
|
|
3
|
+
description: STRIDE threat modelling for a planned feature or an existing system, done before or alongside the code. Maps the data flow, trust boundaries and assets, enumerates spoofing, tampering, repudiation, information disclosure, denial of service and elevation of privilege threats per element, and ends with a ranked list of mitigations the team can turn into tickets. Use when designing a feature that touches auth, money, personal data, uploads, webhooks or third-party integrations, when someone asks what could go wrong or how this could be attacked, or before a security sign-off on an architecture.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Reads design docs and code only; no tools required.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: security
|
|
9
|
+
kete-loom/risk: read-only
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Threat modelling (STRIDE)
|
|
14
|
+
|
|
15
|
+
Answer four questions for one feature or system: what are we building, what can go wrong, what are we doing about it, and did we do a good enough job. Keep it lightweight: one sitting, one document, a ranked list at the end. This skill designs defences; it does not review a diff line by line (use the security-review skill or the security-reviewer agent for that).
|
|
16
|
+
|
|
17
|
+
## 1. Set the scope
|
|
18
|
+
|
|
19
|
+
1. Name the one feature, service or flow being modelled. If the request is "the whole platform", **stop and ask** which flow matters most and model that first.
|
|
20
|
+
2. Collect what exists: design doc, ticket, API spec, architecture diagram, or the code if it is already built (search for route definitions, queue consumers, webhook handlers, cron jobs, outbound HTTP clients).
|
|
21
|
+
3. Note the assumptions you are making (hosting, who the users are, which parts are out of scope). List them in the output; a wrong assumption is the most common reason a model misses the real threat.
|
|
22
|
+
|
|
23
|
+
## 2. Draw the data flow
|
|
24
|
+
|
|
25
|
+
Write a text data-flow diagram. Use five element types:
|
|
26
|
+
|
|
27
|
+
| Element | Example |
|
|
28
|
+
|---|---|
|
|
29
|
+
| External entity | browser user, admin, partner API, payment provider |
|
|
30
|
+
| Process | API server, worker, Lambda, LLM agent with tools |
|
|
31
|
+
| Data store | Postgres, S3 bucket, Redis, log pipeline |
|
|
32
|
+
| Data flow | HTTPS request, queue message, webhook, file upload |
|
|
33
|
+
| Trust boundary | internet to edge, app to database, tenant A to tenant B, your code to a third party |
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
[User browser] --HTTPS (session cookie)--> (API) --SQL--> [(orders DB)]
|
|
37
|
+
======= boundary: internet | VPC =======
|
|
38
|
+
(API) --HTTPS (secret key)--> [Payment provider] --webhook (signed)--> (API)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Mark every place data crosses a trust boundary. Threats cluster there.
|
|
42
|
+
|
|
43
|
+
## 3. List the assets
|
|
44
|
+
|
|
45
|
+
What would hurt if stolen, changed or made unavailable: credentials and tokens, personal data, payment state, money movement, admin capability, availability of a critical path, audit logs, model prompts and tool permissions. Rate each **high, medium or low** by impact.
|
|
46
|
+
|
|
47
|
+
## 4. Walk STRIDE per element
|
|
48
|
+
|
|
49
|
+
For each element and each boundary-crossing flow, ask the questions that apply:
|
|
50
|
+
|
|
51
|
+
| Threat | Property broken | Applies to | Ask |
|
|
52
|
+
|---|---|---|---|
|
|
53
|
+
| **S**poofing | Authentication | entities, processes | Can someone pretend to be this user, service or webhook sender? |
|
|
54
|
+
| **T**ampering | Integrity | flows, stores, processes | Can input, a message, a file or a stored row be changed in transit or at rest? Can the client set a price, role or owner ID? |
|
|
55
|
+
| **R**epudiation | Non-repudiation | entities, processes | Could a user deny an action and we can't prove otherwise? Are security events logged with who, what, when? |
|
|
56
|
+
| **I**nformation disclosure | Confidentiality | flows, stores, processes | Can data leak via responses, errors, logs, URLs, caches, backups, other tenants, or an LLM's output? |
|
|
57
|
+
| **D**enial of service | Availability | flows, stores, processes | Can one caller exhaust CPU, memory, connections, queue depth, paid API quota or disk? Is there a rate limit and size limit? |
|
|
58
|
+
| **E**levation of privilege | Authorization | processes | Can a normal user reach admin actions, another tenant's data (IDOR), or code execution via injection or deserialisation? |
|
|
59
|
+
|
|
60
|
+
Rules while walking:
|
|
61
|
+
|
|
62
|
+
- Write each threat as **actor + action + asset + consequence**: "An unauthenticated caller replays a captured webhook to mark an unpaid order as paid."
|
|
63
|
+
- Only list threats that are plausible for this design. Skip a STRIDE letter for an element when it genuinely does not apply; don't pad.
|
|
64
|
+
- Check what already mitigates it (framework CSRF protection, signed webhooks, row-level security). Record it; a threat with a working control is still worth listing at low priority.
|
|
65
|
+
|
|
66
|
+
## 5. Rate and decide
|
|
67
|
+
|
|
68
|
+
Rate each threat with a simple likelihood x impact (each high, medium or low). Do not invent precise scores. Then pick one response:
|
|
69
|
+
|
|
70
|
+
- **Mitigate**: add a control (name the concrete one: "verify HMAC on raw body", "scope query by tenant_id", "argon2id hashing").
|
|
71
|
+
- **Eliminate**: remove the feature or data (don't store card numbers; don't log tokens).
|
|
72
|
+
- **Transfer**: move it to a provider built for it (hosted payment page, managed identity provider).
|
|
73
|
+
- **Accept**: only the user or owner can accept a risk. **Stop and ask** before marking anything high as accepted.
|
|
74
|
+
|
|
75
|
+
## 6. Check your work
|
|
76
|
+
|
|
77
|
+
- Every trust boundary has at least one threat considered.
|
|
78
|
+
- Every high asset has at least one threat and one control.
|
|
79
|
+
- Every mitigation is specific enough to become a ticket and to test.
|
|
80
|
+
- Re-read the assumptions: if one is false, which threats change?
|
|
81
|
+
|
|
82
|
+
## Never
|
|
83
|
+
|
|
84
|
+
- Never produce a generic OWASP list unrelated to the diagram.
|
|
85
|
+
- Never claim the system is secure; say what was modelled and what was not.
|
|
86
|
+
- Never mark a high risk as accepted on the user's behalf.
|
|
87
|
+
- Never include real secrets, hostnames or customer data from the codebase in the document.
|
|
88
|
+
|
|
89
|
+
## Output format
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
# Threat model: <feature>
|
|
93
|
+
Scope: <what is in and out> Date: <date>
|
|
94
|
+
Assumptions: <bulleted>
|
|
95
|
+
|
|
96
|
+
## Data flow
|
|
97
|
+
<text diagram with trust boundaries marked>
|
|
98
|
+
|
|
99
|
+
## Assets
|
|
100
|
+
| Asset | Impact |
|
|
101
|
+
|
|
102
|
+
## Threats
|
|
103
|
+
| ID | STRIDE | Element / flow | Threat (actor, action, asset, consequence) | Existing control | L | I | Response |
|
|
104
|
+
|
|
105
|
+
## Prioritised mitigations
|
|
106
|
+
1. [high] T3, T7: <concrete control> (owner: ?, test: <how to prove it works>)
|
|
107
|
+
2. ...
|
|
108
|
+
|
|
109
|
+
## Open questions
|
|
110
|
+
<things only the team can answer>
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Order the mitigations by risk (high likelihood and high impact first), and group threats fixed by one control into a single line.
|