@ketecode/loom 0.0.0-stage → 0.1.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 +516 -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/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/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/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/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 +683 -0
- package/commands/aside.md +19 -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/deps-audit.md +32 -0
- package/commands/epic-decompose.md +21 -0
- package/commands/explain.md +37 -0
- package/commands/feature-dev.md +22 -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/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/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-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/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/protect-files/HOOK.md +24 -0
- package/hooks/protect-files/cases.json +27 -0
- package/hooks/protect-files/hook.js +39 -0
- package/hooks/run.js +132 -0
- package/mcp/atlassian.json +11 -0
- package/mcp/chrome-devtools.json +18 -0
- package/mcp/cloudflare.json +11 -0
- package/mcp/context7.json +11 -0
- package/mcp/fetch.json +17 -0
- package/mcp/figma.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/package.json +59 -4
- package/profiles.json +165 -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/schemas/skill-frontmatter.schema.json +52 -0
- package/scripts/lib/audit.js +96 -0
- package/scripts/lib/frontmatter.js +65 -0
- package/scripts/lib/hooks-install.js +292 -0
- package/scripts/lib/i18n.js +51 -0
- package/scripts/lib/inventory.js +85 -0
- package/scripts/lib/lint.js +158 -0
- package/scripts/lib/mcp-install.js +284 -0
- package/scripts/lib/profiles.js +128 -0
- package/scripts/lib/render.js +86 -0
- package/scripts/lib/rules-install.js +118 -0
- package/scripts/lib/skills.js +86 -0
- package/scripts/lib/targets.js +113 -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-harness-design/SKILL.md +125 -0
- package/skills/agent-harness-design/evals/triggers.json +21 -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-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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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-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/parallel-agent-orchestration/SKILL.md +106 -0
- package/skills/parallel-agent-orchestration/evals/triggers.json +14 -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/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/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/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/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/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/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/triggers.json +14 -0
- package/skills/skill-authoring/SKILL.md +87 -0
- package/skills/skill-authoring/evals/triggers.json +14 -0
- package/skills/skill-authoring/references/frontmatter.md +40 -0
- package/skills/slack-app-integration/SKILL.md +108 -0
- package/skills/slack-app-integration/evals/triggers.json +17 -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/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/tdd-workflow/SKILL.md +67 -0
- package/skills/tdd-workflow/evals/triggers.json +14 -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/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/verification-loop/SKILL.md +70 -0
- package/skills/verification-loop/evals/triggers.json +14 -0
- package/skills/verification-loop/scripts/detect-checks.js +102 -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,117 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: market-research
|
|
3
|
+
description: Structured market and competitor analysis that sizes a market top-down and bottom-up (TAM, SAM, SOM), builds a competitor feature and pricing matrix, defines customer segments, and attaches a source and a confidence level to every figure. Use when someone needs to judge whether a market is worth entering, size an opportunity, compare competitors, or back a business plan or deck with researched numbers rather than guesses.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Web access makes it far more useful; without it, the skill works from sources the user provides and labels everything else as an estimate.
|
|
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
|
+
# Market research
|
|
14
|
+
|
|
15
|
+
Answer a business question with evidence: how big, who competes, who buys, and how sure we are. Every number carries its source and a confidence level.
|
|
16
|
+
|
|
17
|
+
## 0. Frame the question
|
|
18
|
+
|
|
19
|
+
1. Write the decision the research supports ("Should we build a pharmacy inventory product for Ghana and Nigeria?"). Research without a decision sprawls.
|
|
20
|
+
2. Fix the scope: product category, geography, customer type (B2B or B2C, size), time frame and currency.
|
|
21
|
+
3. Ask what the user already knows: their data, customer interviews, known competitors.
|
|
22
|
+
4. **Stop and ask** if the market definition is ambiguous ("fintech in Africa" is not a market). Propose two or three narrower definitions and let the user choose.
|
|
23
|
+
|
|
24
|
+
## 1. Gather sources
|
|
25
|
+
|
|
26
|
+
Prefer, in order:
|
|
27
|
+
|
|
28
|
+
1. **Primary**: the user's own data, customer interviews, sales conversations, surveys.
|
|
29
|
+
2. **Official statistics**: national statistics offices, central banks, regulators, World Bank, IMF, UN and industry regulators' published registers (licensed businesses, operators).
|
|
30
|
+
3. **Company disclosures**: annual reports, regulatory filings, investor presentations, pricing pages.
|
|
31
|
+
4. **Industry reports and reputable press**: note publisher, date and methodology if stated.
|
|
32
|
+
5. **Estimates and blogs**: last resort, and always low confidence.
|
|
33
|
+
|
|
34
|
+
For each source record: title, publisher, date, URL or reference, and what figure it supports. Note when a figure is old or from another geography being used as a proxy.
|
|
35
|
+
|
|
36
|
+
## 2. Size the market
|
|
37
|
+
|
|
38
|
+
Do both methods and compare them.
|
|
39
|
+
|
|
40
|
+
**Top-down**: start from a published total and narrow it.
|
|
41
|
+
`total category spend x share in our geography x share in our segment`.
|
|
42
|
+
|
|
43
|
+
**Bottom-up** (the more credible one): count the customers and multiply by what they would pay.
|
|
44
|
+
`number of target customers x share reachable x annual price = SAM`; then `SOM = SAM x realistic share in 3-5 years`, based on channel capacity and competitor shares, not a round percentage.
|
|
45
|
+
|
|
46
|
+
Definitions:
|
|
47
|
+
|
|
48
|
+
- **TAM**: total demand for the category if every possible customer bought.
|
|
49
|
+
- **SAM**: the part your product and channels can serve (geography, segment, price point).
|
|
50
|
+
- **SOM**: the part you can realistically win in the stated period.
|
|
51
|
+
|
|
52
|
+
Show every step of the arithmetic with its input and source. If the two methods differ by more than about 3x, explain why or say which you trust and why.
|
|
53
|
+
|
|
54
|
+
## 3. Competitor matrix
|
|
55
|
+
|
|
56
|
+
1. List competitors in three groups: direct (same job, same customer), indirect (different product, same job), and substitutes (spreadsheets, manual process, doing nothing).
|
|
57
|
+
2. For the main 4-8, fill a matrix:
|
|
58
|
+
|
|
59
|
+
| Competitor | Target customer | Core offer | Pricing (source, date) | Channels | Strengths | Weaknesses | Evidence of traction |
|
|
60
|
+
|---|---|---|---|---|---|---|---|
|
|
61
|
+
|
|
62
|
+
3. Pick the two or three dimensions that customers actually choose on and place competitors on them. Say where the gap is, and whether a gap reflects an opportunity or a lack of demand.
|
|
63
|
+
4. Pricing and features come from the competitor's own pages or documents when possible; date them, as they change.
|
|
64
|
+
|
|
65
|
+
## 4. Customer segments
|
|
66
|
+
|
|
67
|
+
For each segment (two to four):
|
|
68
|
+
|
|
69
|
+
- Who: firmographics (industry, size) or demographics, and geography.
|
|
70
|
+
- Job to be done and trigger for buying.
|
|
71
|
+
- Current solution and its pain.
|
|
72
|
+
- Willingness and ability to pay; who decides and who pays.
|
|
73
|
+
- Size (count) and how you reached it.
|
|
74
|
+
- How to reach them (channels).
|
|
75
|
+
|
|
76
|
+
Recommend which segment to start with and why (pain, reachability, ability to pay).
|
|
77
|
+
|
|
78
|
+
## 5. Confidence levels
|
|
79
|
+
|
|
80
|
+
Tag every figure and conclusion:
|
|
81
|
+
|
|
82
|
+
- **High**: primary data or an official or audited source, recent, same geography and definition.
|
|
83
|
+
- **Medium**: reputable secondary source with stated methodology, or a close proxy.
|
|
84
|
+
- **Low**: estimate, old data, a different geography, or a source with no method.
|
|
85
|
+
|
|
86
|
+
The overall conclusion can be no more confident than the inputs it rests on most.
|
|
87
|
+
|
|
88
|
+
## Rules
|
|
89
|
+
|
|
90
|
+
- Never invent a statistic, a source, a competitor's revenue or a quote. If you cannot find it, say "not found" and estimate openly with the assumptions shown.
|
|
91
|
+
- Never present a paid-report headline figure without its date and publisher.
|
|
92
|
+
- Keep facts, estimates and opinions visibly separate.
|
|
93
|
+
- Respect site terms; do not scrape behind logins or paywalls.
|
|
94
|
+
|
|
95
|
+
## Report format
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
# Market research: <question>
|
|
99
|
+
Decision supported: <...> Scope: <category, geography, customer, period, currency>
|
|
100
|
+
|
|
101
|
+
## Answer in brief
|
|
102
|
+
<3-5 lines with the headline numbers and confidence>
|
|
103
|
+
|
|
104
|
+
## Market size
|
|
105
|
+
| Measure | Value | Method | Key inputs | Confidence |
|
|
106
|
+
<arithmetic for top-down and bottom-up>
|
|
107
|
+
|
|
108
|
+
## Competitors
|
|
109
|
+
<matrix> <positioning and gaps>
|
|
110
|
+
|
|
111
|
+
## Customer segments
|
|
112
|
+
<table> <recommended starting segment>
|
|
113
|
+
|
|
114
|
+
## Risks and unknowns
|
|
115
|
+
## Sources
|
|
116
|
+
| # | Source | Publisher | Date | Used for |
|
|
117
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"How big is the market for school fee payment software in Ghana? Give me TAM, SAM and SOM.",
|
|
4
|
+
"Build a competitor matrix for invoicing tools aimed at freelancers, with pricing and positioning",
|
|
5
|
+
"Is there a real market for a B2B logistics app for informal traders in Lagos? Research it with sources.",
|
|
6
|
+
"Who are the customer segments for a telehealth subscription in East Africa and which should we start with?",
|
|
7
|
+
"Compare the main players in the African payroll software space and tell me how confident you are in the numbers"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Outline a 12-slide pitch deck for our seed raise",
|
|
11
|
+
"Plan the channels, calendar and budget for our app launch campaign next month",
|
|
12
|
+
"Our pages dropped out of Google's index, audit the site",
|
|
13
|
+
"Research the best Python library for parsing PDFs before I write my own",
|
|
14
|
+
"Write an article explaining why mobile money took off in Kenya"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: marketing-campaign
|
|
3
|
+
description: Builds a go-to-market or promotional campaign plan with one measurable objective, a defined audience, positioning and core message, a channel mix, a week-by-week calendar, a budget split and the metrics that decide success. Use when a founder or team is planning a product launch, a seasonal promotion, a user-acquisition push or any time-boxed marketing campaign and needs a plan they can execute and measure.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. No tools required; reads product docs or analytics exports if the user provides them.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: business
|
|
9
|
+
kete-loom/risk: read-only
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Marketing campaign plan
|
|
14
|
+
|
|
15
|
+
Produce a plan someone can run on Monday: one objective, one audience, one message, few channels, a calendar, a budget and the numbers that say whether it worked.
|
|
16
|
+
|
|
17
|
+
## 0. Brief: collect before planning
|
|
18
|
+
|
|
19
|
+
Ask for anything missing. Do not invent figures the plan depends on.
|
|
20
|
+
|
|
21
|
+
1. **Product or offer**: what is being promoted and what is new about it.
|
|
22
|
+
2. **Objective**: one primary outcome with a number and a date ("400 paid sign-ups by 30 June"). If the user gives several, ask which one wins when they conflict.
|
|
23
|
+
3. **Audience**: who buys, who uses, where they already spend attention.
|
|
24
|
+
4. **Budget and people**: total spend, and who will create content and run channels.
|
|
25
|
+
5. **Constraints**: dates, regulated claims (finance, health), markets and languages, brand rules.
|
|
26
|
+
6. **History**: past campaigns, current conversion rates, cost per acquisition, list sizes. If there is none, say the first campaign is also a measurement exercise.
|
|
27
|
+
|
|
28
|
+
**Stop and ask** if there is no measurable objective or no budget range. A plan without them cannot be judged.
|
|
29
|
+
|
|
30
|
+
## 1. Audience
|
|
31
|
+
|
|
32
|
+
Write one primary segment (and at most one secondary) as:
|
|
33
|
+
|
|
34
|
+
- Who they are (role, context, market).
|
|
35
|
+
- The problem or trigger that makes them look for a solution now.
|
|
36
|
+
- What they use today instead, and why it falls short.
|
|
37
|
+
- Where they get information (communities, platforms, publications, people they trust).
|
|
38
|
+
|
|
39
|
+
If the user has research or customer interviews, use their words. Otherwise mark the profile as an assumption to test.
|
|
40
|
+
|
|
41
|
+
## 2. Positioning and message
|
|
42
|
+
|
|
43
|
+
- **Positioning statement**: For <audience> who <need>, <product> is the <category> that <key benefit>, unlike <alternative>, because <proof>.
|
|
44
|
+
- **Core message**: one sentence a customer could repeat.
|
|
45
|
+
- **Three proof points**: facts, numbers, customer quotes or demos. No unprovable superlatives.
|
|
46
|
+
- **Call to action**: one action per touchpoint (sign up, book a demo, buy).
|
|
47
|
+
|
|
48
|
+
If the brand has a voice guide, apply it; the `brand-voice` skill covers that.
|
|
49
|
+
|
|
50
|
+
## 3. Channels
|
|
51
|
+
|
|
52
|
+
Pick two to four channels the audience actually uses and the team can sustain. For each, record its role in the funnel:
|
|
53
|
+
|
|
54
|
+
| Channel | Role | Owned / earned / paid | Content needed | Owner |
|
|
55
|
+
|---|---|---|---|---|
|
|
56
|
+
|
|
57
|
+
Decision rules:
|
|
58
|
+
|
|
59
|
+
- Owned first (email list, existing users, website, social accounts): cheapest, fastest feedback.
|
|
60
|
+
- Paid only with tracking in place (UTM parameters on every link, conversion events firing) and a test budget before the main spend.
|
|
61
|
+
- Earned (press, partners, communities, creators) needs lead time; start outreach before launch week.
|
|
62
|
+
- Drop a channel nobody on the team can run every week.
|
|
63
|
+
|
|
64
|
+
## 4. Calendar
|
|
65
|
+
|
|
66
|
+
Lay out the campaign in phases with dates:
|
|
67
|
+
|
|
68
|
+
1. **Prepare** (assets, landing page, tracking, audiences, outreach).
|
|
69
|
+
2. **Warm-up** (teasers, waitlist, partner briefings).
|
|
70
|
+
3. **Launch** (the main push; concentrated activity across channels).
|
|
71
|
+
4. **Sustain** (follow-ups, retargeting, case studies, reminders).
|
|
72
|
+
5. **Review** (results, learnings, decision on what continues).
|
|
73
|
+
|
|
74
|
+
Give each item a date, channel, asset, owner and status. A week-by-week table is enough.
|
|
75
|
+
|
|
76
|
+
## 5. Budget split
|
|
77
|
+
|
|
78
|
+
- Allocate by role: content production, paid media (spend a small test slice first and scale only the channels that hit the cost-per-result ceiling), tools, partners or creators, contingency.
|
|
79
|
+
- State the assumed cost per result for each paid channel and where the assumption came from (history, the user, or a guess to validate).
|
|
80
|
+
- Show the arithmetic from budget to expected results. If the expected results miss the objective, say so and propose either a smaller objective or more budget. Do not pad the numbers to make it fit.
|
|
81
|
+
|
|
82
|
+
## 6. Success metrics
|
|
83
|
+
|
|
84
|
+
- One **primary metric** tied to the objective.
|
|
85
|
+
- Two to four **leading indicators** per stage (reach, click-through, sign-up rate, activation) with a target.
|
|
86
|
+
- **Guardrails**: cost per acquisition ceiling, unsubscribe or complaint rate, refund rate.
|
|
87
|
+
- How each metric is measured (tool, event name, UTM convention) and when it is reviewed.
|
|
88
|
+
- A decision rule: "If cost per sign-up exceeds X after the test budget, pause the channel and reallocate."
|
|
89
|
+
|
|
90
|
+
## Rules
|
|
91
|
+
|
|
92
|
+
- Never fabricate benchmarks, conversion rates or audience sizes. Use the user's data or label a figure as an assumption.
|
|
93
|
+
- Never recommend buying email lists, spamming communities, fake reviews or undisclosed paid endorsements. Follow consent rules for email and SMS in the target markets, and ask the user to confirm them.
|
|
94
|
+
- Keep it executable by the stated team. Fewer channels done well beats many done badly.
|
|
95
|
+
|
|
96
|
+
## Output format
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
# Campaign plan: <name>
|
|
100
|
+
Objective: <metric, target, date>
|
|
101
|
+
Audience: <primary segment>
|
|
102
|
+
Core message: <one sentence> | CTA: <action>
|
|
103
|
+
|
|
104
|
+
## Positioning and proof points
|
|
105
|
+
## Channels (table)
|
|
106
|
+
## Calendar (week-by-week table)
|
|
107
|
+
## Budget (table with arithmetic to expected results)
|
|
108
|
+
## Metrics, guardrails and decision rules
|
|
109
|
+
## Assumptions to validate
|
|
110
|
+
## Risks and open questions
|
|
111
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Plan a launch campaign for our invoicing app, we have $5,000 and six weeks",
|
|
4
|
+
"We're running a Black Friday promotion for the online store. Help me put together the channels, calendar and budget.",
|
|
5
|
+
"I need a go-to-market campaign to get our first 500 paying users in Accra. Who do we target and how?",
|
|
6
|
+
"Make a campaign plan with success metrics for relaunching our newsletter product",
|
|
7
|
+
"How should I split a small marketing budget between Instagram ads, email and influencers for our product launch?"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Run a technical SEO check on our marketing site and list the indexing problems",
|
|
11
|
+
"Define our brand's tone of voice and give do and don't examples for copywriters",
|
|
12
|
+
"Research our three main competitors and estimate the size of the payroll software market in Kenya",
|
|
13
|
+
"Write the blog post announcing our new feature, around 1200 words",
|
|
14
|
+
"Draft the monthly investor update with our MRR and burn"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mcp-server-patterns
|
|
3
|
+
description: Model Context Protocol server construction, from naming tools and writing their JSON Schema inputs to returning isError results, structured output, tool annotations, OAuth-protected Streamable HTTP or local stdio transports, and testing with the MCP Inspector. Use when creating an MCP server, exposing an API or database to agents as MCP tools, or debugging why a client can't connect to, list or call a server's tools.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Testing uses the MCP Inspector via npx (its README lists Node 22.19 or later). Rules are SDK-agnostic; use the official SDK for your language.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: ai
|
|
9
|
+
kete-loom/risk: runs-commands
|
|
10
|
+
kete-loom/requires: "node, npx"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# MCP server patterns
|
|
15
|
+
|
|
16
|
+
An MCP server is an API whose caller is a language model. Design every tool so a model that has only read its name, description and schema calls it correctly the first time, and so a wrong call does no harm.
|
|
17
|
+
|
|
18
|
+
Protocol details move fast. The current revision when this skill was written is `2026-07-28`; `references/protocol-notes.md` covers what changed from the `2025-xx` revisions. Check modelcontextprotocol.io/specification for the revision your SDK targets before relying on a wire detail.
|
|
19
|
+
|
|
20
|
+
## 0. Before you start
|
|
21
|
+
|
|
22
|
+
1. Ask, or find out, who runs the server: **local** (launched by the user's client as a subprocess → stdio) or **remote** (a hosted service many users connect to → Streamable HTTP with OAuth). **Stop and ask the user** if it isn't clear; the auth model depends on it.
|
|
23
|
+
2. Pick the official SDK for the project's language (TypeScript, Python, C#, Go, Rust, Ruby, Java and others are listed at modelcontextprotocol.io/docs/sdk). Do not hand-roll JSON-RPC.
|
|
24
|
+
3. List the user jobs the server must support (e.g. "find a customer and see their open invoices"), not the endpoints of the API you're wrapping.
|
|
25
|
+
|
|
26
|
+
## 1. Design the tool set
|
|
27
|
+
|
|
28
|
+
- One tool per user job, not one per REST endpoint. `find_customer` that searches by name, email or id beats `get_customer_by_id`, `get_customer_by_email`, `list_customers`.
|
|
29
|
+
- Keep the set small (aim for under about 20 tools per server). Every tool's description costs context in every conversation.
|
|
30
|
+
- Separate reads from writes. Never hide a write inside a tool that sounds like a read.
|
|
31
|
+
- Destructive actions (delete, send, pay, deploy) get their own tool with a clear verb, and should support a dry-run or preview argument where the backend allows.
|
|
32
|
+
|
|
33
|
+
### Naming
|
|
34
|
+
|
|
35
|
+
- Names: 1 to 128 characters from `A-Z a-z 0-9 _ - .`, case-sensitive, unique within the server. Use `verb_noun` in one consistent style: `search_issues`, `create_issue`, `close_issue`.
|
|
36
|
+
- Clients that aggregate servers may prefix names; don't rely on your name being globally unique, and don't encode the server name in every tool.
|
|
37
|
+
- Set `title` for a human-friendly display name.
|
|
38
|
+
|
|
39
|
+
### Descriptions
|
|
40
|
+
|
|
41
|
+
Write each description for the model, in this order: what it does, when to use it (and when to use a sibling tool instead), what it returns, side effects and limits.
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
Search issues by text, label or assignee. Use before create_issue to avoid duplicates.
|
|
45
|
+
Returns up to `limit` issues (id, title, state, url), newest first. Read-only.
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## 2. Input schemas
|
|
49
|
+
|
|
50
|
+
- `inputSchema` is JSON Schema (2020-12 unless `$schema` says otherwise) and must be an object schema. For a tool with no inputs use `{"type": "object", "additionalProperties": false}`.
|
|
51
|
+
- Give every property a `description`, and use `enum`, `minimum`/`maximum`, `pattern`, `format` and `default` instead of explaining constraints in prose.
|
|
52
|
+
- Prefer flat, primitive arguments. Deeply nested objects and free-form JSON strings are where models make mistakes.
|
|
53
|
+
- Use the identifiers the model will have (names, emails, URLs) or return ids from a search tool that it can pass on. Never require an internal id the model cannot discover.
|
|
54
|
+
- Paginate or cap list results with `limit` (with a sane default and maximum) and a `cursor`.
|
|
55
|
+
- **Validate every input on the server** regardless of the schema. The schema helps the model; it is not a security boundary.
|
|
56
|
+
|
|
57
|
+
## 3. Results
|
|
58
|
+
|
|
59
|
+
- Return concise text the model can act on: the fields it needs, not the raw upstream payload. Large blobs blow the context window; truncate and say so ("showing 20 of 312; pass cursor=...").
|
|
60
|
+
- When a tool returns structured data, declare `outputSchema`, return conforming `structuredContent`, and also return the serialized JSON in a text content block for older clients.
|
|
61
|
+
- Use `resource_link` content to point at large items (files, reports) instead of inlining them.
|
|
62
|
+
- Set annotations honestly: `readOnlyHint`, `destructiveHint`, `idempotentHint`, `openWorldHint`. Defaults assume the worst (not read-only, destructive, open world). Clients treat annotations from untrusted servers as hints only, so annotations never replace server-side checks.
|
|
63
|
+
|
|
64
|
+
## 4. Errors
|
|
65
|
+
|
|
66
|
+
Two kinds, and the choice matters:
|
|
67
|
+
|
|
68
|
+
| Situation | Return |
|
|
69
|
+
|---|---|
|
|
70
|
+
| Unknown tool, malformed request, server crash | JSON-RPC error (e.g. `-32602` invalid params, `-32603` internal error) |
|
|
71
|
+
| Bad argument values, upstream API failure, not found, business rule, expired handle | A normal result with `isError: true` and a message that tells the model how to recover |
|
|
72
|
+
|
|
73
|
+
Phrase each tool error as an instruction: `"No customer matches 'acme'. Try search by email, or call list_customers with a prefix."` Never return a stack trace, an internal hostname or a secret in an error.
|
|
74
|
+
|
|
75
|
+
## 5. Transports
|
|
76
|
+
|
|
77
|
+
- **stdio** (local): the server reads newline-delimited JSON-RPC from stdin and writes only valid MCP messages to stdout. **All logging goes to stderr.** A single `print`/`console.log` to stdout breaks the connection; this is the most common local bug. Exit promptly when stdin closes.
|
|
78
|
+
- **Streamable HTTP** (remote): one MCP endpoint (e.g. `https://example.com/mcp`) that accepts POST and answers with JSON or a request-scoped SSE stream. You must validate the `Origin` header (403 if invalid) to block DNS rebinding. When running locally, bind to `127.0.0.1`, not `0.0.0.0`.
|
|
79
|
+
- Do not build the old HTTP+SSE transport (2024-11-05) for new servers; it is deprecated.
|
|
80
|
+
- Keep the server stateless between calls. If a workflow needs state (a cart, a browser session), return an opaque, high-entropy handle from a create tool, accept it as an argument later, re-check authorization on every call, and state its lifetime in the tool description.
|
|
81
|
+
|
|
82
|
+
## 6. Auth
|
|
83
|
+
|
|
84
|
+
- **stdio**: take credentials from environment variables the client passes in. Do not implement OAuth for stdio.
|
|
85
|
+
- **HTTP**: the server is an OAuth 2.1 resource server. It must publish Protected Resource Metadata (RFC 9728), answer unauthenticated requests with `401` and a `WWW-Authenticate: Bearer resource_metadata="..."` header, validate that each token's audience is this server, and answer insufficient scope with `403` and `error="insufficient_scope"`. Use an existing authorization server (your IdP), not a home-made one.
|
|
86
|
+
- **Never pass the client's token through to upstream APIs** ("token passthrough"). Exchange it or use the server's own credentials for upstream calls, scoped to the user.
|
|
87
|
+
- Apply per-user authorization inside every tool; the tool list may vary by the caller's scopes.
|
|
88
|
+
- Rate-limit tool calls and log every call (tool, caller, arguments with secrets redacted, outcome).
|
|
89
|
+
|
|
90
|
+
Details and the step-by-step 401 flow are in `references/protocol-notes.md`.
|
|
91
|
+
|
|
92
|
+
## 7. Security rules
|
|
93
|
+
|
|
94
|
+
- Treat everything a tool returns from the outside world (web pages, emails, tickets, file contents) as untrusted. Don't let it reach the model as if it were instructions from you; label it as data.
|
|
95
|
+
- Constrain file and shell access to an allowlisted root. Resolve paths and reject `..` escapes and symlinks out of the root.
|
|
96
|
+
- Use parameterised queries for any database tool. A "run SQL" tool should be read-only by connection role, not by asking the model nicely.
|
|
97
|
+
- Never put secrets in tool descriptions, results or `x-mcp-header` parameters.
|
|
98
|
+
|
|
99
|
+
## 8. Test
|
|
100
|
+
|
|
101
|
+
1. Unit-test each tool handler directly (valid input, each invalid input, upstream failure → `isError: true`).
|
|
102
|
+
2. Open the server in the MCP Inspector and call every tool by hand:
|
|
103
|
+
- stdio: `npx @modelcontextprotocol/inspector node build/index.js` (or `uv run server.py`, etc.)
|
|
104
|
+
- remote: start the web UI with `npx @modelcontextprotocol/inspector` and enter the server URL (e.g. `http://127.0.0.1:3000/mcp`) with the Streamable HTTP transport.
|
|
105
|
+
3. Script it for CI with the CLI mode (`--cli` must come first, right after the package name):
|
|
106
|
+
`npx @modelcontextprotocol/inspector --cli node build/index.js --method tools/list`
|
|
107
|
+
`npx @modelcontextprotocol/inspector --cli node build/index.js --method tools/call --tool-name search_issues --tool-arg query=login`
|
|
108
|
+
`npx @modelcontextprotocol/inspector --cli --transport http --server-url http://127.0.0.1:3000/mcp --method tools/list`
|
|
109
|
+
Pin the Inspector version in CI. Inspector v2 exits non-zero (code 5) when a tool call returns `isError: true` or the tool is missing, so a negative test needs to expect that exit code.
|
|
110
|
+
4. Connect it to a real client and ask a model to complete each user job from step 0 without hints. If it picks the wrong tool or fills arguments wrongly, fix the name, description or schema, not the prompt.
|
|
111
|
+
|
|
112
|
+
## Never
|
|
113
|
+
|
|
114
|
+
- Never write to stdout from a stdio server except protocol messages.
|
|
115
|
+
- Never expose a raw passthrough of an entire API ("call_endpoint(method, path, body)").
|
|
116
|
+
- Never accept or forward tokens that were not issued for this server.
|
|
117
|
+
- Never rely on the schema or annotations for security.
|
|
118
|
+
- Never ship a destructive tool without a test that proves it refuses unauthorized callers.
|
|
119
|
+
|
|
120
|
+
## Report format
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
Server: <name> Transport: <stdio | streamable HTTP> Auth: <env | OAuth via ...>
|
|
124
|
+
Tools: <name> (read-only | writes | destructive), ...
|
|
125
|
+
Inspector: tools/list OK, <n>/<n> tools called successfully
|
|
126
|
+
Open issues: <anything not tested, spec revision assumptions>
|
|
127
|
+
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Build an MCP server that exposes our Jira instance as tools for Claude and Cursor",
|
|
4
|
+
"My stdio MCP server disconnects right after starting, the client says invalid JSON",
|
|
5
|
+
"How should I name and describe the tools on my Model Context Protocol server?",
|
|
6
|
+
"Add OAuth to our remote MCP server running over streamable HTTP",
|
|
7
|
+
"Turn our internal billing REST API into an MCP server agents can call",
|
|
8
|
+
"Test my MCP server's tools with the inspector before publishing it"
|
|
9
|
+
],
|
|
10
|
+
"should_not_trigger": [
|
|
11
|
+
"Design the overall tool set and sandbox for our autonomous coding agent",
|
|
12
|
+
"Add vector search and reranking over our product manuals for the support bot",
|
|
13
|
+
"Design a clean REST API for our orders service with versioning and pagination",
|
|
14
|
+
"Write prompts that make the model call functions more reliably",
|
|
15
|
+
"Set up OAuth login with Google for our web app users",
|
|
16
|
+
"Review our retrieval-augmented generation code for chunking problems"
|
|
17
|
+
]
|
|
18
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# MCP protocol notes
|
|
2
|
+
|
|
3
|
+
Read this when a wire-level detail matters: version negotiation, HTTP headers, auth flow, or interop with older clients. The source of truth is modelcontextprotocol.io/specification; these notes follow revision `2026-07-28`.
|
|
4
|
+
|
|
5
|
+
## Revisions and eras
|
|
6
|
+
|
|
7
|
+
- `2024-11-05`: original revision. HTTP+SSE transport (separate SSE and POST endpoints). Now deprecated.
|
|
8
|
+
- `2025-03-26` to `2025-11-25`: Streamable HTTP with optional sessions (`Mcp-Session-Id`), standalone GET stream for server messages, resumable streams, `initialize` handshake.
|
|
9
|
+
- `2026-07-28`: no `initialize` handshake and no protocol-level sessions. Every request carries its protocol version and client capabilities in `params._meta` (`io.modelcontextprotocol/protocolVersion`, `io.modelcontextprotocol/clientCapabilities`, `io.modelcontextprotocol/clientInfo`). Servers no longer send JSON-RPC requests to clients; sampling, elicitation and roots come back as an `InputRequiredResult` the client answers by retrying the call. Change notifications arrive on a `subscriptions/listen` stream.
|
|
10
|
+
|
|
11
|
+
Your SDK handles most of this. What matters to a server author:
|
|
12
|
+
|
|
13
|
+
- Do not keep per-connection state; the protocol has none. Use explicit handles (see SKILL.md section 5).
|
|
14
|
+
- If you must support older clients, check your SDK's backward-compatibility support rather than implementing both eras yourself.
|
|
15
|
+
|
|
16
|
+
## Streamable HTTP (2026-07-28)
|
|
17
|
+
|
|
18
|
+
- Single endpoint, POST only. GET or DELETE from old clients: `405 Method Not Allowed`. Ignore any `Mcp-Session-Id` and `Last-Event-ID` headers.
|
|
19
|
+
- Request headers the client must send: `MCP-Protocol-Version`, `Mcp-Method`, and `Mcp-Name` for `tools/call`, `resources/read`, `prompts/get`. The server must reject a mismatch between header and body with `400` and JSON-RPC error `-32020` (HeaderMismatch).
|
|
20
|
+
- Unsupported protocol version: `400` with an `UnsupportedProtocolVersionError` listing supported versions.
|
|
21
|
+
- Unknown method: `404` with JSON-RPC `-32601`.
|
|
22
|
+
- Notifications POSTed by the client: `202 Accepted`, no body.
|
|
23
|
+
- Responses: `application/json` or `text/event-stream`. Set `X-Accel-Buffering: no` on SSE responses behind nginx-style proxies.
|
|
24
|
+
- Cancellation on HTTP is the client closing the response stream; stop work when that happens.
|
|
25
|
+
- `x-mcp-header` in a property's schema mirrors that argument into an `Mcp-Param-<Name>` header for routing. Only primitive string, integer or boolean properties reachable through `properties` keys. Never on secrets or PII.
|
|
26
|
+
|
|
27
|
+
## stdio
|
|
28
|
+
|
|
29
|
+
- Newline-delimited JSON-RPC, no embedded newlines, UTF-8.
|
|
30
|
+
- stdout carries only MCP messages; stderr is free for logs.
|
|
31
|
+
- Cancellation is a `notifications/cancelled` notification from the client.
|
|
32
|
+
- Exit when stdin reaches end-of-file.
|
|
33
|
+
|
|
34
|
+
## Authorization flow (HTTP servers)
|
|
35
|
+
|
|
36
|
+
1. Client calls the MCP endpoint without a token.
|
|
37
|
+
2. Server returns `401` with `WWW-Authenticate: Bearer resource_metadata="https://mcp.example.com/.well-known/oauth-protected-resource", scope="files:read"`.
|
|
38
|
+
3. Client fetches the Protected Resource Metadata (RFC 9728), which lists `authorization_servers` and `scopes_supported`.
|
|
39
|
+
4. Client discovers the authorization server (RFC 8414 or OpenID Connect Discovery), registers (Client ID Metadata Documents preferred; Dynamic Client Registration is deprecated but allowed), and runs authorization code + PKCE with a `resource` parameter (RFC 8707) naming the MCP server's canonical URI.
|
|
40
|
+
5. Client sends `Authorization: Bearer <token>` on every request. Never in the query string.
|
|
41
|
+
6. Server validates the token per OAuth 2.1 and checks its audience is this server. Invalid or expired: `401`. Insufficient scope: `403` with `WWW-Authenticate: Bearer error="insufficient_scope", scope="...", resource_metadata="..."`, listing all scopes the operation needs in one challenge.
|
|
42
|
+
7. Server must not accept or forward tokens issued for anything else.
|
|
43
|
+
|
|
44
|
+
Keep `offline_access` out of the scopes the server advertises; refresh tokens are a client concern.
|
|
45
|
+
|
|
46
|
+
## Error codes
|
|
47
|
+
|
|
48
|
+
| Code | Meaning |
|
|
49
|
+
|---|---|
|
|
50
|
+
| -32700 | Parse error |
|
|
51
|
+
| -32600 | Invalid request |
|
|
52
|
+
| -32601 | Method not found |
|
|
53
|
+
| -32602 | Invalid params (also: unknown tool) |
|
|
54
|
+
| -32603 | Internal error |
|
|
55
|
+
| -32020 | Header mismatch (HTTP) |
|
|
56
|
+
| -32021 | Missing required client capability |
|
|
57
|
+
| -32022 | Unsupported protocol version |
|
|
58
|
+
|
|
59
|
+
Tool execution failures are not JSON-RPC errors: return a result with `isError: true`.
|
|
60
|
+
|
|
61
|
+
## Tool annotation defaults
|
|
62
|
+
|
|
63
|
+
| Hint | Default | Meaning when true |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| `readOnlyHint` | false | Does not modify its environment |
|
|
66
|
+
| `destructiveHint` | true | May delete or overwrite (only meaningful if not read-only) |
|
|
67
|
+
| `idempotentHint` | false | Repeating with same args has no extra effect (only meaningful if not read-only) |
|
|
68
|
+
| `openWorldHint` | true | Talks to external systems (web, third-party APIs) |
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: metrics-dashboards
|
|
3
|
+
description: Designs business and product metric dashboards that people act on, starting from the decisions the audience makes, writing each metric as a precise definition with formula, grain, filters, time zone and owner, picking a chart type per question, laying out headline numbers then trends then breakdowns, showing data freshness and quality status on the page, and cutting vanity metrics that never change a decision. Use when planning a KPI or operations dashboard, a dashboard nobody trusts or opens, two reports disagree on the same number, or choosing which metrics and charts belong on a Looker, Metabase, Superset, Tableau, Power BI or Grafana board.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Tool-neutral; works with any BI or dashboard tool. Querying data needs the project's warehouse or database client.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: data
|
|
9
|
+
kete-loom/risk: read-only
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Metrics dashboards
|
|
14
|
+
|
|
15
|
+
A dashboard earns its place when a named person looks at it on a schedule and it changes what they do. Design for that person, define every number so two people compute it the same way, and show when the data cannot be trusted.
|
|
16
|
+
|
|
17
|
+
## 1. Start from decisions, not data
|
|
18
|
+
|
|
19
|
+
Ask the user (and **stop until you have answers**):
|
|
20
|
+
|
|
21
|
+
1. **Who** looks at it (role, not "everyone") and **how often** (live, daily stand-up, weekly review, monthly board)?
|
|
22
|
+
2. **What decisions** do they make with it? ("Add support staff", "pause a campaign", "page on-call".)
|
|
23
|
+
3. **What would make them act?** A threshold, a target, or a change versus last period.
|
|
24
|
+
|
|
25
|
+
Write one line per decision: *"<Audience> uses <metric> to decide <action> when <condition>."* Any metric that fits no line is a candidate to cut.
|
|
26
|
+
|
|
27
|
+
## 2. Define every metric precisely
|
|
28
|
+
|
|
29
|
+
Fill this card for each metric before building any chart. Put the cards in the repo or the BI tool's metric layer (dbt semantic layer, LookML, Cube, the tool's own) so they are defined once.
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
Name: Weekly active customers
|
|
33
|
+
Question: How many paying customers used the product this week?
|
|
34
|
+
Formula: count(distinct customer_id) where event in (core actions) and plan != 'free'
|
|
35
|
+
Grain: one value per ISO week (Mon-Sun)
|
|
36
|
+
Time zone: UTC (state it; local-time reports will differ)
|
|
37
|
+
Filters: excludes internal and test accounts (is_internal = false)
|
|
38
|
+
Source: analytics.fct_events, analytics.dim_customers
|
|
39
|
+
Owner: <person or team who answers questions about it>
|
|
40
|
+
Target/alert: <target or threshold, if any>
|
|
41
|
+
Caveats: events before 2025-03-01 missing mobile app
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Rules:
|
|
45
|
+
|
|
46
|
+
- **Ratios state numerator and denominator** and whether the result is an average of ratios or a ratio of sums.
|
|
47
|
+
- **Counts say what is counted once** (distinct users, sessions, orders) and over what window.
|
|
48
|
+
- **Money states currency, gross or net, and tax and refund treatment.**
|
|
49
|
+
- If two reports disagree, compare their cards line by line; the difference is almost always filters, time zone, or a different window. Do not average them or pick one silently: report the cause to the user.
|
|
50
|
+
|
|
51
|
+
## 3. Cut vanity metrics
|
|
52
|
+
|
|
53
|
+
Remove or demote a metric when:
|
|
54
|
+
|
|
55
|
+
- it only ever goes up (cumulative signups, total page views all time);
|
|
56
|
+
- no one can name an action they would take if it moved;
|
|
57
|
+
- it is easy to game without improving the outcome (raw clicks, time on page alone);
|
|
58
|
+
- it duplicates another metric on the board.
|
|
59
|
+
|
|
60
|
+
Prefer rates and per-unit measures (conversion rate, revenue per active customer, p95 latency) and cohort or period-over-period views over all-time totals. Pair a metric that can be gamed with a counter-metric (tickets closed with reopen rate; signups with activation rate).
|
|
61
|
+
|
|
62
|
+
## 4. Choose the chart for the question
|
|
63
|
+
|
|
64
|
+
| Question | Use | Avoid |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| Where are we now versus target? | Single number with comparison (vs last period, vs target) | Gauges and dials |
|
|
67
|
+
| How is it trending? | Line chart, time on x-axis, consistent intervals | Pie, 3D, dual y-axes |
|
|
68
|
+
| How do categories compare? | Horizontal bar, sorted by value | Pie with more than 3 to 4 slices |
|
|
69
|
+
| What makes up the total? | Stacked bar (few parts) or a table | Donut with many slices |
|
|
70
|
+
| How is it distributed? | Histogram or box plot; show percentiles | Averages alone for skewed data like latency or revenue |
|
|
71
|
+
| Which items need attention? | Sorted table with conditional formatting | Dense heatmap without labels |
|
|
72
|
+
| Did the funnel leak? | Funnel or step bar with conversion between steps | |
|
|
73
|
+
|
|
74
|
+
Chart rules: start bar axes at zero; label units and time zone; mark incomplete periods (the current day or week) so a partial bar is not read as a drop; annotate known events (launch, outage, pricing change); use color for meaning (bad, good, highlighted series), not decoration, and do not rely on color alone.
|
|
75
|
+
|
|
76
|
+
## 5. Layout
|
|
77
|
+
|
|
78
|
+
1. **Top row**: 3 to 6 headline numbers tied to the decisions in step 1, each with its comparison.
|
|
79
|
+
2. **Middle**: trends for those same metrics.
|
|
80
|
+
3. **Bottom**: breakdowns and drill-down tables (by segment, region, channel).
|
|
81
|
+
4. Global filters (date range, segment) at the top, applied to every tile; say so if a tile ignores a filter.
|
|
82
|
+
5. One dashboard per audience and cadence. If it needs scrolling through more than two screens or more than about 12 tiles, split it.
|
|
83
|
+
6. Each tile has a title that is a question or a plain name, plus a short description or link to its metric card.
|
|
84
|
+
|
|
85
|
+
## 6. Freshness and data quality on the page
|
|
86
|
+
|
|
87
|
+
- Show **"Data as of <timestamp, time zone>"** from the actual `max(loaded_at)` of the source, not the page render time.
|
|
88
|
+
- Show a status when an upstream check failed or the data is late ("Orders data delayed: last load 09:10 UTC, expected 06:00"). Pull this from the pipeline's freshness and test results rather than typing it by hand.
|
|
89
|
+
- Match refresh cadence to the decision cadence; a weekly review does not need a 1-minute refresh.
|
|
90
|
+
- Note known gaps and definition changes on the dashboard with the date they took effect.
|
|
91
|
+
|
|
92
|
+
## 7. Build and verify
|
|
93
|
+
|
|
94
|
+
1. Write the query for each metric from its card; reuse the metric layer or a shared model rather than copying SQL per tile.
|
|
95
|
+
2. Check each headline number against an independent count (a direct query, the source system's own report) for one recent period. Report any gap above 1% to the user with its cause.
|
|
96
|
+
3. Check edge cases: empty segments, the current partial period, time-zone boundaries, and a filter combination with no data.
|
|
97
|
+
4. Ask the intended audience to read it once and say what they would do; adjust or cut tiles they skip.
|
|
98
|
+
5. Set a review date (for example quarterly) to delete tiles no one uses; most BI tools report view counts.
|
|
99
|
+
|
|
100
|
+
## Never
|
|
101
|
+
|
|
102
|
+
- Never ship a metric without a written definition and owner.
|
|
103
|
+
- Never present a partial period as a complete one.
|
|
104
|
+
- Never change a metric's definition without a dated note on the dashboard and telling its owner.
|
|
105
|
+
- Never hide a failed data check by showing the last good number with no warning.
|
|
106
|
+
|
|
107
|
+
## Report back
|
|
108
|
+
|
|
109
|
+
- Audience, cadence and the decision lines.
|
|
110
|
+
- Metric cards (one per metric) and the metrics cut, with reasons.
|
|
111
|
+
- Layout: tiles in order with chart type.
|
|
112
|
+
- Verification results: each headline number versus its independent check.
|
|
113
|
+
- Freshness and quality indicators and where they read from.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Help me design a KPI dashboard for our support team's weekly review",
|
|
4
|
+
"Finance and product report different monthly active user numbers, figure out why and fix the definition",
|
|
5
|
+
"Nobody uses our Metabase dashboard, how should we redesign it?",
|
|
6
|
+
"Which chart should I use to show conversion by marketing channel on the growth dashboard?",
|
|
7
|
+
"Add a data freshness indicator to our Looker operations board"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Build the dbt mart that feeds the revenue dashboard",
|
|
11
|
+
"Write the nightly job that loads Stripe charges into the warehouse",
|
|
12
|
+
"Pick the five metrics investors care about for our seed pitch deck",
|
|
13
|
+
"Set up Prometheus alerts for API p99 latency above 500ms",
|
|
14
|
+
"Run a statistical test on last month's A/B experiment results in a notebook"
|
|
15
|
+
]
|
|
16
|
+
}
|