@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,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cold-outreach-sequences
|
|
3
|
+
description: Plans, writes and runs B2B cold outreach sequences to prospects who have not opted in - picking an ideal customer profile and a narrow segment, researching a genuine reason to write to each person, drafting short multi-touch email and LinkedIn steps with sensible spacing, staying within CAN-SPAM, GDPR and PECR, and judging results by positive replies and meetings rather than opens. Use when a founder or sales team wants an outbound prospecting sequence written or reviewed, asks why cold emails get no replies, or needs to know whether emailing a bought list of business contacts is allowed.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Works from the user's prospect list, product notes and sending tool; it writes copy and plans and does not send email itself.
|
|
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
|
+
# Cold outreach sequences
|
|
14
|
+
|
|
15
|
+
Write to a small number of well-chosen people with a reason that is true for each of them, ask for one easy next step, stop when they say no, and measure what actually produces meetings.
|
|
16
|
+
|
|
17
|
+
This skill gives working rules, not legal advice. For anything beyond routine B2B prospecting (consumer lists, health or financial data, a regulator complaint, a new country), the user must check with a qualified privacy lawyer.
|
|
18
|
+
|
|
19
|
+
## Ground rules
|
|
20
|
+
|
|
21
|
+
1. **Narrow beats big.** One segment per sequence: a role, a company type and a trigger (hiring for X, just raised, new regulation, uses tool Y). If you cannot say why this group needs the product now, stop and ask the user.
|
|
22
|
+
2. **Personalisation must be real and checkable.** Reference something the person or company actually did or published, with the source noted. Never invent a mutual connection, a compliment, a past conversation or a "saw your post" you have not seen. A merge field with their company name is not personalisation.
|
|
23
|
+
3. **One ask, small.** A reply, a 15-minute call, or permission to send something. No calendar link in the first email unless the user insists.
|
|
24
|
+
4. **Short.** First email under about 120 words, plain text, no images or attachments, at most one link. Follow-ups shorter.
|
|
25
|
+
5. **Stop on any reply** that is negative, an out-of-office with a leaving date, or a request to stop. Suppress them across every tool and sender.
|
|
26
|
+
6. **Protect the main domain.** Cold mail goes from a separate, authenticated domain or subdomain at modest daily volume per mailbox. Setting up SPF, DKIM, DMARC and warm-up belongs to the email-deliverability skill.
|
|
27
|
+
|
|
28
|
+
## Compliance checks (before any copy)
|
|
29
|
+
|
|
30
|
+
Ask where recipients are based and where the sender is based, then apply each that fits:
|
|
31
|
+
|
|
32
|
+
| Rule | What it requires for cold B2B email |
|
|
33
|
+
|---|---|
|
|
34
|
+
| US CAN-SPAM | No B2B exemption. Truthful From, Reply-To and routing headers; a subject that matches the content; identify the message as an ad where it is one; a valid physical postal address; a clear opt-out that works for at least 30 days, honoured within 10 business days, with no fee or login. |
|
|
35
|
+
| EU GDPR | A named work address is personal data. Most cold B2B outreach relies on legitimate interests: write a short legitimate-interests assessment, keep only data needed, tell them where you got their details (Article 14) no later than the first message you send them, and honour objections at once (Article 21). Country e-privacy laws vary; some require prior consent even for B2B. Germany's UWG § 7(2) No. 2 requires prior express consent for email advertising to any addressee, business or consumer (the § 7(3) existing-customer exception aside). |
|
|
36
|
+
| UK PECR + UK GDPR | Emailing corporate subscribers (limited companies, LLPs, public bodies) without consent is allowed if you identify yourself and give an opt-out. Sole traders and some partnerships count as individuals and need consent. UK GDPR still applies to named work addresses. The ICO says this guidance is under review after the Data (Use and Access) Act 2025; check the current version at ico.org.uk. |
|
|
37
|
+
| Canada CASL | Stricter: generally needs consent. Implied consent has narrow cases, such as an address the person conspicuously published without a "no unsolicited messages" statement, where the message is relevant to their business role (CASL s. 10(9)(b)). Stop and ask the user to confirm with counsel before emailing Canadian prospects. |
|
|
38
|
+
|
|
39
|
+
**Stop and ask the user** if the list was bought or scraped and its source is unknown, if it contains personal (non-work) addresses, or if recipients are consumers. Do not write a sequence for those until the user confirms the legal basis.
|
|
40
|
+
|
|
41
|
+
## Steps
|
|
42
|
+
|
|
43
|
+
1. **Define the segment.** Write the ICP in one line, the trigger, the problem they likely have, and the proof you have (customer result, number, named customer the user may cite). Ask the user for proof if there is none; never make up results.
|
|
44
|
+
2. **Check the list.** Required fields: name, role, company, work email, source, country, and one research note per person. Remove role addresses (`info@`, `sales@`), personal addresses, existing customers, open deals and anyone on the suppression list. Verify addresses with the user's verification tool before sending.
|
|
45
|
+
3. **Research each prospect** for 2 to 5 minutes: recent company news, job posts, their own posts or talks. Record one fact and its URL. If nothing relevant turns up, use the segment-level trigger honestly instead of faking a personal line.
|
|
46
|
+
4. **Write the sequence.** Default shape (adjust to the user's market):
|
|
47
|
+
|
|
48
|
+
| Step | Day | Channel | Purpose |
|
|
49
|
+
|---|---|---|---|
|
|
50
|
+
| 1 | 0 | Email | Specific reason, the problem, one proof point, small ask |
|
|
51
|
+
| 2 | 3 | Email (same thread) | One new angle or useful resource, no "just bumping this" |
|
|
52
|
+
| 3 | 7 | LinkedIn (view, then connection request with no pitch) | Familiarity, optional |
|
|
53
|
+
| 4 | 10 | Email | Short case or number relevant to their trigger |
|
|
54
|
+
| 5 | 17 | Email | Polite close: "should I stop writing about this?" |
|
|
55
|
+
|
|
56
|
+
Four or five touches over two to three weeks is enough. Send on weekdays in the prospect's time zone.
|
|
57
|
+
5. **Write each email** as: subject (2 to 5 words, lower-case is fine, no clickbait or "Re:" on a first message), opening line from the research note, one sentence on the problem in their words, one proof sentence, the ask, signature with the sender's real name, company, postal address and an opt-out line.
|
|
58
|
+
6. **Review every draft** against the checklist below before handing it over.
|
|
59
|
+
7. **Run a pilot** of 50 to 100 prospects. Change one thing at a time (segment, opening, offer) between batches.
|
|
60
|
+
8. **Measure.** Track per step and per segment: delivered, bounced, replied, positive replies, meetings booked, opt-outs. Ignore open rates (Apple Mail Privacy Protection and image blocking make them unreliable). Rules of thumb (not provider or legal limits): bounce rate above about 3% suggests the list is bad; positive replies under about 1% after 200 sends suggests the segment or offer is wrong, not the wording.
|
|
61
|
+
|
|
62
|
+
## Draft checklist
|
|
63
|
+
|
|
64
|
+
- Is the personal line true, and is its source recorded?
|
|
65
|
+
- Could this email be sent unchanged to 1,000 other people? If yes, rewrite.
|
|
66
|
+
- One ask only? No attachments, tracking-heavy links or images?
|
|
67
|
+
- Sender identity, postal address and opt-out present?
|
|
68
|
+
- Any claim, number or customer name the user has not confirmed? Remove it.
|
|
69
|
+
- No fake urgency, fake "Re:" or "Fwd:", or guilt-tripping in the break-up email.
|
|
70
|
+
|
|
71
|
+
## Never
|
|
72
|
+
|
|
73
|
+
- Send from the company's main domain at volume, or rotate many lookalike domains to dodge spam filters.
|
|
74
|
+
- Keep emailing someone who asked to stop, or re-add them through another tool or sender.
|
|
75
|
+
- Scrape personal data in breach of a site's terms, or guess personal email addresses.
|
|
76
|
+
- Automate LinkedIn connection requests or messages beyond what LinkedIn permits.
|
|
77
|
+
|
|
78
|
+
## Output format
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
Segment: role / company type / trigger Region(s): ... Legal basis: ...
|
|
82
|
+
Proof points used: ... (user-confirmed)
|
|
83
|
+
Sequence: step, day, channel, subject, body (per step)
|
|
84
|
+
Personalisation notes: prospect -> fact -> source URL
|
|
85
|
+
Compliance: footer text, opt-out method, suppression handling
|
|
86
|
+
Pilot plan: batch size, what is being tested, metrics and thresholds
|
|
87
|
+
Open questions for the user: ...
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Primary sources: FTC CAN-SPAM guide (https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business), ICO electronic mail marketing (https://ico.org.uk/for-organisations/direct-marketing-and-privacy-and-electronic-communications/guide-to-pecr/electronic-and-telephone-marketing/electronic-mail-marketing/), UWG § 7 (https://www.gesetze-im-internet.de/uwg_2004/__7.html), CASL s. 10 (https://laws-lois.justice.gc.ca/eng/acts/E-1.6/page-2.html).
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Write a four-step cold email sequence to heads of finance at mid-size logistics firms in the UK",
|
|
4
|
+
"We sent 500 outbound emails and got two replies. Can you review the copy and targeting?",
|
|
5
|
+
"Is it legal to cold email business contacts in Germany and France that we found on LinkedIn?",
|
|
6
|
+
"Help me personalise opening lines for these 30 prospects without making stuff up",
|
|
7
|
+
"How many days should we wait between follow-ups in an outbound prospecting sequence?"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Our newsletter emails started landing in spam after we switched provider, check our DKIM",
|
|
11
|
+
"Write a welcome email series for people who just signed up for our free trial",
|
|
12
|
+
"Repurpose our founder's podcast episode into five LinkedIn posts",
|
|
13
|
+
"Draft a proposal document for the client we met last week",
|
|
14
|
+
"Plan our product launch campaign across paid ads, email and events"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: content-repurposing
|
|
3
|
+
description: Breaks one finished long-form source (article, talk recording, podcast episode, webinar or report) into channel-native derivatives such as LinkedIn posts, X threads, newsletter sections, short video clip scripts and quote cards, by extracting the core claims with timestamps or paragraph references, matching each to a format, and checking every derivative against the source so nothing is exaggerated, misquoted or stripped of its caveats. Use when someone has a long piece already published or recorded and wants a set of social posts, threads, a newsletter or clips made from it, or wants derivatives checked for accuracy against the original.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Needs the source as text (article or transcript with timestamps); clip cutting itself is done in the user's video tool.
|
|
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
|
+
# Content repurposing
|
|
14
|
+
|
|
15
|
+
Turn one long piece into many short ones that each work on their own channel, and that all still say what the original said.
|
|
16
|
+
|
|
17
|
+
## Ground rules
|
|
18
|
+
|
|
19
|
+
1. **The source is the only source.** Every claim, number and quote in a derivative must trace to a paragraph or timestamp in the original. No new facts, statistics or examples unless the user supplies them.
|
|
20
|
+
2. **Quotes are exact.** Quote marks mean the speaker's words verbatim from the transcript. Tidy filler words only with "[...]" or by paraphrasing without quote marks. Name the speaker as they are credited.
|
|
21
|
+
3. **Keep the caveats.** If the source says "in our sample of 40 customers" or "early results", the derivative says it too. Do not turn "may help" into "proves".
|
|
22
|
+
4. **Native, not pasted.** Each channel gets its own shape, length and opening; never post the same paragraph everywhere.
|
|
23
|
+
5. **One idea per derivative.** A post that tries to summarise the whole piece usually says nothing.
|
|
24
|
+
6. **Credit and link back** to the original where the channel allows it.
|
|
25
|
+
|
|
26
|
+
## Steps
|
|
27
|
+
|
|
28
|
+
1. **Get the source in text.** For audio or video, ask for a transcript with timestamps (or produce one with the user's transcription tool). Ask who the audience is, which channels they use, the brand voice guide if one exists, and the goal (traffic back to the piece, followers, sign-ups).
|
|
29
|
+
2. **Extract a claim map.** List 5 to 15 standalone ideas: each a one-sentence claim, its support (data, story, example), the exact reference (paragraph number or `mm:ss`), and any caveat. Mark the 2 or 3 strongest. Show this map to the user before drafting if the piece is technical, regulated or about named people.
|
|
30
|
+
3. **Match ideas to formats** with the table below. Pick only the channels the user actually uses.
|
|
31
|
+
4. **Draft each derivative** from one row of the claim map. Write the hook first (the specific claim or result, not "In today's episode..."), then the support, then one call to action.
|
|
32
|
+
5. **Accuracy pass.** For every derivative, check each sentence against its reference: same meaning, same numbers, caveats kept, quotes verbatim, speaker correct. Fix or drop anything that does not trace back.
|
|
33
|
+
6. **Channel pass.** Check length, link placement and formatting against the platform's current limits. Posting or scheduling through APIs is the social-media-publishing skill's job.
|
|
34
|
+
7. **Plan the release.** Space derivatives over 2 to 4 weeks, lead with the strongest idea, and vary formats so the same audience does not see the same point twice in a week.
|
|
35
|
+
|
|
36
|
+
## Format guide
|
|
37
|
+
|
|
38
|
+
| Format | Shape | Best for |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| LinkedIn post | Hook line, short paragraphs, one takeaway, link in the post or first comment per the user's practice | Lessons, results, opinions with reasoning |
|
|
41
|
+
| X thread | First post states the payoff; 4 to 8 posts, one point each; last post links to the source | Step-by-step processes, lists, a story with a turn |
|
|
42
|
+
| Single X post | One sharp claim or number with its context | The most quotable line |
|
|
43
|
+
| Newsletter section | 150 to 400 words: why it matters to this reader, the key idea, link to the full piece | Existing subscribers; deeper context |
|
|
44
|
+
| Short video clip (Reels, Shorts, TikTok, LinkedIn video) | 20 to 60 seconds; starts on the strongest sentence; burned-in captions; one idea | Talks, podcasts with video, demos |
|
|
45
|
+
| Quote card | One verbatim line, speaker name, source title | Memorable lines; check the quote twice |
|
|
46
|
+
| Carousel or slide set | One point per slide, 5 to 10 slides | Frameworks, checklists, before/after |
|
|
47
|
+
|
|
48
|
+
## Clip selection (talks and podcasts)
|
|
49
|
+
|
|
50
|
+
1. Scan the transcript for moments that stand alone: a clear claim, a story with an ending, a surprising number, a strong answer to a question.
|
|
51
|
+
2. Record start and end timestamps with a few seconds of padding, and the first sentence the clip opens on.
|
|
52
|
+
3. Reject clips that need earlier context to make sense, or whose meaning changes when cut (a joke, a hypothetical, a "some people say...").
|
|
53
|
+
4. Write the caption and on-screen title for each clip; captions must match what is said.
|
|
54
|
+
|
|
55
|
+
## Stop and ask the user
|
|
56
|
+
|
|
57
|
+
- Before quoting or clipping a guest or a third party; confirm the user has permission to reuse their words and likeness.
|
|
58
|
+
- When the source contains health, financial, legal or safety advice; derivatives must keep its qualifications, and a qualified reviewer should approve them.
|
|
59
|
+
- When a strong derivative would need a fact the source does not contain.
|
|
60
|
+
- Before using material marked internal, embargoed or unpublished.
|
|
61
|
+
|
|
62
|
+
## Never
|
|
63
|
+
|
|
64
|
+
- Invent statistics, quotes, customer names or results to make a post punchier.
|
|
65
|
+
- Remove caveats, attribution or context that changes the meaning.
|
|
66
|
+
- Present a paraphrase in quote marks.
|
|
67
|
+
- Rewrite the whole source into a new long article; that is a separate article-writing job.
|
|
68
|
+
|
|
69
|
+
## Output format
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
Source: title, link, length Audience and goal: ...
|
|
73
|
+
Claim map: # | claim | support | reference (para or mm:ss) | caveat
|
|
74
|
+
Derivatives (one block each):
|
|
75
|
+
Channel / format:
|
|
76
|
+
Built from claim #:
|
|
77
|
+
Draft:
|
|
78
|
+
Accuracy check: pass | notes
|
|
79
|
+
Clips: start-end | opening line | caption
|
|
80
|
+
Release plan: date | channel | derivative
|
|
81
|
+
Questions for the user: ...
|
|
82
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Turn my 2,000-word blog post on pricing mistakes into a week of LinkedIn posts and an X thread",
|
|
4
|
+
"Here's the transcript of our podcast episode, find the best 30-second clips and write captions",
|
|
5
|
+
"Repurpose the keynote I gave last month into a newsletter section and some quote cards",
|
|
6
|
+
"Check these social posts we made from our research report, did we exaggerate anything?",
|
|
7
|
+
"We publish one long webinar a month. How do we get two weeks of social content out of each one?"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Write a 1500-word blog post from scratch about remote onboarding",
|
|
11
|
+
"Our scheduled LinkedIn posts fail with a 401 from the Posts API",
|
|
12
|
+
"Write a cold email sequence for prospects in the healthcare sector",
|
|
13
|
+
"Define our brand voice with do and don't examples for the social team",
|
|
14
|
+
"Burn subtitles into this mp4 and trim the first ten seconds with ffmpeg"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: context-budget
|
|
3
|
+
description: Keeps a long agent task inside its context window by deciding what to read in full versus search for, reading files in slices, summarising findings into a running notes file, pushing bulky reads and log analysis to subagents that return short answers, and checkpointing before the window runs out. Use when a task spans many files or huge outputs (logs, lockfiles, generated code, large diffs), when earlier details start getting lost, or when the user warns the session is close to its context limit.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Subagent delegation needs a host that supports subagents.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: meta
|
|
9
|
+
kete-loom/risk: writes-files
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Context budget
|
|
14
|
+
|
|
15
|
+
The context window is the agent's working memory. Everything you read, every command output and every long reply spends it. When it fills, the host compacts or truncates and early details (the goal, constraints, decisions) are the first to blur. Spend it on what changes your next action.
|
|
16
|
+
|
|
17
|
+
## 1. Set the budget at the start
|
|
18
|
+
|
|
19
|
+
1. Write the goal and the hard constraints in 3 to 5 lines in a notes file (for example `.handoff/notes.md` or the host's scratch area). This survives compaction; your memory does not.
|
|
20
|
+
2. Estimate the size of the job: how many files, how big the outputs. If it clearly won't fit in one session, plan checkpoints now (section 6).
|
|
21
|
+
|
|
22
|
+
## 2. Search before you read
|
|
23
|
+
|
|
24
|
+
Decision rule for every file or output:
|
|
25
|
+
|
|
26
|
+
| Situation | Do |
|
|
27
|
+
|---|---|
|
|
28
|
+
| You need to know *where* something is | Search (file name or text search). Don't open files to look. |
|
|
29
|
+
| You need one function or section | Search for it, then read only that line range. |
|
|
30
|
+
| File is small (under ~300 lines) and central to the change | Read it in full once. |
|
|
31
|
+
| File is large, generated, minified, a lockfile or vendored | Never read in full. Search inside it or read a slice. |
|
|
32
|
+
| You already read it and haven't changed it | Don't reread. Use your notes. |
|
|
33
|
+
| You changed it | Reread only the edited region to confirm. |
|
|
34
|
+
|
|
35
|
+
## 3. Keep command output small
|
|
36
|
+
|
|
37
|
+
- Filter at the source: `grep`, `head -n 50`, `tail -n 50`, `wc -l`, `--stat`, `--name-only`, `--quiet`, a test runner's "only failures" flag.
|
|
38
|
+
- Run the single failing test, not the whole suite, while iterating. Run the full suite once at the end.
|
|
39
|
+
- Redirect huge output to a file, then search the file: `cmd > out.log 2>&1; grep -n "ERROR" out.log | head` (use the host's scratch or temp directory, not the repo, for `out.log`).
|
|
40
|
+
- Never paste a full log, diff or dependency tree into the conversation when a count or the first error answers the question.
|
|
41
|
+
|
|
42
|
+
## 4. Summarise as you go
|
|
43
|
+
|
|
44
|
+
After each investigation step, append 1 to 3 lines to the notes file:
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
- auth: tokens are checked in src/middleware/auth.ts:40-88 (verifyToken). Refresh is NOT handled there.
|
|
48
|
+
- tests: npm test -- auth -> 12 pass, 1 fail (refresh.test.ts "expired token")
|
|
49
|
+
- decided: fix in verifyToken, not the client, because the client is shared by 3 apps
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Write file paths and line numbers, so you can return to the source instead of keeping its text in context.
|
|
53
|
+
|
|
54
|
+
## 5. Delegate bulky reads
|
|
55
|
+
|
|
56
|
+
Hand work to a subagent when it means reading a lot to produce a little:
|
|
57
|
+
|
|
58
|
+
- Scanning a large directory or many files for a pattern and judging each hit.
|
|
59
|
+
- Reading a long log, trace or report to find the root error.
|
|
60
|
+
- Surveying how a library or API is used across the codebase.
|
|
61
|
+
|
|
62
|
+
Give the subagent a precise question and a return format with a size cap, for example: "Find every caller of `chargeCard`. Return a list of `path:line - one-line purpose`, max 30 lines. Don't propose fixes." Then verify one or two of its claims yourself before acting on them. If the host has no subagents, do the read in slices and summarise each slice before the next. See the `parallel-agent-orchestration` skill for splitting larger work.
|
|
63
|
+
|
|
64
|
+
## 6. Checkpoint before you run out
|
|
65
|
+
|
|
66
|
+
Checkpoint when any of these is true:
|
|
67
|
+
|
|
68
|
+
- You have finished a coherent unit of work (tests green for one part).
|
|
69
|
+
- The host shows the context is past roughly two thirds full, or warns about compaction.
|
|
70
|
+
- You notice you are rereading things or have forgotten an earlier decision.
|
|
71
|
+
|
|
72
|
+
A checkpoint is: update the notes file, commit coherent work if the user allows commits, and write a handoff note (the `session-handoff` skill has the format). Then either continue with a compacted context or tell the user that a fresh session should resume from the note.
|
|
73
|
+
|
|
74
|
+
## 7. Keep your replies lean
|
|
75
|
+
|
|
76
|
+
- Report results, not narration. Skip restating files you just read.
|
|
77
|
+
- Show only the diff hunks that matter, not whole files.
|
|
78
|
+
|
|
79
|
+
## Never
|
|
80
|
+
|
|
81
|
+
- Never read an entire large file "to understand it" when a search would locate the part you need.
|
|
82
|
+
- Never drop the goal or the user's constraints from your notes to save space.
|
|
83
|
+
- Never trust a subagent's summary blindly for a decision that changes code; spot-check it.
|
|
84
|
+
- Never keep working past a compaction without rereading your notes file first.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"This repo is huge and you keep forgetting what we decided earlier, work more economically",
|
|
4
|
+
"The build log is 40,000 lines, find the real error without dumping it all into the chat",
|
|
5
|
+
"We're going to touch about 60 files in this refactor, plan how to do it without blowing the context window",
|
|
6
|
+
"You're close to the context limit, how should we keep going on this task without losing track"
|
|
7
|
+
],
|
|
8
|
+
"should_not_trigger": [
|
|
9
|
+
"Save a handoff note so I can resume this in a fresh session tomorrow",
|
|
10
|
+
"Split this migration across four subagents working in parallel",
|
|
11
|
+
"Set up an unattended loop that keeps fixing lint errors until the count hits zero",
|
|
12
|
+
"Reduce the token cost of the system prompt in our customer support chatbot"
|
|
13
|
+
]
|
|
14
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: conventional-commits
|
|
3
|
+
description: Writes and checks commit messages in the Conventional Commits 1.0.0 format - choosing the type and scope, marking breaking changes with "!" or a BREAKING CHANGE footer, writing a body that explains why the change was made, and adding issue footers - so changelog and semantic-version tooling can read the history. Use when composing a commit message, splitting staged work into well-labelled commits, fixing a message that commitlint rejected, or deciding whether a change counts as feat, fix or breaking.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Needs git. Checking messages with commitlint needs Node.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: devops
|
|
9
|
+
kete-loom/risk: runs-commands
|
|
10
|
+
kete-loom/requires: "git"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Conventional Commits
|
|
15
|
+
|
|
16
|
+
A commit message is a record for the next person who runs `git blame`, and for the tools that build the changelog and pick the next version. Write it for both.
|
|
17
|
+
|
|
18
|
+
## 0. Before writing
|
|
19
|
+
|
|
20
|
+
1. Look for project rules first: `commitlint.config.*`, `.commitlintrc*`, a `commitlint` key in `package.json`, `CONTRIBUTING.md`, `.czrc`, or release config (`release-please-config.json`, `.releaserc*`). Allowed types and scopes there override this skill.
|
|
21
|
+
2. Read recent history for the house style: `git log --oneline -20`. Match the scopes and casing already in use.
|
|
22
|
+
3. Read what is actually staged: `git diff --cached --stat`, then `git diff --cached`. Write about the staged diff, not what you remember changing.
|
|
23
|
+
4. If nothing is staged, **stop and ask** what should go in the commit. Don't `git add -A` on the user's behalf.
|
|
24
|
+
|
|
25
|
+
## 1. One change per commit
|
|
26
|
+
|
|
27
|
+
If the staged diff mixes unrelated things (a bug fix plus a rename plus a dependency bump), propose splitting it and say which files go where. If the user wants one commit anyway, use the type of the most significant change and mention the rest in the body.
|
|
28
|
+
|
|
29
|
+
## 2. Format
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
<type>[optional scope][!]: <description>
|
|
33
|
+
|
|
34
|
+
[optional body]
|
|
35
|
+
|
|
36
|
+
[optional footer(s)]
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Rules from the specification:
|
|
40
|
+
|
|
41
|
+
- `type` is a noun, followed by optional `(scope)`, optional `!`, then `: ` (colon and space) and the description.
|
|
42
|
+
- The body starts after one blank line and is free text.
|
|
43
|
+
- Footers start after one blank line. Each is `Token: value` or `Token #value`. Tokens use `-` instead of spaces (`Reviewed-by`), except `BREAKING CHANGE`.
|
|
44
|
+
- `BREAKING CHANGE` must be uppercase. `BREAKING-CHANGE` means the same.
|
|
45
|
+
|
|
46
|
+
House conventions on top of the spec (follow the project's config if it differs):
|
|
47
|
+
|
|
48
|
+
- Description: imperative mood ("add", not "added"/"adds"), lower case first word, no trailing period, aim for 72 characters or fewer on the whole first line.
|
|
49
|
+
- Wrap the body at about 72 characters.
|
|
50
|
+
|
|
51
|
+
## 3. Choose the type
|
|
52
|
+
|
|
53
|
+
| Type | Use for | Version effect with standard tooling |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| `feat` | New behaviour a user or caller can see | minor |
|
|
56
|
+
| `fix` | Corrects wrong behaviour | patch |
|
|
57
|
+
| `perf` | Faster or leaner, same behaviour | patch in most presets |
|
|
58
|
+
| `refactor` | Code change with no behaviour change | none |
|
|
59
|
+
| `docs` | Documentation only | none |
|
|
60
|
+
| `test` | Adding or fixing tests only | none |
|
|
61
|
+
| `build` | Build system, packaging, dependencies | none |
|
|
62
|
+
| `ci` | CI configuration and scripts | none |
|
|
63
|
+
| `style` | Formatting, whitespace; no code meaning change | none |
|
|
64
|
+
| `chore` | Maintenance that fits nothing above | none |
|
|
65
|
+
| `revert` | Reverts an earlier commit | depends on the tool |
|
|
66
|
+
|
|
67
|
+
Only `feat` and `fix` have meaning in the specification itself; the rest are the widely used `@commitlint/config-conventional` set. Any type can carry a breaking change.
|
|
68
|
+
|
|
69
|
+
Decision rules:
|
|
70
|
+
|
|
71
|
+
- If a user-visible behaviour changes to correct a defect, it is `fix`, even if the code change is large.
|
|
72
|
+
- If you are unsure between `feat` and `refactor`, ask: would the changelog reader care? Yes means `feat` or `fix`.
|
|
73
|
+
- A dependency bump that fixes a user-facing bug is `fix(deps): ...`; a routine bump is `build(deps): ...` (or `chore(deps)` if that is the house style).
|
|
74
|
+
|
|
75
|
+
## 4. Choose the scope
|
|
76
|
+
|
|
77
|
+
- A scope names the area touched: a package, module or subsystem (`feat(auth): ...`, `fix(api): ...`).
|
|
78
|
+
- Use scopes already in the history or config. Don't invent a new one per commit.
|
|
79
|
+
- Leave the scope out rather than guess, or when the change spans the whole project.
|
|
80
|
+
|
|
81
|
+
## 5. Breaking changes
|
|
82
|
+
|
|
83
|
+
A change is breaking when existing callers, configs, data or users must change something to keep working: removed or renamed public API, changed defaults, changed output format, dropped runtime support, a required new setting.
|
|
84
|
+
|
|
85
|
+
Mark it with either or both:
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
feat(api)!: remove v1 order endpoints
|
|
89
|
+
|
|
90
|
+
BREAKING CHANGE: /v1/orders is gone. Call /v2/orders, which returns
|
|
91
|
+
amounts in minor units instead of decimals.
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
- Prefer `!` plus a `BREAKING CHANGE:` footer that says **what breaks and what to do instead**. That footer text usually lands in the changelog verbatim.
|
|
95
|
+
- If you think a change is breaking but the user hasn't said so, **stop and ask** before marking it; it decides a major release.
|
|
96
|
+
- On a project still at `0.y.z`, a breaking change is still marked; the release tooling decides how to bump.
|
|
97
|
+
|
|
98
|
+
## 6. Write a body that explains why
|
|
99
|
+
|
|
100
|
+
The diff shows what changed. The body says:
|
|
101
|
+
|
|
102
|
+
1. Why the change was needed (the bug, the requirement, the constraint).
|
|
103
|
+
2. Why this approach, if it isn't obvious, and what was ruled out.
|
|
104
|
+
3. Side effects a reviewer would not guess (migration needed, cache to clear, behaviour change at the edges).
|
|
105
|
+
|
|
106
|
+
Skip the body only for changes whose reason is self-evident (`docs: fix typo in README`). Never restate the diff line by line, and never write "update file" or "misc fixes".
|
|
107
|
+
|
|
108
|
+
## 7. Footers
|
|
109
|
+
|
|
110
|
+
- Issue links: `Refs: #123`. On GitHub and GitLab, `Closes #123` or `Fixes #123` closes the issue when the commit reaches the default branch, so use those only when the commit really completes it.
|
|
111
|
+
- Co-authors: `Co-authored-by: Name <email>`.
|
|
112
|
+
- Reverts: `git revert --no-commit <sha>`, then commit as `revert: <original subject>` with the body line `This reverts commit <sha>.` and a `Refs: <sha>` footer. Plain `git revert` writes a `Revert "<subject>"` subject, which is not in the Conventional Commits format.
|
|
113
|
+
|
|
114
|
+
## 8. Check before committing
|
|
115
|
+
|
|
116
|
+
- If the project has commitlint, check the message: `echo "<message>" | npx commitlint`, or a range with `npx commitlint --from origin/main --to HEAD`.
|
|
117
|
+
- Commit without opening an editor: `git commit -F <message-file>` or `git commit -m "<subject>" -m "<body>" -m "<footer>"`.
|
|
118
|
+
- If a commit hook rejects the message, fix the message. Don't skip hooks with `--no-verify` unless the user asks.
|
|
119
|
+
- If the commit is already pushed to a shared branch, don't amend it; the squash-merge title or a follow-up commit is the place to fix it.
|
|
120
|
+
|
|
121
|
+
## Examples
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
fix(cart): reject negative quantities
|
|
125
|
+
|
|
126
|
+
The quantity input accepted values below zero, which produced negative
|
|
127
|
+
line totals and let users reduce an order's price. Validate on the
|
|
128
|
+
server as well as in the form, since the API is called directly by the
|
|
129
|
+
mobile app.
|
|
130
|
+
|
|
131
|
+
Fixes #482
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
perf(search): cache tokenised queries per request
|
|
136
|
+
|
|
137
|
+
Profiling showed tokenisation was 40% of search latency for repeated
|
|
138
|
+
filter queries. The cache lives only for the request, so there is no
|
|
139
|
+
invalidation to manage.
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Report back
|
|
143
|
+
|
|
144
|
+
Give the final message in a code block, the files it covers, and one line on why that type, scope and breaking flag were chosen. If you proposed a split, list each commit's message and files.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Write a conventional commit message for what I've staged",
|
|
4
|
+
"commitlint keeps failing with 'subject may not be empty', fix my commit message",
|
|
5
|
+
"Is removing the legacy config flag a feat or a breaking change? How do I mark it in the commit?",
|
|
6
|
+
"I've staged a bug fix and a refactor together, split them into properly typed commits",
|
|
7
|
+
"Rewrite this commit message so it explains why we changed the retry logic, not just what"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Decide whether the next release should be 3.0.0 or 2.5.0 and publish it",
|
|
11
|
+
"My rebase onto main has conflicts in the lockfile, help me finish it",
|
|
12
|
+
"Write the pull request description for this branch",
|
|
13
|
+
"Generate release notes for v1.8.0 from the changelog",
|
|
14
|
+
"Recover the commits I lost after a bad interactive rebase"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cpp-patterns
|
|
3
|
+
description: Modern C++ (17/20/23) house rules for writing and restructuring code - RAII for every resource, unique_ptr/shared_ptr ownership, value semantics and the rule of zero, const-correctness, steering clear of undefined behaviour, concepts used sparingly, target-based CMake, plus sanitizer and clang-tidy setup. Use when writing new C++ code, modernising legacy C++98/03 code, deciding who owns an object, or setting up a CMake project with warnings, sanitizers and clang-tidy.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Needs a C++17-or-later compiler (GCC, Clang or MSVC) and CMake for the build sections.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: coding
|
|
9
|
+
kete-loom/risk: runs-commands
|
|
10
|
+
kete-loom/requires: "cmake"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Modern C++ patterns
|
|
15
|
+
|
|
16
|
+
Write C++ where ownership is visible in the types, resources clean themselves up, and the compiler plus sanitizers catch what review misses.
|
|
17
|
+
|
|
18
|
+
## 0. Before you write code
|
|
19
|
+
|
|
20
|
+
1. Find the language standard the project builds with: `CMAKE_CXX_STANDARD` or `target_compile_features(... cxx_std_NN)` in `CMakeLists.txt`, `-std=` in compile flags, or `compile_commands.json`. Never use a feature newer than that standard.
|
|
21
|
+
2. Match the project's existing conventions (naming, error style, exceptions on or off, header layout). If the codebase builds with `-fno-exceptions`, do not introduce `throw`.
|
|
22
|
+
3. If the change would alter a public header used by other libraries or shipped as a binary SDK, **stop and ask the user**: it may be an ABI break.
|
|
23
|
+
|
|
24
|
+
## 1. Ownership and RAII
|
|
25
|
+
|
|
26
|
+
Decision rules, in order:
|
|
27
|
+
|
|
28
|
+
1. **Store by value** when the object has one owner and a known type. `std::vector<Widget>`, not `std::vector<Widget*>`.
|
|
29
|
+
2. **`std::unique_ptr<T>`** for single ownership of a heap object (polymorphic types, pimpl, large or optional objects). Create with `std::make_unique<T>(...)`.
|
|
30
|
+
3. **`std::shared_ptr<T>`** only when ownership is genuinely shared and lifetimes cannot be ordered. Create with `std::make_shared`. Break cycles with `std::weak_ptr`.
|
|
31
|
+
4. **Raw pointer or reference = non-owning.** `T&` when it cannot be null, `T*` when it can. A raw pointer never gets `delete`d by the code that receives it.
|
|
32
|
+
5. **Views do not own.** `std::string_view` and `std::span` must not outlive the buffer they point into; never return one that points at a local or a temporary.
|
|
33
|
+
|
|
34
|
+
Every resource (file handle, socket, lock, OS handle, C library object) is wrapped in an object whose destructor releases it:
|
|
35
|
+
|
|
36
|
+
```cpp
|
|
37
|
+
struct FileCloser { void operator()(std::FILE* f) const noexcept { if (f) std::fclose(f); } };
|
|
38
|
+
using File = std::unique_ptr<std::FILE, FileCloser>;
|
|
39
|
+
|
|
40
|
+
File open_file(const char* path) { return File{std::fopen(path, "rb")}; }
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Locks: `std::scoped_lock` (C++17) or `std::lock_guard`; `std::unique_lock` when you must unlock early or wait on a `std::condition_variable`. Never manual `lock()`/`unlock()`.
|
|
44
|
+
|
|
45
|
+
Never write: naked `new`/`delete` in application code, `malloc`/`free` for C++ objects, `delete this`, `std::auto_ptr`, or a `shared_ptr` passed by value into a function that only reads it (pass `const T&` instead).
|
|
46
|
+
|
|
47
|
+
## 2. Value semantics and special members
|
|
48
|
+
|
|
49
|
+
- **Rule of zero:** if members are RAII types, declare no destructor, copy or move operations. The compiler-generated ones are correct.
|
|
50
|
+
- **Rule of five:** if you must write one of destructor / copy ctor / copy assign / move ctor / move assign, write or `= delete` all five.
|
|
51
|
+
- Mark move constructors and move assignment `noexcept`. A copyable type whose move constructor is not `noexcept` gets copied, not moved, when `std::vector` reallocates.
|
|
52
|
+
- Pass parameters: cheap types (ints, pointers, `string_view`, `span`) by value; read-only larger objects by `const T&`; sink parameters (the callee keeps a copy) by value then `std::move` into place.
|
|
53
|
+
- Return by value. Do not write `return std::move(local);`; it blocks copy elision.
|
|
54
|
+
- Never use an object after `std::move` from it except to assign to it or destroy it.
|
|
55
|
+
- Make single-argument constructors `explicit` unless implicit conversion is the point.
|
|
56
|
+
|
|
57
|
+
## 3. Const-correctness
|
|
58
|
+
|
|
59
|
+
- Variables are `const` (or `constexpr`) unless they are mutated.
|
|
60
|
+
- Member functions that do not change observable state are `const`. `mutable` only for caches and mutexes.
|
|
61
|
+
- Prefer `constexpr` functions and `static_assert` for things knowable at compile time.
|
|
62
|
+
- Mark functions `[[nodiscard]]` when ignoring the result is almost always a bug (error codes, `expected`-style results, factory functions).
|
|
63
|
+
|
|
64
|
+
## 4. Avoiding undefined behaviour
|
|
65
|
+
|
|
66
|
+
Check each of these in code you write or touch. Details and examples: `references/undefined-behaviour.md`.
|
|
67
|
+
|
|
68
|
+
- Signed integer overflow, shifting by >= the bit width, and division by zero.
|
|
69
|
+
- Out-of-bounds indexing: use `.at()` in non-hot code, range-for, or `std::span`; check indices from input.
|
|
70
|
+
- Dangling references: returning a reference or view to a local, lambdas capturing locals by reference that outlive the scope, iterators or references into a `vector` after `push_back`/`insert`/`erase`.
|
|
71
|
+
- Uninitialised variables: initialise at declaration (`int n{};`, `T x = make();`).
|
|
72
|
+
- Strict aliasing and type punning: use `std::memcpy` or `std::bit_cast` (C++20), not `reinterpret_cast` between unrelated types.
|
|
73
|
+
- Data races: any variable written by one thread and read by another needs a mutex or `std::atomic`.
|
|
74
|
+
- Deleting through a pointer to a polymorphic base class whose destructor is neither `virtual` nor `protected`.
|
|
75
|
+
|
|
76
|
+
## 5. Errors
|
|
77
|
+
|
|
78
|
+
- Follow the project's existing strategy. If none: exceptions for errors the immediate caller cannot handle, return values for expected failures (`std::optional`, `std::expected` in C++23, or the project's own result type).
|
|
79
|
+
- Destructors, move operations and `swap` are `noexcept` and never throw.
|
|
80
|
+
- Give every function the strong or basic exception guarantee: on throw, state is unchanged or still valid, and nothing leaks (RAII makes this automatic).
|
|
81
|
+
|
|
82
|
+
## 6. Templates and concepts in moderation
|
|
83
|
+
|
|
84
|
+
- Write a plain function or class first. Add a template only when there are two real call sites with different types.
|
|
85
|
+
- In C++20, constrain templates with standard concepts (`std::integral`, `std::ranges::range`) or a short named `concept`, instead of `enable_if`.
|
|
86
|
+
- Keep template definitions in headers. No template metaprogramming where `if constexpr` or an overload does the job.
|
|
87
|
+
- Prefer standard algorithms and ranges (`std::ranges::sort`, `std::ranges::find_if`) over hand-written loops when they read more clearly.
|
|
88
|
+
|
|
89
|
+
## 7. Project structure and CMake
|
|
90
|
+
|
|
91
|
+
Use target-based CMake; never set flags globally with `CMAKE_CXX_FLAGS` edits or `include_directories()`.
|
|
92
|
+
|
|
93
|
+
```cmake
|
|
94
|
+
cmake_minimum_required(VERSION 3.20)
|
|
95
|
+
project(app LANGUAGES CXX)
|
|
96
|
+
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
97
|
+
|
|
98
|
+
add_library(core src/core.cpp)
|
|
99
|
+
target_include_directories(core PUBLIC include)
|
|
100
|
+
target_compile_features(core PUBLIC cxx_std_20)
|
|
101
|
+
|
|
102
|
+
add_executable(app src/main.cpp)
|
|
103
|
+
target_link_libraries(app PRIVATE core)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
- Layout: `include/<project>/` public headers, `src/` sources and private headers, `tests/` tests.
|
|
107
|
+
- `PUBLIC` when consumers need it (it appears in your headers), `PRIVATE` when only your `.cpp` files need it.
|
|
108
|
+
- Get dependencies with `find_package` (fed by vcpkg or Conan) or `FetchContent`; do not vendor copies.
|
|
109
|
+
- Out-of-source builds only: `cmake -S . -B build && cmake --build build`.
|
|
110
|
+
|
|
111
|
+
Warnings, sanitizers, clang-tidy and a `CMakePresets.json` example: `references/cmake-and-tooling.md`.
|
|
112
|
+
|
|
113
|
+
## 8. Tooling loop
|
|
114
|
+
|
|
115
|
+
1. Build with warnings on: GCC/Clang `-Wall -Wextra -Wpedantic -Wshadow -Wconversion`, MSVC `/W4`. Treat new warnings in touched files as errors.
|
|
116
|
+
2. Run the tests under AddressSanitizer + UndefinedBehaviorSanitizer (`-fsanitize=address,undefined -fno-omit-frame-pointer`). Run ThreadSanitizer (`-fsanitize=thread`) in a **separate** build for concurrent code; it cannot be combined with ASan.
|
|
117
|
+
3. Run `clang-tidy` on changed files using `compile_commands.json` (`clang-tidy -p build <files>`). Fix findings in code you touched; do not mass-fix the rest of the codebase unasked.
|
|
118
|
+
4. Format with the project's `.clang-format` if one exists (`clang-format -i <files>`). Do not add one unasked.
|
|
119
|
+
|
|
120
|
+
## Rules
|
|
121
|
+
|
|
122
|
+
- Never silence a warning or sanitizer report with a cast, pragma or suppression file without explaining the root cause to the user.
|
|
123
|
+
- Never change a public header's layout, virtual functions or inline functions in a shipped library without asking (ABI).
|
|
124
|
+
- Do not modernise unrelated code in the same change. Keep diffs focused.
|
|
125
|
+
- If you cannot build the project locally, say so; do not claim code compiles.
|
|
126
|
+
|
|
127
|
+
## Report back
|
|
128
|
+
|
|
129
|
+
End with: files changed, the build and test commands you ran (with sanitizer flags), their results, and any warnings or clang-tidy findings left unresolved.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Rewrite this class so it stops using raw new and delete and uses smart pointers instead",
|
|
4
|
+
"Should this member be a unique_ptr, a shared_ptr or just a value?",
|
|
5
|
+
"Set up a new C++20 CMake project with warnings, sanitizers and clang-tidy",
|
|
6
|
+
"Modernise this old C++03 parser to C++17 style with RAII and string_view",
|
|
7
|
+
"Write a thread-safe connection pool class in modern C++"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Write GoogleTest unit tests for the Matrix class and hook them into CTest",
|
|
11
|
+
"Review my C++ pull request for dangling references and data races",
|
|
12
|
+
"The linker says undefined reference to vtable for Widget, fix the build",
|
|
13
|
+
"Refactor this Rust module to avoid cloning and use borrowed slices",
|
|
14
|
+
"Add idiomatic error handling with errors.Is to this Go service"
|
|
15
|
+
]
|
|
16
|
+
}
|