@ketecode/loom 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +516 -2
- package/agents/accessibility-reviewer/AGENT.md +70 -0
- package/agents/accessibility-reviewer/evals/triggers.json +15 -0
- package/agents/agent-evaluator/AGENT.md +74 -0
- package/agents/agent-evaluator/evals/triggers.json +15 -0
- package/agents/architect/AGENT.md +82 -0
- package/agents/architect/evals/triggers.json +17 -0
- package/agents/billing-reviewer/AGENT.md +68 -0
- package/agents/billing-reviewer/evals/triggers.json +16 -0
- package/agents/code-reviewer/AGENT.md +51 -0
- package/agents/code-reviewer/evals/triggers.json +14 -0
- package/agents/code-simplifier/AGENT.md +74 -0
- package/agents/code-simplifier/evals/triggers.json +15 -0
- package/agents/cpp-build-resolver/AGENT.md +73 -0
- package/agents/cpp-build-resolver/evals/triggers.json +16 -0
- package/agents/cpp-reviewer/AGENT.md +59 -0
- package/agents/cpp-reviewer/evals/triggers.json +16 -0
- package/agents/csharp-build-resolver/AGENT.md +84 -0
- package/agents/csharp-build-resolver/evals/triggers.json +17 -0
- package/agents/csharp-reviewer/AGENT.md +88 -0
- package/agents/csharp-reviewer/evals/triggers.json +17 -0
- package/agents/dart-build-resolver/AGENT.md +80 -0
- package/agents/dart-build-resolver/evals/triggers.json +17 -0
- package/agents/dart-reviewer/AGENT.md +66 -0
- package/agents/dart-reviewer/evals/triggers.json +17 -0
- package/agents/database-reviewer/AGENT.md +72 -0
- package/agents/database-reviewer/evals/triggers.json +16 -0
- package/agents/django-reviewer/AGENT.md +61 -0
- package/agents/django-reviewer/evals/triggers.json +15 -0
- package/agents/doc-updater/AGENT.md +92 -0
- package/agents/doc-updater/evals/triggers.json +14 -0
- package/agents/e2e-runner/AGENT.md +88 -0
- package/agents/e2e-runner/evals/triggers.json +16 -0
- package/agents/fastapi-reviewer/AGENT.md +63 -0
- package/agents/fastapi-reviewer/evals/triggers.json +15 -0
- package/agents/flutter-reviewer/AGENT.md +70 -0
- package/agents/flutter-reviewer/evals/triggers.json +15 -0
- package/agents/fsharp-build-resolver/AGENT.md +81 -0
- package/agents/fsharp-build-resolver/evals/triggers.json +15 -0
- package/agents/fsharp-reviewer/AGENT.md +77 -0
- package/agents/fsharp-reviewer/evals/triggers.json +15 -0
- package/agents/go-build-resolver/AGENT.md +85 -0
- package/agents/go-build-resolver/evals/triggers.json +16 -0
- package/agents/go-reviewer/AGENT.md +66 -0
- package/agents/go-reviewer/evals/triggers.json +16 -0
- package/agents/healthcare-reviewer/AGENT.md +65 -0
- package/agents/healthcare-reviewer/evals/triggers.json +16 -0
- package/agents/i18n-reviewer/AGENT.md +64 -0
- package/agents/i18n-reviewer/evals/triggers.json +16 -0
- package/agents/infra-reviewer/AGENT.md +93 -0
- package/agents/infra-reviewer/evals/triggers.json +15 -0
- package/agents/java-build-resolver/AGENT.md +82 -0
- package/agents/java-build-resolver/evals/triggers.json +16 -0
- package/agents/java-reviewer/AGENT.md +64 -0
- package/agents/java-reviewer/evals/triggers.json +16 -0
- package/agents/kotlin-build-resolver/AGENT.md +89 -0
- package/agents/kotlin-build-resolver/evals/triggers.json +16 -0
- package/agents/kotlin-reviewer/AGENT.md +75 -0
- package/agents/kotlin-reviewer/evals/triggers.json +16 -0
- package/agents/mle-reviewer/AGENT.md +68 -0
- package/agents/mle-reviewer/evals/triggers.json +16 -0
- package/agents/network-config-reviewer/AGENT.md +68 -0
- package/agents/network-config-reviewer/evals/triggers.json +17 -0
- package/agents/payments-reviewer/AGENT.md +64 -0
- package/agents/payments-reviewer/evals/triggers.json +16 -0
- package/agents/performance-optimizer/AGENT.md +86 -0
- package/agents/performance-optimizer/evals/triggers.json +16 -0
- package/agents/perl-build-resolver/AGENT.md +84 -0
- package/agents/perl-build-resolver/evals/triggers.json +15 -0
- package/agents/perl-reviewer/AGENT.md +77 -0
- package/agents/perl-reviewer/evals/triggers.json +15 -0
- package/agents/php-build-resolver/AGENT.md +88 -0
- package/agents/php-build-resolver/evals/triggers.json +16 -0
- package/agents/php-reviewer/AGENT.md +61 -0
- package/agents/php-reviewer/evals/triggers.json +15 -0
- package/agents/planner/AGENT.md +75 -0
- package/agents/planner/evals/triggers.json +17 -0
- package/agents/pr-test-analyzer/AGENT.md +82 -0
- package/agents/pr-test-analyzer/evals/triggers.json +16 -0
- package/agents/python-build-resolver/AGENT.md +87 -0
- package/agents/python-build-resolver/evals/triggers.json +16 -0
- package/agents/python-reviewer/AGENT.md +63 -0
- package/agents/python-reviewer/evals/triggers.json +15 -0
- package/agents/rag-reviewer/AGENT.md +71 -0
- package/agents/rag-reviewer/evals/triggers.json +16 -0
- package/agents/react-reviewer/AGENT.md +70 -0
- package/agents/react-reviewer/evals/triggers.json +16 -0
- package/agents/refactor-cleaner/AGENT.md +82 -0
- package/agents/refactor-cleaner/evals/triggers.json +16 -0
- package/agents/ruby-build-resolver/AGENT.md +93 -0
- package/agents/ruby-build-resolver/evals/triggers.json +16 -0
- package/agents/ruby-reviewer/AGENT.md +62 -0
- package/agents/ruby-reviewer/evals/triggers.json +16 -0
- package/agents/rust-build-resolver/AGENT.md +98 -0
- package/agents/rust-build-resolver/evals/triggers.json +16 -0
- package/agents/rust-reviewer/AGENT.md +78 -0
- package/agents/rust-reviewer/evals/triggers.json +15 -0
- package/agents/security-reviewer/AGENT.md +84 -0
- package/agents/security-reviewer/evals/triggers.json +16 -0
- package/agents/silent-failure-hunter/AGENT.md +66 -0
- package/agents/silent-failure-hunter/evals/triggers.json +16 -0
- package/agents/solidity-reviewer/AGENT.md +70 -0
- package/agents/solidity-reviewer/evals/triggers.json +16 -0
- package/agents/swift-build-resolver/AGENT.md +85 -0
- package/agents/swift-build-resolver/evals/triggers.json +15 -0
- package/agents/swift-reviewer/AGENT.md +75 -0
- package/agents/swift-reviewer/evals/triggers.json +15 -0
- package/agents/typescript-build-resolver/AGENT.md +76 -0
- package/agents/typescript-build-resolver/evals/triggers.json +15 -0
- package/agents/typescript-reviewer/AGENT.md +76 -0
- package/agents/typescript-reviewer/evals/triggers.json +15 -0
- package/agents/vue-reviewer/AGENT.md +75 -0
- package/agents/vue-reviewer/evals/triggers.json +15 -0
- package/bin/kete-loom.js +683 -0
- package/commands/aside.md +19 -0
- package/commands/build-fix.md +26 -0
- package/commands/campaign.md +19 -0
- package/commands/changelog.md +36 -0
- package/commands/checkpoint.md +26 -0
- package/commands/codemap.md +25 -0
- package/commands/commit.md +26 -0
- package/commands/deps-audit.md +32 -0
- package/commands/epic-decompose.md +21 -0
- package/commands/explain.md +37 -0
- package/commands/feature-dev.md +22 -0
- package/commands/hookify.md +23 -0
- package/commands/i18n-check.md +39 -0
- package/commands/issue-sync.md +22 -0
- package/commands/jira.md +19 -0
- package/commands/learn.md +23 -0
- package/commands/loom.md +21 -0
- package/commands/loop.md +20 -0
- package/commands/model-route.md +27 -0
- package/commands/onboard.md +35 -0
- package/commands/orchestrate.md +21 -0
- package/commands/plan-feature.md +36 -0
- package/commands/postmortem.md +42 -0
- package/commands/pr-describe.md +39 -0
- package/commands/pr.md +22 -0
- package/commands/prd.md +41 -0
- package/commands/project-init.md +21 -0
- package/commands/refactor-clean.md +24 -0
- package/commands/resume-session.md +22 -0
- package/commands/review.md +35 -0
- package/commands/save-session.md +37 -0
- package/commands/security-scan.md +32 -0
- package/commands/sessions.md +21 -0
- package/commands/skill-create.md +21 -0
- package/commands/tdd.md +36 -0
- package/commands/test-coverage.md +24 -0
- package/commands/threat-model.md +36 -0
- package/commands/update-docs.md +25 -0
- package/commands/verify.md +21 -0
- package/hooks/block-dangerous-commands/HOOK.md +30 -0
- package/hooks/block-dangerous-commands/cases.json +50 -0
- package/hooks/block-dangerous-commands/hook.js +75 -0
- package/hooks/block-no-verify/HOOK.md +25 -0
- package/hooks/block-no-verify/cases.json +30 -0
- package/hooks/block-no-verify/hook.js +43 -0
- package/hooks/format-on-edit/HOOK.md +24 -0
- package/hooks/format-on-edit/hook.js +89 -0
- package/hooks/guard-secrets/HOOK.md +19 -0
- package/hooks/guard-secrets/cases.json +110 -0
- package/hooks/guard-secrets/hook.js +44 -0
- package/hooks/load-session-context/HOOK.md +20 -0
- package/hooks/load-session-context/hook.js +56 -0
- package/hooks/protect-files/HOOK.md +24 -0
- package/hooks/protect-files/cases.json +27 -0
- package/hooks/protect-files/hook.js +39 -0
- package/hooks/run.js +132 -0
- package/mcp/atlassian.json +11 -0
- package/mcp/chrome-devtools.json +18 -0
- package/mcp/cloudflare.json +11 -0
- package/mcp/context7.json +11 -0
- package/mcp/fetch.json +17 -0
- package/mcp/figma.json +11 -0
- package/mcp/git.json +17 -0
- package/mcp/github.json +11 -0
- package/mcp/linear.json +11 -0
- package/mcp/memory.json +18 -0
- package/mcp/notion.json +11 -0
- package/mcp/playwright.json +18 -0
- package/mcp/sentry.json +11 -0
- package/mcp/stripe.json +11 -0
- package/mcp/supabase.json +11 -0
- package/mcp/time.json +17 -0
- package/package.json +59 -4
- package/profiles.json +165 -0
- package/rules/common.md +21 -0
- package/rules/cpp.md +29 -0
- package/rules/csharp.md +25 -0
- package/rules/dart.md +29 -0
- package/rules/fsharp.md +28 -0
- package/rules/git.md +26 -0
- package/rules/go.md +29 -0
- package/rules/java.md +29 -0
- package/rules/kotlin.md +27 -0
- package/rules/perl.md +26 -0
- package/rules/php.md +28 -0
- package/rules/python.md +30 -0
- package/rules/ruby.md +27 -0
- package/rules/rust.md +26 -0
- package/rules/security.md +29 -0
- package/rules/swift.md +28 -0
- package/rules/testing.md +25 -0
- package/rules/typescript.md +29 -0
- package/schemas/skill-frontmatter.schema.json +52 -0
- package/scripts/lib/audit.js +96 -0
- package/scripts/lib/frontmatter.js +65 -0
- package/scripts/lib/hooks-install.js +292 -0
- package/scripts/lib/i18n.js +51 -0
- package/scripts/lib/inventory.js +85 -0
- package/scripts/lib/lint.js +158 -0
- package/scripts/lib/mcp-install.js +284 -0
- package/scripts/lib/profiles.js +128 -0
- package/scripts/lib/render.js +86 -0
- package/scripts/lib/rules-install.js +118 -0
- package/scripts/lib/skills.js +86 -0
- package/scripts/lib/targets.js +113 -0
- package/skills/accounting-api-integration/SKILL.md +81 -0
- package/skills/accounting-api-integration/evals/triggers.json +17 -0
- package/skills/accounting-api-integration/references/quickbooks.md +48 -0
- package/skills/accounting-api-integration/references/xero.md +45 -0
- package/skills/agent-harness-design/SKILL.md +125 -0
- package/skills/agent-harness-design/evals/triggers.json +21 -0
- package/skills/ai-media-generation/SKILL.md +89 -0
- package/skills/ai-media-generation/evals/triggers.json +16 -0
- package/skills/ai-media-generation/references/job-pipeline.md +76 -0
- package/skills/angular-patterns/SKILL.md +122 -0
- package/skills/angular-patterns/evals/triggers.json +16 -0
- package/skills/api-design/SKILL.md +96 -0
- package/skills/api-design/evals/triggers.json +18 -0
- package/skills/api-design/references/conventions.md +133 -0
- package/skills/architecture-decision-records/SKILL.md +98 -0
- package/skills/architecture-decision-records/evals/triggers.json +17 -0
- package/skills/article-writing/SKILL.md +108 -0
- package/skills/article-writing/evals/triggers.json +16 -0
- package/skills/aspnet-core-patterns/SKILL.md +149 -0
- package/skills/aspnet-core-patterns/evals/triggers.json +16 -0
- package/skills/auth-patterns/SKILL.md +104 -0
- package/skills/auth-patterns/evals/triggers.json +17 -0
- package/skills/auth-patterns/references/oauth-oidc.md +64 -0
- package/skills/autonomous-loops/SKILL.md +99 -0
- package/skills/autonomous-loops/evals/triggers.json +14 -0
- package/skills/aws-patterns/SKILL.md +91 -0
- package/skills/aws-patterns/evals/triggers.json +16 -0
- package/skills/azure-patterns/SKILL.md +86 -0
- package/skills/azure-patterns/evals/triggers.json +16 -0
- package/skills/benchmark-methodology/SKILL.md +88 -0
- package/skills/benchmark-methodology/evals/triggers.json +16 -0
- package/skills/benchmark-methodology/references/language-harnesses.md +130 -0
- package/skills/bgp-diagnostics/SKILL.md +84 -0
- package/skills/bgp-diagnostics/evals/triggers.json +18 -0
- package/skills/bgp-diagnostics/references/bgp-reference.md +81 -0
- package/skills/bioinformatics-workflows/SKILL.md +108 -0
- package/skills/bioinformatics-workflows/evals/triggers.json +16 -0
- package/skills/bioinformatics-workflows/references/commands.md +71 -0
- package/skills/bioinformatics-workflows/references/formats.md +24 -0
- package/skills/bioinformatics-workflows/references/workflow-managers.md +107 -0
- package/skills/brand-voice/SKILL.md +112 -0
- package/skills/brand-voice/evals/triggers.json +16 -0
- package/skills/browser-qa/SKILL.md +99 -0
- package/skills/browser-qa/evals/triggers.json +16 -0
- package/skills/bun-runtime/SKILL.md +93 -0
- package/skills/bun-runtime/evals/triggers.json +16 -0
- package/skills/cisco-ios-config/SKILL.md +101 -0
- package/skills/cisco-ios-config/evals/triggers.json +18 -0
- package/skills/cisco-ios-config/references/verification.md +63 -0
- package/skills/clickhouse-patterns/SKILL.md +101 -0
- package/skills/clickhouse-patterns/evals/triggers.json +18 -0
- package/skills/clickhouse-patterns/references/engines-and-views.md +138 -0
- package/skills/clinical-decision-support/SKILL.md +90 -0
- package/skills/clinical-decision-support/evals/triggers.json +16 -0
- package/skills/clinical-decision-support/references/cds-hooks.md +76 -0
- package/skills/clinical-decision-support/references/regulatory-boundaries.md +37 -0
- package/skills/code-tour/SKILL.md +97 -0
- package/skills/code-tour/evals/triggers.json +14 -0
- package/skills/codebase-onboarding/SKILL.md +112 -0
- package/skills/codebase-onboarding/evals/triggers.json +14 -0
- package/skills/cold-outreach-sequences/SKILL.md +90 -0
- package/skills/cold-outreach-sequences/evals/triggers.json +16 -0
- package/skills/content-repurposing/SKILL.md +82 -0
- package/skills/content-repurposing/evals/triggers.json +16 -0
- package/skills/context-budget/SKILL.md +84 -0
- package/skills/context-budget/evals/triggers.json +14 -0
- package/skills/conventional-commits/SKILL.md +144 -0
- package/skills/conventional-commits/evals/triggers.json +16 -0
- package/skills/cpp-patterns/SKILL.md +129 -0
- package/skills/cpp-patterns/evals/triggers.json +16 -0
- package/skills/cpp-patterns/references/cmake-and-tooling.md +88 -0
- package/skills/cpp-patterns/references/undefined-behaviour.md +75 -0
- package/skills/cpp-testing/SKILL.md +131 -0
- package/skills/cpp-testing/evals/triggers.json +16 -0
- package/skills/csharp-patterns/SKILL.md +110 -0
- package/skills/csharp-patterns/evals/triggers.json +17 -0
- package/skills/csharp-patterns/references/analyzers.md +59 -0
- package/skills/csharp-testing/SKILL.md +85 -0
- package/skills/csharp-testing/evals/triggers.json +17 -0
- package/skills/csharp-testing/references/integration-tests.md +77 -0
- package/skills/css-architecture/SKILL.md +143 -0
- package/skills/css-architecture/evals/triggers.json +16 -0
- package/skills/customs-trade-compliance/SKILL.md +95 -0
- package/skills/customs-trade-compliance/evals/triggers.json +16 -0
- package/skills/customs-trade-compliance/references/incoterms-2020.md +42 -0
- package/skills/dart-patterns/SKILL.md +157 -0
- package/skills/dart-patterns/evals/triggers.json +18 -0
- package/skills/dart-testing/SKILL.md +164 -0
- package/skills/dart-testing/evals/triggers.json +18 -0
- package/skills/data-analysis-notebooks/SKILL.md +113 -0
- package/skills/data-analysis-notebooks/evals/triggers.json +16 -0
- package/skills/data-analysis-notebooks/references/dataframe-pitfalls.md +49 -0
- package/skills/data-analysis-notebooks/references/statistics-pitfalls.md +24 -0
- package/skills/data-pipelines/SKILL.md +90 -0
- package/skills/data-pipelines/evals/triggers.json +16 -0
- package/skills/data-pipelines/references/orchestrators.md +64 -0
- package/skills/database-migrations/SKILL.md +102 -0
- package/skills/database-migrations/evals/triggers.json +16 -0
- package/skills/database-migrations/references/recipes.md +98 -0
- package/skills/database-migrations/references/tools.md +21 -0
- package/skills/dbt-patterns/SKILL.md +96 -0
- package/skills/dbt-patterns/evals/triggers.json +16 -0
- package/skills/dbt-patterns/references/yaml-examples.md +114 -0
- package/skills/deep-research/SKILL.md +107 -0
- package/skills/deep-research/evals/triggers.json +14 -0
- package/skills/dependency-audit/SKILL.md +103 -0
- package/skills/dependency-audit/evals/triggers.json +16 -0
- package/skills/dependency-audit/references/tools.md +124 -0
- package/skills/deployment-strategies/SKILL.md +108 -0
- package/skills/deployment-strategies/evals/triggers.json +16 -0
- package/skills/django-patterns/SKILL.md +123 -0
- package/skills/django-patterns/evals/triggers.json +16 -0
- package/skills/docker-patterns/SKILL.md +132 -0
- package/skills/docker-patterns/evals/triggers.json +16 -0
- package/skills/docker-patterns/references/dockerfiles.md +105 -0
- package/skills/e2e-testing-playwright/SKILL.md +94 -0
- package/skills/e2e-testing-playwright/evals/triggers.json +16 -0
- package/skills/e2e-testing-playwright/references/config-and-ci.md +129 -0
- package/skills/ef-core-patterns/SKILL.md +117 -0
- package/skills/ef-core-patterns/evals/triggers.json +16 -0
- package/skills/email-deliverability/SKILL.md +99 -0
- package/skills/email-deliverability/evals/triggers.json +17 -0
- package/skills/email-deliverability/references/dns-records.md +85 -0
- package/skills/error-handling-patterns/SKILL.md +112 -0
- package/skills/error-handling-patterns/evals/triggers.json +18 -0
- package/skills/error-handling-patterns/references/language-idioms.md +49 -0
- package/skills/estimation-and-scoping/SKILL.md +97 -0
- package/skills/estimation-and-scoping/evals/triggers.json +14 -0
- package/skills/evm-dapp-integration/SKILL.md +73 -0
- package/skills/evm-dapp-integration/evals/triggers.json +16 -0
- package/skills/fastapi-patterns/SKILL.md +127 -0
- package/skills/fastapi-patterns/evals/triggers.json +16 -0
- package/skills/ffmpeg-media-processing/SKILL.md +94 -0
- package/skills/ffmpeg-media-processing/evals/triggers.json +16 -0
- package/skills/ffmpeg-media-processing/references/recipes.md +112 -0
- package/skills/fhir-integration/SKILL.md +81 -0
- package/skills/fhir-integration/evals/triggers.json +16 -0
- package/skills/fhir-integration/references/search-and-bundles.md +73 -0
- package/skills/fhir-integration/references/smart-on-fhir.md +50 -0
- package/skills/flask-patterns/SKILL.md +132 -0
- package/skills/flask-patterns/evals/triggers.json +16 -0
- package/skills/flutter-patterns/SKILL.md +99 -0
- package/skills/flutter-patterns/evals/triggers.json +16 -0
- package/skills/flutterwave-integration/SKILL.md +75 -0
- package/skills/flutterwave-integration/evals/triggers.json +16 -0
- package/skills/flutterwave-integration/references/api.md +73 -0
- package/skills/flutterwave-integration/references/webhooks.md +49 -0
- package/skills/fsharp-patterns/SKILL.md +133 -0
- package/skills/fsharp-patterns/evals/triggers.json +16 -0
- package/skills/fsharp-testing/SKILL.md +136 -0
- package/skills/fsharp-testing/evals/triggers.json +16 -0
- package/skills/gcp-patterns/SKILL.md +86 -0
- package/skills/gcp-patterns/evals/triggers.json +16 -0
- package/skills/git-workflow/SKILL.md +114 -0
- package/skills/git-workflow/evals/triggers.json +16 -0
- package/skills/github-actions-ci/SKILL.md +117 -0
- package/skills/github-actions-ci/evals/triggers.json +16 -0
- package/skills/github-api-automation/SKILL.md +101 -0
- package/skills/github-api-automation/evals/triggers.json +17 -0
- package/skills/go-patterns/SKILL.md +118 -0
- package/skills/go-patterns/evals/triggers.json +17 -0
- package/skills/go-patterns/references/concurrency.md +162 -0
- package/skills/go-testing/SKILL.md +154 -0
- package/skills/go-testing/evals/triggers.json +17 -0
- package/skills/hexagonal-architecture/SKILL.md +89 -0
- package/skills/hexagonal-architecture/evals/triggers.json +17 -0
- package/skills/hipaa-compliance/SKILL.md +91 -0
- package/skills/hipaa-compliance/evals/triggers.json +18 -0
- package/skills/hipaa-compliance/references/safeguards.md +68 -0
- package/skills/hl7v2-integration/SKILL.md +69 -0
- package/skills/hl7v2-integration/evals/triggers.json +16 -0
- package/skills/hl7v2-integration/references/messages-and-ack.md +78 -0
- package/skills/homelab-network-setup/SKILL.md +125 -0
- package/skills/homelab-network-setup/evals/triggers.json +18 -0
- package/skills/homelab-network-setup/references/firewall-and-dns.md +45 -0
- package/skills/homelab-network-setup/references/wireguard.md +72 -0
- package/skills/hubtel-integration/SKILL.md +77 -0
- package/skills/hubtel-integration/evals/triggers.json +16 -0
- package/skills/hubtel-integration/references/api.md +92 -0
- package/skills/i18n-localization/SKILL.md +114 -0
- package/skills/i18n-localization/evals/triggers.json +16 -0
- package/skills/i18n-localization/references/libraries.md +52 -0
- package/skills/incident-postmortem/SKILL.md +118 -0
- package/skills/incident-postmortem/evals/triggers.json +14 -0
- package/skills/inventory-demand-planning/SKILL.md +89 -0
- package/skills/inventory-demand-planning/evals/triggers.json +16 -0
- package/skills/inventory-demand-planning/references/formulas.md +62 -0
- package/skills/investor-materials/SKILL.md +127 -0
- package/skills/investor-materials/evals/triggers.json +16 -0
- package/skills/investor-materials/references/templates.md +74 -0
- package/skills/invoicing-and-tax/SKILL.md +84 -0
- package/skills/invoicing-and-tax/evals/triggers.json +17 -0
- package/skills/invoicing-and-tax/references/e-invoicing.md +24 -0
- package/skills/invoicing-and-tax/references/invoice-fields.md +38 -0
- package/skills/invoicing-and-tax/references/rounding.md +26 -0
- package/skills/java-patterns/SKILL.md +141 -0
- package/skills/java-patterns/evals/triggers.json +17 -0
- package/skills/java-testing/SKILL.md +142 -0
- package/skills/java-testing/evals/triggers.json +16 -0
- package/skills/jetpack-compose-patterns/SKILL.md +88 -0
- package/skills/jetpack-compose-patterns/evals/triggers.json +16 -0
- package/skills/jira-integration/SKILL.md +92 -0
- package/skills/jira-integration/evals/triggers.json +17 -0
- package/skills/jpa-hibernate/SKILL.md +92 -0
- package/skills/jpa-hibernate/evals/triggers.json +18 -0
- package/skills/jpa-hibernate/references/mapping.md +99 -0
- package/skills/kotlin-multiplatform/SKILL.md +97 -0
- package/skills/kotlin-multiplatform/evals/triggers.json +16 -0
- package/skills/kotlin-patterns/SKILL.md +128 -0
- package/skills/kotlin-patterns/evals/triggers.json +16 -0
- package/skills/kotlin-testing/SKILL.md +117 -0
- package/skills/kotlin-testing/evals/triggers.json +16 -0
- package/skills/ktor-patterns/SKILL.md +135 -0
- package/skills/ktor-patterns/evals/triggers.json +18 -0
- package/skills/kubernetes-patterns/SKILL.md +106 -0
- package/skills/kubernetes-patterns/evals/triggers.json +16 -0
- package/skills/kubernetes-patterns/references/manifests.md +115 -0
- package/skills/laravel-patterns/SKILL.md +136 -0
- package/skills/laravel-patterns/evals/triggers.json +16 -0
- package/skills/linear-integration/SKILL.md +98 -0
- package/skills/linear-integration/evals/triggers.json +17 -0
- package/skills/literature-review/SKILL.md +109 -0
- package/skills/literature-review/evals/triggers.json +16 -0
- package/skills/literature-review/references/appraisal.md +41 -0
- package/skills/literature-review/references/search-sources.md +39 -0
- package/skills/llm-app-patterns/SKILL.md +97 -0
- package/skills/llm-app-patterns/evals/triggers.json +17 -0
- package/skills/llm-evals/SKILL.md +98 -0
- package/skills/llm-evals/evals/triggers.json +16 -0
- package/skills/llm-evals/references/graders.md +66 -0
- package/skills/logistics-exception-management/SKILL.md +90 -0
- package/skills/logistics-exception-management/evals/triggers.json +16 -0
- package/skills/manim-animations/SKILL.md +106 -0
- package/skills/manim-animations/evals/triggers.json +16 -0
- package/skills/market-research/SKILL.md +117 -0
- package/skills/market-research/evals/triggers.json +16 -0
- package/skills/marketing-campaign/SKILL.md +111 -0
- package/skills/marketing-campaign/evals/triggers.json +16 -0
- package/skills/mcp-server-patterns/SKILL.md +127 -0
- package/skills/mcp-server-patterns/evals/triggers.json +18 -0
- package/skills/mcp-server-patterns/references/protocol-notes.md +68 -0
- package/skills/metrics-dashboards/SKILL.md +113 -0
- package/skills/metrics-dashboards/evals/triggers.json +16 -0
- package/skills/ml-experiment-workflow/SKILL.md +125 -0
- package/skills/ml-experiment-workflow/evals/triggers.json +16 -0
- package/skills/mongodb-patterns/SKILL.md +115 -0
- package/skills/mongodb-patterns/evals/triggers.json +18 -0
- package/skills/mongodb-patterns/references/indexes-and-aggregation.md +94 -0
- package/skills/mpesa-daraja-integration/SKILL.md +70 -0
- package/skills/mpesa-daraja-integration/evals/triggers.json +16 -0
- package/skills/mpesa-daraja-integration/references/api.md +103 -0
- package/skills/mpesa-daraja-integration/references/callbacks.md +74 -0
- package/skills/mtn-momo-integration/SKILL.md +66 -0
- package/skills/mtn-momo-integration/evals/triggers.json +16 -0
- package/skills/mtn-momo-integration/references/api.md +153 -0
- package/skills/mtn-momo-integration/references/callbacks.md +92 -0
- package/skills/mtn-momo-integration/references/sandbox-and-go-live.md +51 -0
- package/skills/mtn-momo-integration/scripts/sandbox-setup.js +79 -0
- package/skills/mysql-patterns/SKILL.md +96 -0
- package/skills/mysql-patterns/evals/triggers.json +16 -0
- package/skills/mysql-patterns/references/explain.md +34 -0
- package/skills/mysql-patterns/references/online-ddl.md +41 -0
- package/skills/nestjs-patterns/SKILL.md +114 -0
- package/skills/nestjs-patterns/evals/triggers.json +16 -0
- package/skills/nestjs-patterns/references/testing.md +68 -0
- package/skills/network-automation/SKILL.md +107 -0
- package/skills/network-automation/evals/triggers.json +18 -0
- package/skills/network-automation/references/tool-snippets.md +153 -0
- package/skills/network-troubleshooting/SKILL.md +152 -0
- package/skills/network-troubleshooting/evals/triggers.json +18 -0
- package/skills/network-troubleshooting/references/commands.md +33 -0
- package/skills/nextjs-patterns/SKILL.md +150 -0
- package/skills/nextjs-patterns/evals/triggers.json +18 -0
- package/skills/nextjs-patterns/references/caching.md +87 -0
- package/skills/node-backend-patterns/SKILL.md +103 -0
- package/skills/node-backend-patterns/evals/triggers.json +16 -0
- package/skills/node-backend-patterns/references/templates.md +122 -0
- package/skills/nuxt-patterns/SKILL.md +103 -0
- package/skills/nuxt-patterns/evals/triggers.json +16 -0
- package/skills/parallel-agent-orchestration/SKILL.md +106 -0
- package/skills/parallel-agent-orchestration/evals/triggers.json +14 -0
- package/skills/paystack-integration/SKILL.md +59 -0
- package/skills/paystack-integration/evals/triggers.json +14 -0
- package/skills/paystack-integration/references/api.md +73 -0
- package/skills/paystack-integration/references/mobile-money.md +50 -0
- package/skills/paystack-integration/references/webhooks.md +80 -0
- package/skills/pci-dss-scope/SKILL.md +103 -0
- package/skills/pci-dss-scope/evals/triggers.json +18 -0
- package/skills/pci-dss-scope/references/saq-and-data.md +36 -0
- package/skills/perl-patterns/SKILL.md +135 -0
- package/skills/perl-patterns/evals/triggers.json +18 -0
- package/skills/perl-testing/SKILL.md +126 -0
- package/skills/perl-testing/evals/triggers.json +17 -0
- package/skills/php-patterns/SKILL.md +116 -0
- package/skills/php-patterns/evals/triggers.json +16 -0
- package/skills/php-testing/SKILL.md +123 -0
- package/skills/php-testing/evals/triggers.json +16 -0
- package/skills/postgres-patterns/SKILL.md +103 -0
- package/skills/postgres-patterns/evals/triggers.json +17 -0
- package/skills/postgres-patterns/references/explain.md +59 -0
- package/skills/postgres-patterns/references/locks.md +53 -0
- package/skills/prd-writing/SKILL.md +124 -0
- package/skills/prd-writing/evals/triggers.json +15 -0
- package/skills/prisma-patterns/SKILL.md +83 -0
- package/skills/prisma-patterns/evals/triggers.json +18 -0
- package/skills/prisma-patterns/references/prisma-8.md +46 -0
- package/skills/prisma-patterns/references/workflow.md +50 -0
- package/skills/privacy-compliance/SKILL.md +121 -0
- package/skills/privacy-compliance/evals/triggers.json +18 -0
- package/skills/privacy-compliance/references/jurisdictions.md +51 -0
- package/skills/production-scheduling/SKILL.md +98 -0
- package/skills/production-scheduling/evals/triggers.json +16 -0
- package/skills/prompt-engineering/SKILL.md +92 -0
- package/skills/prompt-engineering/evals/triggers.json +16 -0
- package/skills/python-patterns/SKILL.md +107 -0
- package/skills/python-patterns/evals/triggers.json +16 -0
- package/skills/python-patterns/references/tooling.md +101 -0
- package/skills/python-testing/SKILL.md +126 -0
- package/skills/python-testing/evals/triggers.json +16 -0
- package/skills/python-testing/references/mocking.md +71 -0
- package/skills/pytorch-patterns/SKILL.md +139 -0
- package/skills/pytorch-patterns/evals/triggers.json +16 -0
- package/skills/pytorch-patterns/references/debugging.md +39 -0
- package/skills/quarkus-patterns/SKILL.md +93 -0
- package/skills/quarkus-patterns/evals/triggers.json +18 -0
- package/skills/rag-pipeline-patterns/SKILL.md +117 -0
- package/skills/rag-pipeline-patterns/evals/triggers.json +18 -0
- package/skills/rag-pipeline-patterns/references/evaluation.md +37 -0
- package/skills/rag-pipeline-patterns/references/retrieval-recipes.md +78 -0
- package/skills/rails-patterns/SKILL.md +132 -0
- package/skills/rails-patterns/evals/triggers.json +16 -0
- package/skills/react-native-patterns/SKILL.md +101 -0
- package/skills/react-native-patterns/evals/triggers.json +16 -0
- package/skills/react-patterns/SKILL.md +140 -0
- package/skills/react-patterns/evals/triggers.json +18 -0
- package/skills/react-performance/SKILL.md +107 -0
- package/skills/react-performance/evals/triggers.json +18 -0
- package/skills/redis-patterns/SKILL.md +109 -0
- package/skills/redis-patterns/evals/triggers.json +18 -0
- package/skills/redis-patterns/references/operations.md +61 -0
- package/skills/refactoring-safely/SKILL.md +107 -0
- package/skills/refactoring-safely/evals/triggers.json +17 -0
- package/skills/release-management/SKILL.md +141 -0
- package/skills/release-management/evals/triggers.json +16 -0
- package/skills/remotion-video/SKILL.md +91 -0
- package/skills/remotion-video/evals/triggers.json +16 -0
- package/skills/remotion-video/references/lambda.md +66 -0
- package/skills/returns-reverse-logistics/SKILL.md +97 -0
- package/skills/returns-reverse-logistics/evals/triggers.json +16 -0
- package/skills/ruby-patterns/SKILL.md +127 -0
- package/skills/ruby-patterns/evals/triggers.json +18 -0
- package/skills/ruby-testing/SKILL.md +113 -0
- package/skills/ruby-testing/evals/triggers.json +18 -0
- package/skills/runbook-writing/SKILL.md +101 -0
- package/skills/runbook-writing/evals/triggers.json +14 -0
- package/skills/rust-patterns/SKILL.md +118 -0
- package/skills/rust-patterns/evals/triggers.json +16 -0
- package/skills/rust-patterns/references/cargo-and-clippy.md +105 -0
- package/skills/rust-patterns/references/errors-and-traits.md +97 -0
- package/skills/rust-testing/SKILL.md +148 -0
- package/skills/rust-testing/evals/triggers.json +16 -0
- package/skills/rust-testing/references/fakes-proptest-async.md +113 -0
- package/skills/search-first/SKILL.md +73 -0
- package/skills/search-first/evals/triggers.json +14 -0
- package/skills/security-review/SKILL.md +58 -0
- package/skills/security-review/evals/triggers.json +14 -0
- package/skills/security-review/references/checklist.md +54 -0
- package/skills/security-review/scripts/scan-secrets.js +79 -0
- package/skills/seo-audit/SKILL.md +111 -0
- package/skills/seo-audit/evals/triggers.json +16 -0
- package/skills/seo-audit/references/checks.md +65 -0
- package/skills/session-handoff/SKILL.md +101 -0
- package/skills/session-handoff/evals/triggers.json +14 -0
- package/skills/skill-authoring/SKILL.md +87 -0
- package/skills/skill-authoring/evals/triggers.json +14 -0
- package/skills/skill-authoring/references/frontmatter.md +40 -0
- package/skills/slack-app-integration/SKILL.md +108 -0
- package/skills/slack-app-integration/evals/triggers.json +17 -0
- package/skills/smart-contract-security/SKILL.md +110 -0
- package/skills/smart-contract-security/evals/triggers.json +16 -0
- package/skills/smart-contract-security/references/vulnerability-checklist.md +79 -0
- package/skills/social-media-publishing/SKILL.md +84 -0
- package/skills/social-media-publishing/evals/triggers.json +17 -0
- package/skills/social-media-publishing/references/platform-apis.md +116 -0
- package/skills/solidity-patterns/SKILL.md +95 -0
- package/skills/solidity-patterns/evals/triggers.json +16 -0
- package/skills/spring-boot-patterns/SKILL.md +128 -0
- package/skills/spring-boot-patterns/evals/triggers.json +18 -0
- package/skills/spring-boot-patterns/references/testing.md +72 -0
- package/skills/stripe-integration/SKILL.md +69 -0
- package/skills/stripe-integration/evals/triggers.json +16 -0
- package/skills/stripe-integration/references/api.md +71 -0
- package/skills/stripe-integration/references/billing.md +58 -0
- package/skills/stripe-integration/references/webhooks.md +76 -0
- package/skills/subscription-billing-ops/SKILL.md +118 -0
- package/skills/subscription-billing-ops/evals/triggers.json +17 -0
- package/skills/subscription-billing-ops/references/proration.md +47 -0
- package/skills/subscription-billing-ops/references/revenue-metrics.md +38 -0
- package/skills/svelte-patterns/SKILL.md +122 -0
- package/skills/svelte-patterns/evals/triggers.json +16 -0
- package/skills/swift-patterns/SKILL.md +113 -0
- package/skills/swift-patterns/evals/triggers.json +16 -0
- package/skills/swift-patterns/references/concurrency-migration.md +40 -0
- package/skills/swift-testing/SKILL.md +121 -0
- package/skills/swift-testing/evals/triggers.json +16 -0
- package/skills/swift-testing/references/swift-testing-cheatsheet.md +81 -0
- package/skills/swiftui-patterns/SKILL.md +102 -0
- package/skills/swiftui-patterns/evals/triggers.json +16 -0
- package/skills/tdd-workflow/SKILL.md +67 -0
- package/skills/tdd-workflow/evals/triggers.json +14 -0
- package/skills/technical-writing/SKILL.md +95 -0
- package/skills/technical-writing/evals/triggers.json +14 -0
- package/skills/terraform-patterns/SKILL.md +122 -0
- package/skills/terraform-patterns/evals/triggers.json +16 -0
- package/skills/terraform-patterns/references/backends.md +67 -0
- package/skills/test-coverage-improvement/SKILL.md +107 -0
- package/skills/test-coverage-improvement/evals/triggers.json +16 -0
- package/skills/threat-modeling/SKILL.md +113 -0
- package/skills/threat-modeling/evals/triggers.json +16 -0
- package/skills/typescript-patterns/SKILL.md +122 -0
- package/skills/typescript-patterns/evals/triggers.json +16 -0
- package/skills/typescript-testing/SKILL.md +101 -0
- package/skills/typescript-testing/evals/triggers.json +16 -0
- package/skills/verification-loop/SKILL.md +70 -0
- package/skills/verification-loop/evals/triggers.json +14 -0
- package/skills/verification-loop/scripts/detect-checks.js +102 -0
- package/skills/vite-patterns/SKILL.md +117 -0
- package/skills/vite-patterns/evals/triggers.json +16 -0
- package/skills/vue-patterns/SKILL.md +104 -0
- package/skills/vue-patterns/evals/triggers.json +16 -0
- package/skills/web-accessibility/SKILL.md +119 -0
- package/skills/web-accessibility/evals/triggers.json +16 -0
- package/skills/web-performance/SKILL.md +107 -0
- package/skills/web-performance/evals/triggers.json +16 -0
- package/skills/web-scraping/SKILL.md +80 -0
- package/skills/web-scraping/evals/triggers.json +16 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const { parseFrontmatter } = require('./frontmatter');
|
|
6
|
+
|
|
7
|
+
const REPO_ROOT = path.resolve(__dirname, '..', '..');
|
|
8
|
+
const SKILLS_DIR = path.join(REPO_ROOT, 'skills');
|
|
9
|
+
const AGENTS_DIR = path.join(REPO_ROOT, 'agents');
|
|
10
|
+
const COMMANDS_DIR = path.join(REPO_ROOT, 'commands');
|
|
11
|
+
const HOOKS_DIR = path.join(REPO_ROOT, 'hooks');
|
|
12
|
+
const RULES_DIR = path.join(REPO_ROOT, 'rules');
|
|
13
|
+
|
|
14
|
+
const csv = (s) => (s || '').split(',').map((x) => x.trim()).filter(Boolean);
|
|
15
|
+
|
|
16
|
+
// Reads one markdown item (SKILL.md, AGENT.md or a command file). `dir` is the item's name.
|
|
17
|
+
function loadDoc(file, extra) {
|
|
18
|
+
const text = fs.readFileSync(file, 'utf8');
|
|
19
|
+
const { data, body, errors } = parseFrontmatter(text);
|
|
20
|
+
const meta = (data && data.metadata) || {};
|
|
21
|
+
return {
|
|
22
|
+
file,
|
|
23
|
+
text,
|
|
24
|
+
body,
|
|
25
|
+
data: data || {},
|
|
26
|
+
parseErrors: errors,
|
|
27
|
+
name: data && data.name,
|
|
28
|
+
description: data && data.description,
|
|
29
|
+
version: meta['kete-loom/version'],
|
|
30
|
+
category: meta['kete-loom/category'],
|
|
31
|
+
risk: meta['kete-loom/risk'],
|
|
32
|
+
requires: csv(meta['kete-loom/requires']),
|
|
33
|
+
tools: meta['kete-loom/tools'] === undefined ? null : csv(meta['kete-loom/tools']),
|
|
34
|
+
argumentHint: meta['kete-loom/argument-hint'],
|
|
35
|
+
event: meta['kete-loom/event'],
|
|
36
|
+
paths: csv(meta['kete-loom/paths']),
|
|
37
|
+
...extra,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function listFolders(root, file, load) {
|
|
42
|
+
if (!fs.existsSync(root)) return [];
|
|
43
|
+
return fs
|
|
44
|
+
.readdirSync(root, { withFileTypes: true })
|
|
45
|
+
.filter((d) => d.isDirectory() && fs.existsSync(path.join(root, d.name, file)))
|
|
46
|
+
.map((d) => load(path.join(root, d.name)))
|
|
47
|
+
.sort((a, b) => a.dir.localeCompare(b.dir));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function loadSkill(skillPath) {
|
|
51
|
+
return loadDoc(path.join(skillPath, 'SKILL.md'), { kind: 'skill', dir: path.basename(skillPath), path: skillPath });
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function loadAgent(agentPath) {
|
|
55
|
+
return loadDoc(path.join(agentPath, 'AGENT.md'), { kind: 'agent', dir: path.basename(agentPath), path: agentPath });
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function loadHook(hookPath) {
|
|
59
|
+
return loadDoc(path.join(hookPath, 'HOOK.md'), { kind: 'hook', dir: path.basename(hookPath), path: hookPath });
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function loadCommand(file) {
|
|
63
|
+
return loadDoc(file, { kind: 'command', dir: path.basename(file, '.md'), path: file });
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function loadRule(file) {
|
|
67
|
+
return loadDoc(file, { kind: 'rule', dir: path.basename(file, '.md'), path: file });
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const listSkills = (root = SKILLS_DIR) => listFolders(root, 'SKILL.md', loadSkill);
|
|
71
|
+
const listAgents = (root = AGENTS_DIR) => listFolders(root, 'AGENT.md', loadAgent);
|
|
72
|
+
const listHooks = (root = HOOKS_DIR) => listFolders(root, 'HOOK.md', loadHook);
|
|
73
|
+
|
|
74
|
+
function listFiles(root, load) {
|
|
75
|
+
if (!fs.existsSync(root)) return [];
|
|
76
|
+
return fs
|
|
77
|
+
.readdirSync(root)
|
|
78
|
+
.filter((f) => f.endsWith('.md'))
|
|
79
|
+
.map((f) => load(path.join(root, f)))
|
|
80
|
+
.sort((a, b) => a.dir.localeCompare(b.dir));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const listCommands = (root = COMMANDS_DIR) => listFiles(root, loadCommand);
|
|
84
|
+
const listRules = (root = RULES_DIR) => listFiles(root, loadRule);
|
|
85
|
+
|
|
86
|
+
module.exports = { REPO_ROOT, SKILLS_DIR, AGENTS_DIR, COMMANDS_DIR, HOOKS_DIR, RULES_DIR, listSkills, listAgents, listCommands, listHooks, listRules, loadSkill, loadAgent, loadCommand, loadHook, loadRule };
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const os = require('os');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
|
|
7
|
+
// Where each host looks for skills, agents and commands (verified against host docs, Oct 2026).
|
|
8
|
+
// `agents` is the shared open-standard folder: Codex, OpenCode, Cursor, Gemini CLI, GitHub Copilot
|
|
9
|
+
// and Kete Code all read its skills. It defines nothing for agents or commands.
|
|
10
|
+
// Claude Code reads only its own folders; Cursor and VS Code Copilot also read `.claude/agents`.
|
|
11
|
+
// So the default install is `agents` + `claude`, plus agents and commands for hosts that need their
|
|
12
|
+
// own copy (`auto`, including Kete Code) when that host is detected. The other targets exist for people who want one host only.
|
|
13
|
+
// Kinds a target doesn't list are not supported there: Codex prompts are deprecated, Copilot CLI has
|
|
14
|
+
// no prompt files and Cursor commands are beta, so commands go to Claude, OpenCode and Gemini only.
|
|
15
|
+
const TARGETS = {
|
|
16
|
+
agents: {
|
|
17
|
+
label: 'Shared .agents folder (Codex, OpenCode, Cursor, Gemini CLI, Copilot, Kete Code)',
|
|
18
|
+
user: { skills: ['.agents', 'skills'] },
|
|
19
|
+
project: { skills: ['.agents', 'skills'] },
|
|
20
|
+
default: true,
|
|
21
|
+
},
|
|
22
|
+
claude: {
|
|
23
|
+
label: 'Claude Code (its agents are also read by Cursor and VS Code Copilot)',
|
|
24
|
+
// Rules go in a kete-loom subfolder (Claude Code scans .claude/rules recursively), so ours stay apart.
|
|
25
|
+
user: { skills: ['.claude', 'skills'], agents: ['.claude', 'agents'], commands: ['.claude', 'commands'], rules: ['.claude', 'rules', 'kete-loom'] },
|
|
26
|
+
project: { skills: ['.claude', 'skills'], agents: ['.claude', 'agents'], commands: ['.claude', 'commands'], rules: ['.claude', 'rules', 'kete-loom'] },
|
|
27
|
+
default: true,
|
|
28
|
+
hooks: true,
|
|
29
|
+
},
|
|
30
|
+
codex: {
|
|
31
|
+
label: 'Codex (agents only; skills come from .agents)',
|
|
32
|
+
user: { agents: ['.codex', 'agents'] },
|
|
33
|
+
project: { agents: ['.codex', 'agents'] },
|
|
34
|
+
detect: { user: ['.codex'], project: ['.codex'] },
|
|
35
|
+
auto: true,
|
|
36
|
+
hooks: true,
|
|
37
|
+
},
|
|
38
|
+
opencode: {
|
|
39
|
+
label: 'OpenCode',
|
|
40
|
+
user: { skills: ['.config', 'opencode', 'skills'], agents: ['.config', 'opencode', 'agents'], commands: ['.config', 'opencode', 'commands'] },
|
|
41
|
+
project: { skills: ['.opencode', 'skills'], agents: ['.opencode', 'agents'], commands: ['.opencode', 'commands'] },
|
|
42
|
+
detect: { user: ['.config', 'opencode'], project: ['.opencode'] },
|
|
43
|
+
auto: true,
|
|
44
|
+
hooks: true,
|
|
45
|
+
},
|
|
46
|
+
// Kete Code (an OpenCode fork) reads skills from .agents and .claude, but agents and commands only from its own folders.
|
|
47
|
+
// shortcut: user paths assume XDG_CONFIG_HOME is ~/.config (as for opencode); honour it if users report custom roots.
|
|
48
|
+
kete: {
|
|
49
|
+
label: 'Kete Code',
|
|
50
|
+
user: { skills: ['.config', 'kete', 'skills'], agents: ['.config', 'kete', 'agents'], commands: ['.config', 'kete', 'commands'] },
|
|
51
|
+
project: { skills: ['.kete', 'skills'], agents: ['.kete', 'agents'], commands: ['.kete', 'commands'] },
|
|
52
|
+
detect: { user: ['.config', 'kete'], project: ['.kete'] },
|
|
53
|
+
auto: true,
|
|
54
|
+
hooks: true,
|
|
55
|
+
},
|
|
56
|
+
cursor: {
|
|
57
|
+
label: 'Cursor only',
|
|
58
|
+
user: { skills: ['.cursor', 'skills'], agents: ['.cursor', 'agents'] },
|
|
59
|
+
// Cursor reads rule files only per project (user rules live in its settings UI).
|
|
60
|
+
project: { skills: ['.cursor', 'skills'], agents: ['.cursor', 'agents'], rules: ['.cursor', 'rules', 'kete-loom'] },
|
|
61
|
+
// Detected only for hooks: Cursor already reads agents from .claude.
|
|
62
|
+
detect: { user: ['.cursor'], project: ['.cursor'] },
|
|
63
|
+
hooks: true,
|
|
64
|
+
},
|
|
65
|
+
gemini: {
|
|
66
|
+
label: 'Gemini CLI',
|
|
67
|
+
user: { skills: ['.gemini', 'skills'], agents: ['.gemini', 'agents'], commands: ['.gemini', 'commands'] },
|
|
68
|
+
project: { skills: ['.gemini', 'skills'], agents: ['.gemini', 'agents'], commands: ['.gemini', 'commands'] },
|
|
69
|
+
detect: { user: ['.gemini'], project: ['.gemini'] },
|
|
70
|
+
auto: true,
|
|
71
|
+
hooks: true,
|
|
72
|
+
},
|
|
73
|
+
copilot: {
|
|
74
|
+
label: 'GitHub Copilot only',
|
|
75
|
+
user: { skills: ['.copilot', 'skills'], agents: ['.copilot', 'agents'], rules: ['.copilot', 'instructions', 'kete-loom'] },
|
|
76
|
+
project: { skills: ['.github', 'skills'], agents: ['.github', 'agents'], rules: ['.github', 'instructions', 'kete-loom'] },
|
|
77
|
+
detect: { user: ['.copilot'], project: ['.github'] },
|
|
78
|
+
hooks: true,
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const KINDS = ['skills', 'agents', 'commands', 'rules'];
|
|
83
|
+
|
|
84
|
+
// Which folders each host reads skills from, used by `doctor` to show where a skill is visible.
|
|
85
|
+
const HOST_READS = {
|
|
86
|
+
'Claude Code': ['claude'],
|
|
87
|
+
Codex: ['agents'],
|
|
88
|
+
OpenCode: ['agents', 'claude', 'opencode'],
|
|
89
|
+
Cursor: ['agents', 'claude', 'cursor'],
|
|
90
|
+
'Gemini CLI': ['agents', 'gemini'],
|
|
91
|
+
'GitHub Copilot': ['agents', 'claude', 'copilot'],
|
|
92
|
+
'Kete Code': ['agents', 'claude', 'kete'],
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
function baseDir({ scope = 'user', home = os.homedir(), cwd = process.cwd() } = {}) {
|
|
96
|
+
return scope === 'project' ? cwd : home;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Returns the folder for one kind, or null when the target doesn't support that kind.
|
|
100
|
+
function resolveTarget(name, { scope = 'user', home = os.homedir(), cwd = process.cwd(), kind = 'skills' } = {}) {
|
|
101
|
+
const t = TARGETS[name];
|
|
102
|
+
if (!t) throw new Error(`unknown target "${name}". Known: ${Object.keys(TARGETS).join(', ')}`);
|
|
103
|
+
const segments = t[scope === 'project' ? 'project' : 'user'][kind];
|
|
104
|
+
return segments ? path.join(baseDir({ scope, home, cwd }), ...segments) : null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function detected(name, opts = {}) {
|
|
108
|
+
const t = TARGETS[name];
|
|
109
|
+
const segments = t.detect && t.detect[opts.scope === 'project' ? 'project' : 'user'];
|
|
110
|
+
return Boolean(segments) && fs.existsSync(path.join(baseDir(opts), ...segments));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
module.exports = { TARGETS, KINDS, HOST_READS, resolveTarget, detected };
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: accounting-api-integration
|
|
3
|
+
description: Connects an application's sales and payments to QuickBooks Online and Xero through their accounting APIs, handling the OAuth 2.0 authorisation code flow with rotating refresh tokens, per-company realm or tenant IDs, chart of accounts and tax code mapping, posting customers, invoices, payments and credit notes, safe retries with requestid or Idempotency-Key, HMAC-verified webhooks, 429 rate-limit backoff, and nightly reconciliation against the ledger. Use when building a QuickBooks or Xero sync, fixing duplicate or missing invoices in the books, debugging invalid_grant or token expiry, mapping products to income accounts, or reconciling app revenue with what the accountant sees.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Live calls need network access to quickbooks.api.intuit.com (or the sandbox) and api.xero.com. Examples are HTTP and TypeScript-like pseudocode; official SDKs exist for most languages.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: integrations
|
|
9
|
+
kete-loom/risk: network
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Accounting API integration (QuickBooks Online, Xero)
|
|
14
|
+
|
|
15
|
+
Push your app's financial events into the customer's books exactly once, mapped to accounts their accountant chose, and prove it with a reconciliation. Your app stays the source of truth for what was sold; the ledger is the source of truth for the books. API detail: `references/quickbooks.md` and `references/xero.md`.
|
|
16
|
+
|
|
17
|
+
## Ground rules
|
|
18
|
+
|
|
19
|
+
1. **One connection per company.** QuickBooks identifies a company by `realmId`; Xero by tenant ID (send `xero-tenant-id` on every call). Store tokens per connection, encrypted at rest, never in logs.
|
|
20
|
+
2. **Refresh tokens rotate.** Each refresh can return a new refresh token; store it atomically before using the new access token, and serialise refreshes per connection (a lock), or two workers will race and one gets `invalid_grant`. Treat `invalid_grant` as "reconnect needed": mark the connection, alert the user, stop syncing it.
|
|
21
|
+
3. **Accounts are mapped, never guessed.** The customer (or their accountant) maps each of your product types, discounts, fees, tax rates and payment methods to an account, item and tax code in their ledger. Store the mapping by remote ID, not name. Block syncing until it is complete.
|
|
22
|
+
4. **Every write is idempotent.** QuickBooks: a unique `requestid` query parameter per logical operation. Xero: an `Idempotency-Key` header. Derive the key from your own record (`invoice:<id>:create`), never a fresh random value per retry. Also store the remote ID on your record and check it before creating.
|
|
23
|
+
5. **Your record links to the remote record.** Keep `remote_id`, `remote_type`, last sync status and error per record, so you can resume, update and reconcile.
|
|
24
|
+
6. **Don't post what the ledger already has.** If the customer's payment provider has its own QuickBooks or Xero feed, agree with the user which system posts what, or invoices and payments appear twice.
|
|
25
|
+
7. **Rate limits are mostly per company.** Queue writes per connection, back off on `429` (honour `Retry-After` where Xero sends it; QuickBooks says wait 60 seconds), and batch where the API supports it. Xero also has an app-wide per-minute limit across all tenants.
|
|
26
|
+
8. **Sandbox first.** QuickBooks sandbox companies and a Xero demo company; never test against a customer's live books.
|
|
27
|
+
|
|
28
|
+
## Workflow
|
|
29
|
+
|
|
30
|
+
1. **Confirm scope with the user**: which provider(s), which objects flow (customers, invoices, payments, credit notes, refunds, fees, payouts), one-way or two-way, and start date for the backfill. Stop and ask if two-way: conflict rules are a product decision.
|
|
31
|
+
2. **OAuth 2.0 authorisation code flow** with a `state` value bound to the user's session, the minimum scopes, and a callback that stores tokens and the realm or tenant. Endpoints and scopes in the references.
|
|
32
|
+
3. **Read the chart of accounts and tax codes** and present a mapping screen. Validate mapped accounts are active and of the right type (income for sales lines, bank or undeposited funds for payments).
|
|
33
|
+
4. **Sync customers** (look up by your external ID or email first; create if absent).
|
|
34
|
+
5. **Post invoices** with lines carrying the mapped item/account and tax code, your invoice number, dates and currency. Amounts must match your invoice exactly; send line amounts and tax as computed by your billing or tax system rather than letting the ledger recompute them when the API allows it, and verify the total on the response.
|
|
35
|
+
6. **Post payments** linked to the invoice, into the mapped deposit account, on the actual payment date. Post refunds and credit notes as their own objects linked to the original.
|
|
36
|
+
7. **Webhooks** (optional, for changes made in the ledger): verify the HMAC signature on the raw body, respond fast, then fetch the changed records by ID. Payloads carry IDs, not trusted data.
|
|
37
|
+
8. **Reconcile nightly** (below), and surface failures to the user with the remote error message.
|
|
38
|
+
|
|
39
|
+
## Updates and conflicts
|
|
40
|
+
|
|
41
|
+
- QuickBooks updates need the current `SyncToken`; read, modify, write, and on a stale-object error re-read and retry once.
|
|
42
|
+
- Don't update invoices that are paid, or in a locked period: QuickBooks and Xero both support closing dates/lock dates and will reject or warn. Stop and ask the user how to handle changes to a closed period; usually a credit note in the current period.
|
|
43
|
+
- Deleting or voiding in the ledger is the accountant's call. Never auto-delete remote records.
|
|
44
|
+
|
|
45
|
+
## Reconciliation
|
|
46
|
+
|
|
47
|
+
For each connection, for a date range:
|
|
48
|
+
|
|
49
|
+
1. Count and sum your invoices, payments and credit notes by currency.
|
|
50
|
+
2. Query the same in the ledger (QuickBooks query endpoint; CDC only looks back 30 days; Xero list endpoints with `where` filters, paging and `If-Modified-Since`).
|
|
51
|
+
3. Match by stored remote ID; list missing-remote, missing-local, and amount or status mismatches.
|
|
52
|
+
4. Retry missing-remote ones idempotently; report the rest to the user. Don't "fix" amounts in the ledger automatically.
|
|
53
|
+
|
|
54
|
+
## Errors to recognise
|
|
55
|
+
|
|
56
|
+
| Symptom | Likely cause |
|
|
57
|
+
|---|---|
|
|
58
|
+
| `invalid_grant` on refresh | Refresh token already used (race), revoked, or expired; reconnect |
|
|
59
|
+
| `401` or `403` with a fresh token (Xero) | Missing scope (`401`, `WWW-Authenticate` names `insufficient_scope`), or `xero-tenant-id` missing, wrong or no longer authorised (`403 AuthenticationUnsuccessful`); call `/connections` to check |
|
|
60
|
+
| Duplicate invoices | Retry without idempotency key, or key regenerated per attempt; or the payment provider's own feed also posts |
|
|
61
|
+
| Total differs by a cent | Ledger recomputed tax with its own rounding; send tax explicitly or align rounding rules |
|
|
62
|
+
| Stale object (QuickBooks) | Old `SyncToken`; re-read and retry |
|
|
63
|
+
| `429` | Per-company rate limit; slow the queue for that connection |
|
|
64
|
+
|
|
65
|
+
## Never
|
|
66
|
+
|
|
67
|
+
- Never log access or refresh tokens, or webhook verifier keys.
|
|
68
|
+
- Never post to a ledger without a completed account mapping.
|
|
69
|
+
- Never create a record without first checking for an existing remote ID or idempotency key.
|
|
70
|
+
- Never write to a closed period or delete accountant-entered data.
|
|
71
|
+
|
|
72
|
+
## Report format
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
Connection: <provider, realm/tenant, scopes>
|
|
76
|
+
Objects synced: <type: direction, trigger>
|
|
77
|
+
Mapping: <complete | gaps listed>
|
|
78
|
+
Idempotency: <how keys are derived>
|
|
79
|
+
Reconciliation <range>: local <count/sum> vs ledger <count/sum>; mismatches <list>
|
|
80
|
+
Needs user/accountant decision: <list>
|
|
81
|
+
```
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Sync our app's invoices and payments into QuickBooks Online for each customer company that connects",
|
|
4
|
+
"Our Xero refresh keeps failing with invalid_grant after a few days when two workers run at once",
|
|
5
|
+
"Build a screen where the accountant maps our product types to their Xero chart of accounts and tax rates",
|
|
6
|
+
"Retries are creating duplicate invoices in QuickBooks; how do we make the posting idempotent?",
|
|
7
|
+
"Verify the intuit-signature header on QuickBooks webhooks and fetch the changed invoices",
|
|
8
|
+
"We hit 429 errors from the Xero API during our nightly backfill of 20,000 invoices"
|
|
9
|
+
],
|
|
10
|
+
"should_not_trigger": [
|
|
11
|
+
"Set up Stripe webhooks so we fulfil orders when checkout.session.completed arrives",
|
|
12
|
+
"How should VAT be shown on invoices to EU business customers under reverse charge?",
|
|
13
|
+
"Design our dunning emails and retry schedule for failed card renewals",
|
|
14
|
+
"Prepare the month-end close checklist and journal entries for our finance team",
|
|
15
|
+
"Review our billing code for proration and timezone bugs before release"
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# QuickBooks Online Accounting API
|
|
2
|
+
|
|
3
|
+
Check developer.intuit.com for current details; Intuit changes OAuth policy and webhook formats from time to time. Facts below were checked against Intuit's docs in October 2026: [OAuth 2.0 setup](https://developer.intuit.com/app/developer/qbo/docs/develop/authentication-and-authorization/oauth-2.0), [minor versions](https://developer.intuit.com/app/developer/qbo/docs/learn/explore-the-quickbooks-online-api/minor-versions), [limits and throttles](https://static.developer.intuit.com/output_html/qbo/docs/learn/limits-and-throttles.html), [change data capture](https://developer.intuit.com/app/developer/qbo/docs/learn/explore-the-quickbooks-online-api/change-data-capture), [configure webhooks](https://developer.intuit.com/app/developer/qbo/docs/develop/webhooks/configure-webhooks) and the [release notes](https://developer.intuit.com/app/developer/qbo/docs/release-notes/general-release-notes).
|
|
4
|
+
|
|
5
|
+
## OAuth 2.0
|
|
6
|
+
|
|
7
|
+
- Authorise: `https://appcenter.intuit.com/connect/oauth2` with `client_id`, `response_type=code`, `scope=com.intuit.quickbooks.accounting`, `redirect_uri`, `state`.
|
|
8
|
+
- Token exchange and refresh: `POST https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer` (Basic auth with client ID and secret).
|
|
9
|
+
- The callback receives `code`, `state` and `realmId`. Store `realmId` with the tokens.
|
|
10
|
+
- Access tokens last one hour (`expires_in` starts at 3600). Refresh tokens have a rolling 100-day expiry, the value can change on any refresh, and they now have a maximum lifetime of five years; the token response reports the remaining time in `x_refresh_token_expires_in` and `x_refresh_token_hard_expires_in` (seconds). Always store the refresh token returned by the latest refresh, and plan a reconnect before the hard expiry. The developer portal has a reconnect URL field for when users must re-authorise.
|
|
11
|
+
|
|
12
|
+
## Base URLs
|
|
13
|
+
|
|
14
|
+
- Production: `https://quickbooks.api.intuit.com/v3/company/{realmId}/...`
|
|
15
|
+
- Sandbox: `https://sandbox-quickbooks.api.intuit.com/v3/company/{realmId}/...`
|
|
16
|
+
- Send `Accept: application/json`. Support for minor versions 1–74 ended on 1 Aug 2025; a `minorversion` below 75, or none, is answered as minor version 75. Pin `minorversion` explicitly and test before raising it.
|
|
17
|
+
|
|
18
|
+
## Core entities
|
|
19
|
+
|
|
20
|
+
| Need | Entity / endpoint |
|
|
21
|
+
|---|---|
|
|
22
|
+
| Accounts | `Account` via `GET /query?query=select * from Account where Active = true` |
|
|
23
|
+
| Products and services | `Item` (each links to an income account) |
|
|
24
|
+
| Tax | `TaxCode`, `TaxRate` (behaviour differs between US and non-US companies) |
|
|
25
|
+
| Customers | `Customer` |
|
|
26
|
+
| Invoices | `POST /invoice` with `CustomerRef`, `Line[]` (`DetailType: SalesItemLineDetail`, `SalesItemLineDetail.ItemRef`, `Amount`), `DocNumber`, `TxnDate`, `CurrencyRef` |
|
|
27
|
+
| Payments | `POST /payment` with `CustomerRef`, `TotalAmt`, `Line[].LinkedTxn[{ TxnId, TxnType: "Invoice" }]`, `DepositToAccountRef` |
|
|
28
|
+
| Credit notes | `CreditMemo`; refunds `RefundReceipt` |
|
|
29
|
+
| Changes since | `GET /cdc?entities=Invoice,Payment&changedSince=<ISO time>` (look-back limited to 30 days; use `/query` for older ranges) |
|
|
30
|
+
| Batch | `POST /batch` with several operations in one request (Intuit's batch page says up to 10 payloads; its limits page recommends at most 30; keep batches small) |
|
|
31
|
+
|
|
32
|
+
Updates: send `Id` and the current `SyncToken`; add `"sparse": true` to change only the fields you send. A stale `SyncToken` returns a stale object error.
|
|
33
|
+
|
|
34
|
+
## Idempotency
|
|
35
|
+
|
|
36
|
+
Add `?requestid=<unique id>` to write requests. A repeat with the same `requestid` for the same company returns the original response instead of creating a duplicate. Use a deterministic ID per logical operation, unique per company. Maximum length is 50 characters (36 for batch requests), so hash long keys. Intuit does not publish how long it remembers a request ID, so also check for the remote record before retrying a create.
|
|
37
|
+
|
|
38
|
+
## Rate limits
|
|
39
|
+
|
|
40
|
+
Intuit documents 500 requests per minute per realm ID and 10 requests per second per realm ID and app; batch calls are throttled at 40 per minute per realm ID and app. Requests taking over 120 seconds time out. On `429`, Intuit says to wait 60 seconds before retrying; retry with the same `requestid`.
|
|
41
|
+
|
|
42
|
+
## Webhooks
|
|
43
|
+
|
|
44
|
+
- Configure the endpoint and entities in the developer portal; it shows a verifier token per environment.
|
|
45
|
+
- Verify: HMAC-SHA256 of the raw request body keyed with the verifier token, base64-encoded, compared in constant time to the `intuit-signature` header. Reject if the header is missing or the token is unset.
|
|
46
|
+
- Payloads now use the CloudEvents format: a JSON array of events, each with `type` (for example `qbo.invoice.created.v1`), `intuitentityid` and `intuitaccountid` (the realm ID). One notification can carry events for several companies, so route each event by its realm. The legacy format's retirement date moved more than once; check Intuit's current webhook docs if you still receive the old shape.
|
|
47
|
+
- Payloads carry entity types, IDs and operations, not the record. Fetch the entity, or use CDC, to get the data.
|
|
48
|
+
- Respond quickly with `200` and process asynchronously; also run CDC periodically, because webhooks can be missed.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Xero Accounting API
|
|
2
|
+
|
|
3
|
+
Check developer.xero.com for current details, especially scopes, which changed in 2026. Facts below were checked in October 2026 against Xero's [token types](https://developer.xero.com/documentation/guides/oauth2/token-types/), [scopes](https://developer.xero.com/documentation/guides/oauth2/scopes/), [granular scopes FAQ](https://developer.xero.com/faq/granular-scopes), [limits](https://developer.xero.com/documentation/guides/oauth2/limits/), [idempotency](https://developer.xero.com/documentation/guides/idempotent-requests/idempotency/), [troubleshooting](https://developer.xero.com/documentation/guides/oauth2/troubleshooting/) and [webhooks](https://developer.xero.com/documentation/guides/webhooks/overview/) pages.
|
|
4
|
+
|
|
5
|
+
## OAuth 2.0
|
|
6
|
+
|
|
7
|
+
- Authorise: `https://login.xero.com/identity/connect/authorize` with `response_type=code`, `client_id`, `redirect_uri`, `scope`, `state`.
|
|
8
|
+
- Token exchange and refresh: `POST https://identity.xero.com/connect/token`.
|
|
9
|
+
- Include `offline_access` to get a refresh token. Access tokens last up to 30 minutes. Refresh tokens are valid for up to 60 days and rotate on every use; always store the newest one. If you lose the response, the previous refresh token still works for a 30-minute grace period, then the user must re-authorise.
|
|
10
|
+
- After authorising, `GET https://api.xero.com/connections` lists the tenants the user connected. Store each `tenantId`; send it as `xero-tenant-id` on every API call. A user can connect several organisations.
|
|
11
|
+
- **Scopes**: apps created on or after 2 March 2026 use granular scopes (for example `accounting.invoices` instead of the broad `accounting.transactions`). Older apps can request granular scopes from April 2026 and can keep broad scopes until September 2027; existing tokens only gain new scopes when the user re-authorises. Calling an endpoint without the needed scope returns `401` with a `WWW-Authenticate` header naming `insufficient_scope`.
|
|
12
|
+
|
|
13
|
+
## Base URL
|
|
14
|
+
|
|
15
|
+
`https://api.xero.com/api.xro/2.0/...` with `Authorization: Bearer <token>`, `xero-tenant-id`, `Accept: application/json`.
|
|
16
|
+
|
|
17
|
+
## Core endpoints
|
|
18
|
+
|
|
19
|
+
| Need | Endpoint |
|
|
20
|
+
|---|---|
|
|
21
|
+
| Accounts | `GET /Accounts` (use `Code` or `AccountID`; check `Status` is `ACTIVE`) |
|
|
22
|
+
| Tax rates | `GET /TaxRates` (`TaxType` values go on lines) |
|
|
23
|
+
| Items | `GET/POST /Items` |
|
|
24
|
+
| Contacts | `GET/POST /Contacts` (search by `ContactNumber` or email before creating) |
|
|
25
|
+
| Invoices | `POST /Invoices` (create or update) with `Type: "ACCREC"`, `Contact.ContactID`, `Date`, `DueDate`, `InvoiceNumber`, `LineAmountTypes` (`Exclusive`, `Inclusive`, `NoTax`), `LineItems[]` (`Description`, `Quantity`, `UnitAmount`, `AccountCode`, `TaxType`, optionally `TaxAmount`), `Status` (`DRAFT`, `SUBMITTED`, `AUTHORISED`), `CurrencyCode` |
|
|
26
|
+
| Payments | `PUT /Payments` with `Invoice.InvoiceID`, `Account.Code` or `AccountID` (a bank account or one with payments enabled), `Amount`, `Date` |
|
|
27
|
+
| Credit notes | `POST /CreditNotes` with `Type: "ACCRECCREDIT"`; allocate to an invoice with `PUT /CreditNotes/{id}/Allocations` |
|
|
28
|
+
| Changes since | `If-Modified-Since` header on list endpoints, plus `where` filters and paging |
|
|
29
|
+
|
|
30
|
+
Send several records in one request where the endpoint accepts an array; add `?SummarizeErrors=false` to get a status and validation errors per record instead of failing the whole batch. List endpoints page with `?page=` and `pageSize` (default 100, maximum 1000). Some changes (for example `DueDate` or `SentToContact` on paid transactions) don't update `UpdatedDateUTC`, so `If-Modified-Since` can miss them.
|
|
31
|
+
|
|
32
|
+
## Idempotency
|
|
33
|
+
|
|
34
|
+
Send an `Idempotency-Key` header (at most 128 characters) on `POST`, `PUT` and `PATCH`; other methods ignore it. Use a deterministic key per logical operation and keep it for retries. Xero keeps keys for only 6 minutes, and reusing a key with a different request returns `400`, so for retries after that window rely on the stored remote ID check, not the key.
|
|
35
|
+
|
|
36
|
+
## Rate limits
|
|
37
|
+
|
|
38
|
+
Per tenant: 5 concurrent calls, 60 calls per minute, and a daily limit of 1,000 calls on the starter tier or 5,000 on higher tiers; plus an app-wide limit of 10,000 calls per minute across all tenants. Responses include `X-DayLimit-Remaining`, `X-MinLimit-Remaining` and `X-AppMinLimit-Remaining`. A `429` carries `X-Rate-Limit-Problem` naming the limit hit, and `Retry-After` (seconds) when the minute or daily limit was exceeded.
|
|
39
|
+
|
|
40
|
+
## Webhooks
|
|
41
|
+
|
|
42
|
+
- Configure in the developer portal; it gives a webhook key.
|
|
43
|
+
- Verify: HMAC-SHA256 of the raw request body keyed with the webhook key, base64-encoded, compared in constant time to the `x-xero-signature` header. Return a `2xx` for a valid signature and `401` for an invalid one, over HTTPS on port 443, within 5 seconds, with no cookies in the response.
|
|
44
|
+
- "Intent to receive": when you set up the endpoint, Xero sends test requests, some with bad signatures, and only activates the webhook if you answer correctly. Process events asynchronously. Xero retries failed deliveries and disables the webhook after 24 hours of failures.
|
|
45
|
+
- Events carry `resourceId`, `eventCategory` (for example `INVOICE`, `CONTACT`), `eventType` and `tenantId`. Fetch the resource by ID; don't trust the payload as data.
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agent-harness-design
|
|
3
|
+
description: Architecture for the loop around an LLM agent, covering which tools to give it, how to manage and compact its context window, plan-act-verify cycles, permission tiers and sandboxing, tracing and cost limits, and recovery when steps fail or the agent loops. Use when you are building or debugging the harness of a coding agent, task-automation agent or other tool-calling loop (not tuning your own session), or when the agent you built forgets earlier work, runs dangerous commands, or stops before the job is done.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Framework-agnostic; examples are pseudocode.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: ai
|
|
9
|
+
kete-loom/risk: writes-files
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Agent harness design
|
|
14
|
+
|
|
15
|
+
The harness is everything except the model: the loop, the tools, what goes into context, what the agent may do, and how you know what it did. Most agent failures are harness failures. Fix the harness before swapping models or rewriting the prompt.
|
|
16
|
+
|
|
17
|
+
## 0. Pin down the job first
|
|
18
|
+
|
|
19
|
+
Write these down, and **stop and ask the user** for any you can't infer:
|
|
20
|
+
|
|
21
|
+
1. The task family (fix failing tests, triage tickets, research and report) and one concrete example task.
|
|
22
|
+
2. What "done" means in a way a program can check (tests pass, a file exists with fields X, a PR is open).
|
|
23
|
+
3. What the agent must never do (push to main, spend money, email customers, touch production).
|
|
24
|
+
4. Who watches: interactive with a human approving steps, or unattended.
|
|
25
|
+
5. Budget: maximum steps, wall-clock time and token or dollar cost per task.
|
|
26
|
+
|
|
27
|
+
## 1. The loop
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
context = system_prompt + task + tool_definitions
|
|
31
|
+
for step in 1..max_steps:
|
|
32
|
+
response = model(context)
|
|
33
|
+
if response has no tool calls:
|
|
34
|
+
if verify(task) passes: return success
|
|
35
|
+
context += "Verification failed: <output>. Continue."; continue
|
|
36
|
+
for call in response.tool_calls:
|
|
37
|
+
if not permitted(call): result = denied_message(call)
|
|
38
|
+
else: result = run_with_timeout(call)
|
|
39
|
+
context += truncate(result)
|
|
40
|
+
if budget_exceeded or no_progress(last_n_steps): stop_and_report
|
|
41
|
+
return stopped(reason="max_steps")
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Rules:
|
|
45
|
+
|
|
46
|
+
- The loop ends on **verified** success, a budget limit, or a stop condition. Never on the model merely saying it is done.
|
|
47
|
+
- Every tool call has a timeout. A hung command must return an error result, not hang the loop.
|
|
48
|
+
- Feed errors back as tool results so the model can recover. Don't crash the harness on a tool error.
|
|
49
|
+
- Detect loops: the same tool call with the same arguments three times, or N steps with no new file change or new information, triggers a stop or a forced re-plan.
|
|
50
|
+
|
|
51
|
+
## 2. Tools
|
|
52
|
+
|
|
53
|
+
- Start with few, general, well-described tools: read file, search (by name and by content), edit file (by exact replacement or patch), run command, and optionally fetch URL. Add a specialised tool only when traces show the model repeatedly failing at a job a tool would make reliable.
|
|
54
|
+
- Each tool returns compact, model-readable output with explicit truncation markers: `[output truncated: 4,812 more lines; use offset=200 to read on]`.
|
|
55
|
+
- Edits should fail loudly when the target text isn't found or isn't unique, and should never silently rewrite a whole file the model hasn't read.
|
|
56
|
+
- Prefer structured results (exit code, stdout, stderr separated) over a merged blob.
|
|
57
|
+
- Tool descriptions say when to use the tool and when to use a sibling instead. Tool naming and schema rules for MCP-based tools are covered by the `mcp-server-patterns` skill.
|
|
58
|
+
|
|
59
|
+
## 3. Context management
|
|
60
|
+
|
|
61
|
+
The context window is the agent's working memory. Budget it.
|
|
62
|
+
|
|
63
|
+
- Put stable material first (system prompt, tool definitions, project instructions) so provider prompt caching can reuse it; append the conversation after.
|
|
64
|
+
- Load project knowledge on demand: a short index of available docs or skills in context, full text only when the model asks for it.
|
|
65
|
+
- Truncate large tool outputs at the source and let the model page through. Never paste a whole log or file by default.
|
|
66
|
+
- When the context nears its limit, compact: summarise completed steps (decisions, files changed, open questions, current plan) into a short state note, keep the last few turns verbatim, and drop the rest. Test that a compacted agent can still finish a task.
|
|
67
|
+
- Keep durable state outside the context: a plan or todo file, a scratch notes file, git commits. The agent re-reads them after compaction or restart.
|
|
68
|
+
- For large searches or research, run a sub-agent in its own context and return only its summary to the parent.
|
|
69
|
+
|
|
70
|
+
## 4. Planning and verification
|
|
71
|
+
|
|
72
|
+
- For tasks over a few steps, have the agent write a short plan (numbered steps, each with how it will be checked) before acting, and update it as it goes.
|
|
73
|
+
- Verification is a command, not an opinion: run the tests, the type checker, the linter, a script that checks the output. The harness runs `verify` itself at the end; the model's claim of success is not enough.
|
|
74
|
+
- Require the agent to reproduce a bug (a failing test or command) before fixing it, and re-run that same check after.
|
|
75
|
+
- For unattended runs, add a final review step: a separate model call (or sub-agent) reads the diff against the task and lists gaps.
|
|
76
|
+
|
|
77
|
+
## 5. Permissions and sandboxing
|
|
78
|
+
|
|
79
|
+
Tier every action and enforce the tier in the harness, not in the prompt:
|
|
80
|
+
|
|
81
|
+
| Tier | Examples | Default |
|
|
82
|
+
|---|---|---|
|
|
83
|
+
| Read | read files, search, list, `git status`, `git diff` | allow |
|
|
84
|
+
| Local write | edit files in the workspace, run tests and builds | allow in a sandbox; ask when interactive and outside the sandbox |
|
|
85
|
+
| External or irreversible | `git push`, deploys, package publish, network calls to new hosts, sending messages, payments, deleting outside the workspace | always ask a human, or deny when unattended |
|
|
86
|
+
|
|
87
|
+
- Run commands in a sandbox: a container or VM, or an OS sandbox, with the workspace as the only writable directory and network off or restricted to an allowlist.
|
|
88
|
+
- Keep secrets out of the sandbox. If a task needs a credential, inject a scoped, short-lived one, and never echo it into the context.
|
|
89
|
+
- Allowlist commands by parsed program and arguments, not by string prefix (`git status; rm -rf ~` starts with `git status`).
|
|
90
|
+
- Treat content the agent reads (web pages, issues, files from the repo, tool results) as untrusted. It can contain instructions. Permissions must hold even if the model is fully convinced by injected text.
|
|
91
|
+
- Log every denial; frequent denials mean the tier rules or the tool set are wrong.
|
|
92
|
+
|
|
93
|
+
## 6. Observability
|
|
94
|
+
|
|
95
|
+
- Trace every step: model input size, output, each tool call with arguments, result size, duration, exit code, tokens and cost. Store traces per task with a run id.
|
|
96
|
+
- Record the final outcome against the "done" check from step 0, so you can compute a success rate per task family.
|
|
97
|
+
- Keep a small benchmark of real tasks with checkable outcomes and re-run it on every harness, prompt, tool or model change. Report success rate, median steps and cost, and the tasks that regressed. The `llm-evals` skill covers scoring in depth.
|
|
98
|
+
|
|
99
|
+
## 7. Failure recovery
|
|
100
|
+
|
|
101
|
+
- Retry transient tool and API failures (rate limits, timeouts, 5xx) with backoff and a cap. Do not retry the model's own wrong action unchanged.
|
|
102
|
+
- Checkpoint progress (commit to a work branch, save the plan file) so a crashed run resumes instead of restarting.
|
|
103
|
+
- On a stop condition, return a structured report: what was done, what was verified, what failed, what's left, and the last error. Never report partial work as success.
|
|
104
|
+
- If the same task fails the same way across runs, read the traces before changing anything; the fix is usually a tool's output format, a missing tool, or a missing instruction.
|
|
105
|
+
|
|
106
|
+
## Never
|
|
107
|
+
|
|
108
|
+
- Never let the model's "I'm done" end the loop without the harness running verification.
|
|
109
|
+
- Never enforce permissions only through the system prompt.
|
|
110
|
+
- Never give an unattended agent push, deploy, payment or messaging rights without a human gate.
|
|
111
|
+
- Never run agent commands on a host with the user's real credentials and home directory writable.
|
|
112
|
+
- Never change harness, prompt and model at once; change one and re-run the benchmark.
|
|
113
|
+
|
|
114
|
+
## Report format
|
|
115
|
+
|
|
116
|
+
When you design or change a harness, report:
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
Task family: <...> Done check: <command or rule>
|
|
120
|
+
Tools: <list> Max steps / time / cost: <...>
|
|
121
|
+
Permission tiers: read=<allow> write=<...> external=<...> Sandbox: <...>
|
|
122
|
+
Context strategy: <truncation, compaction trigger, external state>
|
|
123
|
+
Benchmark: <n tasks> success <before> → <after>, median cost <before> → <after>
|
|
124
|
+
Known gaps: <...>
|
|
125
|
+
```
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Design the tool set and agent loop for a coding agent that fixes failing CI builds",
|
|
4
|
+
"Our in-house agent framework loses track of finished steps after it compacts the context, how should the harness keep state?",
|
|
5
|
+
"How do I sandbox shell commands my task agent runs and decide which need human approval?",
|
|
6
|
+
"The agent says it's finished but the tests still fail, how do we add a verification loop?",
|
|
7
|
+
"Add tracing and cost limits to our tool-calling agent so runaway loops get stopped",
|
|
8
|
+
"We're building an autonomous ticket-triage agent, what should the harness look like?"
|
|
9
|
+
],
|
|
10
|
+
"should_not_trigger": [
|
|
11
|
+
"Write an MCP server that exposes our Postgres database as tools",
|
|
12
|
+
"Build a RAG pipeline over our help center articles with citations",
|
|
13
|
+
"Score our agent's transcripts against a rubric and track pass rate over time",
|
|
14
|
+
"Run several sub-agents in parallel to refactor these five modules",
|
|
15
|
+
"Rewrite this system prompt so the model follows the output format",
|
|
16
|
+
"Plan the implementation of a new billing feature step by step",
|
|
17
|
+
"My Claude Code session is nearly out of context, what should I drop or summarise?",
|
|
18
|
+
"Set up a loop that keeps re-running the agent overnight until every test passes",
|
|
19
|
+
"Write a handoff note so the next session can pick up where I stopped"
|
|
20
|
+
]
|
|
21
|
+
}
|