@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,132 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flask-patterns
|
|
3
|
+
description: Flask application structure with a create_app factory, blueprints per feature, config loaded from objects and environment variables, extensions such as Flask-SQLAlchemy and Flask-Migrate initialised with init_app, application and request context pitfalls with current_app and g, security hardening, and pytest tests through the test client. Use when starting or restructuring a Flask app, adding a blueprint or extension, debugging "working outside of application context" errors, or testing Flask views.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Needs Python and the project's Flask app. Guidance targets Flask 2.x and 3.x with Flask-SQLAlchemy 3.
|
|
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
|
+
# Flask patterns
|
|
15
|
+
|
|
16
|
+
Keep a Flask app importable without side effects, configurable per environment, and testable with a fresh app per test.
|
|
17
|
+
|
|
18
|
+
## 0. Before you change anything
|
|
19
|
+
|
|
20
|
+
1. Find the app: a `create_app()` factory or a module-level `app = Flask(__name__)`. Check Flask and extension versions in `pyproject.toml` or `requirements*.txt`.
|
|
21
|
+
2. Find how it runs (`flask --app <module> run`, gunicorn target, `FLASK_APP`) and how tests run. Run the tests once; if they already fail, **stop and tell the user**.
|
|
22
|
+
3. If the app is a single module-level `app`, ask the user before converting it to a factory; it touches every import of `app`.
|
|
23
|
+
|
|
24
|
+
## 1. Application factory
|
|
25
|
+
|
|
26
|
+
```python
|
|
27
|
+
# myapp/__init__.py
|
|
28
|
+
from flask import Flask
|
|
29
|
+
from .extensions import db, migrate
|
|
30
|
+
|
|
31
|
+
def create_app(config_object="myapp.config.Config", test_config=None):
|
|
32
|
+
app = Flask(__name__, instance_relative_config=True)
|
|
33
|
+
app.config.from_object(config_object)
|
|
34
|
+
app.config.from_prefixed_env() # FLASK_SECRET_KEY, FLASK_SQLALCHEMY_DATABASE_URI, ...
|
|
35
|
+
if test_config:
|
|
36
|
+
app.config.update(test_config)
|
|
37
|
+
|
|
38
|
+
db.init_app(app)
|
|
39
|
+
migrate.init_app(app, db)
|
|
40
|
+
|
|
41
|
+
from .orders import bp as orders_bp
|
|
42
|
+
app.register_blueprint(orders_bp, url_prefix="/orders")
|
|
43
|
+
return app
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
- Extensions are created unbound in `extensions.py` (`db = SQLAlchemy()`) and bound with `init_app(app)` in the factory. This avoids circular imports and lets tests build many apps.
|
|
47
|
+
- Import blueprints inside the factory (or in a module that doesn't import the app) to avoid import cycles.
|
|
48
|
+
- No work at import time: no database connections, no reading secrets into module globals, no `app.run()` outside `if __name__ == "__main__":`.
|
|
49
|
+
|
|
50
|
+
## 2. Blueprints
|
|
51
|
+
|
|
52
|
+
- One blueprint per feature (`auth`, `orders`, `admin`), each in its own package with `routes.py`, templates in a per-blueprint subfolder of the templates folder.
|
|
53
|
+
- Use `url_for("orders.detail", order_id=o.id)` (blueprint-qualified endpoint names), never hard-coded paths.
|
|
54
|
+
- Protect a whole blueprint with `@bp.before_request` that checks login or role, then add per-view checks for object ownership.
|
|
55
|
+
- Register error handlers per blueprint with `@bp.errorhandler` or app-wide with `@app.errorhandler`; return JSON for API blueprints and HTML for page blueprints, consistently.
|
|
56
|
+
|
|
57
|
+
## 3. Config
|
|
58
|
+
|
|
59
|
+
- Base `Config` class with safe defaults, subclasses `DevConfig`, `TestConfig`, `ProdConfig` if the project uses them; or one class plus environment variables.
|
|
60
|
+
- `SECRET_KEY` and database URLs come from the environment or the `instance/` folder (which is not committed). Fail at startup in production if `SECRET_KEY` is missing.
|
|
61
|
+
- Read config at request time through `current_app.config["KEY"]`, not by importing a module constant, so tests can override it.
|
|
62
|
+
- `DEBUG`/`app.debug` must be off in production; the Werkzeug debugger allows arbitrary code execution.
|
|
63
|
+
|
|
64
|
+
## 4. Flask-SQLAlchemy and Flask-Migrate
|
|
65
|
+
|
|
66
|
+
- Use the session the extension scopes to the app context: `db.session`. It is removed at the end of each request; don't create your own `Session()` per request.
|
|
67
|
+
- SQLAlchemy 2 style queries: `db.session.execute(db.select(Order).filter_by(owner_id=uid)).scalars()`, `db.get_or_404(Order, id)`, `db.paginate(...)`. Follow the existing style if the project still uses `Model.query`.
|
|
68
|
+
- Avoid N+1 queries with `selectinload`/`joinedload` in `options(...)` when a template walks a relationship.
|
|
69
|
+
- Commit once per unit of work; on exception call `db.session.rollback()` before re-raising or returning an error.
|
|
70
|
+
- Migrations: `flask db migrate -m "add order status"`, read the generated script (autogenerate misses renames and some type changes), then `flask db upgrade`. Run `flask db downgrade` and `upgrade` again locally to prove reversibility.
|
|
71
|
+
- **Stop and ask the user** before a migration that drops columns or tables or rewrites a large table. Never run `flask db upgrade` against a shared or production database yourself.
|
|
72
|
+
|
|
73
|
+
## 5. Contexts: current_app, g, request, session
|
|
74
|
+
|
|
75
|
+
| Symptom | Cause | Fix |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| `RuntimeError: Working outside of application context` | Using `current_app`, `db.session` or `g` in a script, CLI, thread or test with no app pushed | `with app.app_context():` around the work, or use a `@app.cli.command()` (which pushes one) |
|
|
78
|
+
| `Working outside of request context` | Touching `request` or `session` outside a request | Pass values in as arguments; in tests use `app.test_request_context()` |
|
|
79
|
+
| Data shared between users | Storing per-request state in a module global | Store it on `g` (lives for one app context) |
|
|
80
|
+
| Background thread loses context | Contexts are per thread | Pass plain data and push `app.app_context()` in the thread; better, use a task queue |
|
|
81
|
+
|
|
82
|
+
- Never pass `request`, `g` or `current_app` proxies to a thread or task. Use `current_app._get_current_object()` only when you must hand the real app object over.
|
|
83
|
+
|
|
84
|
+
## 6. Security
|
|
85
|
+
|
|
86
|
+
- Forms: Flask-WTF's `CSRFProtect` (create `csrf = CSRFProtect()` in `extensions.py`, call `csrf.init_app(app)` in the factory) for any cookie-authenticated POST. Exempt only token-authenticated API endpoints, and say why.
|
|
87
|
+
- Cookies in production: `SESSION_COOKIE_SECURE=True`, `SESSION_COOKIE_HTTPONLY=True` (default), `SESSION_COOKIE_SAMESITE="Lax"`. The default session is signed, not encrypted: never put secrets in it.
|
|
88
|
+
- Templates autoescape `.html` files; never use `Markup(...)` or `|safe` on user input, and never `render_template_string` with user-controlled template text.
|
|
89
|
+
- Uploads: `secure_filename`, `MAX_CONTENT_LENGTH`, an allow-list of extensions, and save outside the static folder.
|
|
90
|
+
- Redirects: validate `next` parameters against your own host before redirecting.
|
|
91
|
+
- SQL: use the ORM or `text()` with bound parameters, never f-strings.
|
|
92
|
+
- Behind a proxy, wrap with `werkzeug.middleware.proxy_fix.ProxyFix` set to the real number of proxies, not more.
|
|
93
|
+
|
|
94
|
+
## 7. Testing
|
|
95
|
+
|
|
96
|
+
```python
|
|
97
|
+
# tests/conftest.py
|
|
98
|
+
import pytest
|
|
99
|
+
from myapp import create_app
|
|
100
|
+
from myapp.extensions import db
|
|
101
|
+
|
|
102
|
+
@pytest.fixture
|
|
103
|
+
def app():
|
|
104
|
+
app = create_app(test_config={"TESTING": True,
|
|
105
|
+
"SQLALCHEMY_DATABASE_URI": "sqlite:///:memory:",
|
|
106
|
+
"WTF_CSRF_ENABLED": False})
|
|
107
|
+
with app.app_context():
|
|
108
|
+
db.create_all()
|
|
109
|
+
yield app # outside the context, so tests catch missing-context bugs
|
|
110
|
+
with app.app_context():
|
|
111
|
+
db.drop_all()
|
|
112
|
+
|
|
113
|
+
@pytest.fixture
|
|
114
|
+
def client(app):
|
|
115
|
+
return app.test_client()
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
- A fresh app per test via the factory; never import a shared global app into tests.
|
|
119
|
+
- Use `client.get/post(...)`, `follow_redirects=True` where the flow redirects, and `with client.session_transaction() as s:` to set session state.
|
|
120
|
+
- Test CLI commands with `app.test_cli_runner()`.
|
|
121
|
+
- If production uses PostgreSQL, run at least the query-heavy tests against PostgreSQL; SQLite hides type and constraint differences.
|
|
122
|
+
- For each view: happy path, invalid form, unauthenticated, another user's object.
|
|
123
|
+
|
|
124
|
+
## Rules
|
|
125
|
+
|
|
126
|
+
- Never leave `debug=True` or a hard-coded `SECRET_KEY` in committed code.
|
|
127
|
+
- Never disable CSRF outside test config.
|
|
128
|
+
- Never add global mutable state for per-request data.
|
|
129
|
+
|
|
130
|
+
## Report back
|
|
131
|
+
|
|
132
|
+
End with: files changed, blueprints and routes added, extensions or config keys added, migrations generated (with what you checked in the script), the test command and result, and anything left untested.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Convert my single-file Flask app into an application factory with blueprints",
|
|
4
|
+
"I get RuntimeError: Working outside of application context in my Flask CLI script",
|
|
5
|
+
"Add Flask-SQLAlchemy and Flask-Migrate to this Flask project",
|
|
6
|
+
"Write pytest tests for my Flask login view using the test client",
|
|
7
|
+
"How do I load Flask config from environment variables per environment?"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Add a Django admin page for the orders model",
|
|
11
|
+
"Create FastAPI dependencies for the database session",
|
|
12
|
+
"Review my Django change for unsafe raw SQL",
|
|
13
|
+
"Write a Dockerfile to deploy my Python web app",
|
|
14
|
+
"Fix the pip dependency conflict that stops my Python package from installing"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flutter-patterns
|
|
3
|
+
description: Flutter app architecture from the widget tree up, covering small const widgets and composition over inheritance, choosing between Riverpod, Bloc and Provider for state, declarative routing with go_router or Navigator, FutureBuilder and StreamBuilder async UI with loading and error states, rebuild and jank performance, and Dart-to-native platform channels or Pigeon. Use when building or restructuring Flutter screens and widgets, picking or applying a state management approach, wiring navigation and deep links, chasing dropped frames, or calling iOS or Android code from a Flutter app.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Needs the Flutter SDK (flutter analyze, flutter test); device runs need Xcode for iOS or the Android SDK.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: coding
|
|
9
|
+
kete-loom/risk: runs-commands
|
|
10
|
+
kete-loom/requires: "flutter"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Flutter patterns
|
|
15
|
+
|
|
16
|
+
Build Flutter screens from small widgets, keep state where one decision rule puts it, and keep frames under budget. Plain Dart language features, isolates and package layout belong to `dart-patterns`; widget and golden tests belong to `dart-testing`. To review someone else's Flutter change, use the `flutter-reviewer` agent.
|
|
17
|
+
|
|
18
|
+
## 0. Before you write
|
|
19
|
+
|
|
20
|
+
1. Read `pubspec.yaml`: Flutter/Dart SDK constraints, and which of `flutter_riverpod`, `flutter_bloc`, `provider`, `go_router`, `auto_route` are already used.
|
|
21
|
+
2. Read `analysis_options.yaml`. Keep `flutter_lints` (or the project's stricter set) on; `use_build_context_synchronously` catches real async bugs. `prefer_const_constructors` is no longer in `flutter_lints` (removed in 5.0), so enable it explicitly if the team wants const enforced.
|
|
22
|
+
3. Follow the existing folder layout (feature-first `lib/features/<name>/` or layer-first). Don't reorganise unasked.
|
|
23
|
+
4. Run `flutter analyze` and `flutter test` once and record the result.
|
|
24
|
+
|
|
25
|
+
## 1. Widget composition
|
|
26
|
+
|
|
27
|
+
- Split a widget when a part rebuilds for different reasons, is reused, or the `build` method passes ~80 lines. Extract a **widget class**, not a helper method returning `Widget`: classes get their own element, can be `const` and rebuild independently.
|
|
28
|
+
- Mark constructors and instances `const` wherever possible; const subtrees are skipped on rebuild.
|
|
29
|
+
- `StatelessWidget` by default. Use `StatefulWidget` only for state owned by this widget: controllers, animation, focus, local form input.
|
|
30
|
+
- Every `TextEditingController`, `AnimationController`, `ScrollController`, `FocusNode`, `StreamSubscription` and `Timer` created in a `State` is disposed or cancelled in `dispose()`. Create them in `initState`, never in `build`.
|
|
31
|
+
- Pass data down through constructors; pass events up through callbacks. Don't reach into a child's state with a `GlobalKey` unless a framework API (forms, navigators) needs it.
|
|
32
|
+
- Keys: use `ValueKey(item.id)` on list items that can reorder, insert or delete, so state follows the item.
|
|
33
|
+
|
|
34
|
+
## 2. State management
|
|
35
|
+
|
|
36
|
+
Use what the project already uses. For a new project or a new kind of state, apply this rule:
|
|
37
|
+
|
|
38
|
+
| State | Put it in |
|
|
39
|
+
|---|---|
|
|
40
|
+
| Ephemeral UI (tab index, expanded, text field) | `State` of the widget |
|
|
41
|
+
| Shared app or server state, new or small-to-mid project | Riverpod (`Notifier` / `AsyncNotifier`, optionally with `riverpod_generator`) |
|
|
42
|
+
| Event-driven flows where the team wants explicit events and transitions | Bloc / Cubit (`flutter_bloc`) |
|
|
43
|
+
| Existing Provider app | Keep `provider` with `ChangeNotifier`; don't mix in a second library |
|
|
44
|
+
|
|
45
|
+
Rules that apply to all three:
|
|
46
|
+
|
|
47
|
+
- Keep business logic out of widgets: a notifier, cubit or repository owns it, and is unit-testable without a widget.
|
|
48
|
+
- State objects are immutable values (`copyWith`, or `freezed` if already used); never mutate a list in place and re-emit the same instance.
|
|
49
|
+
- Watch the narrowest thing: `ref.watch(provider.select((s) => s.count))`, `context.select`, or `BlocSelector`, so unrelated changes don't rebuild the screen.
|
|
50
|
+
- Use `ref.read` / `context.read` in callbacks, `watch` only in `build`.
|
|
51
|
+
- Model async state explicitly: loading, data, error (`AsyncValue` in Riverpod, sealed state classes in Bloc).
|
|
52
|
+
|
|
53
|
+
## 3. Navigation
|
|
54
|
+
|
|
55
|
+
- Apps with deep links, web, or nested tabs: `go_router` with a single route table, path parameters for IDs, and `redirect` for auth guards.
|
|
56
|
+
- Small apps with no deep links: `Navigator.push` with `MaterialPageRoute` is fine.
|
|
57
|
+
- Pass IDs in routes, not whole objects, so deep links and restoration work.
|
|
58
|
+
- Return results with `Navigator.pop(context, value)` / `context.pop(value)` and await the push.
|
|
59
|
+
- Handle the Android back button with `PopScope` where leaving would lose data.
|
|
60
|
+
|
|
61
|
+
## 4. Async UI
|
|
62
|
+
|
|
63
|
+
- Never start a future inside `build`. `FutureBuilder(future: fetch())` refetches on every rebuild. Create the future in `initState` (or a provider) and pass the stored future.
|
|
64
|
+
- Always render all three states: loading, error with a retry, and data (including empty).
|
|
65
|
+
- After every `await` in a `State` method, check `if (!mounted) return;` before using `context` or calling `setState`. For a `BuildContext` passed in as a parameter, check `context.mounted`.
|
|
66
|
+
- Capture `Navigator.of(context)` or `ScaffoldMessenger.of(context)` before the `await` when you need them after it.
|
|
67
|
+
- Cancel stream subscriptions in `dispose()`; prefer `StreamBuilder` or a provider so the framework does it.
|
|
68
|
+
|
|
69
|
+
## 5. Performance
|
|
70
|
+
|
|
71
|
+
Measure in **profile mode** (`flutter run --profile`) on a real device, with the DevTools performance view and "track widget rebuilds". Debug mode is not representative.
|
|
72
|
+
|
|
73
|
+
- Long or unbounded lists: `ListView.builder` / `SliverList` with `itemExtent` or `prototypeItem` when rows are fixed height. Never `Column` + `map` inside a `SingleChildScrollView` for long data.
|
|
74
|
+
- Avoid `shrinkWrap: true` on long lists inside other scrollables; use slivers in a `CustomScrollView`.
|
|
75
|
+
- Keep `build` cheap: no parsing, sorting, I/O or `DateFormat` construction in it. Move heavy CPU work to `compute()` / `Isolate.run`.
|
|
76
|
+
- `Opacity`, `ClipRRect`, `ShaderMask` and `BackdropFilter` over large areas are expensive; prefer `FadeTransition`, pre-clipped images or a colour with alpha.
|
|
77
|
+
- Wrap independently animating regions in `RepaintBoundary` only when the DevTools repaint view shows it helps.
|
|
78
|
+
- Size images: `cacheWidth` / `cacheHeight` on `Image` for thumbnails.
|
|
79
|
+
|
|
80
|
+
## 6. Platform channels
|
|
81
|
+
|
|
82
|
+
1. Search pub.dev for a maintained plugin (federated, with iOS and Android support) first.
|
|
83
|
+
2. For your own native calls, prefer **Pigeon** to generate type-safe Dart, Kotlin and Swift code over hand-written `MethodChannel` string maps.
|
|
84
|
+
3. With `MethodChannel`: one channel name per feature (`com.example.app/battery`), handle `PlatformException` and `MissingPluginException` in Dart, and return errors from native with an error code, never a crash.
|
|
85
|
+
4. Platform handlers run on the platform's main thread; move long native work to a background thread and reply when done.
|
|
86
|
+
5. Native code changes need a full rebuild, not a hot reload. Test on both platforms.
|
|
87
|
+
|
|
88
|
+
**Stop and ask the user** before adding a new state management or routing package, raising the SDK constraint, or changing native project settings (signing, min SDK, deployment target).
|
|
89
|
+
|
|
90
|
+
## Never
|
|
91
|
+
|
|
92
|
+
- Never call `setState` or use `context` after an `await` without a mounted check.
|
|
93
|
+
- Never create controllers, futures or streams inside `build`.
|
|
94
|
+
- Never use a helper method where a const widget class would do.
|
|
95
|
+
- Never ignore an analyzer warning by adding `// ignore:` without saying why.
|
|
96
|
+
|
|
97
|
+
## Report back
|
|
98
|
+
|
|
99
|
+
End with: widgets and files changed, state approach used and why, `flutter analyze` and `flutter test` results, and the platforms and mode (debug, profile, release) you ran it in.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Should this Flutter app use Riverpod or Bloc for the cart and auth state?",
|
|
4
|
+
"Set up go_router with a login redirect and a product/:id route",
|
|
5
|
+
"My FutureBuilder keeps refetching every time the parent rebuilds, how do I structure this screen?",
|
|
6
|
+
"Call the Android battery API from my Flutter app using Pigeon",
|
|
7
|
+
"Break this 400-line Flutter build method into smaller widgets"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Review this Flutter pull request for setState after await and leaked controllers",
|
|
11
|
+
"Convert these Dart enums and nullable fields into a sealed class hierarchy",
|
|
12
|
+
"Write widget tests and golden tests for the checkout screen",
|
|
13
|
+
"My React Native FlashList is janky on older Android phones",
|
|
14
|
+
"Build a Jetpack Compose list screen backed by a ViewModel"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flutterwave-integration
|
|
3
|
+
description: Builds and reviews Flutterwave v3 payment integrations across African markets, covering Flutterwave Standard hosted checkout, direct charges for mobile money (Ghana, Kenya M-Pesa, Uganda, Francophone) and cards, server-side verification by transaction id, verif-hash webhook checks and fulfilment that runs once per tx_ref. Use when adding Flutterwave payments to an app, handling a Flutterwave webhook or redirect, charging a mobile money wallet through Flutterwave, or debugging why a Flutterwave order was marked paid wrongly or twice.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Live calls need network access to api.flutterwave.com. Examples are TypeScript (Node 18+); the rules apply to any backend language.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: integrations
|
|
9
|
+
kete-loom/risk: network
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Flutterwave integration
|
|
14
|
+
|
|
15
|
+
Build a Flutterwave flow where the browser can't fake a payment, every `tx_ref` gives value at most once, and pending mobile money charges still settle. This skill targets the v3 API (`https://api.flutterwave.com/v3`). If the account uses a newer API version, stop and confirm the endpoints and webhook signing scheme in the dashboard and docs before writing code.
|
|
16
|
+
|
|
17
|
+
## Ground rules
|
|
18
|
+
|
|
19
|
+
1. **The secret key stays on the server.** `FLW_SECRET_KEY` (`FLWSECK-...`) and the encryption key are read from the environment. Only the public key (`FLWPUBK-...`) may reach a browser or app.
|
|
20
|
+
2. **The server sets the price.** Compute `amount` and `currency` from your own order record. Never accept them from the client.
|
|
21
|
+
3. **One `tx_ref` per attempt, stored before you call Flutterwave**, with a unique constraint. Flutterwave requires `tx_ref` to be unique per transaction. A customer retry gets a new `tx_ref` on the same order.
|
|
22
|
+
4. **Only a verify call gives value.** The redirect query string and the webhook body are hints. Call `GET /v3/transactions/{id}/verify` and require: `status === "successful"`, `tx_ref` equals yours, `currency` equals yours, and `amount >= expected` (if higher, give value and refund the difference, as Flutterwave's docs advise).
|
|
23
|
+
5. **Fulfilment is idempotent.** Mark paid with a guarded update (`UPDATE payments SET status='paid' WHERE tx_ref = $1 AND status = 'pending'`) and fulfil only if a row changed. Webhooks retry, users refresh, and both paths may run at once.
|
|
24
|
+
6. **Amounts are decimals in major units** in v3 (GHS 25.50 is `25.5`). Store integer minor units in your database and convert at the API boundary; never do float arithmetic on money.
|
|
25
|
+
7. **Test keys first** (`FLWSECK_TEST-...`) until success, failure, cancel and duplicate-webhook paths all work.
|
|
26
|
+
|
|
27
|
+
## Choose the flow
|
|
28
|
+
|
|
29
|
+
| Need | Use |
|
|
30
|
+
|---|---|
|
|
31
|
+
| Fastest safe integration, cards + mobile money + bank, no PCI scope | Flutterwave Standard: `POST /v3/payments` returns `data.link`, redirect there |
|
|
32
|
+
| Your own UI for mobile money | Direct charge: `POST /v3/charges?type=<method>` (see `references/api.md`) |
|
|
33
|
+
| Your own card form | Direct card charge needs payload encryption with the account encryption key and puts you in PCI DSS scope. Stop and ask the user before building it; prefer Standard or the inline modal |
|
|
34
|
+
|
|
35
|
+
## Flow (Standard)
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
client ──(order id)──▶ server: create payment row (tx_ref, expected amount/currency, pending)
|
|
39
|
+
server ──POST /v3/payments──▶ Flutterwave: data.link
|
|
40
|
+
client ──redirect──▶ hosted page; customer pays
|
|
41
|
+
Flutterwave ──redirect_url?status=..&tx_ref=..&transaction_id=..──▶ server: verify by id, show result
|
|
42
|
+
Flutterwave ──webhook charge.completed (verif-hash header)──▶ server: check hash, 200, queue verify + fulfil once
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Implementation steps
|
|
46
|
+
|
|
47
|
+
1. **Create the payment** with `POST /v3/payments`, `Authorization: Bearer <secret key>`, body `tx_ref`, `amount`, `currency`, `redirect_url`, `customer.email` (required), optional `customer.name`, `customer.phonenumber`, `payment_options`, `meta` (put your order id here). Shapes in `references/api.md`.
|
|
48
|
+
2. **Redirect handler**: read `transaction_id` from the query, call verify by id, apply ground rule 4, then show the stored status. A `status=cancelled` or `failed` redirect has nothing to verify; show the failure and offer a retry with a new `tx_ref`.
|
|
49
|
+
3. **Webhook endpoint**: follow `references/webhooks.md`. Compare the `verif-hash` header to your stored secret hash in constant time, return `200` fast, then verify by `data.id` before fulfilling.
|
|
50
|
+
4. **Mobile money direct charges**: follow the per-country notes in `references/api.md`. A `"success"` response with "Charge initiated" means the prompt was sent, not that money moved. Ghana returns `meta.authorization.mode: "redirect"`; send the customer to `meta.authorization.redirect`.
|
|
51
|
+
5. **Reconcile pending payments**: a background job verifies payments still `pending` after a few minutes (verify by id if you have it; otherwise look up by `tx_ref` using the endpoint the current docs give) and times out stale ones.
|
|
52
|
+
6. **Persist** per payment: `tx_ref`, order id, expected amount (minor units) and currency, Flutterwave transaction `id`, `flw_ref`, status, payment type, failure reason, timestamps.
|
|
53
|
+
|
|
54
|
+
## Reviewing an existing integration
|
|
55
|
+
|
|
56
|
+
Check every ground rule, then look for:
|
|
57
|
+
|
|
58
|
+
- Fulfilment in the redirect handler based on `status=successful` in the query string, without a verify call.
|
|
59
|
+
- Verify result trusted without comparing `amount`, `currency` and `tx_ref` to the stored order.
|
|
60
|
+
- Webhook with no `verif-hash` check, or a check with `==` against a hard-coded value in source.
|
|
61
|
+
- Webhook doing the verify and fulfilment inline before responding, so slow calls cause retries.
|
|
62
|
+
- `tx_ref` reused across attempts, or generated on the client.
|
|
63
|
+
- Amounts multiplied by 100 (Paystack habit) or computed with floats.
|
|
64
|
+
- Secret key in a `NEXT_PUBLIC_`/`VITE_` variable or committed to the repo.
|
|
65
|
+
- No handling for `failed`, `cancelled` or a charge that stays `pending`.
|
|
66
|
+
|
|
67
|
+
## Stop and ask the user
|
|
68
|
+
|
|
69
|
+
- Before building a raw card form (encryption plus PCI scope).
|
|
70
|
+
- Which countries and currencies they sell in; payment methods differ per country.
|
|
71
|
+
- Whether refunds or payouts (transfers) are in scope; they are separate APIs with their own approvals.
|
|
72
|
+
|
|
73
|
+
## Before you finish
|
|
74
|
+
|
|
75
|
+
Flutterwave's docs at developer.flutterwave.com are the final word on field names and versions; confirm them when writing new code. Then test in test mode: a successful payment, a declined card, a cancelled checkout, a mobile money charge that times out, the same webhook delivered twice (fulfils once), a webhook with a wrong `verif-hash` (rejected), and a tampered redirect URL (`status=successful` with a failed transaction id must not fulfil).
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Add Flutterwave checkout to our Nigerian e-commerce site",
|
|
4
|
+
"How do I check the verif-hash header on my Flutterwave webhook endpoint?",
|
|
5
|
+
"Charge a Kenyan customer's M-Pesa wallet through Flutterwave from our backend",
|
|
6
|
+
"Our Flutterwave redirect marks orders paid even when the transaction failed, can you fix it?",
|
|
7
|
+
"Accept Ghana mobile money with Flutterwave direct charge instead of the hosted page"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Add Paystack checkout to our Next.js shop so Ghanaian customers can pay",
|
|
11
|
+
"Send an STK push with the Safaricom Daraja API directly",
|
|
12
|
+
"Set up Stripe subscriptions with a customer portal",
|
|
13
|
+
"Review our payment code for float money arithmetic and unverified webhooks",
|
|
14
|
+
"Integrate Hubtel online checkout for a Ghanaian school fees portal"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Flutterwave v3 API shapes used by this skill
|
|
2
|
+
|
|
3
|
+
Base URL: `https://api.flutterwave.com/v3`. Server calls send `Authorization: Bearer <FLW_SECRET_KEY>` and `Content-Type: application/json`. A top-level `"status": "success"` means the API call worked, not that money moved.
|
|
4
|
+
|
|
5
|
+
Confirm fields against developer.flutterwave.com before shipping; this is a working summary.
|
|
6
|
+
|
|
7
|
+
## Create a Standard payment link
|
|
8
|
+
|
|
9
|
+
`POST /payments`
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"tx_ref": "ord_8f2c1a_a1",
|
|
14
|
+
"amount": "25.50",
|
|
15
|
+
"currency": "GHS",
|
|
16
|
+
"redirect_url": "https://app.example.com/pay/flutterwave/return",
|
|
17
|
+
"customer": { "email": "customer@example.com", "name": "Ama Mensah", "phonenumber": "233241234567" },
|
|
18
|
+
"payment_options": "card, mobilemoneyghana",
|
|
19
|
+
"meta": { "order_id": "8f2c1a" },
|
|
20
|
+
"customizations": { "title": "Example Store" }
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Response: `data.link`. Redirect the customer there. `currency` defaults to NGN when omitted, so always send it. `payment_options` only applies when "Disable preferred payment methods" is off in the dashboard.
|
|
25
|
+
|
|
26
|
+
Redirect back to `redirect_url`:
|
|
27
|
+
- success: `?status=successful&tx_ref=...&transaction_id=...`
|
|
28
|
+
- cancelled or failed: `?status=cancelled&tx_ref=...` (no transaction to verify)
|
|
29
|
+
|
|
30
|
+
## Verify a transaction
|
|
31
|
+
|
|
32
|
+
`GET /transactions/{id}/verify`, where `id` is `transaction_id` from the redirect or `data.id` from the webhook.
|
|
33
|
+
|
|
34
|
+
| Field in `data` | Expect |
|
|
35
|
+
|---|---|
|
|
36
|
+
| `status` | `"successful"` (others include `failed`, `pending`) |
|
|
37
|
+
| `tx_ref` | the reference you stored |
|
|
38
|
+
| `currency` | the currency you stored |
|
|
39
|
+
| `amount` | `>=` the expected amount; refund any excess |
|
|
40
|
+
| `id`, `flw_ref` | store both |
|
|
41
|
+
|
|
42
|
+
## Direct charges (mobile money)
|
|
43
|
+
|
|
44
|
+
`POST /charges?type=<type>` with `tx_ref`, `amount`, `currency`, `email`, `phone_number`, and any country-specific fields.
|
|
45
|
+
|
|
46
|
+
| Market | `type` | Currency | Notes |
|
|
47
|
+
|---|---|---|---|
|
|
48
|
+
| Ghana | `mobile_money_ghana` | GHS | Also send `network`. The docs list both `MTN`/`VODAFONE`/`TIGO` and `MTN`/`Telecel`/`AIRTEL`; confirm accepted values in the current reference. Response has `meta.authorization.mode: "redirect"`; send the customer to `meta.authorization.redirect` |
|
|
49
|
+
| Kenya | `mpesa` | KES | Customer approves an STK prompt |
|
|
50
|
+
| Uganda | `mobile_money_uganda` | UGX | Confirm in the reference |
|
|
51
|
+
| Francophone West/Central Africa | `mobile_money_franco` | XOF / XAF | Confirm in the reference, including `country` |
|
|
52
|
+
|
|
53
|
+
Every direct charge ends the same way: wait for the `charge.completed` webhook (or poll), then verify by id before giving value.
|
|
54
|
+
|
|
55
|
+
## Minimal server client (TypeScript)
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
const FLW = 'https://api.flutterwave.com/v3';
|
|
59
|
+
const headers = { Authorization: `Bearer ${process.env.FLW_SECRET_KEY}`, 'Content-Type': 'application/json' };
|
|
60
|
+
|
|
61
|
+
export async function verifyFlutterwave(id: string, expected: { txRef: string; currency: string; amountMinor: number }) {
|
|
62
|
+
const res = await fetch(`${FLW}/transactions/${encodeURIComponent(id)}/verify`, { headers });
|
|
63
|
+
if (!res.ok) throw new Error(`verify failed: ${res.status}`);
|
|
64
|
+
const { data } = await res.json();
|
|
65
|
+
const paidMinor = Math.round(Number(data.amount) * 100); // shortcut: assumes 2-decimal currencies; UGX/XOF/XAF have 0
|
|
66
|
+
return (
|
|
67
|
+
data.status === 'successful' &&
|
|
68
|
+
data.tx_ref === expected.txRef &&
|
|
69
|
+
data.currency === expected.currency &&
|
|
70
|
+
paidMinor >= expected.amountMinor
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
```
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Flutterwave webhooks (v3)
|
|
2
|
+
|
|
3
|
+
## What Flutterwave sends
|
|
4
|
+
|
|
5
|
+
- `POST` with JSON such as `{ "event": "charge.completed", "data": { "id": 123, "tx_ref": "...", "status": "successful", "amount": 25.5, "currency": "GHS", ... } }`.
|
|
6
|
+
- Header `verif-hash`: the **secret hash** you set in the dashboard webhook settings. It is a shared secret echoed back, not an HMAC of the body, so it proves the sender knows the secret but not that the body is untouched. That is why every webhook is followed by a verify call.
|
|
7
|
+
- Anything other than `200` (including `3xx`) is a failure. With retries enabled in the dashboard, Flutterwave retries 3 times, 30 minutes apart. Requests time out after 60 seconds. Response body and headers are ignored.
|
|
8
|
+
|
|
9
|
+
If the dashboard or docs for your account show an HMAC signature header instead of, or as well as, `verif-hash`, verify that signature on the raw body and keep the verify call.
|
|
10
|
+
|
|
11
|
+
## Handler rules
|
|
12
|
+
|
|
13
|
+
1. Store the secret hash in the environment (`FLW_WEBHOOK_HASH`), not in code.
|
|
14
|
+
2. Read the `verif-hash` header. Missing or not equal (constant-time compare) → respond `401` and stop.
|
|
15
|
+
3. Respond `200` immediately, then enqueue `data.id` for processing.
|
|
16
|
+
4. The processor calls `GET /v3/transactions/{id}/verify`, applies the checks in `api.md`, and marks the payment paid with a guarded update keyed on `tx_ref`. Unknown `tx_ref` → log and drop; never create an order from a webhook.
|
|
17
|
+
5. Log event type, `id` and `tx_ref`. Never log card data, the secret key or the hash.
|
|
18
|
+
|
|
19
|
+
## Express (TypeScript)
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import crypto from 'node:crypto';
|
|
23
|
+
import express from 'express';
|
|
24
|
+
|
|
25
|
+
const app = express();
|
|
26
|
+
const HASH = process.env.FLW_WEBHOOK_HASH!;
|
|
27
|
+
|
|
28
|
+
function sameSecret(a: string, b: string) {
|
|
29
|
+
const x = Buffer.from(a), y = Buffer.from(b);
|
|
30
|
+
return x.length === y.length && crypto.timingSafeEqual(x, y);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
app.post('/webhooks/flutterwave', express.json(), (req, res) => {
|
|
34
|
+
if (!sameSecret(req.header('verif-hash') ?? '', HASH)) return res.sendStatus(401);
|
|
35
|
+
res.sendStatus(200); // acknowledge first
|
|
36
|
+
if (req.body?.event === 'charge.completed' && req.body.data?.id) {
|
|
37
|
+
queue.add('flw-verify', { id: String(req.body.data.id) }); // verify + fulfil once
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Guarded fulfilment (SQL)
|
|
43
|
+
|
|
44
|
+
```sql
|
|
45
|
+
UPDATE payments
|
|
46
|
+
SET status = 'paid', flw_id = $2, paid_at = now()
|
|
47
|
+
WHERE tx_ref = $1 AND status = 'pending'
|
|
48
|
+
RETURNING order_id; -- fulfil only when a row comes back
|
|
49
|
+
```
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: freight-carrier-management
|
|
3
|
+
description: Truckload, LTL and intermodal carrier sourcing and governance for shippers and brokers, covering FMCSA operating authority and safety record checks on SAFER and SMS, certificates of insurance and cargo cover, double-brokering and identity fraud red flags, lane rate benchmarking against spot and contract indices, carrier scorecards for on-time, tender acceptance and claims, routing-guide tendering, and contract and rate negotiation. Use when onboarding or vetting a new carrier, running a freight bid or RFP, building a routing guide or carrier scorecard, or deciding which carriers to keep, grow or drop on a lane.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. FMCSA lookups need network access to safer.fmcsa.dot.gov and ai.fmcsa.dot.gov; rate benchmarks need the user's own index or TMS data. US-centred; other countries have their own carrier registers. Not legal or insurance advice.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: business
|
|
9
|
+
kete-loom/risk: network
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Freight carrier management
|
|
14
|
+
|
|
15
|
+
Put only legitimate, insured, safe carriers on your freight, pay a defensible rate for each lane, and keep the routing guide honest with data. This skill covers the carrier base before and between loads. A shipment that has already gone wrong (late, damaged, lost) belongs to the `logistics-exception-management` skill; duties and border paperwork to `customs-trade-compliance`.
|
|
16
|
+
|
|
17
|
+
## 0. Scope the job
|
|
18
|
+
|
|
19
|
+
Ask the user, then restate:
|
|
20
|
+
|
|
21
|
+
1. Mode and equipment: truckload (dry van, reefer, flatbed), LTL, intermodal (rail with drayage), or a mix.
|
|
22
|
+
2. Lanes: origin and destination (3-digit ZIP or city), annual or weekly volume, seasonality, hazmat or temperature control.
|
|
23
|
+
3. Who the user is: a shipper buying from carriers and brokers, or a broker buying from carriers. Brokers carry their own FMCSA duties.
|
|
24
|
+
4. The output wanted: onboarding checklist, vetting result for named carriers, bid package, scorecard, or negotiation plan.
|
|
25
|
+
|
|
26
|
+
If lane volumes or service requirements are missing, **stop and ask**: a bid or benchmark without them is guesswork.
|
|
27
|
+
|
|
28
|
+
## 1. Vet a carrier before the first load
|
|
29
|
+
|
|
30
|
+
Run every check and record the date, the source and the result.
|
|
31
|
+
|
|
32
|
+
1. **Identity.** Get the USDOT number (and MC/docket number if issued) from the carrier, not from an email signature. Look it up on SAFER Company Snapshot (safer.fmcsa.dot.gov). Check legal name, DBA, physical address, phone, power units and drivers match what the carrier told you. FMCSA has been moving to a USDOT-number-only identifier; check the current FMCSA registration guidance before relying on MC numbers in your process.
|
|
33
|
+
2. **Authority.** On FMCSA Licensing and Insurance (L&I), operating authority for the right type (common or contract carrier of property; broker is a separate authority) must be `ACTIVE`, not pending, revoked or inactive. Note the authority grant date: very new authority is higher risk, not disqualifying.
|
|
34
|
+
3. **Safety.** Read the safety rating (Satisfactory, Conditional, Unsatisfactory, or not rated) and the SMS results at ai.fmcsa.dot.gov/SMS: out-of-service rates against the national average, crash history, and any category marked as over the intervention threshold. FMCSA has announced a revised SMS methodology that replaces the BASICs with new safety categories; read whichever version is live and record which one you used. Unsatisfactory or out-of-service: do not use.
|
|
35
|
+
4. **Insurance.** Get the certificate of insurance from the agent, not the carrier, and confirm it with the agent by phone or email to an address you found yourself. Check: auto liability at or above the federal minimum for the commodity ($750,000 for general freight in interstate commerce over 10,001 lb GVWR under 49 CFR 387.9; more for hazmat) and at or above your own contract minimum (many shippers require $1,000,000); cargo cover sized to your highest load value, with exclusions read (reefer breakdown, unattended vehicle, theft, high-value commodities); general liability if they come on site; you named as certificate holder or additional insured as your contract requires. Federal filings on L&I must match. Cargo cover is not federally required for general freight, so your contract must require it.
|
|
36
|
+
5. **Brokers.** When the capacity comes from a broker, check broker authority (separate from carrier authority) is `ACTIVE` on L&I and that its $75,000 financial security (BMC-84 surety bond or BMC-85 trust fund, 49 CFR 387.307) is on file. Ask which carriers they use and whether they vet them to your standard.
|
|
37
|
+
6. **Paperwork.** Signed carrier agreement, W-9, remit-to details, and for brokers buying capacity, the carrier's acceptance of your no-re-brokering clause.
|
|
38
|
+
7. **Fraud red flags** (any one means **stop and escalate** to whoever owns carrier risk):
|
|
39
|
+
- Contact email on a free domain that does not match the SAFER record, or phone numbers that changed recently.
|
|
40
|
+
- Recent change of address, ownership or contact details, or dormant authority suddenly active.
|
|
41
|
+
- Remit-to bank account changed by email; verify any payment change by calling a number already on file.
|
|
42
|
+
- Rates far below market with eager acceptance, or the truck's DOT on arrival differs from the one booked (double brokering).
|
|
43
|
+
- Equipment count on SAFER that cannot cover the loads being accepted.
|
|
44
|
+
8. Use a carrier-monitoring service (the user's choice) for continuous alerts on authority, insurance and safety changes. Re-vet at least yearly and on any alert.
|
|
45
|
+
|
|
46
|
+
## 2. Benchmark the rate
|
|
47
|
+
|
|
48
|
+
1. Break every rate into linehaul, fuel surcharge (and the table it references, usually tied to the US EIA weekly diesel price), and accessorials (detention, layover, stop-off, lumper, liftgate, TONU).
|
|
49
|
+
2. Compare linehaul per mile, ex-fuel, against the user's own history for the lane and a market index they subscribe to (spot and contract). State the index, date and date range; never invent a market rate.
|
|
50
|
+
3. LTL is priced differently: base rate from a tariff (a carrier's own, or a neutral base such as SMC3 CzarLite), a discount percentage, an absolute minimum charge, freight class from density, and accessorials. Compare net cost per shipment on a sample of real shipments, not discount percentages.
|
|
51
|
+
4. Intermodal: compare door-to-door all-in against truckload, including drayage both ends, chassis, and transit days. It usually suits lanes long enough to absorb the extra handling and that tolerate longer transit.
|
|
52
|
+
5. Flag lanes where the contract rate is well below spot: tender rejections will follow.
|
|
53
|
+
|
|
54
|
+
## 3. Run a bid
|
|
55
|
+
|
|
56
|
+
1. Package: lanes with volume, equipment, service requirements, accessorial schedule, fuel table, payment terms, insurance minimums and contract term.
|
|
57
|
+
2. Invite only vetted carriers and brokers; give a deadline and a fixed response template (one row per lane).
|
|
58
|
+
3. Award per lane: a primary, one or two backups, and a spot fallback. Weigh rate against scorecard history, not rate alone.
|
|
59
|
+
4. Confirm awards in writing with committed volume (a range, not a promise you cannot keep) and the rate validity period.
|
|
60
|
+
|
|
61
|
+
## 4. Routing guide and tendering
|
|
62
|
+
|
|
63
|
+
- Tender in routing-guide order with a response deadline (for example 2 hours for next-day pickup). On rejection, go to the next carrier; log every tender, acceptance and rejection with time.
|
|
64
|
+
- Track tender acceptance rate per carrier and lane. A primary below the agreed acceptance level for several weeks gets a conversation, then a re-sequence.
|
|
65
|
+
- Never tender to an unvetted carrier because a load is urgent; use a vetted broker instead.
|
|
66
|
+
|
|
67
|
+
## 5. Scorecard
|
|
68
|
+
|
|
69
|
+
Score monthly per carrier, from shipment data, with the same definitions for everyone:
|
|
70
|
+
|
|
71
|
+
| Metric | Definition |
|
|
72
|
+
|---|---|
|
|
73
|
+
| Tender acceptance | accepted tenders / tenders offered |
|
|
74
|
+
| On-time pickup | picked up within the appointment window / pickups |
|
|
75
|
+
| On-time delivery | delivered within window / deliveries |
|
|
76
|
+
| Tracking compliance | loads with location updates at the agreed interval / loads |
|
|
77
|
+
| Claims ratio | claim value / freight spend, and claim count / loads |
|
|
78
|
+
| Invoice accuracy | invoices paid without dispute / invoices |
|
|
79
|
+
| Cost | average cost per mile or per shipment vs lane benchmark |
|
|
80
|
+
|
|
81
|
+
Share the scorecard with the carrier before acting on it. Decide grow / hold / improve plan / exit per carrier, with the numbers that drove it.
|
|
82
|
+
|
|
83
|
+
## 6. Contract and negotiation
|
|
84
|
+
|
|
85
|
+
- Terms to set: liability for cargo loss (Carmack Amendment applies to interstate carriers by default; any limit must be agreed in writing), claims filing and payment periods, indemnity, insurance minimums, no re-brokering, confidentiality, payment terms, fuel table, accessorial schedule, detention free time, and termination.
|
|
86
|
+
- Negotiate with data: lane history, volume certainty, payment speed, and drop-trailer or fast load and unload times are worth rate.
|
|
87
|
+
- **Stop and ask the user to involve a transportation lawyer** for indemnity changes, cargo liability limits, broker-carrier agreements, or anything the carrier redlines in liability or insurance. Drafting the agreement itself belongs to the `contract-drafting` skill.
|
|
88
|
+
|
|
89
|
+
## Rules
|
|
90
|
+
|
|
91
|
+
- Never book a carrier whose authority is not active or whose insurance you have not confirmed with the agent.
|
|
92
|
+
- Never change remit-to bank details on email instructions alone.
|
|
93
|
+
- Never state a market rate, FMCSA rule or insurance minimum you have not checked on the day; record source and date.
|
|
94
|
+
- Do not use a carrier's safety data to rank drivers or make employment decisions; it is a carrier-level signal.
|
|
95
|
+
|
|
96
|
+
## Report
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
Carrier vetting: <legal name> | USDOT <n> | checked <date>
|
|
100
|
+
- Authority: <type, status, granted date> source: L&I
|
|
101
|
+
- Safety: <rating>; SMS: <categories flagged / none> methodology: <BASICs | revised>
|
|
102
|
+
- Insurance: auto <limit>, cargo <limit, key exclusions>; confirmed with <agent, date>
|
|
103
|
+
- Red flags: <none | list>
|
|
104
|
+
- Decision: approve | approve with conditions | reject | escalate
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
For a bid or scorecard: lane table (lane, volume, incumbent rate, benchmark with source and date, bids, award), carrier scorecard table, decisions with reasons, and items that need legal or insurance review.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"A new trucking company wants our Dallas to Atlanta dry van loads, check their FMCSA authority, safety record and insurance before we book",
|
|
4
|
+
"Build a monthly carrier scorecard with tender acceptance, on-time delivery and claims ratio for our top 15 truckload carriers",
|
|
5
|
+
"We're running our annual freight bid for 40 lanes next month, help me put together the RFP package and award logic",
|
|
6
|
+
"Our contract reefer rates on the Fresno to Chicago lane look high, benchmark them and plan the negotiation with the carrier",
|
|
7
|
+
"Set up a routing guide with primary and backup carriers per lane and rules for tender rejections"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"A pallet of our goods arrived crushed at the customer, help me file the freight claim and tell the customer",
|
|
11
|
+
"Work out the import duty and landed cost for parts we bring in from Mexico by truck",
|
|
12
|
+
"Plan safety stock for SKUs that ship to our regional warehouses weekly",
|
|
13
|
+
"Design the return authorisation and refurbishment flow for products customers send back",
|
|
14
|
+
"Draft a master services agreement with a software vendor from our template"
|
|
15
|
+
]
|
|
16
|
+
}
|