@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,77 @@
|
|
|
1
|
+
# .NET integration tests
|
|
2
|
+
|
|
3
|
+
Read this when testing an ASP.NET Core app end to end in memory, or against a real database in a container.
|
|
4
|
+
|
|
5
|
+
## WebApplicationFactory
|
|
6
|
+
|
|
7
|
+
Package: `Microsoft.AspNetCore.Mvc.Testing`. The test project uses the Web SDK or references the app project.
|
|
8
|
+
|
|
9
|
+
With top-level statements, the generated `Program` class may not be visible to the test project. If `WebApplicationFactory<Program>` doesn't compile, add this to the end of `Program.cs`:
|
|
10
|
+
|
|
11
|
+
```csharp
|
|
12
|
+
public partial class Program;
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Custom factory that swaps services:
|
|
16
|
+
|
|
17
|
+
```csharp
|
|
18
|
+
public sealed class ApiFactory : WebApplicationFactory<Program>
|
|
19
|
+
{
|
|
20
|
+
protected override void ConfigureWebHost(IWebHostBuilder builder)
|
|
21
|
+
{
|
|
22
|
+
builder.UseEnvironment("Testing");
|
|
23
|
+
builder.ConfigureTestServices(services =>
|
|
24
|
+
{
|
|
25
|
+
services.RemoveAll<IEmailSender>();
|
|
26
|
+
services.AddSingleton<IEmailSender, FakeEmailSender>();
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public sealed class OrdersApiTests(ApiFactory factory) : IClassFixture<ApiFactory>
|
|
32
|
+
{
|
|
33
|
+
[Fact]
|
|
34
|
+
public async Task Get_unknown_order_returns_404()
|
|
35
|
+
{
|
|
36
|
+
var client = factory.CreateClient();
|
|
37
|
+
var response = await client.GetAsync("/orders/999");
|
|
38
|
+
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
- `RemoveAll<T>()` is in `Microsoft.Extensions.DependencyInjection.Extensions`.
|
|
44
|
+
- Auth: register a test authentication handler in `ConfigureTestServices` (`services.AddAuthentication("Test").AddScheme<AuthenticationSchemeOptions, TestAuthHandler>("Test", _ => { })`) rather than disabling authorization.
|
|
45
|
+
- `CreateClient()` follows redirects by default; pass `new WebApplicationFactoryClientOptions { AllowAutoRedirect = false }` to assert on a 302.
|
|
46
|
+
|
|
47
|
+
## Testcontainers
|
|
48
|
+
|
|
49
|
+
Packages: `Testcontainers.PostgreSql` (or `Testcontainers.MsSql`, `Testcontainers.MySql`, `Testcontainers.Redis`). Needs Docker or a compatible engine.
|
|
50
|
+
|
|
51
|
+
```csharp
|
|
52
|
+
public sealed class PostgresFixture : IAsyncLifetime
|
|
53
|
+
{
|
|
54
|
+
// If your Testcontainers version marks this constructor obsolete, pass the image to it instead.
|
|
55
|
+
public PostgreSqlContainer Db { get; } = new PostgreSqlBuilder()
|
|
56
|
+
.WithImage("postgres:16-alpine")
|
|
57
|
+
.Build();
|
|
58
|
+
|
|
59
|
+
// xUnit v2 signatures; in xUnit v3 both methods return ValueTask.
|
|
60
|
+
public Task InitializeAsync() => Db.StartAsync();
|
|
61
|
+
public Task DisposeAsync() => Db.DisposeAsync().AsTask();
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
- Pin the image tag to the version production uses; never `latest`.
|
|
66
|
+
- Share one container per collection: `[CollectionDefinition("db")] public class DbCollection : ICollectionFixture<PostgresFixture>;` and mark test classes `[Collection("db")]`.
|
|
67
|
+
- Apply schema once per container: run EF Core migrations (`await db.Database.MigrateAsync()`) in the fixture, not `EnsureCreated` if production uses migrations.
|
|
68
|
+
- Isolate tests: wrap each in a transaction you roll back, or reset data between tests (the Respawn library is a common choice). Don't depend on test order.
|
|
69
|
+
- Combine with WebApplicationFactory by overriding the connection string in `ConfigureWebHost` with `builder.UseSetting("ConnectionStrings:Default", fixture.Db.GetConnectionString())`.
|
|
70
|
+
|
|
71
|
+
## NUnit and MSTest equivalents
|
|
72
|
+
|
|
73
|
+
| xUnit | NUnit | MSTest |
|
|
74
|
+
|---|---|---|
|
|
75
|
+
| `IClassFixture<T>` | `[OneTimeSetUp]` / `[OneTimeTearDown]` | `[ClassInitialize]` / `[ClassCleanup]` |
|
|
76
|
+
| constructor / `IDisposable` | `[SetUp]` / `[TearDown]` | `[TestInitialize]` / `[TestCleanup]` |
|
|
77
|
+
| `ICollectionFixture<T>` | `[SetUpFixture]` | `[AssemblyInitialize]` |
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: css-architecture
|
|
3
|
+
description: Organises stylesheets so they stay maintainable as a codebase grows, using design tokens in CSS custom properties, cascade layers to control specificity, grid and flexbox for layout, container queries for component-level responsiveness, one consistent naming or utility-first convention, and token-driven theming including dark mode. Use when setting up or refactoring a project's CSS, introducing a design system or theme, fighting specificity wars and !important, or deciding between BEM, CSS Modules and Tailwind.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Plain CSS, Sass, CSS Modules, Tailwind or CSS-in-JS. Cascade layers and container queries need evergreen browsers; check the project's browser targets.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: coding
|
|
9
|
+
kete-loom/risk: writes-files
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# CSS architecture
|
|
14
|
+
|
|
15
|
+
Make the cascade predictable: tokens for values, layers for order, components that style only themselves.
|
|
16
|
+
|
|
17
|
+
## 0. Before you start
|
|
18
|
+
|
|
19
|
+
1. Identify the current approach: global CSS, Sass partials, CSS Modules, Tailwind (`tailwind.config.*` or `@import "tailwindcss"`), CSS-in-JS, or a mix. Check `browserslist` or the framework's targets.
|
|
20
|
+
2. Keep the approach the project already uses. Changing methodology (for example BEM to Tailwind) is a project decision: **stop and ask the user** before starting one.
|
|
21
|
+
3. Look for an existing token file or theme before adding values.
|
|
22
|
+
|
|
23
|
+
## 1. Design tokens
|
|
24
|
+
|
|
25
|
+
Three tiers, all as custom properties on `:root`:
|
|
26
|
+
|
|
27
|
+
```css
|
|
28
|
+
:root {
|
|
29
|
+
/* primitives: raw palette and scale, never used directly in components */
|
|
30
|
+
--blue-600: oklch(52% 0.18 255);
|
|
31
|
+
--space-4: 1rem;
|
|
32
|
+
/* semantic: what the value is for; components use these */
|
|
33
|
+
--color-bg: white;
|
|
34
|
+
--color-text: #1a1a1a;
|
|
35
|
+
--color-accent: var(--blue-600);
|
|
36
|
+
--space-gap: var(--space-4);
|
|
37
|
+
--radius-control: 0.375rem;
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
- Components reference semantic tokens only, so theming changes one place.
|
|
42
|
+
- Scales, not one-offs: spacing, type sizes, radii, shadows, z-index each have a short named scale. A new raw value in a component is a review flag.
|
|
43
|
+
- Use `rem` for type and spacing so user font size settings apply; `clamp()` for fluid type (`font-size: clamp(1rem, 0.9rem + 0.5vw, 1.25rem)`).
|
|
44
|
+
- If the design team exports tokens (Figma, Tokens Studio, Style Dictionary), generate the CSS from that source instead of hand-editing.
|
|
45
|
+
- In Tailwind v4, define tokens with `@theme { --color-accent: ...; }`; in v3, in `theme.extend` in `tailwind.config.js`. Check which version the project runs.
|
|
46
|
+
|
|
47
|
+
## 2. Cascade layers
|
|
48
|
+
|
|
49
|
+
Declare the order once, at the top of the entry stylesheet:
|
|
50
|
+
|
|
51
|
+
```css
|
|
52
|
+
@layer reset, vendor, tokens, base, layout, components, utilities, overrides;
|
|
53
|
+
@import url("vendor.css") layer(vendor);
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
- Later layers win regardless of selector specificity, so utilities beat components without `!important`.
|
|
57
|
+
- Unlayered styles beat all layers, so put third-party CSS in a layer named early in the order statement. A layer not named there is appended last and beats everything before it.
|
|
58
|
+
- `@import` must come before every other rule except `@layer` order statements, or the browser ignores it.
|
|
59
|
+
- `!important` inside a layer reverses the order (earlier layers' important rules win). Avoid `!important` except in `utilities` that must always apply, such as `.visually-hidden`.
|
|
60
|
+
|
|
61
|
+
## 3. Selectors and naming
|
|
62
|
+
|
|
63
|
+
Pick one convention per project and apply it everywhere:
|
|
64
|
+
|
|
65
|
+
| Approach | Use when | Rules |
|
|
66
|
+
|---|---|---|
|
|
67
|
+
| BEM (`.card`, `.card__title`, `.card--featured`) | global CSS or Sass | one class per selector, no element or ID selectors in components, max one level of nesting |
|
|
68
|
+
| CSS Modules / scoped styles (Vue `scoped`, Svelte, Angular) | component frameworks | class names local by default; share through tokens, not `:global` |
|
|
69
|
+
| Utility-first (Tailwind) | team already uses it | extract a component (not `@apply` soup) when a class list repeats; keep tokens in the theme |
|
|
70
|
+
|
|
71
|
+
General rules:
|
|
72
|
+
- Keep specificity flat: one class. Avoid IDs and `#id .x .y div` chains.
|
|
73
|
+
- Use `:where()` to zero out specificity in base and reset styles; `:is()` keeps the highest.
|
|
74
|
+
- Native nesting is fine for states and children, but no deeper than two levels.
|
|
75
|
+
- Style states with attributes the markup already has: `[aria-expanded="true"]`, `[aria-current="page"]`, `:disabled`, `[data-state="open"]`.
|
|
76
|
+
- Components never set their own outer margin or position on the page; the parent layout does.
|
|
77
|
+
|
|
78
|
+
## 4. Layout
|
|
79
|
+
|
|
80
|
+
Decision rule: two dimensions (rows and columns) → grid. One dimension (a row of items) → flexbox.
|
|
81
|
+
|
|
82
|
+
- Responsive grid without media queries: `grid-template-columns: repeat(auto-fill, minmax(min(16rem, 100%), 1fr));`
|
|
83
|
+
- Spacing between children: `gap`, not margins on children.
|
|
84
|
+
- Use logical properties (`margin-inline`, `padding-block`, `inset-inline-start`) so RTL layouts work.
|
|
85
|
+
- Avoid fixed heights on content; use `min-height` and let text wrap.
|
|
86
|
+
- `subgrid` for aligning nested card contents across a row, where browser targets allow.
|
|
87
|
+
|
|
88
|
+
## 5. Container queries vs media queries
|
|
89
|
+
|
|
90
|
+
- Media queries for page-level layout (sidebar collapses, navigation changes) and user preferences (`prefers-color-scheme`, `prefers-reduced-motion`, `prefers-contrast`).
|
|
91
|
+
- Container queries for components that live in slots of different widths:
|
|
92
|
+
|
|
93
|
+
```css
|
|
94
|
+
.card-list { container-type: inline-size; container-name: cards; }
|
|
95
|
+
@container cards (min-width: 40rem) {
|
|
96
|
+
.card { grid-template-columns: 12rem 1fr; }
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
- An element cannot query its own size: set `container-type` on a wrapper and style the children. `inline-size` containment also stops the container sizing to its content's width, so don't put it on shrink-to-fit elements.
|
|
101
|
+
- Container query units (`cqi`) for type that scales with the container.
|
|
102
|
+
|
|
103
|
+
## 6. Theming and dark mode
|
|
104
|
+
|
|
105
|
+
1. Themes only redefine semantic tokens; components don't change.
|
|
106
|
+
2. Respect the OS by default and allow an explicit override:
|
|
107
|
+
|
|
108
|
+
```css
|
|
109
|
+
:root { color-scheme: light dark; }
|
|
110
|
+
@media (prefers-color-scheme: dark) {
|
|
111
|
+
:root:not([data-theme="light"]) { --color-bg: #121212; --color-text: #e8e8e8; }
|
|
112
|
+
}
|
|
113
|
+
:root[data-theme="dark"] { --color-bg: #121212; --color-text: #e8e8e8; }
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
3. `light-dark(var(--a), var(--b))` is a shorter option where browser targets support it.
|
|
117
|
+
4. Set the theme attribute before first paint (inline script in `<head>` reading the saved choice) to avoid a flash of the wrong theme.
|
|
118
|
+
5. Check text and UI contrast in every theme (4.5:1 for text, 3:1 for UI parts). Dark mode is not inverted colours: lower elevation surfaces are darker, avoid pure black behind large text blocks.
|
|
119
|
+
|
|
120
|
+
## 7. Refactoring existing CSS
|
|
121
|
+
|
|
122
|
+
1. Find unused and duplicate rules (Coverage panel in Chrome DevTools, search for class usage in the codebase). Remove only what search proves unused; dynamic class names (`"btn-" + size`) need a manual check.
|
|
123
|
+
2. Replace repeated raw values with tokens, one token group per change.
|
|
124
|
+
3. Introduce layers by wrapping existing files in the layer that matches their role, then delete the `!important` and specificity hacks they made unnecessary.
|
|
125
|
+
4. After each step, compare key pages visually (screenshot diff or manual check in both themes and at mobile and desktop widths).
|
|
126
|
+
|
|
127
|
+
## Never
|
|
128
|
+
|
|
129
|
+
- Never add `!important` to win a specificity fight; fix the layer or selector.
|
|
130
|
+
- Never hard-code colours or spacing inside components when a token exists.
|
|
131
|
+
- Never style by DOM structure (`.sidebar > div > ul li a`).
|
|
132
|
+
- Never remove `:focus-visible` styles or set `outline: none` without a replacement.
|
|
133
|
+
- Never mix two naming methodologies in new code.
|
|
134
|
+
|
|
135
|
+
## Report back
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
Approach: <methodology and tooling found/kept>
|
|
139
|
+
Changes: <file> — <tokens/layers/layout/theme change> (one line each)
|
|
140
|
+
Removed: <rules or !important count removed>
|
|
141
|
+
Checked: <pages, widths and themes compared>
|
|
142
|
+
Decisions needed: <anything that changes the methodology or design>
|
|
143
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Our stylesheet is full of !important and nested selectors, restructure it so it is maintainable",
|
|
4
|
+
"Set up design tokens as CSS custom properties with a dark mode toggle that respects the OS setting",
|
|
5
|
+
"Should we use BEM, CSS Modules or Tailwind for this new project?",
|
|
6
|
+
"Make this card component change layout based on its container width instead of the viewport",
|
|
7
|
+
"Introduce cascade layers so third-party CSS stops overriding our component styles"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Design a new landing page with a bold visual style for our coffee brand",
|
|
11
|
+
"The web fonts are causing layout shift and slowing down LCP",
|
|
12
|
+
"Check that our focus outlines and text colours meet WCAG contrast requirements",
|
|
13
|
+
"Convert this Vue options API component to the composition API",
|
|
14
|
+
"Build a responsive SwiftUI layout for iPad and iPhone"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: customs-trade-compliance
|
|
3
|
+
description: Cross-border shipping groundwork for software and operations teams, covering Harmonized System product codes, choosing and reading Incoterms 2020 rules, estimating duties, import taxes and landed cost, the data a commercial invoice needs, and screening buyers against restricted-party and sanctions lists, with a firm line on which decisions a licensed customs broker or trade lawyer must make. Use when adding international shipping to a store or ERP, building a landed-cost calculator or export documents, or deciding who pays duties and when goods need a broker.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Tariff and screening lookups need network access to government sites or a provider API. Not legal or customs advice.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: compliance
|
|
9
|
+
kete-loom/risk: network
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Customs and trade compliance
|
|
14
|
+
|
|
15
|
+
Get product, party and shipment data right in the system so a broker can file cleanly, landed cost is no surprise, and no order ships to a party you may not deal with. This skill prepares and checks; it does not make binding classification or licensing decisions.
|
|
16
|
+
|
|
17
|
+
## Boundary: when a licensed person must decide
|
|
18
|
+
|
|
19
|
+
**Stop and tell the user to involve a licensed customs broker, customs authority ruling or trade lawyer** when any of these apply:
|
|
20
|
+
|
|
21
|
+
- Final tariff classification used on a filed entry, especially where duty differs a lot between candidate codes, or for chemicals, food, medical devices, textiles and steel/aluminium.
|
|
22
|
+
- Origin claims for a free trade agreement preference, or anti-dumping/countervailing duty exposure.
|
|
23
|
+
- Valuation questions: related-party prices, royalties, assists, free samples, or goods sold below cost.
|
|
24
|
+
- Export control: anything military, dual-use, encryption beyond mass-market, or a licence question (US EAR/ITAR, EU dual-use regulation).
|
|
25
|
+
- Any possible restricted-party or sanctions match, or a shipment to an embargoed or comprehensively sanctioned destination.
|
|
26
|
+
- Filing an entry or export declaration on someone else's behalf (in the US, transacting customs business for others requires a licensed broker).
|
|
27
|
+
|
|
28
|
+
Write that boundary into any tool you build: a "needs broker review" status that blocks automated shipping.
|
|
29
|
+
|
|
30
|
+
## 1. HS classification
|
|
31
|
+
|
|
32
|
+
1. Collect for each product: what it is, material composition (percent), function, how it is used, whether it is a part or a finished good, and photos or spec sheets.
|
|
33
|
+
2. The first 6 digits are the international Harmonized System maintained by the World Customs Organization; countries extend it (US HTS 10 digits, EU CN 8 digits and TARIC 10 digits, UK commodity codes 10 digits). Store the 6-digit code per product and the national code per destination.
|
|
34
|
+
3. Classify by the General Rules of Interpretation, headings and section/chapter notes first, not by keyword search. Record the reasoning and the source.
|
|
35
|
+
4. Use official tools to propose a code: the US HTS search (hts.usitc.gov), EU TARIC, the UK Trade Tariff (trade-tariff.service.gov.uk), or the destination's tariff. Check the current HS edition the destination uses.
|
|
36
|
+
5. Mark every proposed code as `proposed` until a broker or binding ruling confirms it.
|
|
37
|
+
|
|
38
|
+
Never pick a code because its duty is lower.
|
|
39
|
+
|
|
40
|
+
## 2. Incoterms 2020
|
|
41
|
+
|
|
42
|
+
Incoterms (ICC, 2020 edition) decide where risk passes, who pays which costs, and who clears export and import. They do not decide when title passes or the payment terms. Always write the rule plus a named place and the edition, for example `FCA Seller's warehouse, Leeds, Incoterms 2020`.
|
|
43
|
+
|
|
44
|
+
Rule summaries and a selection guide are in `references/incoterms-2020.md`. Key decisions:
|
|
45
|
+
|
|
46
|
+
- Containerised or multimodal shipments: use FCA, CPT, CIP, DAP, DPU or DDP, not FOB or CIF.
|
|
47
|
+
- DDP makes the seller the importer of record and liable for import duty and taxes; only use it if the seller can register and pay in the destination.
|
|
48
|
+
- EXW leaves export clearance to the buyer, which often does not work for the seller's own export reporting; FCA is usually the better minimum.
|
|
49
|
+
|
|
50
|
+
## 3. Duties, taxes and landed cost
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
landed cost = product cost + freight + insurance + duty + import VAT/GST/sales tax + broker and carrier fees + other fees
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
- Customs value basis differs: many countries use CIF value (goods + freight + insurance to the border); the US uses transaction value excluding international freight and insurance. Confirm for the destination.
|
|
57
|
+
- Duty = rate for the national code and origin x customs value (or a specific rate per unit). Check preferential rates only if the origin rules are met and documented.
|
|
58
|
+
- Import VAT/GST is usually charged on value + duty. Treat VAT registration, IOSS and reverse-charge questions as a tax topic for the invoicing-and-tax skill and a tax adviser.
|
|
59
|
+
- Low-value thresholds have changed fast: the US suspended de minimis duty-free entry for all countries from 29 August 2025, and from 1 July 2026 the EU removed its EUR 150 customs duty relief and applies a temporary flat duty of EUR 3 per tariff line in a low-value consignment (Council Regulation (EU) 2026/382; scope and counting rules are set in implementing acts). Always check the destination's current rules before relying on a threshold.
|
|
60
|
+
- Additional duties (Section 232/301-type tariffs, retaliatory or emergency tariffs) change often; fetch current rates at calculation time and store the date and source with every quote.
|
|
61
|
+
|
|
62
|
+
## 4. Commercial invoice
|
|
63
|
+
|
|
64
|
+
Minimum fields to generate from your data:
|
|
65
|
+
|
|
66
|
+
- Seller/exporter and buyer/consignee names and addresses; importer of record if different; tax or EORI numbers where required.
|
|
67
|
+
- Invoice number and date, Incoterm with named place, currency, payment terms.
|
|
68
|
+
- Per line: clear description (what it is and what it is made of, not "parts" or "gift"), HS code, country of origin, quantity and unit, unit price, line total.
|
|
69
|
+
- Totals, freight and insurance shown separately if charged, gross and net weight, number of packages.
|
|
70
|
+
- Reason for export (sale, sample, return, repair), and a signed declaration if the destination requires one.
|
|
71
|
+
|
|
72
|
+
Values must be the real transaction value. Never undervalue or mark goods as a gift to cut duty; it is customs fraud.
|
|
73
|
+
|
|
74
|
+
## 5. Restricted-party and sanctions screening
|
|
75
|
+
|
|
76
|
+
1. Screen buyer, consignee, end user, and their banks or intermediaries where known, at order time and again before shipping.
|
|
77
|
+
2. Sources: the US Consolidated Screening List from the International Trade Administration (search API at developer.trade.gov, which needs a subscription key, or a downloadable file), which combines lists including OFAC SDN and the BIS Entity List; the EU consolidated list of financial sanctions; the UK Sanctions List (the single UK source since 28 January 2026); plus lists for your other markets. Many teams use a commercial screening provider instead.
|
|
78
|
+
3. Use fuzzy matching on names and aliases, plus address and country, and log every check with list version, timestamp and result.
|
|
79
|
+
4. Possible match: hold the order, do not tell the customer why, and send it to the compliance owner. Never auto-clear a match in code.
|
|
80
|
+
5. Block destinations under comprehensive embargo at checkout, using a list the compliance owner maintains.
|
|
81
|
+
|
|
82
|
+
## Rules
|
|
83
|
+
|
|
84
|
+
- Never present a proposed HS code, duty estimate or screening result as a final determination.
|
|
85
|
+
- Never ship a held or "needs broker review" order automatically.
|
|
86
|
+
- Never undervalue, misdescribe or misstate origin on documents.
|
|
87
|
+
- Do not state a tariff rate, threshold or list rule you have not checked against the official source on the day.
|
|
88
|
+
|
|
89
|
+
## Report
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
product | description | material | proposed HS6 | national code (dest) | origin | source/rationale | status (proposed | broker-confirmed)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
For a shipment or calculator: Incoterm and named place, customs value basis, duty and tax lines with rate, source and date, landed cost per unit, screening result with list version, and the list of items that need broker or lawyer review.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"We start shipping to the US and UK next month, add HS codes and country of origin to our product catalog",
|
|
4
|
+
"Build a landed cost calculator that adds duty, import VAT and freight for each destination country",
|
|
5
|
+
"Should we sell to European distributors on FCA or DAP, and what does each mean for us?",
|
|
6
|
+
"Generate commercial invoices for our international orders from the order data",
|
|
7
|
+
"Add restricted-party screening against the Consolidated Screening List before orders are released to the warehouse"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Our container from Shanghai is two weeks late, help me update customers and chase the forwarder",
|
|
11
|
+
"Add VAT and GST calculation to our SaaS invoices for customers in 20 countries",
|
|
12
|
+
"Plan safety stock for imported parts that have a 12 week ocean lead time",
|
|
13
|
+
"Review our GDPR data processing agreement with a US vendor",
|
|
14
|
+
"Run a dependency audit for packages with known vulnerabilities"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Incoterms 2020 quick reference
|
|
2
|
+
|
|
3
|
+
Published by the International Chamber of Commerce (ICC). Eleven rules. This is a summary for building systems; the ICC text governs. The parties may still contract a different arrangement, so read the sales contract.
|
|
4
|
+
|
|
5
|
+
## Rules for any mode of transport
|
|
6
|
+
|
|
7
|
+
| Rule | Seller delivers / risk passes | Main carriage paid by | Export clearance | Import clearance and duties |
|
|
8
|
+
|---|---|---|---|---|
|
|
9
|
+
| EXW Ex Works | Goods at seller's premises, not loaded | Buyer | Buyer | Buyer |
|
|
10
|
+
| FCA Free Carrier | Handed to buyer's carrier at named place (loaded if at seller's premises) | Buyer | Seller | Buyer |
|
|
11
|
+
| CPT Carriage Paid To | Handed to the first carrier | Seller (to named destination) | Seller | Buyer |
|
|
12
|
+
| CIP Carriage and Insurance Paid To | Handed to the first carrier | Seller, plus insurance | Seller | Buyer |
|
|
13
|
+
| DAP Delivered at Place | At named destination, ready for unloading | Seller | Seller | Buyer |
|
|
14
|
+
| DPU Delivered at Place Unloaded | At named destination, unloaded | Seller | Seller | Buyer |
|
|
15
|
+
| DDP Delivered Duty Paid | At named destination, cleared for import | Seller | Seller | Seller |
|
|
16
|
+
|
|
17
|
+
## Rules for sea and inland waterway only
|
|
18
|
+
|
|
19
|
+
| Rule | Seller delivers / risk passes | Main carriage paid by | Export | Import |
|
|
20
|
+
|---|---|---|---|---|
|
|
21
|
+
| FAS Free Alongside Ship | Alongside the vessel at port of shipment | Buyer | Seller | Buyer |
|
|
22
|
+
| FOB Free On Board | On board the vessel at port of shipment | Buyer | Seller | Buyer |
|
|
23
|
+
| CFR Cost and Freight | On board the vessel at port of shipment | Seller (to destination port) | Seller | Buyer |
|
|
24
|
+
| CIF Cost, Insurance and Freight | On board the vessel at port of shipment | Seller, plus insurance | Seller | Buyer |
|
|
25
|
+
|
|
26
|
+
## Points that cause mistakes
|
|
27
|
+
|
|
28
|
+
- In C rules (CPT, CIP, CFR, CIF) the seller pays carriage to the destination, but **risk passes at shipment**. Damage in transit is the buyer's risk.
|
|
29
|
+
- Insurance: CIP requires cover at the level of Institute Cargo Clauses (A) (all risks, subject to exclusions); CIF requires the minimum, Clauses (C). Both at least 110% of the contract value. Parties may agree otherwise.
|
|
30
|
+
- DPU replaced DAT in 2020 and can be any place, not only a terminal.
|
|
31
|
+
- FCA in 2020 lets the parties agree that the buyer's carrier issues an on-board bill of lading to the seller, which matters for letters of credit.
|
|
32
|
+
- Under DDP, VAT or GST at import is the seller's cost unless the contract says otherwise; the seller may need a tax registration in the destination.
|
|
33
|
+
- Incoterms say nothing about title transfer, payment, or which law applies.
|
|
34
|
+
|
|
35
|
+
## Choosing a rule (default guidance, confirm with the user)
|
|
36
|
+
|
|
37
|
+
| Situation | Usually |
|
|
38
|
+
|---|---|
|
|
39
|
+
| E-commerce to consumers, seller wants a no-surprise delivery | DDP if registered for import taxes in the destination, otherwise DAP and tell the customer duties are due on delivery |
|
|
40
|
+
| B2B, buyer has its own forwarder | FCA at seller's premises or a named hub |
|
|
41
|
+
| B2B, seller arranges freight | CPT or CIP (container) / CFR or CIF (bulk sea cargo only) |
|
|
42
|
+
| Buyer collects and seller cannot do export filings | EXW only if the buyer can legally act as exporter; otherwise FCA |
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dart-patterns
|
|
3
|
+
description: Writes and refactors idiomatic Dart 3 code that keeps sound null safety intact, models data with records, pattern matching and sealed class hierarchies, handles async/await, Streams and isolates without leaks or dropped futures, and manages pub dependencies and analysis_options.yaml lint sets. Use when writing or restructuring plain Dart (CLI, server, package or the non-widget layers of a Flutter app), replacing nullable soup or enum switches with sealed types and patterns, or tightening analyzer rules for a Dart codebase.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Needs the Dart SDK 3.0 or newer (or Flutter, which bundles it) to run dart analyze and dart test.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: coding
|
|
9
|
+
kete-loom/risk: writes-files
|
|
10
|
+
kete-loom/requires: "dart"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Dart patterns
|
|
15
|
+
|
|
16
|
+
Write Dart that the analyzer can prove correct: no null escapes, exhaustive switches, every future accounted for. Widget composition and Flutter state management belong to `flutter-patterns`; this skill covers the language, async model, packages and lints underneath.
|
|
17
|
+
|
|
18
|
+
## 0. Before you write
|
|
19
|
+
|
|
20
|
+
1. Read `pubspec.yaml`: the `environment: sdk:` lower bound decides which language features you may use (records, patterns, sealed and class modifiers need `>=3.0.0`; extension types need 3.3). Don't raise the SDK bound without asking the user.
|
|
21
|
+
2. Read `analysis_options.yaml` and follow the lint set already in force.
|
|
22
|
+
3. Run `dart analyze` (or `flutter analyze`) first so you know which warnings were already there.
|
|
23
|
+
|
|
24
|
+
## 1. Null safety
|
|
25
|
+
|
|
26
|
+
- Make a type nullable only when absence is a real state. Prefer a non-null default or a required parameter.
|
|
27
|
+
- Promote instead of asserting: `if (x == null) return;` then use `x`. Fields don't promote unless they are private and final (Dart 3.2+); copy to a local first: `final user = _user; if (user != null) ...`.
|
|
28
|
+
- Use `??`, `?.`, `??=` and `if (value case final v?)` for optional values.
|
|
29
|
+
- `!` is allowed only where an invariant the analyzer can't see is guaranteed and documented on the line above. Never use `!` to silence an error.
|
|
30
|
+
- `late` is a promise checked at runtime. Use it only for fields set in `initState`/constructor bodies or lazy computed values (`late final x = compute();`). An unset `late` throws `LateInitializationError`.
|
|
31
|
+
- Never call `.cast<T>()` or `as T` on decoded JSON without validating it; parse with patterns instead (section 2).
|
|
32
|
+
|
|
33
|
+
## 2. Records and patterns
|
|
34
|
+
|
|
35
|
+
- Return several values with a record instead of a throwaway class: `(int count, String label) summarize()` or named `({int count, String label})`.
|
|
36
|
+
- Destructure at the call site: `final (count, label) = summarize();`.
|
|
37
|
+
- Validate untyped data with a map pattern, which checks type and shape in one step:
|
|
38
|
+
|
|
39
|
+
```dart
|
|
40
|
+
User parseUser(Object? json) {
|
|
41
|
+
if (json case {'id': int id, 'name': String name, 'email': String? email}) {
|
|
42
|
+
return User(id: id, name: name, email: email);
|
|
43
|
+
}
|
|
44
|
+
throw FormatException('Invalid user JSON: $json');
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
- A map pattern fails if a key is missing, even when its value pattern is nullable (`String? email` above needs `'email'` present). For optional keys, read `json['email']` separately after the match.
|
|
49
|
+
- Use switch expressions for value mapping, with guards (`when`) for conditions. Prefer them to `if/else` ladders.
|
|
50
|
+
- Wildcard `_` matches anything; don't add a `_` case to a switch over a sealed type or enum, because it hides new cases from the exhaustiveness check.
|
|
51
|
+
|
|
52
|
+
## 3. Sealed classes and class modifiers
|
|
53
|
+
|
|
54
|
+
Model closed sets of states with `sealed`; the compiler then forces every `switch` to handle each subtype.
|
|
55
|
+
|
|
56
|
+
```dart
|
|
57
|
+
sealed class LoadState<T> {}
|
|
58
|
+
final class Loading<T> extends LoadState<T> {}
|
|
59
|
+
final class Loaded<T> extends LoadState<T> { Loaded(this.value); final T value; }
|
|
60
|
+
final class Failed<T> extends LoadState<T> { Failed(this.error); final Object error; }
|
|
61
|
+
|
|
62
|
+
String describe(LoadState<String> s) => switch (s) {
|
|
63
|
+
Loading() => 'loading',
|
|
64
|
+
Loaded(:final value) => 'got $value',
|
|
65
|
+
Failed(:final error) => 'failed: $error',
|
|
66
|
+
};
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
- Subtypes of a sealed class must live in the same library (file or `part`s).
|
|
70
|
+
- Pick modifiers deliberately in public packages: `final` (no subclassing or implementing outside the library), `interface` (implement only), `base` (extend only), `mixin class`. Adding a modifier to a published type is a breaking change.
|
|
71
|
+
- Prefer immutable value types: `final` fields, `const` constructors, and `==`/`hashCode` (or a code generator such as `freezed` if the project already uses one; don't introduce one unasked).
|
|
72
|
+
|
|
73
|
+
## 4. Async and Futures
|
|
74
|
+
|
|
75
|
+
- Every `Future` is awaited, returned, or explicitly handed off with `unawaited(...)` from `dart:async` with a comment saying why. A dropped future swallows its error.
|
|
76
|
+
- Mark functions `async` only when they await. Return `Future<void>`, never `void`, from async functions (except overrides that require `void`).
|
|
77
|
+
- Run independent work concurrently: `final (a, b) = await (fetchA(), fetchB()).wait;` or `Future.wait([...])`.
|
|
78
|
+
- Add timeouts at I/O boundaries: `await request.timeout(const Duration(seconds: 10))`, and handle `TimeoutException`.
|
|
79
|
+
- In Flutter code, after any `await` inside a `State`, check `if (!mounted) return;` (or `context.mounted`) before touching `context` or calling `setState`.
|
|
80
|
+
|
|
81
|
+
## 5. Streams
|
|
82
|
+
|
|
83
|
+
- Know the kind: single-subscription streams (most I/O) allow one listener; use `asBroadcastStream()` or a `StreamController.broadcast()` only when several listeners are really needed.
|
|
84
|
+
- Every `listen` returns a `StreamSubscription`; store it and `cancel()` it in the owner's `dispose`/`close`. Prefer `await for` when the consumer is a single async function, because it cancels on `break` or exception automatically.
|
|
85
|
+
- Every `StreamController` you create is closed by its owner (`await controller.close()`), and `add` is never called after close (check `isClosed`).
|
|
86
|
+
- Pass `onError` to `listen` or the error goes to the zone and can crash the app.
|
|
87
|
+
- Use `async*` with `yield` for generated streams instead of hand-managed controllers.
|
|
88
|
+
|
|
89
|
+
## 6. Isolates
|
|
90
|
+
|
|
91
|
+
- Move CPU-heavy work (large JSON decode, image processing, crypto) off the main isolate with `await Isolate.run(() => heavy(input))` (Flutter's `compute` is equivalent).
|
|
92
|
+
- Messages are copied; pass plain data, not objects holding sockets, open files or closures over large state.
|
|
93
|
+
- For long-lived workers use `Isolate.spawn` with `SendPort`/`ReceivePort`, and close the ports when done.
|
|
94
|
+
- Don't use isolates for I/O-bound work; async already handles it.
|
|
95
|
+
|
|
96
|
+
## 7. Errors
|
|
97
|
+
|
|
98
|
+
- Throw `Exception` subtypes for recoverable conditions callers should handle; `Error` subtypes (`ArgumentError`, `StateError`, `UnsupportedError`) signal programmer bugs and should not be caught in normal flow.
|
|
99
|
+
- Catch narrowly: `on FormatException catch (e, st)`. A bare `catch (e)` is allowed only at a top-level boundary that logs and reports.
|
|
100
|
+
- Keep the stack trace: `rethrow`, or `Error.throwWithStackTrace(MyException(...), st)` when wrapping.
|
|
101
|
+
- For expected failures in domain code, a sealed `Result` type (section 3) is often clearer than exceptions. Follow what the codebase already does.
|
|
102
|
+
|
|
103
|
+
## 8. Packages (pub)
|
|
104
|
+
|
|
105
|
+
- Add dependencies with `dart pub add <pkg>` (`dev:<pkg>` for dev dependencies) so constraints are written correctly; use caret constraints (`^1.4.0`).
|
|
106
|
+
- Inspect before upgrading: `dart pub outdated`, `dart pub deps`. Major upgrades (`dart pub upgrade --major-versions`) need the user's agreement.
|
|
107
|
+
- Commit `pubspec.lock` for applications; don't commit it for regular (reusable) packages.
|
|
108
|
+
- `dependency_overrides` is a temporary diagnostic tool, never a permanent fix. Stop and ask before leaving one in.
|
|
109
|
+
- Code generation: `dart run build_runner build` (or `watch`). Commit or ignore generated `*.g.dart` files the way the project already does.
|
|
110
|
+
|
|
111
|
+
## 9. Lints and analysis
|
|
112
|
+
|
|
113
|
+
Start from the official sets (`lints` for Dart, `flutter_lints` for Flutter, added as dev dependencies) and add rules that catch real bugs. On an existing codebase add one rule at a time and run `dart analyze` after each.
|
|
114
|
+
|
|
115
|
+
```yaml
|
|
116
|
+
include: package:lints/recommended.yaml # Flutter apps: package:flutter_lints/flutter.yaml
|
|
117
|
+
analyzer:
|
|
118
|
+
language:
|
|
119
|
+
strict-casts: true # no implicit downcasts from dynamic
|
|
120
|
+
strict-inference: true # no silently inferred dynamic
|
|
121
|
+
strict-raw-types: true # no List without a type argument
|
|
122
|
+
exclude:
|
|
123
|
+
- "**/*.g.dart"
|
|
124
|
+
linter:
|
|
125
|
+
rules:
|
|
126
|
+
- unawaited_futures
|
|
127
|
+
- discarded_futures
|
|
128
|
+
- cancel_subscriptions
|
|
129
|
+
- close_sinks
|
|
130
|
+
- avoid_dynamic_calls
|
|
131
|
+
- only_throw_errors
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
| Rule | Catches |
|
|
135
|
+
|---|---|
|
|
136
|
+
| `unawaited_futures` | a `Future` in an `async` function neither awaited nor wrapped in `unawaited(...)` |
|
|
137
|
+
| `discarded_futures` | a `Future`-returning call dropped inside a synchronous function |
|
|
138
|
+
| `cancel_subscriptions` / `close_sinks` | a `StreamSubscription` never cancelled / a `StreamController` or sink never closed |
|
|
139
|
+
| `avoid_dynamic_calls` | method calls on `dynamic`, which skip type checking |
|
|
140
|
+
| `only_throw_errors` | throwing strings or other non-`Exception`/`Error` objects |
|
|
141
|
+
|
|
142
|
+
The strict language modes can produce hundreds of errors in a large codebase; ask the user before enabling them beyond new code.
|
|
143
|
+
|
|
144
|
+
- Fix warnings rather than suppressing them. An `// ignore: rule_name` needs a reason on the same line, and `// ignore_for_file` needs the user's agreement.
|
|
145
|
+
- `dart fix --dry-run` then `dart fix --apply` handles many lint fixes mechanically; review the diff.
|
|
146
|
+
- Format with `dart format .`; don't hand-format against it.
|
|
147
|
+
|
|
148
|
+
## Never do
|
|
149
|
+
|
|
150
|
+
- Use `dynamic` to get past a type error, or `as` casts on unvalidated data.
|
|
151
|
+
- Add `!` or `late` to silence the analyzer.
|
|
152
|
+
- Leave a `StreamSubscription`, `StreamController`, `Timer` or `ReceivePort` without a cancel/close path.
|
|
153
|
+
- Raise the SDK constraint, add a code generator or change the lint set without asking.
|
|
154
|
+
|
|
155
|
+
## Finish
|
|
156
|
+
|
|
157
|
+
Run `dart format --output=none --set-exit-if-changed .`, `dart analyze` (or `flutter analyze`) and the test command. Report: files changed, the commands run with results, and any new warnings you could not fix with the reason.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Refactor this Dart class hierarchy into a sealed class so the switch is exhaustive",
|
|
4
|
+
"How should I parse this JSON map in Dart 3 without casting everything to dynamic?",
|
|
5
|
+
"Return two values from this Dart function, should I use a record?",
|
|
6
|
+
"Set up analysis_options.yaml with stricter lints for our Dart server package",
|
|
7
|
+
"My Dart code is full of ! operators, help me restructure it so null safety actually works",
|
|
8
|
+
"Move this heavy JSON decoding off the main isolate in my Dart app"
|
|
9
|
+
],
|
|
10
|
+
"should_not_trigger": [
|
|
11
|
+
"Write unit tests with mocktail for my Dart repository class",
|
|
12
|
+
"Review this Flutter widget for setState after dispose and other bugs",
|
|
13
|
+
"flutter analyze fails with 47 errors after I upgraded packages, fix it",
|
|
14
|
+
"Build a responsive Flutter layout with a bottom navigation bar and Riverpod state",
|
|
15
|
+
"Refactor this Kotlin sealed interface into idiomatic Kotlin",
|
|
16
|
+
"Add golden tests for my Flutter login screen"
|
|
17
|
+
]
|
|
18
|
+
}
|