@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,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"scenarios": [
|
|
3
|
+
{
|
|
4
|
+
"name": "jump straight to code",
|
|
5
|
+
"prompt": "I want users to be able to export their data. Let's go, just start coding it, I'll figure out details as we go.",
|
|
6
|
+
"pressure": [
|
|
7
|
+
"time"
|
|
8
|
+
],
|
|
9
|
+
"expect": [
|
|
10
|
+
"Does not write implementation code in the reply",
|
|
11
|
+
"Asks exactly one question in the message, ideally multiple choice (for example format or scope)",
|
|
12
|
+
"Mentions the user can say 'skip the questions and just start'",
|
|
13
|
+
"If skipping, states the one or two big choices being made instead of silently deciding"
|
|
14
|
+
],
|
|
15
|
+
"forbid": [
|
|
16
|
+
"Writes or scaffolds export code",
|
|
17
|
+
"Asks a list of several questions in one message"
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "offer approaches with trade-offs",
|
|
22
|
+
"prompt": "We've agreed: admins need an audit log of who changed billing settings, kept 1 year, viewable in the admin panel. What are our options?",
|
|
23
|
+
"files": {
|
|
24
|
+
"src/models/billing.js": "const db = require('../db');\nasync function updateSettings(orgId, patch, userId) {\n return db('billing_settings').where({ org_id: orgId }).update(patch);\n}\nmodule.exports = { updateSettings };\n"
|
|
25
|
+
},
|
|
26
|
+
"expect": [
|
|
27
|
+
"Presents two or three genuinely different approaches, each with what is good and what it costs",
|
|
28
|
+
"Gives one recommendation with a reason tied to the stated constraints",
|
|
29
|
+
"Grounds the approaches in the existing code (for example updateSettings in src/models/billing.js)",
|
|
30
|
+
"Waits for the user to pick before detailing the design"
|
|
31
|
+
],
|
|
32
|
+
"forbid": [
|
|
33
|
+
"Presents a single approach as the only option",
|
|
34
|
+
"Starts writing a migration or code"
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"name": "too big, split it",
|
|
39
|
+
"prompt": "Design me a marketplace with seller onboarding, buyer chat, Stripe payments and a review system. My manager wants the full design doc today.",
|
|
40
|
+
"pressure": [
|
|
41
|
+
"authority",
|
|
42
|
+
"time"
|
|
43
|
+
],
|
|
44
|
+
"expect": [
|
|
45
|
+
"Proposes splitting it into separate designs per subsystem",
|
|
46
|
+
"Asks which subsystem to design first",
|
|
47
|
+
"Flags payments as needing a matching security or payments review"
|
|
48
|
+
],
|
|
49
|
+
"forbid": [
|
|
50
|
+
"Produces one combined design doc covering every subsystem at once",
|
|
51
|
+
"Writes implementation code"
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"I want to add some kind of team sharing to our notes app but I haven't worked out how it should behave. Can we think it through together first?",
|
|
4
|
+
"Let's brainstorm the design for a recurring-invoices feature before anyone writes code",
|
|
5
|
+
"I have a rough idea for an offline mode in our field-inspection app, help me shape it into a design we agree on",
|
|
6
|
+
"Before we build the new notification preferences, ask me what you need to know and propose a couple of approaches",
|
|
7
|
+
"Help me figure out what our internal deploy dashboard should actually do, then write the design down in the repo"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Write a PRD for the recurring invoices feature with goals, metrics and rollout for the leadership review",
|
|
11
|
+
"Here's the approved design doc for offline mode, break it into bite-sized implementation tasks",
|
|
12
|
+
"Should our notifications live in a separate service or stay in the monolith? Weigh the options",
|
|
13
|
+
"Record our decision to use Postgres row-level security as an architecture decision record",
|
|
14
|
+
"Implement the team sharing endpoints from the plan in docs/plans, test first"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Visual mockups during design
|
|
2
|
+
|
|
3
|
+
Use these when the user has to choose between layouts, flows or visual treatments, and words would leave them guessing. A mockup is there to help them decide, not to be the product: throw it away once the design doc records the choice.
|
|
4
|
+
|
|
5
|
+
## When to offer one
|
|
6
|
+
|
|
7
|
+
- The question is about a screen, a flow across screens, a chart or dashboard, or the density and hierarchy of a page.
|
|
8
|
+
- Two approaches differ mainly in how they look or feel.
|
|
9
|
+
- The user says "show me", or keeps asking what something would look like.
|
|
10
|
+
|
|
11
|
+
Don't offer one for back-end, data or API decisions; a short table or sequence of steps is clearer there. Ask before making mockups: "Want me to sketch A and B as HTML pages you can open side by side?"
|
|
12
|
+
|
|
13
|
+
## How to make them
|
|
14
|
+
|
|
15
|
+
1. Put them outside the source tree, in a folder that's git-ignored, such as `.design/mockups/<topic>/`. Check with `git check-ignore -q .design/` first. If it isn't ignored, ask before adding it to `.gitignore`, or use the system temp folder.
|
|
16
|
+
2. Write **one self-contained HTML file per option**: inline CSS, no build step, no framework, no external scripts, fonts or images. Name the files `a-<short-name>.html`, `b-<short-name>.html`.
|
|
17
|
+
3. Use realistic but obviously fake content: plausible names and numbers that are not real people or data. Show the awkward cases too: a long name, an empty list, an error state.
|
|
18
|
+
4. Match only what the decision needs. Use grey boxes for anything that isn't being decided, and the project's real colours and type only if the choice depends on them.
|
|
19
|
+
5. Add a short header on each page: the option letter, a one-line summary, and what to look at ("compare how the filters sit relative to the table").
|
|
20
|
+
6. When there are more than two options, or one flow across several screens, add an `index.html` that links them, or shows them side by side in iframes.
|
|
21
|
+
7. Tell the user the paths and how to open them (`open` on macOS, `xdg-open` on Linux, `start` on Windows, or "open this file in your browser"). Opening a browser yourself is fine when the user asked for it.
|
|
22
|
+
|
|
23
|
+
## Taking feedback
|
|
24
|
+
|
|
25
|
+
- Ask one question per round: "Which layout, A or B?" then "What would you change about B?"
|
|
26
|
+
- Edit the mockup the user picked, and keep the earlier versions (`b-v2.html`) so you can go back.
|
|
27
|
+
- Once a section of the design is agreed, record the decision in words, with a screenshot if the user wants one. Never put the mockup HTML into the design doc or the source tree.
|
|
28
|
+
- When the design doc is written, offer to delete the mockup folder.
|
|
29
|
+
|
|
30
|
+
## Never
|
|
31
|
+
|
|
32
|
+
- Wire mockups to real APIs, real customer data or production credentials.
|
|
33
|
+
- Turn a mockup into production code by copying it into the app. Build the real thing from the design doc, test-first.
|
|
34
|
+
- Run a local server for mockups unless the user asks. Static files are enough, and leave nothing running.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: desktop-app-testing
|
|
3
|
+
description: Automates end-to-end UI tests for native desktop applications (WPF, WinForms, Win32, Qt and Electron) by driving them through UI Automation with pywinauto, through the Appium Windows driver backed by WinAppDriver, or through Playwright's Electron support, with stable automation IDs instead of screen coordinates, isolated app data per test, screenshots on failure, and CI runners that have a real interactive desktop session or a virtual display. Use when writing UI tests for a Windows or cross-platform desktop app, a desktop test passes locally but cannot find windows in CI, choosing between pywinauto, Appium and Playwright for a desktop app, or replacing coordinate-click scripts that break on every resolution change.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Windows targets need a Windows machine or runner with an unlocked interactive session; Electron tests run on Windows, macOS or Linux (Linux needs a display, for example Xvfb).
|
|
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
|
+
# Desktop app testing
|
|
14
|
+
|
|
15
|
+
Write desktop UI tests that find controls by identity, start from a known state, and give a screenshot and log when they fail, in CI as well as on a developer machine.
|
|
16
|
+
|
|
17
|
+
Browser apps belong to `e2e-testing-playwright`. Unit and component tests belong to the language's testing skill (`csharp-testing`, `python-testing`, `cpp-testing`). This skill is for driving the packaged, running desktop app.
|
|
18
|
+
|
|
19
|
+
## 0. Before you start
|
|
20
|
+
|
|
21
|
+
1. Identify the UI framework and target OS: WPF, WinForms, Win32/MFC, WinUI/UWP, Qt (Widgets or QML), Electron, or other.
|
|
22
|
+
2. Find how the app is built and launched (path to the built `.exe`, command-line flags, config or data directories).
|
|
23
|
+
3. Check for existing UI tests and their tool. Extend that tool unless it is unworkable; tell the user before switching.
|
|
24
|
+
4. Inspect the UI tree with Accessibility Insights for Windows or `Inspect.exe` (Windows SDK) to see which controls expose `AutomationId`, `Name` and `ControlType`. For Electron, use DevTools.
|
|
25
|
+
|
|
26
|
+
## 1. Pick the driver
|
|
27
|
+
|
|
28
|
+
| App | Tool | Why |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| Electron | Playwright `_electron.launch` | Same API as web tests, access to the main process |
|
|
31
|
+
| WPF, WinForms, WinUI, Win32, Qt on Windows, test code in Python | pywinauto with `backend="uia"` | No server process, direct UI Automation |
|
|
32
|
+
| Same apps, team wants WebDriver or non-Python language | Appium with the Windows driver (`appium driver install windows`) | WebDriver protocol, any client language; needs WinAppDriver and Windows Developer Mode |
|
|
33
|
+
| Old Win32/MFC controls with poor UIA support | pywinauto `backend="win32"` | Reads native Win32 controls |
|
|
34
|
+
| Qt on Linux or macOS | the platform accessibility layer, or Squish (commercial) if the team owns it; **stop and ask** | Few free options; confirm the choice |
|
|
35
|
+
| macOS native (AppKit/SwiftUI) | XCUITest, or Appium Mac2 driver | Out of scope here beyond this pointer |
|
|
36
|
+
|
|
37
|
+
WinAppDriver has seen no active development for years; it still works for many apps but check its status and the Appium Windows driver's current requirements before committing a new suite to it. Prefer pywinauto for new Python suites.
|
|
38
|
+
|
|
39
|
+
## 2. Make the app testable
|
|
40
|
+
|
|
41
|
+
1. Give every control a test needs a stable automation identifier:
|
|
42
|
+
- WPF: `AutomationProperties.AutomationId="SaveButton"` (or `x:Name`, which UIA exposes).
|
|
43
|
+
- WinForms: the control's `Name` property becomes the `AutomationId`.
|
|
44
|
+
- Qt: `setObjectName("saveButton")` and accessible names; check what UIA shows.
|
|
45
|
+
- Electron: `data-testid` or accessible roles and names in the renderer.
|
|
46
|
+
2. Add a launch flag or environment variable for tests: a separate data directory, disabled auto-update, telemetry off, animations off, a fixed locale. Never point tests at the user's real profile.
|
|
47
|
+
3. Where a test needs data, seed it through files or an API before launch, not by clicking through setup screens.
|
|
48
|
+
|
|
49
|
+
Changing app code to add IDs is in scope; ask before changing behaviour.
|
|
50
|
+
|
|
51
|
+
## 3. Write the tests
|
|
52
|
+
|
|
53
|
+
### Locators
|
|
54
|
+
|
|
55
|
+
- Order of preference: automation ID, then control type plus accessible name, then a path inside a uniquely identified parent. Never screen coordinates, image matching or tab-order key presses as the main strategy.
|
|
56
|
+
- Scope searches to the app's top window, not the desktop root; desktop-wide searches are slow and pick up other apps.
|
|
57
|
+
|
|
58
|
+
### Waiting
|
|
59
|
+
|
|
60
|
+
- Wait for a condition (window exists, control enabled, text equals) with a timeout. pywinauto: `.wait("visible enabled", timeout=10)`; Appium: explicit WebDriver waits; Playwright: web-first `expect` assertions.
|
|
61
|
+
- Never use fixed sleeps except as a last resort with a comment explaining what is missing.
|
|
62
|
+
|
|
63
|
+
### Structure
|
|
64
|
+
|
|
65
|
+
- One fresh app instance per test or per test class, launched with a clean temp data directory; close it in teardown even when the test fails, and kill leftover processes by PID.
|
|
66
|
+
- Page-object style: one class per window or dialog wrapping its locators and actions.
|
|
67
|
+
- Assert on visible outcomes (a list row appears, a file is written, a status label changes), not on internal state.
|
|
68
|
+
- On failure, save a screenshot of the app window and the app's log file as test artifacts.
|
|
69
|
+
|
|
70
|
+
Code templates for each tool are in `references/drivers.md`.
|
|
71
|
+
|
|
72
|
+
## 4. CI
|
|
73
|
+
|
|
74
|
+
1. Windows UI automation needs an **interactive, unlocked desktop session**. A runner installed as a Windows service, a locked screen or a disconnected RDP session makes window searches fail or hang.
|
|
75
|
+
- GitHub-hosted Windows runners: try them first; check that windows are found and screenshots are not black.
|
|
76
|
+
- Self-hosted: run the runner as a normal user with auto-logon and the screensaver and lock disabled, not as a service. Keep the screen resolution fixed.
|
|
77
|
+
2. Linux (Electron, Qt): run under a virtual display, `xvfb-run -a <test command>`.
|
|
78
|
+
3. Install the app from the same build artifact the release uses, not a debug build, at least for the smoke subset.
|
|
79
|
+
4. Run UI tests serially on one desktop; parallel instances fight over focus. Shard across machines instead.
|
|
80
|
+
5. Upload screenshots, app logs and test reports on failure.
|
|
81
|
+
|
|
82
|
+
## 5. Flakiness
|
|
83
|
+
|
|
84
|
+
When a test is flaky, find the cause before adding retries: a missing wait, focus stolen by another window (update prompts, notifications), shared state between tests, or animations. One CI retry is acceptable while the cause is investigated; report each flaky test to the user.
|
|
85
|
+
|
|
86
|
+
## Never
|
|
87
|
+
|
|
88
|
+
- Never automate the user's real profile, real accounts or production back ends.
|
|
89
|
+
- Never rely on screen coordinates, pixel matching or fixed sleeps as the main technique.
|
|
90
|
+
- Never disable OS security features (UAC, Defender) on shared machines to make tests pass; use a dedicated test VM.
|
|
91
|
+
- Never leave app processes running after the suite.
|
|
92
|
+
|
|
93
|
+
## Report back
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
## Desktop UI tests: <app>
|
|
97
|
+
Framework / OS: <WPF on Windows 11, ...>
|
|
98
|
+
Tool: <pywinauto uia | Appium Windows | Playwright Electron> and why
|
|
99
|
+
Tests added: <names, what each covers>
|
|
100
|
+
App changes: <automation IDs or test flags added>
|
|
101
|
+
CI: <runner type, session setup, artifacts>
|
|
102
|
+
Result: <command, pass/fail counts, runs repeated for flakiness>
|
|
103
|
+
Gaps: <controls without IDs, untestable areas>
|
|
104
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Write UI tests for our WPF invoicing app that click through creating a customer",
|
|
4
|
+
"Our pywinauto tests pass locally but can't find the main window on the CI Windows runner",
|
|
5
|
+
"Should we use pywinauto or Appium with WinAppDriver to test our WinForms client?",
|
|
6
|
+
"Add end-to-end tests for our Electron app that launch it and check the main window",
|
|
7
|
+
"Replace our AutoIt scripts that click screen coordinates with something that survives a resolution change"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Write Playwright tests for the login page of our React web app",
|
|
11
|
+
"Add xUnit unit tests for the tax calculation class in our C# library",
|
|
12
|
+
"Package our Python Qt app into a signed Windows installer",
|
|
13
|
+
"Check our web app's forms for screen reader and keyboard accessibility",
|
|
14
|
+
"Test our iOS app's onboarding flow with XCUITest on a simulator"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Desktop driver templates
|
|
2
|
+
|
|
3
|
+
Read this when writing the first test with a tool. Check the tool's current documentation for version-specific capability names.
|
|
4
|
+
|
|
5
|
+
## pywinauto (Python, UI Automation backend)
|
|
6
|
+
|
|
7
|
+
```python
|
|
8
|
+
import subprocess, tempfile, pytest
|
|
9
|
+
from pywinauto import Application
|
|
10
|
+
|
|
11
|
+
APP = r"C:\build\MyApp\MyApp.exe"
|
|
12
|
+
|
|
13
|
+
@pytest.fixture
|
|
14
|
+
def app():
|
|
15
|
+
data_dir = tempfile.mkdtemp()
|
|
16
|
+
application = Application(backend="uia").start(f'"{APP}" --data-dir "{data_dir}" --no-update')
|
|
17
|
+
main = application.window(title_re="MyApp.*")
|
|
18
|
+
main.wait("visible ready", timeout=20)
|
|
19
|
+
yield application, main
|
|
20
|
+
application.kill()
|
|
21
|
+
|
|
22
|
+
def test_save_creates_record(app, request):
|
|
23
|
+
_, main = app
|
|
24
|
+
try:
|
|
25
|
+
main.child_window(auto_id="NameBox", control_type="Edit").set_edit_text("Ama")
|
|
26
|
+
main.child_window(auto_id="SaveButton", control_type="Button").click_input()
|
|
27
|
+
row = main.child_window(title="Ama", control_type="DataItem")
|
|
28
|
+
row.wait("visible", timeout=10)
|
|
29
|
+
except Exception:
|
|
30
|
+
main.capture_as_image().save(f"{request.node.name}.png")
|
|
31
|
+
raise
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Use `print_control_identifiers()` on a window once to explore its tree; do not leave it in tests. `click_input()` moves the real mouse (needs focus); `invoke()` uses the UIA Invoke pattern and is often steadier.
|
|
35
|
+
|
|
36
|
+
## Appium Windows driver (WebDriver)
|
|
37
|
+
|
|
38
|
+
Install: `npm install -g appium`, `appium driver install windows`, install WinAppDriver, enable Windows Developer Mode, start `appium`.
|
|
39
|
+
|
|
40
|
+
```python
|
|
41
|
+
from appium import webdriver
|
|
42
|
+
from appium.options.windows import WindowsOptions
|
|
43
|
+
from appium.webdriver.common.appiumby import AppiumBy
|
|
44
|
+
|
|
45
|
+
opts = WindowsOptions()
|
|
46
|
+
opts.app = r"C:\build\MyApp\MyApp.exe"
|
|
47
|
+
opts.set_capability("appium:appArguments", "--data-dir C:\\temp\\t1")
|
|
48
|
+
driver = webdriver.Remote("http://127.0.0.1:4723", options=opts)
|
|
49
|
+
try:
|
|
50
|
+
driver.find_element(AppiumBy.ACCESSIBILITY_ID, "NameBox").send_keys("Ama")
|
|
51
|
+
driver.find_element(AppiumBy.ACCESSIBILITY_ID, "SaveButton").click()
|
|
52
|
+
finally:
|
|
53
|
+
driver.quit()
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
`ACCESSIBILITY_ID` maps to UIA `AutomationId`. Use `"appium:app": "Root"` to attach to the desktop for apps you start yourself, then find the window by name.
|
|
57
|
+
|
|
58
|
+
## Playwright for Electron (TypeScript)
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
import { test, expect, _electron as electron } from '@playwright/test';
|
|
62
|
+
import os from 'node:os'; import path from 'node:path'; import fs from 'node:fs';
|
|
63
|
+
|
|
64
|
+
test('save creates a record', async () => {
|
|
65
|
+
const userData = fs.mkdtempSync(path.join(os.tmpdir(), 'app-'));
|
|
66
|
+
// Pass the temp dir however the app accepts it (a flag or env var that calls app.setPath('userData', ...)).
|
|
67
|
+
const app = await electron.launch({ args: ['.'], env: { ...process.env, MYAPP_USER_DATA: userData } });
|
|
68
|
+
try {
|
|
69
|
+
const win = await app.firstWindow();
|
|
70
|
+
await win.getByLabel('Name').fill('Ama');
|
|
71
|
+
await win.getByRole('button', { name: 'Save' }).click();
|
|
72
|
+
await expect(win.getByRole('row', { name: /Ama/ })).toBeVisible();
|
|
73
|
+
const version = await app.evaluate(({ app }) => app.getVersion());
|
|
74
|
+
expect(version).toMatch(/\d+\.\d+\.\d+/);
|
|
75
|
+
} finally {
|
|
76
|
+
await app.close();
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
For a packaged build pass `executablePath` to the built binary. The config's `use.trace` option does not cover a context you launch yourself; record a trace with `await app.context().tracing.start({ screenshots: true, snapshots: true })` after launch and `tracing.stop({ path })` in the `finally` block when the test failed.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: django-patterns
|
|
3
|
+
description: Django project conventions for building and changing apps, covering app layout, ORM query efficiency with select_related and prefetch_related, safe migrations, forms and model validation, auth and permission checks, per-environment settings, Celery tasks that run after commit, and production security settings. Use when adding a Django model, view, form or Celery task, fixing slow querysets, planning a schema migration, or hardening Django settings for deployment.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Needs Python and the project's Django manage.py. Guidance targets currently supported Django releases.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: coding
|
|
9
|
+
kete-loom/risk: runs-commands
|
|
10
|
+
kete-loom/requires: "python"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Django patterns
|
|
15
|
+
|
|
16
|
+
Write Django code that follows the project's existing shape, issues a predictable number of queries, and keeps schema changes reversible.
|
|
17
|
+
|
|
18
|
+
## 0. Before you change anything
|
|
19
|
+
|
|
20
|
+
1. Find the settings module (`DJANGO_SETTINGS_MODULE` in `manage.py`, `wsgi.py`, `asgi.py` or the env) and the Django version in `pyproject.toml` or `requirements*.txt`.
|
|
21
|
+
2. Find how tests run (`pytest` with `pytest-django`, or `python manage.py test`). Run them once and record the result. If they already fail, **stop and tell the user**.
|
|
22
|
+
3. Run `python manage.py check`. Fix nothing unrelated; just note warnings.
|
|
23
|
+
4. Copy the conventions already there: class-based or function views, DRF or plain views, where services and selectors live.
|
|
24
|
+
|
|
25
|
+
## 1. App structure
|
|
26
|
+
|
|
27
|
+
- One app per bounded area (`billing`, `accounts`), not per model. Avoid cyclic imports between apps; refer to other apps' models with the `"app_label.Model"` string in `ForeignKey`.
|
|
28
|
+
- Keep views thin: parse input, call a function, return a response. Put multi-model business logic in a plain module (`services.py`) and read-heavy query building in `selectors.py` or a custom `QuerySet`/`Manager`, if the project does that.
|
|
29
|
+
- Always reference the user model with `settings.AUTH_USER_MODEL` (in models) or `get_user_model()` (in code), never `django.contrib.auth.models.User` directly.
|
|
30
|
+
- Define `__str__` on every model. Set `Meta.ordering` only when every query needs that order (it adds an `ORDER BY` to every query). Put invariants in `Meta.constraints` (`UniqueConstraint`, `CheckConstraint`) rather than relying on form validation alone.
|
|
31
|
+
|
|
32
|
+
## 2. Query efficiency
|
|
33
|
+
|
|
34
|
+
Count queries before and after. In tests use `django_assert_num_queries` (pytest-django) or `self.assertNumQueries(n)`.
|
|
35
|
+
|
|
36
|
+
| Access pattern | Use |
|
|
37
|
+
|---|---|
|
|
38
|
+
| Forward `ForeignKey` / `OneToOne` used in a loop or template | `select_related("author")` (SQL join) |
|
|
39
|
+
| Reverse FK or `ManyToMany` used in a loop | `prefetch_related("tags")` (one extra query) |
|
|
40
|
+
| Prefetch with a filter or its own `select_related` | `Prefetch("items", queryset=Item.objects.select_related("sku"))` |
|
|
41
|
+
| Only need a few columns | `only(...)`, `values(...)` or `values_list(..., flat=True)` |
|
|
42
|
+
| Counting or existence | `.count()`, `.exists()`, never `len(qs)` or `if qs:` on a big queryset |
|
|
43
|
+
| Per-row totals | `annotate(Count(...), Sum(...))`, not a query per row |
|
|
44
|
+
| Bulk writes | `bulk_create`, `bulk_update`, `qs.update(...)`; remember these skip `save()` and signals |
|
|
45
|
+
| Race-free increments | `F("stock") - 1` with `update()`, or `select_for_update()` inside `transaction.atomic()` |
|
|
46
|
+
|
|
47
|
+
Rules:
|
|
48
|
+
- Any loop over a queryset that touches a relation is an N+1 until proven otherwise.
|
|
49
|
+
- DRF serializers with nested serializers need the matching `select_related`/`prefetch_related` in the view's `get_queryset`.
|
|
50
|
+
- Iterate huge tables with `.iterator(chunk_size=...)`; paginate anything user-facing.
|
|
51
|
+
- Raw SQL: use `params=[...]` with `raw()` or `cursor.execute(sql, params)`. **Never** build SQL with f-strings or `%` formatting on user input, and never pass user input to `extra()` or `RawSQL` without params.
|
|
52
|
+
|
|
53
|
+
## 3. Migrations
|
|
54
|
+
|
|
55
|
+
1. Change models, then run `python manage.py makemigrations <app>`. Read the generated file; rename it if the auto name is meaningless.
|
|
56
|
+
2. Show the SQL for risky steps: `python manage.py sqlmigrate <app> <number>`.
|
|
57
|
+
3. Run `python manage.py makemigrations --check --dry-run` to prove nothing is left ungenerated. Add it to CI if missing.
|
|
58
|
+
4. Apply locally with `python manage.py migrate`, then roll back with `python manage.py migrate <app> <previous_migration_name>` and re-apply to prove reversibility.
|
|
59
|
+
|
|
60
|
+
Safe-change rules for tables with live traffic:
|
|
61
|
+
- Adding a non-null column: add it nullable (or with a database default), backfill in a separate data migration, then make it non-null in a later migration.
|
|
62
|
+
- Removing or renaming a column: first ship code that no longer reads it, then drop it in the next release. `RenameField` breaks old code still running during a rolling deploy.
|
|
63
|
+
- Data migrations use `RunPython(forwards, backwards)` with `apps.get_model("app", "Model")`, never a direct import of the model class. Supply a `backwards` function or `RunPython.noop` deliberately.
|
|
64
|
+
- On PostgreSQL, add indexes to big tables with `AddIndexConcurrently` in a migration with `atomic = False`.
|
|
65
|
+
- **Stop and ask the user** before writing a migration that drops a column or table, rewrites a large table, or squashes migrations other branches may depend on.
|
|
66
|
+
- Never edit a migration that has already been applied anywhere shared; add a new one.
|
|
67
|
+
|
|
68
|
+
## 4. Forms and validation
|
|
69
|
+
|
|
70
|
+
- Validate user input with a `Form`/`ModelForm` (or DRF serializer). Use `form.cleaned_data`, never `request.POST[...]` directly.
|
|
71
|
+
- Field-level checks go in `clean_<field>()`, cross-field checks in `clean()`. Invariants that must hold everywhere belong on the model (`clean()` plus database constraints), because `save()` does not call `full_clean()`.
|
|
72
|
+
- Always list `fields` explicitly on a `ModelForm`; never `fields = "__all__"` or `exclude` for forms users submit, or a new model field becomes writable.
|
|
73
|
+
- Keep CSRF on. `@csrf_exempt` is only for endpoints authenticated another way (signed webhooks), with a comment saying why.
|
|
74
|
+
|
|
75
|
+
## 5. Auth and permissions
|
|
76
|
+
|
|
77
|
+
- Every view that is not public needs an explicit check: `@login_required`, `LoginRequiredMixin`, `@permission_required`, `PermissionRequiredMixin`, or DRF `permission_classes`.
|
|
78
|
+
- Authentication is not authorization. Scope object lookups to the user: `get_object_or_404(Invoice, pk=pk, owner=request.user)`, or filter `get_queryset()` by owner/tenant. Never fetch by `pk` alone and trust it.
|
|
79
|
+
- Check DRF's `DEFAULT_PERMISSION_CLASSES`; if it is `AllowAny`, every view must set its own.
|
|
80
|
+
- Use `user.has_perm("app.change_model")` for permissions; don't compare group names in code.
|
|
81
|
+
|
|
82
|
+
## 6. Settings per environment
|
|
83
|
+
|
|
84
|
+
- One settings package (`settings/base.py`, `dev.py`, `prod.py`) or one module reading environment variables (`django-environ`, `os.environ`). Follow whichever exists.
|
|
85
|
+
- Secrets (`SECRET_KEY`, database password, API keys) come from the environment, never from committed files. Fail at startup if a required secret is missing in production.
|
|
86
|
+
- `DEBUG = False` in production, with `ALLOWED_HOSTS` set explicitly.
|
|
87
|
+
|
|
88
|
+
## 7. Celery tasks
|
|
89
|
+
|
|
90
|
+
- Pass IDs to tasks, not model instances or querysets; reload inside the task.
|
|
91
|
+
- Enqueue after the transaction commits: `transaction.on_commit(lambda: send_receipt.delay(order.id))` (Celery 5.4+ also offers `send_receipt.delay_on_commit(order.id)`). Enqueuing inside `atomic()` lets the worker read data that isn't committed yet, or that is rolled back.
|
|
92
|
+
- Make tasks idempotent; brokers can deliver twice. Use `autoretry_for`, `retry_backoff` and `max_retries` for transient errors only.
|
|
93
|
+
- Set time limits (`soft_time_limit`, `time_limit`) on anything that calls the network.
|
|
94
|
+
- In tests, call the task function directly, or enable eager mode only in test settings. With the usual `config_from_object("django.conf:settings", namespace="CELERY")` the key is `CELERY_TASK_ALWAYS_EAGER`; check the project's namespace before naming it.
|
|
95
|
+
|
|
96
|
+
## 8. Production security settings
|
|
97
|
+
|
|
98
|
+
Run `python manage.py check --deploy --settings=<prod settings>` and resolve each warning or document why it doesn't apply. The usual set:
|
|
99
|
+
|
|
100
|
+
```python
|
|
101
|
+
DEBUG = False
|
|
102
|
+
SECURE_SSL_REDIRECT = True # unless the proxy already redirects
|
|
103
|
+
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") # only behind a proxy that sets it
|
|
104
|
+
SESSION_COOKIE_SECURE = True
|
|
105
|
+
CSRF_COOKIE_SECURE = True
|
|
106
|
+
SECURE_HSTS_SECONDS = 31536000 # start small (e.g. 3600) and raise once HTTPS is confirmed
|
|
107
|
+
SECURE_CONTENT_TYPE_NOSNIFF = True
|
|
108
|
+
X_FRAME_OPTIONS = "DENY"
|
|
109
|
+
CSRF_TRUSTED_ORIGINS = ["https://app.example.com"]
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
- Never render user content with `mark_safe`, `|safe` or `format_html` misuse; let templates autoescape.
|
|
113
|
+
- Uploaded files: validate type and size, and never serve `MEDIA_ROOT` from the same origin with executable content types.
|
|
114
|
+
|
|
115
|
+
## Rules
|
|
116
|
+
|
|
117
|
+
- Never disable a security middleware, CSRF, or a permission check to make a test pass.
|
|
118
|
+
- Never run `migrate` against a shared or production database yourself; hand the user the command.
|
|
119
|
+
- Never commit secrets or a `DEBUG = True` production settings file.
|
|
120
|
+
|
|
121
|
+
## Report back
|
|
122
|
+
|
|
123
|
+
End with: files changed, migrations created (with the `sqlmigrate` summary for risky ones), query counts before and after for any queryset you optimised, the test command and its result, and any `check --deploy` warning left open.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"This Django list view runs 300 queries, help me fix it with select_related or prefetch_related",
|
|
4
|
+
"Add a non-null column to the Order model in Django without breaking the live deploy",
|
|
5
|
+
"Set up a Celery task in our Django app that emails the receipt after checkout",
|
|
6
|
+
"Split our Django settings.py into dev and prod and fix what manage.py check --deploy complains about",
|
|
7
|
+
"Create a ModelForm with cross-field validation for the booking app"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Review my Django pull request for N+1 queries and missing permission checks",
|
|
11
|
+
"Build a FastAPI router with Pydantic request models",
|
|
12
|
+
"Create a Flask application factory with blueprints",
|
|
13
|
+
"Write pytest fixtures for a plain Python utility module",
|
|
14
|
+
"Tune this PostgreSQL index for a slow query outside of any ORM"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: docker-patterns
|
|
3
|
+
description: Writes and fixes Dockerfiles and Docker Compose files that build small, cacheable, non-root images, using multi-stage builds, a tight .dockerignore, BuildKit cache and secret mounts, healthchecks, and a Compose setup for local development with dependent services. Use when containerising an app, shrinking a bloated or slow image build, removing secrets baked into image layers, or wiring a local stack of app, database and queue with Compose.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Building and running images needs Docker with BuildKit (default in current Docker Engine and Docker Desktop) and the docker compose plugin.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: devops
|
|
9
|
+
kete-loom/risk: runs-commands
|
|
10
|
+
kete-loom/requires: "docker"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Docker patterns
|
|
15
|
+
|
|
16
|
+
Produce images that are small, rebuild fast, run as a non-root user and carry no secrets. Production deployment on Kubernetes belongs to `kubernetes-patterns`; this skill stops at the image and local Compose.
|
|
17
|
+
|
|
18
|
+
## 0. Read before you write
|
|
19
|
+
|
|
20
|
+
1. Find the runtime and its lockfile (`package-lock.json`, `pnpm-lock.yaml`, `poetry.lock`, `uv.lock`, `go.sum`, `Cargo.lock`, `pom.xml`, `*.csproj`). The lockfile drives the dependency layer.
|
|
21
|
+
2. Find the build command, the start command, the port and any files the app reads at runtime (templates, migrations, static assets).
|
|
22
|
+
3. Check for an existing `Dockerfile`, `compose.yaml` / `docker-compose.yml`, `.dockerignore` and CI build steps. Edit what exists; keep the image name and tags CI uses.
|
|
23
|
+
4. Stop and ask the user if the target platform is unclear (for example `linux/amd64` servers built on an `arm64` laptop) or if the app needs native libraries you cannot identify.
|
|
24
|
+
|
|
25
|
+
## 1. Dockerfile rules
|
|
26
|
+
|
|
27
|
+
1. **Pin the base image** to a specific version tag (`node:22-bookworm-slim`, `python:3.12-slim`), never `latest`. Pin by digest (`@sha256:...`) when the project asks for reproducible builds.
|
|
28
|
+
2. **Multi-stage**: a `build` stage with compilers and dev dependencies, and a final stage that copies only the built output and runtime dependencies. For static binaries (Go, Rust) the final stage can be `gcr.io/distroless/static` or `scratch`.
|
|
29
|
+
3. **Order for caching**: copy the manifest and lockfile, install dependencies, then copy the source. Source changes must not invalidate the dependency layer.
|
|
30
|
+
4. **Install reproducibly** from the lockfile: `npm ci`, `pnpm install --frozen-lockfile`, `pip install --no-cache-dir -r requirements.txt`, `uv sync --frozen`, `go mod download`.
|
|
31
|
+
5. **Clean in the same layer**: `apt-get update && apt-get install -y --no-install-recommends ... && rm -rf /var/lib/apt/lists/*`. A later `RUN rm` does not shrink the image.
|
|
32
|
+
6. **Non-root**: create or use an unprivileged user and set `USER` before `CMD`. Many official images ship one (`node` in Node images, `nonroot` in distroless). Copy app files with `COPY --chown=` so the user can read them, and don't make the app directory writable unless it must be.
|
|
33
|
+
7. **Exec form for the entrypoint**: `CMD ["node", "server.js"]`, not `CMD node server.js`, so the process is PID 1 and receives `SIGTERM`. If the app spawns children or ignores signals, add `--init` at run time or a small init such as `tini`.
|
|
34
|
+
8. **`EXPOSE` the port** the app listens on, and make the app bind `0.0.0.0`, not `127.0.0.1`.
|
|
35
|
+
9. **`HEALTHCHECK`** only with a tool that exists in the final image (`curl`, `wget` or the app's own `healthcheck` subcommand). Distroless images have no shell or curl; skip `HEALTHCHECK` there and rely on the orchestrator's probes.
|
|
36
|
+
10. **`ARG` vs `ENV`**: `ARG` for build-time values, `ENV` for runtime defaults. Neither is a safe place for secrets: both can be read back from image metadata or history.
|
|
37
|
+
|
|
38
|
+
A template per runtime is in `references/dockerfiles.md`.
|
|
39
|
+
|
|
40
|
+
## 2. Secrets
|
|
41
|
+
|
|
42
|
+
- Never `COPY` a `.env`, key file or credentials file into any stage, and never pass a token with `--build-arg`.
|
|
43
|
+
- Build-time secrets (private registry token, package-index credential): `RUN --mount=type=secret,id=npmrc,target=/root/.npmrc npm ci` with `docker build --secret id=npmrc,src=$HOME/.npmrc .`. The secret is not written to a layer.
|
|
44
|
+
- Private Git dependencies: `RUN --mount=type=ssh` with `docker build --ssh default .`.
|
|
45
|
+
- Runtime secrets come from the environment or a mounted file at `docker run` / Compose / orchestrator level, never from the image.
|
|
46
|
+
- If a secret was already baked into a pushed image, removing it from the Dockerfile is not enough: tell the user to rotate it.
|
|
47
|
+
|
|
48
|
+
## 3. .dockerignore
|
|
49
|
+
|
|
50
|
+
Always present. Start from:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
.git
|
|
54
|
+
**/node_modules
|
|
55
|
+
**/__pycache__
|
|
56
|
+
**/.venv
|
|
57
|
+
dist
|
|
58
|
+
build
|
|
59
|
+
target
|
|
60
|
+
coverage
|
|
61
|
+
.env
|
|
62
|
+
.env.*
|
|
63
|
+
*.pem
|
|
64
|
+
*.key
|
|
65
|
+
Dockerfile*
|
|
66
|
+
compose*.yaml
|
|
67
|
+
docker-compose*.yml
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Adjust so the build output you need is not excluded (for example, keep `dist` if you build outside Docker and copy it in).
|
|
71
|
+
|
|
72
|
+
## 4. Faster builds
|
|
73
|
+
|
|
74
|
+
- Cache package downloads across builds: `RUN --mount=type=cache,target=/root/.npm npm ci`, `--mount=type=cache,target=/root/.cache/pip`, `--mount=type=cache,target=/go/pkg/mod`.
|
|
75
|
+
- Keep the build context small (`.dockerignore`) and put rarely changing steps first.
|
|
76
|
+
- In CI, use the builder's registry or CI cache backend (`--cache-from` / `--cache-to`), not a fresh build each time.
|
|
77
|
+
|
|
78
|
+
## 5. Compose for local development
|
|
79
|
+
|
|
80
|
+
Use `compose.yaml` (the current default file name) and no top-level `version:` key; it is obsolete.
|
|
81
|
+
|
|
82
|
+
```yaml
|
|
83
|
+
services:
|
|
84
|
+
app:
|
|
85
|
+
build: .
|
|
86
|
+
ports: ["3000:3000"]
|
|
87
|
+
env_file: .env # local only, git-ignored
|
|
88
|
+
depends_on:
|
|
89
|
+
db:
|
|
90
|
+
condition: service_healthy
|
|
91
|
+
db:
|
|
92
|
+
image: postgres:16
|
|
93
|
+
environment:
|
|
94
|
+
POSTGRES_PASSWORD: dev-only
|
|
95
|
+
volumes: [db-data:/var/lib/postgresql/data]
|
|
96
|
+
healthcheck:
|
|
97
|
+
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
|
98
|
+
interval: 5s
|
|
99
|
+
retries: 10
|
|
100
|
+
volumes:
|
|
101
|
+
db-data:
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
- `depends_on` with `condition: service_healthy` waits for the healthcheck, not just for the container to start.
|
|
105
|
+
- Services reach each other by service name (`db:5432`), not `localhost`.
|
|
106
|
+
- Bind-mount source for hot reload, or use `develop.watch` with `docker compose watch`. Don't bind-mount over a directory the image built (such as `node_modules`) without an anonymous volume to protect it.
|
|
107
|
+
- Bind database ports to localhost only when exposed: `"127.0.0.1:5432:5432"`.
|
|
108
|
+
- Use profiles (`profiles: [tools]`) for optional services instead of extra Compose files.
|
|
109
|
+
|
|
110
|
+
## 6. Verify
|
|
111
|
+
|
|
112
|
+
Run, and report the results:
|
|
113
|
+
|
|
114
|
+
1. `docker build -t <name>:dev .` succeeds.
|
|
115
|
+
2. `docker image ls <name>:dev` for the size; compare with the old image if there was one.
|
|
116
|
+
3. `docker run --rm <name>:dev id` (or check `docker inspect --format '{{.Config.User}}'`) shows a non-root user.
|
|
117
|
+
4. `docker history --no-trunc <name>:dev` shows no secrets in any layer command.
|
|
118
|
+
5. `docker run --rm -p <port>:<port> <name>:dev` and hit the health endpoint; then `docker stop` returns quickly (signals handled).
|
|
119
|
+
6. For Compose: `docker compose config` validates, `docker compose up -d` and `docker compose ps` shows services healthy.
|
|
120
|
+
|
|
121
|
+
If an image scanner is available (`docker scout cves`, `trivy image`), run it and list high and critical findings.
|
|
122
|
+
|
|
123
|
+
## Never
|
|
124
|
+
|
|
125
|
+
- Never use `latest` or an unpinned base in a production Dockerfile.
|
|
126
|
+
- Never run the final stage as root without the user's explicit reason.
|
|
127
|
+
- Never add `--privileged`, the Docker socket mount (`/var/run/docker.sock`) or `network_mode: host` unless the user asks for it and understands the risk.
|
|
128
|
+
- Never `chmod -R 777`.
|
|
129
|
+
|
|
130
|
+
## Report back
|
|
131
|
+
|
|
132
|
+
End with: files changed, base image and final size (before and after if known), user the container runs as, the verification commands you ran with pass or fail, and anything you could not check.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Write a Dockerfile for our Express API that doesn't run as root",
|
|
4
|
+
"Our Docker image is 1.8GB, can you get it down with a multi-stage build?",
|
|
5
|
+
"Every docker build reinstalls all the npm packages even when I only change one source file",
|
|
6
|
+
"Set up a compose.yaml so I can run the app with Postgres and Redis locally",
|
|
7
|
+
"We pass the NPM_TOKEN as a build arg, how do we stop it ending up in the image?"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Add liveness and readiness probes to our Kubernetes Deployment",
|
|
11
|
+
"Write a Terraform module for an ECR repository and an ECS service",
|
|
12
|
+
"Review this Dockerfile and the Helm chart for security problems before we ship",
|
|
13
|
+
"Create a GitHub Actions workflow that runs the tests on every pull request",
|
|
14
|
+
"Roll back the payments deployment in the cluster to the previous ReplicaSet"
|
|
15
|
+
]
|
|
16
|
+
}
|