@ketecode/loom 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +616 -2
- package/agents/accessibility-reviewer/AGENT.md +70 -0
- package/agents/accessibility-reviewer/evals/triggers.json +15 -0
- package/agents/agent-evaluator/AGENT.md +74 -0
- package/agents/agent-evaluator/evals/triggers.json +15 -0
- package/agents/architect/AGENT.md +82 -0
- package/agents/architect/evals/triggers.json +17 -0
- package/agents/billing-reviewer/AGENT.md +68 -0
- package/agents/billing-reviewer/evals/triggers.json +16 -0
- package/agents/code-reviewer/AGENT.md +51 -0
- package/agents/code-reviewer/evals/behavior.json +60 -0
- package/agents/code-reviewer/evals/triggers.json +14 -0
- package/agents/code-simplifier/AGENT.md +74 -0
- package/agents/code-simplifier/evals/triggers.json +15 -0
- package/agents/cpp-build-resolver/AGENT.md +73 -0
- package/agents/cpp-build-resolver/evals/triggers.json +16 -0
- package/agents/cpp-reviewer/AGENT.md +59 -0
- package/agents/cpp-reviewer/evals/triggers.json +16 -0
- package/agents/csharp-build-resolver/AGENT.md +84 -0
- package/agents/csharp-build-resolver/evals/triggers.json +17 -0
- package/agents/csharp-reviewer/AGENT.md +88 -0
- package/agents/csharp-reviewer/evals/triggers.json +17 -0
- package/agents/dart-build-resolver/AGENT.md +80 -0
- package/agents/dart-build-resolver/evals/triggers.json +17 -0
- package/agents/dart-reviewer/AGENT.md +66 -0
- package/agents/dart-reviewer/evals/triggers.json +17 -0
- package/agents/database-reviewer/AGENT.md +72 -0
- package/agents/database-reviewer/evals/triggers.json +16 -0
- package/agents/django-reviewer/AGENT.md +61 -0
- package/agents/django-reviewer/evals/triggers.json +15 -0
- package/agents/doc-updater/AGENT.md +92 -0
- package/agents/doc-updater/evals/triggers.json +14 -0
- package/agents/e2e-runner/AGENT.md +88 -0
- package/agents/e2e-runner/evals/triggers.json +16 -0
- package/agents/fastapi-reviewer/AGENT.md +63 -0
- package/agents/fastapi-reviewer/evals/triggers.json +15 -0
- package/agents/flutter-reviewer/AGENT.md +70 -0
- package/agents/flutter-reviewer/evals/triggers.json +15 -0
- package/agents/fsharp-build-resolver/AGENT.md +81 -0
- package/agents/fsharp-build-resolver/evals/triggers.json +15 -0
- package/agents/fsharp-reviewer/AGENT.md +77 -0
- package/agents/fsharp-reviewer/evals/triggers.json +15 -0
- package/agents/go-build-resolver/AGENT.md +85 -0
- package/agents/go-build-resolver/evals/triggers.json +16 -0
- package/agents/go-reviewer/AGENT.md +66 -0
- package/agents/go-reviewer/evals/triggers.json +16 -0
- package/agents/healthcare-reviewer/AGENT.md +65 -0
- package/agents/healthcare-reviewer/evals/triggers.json +16 -0
- package/agents/i18n-reviewer/AGENT.md +64 -0
- package/agents/i18n-reviewer/evals/triggers.json +16 -0
- package/agents/inbox-triager/AGENT.md +98 -0
- package/agents/inbox-triager/evals/triggers.json +16 -0
- package/agents/infra-reviewer/AGENT.md +93 -0
- package/agents/infra-reviewer/evals/triggers.json +15 -0
- package/agents/java-build-resolver/AGENT.md +82 -0
- package/agents/java-build-resolver/evals/triggers.json +16 -0
- package/agents/java-reviewer/AGENT.md +64 -0
- package/agents/java-reviewer/evals/triggers.json +16 -0
- package/agents/kotlin-build-resolver/AGENT.md +89 -0
- package/agents/kotlin-build-resolver/evals/triggers.json +16 -0
- package/agents/kotlin-reviewer/AGENT.md +75 -0
- package/agents/kotlin-reviewer/evals/triggers.json +16 -0
- package/agents/mle-reviewer/AGENT.md +68 -0
- package/agents/mle-reviewer/evals/triggers.json +16 -0
- package/agents/network-config-reviewer/AGENT.md +68 -0
- package/agents/network-config-reviewer/evals/triggers.json +17 -0
- package/agents/payments-reviewer/AGENT.md +64 -0
- package/agents/payments-reviewer/evals/triggers.json +16 -0
- package/agents/performance-optimizer/AGENT.md +86 -0
- package/agents/performance-optimizer/evals/triggers.json +16 -0
- package/agents/perl-build-resolver/AGENT.md +84 -0
- package/agents/perl-build-resolver/evals/triggers.json +15 -0
- package/agents/perl-reviewer/AGENT.md +77 -0
- package/agents/perl-reviewer/evals/triggers.json +15 -0
- package/agents/php-build-resolver/AGENT.md +88 -0
- package/agents/php-build-resolver/evals/triggers.json +16 -0
- package/agents/php-reviewer/AGENT.md +61 -0
- package/agents/php-reviewer/evals/triggers.json +15 -0
- package/agents/planner/AGENT.md +75 -0
- package/agents/planner/evals/triggers.json +17 -0
- package/agents/pr-test-analyzer/AGENT.md +82 -0
- package/agents/pr-test-analyzer/evals/triggers.json +16 -0
- package/agents/python-build-resolver/AGENT.md +87 -0
- package/agents/python-build-resolver/evals/triggers.json +16 -0
- package/agents/python-reviewer/AGENT.md +63 -0
- package/agents/python-reviewer/evals/triggers.json +15 -0
- package/agents/rag-reviewer/AGENT.md +71 -0
- package/agents/rag-reviewer/evals/triggers.json +16 -0
- package/agents/react-reviewer/AGENT.md +70 -0
- package/agents/react-reviewer/evals/triggers.json +16 -0
- package/agents/refactor-cleaner/AGENT.md +82 -0
- package/agents/refactor-cleaner/evals/triggers.json +16 -0
- package/agents/ruby-build-resolver/AGENT.md +93 -0
- package/agents/ruby-build-resolver/evals/triggers.json +16 -0
- package/agents/ruby-reviewer/AGENT.md +62 -0
- package/agents/ruby-reviewer/evals/triggers.json +16 -0
- package/agents/rust-build-resolver/AGENT.md +98 -0
- package/agents/rust-build-resolver/evals/triggers.json +16 -0
- package/agents/rust-reviewer/AGENT.md +78 -0
- package/agents/rust-reviewer/evals/triggers.json +15 -0
- package/agents/security-reviewer/AGENT.md +84 -0
- package/agents/security-reviewer/evals/triggers.json +16 -0
- package/agents/silent-failure-hunter/AGENT.md +66 -0
- package/agents/silent-failure-hunter/evals/triggers.json +16 -0
- package/agents/solidity-reviewer/AGENT.md +70 -0
- package/agents/solidity-reviewer/evals/triggers.json +16 -0
- package/agents/spec-reviewer/AGENT.md +95 -0
- package/agents/spec-reviewer/evals/behavior.json +57 -0
- package/agents/spec-reviewer/evals/triggers.json +16 -0
- package/agents/swift-build-resolver/AGENT.md +85 -0
- package/agents/swift-build-resolver/evals/triggers.json +15 -0
- package/agents/swift-reviewer/AGENT.md +75 -0
- package/agents/swift-reviewer/evals/triggers.json +15 -0
- package/agents/task-implementer/AGENT.md +89 -0
- package/agents/task-implementer/evals/behavior.json +47 -0
- package/agents/task-implementer/evals/triggers.json +16 -0
- package/agents/typescript-build-resolver/AGENT.md +76 -0
- package/agents/typescript-build-resolver/evals/triggers.json +15 -0
- package/agents/typescript-reviewer/AGENT.md +76 -0
- package/agents/typescript-reviewer/evals/triggers.json +15 -0
- package/agents/vue-reviewer/AGENT.md +75 -0
- package/agents/vue-reviewer/evals/triggers.json +15 -0
- package/bin/kete-loom.js +723 -0
- package/commands/aside.md +19 -0
- package/commands/brainstorm.md +25 -0
- package/commands/build-fix.md +26 -0
- package/commands/campaign.md +19 -0
- package/commands/changelog.md +36 -0
- package/commands/checkpoint.md +26 -0
- package/commands/codemap.md +25 -0
- package/commands/commit.md +26 -0
- package/commands/debug.md +27 -0
- package/commands/deps-audit.md +32 -0
- package/commands/dual-review.md +34 -0
- package/commands/epic-decompose.md +21 -0
- package/commands/explain.md +37 -0
- package/commands/feature-dev.md +23 -0
- package/commands/finish-branch.md +26 -0
- package/commands/fix-bug.md +38 -0
- package/commands/hookify.md +23 -0
- package/commands/i18n-check.md +39 -0
- package/commands/issue-sync.md +22 -0
- package/commands/jira.md +19 -0
- package/commands/learn.md +23 -0
- package/commands/loom.md +21 -0
- package/commands/loop.md +20 -0
- package/commands/model-route.md +27 -0
- package/commands/onboard.md +35 -0
- package/commands/orchestrate.md +21 -0
- package/commands/plan-feature.md +36 -0
- package/commands/postmortem.md +42 -0
- package/commands/pr-describe.md +39 -0
- package/commands/pr.md +22 -0
- package/commands/prd.md +41 -0
- package/commands/production-readiness.md +45 -0
- package/commands/project-init.md +21 -0
- package/commands/refactor-clean.md +24 -0
- package/commands/resume-session.md +22 -0
- package/commands/review.md +35 -0
- package/commands/save-session.md +37 -0
- package/commands/security-scan.md +32 -0
- package/commands/sessions.md +21 -0
- package/commands/skill-create.md +21 -0
- package/commands/tdd.md +36 -0
- package/commands/test-coverage.md +24 -0
- package/commands/threat-model.md +36 -0
- package/commands/update-docs.md +25 -0
- package/commands/usage-report.md +43 -0
- package/commands/verify.md +21 -0
- package/hooks/block-dangerous-commands/HOOK.md +30 -0
- package/hooks/block-dangerous-commands/cases.json +50 -0
- package/hooks/block-dangerous-commands/hook.js +75 -0
- package/hooks/block-foreground-servers/HOOK.md +34 -0
- package/hooks/block-foreground-servers/cases.json +31 -0
- package/hooks/block-foreground-servers/hook.js +41 -0
- package/hooks/block-no-verify/HOOK.md +25 -0
- package/hooks/block-no-verify/cases.json +30 -0
- package/hooks/block-no-verify/hook.js +43 -0
- package/hooks/capture-lessons/HOOK.md +24 -0
- package/hooks/capture-lessons/hook.js +48 -0
- package/hooks/format-on-edit/HOOK.md +24 -0
- package/hooks/format-on-edit/hook.js +89 -0
- package/hooks/guard-secrets/HOOK.md +19 -0
- package/hooks/guard-secrets/cases.json +110 -0
- package/hooks/guard-secrets/hook.js +44 -0
- package/hooks/load-session-context/HOOK.md +20 -0
- package/hooks/load-session-context/hook.js +56 -0
- package/hooks/notify-on-stop/HOOK.md +25 -0
- package/hooks/notify-on-stop/hook.js +27 -0
- package/hooks/protect-files/HOOK.md +24 -0
- package/hooks/protect-files/cases.json +27 -0
- package/hooks/protect-files/hook.js +39 -0
- package/hooks/protect-lint-config/HOOK.md +29 -0
- package/hooks/protect-lint-config/cases.json +18 -0
- package/hooks/protect-lint-config/fixtures/.eslintrc.json +1 -0
- package/hooks/protect-lint-config/fixtures/.golangci.yml +1 -0
- package/hooks/protect-lint-config/fixtures/.prettierrc +1 -0
- package/hooks/protect-lint-config/fixtures/.rubocop.yml +1 -0
- package/hooks/protect-lint-config/fixtures/biome.json +1 -0
- package/hooks/protect-lint-config/fixtures/eslint.config.mjs +1 -0
- package/hooks/protect-lint-config/fixtures/ruff.toml +1 -0
- package/hooks/protect-lint-config/hook.js +25 -0
- package/hooks/read-before-edit/HOOK.md +26 -0
- package/hooks/read-before-edit/cases.json +15 -0
- package/hooks/read-before-edit/hook.js +50 -0
- package/hooks/run.js +148 -0
- package/hooks/verify-before-stop/HOOK.md +32 -0
- package/hooks/verify-before-stop/hook.js +70 -0
- package/mcp/atlassian.json +11 -0
- package/mcp/chrome-devtools.json +18 -0
- package/mcp/clickhouse.json +11 -0
- package/mcp/cloudflare.json +11 -0
- package/mcp/context7.json +11 -0
- package/mcp/exa.json +11 -0
- package/mcp/fetch.json +17 -0
- package/mcp/figma.json +11 -0
- package/mcp/firecrawl.json +11 -0
- package/mcp/git.json +17 -0
- package/mcp/github.json +11 -0
- package/mcp/linear.json +11 -0
- package/mcp/memory.json +18 -0
- package/mcp/notion.json +11 -0
- package/mcp/playwright.json +18 -0
- package/mcp/sentry.json +11 -0
- package/mcp/stripe.json +11 -0
- package/mcp/supabase.json +11 -0
- package/mcp/time.json +17 -0
- package/mcp/vercel.json +11 -0
- package/package.json +61 -4
- package/profiles.json +214 -0
- package/rules/common.md +21 -0
- package/rules/cpp.md +29 -0
- package/rules/csharp.md +25 -0
- package/rules/dart.md +29 -0
- package/rules/fsharp.md +28 -0
- package/rules/git.md +26 -0
- package/rules/go.md +29 -0
- package/rules/java.md +29 -0
- package/rules/kotlin.md +27 -0
- package/rules/perl.md +26 -0
- package/rules/php.md +28 -0
- package/rules/python.md +30 -0
- package/rules/ruby.md +27 -0
- package/rules/rust.md +26 -0
- package/rules/security.md +29 -0
- package/rules/swift.md +28 -0
- package/rules/testing.md +25 -0
- package/rules/typescript.md +29 -0
- package/rules/use-skills.md +23 -0
- package/schemas/skill-frontmatter.schema.json +52 -0
- package/scripts/lib/audit.js +96 -0
- package/scripts/lib/behavior.js +52 -0
- package/scripts/lib/frontmatter.js +65 -0
- package/scripts/lib/hooks-install.js +294 -0
- package/scripts/lib/i18n.js +51 -0
- package/scripts/lib/inventory.js +85 -0
- package/scripts/lib/lint.js +180 -0
- package/scripts/lib/mcp-install.js +288 -0
- package/scripts/lib/profiles.js +128 -0
- package/scripts/lib/render.js +92 -0
- package/scripts/lib/rules-install.js +118 -0
- package/scripts/lib/skills.js +87 -0
- package/scripts/lib/targets.js +123 -0
- package/skills/accounting-api-integration/SKILL.md +81 -0
- package/skills/accounting-api-integration/evals/triggers.json +17 -0
- package/skills/accounting-api-integration/references/quickbooks.md +48 -0
- package/skills/accounting-api-integration/references/xero.md +45 -0
- package/skills/agent-failure-debugging/SKILL.md +92 -0
- package/skills/agent-failure-debugging/evals/triggers.json +16 -0
- package/skills/agent-harness-design/SKILL.md +125 -0
- package/skills/agent-harness-design/evals/triggers.json +21 -0
- package/skills/agent-outbound-messaging/SKILL.md +92 -0
- package/skills/agent-outbound-messaging/evals/triggers.json +16 -0
- package/skills/agent-security/SKILL.md +117 -0
- package/skills/agent-security/evals/triggers.json +16 -0
- package/skills/agent-security/references/host-configs.md +37 -0
- package/skills/ai-media-generation/SKILL.md +89 -0
- package/skills/ai-media-generation/evals/triggers.json +16 -0
- package/skills/ai-media-generation/references/job-pipeline.md +76 -0
- package/skills/angular-patterns/SKILL.md +122 -0
- package/skills/angular-patterns/evals/triggers.json +16 -0
- package/skills/api-client-integration/SKILL.md +86 -0
- package/skills/api-client-integration/evals/triggers.json +16 -0
- package/skills/api-client-integration/references/resilience.md +57 -0
- package/skills/api-design/SKILL.md +96 -0
- package/skills/api-design/evals/triggers.json +18 -0
- package/skills/api-design/references/conventions.md +133 -0
- package/skills/architecture-decision-records/SKILL.md +98 -0
- package/skills/architecture-decision-records/evals/triggers.json +17 -0
- package/skills/article-writing/SKILL.md +108 -0
- package/skills/article-writing/evals/triggers.json +16 -0
- package/skills/aspnet-core-patterns/SKILL.md +149 -0
- package/skills/aspnet-core-patterns/evals/triggers.json +16 -0
- package/skills/auth-patterns/SKILL.md +104 -0
- package/skills/auth-patterns/evals/triggers.json +17 -0
- package/skills/auth-patterns/references/oauth-oidc.md +64 -0
- package/skills/autonomous-loops/SKILL.md +99 -0
- package/skills/autonomous-loops/evals/triggers.json +14 -0
- package/skills/aws-patterns/SKILL.md +91 -0
- package/skills/aws-patterns/evals/triggers.json +16 -0
- package/skills/azure-patterns/SKILL.md +86 -0
- package/skills/azure-patterns/evals/triggers.json +16 -0
- package/skills/benchmark-methodology/SKILL.md +88 -0
- package/skills/benchmark-methodology/evals/triggers.json +16 -0
- package/skills/benchmark-methodology/references/language-harnesses.md +130 -0
- package/skills/bgp-diagnostics/SKILL.md +84 -0
- package/skills/bgp-diagnostics/evals/triggers.json +18 -0
- package/skills/bgp-diagnostics/references/bgp-reference.md +81 -0
- package/skills/bioinformatics-workflows/SKILL.md +108 -0
- package/skills/bioinformatics-workflows/evals/triggers.json +16 -0
- package/skills/bioinformatics-workflows/references/commands.md +71 -0
- package/skills/bioinformatics-workflows/references/formats.md +24 -0
- package/skills/bioinformatics-workflows/references/workflow-managers.md +107 -0
- package/skills/blender-automation/SKILL.md +100 -0
- package/skills/blender-automation/evals/triggers.json +16 -0
- package/skills/blender-automation/references/batch-and-render.md +77 -0
- package/skills/blender-automation/references/bpy-inspection.md +91 -0
- package/skills/blender-automation/references/rig-and-retarget-checks.md +23 -0
- package/skills/brand-strategy/SKILL.md +83 -0
- package/skills/brand-strategy/evals/triggers.json +16 -0
- package/skills/brand-voice/SKILL.md +112 -0
- package/skills/brand-voice/evals/triggers.json +16 -0
- package/skills/browser-qa/SKILL.md +99 -0
- package/skills/browser-qa/evals/triggers.json +16 -0
- package/skills/bun-runtime/SKILL.md +93 -0
- package/skills/bun-runtime/evals/triggers.json +16 -0
- package/skills/change-impact-analysis/SKILL.md +89 -0
- package/skills/change-impact-analysis/evals/triggers.json +16 -0
- package/skills/change-impact-analysis/references/graph-commands.md +28 -0
- package/skills/cisco-ios-config/SKILL.md +101 -0
- package/skills/cisco-ios-config/evals/triggers.json +18 -0
- package/skills/cisco-ios-config/references/verification.md +63 -0
- package/skills/clickhouse-patterns/SKILL.md +101 -0
- package/skills/clickhouse-patterns/evals/triggers.json +18 -0
- package/skills/clickhouse-patterns/references/engines-and-views.md +138 -0
- package/skills/clinical-decision-support/SKILL.md +90 -0
- package/skills/clinical-decision-support/evals/triggers.json +16 -0
- package/skills/clinical-decision-support/references/cds-hooks.md +76 -0
- package/skills/clinical-decision-support/references/regulatory-boundaries.md +37 -0
- package/skills/code-tour/SKILL.md +97 -0
- package/skills/code-tour/evals/triggers.json +14 -0
- package/skills/codebase-onboarding/SKILL.md +112 -0
- package/skills/codebase-onboarding/evals/triggers.json +14 -0
- package/skills/cold-outreach-sequences/SKILL.md +90 -0
- package/skills/cold-outreach-sequences/evals/triggers.json +16 -0
- package/skills/content-repurposing/SKILL.md +82 -0
- package/skills/content-repurposing/evals/triggers.json +16 -0
- package/skills/context-budget/SKILL.md +84 -0
- package/skills/context-budget/evals/triggers.json +14 -0
- package/skills/contract-drafting/SKILL.md +96 -0
- package/skills/contract-drafting/evals/triggers.json +16 -0
- package/skills/contract-drafting/references/term-sheets.md +68 -0
- package/skills/contract-first-development/SKILL.md +86 -0
- package/skills/contract-first-development/evals/triggers.json +16 -0
- package/skills/contract-first-development/references/tooling.md +46 -0
- package/skills/conventional-commits/SKILL.md +144 -0
- package/skills/conventional-commits/evals/triggers.json +16 -0
- package/skills/cpp-patterns/SKILL.md +129 -0
- package/skills/cpp-patterns/evals/triggers.json +16 -0
- package/skills/cpp-patterns/references/cmake-and-tooling.md +88 -0
- package/skills/cpp-patterns/references/undefined-behaviour.md +75 -0
- package/skills/cpp-testing/SKILL.md +131 -0
- package/skills/cpp-testing/evals/triggers.json +16 -0
- package/skills/csharp-patterns/SKILL.md +110 -0
- package/skills/csharp-patterns/evals/triggers.json +17 -0
- package/skills/csharp-patterns/references/analyzers.md +59 -0
- package/skills/csharp-testing/SKILL.md +85 -0
- package/skills/csharp-testing/evals/triggers.json +17 -0
- package/skills/csharp-testing/references/integration-tests.md +77 -0
- package/skills/css-architecture/SKILL.md +143 -0
- package/skills/css-architecture/evals/triggers.json +16 -0
- package/skills/customs-trade-compliance/SKILL.md +95 -0
- package/skills/customs-trade-compliance/evals/triggers.json +16 -0
- package/skills/customs-trade-compliance/references/incoterms-2020.md +42 -0
- package/skills/dart-patterns/SKILL.md +157 -0
- package/skills/dart-patterns/evals/triggers.json +18 -0
- package/skills/dart-testing/SKILL.md +164 -0
- package/skills/dart-testing/evals/triggers.json +18 -0
- package/skills/data-analysis-notebooks/SKILL.md +113 -0
- package/skills/data-analysis-notebooks/evals/triggers.json +16 -0
- package/skills/data-analysis-notebooks/references/dataframe-pitfalls.md +49 -0
- package/skills/data-analysis-notebooks/references/statistics-pitfalls.md +24 -0
- package/skills/data-pipelines/SKILL.md +90 -0
- package/skills/data-pipelines/evals/triggers.json +16 -0
- package/skills/data-pipelines/references/orchestrators.md +64 -0
- package/skills/database-migrations/SKILL.md +102 -0
- package/skills/database-migrations/evals/triggers.json +16 -0
- package/skills/database-migrations/references/recipes.md +98 -0
- package/skills/database-migrations/references/tools.md +21 -0
- package/skills/dbt-patterns/SKILL.md +96 -0
- package/skills/dbt-patterns/evals/triggers.json +16 -0
- package/skills/dbt-patterns/references/yaml-examples.md +114 -0
- package/skills/decision-council/SKILL.md +98 -0
- package/skills/decision-council/evals/triggers.json +16 -0
- package/skills/deep-research/SKILL.md +107 -0
- package/skills/deep-research/evals/triggers.json +14 -0
- package/skills/dependency-audit/SKILL.md +103 -0
- package/skills/dependency-audit/evals/triggers.json +16 -0
- package/skills/dependency-audit/references/tools.md +124 -0
- package/skills/deployment-strategies/SKILL.md +108 -0
- package/skills/deployment-strategies/evals/triggers.json +16 -0
- package/skills/design-brainstorming/SKILL.md +132 -0
- package/skills/design-brainstorming/evals/behavior.json +55 -0
- package/skills/design-brainstorming/evals/triggers.json +16 -0
- package/skills/design-brainstorming/references/visual-mockups.md +34 -0
- package/skills/desktop-app-testing/SKILL.md +104 -0
- package/skills/desktop-app-testing/evals/triggers.json +16 -0
- package/skills/desktop-app-testing/references/drivers.md +81 -0
- package/skills/django-patterns/SKILL.md +123 -0
- package/skills/django-patterns/evals/triggers.json +16 -0
- package/skills/docker-patterns/SKILL.md +132 -0
- package/skills/docker-patterns/evals/triggers.json +16 -0
- package/skills/docker-patterns/references/dockerfiles.md +105 -0
- package/skills/document-processing/SKILL.md +100 -0
- package/skills/document-processing/evals/triggers.json +17 -0
- package/skills/document-processing/references/extraction-and-ocr.md +71 -0
- package/skills/document-processing/references/forms-and-conversion.md +69 -0
- package/skills/document-processing/references/redaction.md +61 -0
- package/skills/e2e-testing-playwright/SKILL.md +94 -0
- package/skills/e2e-testing-playwright/evals/triggers.json +16 -0
- package/skills/e2e-testing-playwright/references/config-and-ci.md +129 -0
- package/skills/ef-core-patterns/SKILL.md +117 -0
- package/skills/ef-core-patterns/evals/triggers.json +16 -0
- package/skills/email-deliverability/SKILL.md +99 -0
- package/skills/email-deliverability/evals/triggers.json +17 -0
- package/skills/email-deliverability/references/dns-records.md +85 -0
- package/skills/energy-procurement/SKILL.md +106 -0
- package/skills/energy-procurement/evals/triggers.json +16 -0
- package/skills/error-handling-patterns/SKILL.md +112 -0
- package/skills/error-handling-patterns/evals/triggers.json +18 -0
- package/skills/error-handling-patterns/references/language-idioms.md +49 -0
- package/skills/estimation-and-scoping/SKILL.md +97 -0
- package/skills/estimation-and-scoping/evals/triggers.json +14 -0
- package/skills/evm-dapp-integration/SKILL.md +73 -0
- package/skills/evm-dapp-integration/evals/triggers.json +16 -0
- package/skills/fastapi-patterns/SKILL.md +127 -0
- package/skills/fastapi-patterns/evals/triggers.json +16 -0
- package/skills/ffmpeg-media-processing/SKILL.md +94 -0
- package/skills/ffmpeg-media-processing/evals/triggers.json +16 -0
- package/skills/ffmpeg-media-processing/references/recipes.md +112 -0
- package/skills/fhir-integration/SKILL.md +81 -0
- package/skills/fhir-integration/evals/triggers.json +16 -0
- package/skills/fhir-integration/references/search-and-bundles.md +73 -0
- package/skills/fhir-integration/references/smart-on-fhir.md +50 -0
- package/skills/finishing-a-branch/SKILL.md +127 -0
- package/skills/finishing-a-branch/evals/behavior.json +49 -0
- package/skills/finishing-a-branch/evals/triggers.json +16 -0
- package/skills/flask-patterns/SKILL.md +132 -0
- package/skills/flask-patterns/evals/triggers.json +16 -0
- package/skills/flutter-patterns/SKILL.md +99 -0
- package/skills/flutter-patterns/evals/triggers.json +16 -0
- package/skills/flutterwave-integration/SKILL.md +75 -0
- package/skills/flutterwave-integration/evals/triggers.json +16 -0
- package/skills/flutterwave-integration/references/api.md +73 -0
- package/skills/flutterwave-integration/references/webhooks.md +49 -0
- package/skills/freight-carrier-management/SKILL.md +107 -0
- package/skills/freight-carrier-management/evals/triggers.json +16 -0
- package/skills/fsharp-patterns/SKILL.md +133 -0
- package/skills/fsharp-patterns/evals/triggers.json +16 -0
- package/skills/fsharp-testing/SKILL.md +136 -0
- package/skills/fsharp-testing/evals/triggers.json +16 -0
- package/skills/gcp-patterns/SKILL.md +86 -0
- package/skills/gcp-patterns/evals/triggers.json +16 -0
- package/skills/git-workflow/SKILL.md +114 -0
- package/skills/git-workflow/evals/triggers.json +16 -0
- package/skills/git-worktrees/SKILL.md +130 -0
- package/skills/git-worktrees/evals/behavior.json +56 -0
- package/skills/git-worktrees/evals/triggers.json +16 -0
- package/skills/github-actions-ci/SKILL.md +117 -0
- package/skills/github-actions-ci/evals/triggers.json +16 -0
- package/skills/github-api-automation/SKILL.md +101 -0
- package/skills/github-api-automation/evals/triggers.json +17 -0
- package/skills/go-patterns/SKILL.md +118 -0
- package/skills/go-patterns/evals/triggers.json +17 -0
- package/skills/go-patterns/references/concurrency.md +162 -0
- package/skills/go-testing/SKILL.md +154 -0
- package/skills/go-testing/evals/triggers.json +17 -0
- package/skills/google-workspace-integration/SKILL.md +65 -0
- package/skills/google-workspace-integration/evals/triggers.json +17 -0
- package/skills/google-workspace-integration/references/api.md +121 -0
- package/skills/harmonyos-arkts/SKILL.md +117 -0
- package/skills/harmonyos-arkts/evals/triggers.json +16 -0
- package/skills/harmonyos-arkts/references/build-errors.md +42 -0
- package/skills/hexagonal-architecture/SKILL.md +89 -0
- package/skills/hexagonal-architecture/evals/triggers.json +17 -0
- package/skills/hipaa-compliance/SKILL.md +91 -0
- package/skills/hipaa-compliance/evals/triggers.json +18 -0
- package/skills/hipaa-compliance/references/safeguards.md +68 -0
- package/skills/hl7v2-integration/SKILL.md +69 -0
- package/skills/hl7v2-integration/evals/triggers.json +16 -0
- package/skills/hl7v2-integration/references/messages-and-ack.md +78 -0
- package/skills/homelab-network-setup/SKILL.md +125 -0
- package/skills/homelab-network-setup/evals/triggers.json +18 -0
- package/skills/homelab-network-setup/references/firewall-and-dns.md +45 -0
- package/skills/homelab-network-setup/references/wireguard.md +72 -0
- package/skills/hubtel-integration/SKILL.md +77 -0
- package/skills/hubtel-integration/evals/triggers.json +16 -0
- package/skills/hubtel-integration/references/api.md +92 -0
- package/skills/i18n-localization/SKILL.md +114 -0
- package/skills/i18n-localization/evals/triggers.json +16 -0
- package/skills/i18n-localization/references/libraries.md +52 -0
- package/skills/implementation-plans/SKILL.md +117 -0
- package/skills/implementation-plans/evals/behavior.json +54 -0
- package/skills/implementation-plans/evals/triggers.json +16 -0
- package/skills/incident-postmortem/SKILL.md +118 -0
- package/skills/incident-postmortem/evals/triggers.json +14 -0
- package/skills/inventory-demand-planning/SKILL.md +89 -0
- package/skills/inventory-demand-planning/evals/triggers.json +16 -0
- package/skills/inventory-demand-planning/references/formulas.md +62 -0
- package/skills/investor-materials/SKILL.md +127 -0
- package/skills/investor-materials/evals/triggers.json +16 -0
- package/skills/investor-materials/references/templates.md +74 -0
- package/skills/invoicing-and-tax/SKILL.md +84 -0
- package/skills/invoicing-and-tax/evals/triggers.json +17 -0
- package/skills/invoicing-and-tax/references/e-invoicing.md +24 -0
- package/skills/invoicing-and-tax/references/invoice-fields.md +38 -0
- package/skills/invoicing-and-tax/references/rounding.md +26 -0
- package/skills/ios-platform-features/SKILL.md +99 -0
- package/skills/ios-platform-features/evals/triggers.json +16 -0
- package/skills/ios-platform-features/references/foundation-models.md +90 -0
- package/skills/java-patterns/SKILL.md +141 -0
- package/skills/java-patterns/evals/triggers.json +17 -0
- package/skills/java-testing/SKILL.md +142 -0
- package/skills/java-testing/evals/triggers.json +16 -0
- package/skills/jetpack-compose-patterns/SKILL.md +88 -0
- package/skills/jetpack-compose-patterns/evals/triggers.json +16 -0
- package/skills/jira-integration/SKILL.md +92 -0
- package/skills/jira-integration/evals/triggers.json +17 -0
- package/skills/jpa-hibernate/SKILL.md +92 -0
- package/skills/jpa-hibernate/evals/triggers.json +18 -0
- package/skills/jpa-hibernate/references/mapping.md +99 -0
- package/skills/jvm-sql-mappers/SKILL.md +98 -0
- package/skills/jvm-sql-mappers/evals/triggers.json +16 -0
- package/skills/jvm-sql-mappers/references/examples.md +129 -0
- package/skills/kotlin-multiplatform/SKILL.md +97 -0
- package/skills/kotlin-multiplatform/evals/triggers.json +16 -0
- package/skills/kotlin-patterns/SKILL.md +128 -0
- package/skills/kotlin-patterns/evals/triggers.json +16 -0
- package/skills/kotlin-testing/SKILL.md +117 -0
- package/skills/kotlin-testing/evals/triggers.json +16 -0
- package/skills/ktor-patterns/SKILL.md +135 -0
- package/skills/ktor-patterns/evals/triggers.json +18 -0
- package/skills/kubernetes-patterns/SKILL.md +106 -0
- package/skills/kubernetes-patterns/evals/triggers.json +16 -0
- package/skills/kubernetes-patterns/references/manifests.md +115 -0
- package/skills/laravel-patterns/SKILL.md +136 -0
- package/skills/laravel-patterns/evals/triggers.json +16 -0
- package/skills/linear-integration/SKILL.md +98 -0
- package/skills/linear-integration/evals/triggers.json +17 -0
- package/skills/literature-review/SKILL.md +109 -0
- package/skills/literature-review/evals/triggers.json +16 -0
- package/skills/literature-review/references/appraisal.md +41 -0
- package/skills/literature-review/references/search-sources.md +39 -0
- package/skills/llm-app-patterns/SKILL.md +97 -0
- package/skills/llm-app-patterns/evals/triggers.json +17 -0
- package/skills/llm-evals/SKILL.md +98 -0
- package/skills/llm-evals/evals/triggers.json +16 -0
- package/skills/llm-evals/references/graders.md +66 -0
- package/skills/logistics-exception-management/SKILL.md +90 -0
- package/skills/logistics-exception-management/evals/triggers.json +16 -0
- package/skills/manim-animations/SKILL.md +106 -0
- package/skills/manim-animations/evals/triggers.json +16 -0
- package/skills/market-research/SKILL.md +117 -0
- package/skills/market-research/evals/triggers.json +16 -0
- package/skills/marketing-campaign/SKILL.md +111 -0
- package/skills/marketing-campaign/evals/triggers.json +16 -0
- package/skills/mcp-server-patterns/SKILL.md +127 -0
- package/skills/mcp-server-patterns/evals/triggers.json +18 -0
- package/skills/mcp-server-patterns/references/protocol-notes.md +68 -0
- package/skills/metrics-dashboards/SKILL.md +113 -0
- package/skills/metrics-dashboards/evals/triggers.json +16 -0
- package/skills/ml-experiment-workflow/SKILL.md +125 -0
- package/skills/ml-experiment-workflow/evals/triggers.json +16 -0
- package/skills/mobile-accessibility/SKILL.md +94 -0
- package/skills/mobile-accessibility/evals/triggers.json +16 -0
- package/skills/mongodb-patterns/SKILL.md +115 -0
- package/skills/mongodb-patterns/evals/triggers.json +18 -0
- package/skills/mongodb-patterns/references/indexes-and-aggregation.md +94 -0
- package/skills/mpesa-daraja-integration/SKILL.md +70 -0
- package/skills/mpesa-daraja-integration/evals/triggers.json +16 -0
- package/skills/mpesa-daraja-integration/references/api.md +103 -0
- package/skills/mpesa-daraja-integration/references/callbacks.md +74 -0
- package/skills/mtn-momo-integration/SKILL.md +66 -0
- package/skills/mtn-momo-integration/evals/triggers.json +16 -0
- package/skills/mtn-momo-integration/references/api.md +153 -0
- package/skills/mtn-momo-integration/references/callbacks.md +92 -0
- package/skills/mtn-momo-integration/references/sandbox-and-go-live.md +51 -0
- package/skills/mtn-momo-integration/scripts/sandbox-setup.js +79 -0
- package/skills/mysql-patterns/SKILL.md +96 -0
- package/skills/mysql-patterns/evals/triggers.json +16 -0
- package/skills/mysql-patterns/references/explain.md +34 -0
- package/skills/mysql-patterns/references/online-ddl.md +41 -0
- package/skills/nestjs-patterns/SKILL.md +114 -0
- package/skills/nestjs-patterns/evals/triggers.json +16 -0
- package/skills/nestjs-patterns/references/testing.md +68 -0
- package/skills/network-automation/SKILL.md +107 -0
- package/skills/network-automation/evals/triggers.json +18 -0
- package/skills/network-automation/references/tool-snippets.md +153 -0
- package/skills/network-design/SKILL.md +98 -0
- package/skills/network-design/evals/triggers.json +16 -0
- package/skills/network-troubleshooting/SKILL.md +152 -0
- package/skills/network-troubleshooting/evals/triggers.json +18 -0
- package/skills/network-troubleshooting/references/commands.md +33 -0
- package/skills/nextjs-patterns/SKILL.md +150 -0
- package/skills/nextjs-patterns/evals/triggers.json +18 -0
- package/skills/nextjs-patterns/references/caching.md +87 -0
- package/skills/node-backend-patterns/SKILL.md +103 -0
- package/skills/node-backend-patterns/evals/triggers.json +16 -0
- package/skills/node-backend-patterns/references/templates.md +122 -0
- package/skills/nuxt-patterns/SKILL.md +103 -0
- package/skills/nuxt-patterns/evals/triggers.json +16 -0
- package/skills/observability/SKILL.md +125 -0
- package/skills/observability/evals/triggers.json +17 -0
- package/skills/observability/references/otel-setup.md +87 -0
- package/skills/observability/references/slo-alerts.md +70 -0
- package/skills/open-source-release/SKILL.md +107 -0
- package/skills/open-source-release/evals/triggers.json +15 -0
- package/skills/open-source-release/references/history-scrub.md +65 -0
- package/skills/parallel-agent-orchestration/SKILL.md +106 -0
- package/skills/parallel-agent-orchestration/evals/triggers.json +14 -0
- package/skills/patent-research/SKILL.md +94 -0
- package/skills/patent-research/evals/triggers.json +16 -0
- package/skills/patent-research/references/databases-and-queries.md +52 -0
- package/skills/paystack-integration/SKILL.md +59 -0
- package/skills/paystack-integration/evals/triggers.json +14 -0
- package/skills/paystack-integration/references/api.md +73 -0
- package/skills/paystack-integration/references/mobile-money.md +50 -0
- package/skills/paystack-integration/references/webhooks.md +80 -0
- package/skills/pci-dss-scope/SKILL.md +103 -0
- package/skills/pci-dss-scope/evals/triggers.json +18 -0
- package/skills/pci-dss-scope/references/saq-and-data.md +36 -0
- package/skills/perl-patterns/SKILL.md +135 -0
- package/skills/perl-patterns/evals/triggers.json +18 -0
- package/skills/perl-testing/SKILL.md +126 -0
- package/skills/perl-testing/evals/triggers.json +17 -0
- package/skills/php-patterns/SKILL.md +116 -0
- package/skills/php-patterns/evals/triggers.json +16 -0
- package/skills/php-testing/SKILL.md +123 -0
- package/skills/php-testing/evals/triggers.json +16 -0
- package/skills/postgres-patterns/SKILL.md +103 -0
- package/skills/postgres-patterns/evals/triggers.json +17 -0
- package/skills/postgres-patterns/references/explain.md +59 -0
- package/skills/postgres-patterns/references/locks.md +53 -0
- package/skills/prd-writing/SKILL.md +124 -0
- package/skills/prd-writing/evals/triggers.json +15 -0
- package/skills/prisma-patterns/SKILL.md +83 -0
- package/skills/prisma-patterns/evals/triggers.json +18 -0
- package/skills/prisma-patterns/references/prisma-8.md +46 -0
- package/skills/prisma-patterns/references/workflow.md +50 -0
- package/skills/privacy-compliance/SKILL.md +121 -0
- package/skills/privacy-compliance/evals/triggers.json +18 -0
- package/skills/privacy-compliance/references/jurisdictions.md +51 -0
- package/skills/production-scheduling/SKILL.md +98 -0
- package/skills/production-scheduling/evals/triggers.json +16 -0
- package/skills/prompt-engineering/SKILL.md +92 -0
- package/skills/prompt-engineering/evals/triggers.json +16 -0
- package/skills/prospect-research/SKILL.md +87 -0
- package/skills/prospect-research/evals/triggers.json +16 -0
- package/skills/python-app-distribution/SKILL.md +107 -0
- package/skills/python-app-distribution/evals/triggers.json +16 -0
- package/skills/python-app-distribution/references/pypi-trusted-publishing.md +55 -0
- package/skills/python-app-distribution/references/windows-macos-signing.md +70 -0
- package/skills/python-patterns/SKILL.md +107 -0
- package/skills/python-patterns/evals/triggers.json +16 -0
- package/skills/python-patterns/references/tooling.md +101 -0
- package/skills/python-testing/SKILL.md +126 -0
- package/skills/python-testing/evals/triggers.json +16 -0
- package/skills/python-testing/references/mocking.md +71 -0
- package/skills/pytorch-patterns/SKILL.md +139 -0
- package/skills/pytorch-patterns/evals/triggers.json +16 -0
- package/skills/pytorch-patterns/references/debugging.md +39 -0
- package/skills/quality-nonconformance/SKILL.md +107 -0
- package/skills/quality-nonconformance/evals/triggers.json +16 -0
- package/skills/quality-nonconformance/references/8d-and-capa.md +46 -0
- package/skills/quarkus-patterns/SKILL.md +93 -0
- package/skills/quarkus-patterns/evals/triggers.json +18 -0
- package/skills/rag-pipeline-patterns/SKILL.md +117 -0
- package/skills/rag-pipeline-patterns/evals/triggers.json +18 -0
- package/skills/rag-pipeline-patterns/references/evaluation.md +37 -0
- package/skills/rag-pipeline-patterns/references/retrieval-recipes.md +78 -0
- package/skills/rails-patterns/SKILL.md +132 -0
- package/skills/rails-patterns/evals/triggers.json +16 -0
- package/skills/react-native-patterns/SKILL.md +101 -0
- package/skills/react-native-patterns/evals/triggers.json +16 -0
- package/skills/react-patterns/SKILL.md +140 -0
- package/skills/react-patterns/evals/triggers.json +18 -0
- package/skills/react-performance/SKILL.md +107 -0
- package/skills/react-performance/evals/triggers.json +18 -0
- package/skills/react-testing/SKILL.md +121 -0
- package/skills/react-testing/evals/triggers.json +18 -0
- package/skills/react-testing/references/msw.md +64 -0
- package/skills/react-testing/references/queries.md +41 -0
- package/skills/react-testing/references/setup.md +74 -0
- package/skills/recommender-systems/SKILL.md +119 -0
- package/skills/recommender-systems/evals/triggers.json +16 -0
- package/skills/recommender-systems/references/evaluation.md +39 -0
- package/skills/redis-patterns/SKILL.md +109 -0
- package/skills/redis-patterns/evals/triggers.json +18 -0
- package/skills/redis-patterns/references/operations.md +61 -0
- package/skills/refactoring-safely/SKILL.md +107 -0
- package/skills/refactoring-safely/evals/behavior.json +57 -0
- package/skills/refactoring-safely/evals/triggers.json +17 -0
- package/skills/release-management/SKILL.md +141 -0
- package/skills/release-management/evals/triggers.json +16 -0
- package/skills/remotion-video/SKILL.md +91 -0
- package/skills/remotion-video/evals/triggers.json +16 -0
- package/skills/remotion-video/references/lambda.md +66 -0
- package/skills/reproducible-dev-environments/SKILL.md +132 -0
- package/skills/reproducible-dev-environments/evals/triggers.json +16 -0
- package/skills/responding-to-code-review/SKILL.md +124 -0
- package/skills/responding-to-code-review/evals/behavior.json +54 -0
- package/skills/responding-to-code-review/evals/triggers.json +16 -0
- package/skills/returns-reverse-logistics/SKILL.md +97 -0
- package/skills/returns-reverse-logistics/evals/triggers.json +16 -0
- package/skills/ruby-patterns/SKILL.md +127 -0
- package/skills/ruby-patterns/evals/triggers.json +18 -0
- package/skills/ruby-testing/SKILL.md +113 -0
- package/skills/ruby-testing/evals/triggers.json +18 -0
- package/skills/runbook-writing/SKILL.md +101 -0
- package/skills/runbook-writing/evals/triggers.json +14 -0
- package/skills/rust-patterns/SKILL.md +118 -0
- package/skills/rust-patterns/evals/triggers.json +16 -0
- package/skills/rust-patterns/references/cargo-and-clippy.md +105 -0
- package/skills/rust-patterns/references/errors-and-traits.md +97 -0
- package/skills/rust-testing/SKILL.md +148 -0
- package/skills/rust-testing/evals/triggers.json +16 -0
- package/skills/rust-testing/references/fakes-proptest-async.md +113 -0
- package/skills/search-first/SKILL.md +73 -0
- package/skills/search-first/evals/triggers.json +14 -0
- package/skills/security-review/SKILL.md +58 -0
- package/skills/security-review/evals/behavior.json +56 -0
- package/skills/security-review/evals/triggers.json +14 -0
- package/skills/security-review/references/checklist.md +54 -0
- package/skills/security-review/scripts/scan-secrets.js +79 -0
- package/skills/seo-audit/SKILL.md +111 -0
- package/skills/seo-audit/evals/triggers.json +16 -0
- package/skills/seo-audit/references/checks.md +65 -0
- package/skills/session-handoff/SKILL.md +101 -0
- package/skills/session-handoff/evals/behavior.json +55 -0
- package/skills/session-handoff/evals/triggers.json +14 -0
- package/skills/skill-authoring/SKILL.md +98 -0
- package/skills/skill-authoring/evals/triggers.json +15 -0
- package/skills/skill-authoring/references/frontmatter.md +40 -0
- package/skills/skill-authoring/references/pressure-testing.md +87 -0
- package/skills/slack-app-integration/SKILL.md +108 -0
- package/skills/slack-app-integration/evals/triggers.json +17 -0
- package/skills/slide-decks/SKILL.md +107 -0
- package/skills/slide-decks/evals/triggers.json +18 -0
- package/skills/slide-decks/references/html-decks.md +86 -0
- package/skills/slide-decks/references/layouts.md +45 -0
- package/skills/slide-decks/references/pptx.md +87 -0
- package/skills/smart-contract-security/SKILL.md +110 -0
- package/skills/smart-contract-security/evals/triggers.json +16 -0
- package/skills/smart-contract-security/references/vulnerability-checklist.md +79 -0
- package/skills/social-media-publishing/SKILL.md +84 -0
- package/skills/social-media-publishing/evals/triggers.json +17 -0
- package/skills/social-media-publishing/references/platform-apis.md +116 -0
- package/skills/solidity-patterns/SKILL.md +95 -0
- package/skills/solidity-patterns/evals/triggers.json +16 -0
- package/skills/spring-boot-patterns/SKILL.md +128 -0
- package/skills/spring-boot-patterns/evals/triggers.json +18 -0
- package/skills/spring-boot-patterns/references/testing.md +72 -0
- package/skills/stripe-integration/SKILL.md +69 -0
- package/skills/stripe-integration/evals/triggers.json +16 -0
- package/skills/stripe-integration/references/api.md +71 -0
- package/skills/stripe-integration/references/billing.md +58 -0
- package/skills/stripe-integration/references/webhooks.md +76 -0
- package/skills/subagent-driven-development/SKILL.md +109 -0
- package/skills/subagent-driven-development/evals/behavior.json +53 -0
- package/skills/subagent-driven-development/evals/triggers.json +15 -0
- package/skills/subagent-driven-development/references/implementer-brief.md +60 -0
- package/skills/subagent-driven-development/references/reviewer-briefs.md +52 -0
- package/skills/subscription-billing-ops/SKILL.md +118 -0
- package/skills/subscription-billing-ops/evals/triggers.json +17 -0
- package/skills/subscription-billing-ops/references/proration.md +47 -0
- package/skills/subscription-billing-ops/references/revenue-metrics.md +38 -0
- package/skills/svelte-patterns/SKILL.md +122 -0
- package/skills/svelte-patterns/evals/triggers.json +16 -0
- package/skills/swift-patterns/SKILL.md +113 -0
- package/skills/swift-patterns/evals/triggers.json +16 -0
- package/skills/swift-patterns/references/concurrency-migration.md +40 -0
- package/skills/swift-testing/SKILL.md +121 -0
- package/skills/swift-testing/evals/triggers.json +16 -0
- package/skills/swift-testing/references/swift-testing-cheatsheet.md +81 -0
- package/skills/swiftui-patterns/SKILL.md +102 -0
- package/skills/swiftui-patterns/evals/triggers.json +16 -0
- package/skills/systematic-debugging/SKILL.md +92 -0
- package/skills/systematic-debugging/evals/behavior.json +59 -0
- package/skills/systematic-debugging/evals/triggers.json +16 -0
- package/skills/systematic-debugging/references/condition-waiting.md +52 -0
- package/skills/systematic-debugging/references/root-cause-tracing.md +49 -0
- package/skills/systematic-debugging/references/test-pollution.md +46 -0
- package/skills/tdd-workflow/SKILL.md +69 -0
- package/skills/tdd-workflow/evals/behavior.json +55 -0
- package/skills/tdd-workflow/evals/triggers.json +15 -0
- package/skills/tdd-workflow/references/testing-anti-patterns.md +87 -0
- package/skills/technical-writing/SKILL.md +95 -0
- package/skills/technical-writing/evals/triggers.json +14 -0
- package/skills/terraform-patterns/SKILL.md +122 -0
- package/skills/terraform-patterns/evals/triggers.json +16 -0
- package/skills/terraform-patterns/references/backends.md +67 -0
- package/skills/test-coverage-improvement/SKILL.md +107 -0
- package/skills/test-coverage-improvement/evals/triggers.json +16 -0
- package/skills/threat-modeling/SKILL.md +113 -0
- package/skills/threat-modeling/evals/triggers.json +16 -0
- package/skills/transactional-email/SKILL.md +68 -0
- package/skills/transactional-email/evals/triggers.json +17 -0
- package/skills/transactional-email/references/providers.md +63 -0
- package/skills/typescript-patterns/SKILL.md +122 -0
- package/skills/typescript-patterns/evals/triggers.json +16 -0
- package/skills/typescript-testing/SKILL.md +101 -0
- package/skills/typescript-testing/evals/triggers.json +16 -0
- package/skills/ui-demo-recording/SKILL.md +93 -0
- package/skills/ui-demo-recording/evals/triggers.json +16 -0
- package/skills/ui-demo-recording/references/cursor-and-captions.md +48 -0
- package/skills/ui-demo-recording/references/playwright-recording.md +63 -0
- package/skills/ui-demo-recording/references/post-processing.md +57 -0
- package/skills/ui-design-polish/SKILL.md +113 -0
- package/skills/ui-design-polish/evals/triggers.json +18 -0
- package/skills/ui-design-polish/references/detail-checklist.md +45 -0
- package/skills/ui-design-polish/references/tokens.md +68 -0
- package/skills/ui-flow-audit/SKILL.md +112 -0
- package/skills/ui-flow-audit/evals/triggers.json +17 -0
- package/skills/ui-motion/SKILL.md +103 -0
- package/skills/ui-motion/evals/triggers.json +18 -0
- package/skills/ui-motion/references/patterns.md +138 -0
- package/skills/ui-motion/references/tokens.md +52 -0
- package/skills/unicode-text-processing/SKILL.md +103 -0
- package/skills/unicode-text-processing/evals/triggers.json +17 -0
- package/skills/unicode-text-processing/references/apis.md +89 -0
- package/skills/unicode-text-processing/references/script-notes.md +50 -0
- package/skills/verification-loop/SKILL.md +70 -0
- package/skills/verification-loop/evals/behavior.json +52 -0
- package/skills/verification-loop/evals/triggers.json +14 -0
- package/skills/verification-loop/scripts/detect-checks.js +102 -0
- package/skills/video-editing/SKILL.md +111 -0
- package/skills/video-editing/evals/triggers.json +16 -0
- package/skills/video-editing/references/edl-and-logging.md +44 -0
- package/skills/video-editing/references/ffmpeg-edit-recipes.md +92 -0
- package/skills/video-editing/references/resolve-scripting.md +53 -0
- package/skills/vite-patterns/SKILL.md +117 -0
- package/skills/vite-patterns/evals/triggers.json +16 -0
- package/skills/vue-patterns/SKILL.md +104 -0
- package/skills/vue-patterns/evals/triggers.json +16 -0
- package/skills/web-accessibility/SKILL.md +119 -0
- package/skills/web-accessibility/evals/triggers.json +16 -0
- package/skills/web-performance/SKILL.md +107 -0
- package/skills/web-performance/evals/triggers.json +16 -0
- package/skills/web-scraping/SKILL.md +80 -0
- package/skills/web-scraping/evals/triggers.json +16 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// After the agent edits files, formats each one with the formatter the project already uses.
|
|
4
|
+
// Never formats with a tool the project hasn't chosen, never touches files outside the project,
|
|
5
|
+
// never fails the edit. check({ files: [{ path }], cwd }) -> {}
|
|
6
|
+
|
|
7
|
+
const fs = require('fs');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const { execFileSync } = require('child_process');
|
|
10
|
+
|
|
11
|
+
const TIMEOUT_MS = 15000;
|
|
12
|
+
const WEB = /\.(?:[cm]?[jt]sx?|json|jsonc|css|scss|less|html|vue|svelte|astro|md|mdx|ya?ml|graphql)$/;
|
|
13
|
+
|
|
14
|
+
const exists = (p) => fs.existsSync(p);
|
|
15
|
+
const read = (p) => {
|
|
16
|
+
try {
|
|
17
|
+
return fs.readFileSync(p, 'utf8');
|
|
18
|
+
} catch {
|
|
19
|
+
return '';
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
function onPath(bin) {
|
|
24
|
+
const exts = process.platform === 'win32' ? (process.env.PATHEXT || '.EXE;.CMD').split(';') : [''];
|
|
25
|
+
for (const dir of (process.env.PATH || '').split(path.delimiter)) {
|
|
26
|
+
for (const ext of exts) if (dir && exists(path.join(dir, bin + ext))) return path.join(dir, bin + ext);
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Nearest folder at or above `from` (but not above `root`) that contains `marker`.
|
|
32
|
+
function nearest(from, root, marker) {
|
|
33
|
+
for (let dir = from; ; dir = path.dirname(dir)) {
|
|
34
|
+
if (exists(path.join(dir, marker))) return dir;
|
|
35
|
+
if (dir === root || dir === path.dirname(dir)) return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function localBin(from, root, name) {
|
|
40
|
+
const dir = nearest(from, root, path.join('node_modules', '.bin', name));
|
|
41
|
+
return dir && path.join(dir, 'node_modules', '.bin', name);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Returns [program, args] for the project's formatter for this file, or null.
|
|
45
|
+
function formatterFor(file, root) {
|
|
46
|
+
const dir = path.dirname(file);
|
|
47
|
+
if (WEB.test(file)) {
|
|
48
|
+
const biomeDir = nearest(dir, root, 'biome.json') || nearest(dir, root, 'biome.jsonc');
|
|
49
|
+
const biome = biomeDir && localBin(dir, root, 'biome');
|
|
50
|
+
if (biome) return [biome, ['format', '--write', file]];
|
|
51
|
+
const prettier = localBin(dir, root, 'prettier');
|
|
52
|
+
if (prettier) return [prettier, ['--write', '--log-level', 'warn', file]];
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
if (file.endsWith('.py')) {
|
|
56
|
+
const pyproject = read(path.join(nearest(dir, root, 'pyproject.toml') || '', 'pyproject.toml'));
|
|
57
|
+
const ruffConfig = /\[tool\.ruff/.test(pyproject) || nearest(dir, root, 'ruff.toml') || nearest(dir, root, '.ruff.toml');
|
|
58
|
+
if (ruffConfig && onPath('ruff')) return [onPath('ruff'), ['format', file]];
|
|
59
|
+
if (/\[tool\.black/.test(pyproject) && onPath('black')) return [onPath('black'), ['-q', file]];
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
if (file.endsWith('.go') && onPath('gofmt')) return [onPath('gofmt'), ['-w', file]];
|
|
63
|
+
if (file.endsWith('.rs') && onPath('rustfmt')) {
|
|
64
|
+
const cargo = nearest(dir, root, 'Cargo.toml');
|
|
65
|
+
const edition = (/^\s*edition\s*=\s*"(\d{4})"/m.exec(read(path.join(cargo || '', 'Cargo.toml'))) || [])[1];
|
|
66
|
+
return [onPath('rustfmt'), [...(edition ? ['--edition', edition] : []), file]];
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function check(event) {
|
|
72
|
+
const root = path.resolve(event.cwd || process.cwd());
|
|
73
|
+
for (const f of event.files || []) {
|
|
74
|
+
if (!f || typeof f.path !== 'string') continue;
|
|
75
|
+
const file = path.resolve(root, f.path);
|
|
76
|
+
const rel = path.relative(root, file);
|
|
77
|
+
if (!rel || rel.startsWith('..') || path.isAbsolute(rel) || !exists(file)) continue;
|
|
78
|
+
const fmt = formatterFor(file, root);
|
|
79
|
+
if (!fmt) continue;
|
|
80
|
+
try {
|
|
81
|
+
execFileSync(fmt[0], fmt[1], { cwd: root, stdio: 'ignore', timeout: TIMEOUT_MS });
|
|
82
|
+
} catch {
|
|
83
|
+
// A formatter error (syntax error mid-edit, missing plugin) must never fail the edit.
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return {};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
module.exports = { check, formatterFor };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: guard-secrets
|
|
3
|
+
description: Stops the agent from writing API keys, tokens, passwords, connection strings or private keys into files, using the same rules as the security-review secret scanner.
|
|
4
|
+
license: MIT
|
|
5
|
+
metadata:
|
|
6
|
+
kete-loom/version: "0.1.0"
|
|
7
|
+
kete-loom/category: security
|
|
8
|
+
kete-loom/risk: read-only
|
|
9
|
+
kete-loom/event: "pre-edit"
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Guard secrets
|
|
14
|
+
|
|
15
|
+
Runs before every file write or edit and checks the new text for secrets: AWS, GitHub, Anthropic, OpenAI, Paystack, Stripe, Slack and Google keys, private key blocks, JWTs, connection strings with passwords, and hard-coded `password`/`api_key`/`token` assignments. If it finds one, the edit is refused and the agent is told to read the value from an environment variable or secret store.
|
|
16
|
+
|
|
17
|
+
Placeholders such as `<your-api-key>`, `${API_KEY}`, `process.env...`, `changeme` or `your_key_here` are allowed. The reason message masks the value, so the secret isn't echoed back.
|
|
18
|
+
|
|
19
|
+
It uses the same rules as `skills/security-review/scripts/scan-secrets.js`, which a test keeps in sync. Not available in Cursor, which has no documented hook before an edit.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_block": [
|
|
3
|
+
{
|
|
4
|
+
"files": [
|
|
5
|
+
{
|
|
6
|
+
"path": "src/pay.ts",
|
|
7
|
+
"content": "const key = 'sk_live_{{repeat:a:40}}';"
|
|
8
|
+
}
|
|
9
|
+
]
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"files": [
|
|
13
|
+
{
|
|
14
|
+
"path": "config.py",
|
|
15
|
+
"content": "AWS_KEY = 'AKIA{{repeat:Q:16}}'"
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"files": [
|
|
21
|
+
{
|
|
22
|
+
"path": "app.js",
|
|
23
|
+
"content": "const k = process.env.KEY || 'sk_live_{{repeat:b:40}}'"
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"files": [
|
|
29
|
+
{
|
|
30
|
+
"path": "ci.yml",
|
|
31
|
+
"content": "token: ghp_{{repeat:a:36}}"
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"files": [
|
|
37
|
+
{
|
|
38
|
+
"path": "db.ts",
|
|
39
|
+
"content": "const url = 'postgres://admin:hunter2pass@db.internal:5432/app'"
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"files": [
|
|
45
|
+
{
|
|
46
|
+
"path": "keys/deploy",
|
|
47
|
+
"content": "{{repeat:-:5}}BEGIN OPENSSH PRIVATE KEY{{repeat:-:5}}\nabc"
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"files": [
|
|
53
|
+
{
|
|
54
|
+
"path": "settings.json",
|
|
55
|
+
"content": "{ \"api_key\": \"q8Zr1xWm3Lp9TbV2\" }"
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
"should_allow": [
|
|
61
|
+
{
|
|
62
|
+
"files": [
|
|
63
|
+
{
|
|
64
|
+
"path": "src/pay.ts",
|
|
65
|
+
"content": "const key = process.env.PAYSTACK_SECRET_KEY"
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"files": [
|
|
71
|
+
{
|
|
72
|
+
"path": ".env.example",
|
|
73
|
+
"content": "PAYSTACK_SECRET_KEY=sk_test_your_key_here"
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"files": [
|
|
79
|
+
{
|
|
80
|
+
"path": "docs/setup.md",
|
|
81
|
+
"content": "Set api_key: \"<your-api-key>\" in config"
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"files": [
|
|
87
|
+
{
|
|
88
|
+
"path": "db.ts",
|
|
89
|
+
"content": "const url = `postgres://${user}:${pass}@${host}/app`"
|
|
90
|
+
}
|
|
91
|
+
]
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"files": [
|
|
95
|
+
{
|
|
96
|
+
"path": "README.md",
|
|
97
|
+
"content": "Get a key from the dashboard and export it."
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"files": [
|
|
103
|
+
{
|
|
104
|
+
"path": "test/fixtures.ts",
|
|
105
|
+
"content": "const password = 'changeme-in-tests'"
|
|
106
|
+
}
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Blocks agent edits that would write a secret (API key, token, private key, password) into a file.
|
|
4
|
+
// check({ files: [{ path, content }], cwd }) -> verdict. Content is the new text being written.
|
|
5
|
+
|
|
6
|
+
// Same rules as skills/security-review/scripts/scan-secrets.js; tests/hooks.test.js keeps them in sync.
|
|
7
|
+
const RULES = [
|
|
8
|
+
['AWS access key', /\b(AKIA|ASIA)[0-9A-Z]{16}\b/],
|
|
9
|
+
['GitHub token', /\b(ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36,}\b|\bgithub_pat_[A-Za-z0-9_]{60,}\b/],
|
|
10
|
+
['Anthropic API key', /\bsk-ant-[A-Za-z0-9_-]{20,}\b/],
|
|
11
|
+
['OpenAI API key', /\bsk-(proj-)?[A-Za-z0-9_-]{32,}\b/],
|
|
12
|
+
['Paystack secret key', /\bsk_(live|test)_[a-f0-9]{40}\b/],
|
|
13
|
+
['Stripe live key', /\b(sk|rk)_live_[A-Za-z0-9]{20,}\b/],
|
|
14
|
+
['Slack token', /\bxox[abprs]-[A-Za-z0-9-]{10,}\b/],
|
|
15
|
+
['Google API key', /\bAIza[0-9A-Za-z_-]{35}\b/],
|
|
16
|
+
['Private key block', /-----BEGIN (RSA |EC |OPENSSH |DSA |PGP )?PRIVATE KEY-----/],
|
|
17
|
+
['JWT', /\beyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/],
|
|
18
|
+
['Connection string with password', /\b(postgres(ql)?|mysql|mongodb(\+srv)?|redis|amqp):\/\/[^\s:@/]+:[^\s@/]{3,}@/i],
|
|
19
|
+
['Hard-coded secret assignment', /\b(password|passwd|secret|api[_-]?key|access[_-]?token|auth[_-]?token)\b["']?\s*[:=]\s*["'][^"'\s]{8,}["']/i],
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
const PLACEHOLDER = /(example|placeholder|changeme|your[_-]|xxxx|dummy|fake|<[^>]+>|\$\{|process\.env|os\.environ)/i;
|
|
23
|
+
|
|
24
|
+
const mask = (s) => (s.length <= 8 ? '****' : `${s.slice(0, 4)}…${s.slice(-2)} (${s.length} chars)`);
|
|
25
|
+
|
|
26
|
+
function check(event) {
|
|
27
|
+
for (const file of event.files || []) {
|
|
28
|
+
if (!file || typeof file.content !== 'string') continue;
|
|
29
|
+
const lines = file.content.split('\n');
|
|
30
|
+
for (let i = 0; i < lines.length; i++) {
|
|
31
|
+
for (const [label, re] of RULES) {
|
|
32
|
+
const m = re.exec(lines[i]);
|
|
33
|
+
if (!m || PLACEHOLDER.test(m[0])) continue;
|
|
34
|
+
return {
|
|
35
|
+
block: true,
|
|
36
|
+
reason: `Blocked by kete-loom (guard-secrets): this edit writes a ${label} (${mask(m[0])}) into ${file.path || 'a file'}. Read it from an environment variable or secret store instead, and if it is real, tell the user to rotate it.`,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return { block: false };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
module.exports = { check, RULES };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: load-session-context
|
|
3
|
+
description: At the start of each session, tells the agent the current branch, how many uncommitted changes there are, and the latest session handoff note, so it picks up where the last session stopped.
|
|
4
|
+
license: MIT
|
|
5
|
+
metadata:
|
|
6
|
+
kete-loom/version: "0.1.0"
|
|
7
|
+
kete-loom/category: meta
|
|
8
|
+
kete-loom/risk: runs-commands
|
|
9
|
+
kete-loom/event: "session-start"
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Load session context
|
|
14
|
+
|
|
15
|
+
Runs when a session starts, in a git repository only. It adds a short note to the agent's context:
|
|
16
|
+
|
|
17
|
+
- the current branch and the number of uncommitted changes (from `git status`);
|
|
18
|
+
- the session handoff note written by the `session-handoff` skill, if there is one: `.handoff/<branch>.md`, then `HANDOFF.md`, then the newest note in `.handoff/` or `docs/handoff/`. At most 60 lines are included, and the agent is told to check it against the repository before acting on it.
|
|
19
|
+
|
|
20
|
+
It only reads; it never changes files. Not available in OpenCode, which has no way for a hook to add context at session start.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// At session start, tells the agent where things stand: the branch, uncommitted work, and the
|
|
4
|
+
// latest session handoff note (written by the session-handoff skill). check({ cwd }) -> { context }
|
|
5
|
+
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const { execFileSync } = require('child_process');
|
|
9
|
+
|
|
10
|
+
const MAX_NOTE_LINES = 60;
|
|
11
|
+
const MAX_NOTE_CHARS = 3000;
|
|
12
|
+
|
|
13
|
+
function git(cwd, args) {
|
|
14
|
+
try {
|
|
15
|
+
return execFileSync('git', args, { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], timeout: 3000 }).trim();
|
|
16
|
+
} catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function newest(dir) {
|
|
22
|
+
try {
|
|
23
|
+
return fs.readdirSync(dir).filter((f) => f.endsWith('.md'))
|
|
24
|
+
.map((f) => path.join(dir, f))
|
|
25
|
+
.sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs)[0] || null;
|
|
26
|
+
} catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// The note for this branch first, then HANDOFF.md, then the newest note in the usual folders.
|
|
32
|
+
function findNote(root, branch) {
|
|
33
|
+
const candidates = [];
|
|
34
|
+
if (branch) for (const name of [branch, branch.replace(/\//g, '-')]) candidates.push(path.join(root, '.handoff', `${name}.md`));
|
|
35
|
+
candidates.push(path.join(root, 'HANDOFF.md'));
|
|
36
|
+
const direct = candidates.find((p) => fs.existsSync(p));
|
|
37
|
+
return direct || newest(path.join(root, '.handoff')) || newest(path.join(root, 'docs', 'handoff'));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function check(event) {
|
|
41
|
+
const cwd = event.cwd || process.cwd();
|
|
42
|
+
const root = git(cwd, ['rev-parse', '--show-toplevel']);
|
|
43
|
+
if (!root) return {};
|
|
44
|
+
const branch = git(root, ['rev-parse', '--abbrev-ref', 'HEAD']);
|
|
45
|
+
const changes = (git(root, ['status', '--porcelain']) || '').split('\n').filter(Boolean).length;
|
|
46
|
+
const lines = [`Session context from kete-loom (load-session-context):`, `- Branch: ${branch || 'unknown'}, ${changes} uncommitted change(s).`];
|
|
47
|
+
const note = findNote(root, branch);
|
|
48
|
+
if (note) {
|
|
49
|
+
let text = fs.readFileSync(note, 'utf8').split('\n').slice(0, MAX_NOTE_LINES).join('\n');
|
|
50
|
+
if (text.length > MAX_NOTE_CHARS) text = `${text.slice(0, MAX_NOTE_CHARS)}\n…`;
|
|
51
|
+
lines.push(`- Handoff note ${path.relative(root, note)} (check it against the repository before acting on it):`, '', text);
|
|
52
|
+
}
|
|
53
|
+
return { context: lines.join('\n') };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
module.exports = { check };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: notify-on-stop
|
|
3
|
+
description: Shows a desktop notification when the agent finishes its turn, so you can switch away during long tasks and come back when it is your move.
|
|
4
|
+
license: MIT
|
|
5
|
+
metadata:
|
|
6
|
+
kete-loom/version: "0.1.0"
|
|
7
|
+
kete-loom/category: meta
|
|
8
|
+
kete-loom/risk: runs-commands
|
|
9
|
+
kete-loom/event: "stop"
|
|
10
|
+
kete-loom/opt-in: "true"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Notify on stop
|
|
15
|
+
|
|
16
|
+
Runs when the agent ends its turn and shows a notification naming the project folder:
|
|
17
|
+
|
|
18
|
+
- on macOS through `osascript`;
|
|
19
|
+
- on Linux through `notify-send`, when it is installed.
|
|
20
|
+
|
|
21
|
+
On Windows and on machines with neither, it does nothing. It never blocks, never changes files and never uses the network.
|
|
22
|
+
|
|
23
|
+
Available in Claude Code, Codex, Gemini CLI, Kete Code, Cursor and GitHub Copilot.
|
|
24
|
+
|
|
25
|
+
Opt-in: `--hooks` leaves it out; install it by name with `--hook`.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Desktop notification when the agent finishes its turn. Never blocks. check({ cwd }) -> {}
|
|
4
|
+
|
|
5
|
+
const fs = require('fs');
|
|
6
|
+
const path = require('path');
|
|
7
|
+
const { execFileSync } = require('child_process');
|
|
8
|
+
|
|
9
|
+
function notifier(platform = process.platform, env = process.env) {
|
|
10
|
+
if (platform === 'darwin') return (title, body) => ['osascript', ['-e', `display notification ${JSON.stringify(body)} with title ${JSON.stringify(title)}`]];
|
|
11
|
+
if (platform === 'linux' && (env.PATH || '').split(path.delimiter).some((d) => d && fs.existsSync(path.join(d, 'notify-send')))) return (title, body) => ['notify-send', [title, body]];
|
|
12
|
+
return null; // shortcut: no Windows toast (it needs a PowerShell module); add one if Windows users ask
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function check(event) {
|
|
16
|
+
const make = notifier();
|
|
17
|
+
if (!make) return {};
|
|
18
|
+
const [program, args] = make('Agent finished', `${path.basename(path.resolve(event.cwd || process.cwd()))}: your turn`);
|
|
19
|
+
try {
|
|
20
|
+
execFileSync(program, args, { stdio: 'ignore', timeout: 3000 });
|
|
21
|
+
} catch {
|
|
22
|
+
// a notification that can't be shown is not worth failing over
|
|
23
|
+
}
|
|
24
|
+
return {};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
module.exports = { check, notifier };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: protect-files
|
|
3
|
+
description: Stops the agent from editing files that should never be hand-edited, such as .env files with secrets, package lockfiles, anything inside .git, and private keys.
|
|
4
|
+
license: MIT
|
|
5
|
+
metadata:
|
|
6
|
+
kete-loom/version: "0.1.0"
|
|
7
|
+
kete-loom/category: security
|
|
8
|
+
kete-loom/risk: read-only
|
|
9
|
+
kete-loom/event: "pre-edit"
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Protect files
|
|
14
|
+
|
|
15
|
+
Runs before every file write or edit. Blocks:
|
|
16
|
+
|
|
17
|
+
| Files | Why | What the agent should do instead |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| `.env`, `.env.local`, `.env.production`… (not `.env.example`/`.sample`/`.template`) | They hold real secrets | Edit `.env.example` and tell you which values to set |
|
|
20
|
+
| Lockfiles (`package-lock.json`, `yarn.lock`, `pnpm-lock.yaml`, `bun.lock`, `Cargo.lock`, `poetry.lock`, `uv.lock`, `go.sum`, `Gemfile.lock`, `composer.lock` and others) | Hand edits break dependency resolution | Run the package manager, which rewrites the lockfile |
|
|
21
|
+
| Anything under `.git/` | Editing git's internals can corrupt the repository | Use git commands |
|
|
22
|
+
| Private keys and keystores (`id_rsa`, `id_ed25519`, `*.pem`, `*.key`, `*.p12`…; `.pub` files are fine) | Keys don't belong in the repository | Generate and store keys outside it |
|
|
23
|
+
|
|
24
|
+
Not available in Cursor, which has no documented hook before an edit.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_block": [
|
|
3
|
+
{ "files": [{ "path": ".env", "content": "DB_URL=postgres://x" }] },
|
|
4
|
+
{ "files": [{ "path": "apps/api/.env.local", "content": "X=1" }] },
|
|
5
|
+
{ "files": [{ "path": ".env.production", "content": "X=1" }] },
|
|
6
|
+
{ "files": [{ "path": "package-lock.json", "content": "{}" }] },
|
|
7
|
+
{ "files": [{ "path": "web/pnpm-lock.yaml", "content": "" }] },
|
|
8
|
+
{ "files": [{ "path": "Cargo.lock", "content": "" }] },
|
|
9
|
+
{ "files": [{ "path": "go.sum", "content": "" }] },
|
|
10
|
+
{ "files": [{ "path": ".git/config", "content": "[core]" }] },
|
|
11
|
+
{ "files": [{ "path": ".git/hooks/pre-commit", "content": "exit 0" }] },
|
|
12
|
+
{ "files": [{ "path": "certs/server.key", "content": "x" }] },
|
|
13
|
+
{ "files": [{ "path": "deploy/id_ed25519", "content": "x" }] },
|
|
14
|
+
{ "files": [{ "path": "src/ok.ts", "content": "x" }, { "path": "yarn.lock", "content": "" }] }
|
|
15
|
+
],
|
|
16
|
+
"should_allow": [
|
|
17
|
+
{ "files": [{ "path": ".env.example", "content": "DB_URL=" }] },
|
|
18
|
+
{ "files": [{ "path": "config/.env.template", "content": "X=" }] },
|
|
19
|
+
{ "files": [{ "path": "src/env.ts", "content": "export const env = process.env" }] },
|
|
20
|
+
{ "files": [{ "path": "package.json", "content": "{}" }] },
|
|
21
|
+
{ "files": [{ "path": "docs/lockfiles.md", "content": "about package-lock.json" }] },
|
|
22
|
+
{ "files": [{ "path": ".github/workflows/ci.yml", "content": "on: push" }] },
|
|
23
|
+
{ "files": [{ "path": "deploy/id_ed25519.pub", "content": "ssh-ed25519 AAAA" }] },
|
|
24
|
+
{ "files": [{ "path": "src/keyboard.ts", "content": "x" }] },
|
|
25
|
+
{ "files": [{ "path": ".gitignore", "content": "node_modules" }] }
|
|
26
|
+
]
|
|
27
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Blocks agent edits to files that should never be hand-edited: secrets (.env), lockfiles,
|
|
4
|
+
// git internals and private keys. check({ files: [{ path, content }], cwd }) -> verdict.
|
|
5
|
+
|
|
6
|
+
const path = require('path');
|
|
7
|
+
|
|
8
|
+
const RULES = [
|
|
9
|
+
{
|
|
10
|
+
test: (rel, base) => /^\.env(?:\..+)?$/.test(base) && !/\.(?:example|sample|template|dist|defaults)$/.test(base),
|
|
11
|
+
reason: 'is an environment file that holds secrets. Edit .env.example and tell the user which values to set.',
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
test: (rel, base) => /^(?:package-lock\.json|npm-shrinkwrap\.json|yarn\.lock|pnpm-lock\.yaml|bun\.lockb?|Cargo\.lock|poetry\.lock|uv\.lock|Pipfile\.lock|Gemfile\.lock|composer\.lock|go\.sum|pubspec\.lock|Podfile\.lock|mix\.lock|packages\.lock\.json|gradle\.lockfile|flake\.lock)$/.test(base),
|
|
15
|
+
reason: "is a lockfile. Change the dependency with the package manager (it rewrites the lockfile) instead of editing it.",
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
test: (rel) => /(?:^|\/)\.git\//.test(rel) || rel === '.git',
|
|
19
|
+
reason: "is inside .git. Use git commands; editing git's internals can corrupt the repository.",
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
test: (rel, base) => /^(?:id_(?:rsa|dsa|ecdsa|ed25519)|.*\.(?:pem|key|p12|pfx|jks|keystore))$/.test(base) && !/\.pub$/.test(base),
|
|
23
|
+
reason: 'looks like a private key or keystore. Keys are generated and stored outside the repository.',
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
function check(event) {
|
|
28
|
+
const cwd = event.cwd || process.cwd();
|
|
29
|
+
for (const file of event.files || []) {
|
|
30
|
+
if (!file || typeof file.path !== 'string') continue;
|
|
31
|
+
const rel = path.relative(cwd, path.resolve(cwd, file.path)).split(path.sep).join('/');
|
|
32
|
+
const base = path.basename(file.path);
|
|
33
|
+
const rule = RULES.find((r) => r.test(rel, base));
|
|
34
|
+
if (rule) return { block: true, reason: `Blocked by kete-loom (protect-files): \`${rel}\` ${rule.reason}` };
|
|
35
|
+
}
|
|
36
|
+
return { block: false };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
module.exports = { check };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: protect-lint-config
|
|
3
|
+
description: Stops the agent from editing existing linter, formatter and type-checker configs, so it fixes the code that breaks a rule instead of weakening or switching off the rule.
|
|
4
|
+
license: MIT
|
|
5
|
+
metadata:
|
|
6
|
+
kete-loom/version: "0.1.0"
|
|
7
|
+
kete-loom/category: coding
|
|
8
|
+
kete-loom/risk: read-only
|
|
9
|
+
kete-loom/event: "pre-edit"
|
|
10
|
+
kete-loom/opt-in: "true"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Protect lint config
|
|
15
|
+
|
|
16
|
+
Runs before every file write or edit. It blocks changes to existing quality-gate configs:
|
|
17
|
+
|
|
18
|
+
| Tool | Files |
|
|
19
|
+
|---|---|
|
|
20
|
+
| ESLint | `.eslintrc*`, `eslint.config.*` |
|
|
21
|
+
| Biome, Prettier, Stylelint | `biome.json(c)`, `.prettierrc*`, `prettier.config.*`, `.stylelintrc*`, `stylelint.config.*` |
|
|
22
|
+
| Python | `ruff.toml`, `.ruff.toml`, `.flake8`, `.pylintrc`, `mypy.ini`, `.mypy.ini` |
|
|
23
|
+
| Go, Rust, Ruby, PHP | `.golangci.yml/.yaml/.toml`, `clippy.toml`, `.clippy.toml`, `rustfmt.toml`, `.rubocop.yml`, `phpstan.neon(.dist)` |
|
|
24
|
+
|
|
25
|
+
The agent is told to fix the code that breaks the rule instead. If you asked for the config change yourself, the agent says so, and you make the edit or turn this hook off.
|
|
26
|
+
|
|
27
|
+
Creating a config that doesn't exist yet is allowed, so setting up a new project still works. Settings inside `pyproject.toml` or `package.json` are not covered, because those files hold much more than lint settings.
|
|
28
|
+
|
|
29
|
+
Opt-in: `--hooks` leaves it out; install it by name with `--hook` or with `--profile strict`. Not available in Cursor, which has no documented hook before an edit.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_block": [
|
|
3
|
+
{ "cwd": "hooks/protect-lint-config/fixtures", "files": [{ "path": ".eslintrc.json", "content": "{\"rules\":{}}" }] },
|
|
4
|
+
{ "cwd": "hooks/protect-lint-config/fixtures", "files": [{ "path": "eslint.config.mjs", "content": "export default []" }] },
|
|
5
|
+
{ "cwd": "hooks/protect-lint-config/fixtures", "files": [{ "path": "biome.json", "content": "{}" }] },
|
|
6
|
+
{ "cwd": "hooks/protect-lint-config/fixtures", "files": [{ "path": ".prettierrc", "content": "{}" }] },
|
|
7
|
+
{ "cwd": "hooks/protect-lint-config/fixtures", "files": [{ "path": "ruff.toml", "content": "ignore = [\"E501\"]" }] },
|
|
8
|
+
{ "cwd": "hooks/protect-lint-config/fixtures", "files": [{ "path": ".golangci.yml", "content": "linters: {}" }] },
|
|
9
|
+
{ "cwd": "hooks/protect-lint-config/fixtures", "files": [{ "path": "src/a.ts", "content": "x" }, { "path": ".rubocop.yml", "content": "" }] }
|
|
10
|
+
],
|
|
11
|
+
"should_allow": [
|
|
12
|
+
{ "cwd": "hooks/protect-lint-config/fixtures", "files": [{ "path": "src/app.ts", "content": "x" }] },
|
|
13
|
+
{ "cwd": "hooks/protect-lint-config/fixtures", "files": [{ "path": "tsconfig.json", "content": "{}" }] },
|
|
14
|
+
{ "cwd": "hooks/protect-lint-config/fixtures", "files": [{ "path": ".stylelintrc.json", "content": "{}" }] },
|
|
15
|
+
{ "cwd": "hooks/protect-lint-config/fixtures", "files": [{ "path": "docs/eslint-rules.md", "content": "x" }] },
|
|
16
|
+
{ "cwd": "hooks/protect-lint-config/fixtures", "files": [{ "path": "pyproject.toml", "content": "[tool.ruff]" }] }
|
|
17
|
+
]
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Blocks edits to existing linter, formatter and type-checker configs, so the agent fixes the code
|
|
4
|
+
// instead of weakening the rule. New configs are allowed. check({ files: [{ path }], cwd }) -> verdict.
|
|
5
|
+
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
|
|
9
|
+
const CONFIG = /^(?:\.eslintrc(?:\.[a-z]+)?|eslint\.config\.[cm]?[jt]s|biome\.jsonc?|\.prettierrc(?:\.[a-z]+)?|prettier\.config\.[cm]?[jt]s|\.stylelintrc(?:\.[a-z]+)?|stylelint\.config\.[cm]?js|\.?ruff\.toml|\.flake8|\.pylintrc|\.?mypy\.ini|\.golangci\.(?:ya?ml|toml|json)|\.?clippy\.toml|\.?rustfmt\.toml|\.rubocop\.yml|phpstan\.neon(?:\.dist)?)$/;
|
|
10
|
+
|
|
11
|
+
function check(event) {
|
|
12
|
+
const cwd = event.cwd || process.cwd();
|
|
13
|
+
for (const f of event.files || []) {
|
|
14
|
+
if (!f || typeof f.path !== 'string') continue;
|
|
15
|
+
const base = path.basename(f.path);
|
|
16
|
+
if (!CONFIG.test(base) || !fs.existsSync(path.resolve(cwd, f.path))) continue;
|
|
17
|
+
return {
|
|
18
|
+
block: true,
|
|
19
|
+
reason: `Blocked by kete-loom (protect-lint-config): \`${f.path}\` configures a linter or formatter. Fix the code that breaks the rule instead of changing the rule. If the user asked for this config change, tell them this hook blocks it so they can make the edit themselves.`,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return { block: false };
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
module.exports = { check };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: read-before-edit
|
|
3
|
+
description: Stops the first edit of each existing file in a session and tells the agent to read the file and search for its callers first, so changes are grounded in the real code rather than a guess.
|
|
4
|
+
license: MIT
|
|
5
|
+
metadata:
|
|
6
|
+
kete-loom/version: "0.1.0"
|
|
7
|
+
kete-loom/category: coding
|
|
8
|
+
kete-loom/risk: writes-files
|
|
9
|
+
kete-loom/event: "pre-edit"
|
|
10
|
+
kete-loom/opt-in: "true"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Read before edit
|
|
15
|
+
|
|
16
|
+
Runs before every file write or edit. The first time in a session the agent tries to change a file that already exists, the edit is refused with this instruction:
|
|
17
|
+
|
|
18
|
+
1. Read the whole file.
|
|
19
|
+
2. Search the codebase for everything that imports, calls or configures it.
|
|
20
|
+
3. Then make the same edit again.
|
|
21
|
+
|
|
22
|
+
The retry goes through, and so does every later edit of that file in the session. New files are never blocked.
|
|
23
|
+
|
|
24
|
+
It remembers which files it has seen in `~/.kete-loom/state/read-before-edit.json` (set `KETE_LOOM_STATE_DIR` to move it). It keeps them per session when the host sends a session id, otherwise per project per day. Entries older than two days are dropped. It reads no file contents and never uses the network.
|
|
25
|
+
|
|
26
|
+
Expect one extra round trip per file. Opt-in: `--hooks` leaves it out; install it by name with `--hook` or with `--profile strict`. Not available in Cursor, which has no documented hook before an edit.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_block": [
|
|
3
|
+
{ "files": [{ "path": "package.json", "content": "{}" }] },
|
|
4
|
+
{ "files": [{ "path": "README.md", "content": "x" }] },
|
|
5
|
+
{ "files": [{ "path": "bin/kete-loom.js", "content": "x" }] },
|
|
6
|
+
{ "files": [{ "path": "scripts/lib/lint.js", "content": "x" }] },
|
|
7
|
+
{ "files": [{ "path": "brand-new-file.ts", "content": "x" }, { "path": "AGENTS.md", "content": "x" }] }
|
|
8
|
+
],
|
|
9
|
+
"should_allow": [
|
|
10
|
+
{ "files": [{ "path": "src/does-not-exist-yet.ts", "content": "x" }] },
|
|
11
|
+
{ "files": [{ "path": "notes/new-plan.md", "content": "x" }] },
|
|
12
|
+
{ "files": [{ "path": "package.json", "content": "{}" }] },
|
|
13
|
+
{ "files": [{ "path": "README.md", "content": "y" }] }
|
|
14
|
+
]
|
|
15
|
+
}
|