@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
package/rules/rust.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rust
|
|
3
|
+
description: Always-on rules for Rust files, covering cargo tooling, error handling, panics, unsafe code, async and dependency hygiene.
|
|
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/paths: "**/*.rs"
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
- Run `cargo fmt`, `cargo clippy --all-targets` and `cargo test` after a change. Fix clippy warnings instead of adding `#[allow]` without a reason.
|
|
14
|
+
- Return `Result` for recoverable failures and propagate with `?`. Add context to errors as they cross a boundary.
|
|
15
|
+
- Use the project's error approach (often `thiserror` for libraries, `anyhow` for applications); never return `Box<dyn Error>` or `String` errors from a public library API without reason.
|
|
16
|
+
- Never use `unwrap()` or `expect()` on input, I/O or anything that can fail at runtime outside tests. Use `expect("why this cannot fail")` only for true invariants.
|
|
17
|
+
- Avoid code that can panic on untrusted input: indexing with `[]`, slicing strings at byte offsets, and unchecked arithmetic (it panics in debug and wraps silently in release). Use `get`, `checked_*` or `saturating_*`.
|
|
18
|
+
- Write `unsafe` only when it is required, keep the block minimal, and add a `// SAFETY:` comment stating the invariant it relies on.
|
|
19
|
+
- Never hold a `std::sync::Mutex` guard across an `.await`; drop it first or use the async runtime's mutex.
|
|
20
|
+
- Never call blocking I/O or long CPU work directly in async code; use the runtime's blocking task facility (such as `spawn_blocking`).
|
|
21
|
+
- Never log or `Debug`-print secrets; implement `Debug` by hand for types that hold them.
|
|
22
|
+
- Use parameterized queries in database code; never build SQL with `format!`.
|
|
23
|
+
- Pass `std::process::Command` separate `.arg()` values; never run `sh -c` with a string built from input.
|
|
24
|
+
- Commit `Cargo.lock` (always for binaries; Cargo now recommends it for libraries too). Do not add a dependency for a few lines of code.
|
|
25
|
+
|
|
26
|
+
For more, load the rust-patterns and rust-testing skills.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: security
|
|
3
|
+
description: Always-on secure coding rules for any language, covering input validation, injection, authorization, least privilege, deserialisation, dependencies and keeping secrets and personal data out of logs.
|
|
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/owner: "Kete-org"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
- Treat all external input as untrusted: request data, headers, cookies, uploaded files, queue messages, LLM output and third-party API responses.
|
|
13
|
+
- Validate input at the trust boundary against an allowlist of type, length, range and format. Reject what fails; do not try to clean it up.
|
|
14
|
+
- Use parameterised queries or the ORM's bound parameters. Never build SQL, NoSQL or LDAP queries by string concatenation or formatting.
|
|
15
|
+
- Run external commands with an argument array and no shell. Never pass user input into a shell string, `eval` or dynamic code execution.
|
|
16
|
+
- Encode output for its context (HTML, attribute, URL, JS) and use the framework's auto-escaping; never mark untrusted data as safe.
|
|
17
|
+
- Resolve user-supplied file paths against a fixed base directory and reject any result outside it.
|
|
18
|
+
- Enforce authentication and authorization on the server for every request and every object accessed. Hidden UI or client checks are not access control.
|
|
19
|
+
- Grant least privilege: minimal scopes for tokens, database users, service accounts, CI jobs and file permissions.
|
|
20
|
+
- Never deserialise untrusted data with formats that can run code (`pickle`, Java native serialization, unsafe YAML loaders). Use JSON or a safe loader with a schema.
|
|
21
|
+
- Validate outbound URLs built from user input against an allowlist of hosts to prevent SSRF.
|
|
22
|
+
- Use the platform's vetted crypto and password-hashing libraries and a cryptographically secure random source for tokens. Never write your own crypto.
|
|
23
|
+
- Keep TLS certificate verification on. Never disable it to make a request work.
|
|
24
|
+
- Never log secrets, tokens, passwords, session IDs or personal data. Redact them in errors, traces and analytics too.
|
|
25
|
+
- Return generic error messages to clients; keep stack traces and internal details in server logs.
|
|
26
|
+
- Add dependencies only when needed, from the official registry, pinned through the lockfile. Check the name for typosquats and run the project's audit tool after changes.
|
|
27
|
+
- Default to secure configuration: deny by default, `Secure`, `HttpOnly` and `SameSite` on session cookies, CSRF protection on state-changing requests that use cookie auth, debug mode off in production.
|
|
28
|
+
|
|
29
|
+
For more, load the security-review skill.
|
package/rules/swift.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: swift
|
|
3
|
+
description: Always-on rules for Swift code, covering optionals, value types, error handling, Swift concurrency and actors, memory and retain cycles, and build and test checks.
|
|
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/paths: "**/*.swift"
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
- Never use `!`, `try!` or `as!` on values that can fail at runtime; use `guard let`, `if let`, `??`, `as?` or a thrown error.
|
|
14
|
+
- Avoid implicitly unwrapped optionals except for values a framework sets before first use, such as outlets.
|
|
15
|
+
- Prefer `let` over `var`, and `struct` or `enum` for data; use `class` when you need identity or shared mutable state.
|
|
16
|
+
- Switch over enums exhaustively; avoid `default` on enums you own so a new case is a compile error, and use `@unknown default` for non-frozen SDK enums.
|
|
17
|
+
- Throw specific, meaningful errors and handle them with `do`/`catch`; never discard them with `try?` where the failure matters.
|
|
18
|
+
- Use `async`/`await` and structured concurrency (`async let`, task groups) over completion handlers in new code.
|
|
19
|
+
- Protect shared mutable state with an `actor` or `@MainActor`; never mutate it from several tasks unguarded.
|
|
20
|
+
- Update UI only on the main actor.
|
|
21
|
+
- Make types that cross concurrency domains `Sendable`, and fix concurrency warnings; use `@unchecked Sendable` or `nonisolated(unsafe)` only when you add the synchronization yourself and say why in a comment.
|
|
22
|
+
- Check `Task.isCancelled` or call `try Task.checkCancellation()` in long-running work.
|
|
23
|
+
- Capture `self` weakly (`[weak self]`) in escaping closures stored by `self` or its children, to avoid retain cycles.
|
|
24
|
+
- Mark delegate properties `weak`.
|
|
25
|
+
- Never store secrets in `UserDefaults` or plain files; use the Keychain.
|
|
26
|
+
- Build and test with the project's configured tooling (`swift build` and `swift test` for packages, or the Xcode scheme), and use its configured formatter or linter.
|
|
27
|
+
|
|
28
|
+
For more, load the swift-patterns and swift-testing skills.
|
package/rules/testing.md
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: testing
|
|
3
|
+
description: Always-on rules for writing and running tests in any language, covering behaviour-focused tests, failing tests first for bugs, determinism, isolation, speed and running the suite before finishing.
|
|
4
|
+
license: MIT
|
|
5
|
+
metadata:
|
|
6
|
+
kete-loom/version: "0.1.0"
|
|
7
|
+
kete-loom/category: testing
|
|
8
|
+
kete-loom/risk: read-only
|
|
9
|
+
kete-loom/owner: "Kete-org"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
- Use the project's configured test framework, runner and file layout. Do not add a second one.
|
|
13
|
+
- Test behaviour through the public interface: inputs, outputs and observable effects. Do not assert on private methods or internal call order.
|
|
14
|
+
- For a bug, first write a test that reproduces it and watch it fail, then fix the code until it passes.
|
|
15
|
+
- Give each test one reason to fail and a name that says the expected behaviour.
|
|
16
|
+
- Cover edge cases and error paths, not just the happy path: empty, boundary, invalid and failing-dependency inputs.
|
|
17
|
+
- Make tests deterministic. Inject or fake the clock, seed any randomness and never depend on test order, wall-clock time or time zone.
|
|
18
|
+
- Never use fixed sleeps to wait. Wait on a condition with a timeout, or use fake timers.
|
|
19
|
+
- Keep tests isolated: each test sets up and tears down its own state, uses temporary directories and never relies on shared mutable globals.
|
|
20
|
+
- Never call the real network or third-party services in unit tests. Fake slow or nondeterministic boundaries (network, clock, external APIs); use real objects for the code under test.
|
|
21
|
+
- Keep unit tests fast; move slow integration and end-to-end tests to their own suite.
|
|
22
|
+
- A flaky test is a bug: find the cause instead of adding retries.
|
|
23
|
+
- Run the relevant tests after every change and the full suite before finishing.
|
|
24
|
+
|
|
25
|
+
For more, load the tdd-workflow skill and the testing skill for your language, such as python-testing or typescript-testing.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: typescript
|
|
3
|
+
description: Always-on rules for TypeScript and JavaScript files, covering type safety, untrusted input, async errors, modules and the project's own tooling.
|
|
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/paths: "**/*.ts, **/*.tsx, **/*.mts, **/*.cts, **/*.js, **/*.jsx, **/*.mjs, **/*.cjs"
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
- Use the project's package manager (the one its lockfile belongs to), formatter, linter and test runner. Never add a second lockfile.
|
|
14
|
+
- Run the project's type check (often `tsc --noEmit`) and lint after a change, not only the tests.
|
|
15
|
+
- Never weaken `tsconfig.json` or lint settings to make an error go away.
|
|
16
|
+
- Never silence the compiler with `any`, `as any`, `@ts-ignore` or a `!` non-null assertion. If a suppression is truly needed, use `@ts-expect-error` with a reason.
|
|
17
|
+
- Type values you have not checked as `unknown` and narrow them. Validate untrusted input (request bodies, `JSON.parse`, env vars, files) at the boundary with the project's schema library or a type guard.
|
|
18
|
+
- End a `switch` over a union with a `never` check so a new case fails to compile.
|
|
19
|
+
- Use `const` by default, `let` when reassigned, never `var`. Use `===` and `!==` (the project's `== null` idiom aside).
|
|
20
|
+
- Await or return every promise, or mark it with `void` and handle its rejection. Never leave a floating promise.
|
|
21
|
+
- Never pass an async function to `forEach`; use `for...of` with `await`, or `Promise.all` / `Promise.allSettled` over `map`.
|
|
22
|
+
- Catch errors as `unknown`, and throw `Error` objects, never strings. Pass the original as `{ cause }` when wrapping.
|
|
23
|
+
- Use `?.` and `??` for missing values; `||` also replaces `0`, `""` and `false`.
|
|
24
|
+
- Never build HTML, SQL, shell commands or file paths by string concatenation with user input. Use parameterized queries, `execFile`/`spawn` with an argument array, and the framework's escaping.
|
|
25
|
+
- Never use `eval`, `new Function` or `innerHTML` with untrusted data.
|
|
26
|
+
- Match the package's module system (`"type"` in `package.json`, `.mjs`/`.cjs`); never mix `require` and `import` in one file.
|
|
27
|
+
- Never put secrets in client code or in env vars the framework exposes to the browser (such as `NEXT_PUBLIC_` or `VITE_`).
|
|
28
|
+
|
|
29
|
+
For more, load the typescript-patterns and typescript-testing skills.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: use-skills
|
|
3
|
+
description: Always-on rule to check for an installed skill, agent or command that fits a task before starting it, say which one is used, and follow its steps rather than working from memory.
|
|
4
|
+
license: MIT
|
|
5
|
+
metadata:
|
|
6
|
+
kete-loom/version: "0.1.0"
|
|
7
|
+
kete-loom/category: meta
|
|
8
|
+
kete-loom/risk: read-only
|
|
9
|
+
kete-loom/owner: "Kete-org"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
- Before starting a task, including a clarifying question or a quick look at the code, check whether an installed skill, agent or command covers it. Check again when the task changes.
|
|
13
|
+
- If one fits even partly, load it and tell the user in one line which one you are using and why.
|
|
14
|
+
- Prefer the most specific match: a framework skill over a language skill, a language reviewer over a general one.
|
|
15
|
+
- Process skills (brainstorming, debugging, test-first, planning) come before implementation skills; they decide how the work is done.
|
|
16
|
+
- Follow a loaded skill's steps in order. Do not skip a step because you remember the gist or the task looks simple.
|
|
17
|
+
- Where a skill has a checklist, work through every item and report each one.
|
|
18
|
+
- Treat a skill's "stop and ask" points as real stops; do not guess past them.
|
|
19
|
+
- Read a skill's `references/` files when its steps tell you to, not from memory of similar files.
|
|
20
|
+
- Delegate to an agent when its description matches and its separate context helps (reviews, wide searches, build fixes).
|
|
21
|
+
- If no skill fits, say so briefly and work normally; do not force a poor match.
|
|
22
|
+
- The user's explicit instructions win over any skill. When they conflict, follow the user and mention the conflict once.
|
|
23
|
+
- Never claim to have followed a skill you did not load.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://ketecode.ai/schemas/kete-loom/skill-frontmatter.schema.json",
|
|
4
|
+
"title": "Kete Loom SKILL.md frontmatter",
|
|
5
|
+
"description": "The strictest common subset of the Agent Skills spec (agentskills.io) as read by Claude Code, Codex, OpenCode, Cursor, Gemini CLI and GitHub Copilot, plus Kete Loom's metadata keys. Extra keys live under `metadata` as strings, because OpenCode requires metadata to be a string-to-string map.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["name", "description", "license", "metadata"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"name": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
|
|
13
|
+
"minLength": 1,
|
|
14
|
+
"maxLength": 64,
|
|
15
|
+
"description": "Must equal the skill's folder name."
|
|
16
|
+
},
|
|
17
|
+
"description": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"minLength": 80,
|
|
20
|
+
"maxLength": 1024,
|
|
21
|
+
"description": "Single line. Says what the skill does AND when to use it (contains 'Use when')."
|
|
22
|
+
},
|
|
23
|
+
"license": { "type": "string" },
|
|
24
|
+
"compatibility": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"maxLength": 500,
|
|
27
|
+
"description": "Plain-language environment requirements (tools, network, OS)."
|
|
28
|
+
},
|
|
29
|
+
"metadata": {
|
|
30
|
+
"type": "object",
|
|
31
|
+
"additionalProperties": { "type": "string" },
|
|
32
|
+
"required": ["kete-loom/version", "kete-loom/category", "kete-loom/risk"],
|
|
33
|
+
"properties": {
|
|
34
|
+
"kete-loom/version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" },
|
|
35
|
+
"kete-loom/category": {
|
|
36
|
+
"type": "string",
|
|
37
|
+
"enum": ["coding", "testing", "security", "integrations", "devops", "data", "ai", "docs", "business", "compliance", "meta"]
|
|
38
|
+
},
|
|
39
|
+
"kete-loom/risk": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"enum": ["read-only", "writes-files", "runs-commands", "network"],
|
|
42
|
+
"description": "Highest-impact action the skill instructs the agent to take."
|
|
43
|
+
},
|
|
44
|
+
"kete-loom/requires": {
|
|
45
|
+
"type": "string",
|
|
46
|
+
"description": "Comma-separated CLIs or runtimes the skill expects, e.g. 'git, node'."
|
|
47
|
+
},
|
|
48
|
+
"kete-loom/owner": { "type": "string" }
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// `kete-loom audit`: a deterministic readiness scorecard for working on a project with coding agents.
|
|
4
|
+
// Same input, same result: it reads files and runs read-only git commands, never a model.
|
|
5
|
+
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const { execFileSync } = require('child_process');
|
|
9
|
+
const { detect } = require('./profiles');
|
|
10
|
+
const { inventory } = require('./inventory');
|
|
11
|
+
|
|
12
|
+
const CODEX_MAX_BYTES = 32768;
|
|
13
|
+
const DETECT_CHECKS = path.join(__dirname, '..', '..', 'skills', 'verification-loop', 'scripts', 'detect-checks.js');
|
|
14
|
+
|
|
15
|
+
const git = (cwd, args) => {
|
|
16
|
+
try {
|
|
17
|
+
return execFileSync('git', args, { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], timeout: 5000 }).trim();
|
|
18
|
+
} catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
function audit({ cwd = process.cwd(), home, catalog }) {
|
|
24
|
+
const checks = [];
|
|
25
|
+
const add = (id, status, title, detail, fix) => checks.push({ id, status, title, detail, ...(fix ? { fix } : {}) });
|
|
26
|
+
const root = git(cwd, ['rev-parse', '--show-toplevel']) || cwd;
|
|
27
|
+
const has = (f) => fs.existsSync(path.join(root, f));
|
|
28
|
+
|
|
29
|
+
if (git(cwd, ['rev-parse', '--is-inside-work-tree']) === 'true') add('git', 'pass', 'Git repository', 'Agents can see history, diffs and status.');
|
|
30
|
+
else add('git', 'warn', 'Git repository', 'This folder is not a git repository, so agents can\'t diff, review or roll back their changes.', 'git init');
|
|
31
|
+
|
|
32
|
+
const instr = ['AGENTS.md', 'CLAUDE.md'].filter(has);
|
|
33
|
+
if (!instr.length) add('instructions', 'fail', 'Agent instructions', 'No AGENTS.md or CLAUDE.md: every agent starts without your build commands, conventions or boundaries.', 'Write AGENTS.md (the /project-init command or the codebase-onboarding skill can draft it)');
|
|
34
|
+
else {
|
|
35
|
+
const big = instr.filter((f) => fs.statSync(path.join(root, f)).size > CODEX_MAX_BYTES);
|
|
36
|
+
if (big.length) add('instructions', 'warn', 'Agent instructions', `${big.join(', ')} is over 32 KiB; Codex stops reading there and every host pays for it on every turn.`, 'Move detail into skills, rules or linked docs');
|
|
37
|
+
else add('instructions', 'pass', 'Agent instructions', `${instr.join(' and ')} present.`);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const found = detect(root);
|
|
41
|
+
const installedRows = [...inventory({ scope: 'user', home, cwd: root }), ...inventory({ scope: 'project', home, cwd: root })];
|
|
42
|
+
const installedNames = new Set(installedRows.map((r) => r.name));
|
|
43
|
+
if (!found.length) add('packs', 'pass', 'Packs for this stack', 'No language or framework detected that Kete Loom has a pack for.');
|
|
44
|
+
else {
|
|
45
|
+
const want = [...new Set(found.flatMap((d) => [...(d.skills || []), ...(d.agents || []), ...(d.rules || [])]))].filter((n) => ['skills', 'agents', 'rules'].some((k) => (catalog[k] || []).some((i) => i.dir === n)));
|
|
46
|
+
const missing = want.filter((n) => !installedNames.has(n));
|
|
47
|
+
const stack = found.map((d) => d.what).join(', ');
|
|
48
|
+
if (!missing.length) add('packs', 'pass', 'Packs for this stack', `Installed for ${stack}.`);
|
|
49
|
+
else add('packs', missing.length === want.length ? 'fail' : 'warn', 'Packs for this stack', `Detected ${stack}; missing ${missing.length} of ${want.length}: ${missing.slice(0, 8).join(', ')}${missing.length > 8 ? '…' : ''}.`, 'npx @ketecode/loom install --profile core (run it in this project)');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
let commands = [];
|
|
53
|
+
try {
|
|
54
|
+
commands = JSON.parse(execFileSync(process.execPath, [DETECT_CHECKS, root], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], timeout: 10000 })).checks || [];
|
|
55
|
+
} catch (e) {
|
|
56
|
+
// detect-checks exits 3 when it finds nothing; its JSON is still on stdout.
|
|
57
|
+
try {
|
|
58
|
+
commands = JSON.parse(e.stdout || '{}').checks || [];
|
|
59
|
+
} catch {
|
|
60
|
+
commands = [];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const kinds = new Set(commands.map((c) => c.kind));
|
|
64
|
+
if (!kinds.has('test')) add('verification', 'fail', 'Verification commands', 'No test command found, so agents can\'t prove a change works.', 'Add a test script (package.json "test", Makefile "test", pytest config…) and name it in AGENTS.md');
|
|
65
|
+
else if (!kinds.has('lint') && !kinds.has('typecheck')) add('verification', 'warn', 'Verification commands', `Tests found (${commands.find((c) => c.kind === 'test').command}), but no lint or type-check command.`, 'Add a lint or type-check script so agents catch mistakes before tests');
|
|
66
|
+
else add('verification', 'pass', 'Verification commands', commands.map((c) => c.command).join(', '));
|
|
67
|
+
|
|
68
|
+
const ci = ['.github/workflows', '.gitlab-ci.yml', '.circleci', 'azure-pipelines.yml', 'bitbucket-pipelines.yml', 'Jenkinsfile', '.buildkite'].filter(has);
|
|
69
|
+
if (ci.length) add('ci', 'pass', 'Continuous integration', `${ci.join(', ')}.`);
|
|
70
|
+
else add('ci', 'warn', 'Continuous integration', 'No CI configuration found, so nothing re-checks what agents push.', 'Add CI that runs the same build, lint and test commands (the github-actions-ci skill can set it up)');
|
|
71
|
+
|
|
72
|
+
const hooks = new Set(installedRows.filter((r) => r.kind === 'hooks').map((r) => r.name));
|
|
73
|
+
const safety = ['block-dangerous-commands', 'guard-secrets'];
|
|
74
|
+
const missingHooks = safety.filter((h) => !hooks.has(h));
|
|
75
|
+
if (!missingHooks.length) add('hooks', 'pass', 'Safety hooks', `${safety.join(' and ')} are installed.`);
|
|
76
|
+
else add('hooks', 'warn', 'Safety hooks', `Not installed: ${missingHooks.join(', ')}. Nothing stops an agent from running rm -rf ~ or writing a key into a file.`, `npx @ketecode/loom install --hook ${missingHooks.join(',')}`);
|
|
77
|
+
|
|
78
|
+
const tracked = (git(root, ['ls-files']) || '').split('\n').filter((f) => /(^|\/)\.env(\.[^/]*)?$/.test(f) && !/\.(example|sample|template|dist|defaults)$/.test(f));
|
|
79
|
+
const ignore = has('.gitignore') ? fs.readFileSync(path.join(root, '.gitignore'), 'utf8') : '';
|
|
80
|
+
if (tracked.length) add('secrets', 'fail', 'Secrets', `Committed environment files: ${tracked.join(', ')}. Anything in them is in git history.`, 'git rm --cached the files, add .env* to .gitignore, and rotate every secret they held');
|
|
81
|
+
else if (!/^\s*\/?\.env\*?\s*$|^\s*\.\*\s*$|^\s*\*\.env\s*$/m.test(ignore)) add('secrets', 'warn', 'Secrets', '.gitignore does not ignore .env files, so the next one created can be committed by accident.', 'Add .env and .env.* to .gitignore (keep .env.example tracked)');
|
|
82
|
+
else add('secrets', 'pass', 'Secrets', 'No environment files committed, and .gitignore covers them.');
|
|
83
|
+
|
|
84
|
+
if (has('package.json')) {
|
|
85
|
+
const locks = ['package-lock.json', 'pnpm-lock.yaml', 'yarn.lock', 'bun.lock', 'bun.lockb', 'npm-shrinkwrap.json'].filter(has);
|
|
86
|
+
if (locks.length) add('lockfile', 'pass', 'Dependency lockfile', locks.join(', '));
|
|
87
|
+
else add('lockfile', 'warn', 'Dependency lockfile', 'package.json without a lockfile: agents and CI can resolve different dependency versions.', 'Run your package manager\'s install and commit the lockfile');
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const weight = { pass: 1, warn: 0.5, fail: 0 };
|
|
91
|
+
const score = Math.round((checks.reduce((n, c) => n + weight[c.status], 0) / checks.length) * 100);
|
|
92
|
+
const order = { fail: 0, warn: 1, pass: 2 };
|
|
93
|
+
return { root, score, checks: checks.sort((a, b) => order[a.status] - order[b.status]) };
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
module.exports = { audit };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Behaviour evals: evals/behavior.json in a skill or agent folder. Each scenario is a user request
|
|
4
|
+
// (often with pressure to skip the item's discipline), optional files the agent can see, and what the
|
|
5
|
+
// reply must and must not show. scripts/run-behavior-evals.js runs them with and without the item.
|
|
6
|
+
|
|
7
|
+
const fs = require('fs');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
|
|
10
|
+
const PRESSURES = ['time', 'sunk-cost', 'authority', 'exhaustion', 'social', 'pragmatism', 'small-scope'];
|
|
11
|
+
const MIN_SCENARIOS = 2;
|
|
12
|
+
|
|
13
|
+
const behaviorFile = (item) => path.join(item.path, 'evals', 'behavior.json');
|
|
14
|
+
|
|
15
|
+
// Returns null when the item has no behavior.json, else { scenarios, problems }.
|
|
16
|
+
function loadBehavior(item) {
|
|
17
|
+
const file = behaviorFile(item);
|
|
18
|
+
if (!fs.existsSync(file)) return null;
|
|
19
|
+
let data;
|
|
20
|
+
try {
|
|
21
|
+
data = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
22
|
+
} catch (e) {
|
|
23
|
+
return { scenarios: [], problems: [`evals/behavior.json is not valid JSON: ${e.message}`] };
|
|
24
|
+
}
|
|
25
|
+
return { scenarios: Array.isArray(data.scenarios) ? data.scenarios : [], problems: validate(data) };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function validate(data) {
|
|
29
|
+
const problems = [];
|
|
30
|
+
const list = data && Array.isArray(data.scenarios) ? data.scenarios : null;
|
|
31
|
+
if (!list) return ['evals/behavior.json needs a "scenarios" array'];
|
|
32
|
+
if (list.length < MIN_SCENARIOS) problems.push(`evals/behavior.json needs at least ${MIN_SCENARIOS} scenarios`);
|
|
33
|
+
const names = new Set();
|
|
34
|
+
list.forEach((s, i) => {
|
|
35
|
+
const at = `scenario ${i + 1}${s && typeof s.name === 'string' ? ` "${s.name}"` : ''}`;
|
|
36
|
+
if (!s || typeof s !== 'object') return problems.push(`${at} is not an object`);
|
|
37
|
+
if (typeof s.name !== 'string' || !s.name.trim()) problems.push(`${at} needs a name`);
|
|
38
|
+
else if (names.has(s.name)) problems.push(`${at}: duplicate name`);
|
|
39
|
+
else names.add(s.name);
|
|
40
|
+
if (typeof s.prompt !== 'string' || s.prompt.trim().length < 20) problems.push(`${at}: prompt must be at least 20 characters`);
|
|
41
|
+
const strings = (v) => Array.isArray(v) && v.every((x) => typeof x === 'string' && x.trim().length >= 10);
|
|
42
|
+
if (!strings(s.expect) || !s.expect.length) problems.push(`${at}: "expect" must be a non-empty list of criteria (10+ characters each)`);
|
|
43
|
+
if (s.forbid !== undefined && !strings(s.forbid)) problems.push(`${at}: "forbid" must be a list of criteria (10+ characters each)`);
|
|
44
|
+
if (s.pressure !== undefined && (!Array.isArray(s.pressure) || s.pressure.some((p) => !PRESSURES.includes(p)))) problems.push(`${at}: "pressure" values must be from ${PRESSURES.join(', ')}`);
|
|
45
|
+
if (s.files !== undefined && (typeof s.files !== 'object' || Array.isArray(s.files) || Object.entries(s.files).some(([k, v]) => typeof v !== 'string' || path.isAbsolute(k) || k.split(/[\\/]/).includes('..')))) {
|
|
46
|
+
problems.push(`${at}: "files" maps relative paths to file contents`);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
return problems;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
module.exports = { loadBehavior, validate, behaviorFile, PRESSURES, MIN_SCENARIOS };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Minimal parser for the frontmatter subset Kete Loom allows:
|
|
4
|
+
// key: value (plain or quoted scalar, single line)
|
|
5
|
+
// metadata: (one nested level of key: "string" pairs)
|
|
6
|
+
// Anything else (folded scalars, lists, deeper nesting) is reported as an
|
|
7
|
+
// error, because not every host parses full YAML the same way.
|
|
8
|
+
|
|
9
|
+
// A value that opens with a quote must close with the same one (`"git"\n key: x` is a broken line, not a string).
|
|
10
|
+
const brokenQuote = (raw) => {
|
|
11
|
+
const v = raw.trim();
|
|
12
|
+
if (v.startsWith('"')) return !/^"(?:[^"\\]|\\.)*"\s*(?:#.*)?$/.test(v);
|
|
13
|
+
if (v.startsWith("'")) return !/^'(?:[^']|'')*'\s*(?:#.*)?$/.test(v);
|
|
14
|
+
return false;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
function unquote(raw) {
|
|
18
|
+
const v = raw.trim();
|
|
19
|
+
if ((v.startsWith('"') && v.endsWith('"')) || (v.startsWith("'") && v.endsWith("'"))) {
|
|
20
|
+
return { value: v.slice(1, -1), quoted: true };
|
|
21
|
+
}
|
|
22
|
+
return { value: v, quoted: false };
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function parseFrontmatter(text) {
|
|
26
|
+
const errors = [];
|
|
27
|
+
const match = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/.exec(text);
|
|
28
|
+
if (!match) {
|
|
29
|
+
return { data: null, body: text, errors: ['missing frontmatter block (--- ... ---) at top of file'] };
|
|
30
|
+
}
|
|
31
|
+
const data = {};
|
|
32
|
+
let current = null;
|
|
33
|
+
const lines = match[1].split(/\r?\n/);
|
|
34
|
+
lines.forEach((line, i) => {
|
|
35
|
+
if (!line.trim() || line.trim().startsWith('#')) return;
|
|
36
|
+
const nested = /^ {2}([^\s:][^:]*):\s*(.*)$/.exec(line);
|
|
37
|
+
const top = /^([A-Za-z0-9_-]+):\s*(.*)$/.exec(line);
|
|
38
|
+
if (top) {
|
|
39
|
+
const [, key, rest] = top;
|
|
40
|
+
if (rest === '') {
|
|
41
|
+
data[key] = {};
|
|
42
|
+
current = key;
|
|
43
|
+
} else {
|
|
44
|
+
if (/^[>|]/.test(rest.trim())) {
|
|
45
|
+
errors.push(`line ${i + 2}: "${key}" uses a multi-line YAML scalar; keep it on one line`);
|
|
46
|
+
}
|
|
47
|
+
if (rest.trim().startsWith('[') || rest.trim().startsWith('{')) {
|
|
48
|
+
errors.push(`line ${i + 2}: "${key}" uses an inline list/map; only plain strings are portable`);
|
|
49
|
+
}
|
|
50
|
+
if (brokenQuote(rest)) errors.push(`line ${i + 2}: "${key}" has an unclosed or mismatched quote`);
|
|
51
|
+
data[key] = unquote(rest).value;
|
|
52
|
+
current = null;
|
|
53
|
+
}
|
|
54
|
+
} else if (nested && current) {
|
|
55
|
+
const [, key, rest] = nested;
|
|
56
|
+
if (brokenQuote(rest)) errors.push(`line ${i + 2}: "${key.trim()}" has an unclosed or mismatched quote`);
|
|
57
|
+
data[current][key.trim()] = unquote(rest).value;
|
|
58
|
+
} else {
|
|
59
|
+
errors.push(`line ${i + 2}: unsupported frontmatter syntax: ${line.trim()}`);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
return { data, body: text.slice(match[0].length), errors };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
module.exports = { parseFrontmatter };
|