@ketecode/loom 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +616 -2
- package/agents/accessibility-reviewer/AGENT.md +70 -0
- package/agents/accessibility-reviewer/evals/triggers.json +15 -0
- package/agents/agent-evaluator/AGENT.md +74 -0
- package/agents/agent-evaluator/evals/triggers.json +15 -0
- package/agents/architect/AGENT.md +82 -0
- package/agents/architect/evals/triggers.json +17 -0
- package/agents/billing-reviewer/AGENT.md +68 -0
- package/agents/billing-reviewer/evals/triggers.json +16 -0
- package/agents/code-reviewer/AGENT.md +51 -0
- package/agents/code-reviewer/evals/behavior.json +60 -0
- package/agents/code-reviewer/evals/triggers.json +14 -0
- package/agents/code-simplifier/AGENT.md +74 -0
- package/agents/code-simplifier/evals/triggers.json +15 -0
- package/agents/cpp-build-resolver/AGENT.md +73 -0
- package/agents/cpp-build-resolver/evals/triggers.json +16 -0
- package/agents/cpp-reviewer/AGENT.md +59 -0
- package/agents/cpp-reviewer/evals/triggers.json +16 -0
- package/agents/csharp-build-resolver/AGENT.md +84 -0
- package/agents/csharp-build-resolver/evals/triggers.json +17 -0
- package/agents/csharp-reviewer/AGENT.md +88 -0
- package/agents/csharp-reviewer/evals/triggers.json +17 -0
- package/agents/dart-build-resolver/AGENT.md +80 -0
- package/agents/dart-build-resolver/evals/triggers.json +17 -0
- package/agents/dart-reviewer/AGENT.md +66 -0
- package/agents/dart-reviewer/evals/triggers.json +17 -0
- package/agents/database-reviewer/AGENT.md +72 -0
- package/agents/database-reviewer/evals/triggers.json +16 -0
- package/agents/django-reviewer/AGENT.md +61 -0
- package/agents/django-reviewer/evals/triggers.json +15 -0
- package/agents/doc-updater/AGENT.md +92 -0
- package/agents/doc-updater/evals/triggers.json +14 -0
- package/agents/e2e-runner/AGENT.md +88 -0
- package/agents/e2e-runner/evals/triggers.json +16 -0
- package/agents/fastapi-reviewer/AGENT.md +63 -0
- package/agents/fastapi-reviewer/evals/triggers.json +15 -0
- package/agents/flutter-reviewer/AGENT.md +70 -0
- package/agents/flutter-reviewer/evals/triggers.json +15 -0
- package/agents/fsharp-build-resolver/AGENT.md +81 -0
- package/agents/fsharp-build-resolver/evals/triggers.json +15 -0
- package/agents/fsharp-reviewer/AGENT.md +77 -0
- package/agents/fsharp-reviewer/evals/triggers.json +15 -0
- package/agents/go-build-resolver/AGENT.md +85 -0
- package/agents/go-build-resolver/evals/triggers.json +16 -0
- package/agents/go-reviewer/AGENT.md +66 -0
- package/agents/go-reviewer/evals/triggers.json +16 -0
- package/agents/healthcare-reviewer/AGENT.md +65 -0
- package/agents/healthcare-reviewer/evals/triggers.json +16 -0
- package/agents/i18n-reviewer/AGENT.md +64 -0
- package/agents/i18n-reviewer/evals/triggers.json +16 -0
- package/agents/inbox-triager/AGENT.md +98 -0
- package/agents/inbox-triager/evals/triggers.json +16 -0
- package/agents/infra-reviewer/AGENT.md +93 -0
- package/agents/infra-reviewer/evals/triggers.json +15 -0
- package/agents/java-build-resolver/AGENT.md +82 -0
- package/agents/java-build-resolver/evals/triggers.json +16 -0
- package/agents/java-reviewer/AGENT.md +64 -0
- package/agents/java-reviewer/evals/triggers.json +16 -0
- package/agents/kotlin-build-resolver/AGENT.md +89 -0
- package/agents/kotlin-build-resolver/evals/triggers.json +16 -0
- package/agents/kotlin-reviewer/AGENT.md +75 -0
- package/agents/kotlin-reviewer/evals/triggers.json +16 -0
- package/agents/mle-reviewer/AGENT.md +68 -0
- package/agents/mle-reviewer/evals/triggers.json +16 -0
- package/agents/network-config-reviewer/AGENT.md +68 -0
- package/agents/network-config-reviewer/evals/triggers.json +17 -0
- package/agents/payments-reviewer/AGENT.md +64 -0
- package/agents/payments-reviewer/evals/triggers.json +16 -0
- package/agents/performance-optimizer/AGENT.md +86 -0
- package/agents/performance-optimizer/evals/triggers.json +16 -0
- package/agents/perl-build-resolver/AGENT.md +84 -0
- package/agents/perl-build-resolver/evals/triggers.json +15 -0
- package/agents/perl-reviewer/AGENT.md +77 -0
- package/agents/perl-reviewer/evals/triggers.json +15 -0
- package/agents/php-build-resolver/AGENT.md +88 -0
- package/agents/php-build-resolver/evals/triggers.json +16 -0
- package/agents/php-reviewer/AGENT.md +61 -0
- package/agents/php-reviewer/evals/triggers.json +15 -0
- package/agents/planner/AGENT.md +75 -0
- package/agents/planner/evals/triggers.json +17 -0
- package/agents/pr-test-analyzer/AGENT.md +82 -0
- package/agents/pr-test-analyzer/evals/triggers.json +16 -0
- package/agents/python-build-resolver/AGENT.md +87 -0
- package/agents/python-build-resolver/evals/triggers.json +16 -0
- package/agents/python-reviewer/AGENT.md +63 -0
- package/agents/python-reviewer/evals/triggers.json +15 -0
- package/agents/rag-reviewer/AGENT.md +71 -0
- package/agents/rag-reviewer/evals/triggers.json +16 -0
- package/agents/react-reviewer/AGENT.md +70 -0
- package/agents/react-reviewer/evals/triggers.json +16 -0
- package/agents/refactor-cleaner/AGENT.md +82 -0
- package/agents/refactor-cleaner/evals/triggers.json +16 -0
- package/agents/ruby-build-resolver/AGENT.md +93 -0
- package/agents/ruby-build-resolver/evals/triggers.json +16 -0
- package/agents/ruby-reviewer/AGENT.md +62 -0
- package/agents/ruby-reviewer/evals/triggers.json +16 -0
- package/agents/rust-build-resolver/AGENT.md +98 -0
- package/agents/rust-build-resolver/evals/triggers.json +16 -0
- package/agents/rust-reviewer/AGENT.md +78 -0
- package/agents/rust-reviewer/evals/triggers.json +15 -0
- package/agents/security-reviewer/AGENT.md +84 -0
- package/agents/security-reviewer/evals/triggers.json +16 -0
- package/agents/silent-failure-hunter/AGENT.md +66 -0
- package/agents/silent-failure-hunter/evals/triggers.json +16 -0
- package/agents/solidity-reviewer/AGENT.md +70 -0
- package/agents/solidity-reviewer/evals/triggers.json +16 -0
- package/agents/spec-reviewer/AGENT.md +95 -0
- package/agents/spec-reviewer/evals/behavior.json +57 -0
- package/agents/spec-reviewer/evals/triggers.json +16 -0
- package/agents/swift-build-resolver/AGENT.md +85 -0
- package/agents/swift-build-resolver/evals/triggers.json +15 -0
- package/agents/swift-reviewer/AGENT.md +75 -0
- package/agents/swift-reviewer/evals/triggers.json +15 -0
- package/agents/task-implementer/AGENT.md +89 -0
- package/agents/task-implementer/evals/behavior.json +47 -0
- package/agents/task-implementer/evals/triggers.json +16 -0
- package/agents/typescript-build-resolver/AGENT.md +76 -0
- package/agents/typescript-build-resolver/evals/triggers.json +15 -0
- package/agents/typescript-reviewer/AGENT.md +76 -0
- package/agents/typescript-reviewer/evals/triggers.json +15 -0
- package/agents/vue-reviewer/AGENT.md +75 -0
- package/agents/vue-reviewer/evals/triggers.json +15 -0
- package/bin/kete-loom.js +723 -0
- package/commands/aside.md +19 -0
- package/commands/brainstorm.md +25 -0
- package/commands/build-fix.md +26 -0
- package/commands/campaign.md +19 -0
- package/commands/changelog.md +36 -0
- package/commands/checkpoint.md +26 -0
- package/commands/codemap.md +25 -0
- package/commands/commit.md +26 -0
- package/commands/debug.md +27 -0
- package/commands/deps-audit.md +32 -0
- package/commands/dual-review.md +34 -0
- package/commands/epic-decompose.md +21 -0
- package/commands/explain.md +37 -0
- package/commands/feature-dev.md +23 -0
- package/commands/finish-branch.md +26 -0
- package/commands/fix-bug.md +38 -0
- package/commands/hookify.md +23 -0
- package/commands/i18n-check.md +39 -0
- package/commands/issue-sync.md +22 -0
- package/commands/jira.md +19 -0
- package/commands/learn.md +23 -0
- package/commands/loom.md +21 -0
- package/commands/loop.md +20 -0
- package/commands/model-route.md +27 -0
- package/commands/onboard.md +35 -0
- package/commands/orchestrate.md +21 -0
- package/commands/plan-feature.md +36 -0
- package/commands/postmortem.md +42 -0
- package/commands/pr-describe.md +39 -0
- package/commands/pr.md +22 -0
- package/commands/prd.md +41 -0
- package/commands/production-readiness.md +45 -0
- package/commands/project-init.md +21 -0
- package/commands/refactor-clean.md +24 -0
- package/commands/resume-session.md +22 -0
- package/commands/review.md +35 -0
- package/commands/save-session.md +37 -0
- package/commands/security-scan.md +32 -0
- package/commands/sessions.md +21 -0
- package/commands/skill-create.md +21 -0
- package/commands/tdd.md +36 -0
- package/commands/test-coverage.md +24 -0
- package/commands/threat-model.md +36 -0
- package/commands/update-docs.md +25 -0
- package/commands/usage-report.md +43 -0
- package/commands/verify.md +21 -0
- package/hooks/block-dangerous-commands/HOOK.md +30 -0
- package/hooks/block-dangerous-commands/cases.json +50 -0
- package/hooks/block-dangerous-commands/hook.js +75 -0
- package/hooks/block-foreground-servers/HOOK.md +34 -0
- package/hooks/block-foreground-servers/cases.json +31 -0
- package/hooks/block-foreground-servers/hook.js +41 -0
- package/hooks/block-no-verify/HOOK.md +25 -0
- package/hooks/block-no-verify/cases.json +30 -0
- package/hooks/block-no-verify/hook.js +43 -0
- package/hooks/capture-lessons/HOOK.md +24 -0
- package/hooks/capture-lessons/hook.js +48 -0
- package/hooks/format-on-edit/HOOK.md +24 -0
- package/hooks/format-on-edit/hook.js +89 -0
- package/hooks/guard-secrets/HOOK.md +19 -0
- package/hooks/guard-secrets/cases.json +110 -0
- package/hooks/guard-secrets/hook.js +44 -0
- package/hooks/load-session-context/HOOK.md +20 -0
- package/hooks/load-session-context/hook.js +56 -0
- package/hooks/notify-on-stop/HOOK.md +25 -0
- package/hooks/notify-on-stop/hook.js +27 -0
- package/hooks/protect-files/HOOK.md +24 -0
- package/hooks/protect-files/cases.json +27 -0
- package/hooks/protect-files/hook.js +39 -0
- package/hooks/protect-lint-config/HOOK.md +29 -0
- package/hooks/protect-lint-config/cases.json +18 -0
- package/hooks/protect-lint-config/fixtures/.eslintrc.json +1 -0
- package/hooks/protect-lint-config/fixtures/.golangci.yml +1 -0
- package/hooks/protect-lint-config/fixtures/.prettierrc +1 -0
- package/hooks/protect-lint-config/fixtures/.rubocop.yml +1 -0
- package/hooks/protect-lint-config/fixtures/biome.json +1 -0
- package/hooks/protect-lint-config/fixtures/eslint.config.mjs +1 -0
- package/hooks/protect-lint-config/fixtures/ruff.toml +1 -0
- package/hooks/protect-lint-config/hook.js +25 -0
- package/hooks/read-before-edit/HOOK.md +26 -0
- package/hooks/read-before-edit/cases.json +15 -0
- package/hooks/read-before-edit/hook.js +50 -0
- package/hooks/run.js +148 -0
- package/hooks/verify-before-stop/HOOK.md +32 -0
- package/hooks/verify-before-stop/hook.js +70 -0
- package/mcp/atlassian.json +11 -0
- package/mcp/chrome-devtools.json +18 -0
- package/mcp/clickhouse.json +11 -0
- package/mcp/cloudflare.json +11 -0
- package/mcp/context7.json +11 -0
- package/mcp/exa.json +11 -0
- package/mcp/fetch.json +17 -0
- package/mcp/figma.json +11 -0
- package/mcp/firecrawl.json +11 -0
- package/mcp/git.json +17 -0
- package/mcp/github.json +11 -0
- package/mcp/linear.json +11 -0
- package/mcp/memory.json +18 -0
- package/mcp/notion.json +11 -0
- package/mcp/playwright.json +18 -0
- package/mcp/sentry.json +11 -0
- package/mcp/stripe.json +11 -0
- package/mcp/supabase.json +11 -0
- package/mcp/time.json +17 -0
- package/mcp/vercel.json +11 -0
- package/package.json +61 -4
- package/profiles.json +214 -0
- package/rules/common.md +21 -0
- package/rules/cpp.md +29 -0
- package/rules/csharp.md +25 -0
- package/rules/dart.md +29 -0
- package/rules/fsharp.md +28 -0
- package/rules/git.md +26 -0
- package/rules/go.md +29 -0
- package/rules/java.md +29 -0
- package/rules/kotlin.md +27 -0
- package/rules/perl.md +26 -0
- package/rules/php.md +28 -0
- package/rules/python.md +30 -0
- package/rules/ruby.md +27 -0
- package/rules/rust.md +26 -0
- package/rules/security.md +29 -0
- package/rules/swift.md +28 -0
- package/rules/testing.md +25 -0
- package/rules/typescript.md +29 -0
- package/rules/use-skills.md +23 -0
- package/schemas/skill-frontmatter.schema.json +52 -0
- package/scripts/lib/audit.js +96 -0
- package/scripts/lib/behavior.js +52 -0
- package/scripts/lib/frontmatter.js +65 -0
- package/scripts/lib/hooks-install.js +294 -0
- package/scripts/lib/i18n.js +51 -0
- package/scripts/lib/inventory.js +85 -0
- package/scripts/lib/lint.js +180 -0
- package/scripts/lib/mcp-install.js +288 -0
- package/scripts/lib/profiles.js +128 -0
- package/scripts/lib/render.js +92 -0
- package/scripts/lib/rules-install.js +118 -0
- package/scripts/lib/skills.js +87 -0
- package/scripts/lib/targets.js +123 -0
- package/skills/accounting-api-integration/SKILL.md +81 -0
- package/skills/accounting-api-integration/evals/triggers.json +17 -0
- package/skills/accounting-api-integration/references/quickbooks.md +48 -0
- package/skills/accounting-api-integration/references/xero.md +45 -0
- package/skills/agent-failure-debugging/SKILL.md +92 -0
- package/skills/agent-failure-debugging/evals/triggers.json +16 -0
- package/skills/agent-harness-design/SKILL.md +125 -0
- package/skills/agent-harness-design/evals/triggers.json +21 -0
- package/skills/agent-outbound-messaging/SKILL.md +92 -0
- package/skills/agent-outbound-messaging/evals/triggers.json +16 -0
- package/skills/agent-security/SKILL.md +117 -0
- package/skills/agent-security/evals/triggers.json +16 -0
- package/skills/agent-security/references/host-configs.md +37 -0
- package/skills/ai-media-generation/SKILL.md +89 -0
- package/skills/ai-media-generation/evals/triggers.json +16 -0
- package/skills/ai-media-generation/references/job-pipeline.md +76 -0
- package/skills/angular-patterns/SKILL.md +122 -0
- package/skills/angular-patterns/evals/triggers.json +16 -0
- package/skills/api-client-integration/SKILL.md +86 -0
- package/skills/api-client-integration/evals/triggers.json +16 -0
- package/skills/api-client-integration/references/resilience.md +57 -0
- package/skills/api-design/SKILL.md +96 -0
- package/skills/api-design/evals/triggers.json +18 -0
- package/skills/api-design/references/conventions.md +133 -0
- package/skills/architecture-decision-records/SKILL.md +98 -0
- package/skills/architecture-decision-records/evals/triggers.json +17 -0
- package/skills/article-writing/SKILL.md +108 -0
- package/skills/article-writing/evals/triggers.json +16 -0
- package/skills/aspnet-core-patterns/SKILL.md +149 -0
- package/skills/aspnet-core-patterns/evals/triggers.json +16 -0
- package/skills/auth-patterns/SKILL.md +104 -0
- package/skills/auth-patterns/evals/triggers.json +17 -0
- package/skills/auth-patterns/references/oauth-oidc.md +64 -0
- package/skills/autonomous-loops/SKILL.md +99 -0
- package/skills/autonomous-loops/evals/triggers.json +14 -0
- package/skills/aws-patterns/SKILL.md +91 -0
- package/skills/aws-patterns/evals/triggers.json +16 -0
- package/skills/azure-patterns/SKILL.md +86 -0
- package/skills/azure-patterns/evals/triggers.json +16 -0
- package/skills/benchmark-methodology/SKILL.md +88 -0
- package/skills/benchmark-methodology/evals/triggers.json +16 -0
- package/skills/benchmark-methodology/references/language-harnesses.md +130 -0
- package/skills/bgp-diagnostics/SKILL.md +84 -0
- package/skills/bgp-diagnostics/evals/triggers.json +18 -0
- package/skills/bgp-diagnostics/references/bgp-reference.md +81 -0
- package/skills/bioinformatics-workflows/SKILL.md +108 -0
- package/skills/bioinformatics-workflows/evals/triggers.json +16 -0
- package/skills/bioinformatics-workflows/references/commands.md +71 -0
- package/skills/bioinformatics-workflows/references/formats.md +24 -0
- package/skills/bioinformatics-workflows/references/workflow-managers.md +107 -0
- package/skills/blender-automation/SKILL.md +100 -0
- package/skills/blender-automation/evals/triggers.json +16 -0
- package/skills/blender-automation/references/batch-and-render.md +77 -0
- package/skills/blender-automation/references/bpy-inspection.md +91 -0
- package/skills/blender-automation/references/rig-and-retarget-checks.md +23 -0
- package/skills/brand-strategy/SKILL.md +83 -0
- package/skills/brand-strategy/evals/triggers.json +16 -0
- package/skills/brand-voice/SKILL.md +112 -0
- package/skills/brand-voice/evals/triggers.json +16 -0
- package/skills/browser-qa/SKILL.md +99 -0
- package/skills/browser-qa/evals/triggers.json +16 -0
- package/skills/bun-runtime/SKILL.md +93 -0
- package/skills/bun-runtime/evals/triggers.json +16 -0
- package/skills/change-impact-analysis/SKILL.md +89 -0
- package/skills/change-impact-analysis/evals/triggers.json +16 -0
- package/skills/change-impact-analysis/references/graph-commands.md +28 -0
- package/skills/cisco-ios-config/SKILL.md +101 -0
- package/skills/cisco-ios-config/evals/triggers.json +18 -0
- package/skills/cisco-ios-config/references/verification.md +63 -0
- package/skills/clickhouse-patterns/SKILL.md +101 -0
- package/skills/clickhouse-patterns/evals/triggers.json +18 -0
- package/skills/clickhouse-patterns/references/engines-and-views.md +138 -0
- package/skills/clinical-decision-support/SKILL.md +90 -0
- package/skills/clinical-decision-support/evals/triggers.json +16 -0
- package/skills/clinical-decision-support/references/cds-hooks.md +76 -0
- package/skills/clinical-decision-support/references/regulatory-boundaries.md +37 -0
- package/skills/code-tour/SKILL.md +97 -0
- package/skills/code-tour/evals/triggers.json +14 -0
- package/skills/codebase-onboarding/SKILL.md +112 -0
- package/skills/codebase-onboarding/evals/triggers.json +14 -0
- package/skills/cold-outreach-sequences/SKILL.md +90 -0
- package/skills/cold-outreach-sequences/evals/triggers.json +16 -0
- package/skills/content-repurposing/SKILL.md +82 -0
- package/skills/content-repurposing/evals/triggers.json +16 -0
- package/skills/context-budget/SKILL.md +84 -0
- package/skills/context-budget/evals/triggers.json +14 -0
- package/skills/contract-drafting/SKILL.md +96 -0
- package/skills/contract-drafting/evals/triggers.json +16 -0
- package/skills/contract-drafting/references/term-sheets.md +68 -0
- package/skills/contract-first-development/SKILL.md +86 -0
- package/skills/contract-first-development/evals/triggers.json +16 -0
- package/skills/contract-first-development/references/tooling.md +46 -0
- package/skills/conventional-commits/SKILL.md +144 -0
- package/skills/conventional-commits/evals/triggers.json +16 -0
- package/skills/cpp-patterns/SKILL.md +129 -0
- package/skills/cpp-patterns/evals/triggers.json +16 -0
- package/skills/cpp-patterns/references/cmake-and-tooling.md +88 -0
- package/skills/cpp-patterns/references/undefined-behaviour.md +75 -0
- package/skills/cpp-testing/SKILL.md +131 -0
- package/skills/cpp-testing/evals/triggers.json +16 -0
- package/skills/csharp-patterns/SKILL.md +110 -0
- package/skills/csharp-patterns/evals/triggers.json +17 -0
- package/skills/csharp-patterns/references/analyzers.md +59 -0
- package/skills/csharp-testing/SKILL.md +85 -0
- package/skills/csharp-testing/evals/triggers.json +17 -0
- package/skills/csharp-testing/references/integration-tests.md +77 -0
- package/skills/css-architecture/SKILL.md +143 -0
- package/skills/css-architecture/evals/triggers.json +16 -0
- package/skills/customs-trade-compliance/SKILL.md +95 -0
- package/skills/customs-trade-compliance/evals/triggers.json +16 -0
- package/skills/customs-trade-compliance/references/incoterms-2020.md +42 -0
- package/skills/dart-patterns/SKILL.md +157 -0
- package/skills/dart-patterns/evals/triggers.json +18 -0
- package/skills/dart-testing/SKILL.md +164 -0
- package/skills/dart-testing/evals/triggers.json +18 -0
- package/skills/data-analysis-notebooks/SKILL.md +113 -0
- package/skills/data-analysis-notebooks/evals/triggers.json +16 -0
- package/skills/data-analysis-notebooks/references/dataframe-pitfalls.md +49 -0
- package/skills/data-analysis-notebooks/references/statistics-pitfalls.md +24 -0
- package/skills/data-pipelines/SKILL.md +90 -0
- package/skills/data-pipelines/evals/triggers.json +16 -0
- package/skills/data-pipelines/references/orchestrators.md +64 -0
- package/skills/database-migrations/SKILL.md +102 -0
- package/skills/database-migrations/evals/triggers.json +16 -0
- package/skills/database-migrations/references/recipes.md +98 -0
- package/skills/database-migrations/references/tools.md +21 -0
- package/skills/dbt-patterns/SKILL.md +96 -0
- package/skills/dbt-patterns/evals/triggers.json +16 -0
- package/skills/dbt-patterns/references/yaml-examples.md +114 -0
- package/skills/decision-council/SKILL.md +98 -0
- package/skills/decision-council/evals/triggers.json +16 -0
- package/skills/deep-research/SKILL.md +107 -0
- package/skills/deep-research/evals/triggers.json +14 -0
- package/skills/dependency-audit/SKILL.md +103 -0
- package/skills/dependency-audit/evals/triggers.json +16 -0
- package/skills/dependency-audit/references/tools.md +124 -0
- package/skills/deployment-strategies/SKILL.md +108 -0
- package/skills/deployment-strategies/evals/triggers.json +16 -0
- package/skills/design-brainstorming/SKILL.md +132 -0
- package/skills/design-brainstorming/evals/behavior.json +55 -0
- package/skills/design-brainstorming/evals/triggers.json +16 -0
- package/skills/design-brainstorming/references/visual-mockups.md +34 -0
- package/skills/desktop-app-testing/SKILL.md +104 -0
- package/skills/desktop-app-testing/evals/triggers.json +16 -0
- package/skills/desktop-app-testing/references/drivers.md +81 -0
- package/skills/django-patterns/SKILL.md +123 -0
- package/skills/django-patterns/evals/triggers.json +16 -0
- package/skills/docker-patterns/SKILL.md +132 -0
- package/skills/docker-patterns/evals/triggers.json +16 -0
- package/skills/docker-patterns/references/dockerfiles.md +105 -0
- package/skills/document-processing/SKILL.md +100 -0
- package/skills/document-processing/evals/triggers.json +17 -0
- package/skills/document-processing/references/extraction-and-ocr.md +71 -0
- package/skills/document-processing/references/forms-and-conversion.md +69 -0
- package/skills/document-processing/references/redaction.md +61 -0
- package/skills/e2e-testing-playwright/SKILL.md +94 -0
- package/skills/e2e-testing-playwright/evals/triggers.json +16 -0
- package/skills/e2e-testing-playwright/references/config-and-ci.md +129 -0
- package/skills/ef-core-patterns/SKILL.md +117 -0
- package/skills/ef-core-patterns/evals/triggers.json +16 -0
- package/skills/email-deliverability/SKILL.md +99 -0
- package/skills/email-deliverability/evals/triggers.json +17 -0
- package/skills/email-deliverability/references/dns-records.md +85 -0
- package/skills/energy-procurement/SKILL.md +106 -0
- package/skills/energy-procurement/evals/triggers.json +16 -0
- package/skills/error-handling-patterns/SKILL.md +112 -0
- package/skills/error-handling-patterns/evals/triggers.json +18 -0
- package/skills/error-handling-patterns/references/language-idioms.md +49 -0
- package/skills/estimation-and-scoping/SKILL.md +97 -0
- package/skills/estimation-and-scoping/evals/triggers.json +14 -0
- package/skills/evm-dapp-integration/SKILL.md +73 -0
- package/skills/evm-dapp-integration/evals/triggers.json +16 -0
- package/skills/fastapi-patterns/SKILL.md +127 -0
- package/skills/fastapi-patterns/evals/triggers.json +16 -0
- package/skills/ffmpeg-media-processing/SKILL.md +94 -0
- package/skills/ffmpeg-media-processing/evals/triggers.json +16 -0
- package/skills/ffmpeg-media-processing/references/recipes.md +112 -0
- package/skills/fhir-integration/SKILL.md +81 -0
- package/skills/fhir-integration/evals/triggers.json +16 -0
- package/skills/fhir-integration/references/search-and-bundles.md +73 -0
- package/skills/fhir-integration/references/smart-on-fhir.md +50 -0
- package/skills/finishing-a-branch/SKILL.md +127 -0
- package/skills/finishing-a-branch/evals/behavior.json +49 -0
- package/skills/finishing-a-branch/evals/triggers.json +16 -0
- package/skills/flask-patterns/SKILL.md +132 -0
- package/skills/flask-patterns/evals/triggers.json +16 -0
- package/skills/flutter-patterns/SKILL.md +99 -0
- package/skills/flutter-patterns/evals/triggers.json +16 -0
- package/skills/flutterwave-integration/SKILL.md +75 -0
- package/skills/flutterwave-integration/evals/triggers.json +16 -0
- package/skills/flutterwave-integration/references/api.md +73 -0
- package/skills/flutterwave-integration/references/webhooks.md +49 -0
- package/skills/freight-carrier-management/SKILL.md +107 -0
- package/skills/freight-carrier-management/evals/triggers.json +16 -0
- package/skills/fsharp-patterns/SKILL.md +133 -0
- package/skills/fsharp-patterns/evals/triggers.json +16 -0
- package/skills/fsharp-testing/SKILL.md +136 -0
- package/skills/fsharp-testing/evals/triggers.json +16 -0
- package/skills/gcp-patterns/SKILL.md +86 -0
- package/skills/gcp-patterns/evals/triggers.json +16 -0
- package/skills/git-workflow/SKILL.md +114 -0
- package/skills/git-workflow/evals/triggers.json +16 -0
- package/skills/git-worktrees/SKILL.md +130 -0
- package/skills/git-worktrees/evals/behavior.json +56 -0
- package/skills/git-worktrees/evals/triggers.json +16 -0
- package/skills/github-actions-ci/SKILL.md +117 -0
- package/skills/github-actions-ci/evals/triggers.json +16 -0
- package/skills/github-api-automation/SKILL.md +101 -0
- package/skills/github-api-automation/evals/triggers.json +17 -0
- package/skills/go-patterns/SKILL.md +118 -0
- package/skills/go-patterns/evals/triggers.json +17 -0
- package/skills/go-patterns/references/concurrency.md +162 -0
- package/skills/go-testing/SKILL.md +154 -0
- package/skills/go-testing/evals/triggers.json +17 -0
- package/skills/google-workspace-integration/SKILL.md +65 -0
- package/skills/google-workspace-integration/evals/triggers.json +17 -0
- package/skills/google-workspace-integration/references/api.md +121 -0
- package/skills/harmonyos-arkts/SKILL.md +117 -0
- package/skills/harmonyos-arkts/evals/triggers.json +16 -0
- package/skills/harmonyos-arkts/references/build-errors.md +42 -0
- package/skills/hexagonal-architecture/SKILL.md +89 -0
- package/skills/hexagonal-architecture/evals/triggers.json +17 -0
- package/skills/hipaa-compliance/SKILL.md +91 -0
- package/skills/hipaa-compliance/evals/triggers.json +18 -0
- package/skills/hipaa-compliance/references/safeguards.md +68 -0
- package/skills/hl7v2-integration/SKILL.md +69 -0
- package/skills/hl7v2-integration/evals/triggers.json +16 -0
- package/skills/hl7v2-integration/references/messages-and-ack.md +78 -0
- package/skills/homelab-network-setup/SKILL.md +125 -0
- package/skills/homelab-network-setup/evals/triggers.json +18 -0
- package/skills/homelab-network-setup/references/firewall-and-dns.md +45 -0
- package/skills/homelab-network-setup/references/wireguard.md +72 -0
- package/skills/hubtel-integration/SKILL.md +77 -0
- package/skills/hubtel-integration/evals/triggers.json +16 -0
- package/skills/hubtel-integration/references/api.md +92 -0
- package/skills/i18n-localization/SKILL.md +114 -0
- package/skills/i18n-localization/evals/triggers.json +16 -0
- package/skills/i18n-localization/references/libraries.md +52 -0
- package/skills/implementation-plans/SKILL.md +117 -0
- package/skills/implementation-plans/evals/behavior.json +54 -0
- package/skills/implementation-plans/evals/triggers.json +16 -0
- package/skills/incident-postmortem/SKILL.md +118 -0
- package/skills/incident-postmortem/evals/triggers.json +14 -0
- package/skills/inventory-demand-planning/SKILL.md +89 -0
- package/skills/inventory-demand-planning/evals/triggers.json +16 -0
- package/skills/inventory-demand-planning/references/formulas.md +62 -0
- package/skills/investor-materials/SKILL.md +127 -0
- package/skills/investor-materials/evals/triggers.json +16 -0
- package/skills/investor-materials/references/templates.md +74 -0
- package/skills/invoicing-and-tax/SKILL.md +84 -0
- package/skills/invoicing-and-tax/evals/triggers.json +17 -0
- package/skills/invoicing-and-tax/references/e-invoicing.md +24 -0
- package/skills/invoicing-and-tax/references/invoice-fields.md +38 -0
- package/skills/invoicing-and-tax/references/rounding.md +26 -0
- package/skills/ios-platform-features/SKILL.md +99 -0
- package/skills/ios-platform-features/evals/triggers.json +16 -0
- package/skills/ios-platform-features/references/foundation-models.md +90 -0
- package/skills/java-patterns/SKILL.md +141 -0
- package/skills/java-patterns/evals/triggers.json +17 -0
- package/skills/java-testing/SKILL.md +142 -0
- package/skills/java-testing/evals/triggers.json +16 -0
- package/skills/jetpack-compose-patterns/SKILL.md +88 -0
- package/skills/jetpack-compose-patterns/evals/triggers.json +16 -0
- package/skills/jira-integration/SKILL.md +92 -0
- package/skills/jira-integration/evals/triggers.json +17 -0
- package/skills/jpa-hibernate/SKILL.md +92 -0
- package/skills/jpa-hibernate/evals/triggers.json +18 -0
- package/skills/jpa-hibernate/references/mapping.md +99 -0
- package/skills/jvm-sql-mappers/SKILL.md +98 -0
- package/skills/jvm-sql-mappers/evals/triggers.json +16 -0
- package/skills/jvm-sql-mappers/references/examples.md +129 -0
- package/skills/kotlin-multiplatform/SKILL.md +97 -0
- package/skills/kotlin-multiplatform/evals/triggers.json +16 -0
- package/skills/kotlin-patterns/SKILL.md +128 -0
- package/skills/kotlin-patterns/evals/triggers.json +16 -0
- package/skills/kotlin-testing/SKILL.md +117 -0
- package/skills/kotlin-testing/evals/triggers.json +16 -0
- package/skills/ktor-patterns/SKILL.md +135 -0
- package/skills/ktor-patterns/evals/triggers.json +18 -0
- package/skills/kubernetes-patterns/SKILL.md +106 -0
- package/skills/kubernetes-patterns/evals/triggers.json +16 -0
- package/skills/kubernetes-patterns/references/manifests.md +115 -0
- package/skills/laravel-patterns/SKILL.md +136 -0
- package/skills/laravel-patterns/evals/triggers.json +16 -0
- package/skills/linear-integration/SKILL.md +98 -0
- package/skills/linear-integration/evals/triggers.json +17 -0
- package/skills/literature-review/SKILL.md +109 -0
- package/skills/literature-review/evals/triggers.json +16 -0
- package/skills/literature-review/references/appraisal.md +41 -0
- package/skills/literature-review/references/search-sources.md +39 -0
- package/skills/llm-app-patterns/SKILL.md +97 -0
- package/skills/llm-app-patterns/evals/triggers.json +17 -0
- package/skills/llm-evals/SKILL.md +98 -0
- package/skills/llm-evals/evals/triggers.json +16 -0
- package/skills/llm-evals/references/graders.md +66 -0
- package/skills/logistics-exception-management/SKILL.md +90 -0
- package/skills/logistics-exception-management/evals/triggers.json +16 -0
- package/skills/manim-animations/SKILL.md +106 -0
- package/skills/manim-animations/evals/triggers.json +16 -0
- package/skills/market-research/SKILL.md +117 -0
- package/skills/market-research/evals/triggers.json +16 -0
- package/skills/marketing-campaign/SKILL.md +111 -0
- package/skills/marketing-campaign/evals/triggers.json +16 -0
- package/skills/mcp-server-patterns/SKILL.md +127 -0
- package/skills/mcp-server-patterns/evals/triggers.json +18 -0
- package/skills/mcp-server-patterns/references/protocol-notes.md +68 -0
- package/skills/metrics-dashboards/SKILL.md +113 -0
- package/skills/metrics-dashboards/evals/triggers.json +16 -0
- package/skills/ml-experiment-workflow/SKILL.md +125 -0
- package/skills/ml-experiment-workflow/evals/triggers.json +16 -0
- package/skills/mobile-accessibility/SKILL.md +94 -0
- package/skills/mobile-accessibility/evals/triggers.json +16 -0
- package/skills/mongodb-patterns/SKILL.md +115 -0
- package/skills/mongodb-patterns/evals/triggers.json +18 -0
- package/skills/mongodb-patterns/references/indexes-and-aggregation.md +94 -0
- package/skills/mpesa-daraja-integration/SKILL.md +70 -0
- package/skills/mpesa-daraja-integration/evals/triggers.json +16 -0
- package/skills/mpesa-daraja-integration/references/api.md +103 -0
- package/skills/mpesa-daraja-integration/references/callbacks.md +74 -0
- package/skills/mtn-momo-integration/SKILL.md +66 -0
- package/skills/mtn-momo-integration/evals/triggers.json +16 -0
- package/skills/mtn-momo-integration/references/api.md +153 -0
- package/skills/mtn-momo-integration/references/callbacks.md +92 -0
- package/skills/mtn-momo-integration/references/sandbox-and-go-live.md +51 -0
- package/skills/mtn-momo-integration/scripts/sandbox-setup.js +79 -0
- package/skills/mysql-patterns/SKILL.md +96 -0
- package/skills/mysql-patterns/evals/triggers.json +16 -0
- package/skills/mysql-patterns/references/explain.md +34 -0
- package/skills/mysql-patterns/references/online-ddl.md +41 -0
- package/skills/nestjs-patterns/SKILL.md +114 -0
- package/skills/nestjs-patterns/evals/triggers.json +16 -0
- package/skills/nestjs-patterns/references/testing.md +68 -0
- package/skills/network-automation/SKILL.md +107 -0
- package/skills/network-automation/evals/triggers.json +18 -0
- package/skills/network-automation/references/tool-snippets.md +153 -0
- package/skills/network-design/SKILL.md +98 -0
- package/skills/network-design/evals/triggers.json +16 -0
- package/skills/network-troubleshooting/SKILL.md +152 -0
- package/skills/network-troubleshooting/evals/triggers.json +18 -0
- package/skills/network-troubleshooting/references/commands.md +33 -0
- package/skills/nextjs-patterns/SKILL.md +150 -0
- package/skills/nextjs-patterns/evals/triggers.json +18 -0
- package/skills/nextjs-patterns/references/caching.md +87 -0
- package/skills/node-backend-patterns/SKILL.md +103 -0
- package/skills/node-backend-patterns/evals/triggers.json +16 -0
- package/skills/node-backend-patterns/references/templates.md +122 -0
- package/skills/nuxt-patterns/SKILL.md +103 -0
- package/skills/nuxt-patterns/evals/triggers.json +16 -0
- package/skills/observability/SKILL.md +125 -0
- package/skills/observability/evals/triggers.json +17 -0
- package/skills/observability/references/otel-setup.md +87 -0
- package/skills/observability/references/slo-alerts.md +70 -0
- package/skills/open-source-release/SKILL.md +107 -0
- package/skills/open-source-release/evals/triggers.json +15 -0
- package/skills/open-source-release/references/history-scrub.md +65 -0
- package/skills/parallel-agent-orchestration/SKILL.md +106 -0
- package/skills/parallel-agent-orchestration/evals/triggers.json +14 -0
- package/skills/patent-research/SKILL.md +94 -0
- package/skills/patent-research/evals/triggers.json +16 -0
- package/skills/patent-research/references/databases-and-queries.md +52 -0
- package/skills/paystack-integration/SKILL.md +59 -0
- package/skills/paystack-integration/evals/triggers.json +14 -0
- package/skills/paystack-integration/references/api.md +73 -0
- package/skills/paystack-integration/references/mobile-money.md +50 -0
- package/skills/paystack-integration/references/webhooks.md +80 -0
- package/skills/pci-dss-scope/SKILL.md +103 -0
- package/skills/pci-dss-scope/evals/triggers.json +18 -0
- package/skills/pci-dss-scope/references/saq-and-data.md +36 -0
- package/skills/perl-patterns/SKILL.md +135 -0
- package/skills/perl-patterns/evals/triggers.json +18 -0
- package/skills/perl-testing/SKILL.md +126 -0
- package/skills/perl-testing/evals/triggers.json +17 -0
- package/skills/php-patterns/SKILL.md +116 -0
- package/skills/php-patterns/evals/triggers.json +16 -0
- package/skills/php-testing/SKILL.md +123 -0
- package/skills/php-testing/evals/triggers.json +16 -0
- package/skills/postgres-patterns/SKILL.md +103 -0
- package/skills/postgres-patterns/evals/triggers.json +17 -0
- package/skills/postgres-patterns/references/explain.md +59 -0
- package/skills/postgres-patterns/references/locks.md +53 -0
- package/skills/prd-writing/SKILL.md +124 -0
- package/skills/prd-writing/evals/triggers.json +15 -0
- package/skills/prisma-patterns/SKILL.md +83 -0
- package/skills/prisma-patterns/evals/triggers.json +18 -0
- package/skills/prisma-patterns/references/prisma-8.md +46 -0
- package/skills/prisma-patterns/references/workflow.md +50 -0
- package/skills/privacy-compliance/SKILL.md +121 -0
- package/skills/privacy-compliance/evals/triggers.json +18 -0
- package/skills/privacy-compliance/references/jurisdictions.md +51 -0
- package/skills/production-scheduling/SKILL.md +98 -0
- package/skills/production-scheduling/evals/triggers.json +16 -0
- package/skills/prompt-engineering/SKILL.md +92 -0
- package/skills/prompt-engineering/evals/triggers.json +16 -0
- package/skills/prospect-research/SKILL.md +87 -0
- package/skills/prospect-research/evals/triggers.json +16 -0
- package/skills/python-app-distribution/SKILL.md +107 -0
- package/skills/python-app-distribution/evals/triggers.json +16 -0
- package/skills/python-app-distribution/references/pypi-trusted-publishing.md +55 -0
- package/skills/python-app-distribution/references/windows-macos-signing.md +70 -0
- package/skills/python-patterns/SKILL.md +107 -0
- package/skills/python-patterns/evals/triggers.json +16 -0
- package/skills/python-patterns/references/tooling.md +101 -0
- package/skills/python-testing/SKILL.md +126 -0
- package/skills/python-testing/evals/triggers.json +16 -0
- package/skills/python-testing/references/mocking.md +71 -0
- package/skills/pytorch-patterns/SKILL.md +139 -0
- package/skills/pytorch-patterns/evals/triggers.json +16 -0
- package/skills/pytorch-patterns/references/debugging.md +39 -0
- package/skills/quality-nonconformance/SKILL.md +107 -0
- package/skills/quality-nonconformance/evals/triggers.json +16 -0
- package/skills/quality-nonconformance/references/8d-and-capa.md +46 -0
- package/skills/quarkus-patterns/SKILL.md +93 -0
- package/skills/quarkus-patterns/evals/triggers.json +18 -0
- package/skills/rag-pipeline-patterns/SKILL.md +117 -0
- package/skills/rag-pipeline-patterns/evals/triggers.json +18 -0
- package/skills/rag-pipeline-patterns/references/evaluation.md +37 -0
- package/skills/rag-pipeline-patterns/references/retrieval-recipes.md +78 -0
- package/skills/rails-patterns/SKILL.md +132 -0
- package/skills/rails-patterns/evals/triggers.json +16 -0
- package/skills/react-native-patterns/SKILL.md +101 -0
- package/skills/react-native-patterns/evals/triggers.json +16 -0
- package/skills/react-patterns/SKILL.md +140 -0
- package/skills/react-patterns/evals/triggers.json +18 -0
- package/skills/react-performance/SKILL.md +107 -0
- package/skills/react-performance/evals/triggers.json +18 -0
- package/skills/react-testing/SKILL.md +121 -0
- package/skills/react-testing/evals/triggers.json +18 -0
- package/skills/react-testing/references/msw.md +64 -0
- package/skills/react-testing/references/queries.md +41 -0
- package/skills/react-testing/references/setup.md +74 -0
- package/skills/recommender-systems/SKILL.md +119 -0
- package/skills/recommender-systems/evals/triggers.json +16 -0
- package/skills/recommender-systems/references/evaluation.md +39 -0
- package/skills/redis-patterns/SKILL.md +109 -0
- package/skills/redis-patterns/evals/triggers.json +18 -0
- package/skills/redis-patterns/references/operations.md +61 -0
- package/skills/refactoring-safely/SKILL.md +107 -0
- package/skills/refactoring-safely/evals/behavior.json +57 -0
- package/skills/refactoring-safely/evals/triggers.json +17 -0
- package/skills/release-management/SKILL.md +141 -0
- package/skills/release-management/evals/triggers.json +16 -0
- package/skills/remotion-video/SKILL.md +91 -0
- package/skills/remotion-video/evals/triggers.json +16 -0
- package/skills/remotion-video/references/lambda.md +66 -0
- package/skills/reproducible-dev-environments/SKILL.md +132 -0
- package/skills/reproducible-dev-environments/evals/triggers.json +16 -0
- package/skills/responding-to-code-review/SKILL.md +124 -0
- package/skills/responding-to-code-review/evals/behavior.json +54 -0
- package/skills/responding-to-code-review/evals/triggers.json +16 -0
- package/skills/returns-reverse-logistics/SKILL.md +97 -0
- package/skills/returns-reverse-logistics/evals/triggers.json +16 -0
- package/skills/ruby-patterns/SKILL.md +127 -0
- package/skills/ruby-patterns/evals/triggers.json +18 -0
- package/skills/ruby-testing/SKILL.md +113 -0
- package/skills/ruby-testing/evals/triggers.json +18 -0
- package/skills/runbook-writing/SKILL.md +101 -0
- package/skills/runbook-writing/evals/triggers.json +14 -0
- package/skills/rust-patterns/SKILL.md +118 -0
- package/skills/rust-patterns/evals/triggers.json +16 -0
- package/skills/rust-patterns/references/cargo-and-clippy.md +105 -0
- package/skills/rust-patterns/references/errors-and-traits.md +97 -0
- package/skills/rust-testing/SKILL.md +148 -0
- package/skills/rust-testing/evals/triggers.json +16 -0
- package/skills/rust-testing/references/fakes-proptest-async.md +113 -0
- package/skills/search-first/SKILL.md +73 -0
- package/skills/search-first/evals/triggers.json +14 -0
- package/skills/security-review/SKILL.md +58 -0
- package/skills/security-review/evals/behavior.json +56 -0
- package/skills/security-review/evals/triggers.json +14 -0
- package/skills/security-review/references/checklist.md +54 -0
- package/skills/security-review/scripts/scan-secrets.js +79 -0
- package/skills/seo-audit/SKILL.md +111 -0
- package/skills/seo-audit/evals/triggers.json +16 -0
- package/skills/seo-audit/references/checks.md +65 -0
- package/skills/session-handoff/SKILL.md +101 -0
- package/skills/session-handoff/evals/behavior.json +55 -0
- package/skills/session-handoff/evals/triggers.json +14 -0
- package/skills/skill-authoring/SKILL.md +98 -0
- package/skills/skill-authoring/evals/triggers.json +15 -0
- package/skills/skill-authoring/references/frontmatter.md +40 -0
- package/skills/skill-authoring/references/pressure-testing.md +87 -0
- package/skills/slack-app-integration/SKILL.md +108 -0
- package/skills/slack-app-integration/evals/triggers.json +17 -0
- package/skills/slide-decks/SKILL.md +107 -0
- package/skills/slide-decks/evals/triggers.json +18 -0
- package/skills/slide-decks/references/html-decks.md +86 -0
- package/skills/slide-decks/references/layouts.md +45 -0
- package/skills/slide-decks/references/pptx.md +87 -0
- package/skills/smart-contract-security/SKILL.md +110 -0
- package/skills/smart-contract-security/evals/triggers.json +16 -0
- package/skills/smart-contract-security/references/vulnerability-checklist.md +79 -0
- package/skills/social-media-publishing/SKILL.md +84 -0
- package/skills/social-media-publishing/evals/triggers.json +17 -0
- package/skills/social-media-publishing/references/platform-apis.md +116 -0
- package/skills/solidity-patterns/SKILL.md +95 -0
- package/skills/solidity-patterns/evals/triggers.json +16 -0
- package/skills/spring-boot-patterns/SKILL.md +128 -0
- package/skills/spring-boot-patterns/evals/triggers.json +18 -0
- package/skills/spring-boot-patterns/references/testing.md +72 -0
- package/skills/stripe-integration/SKILL.md +69 -0
- package/skills/stripe-integration/evals/triggers.json +16 -0
- package/skills/stripe-integration/references/api.md +71 -0
- package/skills/stripe-integration/references/billing.md +58 -0
- package/skills/stripe-integration/references/webhooks.md +76 -0
- package/skills/subagent-driven-development/SKILL.md +109 -0
- package/skills/subagent-driven-development/evals/behavior.json +53 -0
- package/skills/subagent-driven-development/evals/triggers.json +15 -0
- package/skills/subagent-driven-development/references/implementer-brief.md +60 -0
- package/skills/subagent-driven-development/references/reviewer-briefs.md +52 -0
- package/skills/subscription-billing-ops/SKILL.md +118 -0
- package/skills/subscription-billing-ops/evals/triggers.json +17 -0
- package/skills/subscription-billing-ops/references/proration.md +47 -0
- package/skills/subscription-billing-ops/references/revenue-metrics.md +38 -0
- package/skills/svelte-patterns/SKILL.md +122 -0
- package/skills/svelte-patterns/evals/triggers.json +16 -0
- package/skills/swift-patterns/SKILL.md +113 -0
- package/skills/swift-patterns/evals/triggers.json +16 -0
- package/skills/swift-patterns/references/concurrency-migration.md +40 -0
- package/skills/swift-testing/SKILL.md +121 -0
- package/skills/swift-testing/evals/triggers.json +16 -0
- package/skills/swift-testing/references/swift-testing-cheatsheet.md +81 -0
- package/skills/swiftui-patterns/SKILL.md +102 -0
- package/skills/swiftui-patterns/evals/triggers.json +16 -0
- package/skills/systematic-debugging/SKILL.md +92 -0
- package/skills/systematic-debugging/evals/behavior.json +59 -0
- package/skills/systematic-debugging/evals/triggers.json +16 -0
- package/skills/systematic-debugging/references/condition-waiting.md +52 -0
- package/skills/systematic-debugging/references/root-cause-tracing.md +49 -0
- package/skills/systematic-debugging/references/test-pollution.md +46 -0
- package/skills/tdd-workflow/SKILL.md +69 -0
- package/skills/tdd-workflow/evals/behavior.json +55 -0
- package/skills/tdd-workflow/evals/triggers.json +15 -0
- package/skills/tdd-workflow/references/testing-anti-patterns.md +87 -0
- package/skills/technical-writing/SKILL.md +95 -0
- package/skills/technical-writing/evals/triggers.json +14 -0
- package/skills/terraform-patterns/SKILL.md +122 -0
- package/skills/terraform-patterns/evals/triggers.json +16 -0
- package/skills/terraform-patterns/references/backends.md +67 -0
- package/skills/test-coverage-improvement/SKILL.md +107 -0
- package/skills/test-coverage-improvement/evals/triggers.json +16 -0
- package/skills/threat-modeling/SKILL.md +113 -0
- package/skills/threat-modeling/evals/triggers.json +16 -0
- package/skills/transactional-email/SKILL.md +68 -0
- package/skills/transactional-email/evals/triggers.json +17 -0
- package/skills/transactional-email/references/providers.md +63 -0
- package/skills/typescript-patterns/SKILL.md +122 -0
- package/skills/typescript-patterns/evals/triggers.json +16 -0
- package/skills/typescript-testing/SKILL.md +101 -0
- package/skills/typescript-testing/evals/triggers.json +16 -0
- package/skills/ui-demo-recording/SKILL.md +93 -0
- package/skills/ui-demo-recording/evals/triggers.json +16 -0
- package/skills/ui-demo-recording/references/cursor-and-captions.md +48 -0
- package/skills/ui-demo-recording/references/playwright-recording.md +63 -0
- package/skills/ui-demo-recording/references/post-processing.md +57 -0
- package/skills/ui-design-polish/SKILL.md +113 -0
- package/skills/ui-design-polish/evals/triggers.json +18 -0
- package/skills/ui-design-polish/references/detail-checklist.md +45 -0
- package/skills/ui-design-polish/references/tokens.md +68 -0
- package/skills/ui-flow-audit/SKILL.md +112 -0
- package/skills/ui-flow-audit/evals/triggers.json +17 -0
- package/skills/ui-motion/SKILL.md +103 -0
- package/skills/ui-motion/evals/triggers.json +18 -0
- package/skills/ui-motion/references/patterns.md +138 -0
- package/skills/ui-motion/references/tokens.md +52 -0
- package/skills/unicode-text-processing/SKILL.md +103 -0
- package/skills/unicode-text-processing/evals/triggers.json +17 -0
- package/skills/unicode-text-processing/references/apis.md +89 -0
- package/skills/unicode-text-processing/references/script-notes.md +50 -0
- package/skills/verification-loop/SKILL.md +70 -0
- package/skills/verification-loop/evals/behavior.json +52 -0
- package/skills/verification-loop/evals/triggers.json +14 -0
- package/skills/verification-loop/scripts/detect-checks.js +102 -0
- package/skills/video-editing/SKILL.md +111 -0
- package/skills/video-editing/evals/triggers.json +16 -0
- package/skills/video-editing/references/edl-and-logging.md +44 -0
- package/skills/video-editing/references/ffmpeg-edit-recipes.md +92 -0
- package/skills/video-editing/references/resolve-scripting.md +53 -0
- package/skills/vite-patterns/SKILL.md +117 -0
- package/skills/vite-patterns/evals/triggers.json +16 -0
- package/skills/vue-patterns/SKILL.md +104 -0
- package/skills/vue-patterns/evals/triggers.json +16 -0
- package/skills/web-accessibility/SKILL.md +119 -0
- package/skills/web-accessibility/evals/triggers.json +16 -0
- package/skills/web-performance/SKILL.md +107 -0
- package/skills/web-performance/evals/triggers.json +16 -0
- package/skills/web-scraping/SKILL.md +80 -0
- package/skills/web-scraping/evals/triggers.json +16 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bioinformatics-workflows
|
|
3
|
+
description: Bioinformatics pipeline work on FASTA, FASTQ, SAM/BAM/CRAM and VCF files with Biopython, samtools, bcftools, seqkit, FastQC, aligners such as bwa-mem2 and minimap2, and Snakemake or Nextflow workflows run in pinned conda, Docker or Apptainer environments so results reproduce. Use when parsing or converting sequence and alignment files, writing or debugging a Snakemake or Nextflow pipeline, running read QC, alignment or variant calling steps, or making a genomics analysis reproducible on a laptop, HPC cluster or cloud.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Needs the tools the pipeline uses (for example samtools, bcftools, snakemake or nextflow) and a conda/mamba, Docker or Apptainer install for pinned environments.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: data
|
|
9
|
+
kete-loom/risk: runs-commands
|
|
10
|
+
kete-loom/requires: "samtools, bcftools"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Bioinformatics workflows
|
|
15
|
+
|
|
16
|
+
Get sequence data from raw reads to results with every step scripted, every tool version pinned, and every intermediate file checked before the next step trusts it.
|
|
17
|
+
|
|
18
|
+
## Scope and limits
|
|
19
|
+
|
|
20
|
+
- This skill covers data handling and pipeline engineering. It does not choose the statistical model for a study or interpret variants clinically. Clinical or diagnostic use of variant calls needs a validated pipeline and review by a qualified clinical scientist; say so when the user's data is from patients.
|
|
21
|
+
- Human genomic data is personal data. Never upload it to a public service, paste it into an issue, or commit it to git. Ask where the data is allowed to live before moving it.
|
|
22
|
+
|
|
23
|
+
## 0. Before you start
|
|
24
|
+
|
|
25
|
+
1. Ask for, or find in the repo: organism and **reference genome build** (for example GRCh38 vs GRCh37, with the exact FASTA source), sequencing type (short-read Illumina, long-read ONT/PacBio), single or paired-end, and the expected output.
|
|
26
|
+
2. Inspect the inputs before writing code: `seqkit stats reads.fastq.gz`, `samtools quickcheck -v *.bam`, `samtools view -H sample.bam | head`, `bcftools view -h calls.vcf.gz | tail -5`.
|
|
27
|
+
3. Check that contig names agree across the reference, BAM header and VCF (`chr1` vs `1`). Mismatched builds or names are the most common silent failure. Stop and ask if they differ.
|
|
28
|
+
|
|
29
|
+
## 1. Know the formats
|
|
30
|
+
|
|
31
|
+
Detail and gotchas in `references/formats.md`. The rules that bite most often:
|
|
32
|
+
|
|
33
|
+
- FASTQ quality scores are Phred+33 on modern Illumina and ONT; old data may be Phred+64. Paired files must stay in the same read order.
|
|
34
|
+
- SAM text and VCF are 1-based, BED is 0-based half-open, and pysam returns 0-based starts (`read.reference_start`, `record.start`) even for SAM and VCF. Convert explicitly.
|
|
35
|
+
- BAM and VCF need sorting and an index (`.bai`/`.csi`, `.tbi`/`.csi`) before region queries. Compress VCF with `bgzip`, not `gzip`.
|
|
36
|
+
- CRAM needs the exact reference FASTA it was written against to decode.
|
|
37
|
+
|
|
38
|
+
## 2. Pick the tool
|
|
39
|
+
|
|
40
|
+
| Job | Use |
|
|
41
|
+
|---|---|
|
|
42
|
+
| Inspect, filter, sort, index BAM/CRAM | `samtools view`, `sort`, `index`, `flagstat`, `idxstats` |
|
|
43
|
+
| Filter, normalise, merge, query VCF/BCF | `bcftools view`, `norm`, `merge`, `query`, `index` |
|
|
44
|
+
| Fast FASTA/FASTQ stats, subset, convert | `seqkit` |
|
|
45
|
+
| Read QC and reports | FastQC, then MultiQC to aggregate |
|
|
46
|
+
| Short-read alignment to a genome | `bwa-mem2` (or `bwa mem`), `bowtie2` |
|
|
47
|
+
| Long reads, assemblies, spliced long reads | `minimap2` with the right preset (`-ax map-ont`, `-ax map-hifi`, `-ax splice`) |
|
|
48
|
+
| Interval arithmetic | `bedtools` |
|
|
49
|
+
| Parsing in Python | Biopython `SeqIO` for sequences, `pysam` for BAM/VCF |
|
|
50
|
+
|
|
51
|
+
Command patterns are in `references/commands.md`. Prefer a maintained community tool over hand-written parsing. Never parse BAM or VCF with regex.
|
|
52
|
+
|
|
53
|
+
## 3. Biopython essentials
|
|
54
|
+
|
|
55
|
+
- `SeqIO.parse(path, "fasta")` and `SeqIO.parse(handle, "fastq")` stream records; use them in a loop, not `list(...)`, for large files. Open `.gz` with `gzip.open(path, "rt")`.
|
|
56
|
+
- `SeqIO.index(path, "fasta")` for random access by ID without loading the file.
|
|
57
|
+
- `Bio.Entrez` needs `Entrez.email` set; keep within NCBI limits (3 requests/second, 10 with an API key).
|
|
58
|
+
- Write with `SeqIO.write(records, out, "fasta")`. Check record IDs are unique.
|
|
59
|
+
|
|
60
|
+
## 4. Build the pipeline in a workflow manager
|
|
61
|
+
|
|
62
|
+
Use Snakemake or Nextflow for anything with more than two steps or more than a handful of samples. Templates are in `references/workflow-managers.md`.
|
|
63
|
+
|
|
64
|
+
1. One rule or process per tool invocation. Inputs and outputs declared, never implied.
|
|
65
|
+
2. Sample list comes from a config or sample sheet (`config.yaml`, `samplesheet.csv`), never hard-coded.
|
|
66
|
+
3. Each rule or process names its own environment: a conda YAML with pinned versions, or a container image with a tag (better, a digest).
|
|
67
|
+
4. Threads and memory declared per step, so the executor can schedule on a cluster.
|
|
68
|
+
5. Write logs per step and per sample.
|
|
69
|
+
6. Dry-run before the real run: `snakemake -n` or `nextflow run main.nf -preview` (or `-stub-run` with stub blocks).
|
|
70
|
+
7. Rerun only what changed: Snakemake does this by default; Nextflow needs `-resume`.
|
|
71
|
+
8. Before writing a pipeline from scratch, check whether an nf-core pipeline or a Snakemake workflow catalog entry already does the job; reuse it if it fits.
|
|
72
|
+
|
|
73
|
+
## 5. Make it reproducible
|
|
74
|
+
|
|
75
|
+
- Pin every tool version (`samtools=1.24`, not `samtools`). Export the solved environment (`conda env export --no-builds` or a lock file) and commit it.
|
|
76
|
+
- Record the reference genome source URL, build and checksum. Keep reference files out of git; document how to fetch them.
|
|
77
|
+
- Fix random seeds where tools take one (subsampling: `seqkit sample -s 11`, `samtools view -s 42.1`).
|
|
78
|
+
- Generate a run report: Snakemake `--report report.html`, Nextflow `-with-report -with-trace -with-timeline`.
|
|
79
|
+
- Store raw data read-only. Never overwrite inputs in place.
|
|
80
|
+
|
|
81
|
+
## 6. Verify each step
|
|
82
|
+
|
|
83
|
+
After each stage, check before moving on:
|
|
84
|
+
|
|
85
|
+
- QC: FastQC/MultiQC flags reviewed; adapter content and per-base quality noted.
|
|
86
|
+
- Alignment: `samtools flagstat` mapping rate and properly-paired rate in a sensible range for the data type; `samtools quickcheck` passes.
|
|
87
|
+
- Variants: `bcftools stats` counts, transition/transversion ratio plausible for the organism and region; `bcftools norm -f ref.fa -c w -Ou -o /dev/null calls.vcf.gz` warns about no REF mismatches against the reference.
|
|
88
|
+
- Row and record counts agree between input and output where they should.
|
|
89
|
+
|
|
90
|
+
If a number is far outside what the data type normally gives, stop and report it to the user before continuing.
|
|
91
|
+
|
|
92
|
+
## Never
|
|
93
|
+
|
|
94
|
+
- Mix reference builds in one analysis.
|
|
95
|
+
- Use `latest` container tags or unpinned conda packages in a pipeline others will run.
|
|
96
|
+
- Delete intermediate files the user has not agreed can go (use Snakemake `temp()` or Nextflow cleanup only when agreed).
|
|
97
|
+
- Commit raw sequencing data, reference genomes or credentials to git.
|
|
98
|
+
|
|
99
|
+
## Report back
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
Inputs: <files, organism, build, read type>
|
|
103
|
+
Pipeline: <Snakemake|Nextflow>, entry <file>, environments <how pinned>
|
|
104
|
+
Ran: <exact command>, <dry-run result>, <real run result>
|
|
105
|
+
Checks: <QC, flagstat, bcftools stats numbers>
|
|
106
|
+
Outputs: <paths>
|
|
107
|
+
Open issues: <anything outside expected ranges, unresolved mismatches>
|
|
108
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"My bcftools merge fails because the contig names in one VCF are chr1 and the other is 1, how do I fix it safely?",
|
|
4
|
+
"Write a Snakemake pipeline that runs FastQC, aligns paired-end reads with bwa-mem2 and outputs sorted indexed BAMs",
|
|
5
|
+
"Parse this FASTQ file with Biopython and drop reads shorter than 50 bases",
|
|
6
|
+
"Our Nextflow run on the cluster died halfway, how do I restart it without redoing the alignment tasks?",
|
|
7
|
+
"Pin the conda environments for our variant calling workflow so the lab next door gets the same samtools version"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Find and summarise recent papers on CRISPR off-target prediction methods",
|
|
11
|
+
"Set up an Airflow DAG that loads our sales CSVs into the warehouse every night",
|
|
12
|
+
"Tidy my exploratory pandas notebook and move the cleaning code into a module",
|
|
13
|
+
"Write a dbt model that joins orders to customers",
|
|
14
|
+
"Write a GitHub Actions workflow that runs pytest on every pull request"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Command patterns
|
|
2
|
+
|
|
3
|
+
Check each tool's `--help` for the installed version before relying on a flag.
|
|
4
|
+
|
|
5
|
+
## Inspect
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
seqkit stats -a reads_R1.fastq.gz reads_R2.fastq.gz
|
|
9
|
+
samtools quickcheck -v sample.bam && echo ok
|
|
10
|
+
samtools view -H sample.bam # header: @SQ contigs, @RG read groups, @PG programs
|
|
11
|
+
samtools flagstat -@ 4 sample.bam
|
|
12
|
+
samtools idxstats sample.bam # reads per contig (needs index)
|
|
13
|
+
bcftools view -h calls.vcf.gz | tail
|
|
14
|
+
bcftools stats calls.vcf.gz > calls.stats.txt
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## QC
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
mkdir -p qc
|
|
21
|
+
fastqc -t 4 -o qc/ reads_R1.fastq.gz reads_R2.fastq.gz
|
|
22
|
+
multiqc qc/ -o qc/
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Align short reads and make an indexed BAM
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
bwa-mem2 index ref.fa # once per reference
|
|
29
|
+
bwa-mem2 mem -t 8 -R '@RG\tID:s1\tSM:s1\tPL:ILLUMINA' ref.fa R1.fq.gz R2.fq.gz \
|
|
30
|
+
| samtools sort -@ 4 -o s1.sorted.bam -
|
|
31
|
+
samtools index s1.sorted.bam
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Long reads: `minimap2 -ax map-ont ref.fa reads.fq.gz | samtools sort -o out.bam -` (use `map-hifi` for PacBio HiFi, `splice` for spliced cDNA).
|
|
35
|
+
|
|
36
|
+
## Mark duplicates with samtools
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
samtools sort -n -o s1.name.bam s1.sorted.bam
|
|
40
|
+
samtools fixmate -m s1.name.bam s1.fixmate.bam
|
|
41
|
+
samtools sort -o s1.pos.bam s1.fixmate.bam
|
|
42
|
+
samtools markdup s1.pos.bam s1.markdup.bam
|
|
43
|
+
samtools index s1.markdup.bam
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Variants
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
bcftools mpileup -f ref.fa -Ou s1.markdup.bam | bcftools call -mv -Oz -o s1.vcf.gz
|
|
50
|
+
bcftools index -t s1.vcf.gz
|
|
51
|
+
bcftools norm -f ref.fa -m -any -Oz -o s1.norm.vcf.gz s1.vcf.gz
|
|
52
|
+
bcftools view -i 'QUAL>=30 && INFO/DP>=10' -Oz -o s1.filt.vcf.gz s1.norm.vcf.gz
|
|
53
|
+
bcftools query -f '%CHROM\t%POS\t%REF\t%ALT\t[%GT]\n' s1.filt.vcf.gz
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Filter thresholds are examples; choose them for the data and caller, and say which you used.
|
|
57
|
+
|
|
58
|
+
## Regions and intervals
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
samtools view -b -o region.bam s1.markdup.bam chr1:1000000-2000000
|
|
62
|
+
bcftools view -r chr1:1000000-2000000 s1.filt.vcf.gz
|
|
63
|
+
bedtools intersect -a calls.bed -b targets.bed -u
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Subsampling with a fixed seed
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
seqkit sample -s 11 -p 0.1 reads.fq.gz -o sub.fq.gz
|
|
70
|
+
samtools view -b -s 42.1 -o sub.bam s1.markdup.bam # seed 42, keep 10%
|
|
71
|
+
```
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Sequence and alignment formats
|
|
2
|
+
|
|
3
|
+
| Format | What it holds | Coordinates | Compression and index |
|
|
4
|
+
|---|---|---|---|
|
|
5
|
+
| FASTA | sequences with `>id description` headers | n/a | `bgzip` + `samtools faidx` (`.fai`, plus `.gzi` when bgzipped) |
|
|
6
|
+
| FASTQ | reads: 4 lines per record (`@id`, sequence, `+`, qualities) | n/a | gzip or bgzip; no index needed for streaming |
|
|
7
|
+
| SAM | text alignments, header lines start with `@` | 1-based `POS` | n/a |
|
|
8
|
+
| BAM | binary SAM | as SAM | BGZF; coordinate-sort then `samtools index` (`.bai`, or `.csi` for very long contigs) |
|
|
9
|
+
| CRAM | reference-compressed alignments | as SAM | needs the same reference FASTA to decode; `.crai` index |
|
|
10
|
+
| VCF / BCF | variant calls per site, genotypes per sample | 1-based `POS` | `bgzip` + `bcftools index -t` (`.tbi`) or `-c` (`.csi`) |
|
|
11
|
+
| BED | intervals | 0-based start, end exclusive | `bgzip` + `tabix -p bed` |
|
|
12
|
+
| GFF3 / GTF | gene annotations | 1-based, inclusive | `bgzip` + `tabix -p gff` after sorting |
|
|
13
|
+
|
|
14
|
+
## Gotchas
|
|
15
|
+
|
|
16
|
+
- **Quality encoding.** Phred+33 is standard (Illumina 1.8+ and later, ONT, PacBio). If any quality character is below `;` (ASCII 59), the file must be Phred+33, because Phred+64 and Solexa never use those characters; FastQC's Basic Statistics module reports the encoding it used.
|
|
17
|
+
- **Paired-end order.** R1 and R2 must list the same reads in the same order. Tools that filter one file must filter both together (for example `fastp -i R1 -I R2 -o ... -O ...`).
|
|
18
|
+
- **Read names.** Some tools strip `/1` `/2` suffixes or comments after whitespace; keep names consistent across files.
|
|
19
|
+
- **SAM flags.** Decode with `samtools flags <n>`. Common: 4 unmapped, 256 secondary, 1024 duplicate, 2048 supplementary. Filtering primary mapped reads: `samtools view -F 0x904`.
|
|
20
|
+
- **pysam coordinates.** pysam is 0-based half-open (`reference_start`, `VariantRecord.start`); `VariantRecord.pos` is the 1-based VCF POS. Mixing them gives off-by-one errors.
|
|
21
|
+
- **Sorting.** Coordinate sort for indexing and variant calling; name sort (`samtools sort -n`) for tools that need mates adjacent, such as `samtools fixmate`.
|
|
22
|
+
- **VCF normalisation.** Left-align and split multi-allelic sites before comparing call sets: `bcftools norm -f ref.fa -m -any`.
|
|
23
|
+
- **Contig names.** `chr1` (UCSC style) vs `1` (Ensembl/NCBI style). Check with `samtools view -H` and `bcftools view -h`; rename with `bcftools annotate --rename-chrs` only after confirming the builds match.
|
|
24
|
+
- **bgzip vs gzip.** Indexed formats need BGZF blocks; plain `gzip` output cannot be indexed.
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Workflow managers
|
|
2
|
+
|
|
3
|
+
## Snakemake
|
|
4
|
+
|
|
5
|
+
`Snakefile`:
|
|
6
|
+
|
|
7
|
+
```python
|
|
8
|
+
configfile: "config.yaml"
|
|
9
|
+
SAMPLES = config["samples"]
|
|
10
|
+
|
|
11
|
+
rule all:
|
|
12
|
+
input: expand("results/{s}.flagstat.txt", s=SAMPLES)
|
|
13
|
+
|
|
14
|
+
rule align:
|
|
15
|
+
input:
|
|
16
|
+
r1="data/{s}_R1.fastq.gz",
|
|
17
|
+
r2="data/{s}_R2.fastq.gz",
|
|
18
|
+
ref=config["reference"],
|
|
19
|
+
output: "results/{s}.sorted.bam"
|
|
20
|
+
log: "logs/align/{s}.log"
|
|
21
|
+
threads: 8
|
|
22
|
+
resources: mem_mb=16000
|
|
23
|
+
conda: "envs/align.yaml"
|
|
24
|
+
shell:
|
|
25
|
+
"(bwa-mem2 mem -t {threads} {input.ref} {input.r1} {input.r2} "
|
|
26
|
+
"| samtools sort -@ {threads} -o {output} -) 2> {log}"
|
|
27
|
+
|
|
28
|
+
rule flagstat:
|
|
29
|
+
input: "results/{s}.sorted.bam"
|
|
30
|
+
output: "results/{s}.flagstat.txt"
|
|
31
|
+
conda: "envs/align.yaml"
|
|
32
|
+
shell: "samtools flagstat {input} > {output}"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
`envs/align.yaml` pins versions:
|
|
36
|
+
|
|
37
|
+
```yaml
|
|
38
|
+
channels: [conda-forge, bioconda] # bioconda's recommended order; set channel_priority strict in .condarc
|
|
39
|
+
dependencies:
|
|
40
|
+
- bwa-mem2=2.3 # example pins: current bioconda releases in Oct 2026; pin what you tested
|
|
41
|
+
- samtools=1.24
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Run:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
snakemake -n # dry run: shows the job plan
|
|
48
|
+
snakemake --cores 8 --software-deployment-method conda # short form: --sdm conda; older: --use-conda
|
|
49
|
+
snakemake --cores 8 --sdm apptainer # rules with a container: directive
|
|
50
|
+
snakemake --report report.html # after a run
|
|
51
|
+
snakemake --lint # style and best-practice checks
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Use `temp()` for intermediates that may be deleted and `protected()` for outputs that must not be overwritten. Cluster and cloud execution uses executor plugins (`--executor slurm` with the slurm plugin installed); configure them in a profile rather than on the command line.
|
|
55
|
+
|
|
56
|
+
## Nextflow (DSL2)
|
|
57
|
+
|
|
58
|
+
`main.nf`:
|
|
59
|
+
|
|
60
|
+
```groovy
|
|
61
|
+
params.samplesheet = 'samplesheet.csv'
|
|
62
|
+
params.reference = 'ref/genome.fa'
|
|
63
|
+
|
|
64
|
+
process ALIGN {
|
|
65
|
+
tag "$sample"
|
|
66
|
+
cpus 8
|
|
67
|
+
memory '16 GB'
|
|
68
|
+
container 'quay.io/biocontainers/<image>:<tag>' // pin a tag or digest
|
|
69
|
+
input:
|
|
70
|
+
tuple val(sample), path(r1), path(r2)
|
|
71
|
+
path ref
|
|
72
|
+
output:
|
|
73
|
+
tuple val(sample), path("${sample}.sorted.bam")
|
|
74
|
+
script:
|
|
75
|
+
"""
|
|
76
|
+
bwa-mem2 mem -t ${task.cpus} ${ref} ${r1} ${r2} | samtools sort -@ ${task.cpus} -o ${sample}.sorted.bam -
|
|
77
|
+
"""
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
workflow {
|
|
81
|
+
reads = Channel.fromPath(params.samplesheet)
|
|
82
|
+
.splitCsv(header: true)
|
|
83
|
+
.map { row -> tuple(row.sample, file(row.r1), file(row.r2)) }
|
|
84
|
+
ALIGN(reads, file(params.reference))
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Note: `bwa-mem2` also needs its index files beside the reference; stage them as an extra `path` input or point to the index directory.
|
|
89
|
+
|
|
90
|
+
Run:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
nextflow run main.nf -profile docker -preview # check the workflow compiles without running tasks
|
|
94
|
+
nextflow run main.nf -profile docker -params-file params.yaml
|
|
95
|
+
nextflow run main.nf -profile docker -resume # reuse cached tasks
|
|
96
|
+
nextflow run main.nf -with-report -with-trace -with-timeline
|
|
97
|
+
nextflow run nf-core/<pipeline> -r <version> -profile docker,test # pin community pipelines with -r
|
|
98
|
+
nextflow lint main.nf # Nextflow 25.04+
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Profiles (`docker`, `apptainer`, `conda`, a cluster executor) live in `nextflow.config`. Always pin nf-core pipelines with `-r <release>`.
|
|
102
|
+
|
|
103
|
+
## Choosing
|
|
104
|
+
|
|
105
|
+
- Snakemake: Python-centric team, file-based rules, simple local or Slurm runs.
|
|
106
|
+
- Nextflow: channel-based dataflow, strong container and cloud support, nf-core ecosystem.
|
|
107
|
+
- Either way: one environment per step, config-driven samples, dry run first.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: blender-automation
|
|
3
|
+
description: Scripts Blender through its bpy Python API and command line - inspecting armatures, bone hierarchies, rest and pose transforms, constraints and vertex groups, diagnosing broken rigs and retargeted animation (wrong bone roll, scale on the armature, mismatched rest poses, missing action slots), editing actions and F-Curves through layers, strips and channelbags, batch-editing objects, materials and modifiers across many .blend files, and rendering headless with blender -b. Use when a rig or imported FBX animation looks wrong in Blender, when the same change must be applied to dozens of scenes or assets, or when renders must run from a script or on a farm without the UI.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Needs a local Blender install on PATH (examples target Blender 4.4 and later, where actions use slots; 5.0 removed Action.fcurves). GPU rendering needs a supported GPU and driver.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: coding
|
|
9
|
+
kete-loom/risk: runs-commands
|
|
10
|
+
kete-loom/requires: "blender"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Blender automation
|
|
15
|
+
|
|
16
|
+
Drive Blender from scripts so every change is repeatable, reviewable and can run without the UI. Inspect first, change on a copy, verify by reading the data back and rendering a check frame.
|
|
17
|
+
|
|
18
|
+
## 0. Before you run anything
|
|
19
|
+
|
|
20
|
+
1. Find the Blender version: `blender --version`. The Python API changes between releases; open the API docs for that exact version (`https://docs.blender.org/api/<major.minor>/`).
|
|
21
|
+
2. Ask the user which `.blend` files are in scope and where outputs should go. **Work on copies**: never save over the user's originals unless they say so.
|
|
22
|
+
3. Run scripts headless with an exit code on failure:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
blender -b --factory-startup scene.blend --python-exit-code 1 -P script.py -- --out /abs/out
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Arguments run in order: load the `.blend` first, then `-o` / `-F`, then `-f` or `-a`. Everything after `--` reaches the script via `sys.argv`. `--factory-startup` skips the user's startup file and add-ons, so enable add-ons the script needs explicitly.
|
|
29
|
+
|
|
30
|
+
## 1. Inspect before changing
|
|
31
|
+
|
|
32
|
+
Dump the facts into a text or JSON report rather than guessing from screenshots. Snippets in `references/bpy-inspection.md`:
|
|
33
|
+
|
|
34
|
+
- Scene: objects, types, parents, collections, frame range, fps, render engine, output settings.
|
|
35
|
+
- Armature: bones with parent, head, tail, roll, `use_deform`, `use_connect`, inherit scale mode; pose bones with rotation mode and constraints.
|
|
36
|
+
- Mesh binding: Armature modifier target, vertex groups that have no matching deform bone, and deform bones with no vertex group.
|
|
37
|
+
- Animation: each object's `animation_data.action`, `action_slot`, NLA tracks, and per-bone F-Curve key counts and frame range.
|
|
38
|
+
- Object transforms: any non-applied scale or rotation on the armature or mesh object.
|
|
39
|
+
|
|
40
|
+
## 2. Diagnose rigs and animation
|
|
41
|
+
|
|
42
|
+
Work through `references/rig-and-retarget-checks.md`. The most common causes, in order:
|
|
43
|
+
|
|
44
|
+
1. **Object scale or rotation not applied** on the armature (typical with FBX at 0.01 scale or a 90 degree X rotation). Animation then moves in the wrong units or axis.
|
|
45
|
+
2. **Rest pose mismatch** between source and target (A-pose versus T-pose), so retargeted rotations are offset everywhere.
|
|
46
|
+
3. **Bone roll differs** between rigs, so local rotation axes do not match and limbs twist.
|
|
47
|
+
4. **Name mismatch**: F-Curve data paths like `pose.bones["mixamorig:LeftArm"].rotation_quaternion` do not match the target bone names, so channels silently do nothing.
|
|
48
|
+
5. **Rotation mode mismatch**: curves on `rotation_euler` while the bone uses quaternions, or the reverse.
|
|
49
|
+
6. **Action not assigned to a slot** (Blender 4.4+): the action is set but `animation_data.action_slot` is empty or targets a different ID, so nothing plays.
|
|
50
|
+
7. **Constraints or IK** overriding the keyed pose, or bones with `inherit_scale` causing creeping scale.
|
|
51
|
+
|
|
52
|
+
For each issue found, record: symptom, evidence (values read from the file), cause, fix. **Stop and show the user the diagnosis before changing a rig** that other files link to or that is shared by a team.
|
|
53
|
+
|
|
54
|
+
## 3. Fix
|
|
55
|
+
|
|
56
|
+
- Apply transforms with `bpy.ops.object.transform_apply` only on a copy, in Object mode with the object active and selected, and check the effect on its children and animation (applying scale to an animated armature changes what the location keys mean).
|
|
57
|
+
- Rename bones or remap F-Curve data paths with a mapping table the user confirms; never guess a mapping for ambiguous bones (fingers, twist bones).
|
|
58
|
+
- To retarget, prefer constraints (Copy Rotation in local space, or a dedicated retargeting add-on the user already uses) and bake to a new action (`bpy.ops.nla.bake` with `visual_keying=True`, `clear_constraints=True`), keeping the original action.
|
|
59
|
+
- Edit keys through the layered action API (`references/bpy-inspection.md`, "Actions and F-Curves"). In Blender 5.0 and later, `Action.fcurves` no longer exists.
|
|
60
|
+
|
|
61
|
+
## 4. Batch edits
|
|
62
|
+
|
|
63
|
+
Pattern in `references/batch-and-render.md`:
|
|
64
|
+
|
|
65
|
+
1. List the target files and print the plan (file, what will change) before changing anything.
|
|
66
|
+
2. Open each file in a fresh Blender process (one `blender -b file.blend -P edit.py` per file) so state does not leak between files.
|
|
67
|
+
3. Make the change through data (`bpy.data`), not operators, wherever possible; operators depend on context and selection.
|
|
68
|
+
4. Save to an output folder with `bpy.ops.wm.save_as_mainfile(filepath=..., copy=True)`.
|
|
69
|
+
5. Re-open each output and assert the change took effect; write a per-file result line (ok, skipped, failed with reason).
|
|
70
|
+
|
|
71
|
+
## 5. Headless rendering
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# one frame
|
|
75
|
+
blender -b shot.blend -E CYCLES -o /abs/renders/shot_#### -F PNG -f 1
|
|
76
|
+
# a range
|
|
77
|
+
blender -b shot.blend -o /abs/renders/shot_#### -F OPEN_EXR -s 1 -e 240 -a
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
- `#` characters become the zero-padded frame number; `//` means relative to the `.blend`.
|
|
81
|
+
- Pick the device and samples in a pre-render script (Cycles GPU setup in `references/batch-and-render.md`); without it Cycles uses whatever compute device that machine's saved preferences enable, and with `--factory-startup` that is the CPU.
|
|
82
|
+
- List engine names with `blender -b -E help`; names differ across versions.
|
|
83
|
+
- Render a single check frame and show it to the user before a long range or farm job.
|
|
84
|
+
- Render image sequences, not a movie file, for anything long: a crash only loses one frame, and the sequence can be encoded afterwards with FFmpeg.
|
|
85
|
+
|
|
86
|
+
## Never
|
|
87
|
+
|
|
88
|
+
- Never overwrite the user's `.blend`, linked libraries or textures in place.
|
|
89
|
+
- Never run scripts embedded in a `.blend` from an untrusted source (auto-run scripts stay off; never pass `-y` / `--enable-autoexec` for such files; pass `-Y` / `--disable-autoexec` to be explicit).
|
|
90
|
+
- Never delete actions, bones or vertex groups without a backup and the user's approval.
|
|
91
|
+
|
|
92
|
+
## Report back
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
Blender <version> Files: n processed (ok / skipped / failed)
|
|
96
|
+
Findings: <symptom> -> <cause> (evidence) -> <fix applied or proposed>
|
|
97
|
+
Changed files: <output paths> Renders: <path pattern, frames>
|
|
98
|
+
Verification: values read back, check frame <path>
|
|
99
|
+
Needs the user: mapping decisions, art direction, ...
|
|
100
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"My Mixamo animation retargeted onto our character in Blender has twisted arms and the feet slide",
|
|
4
|
+
"Write a bpy script that sets roughness on every material across 40 .blend files and saves copies",
|
|
5
|
+
"Render frames 1 to 240 of this .blend headless on the Linux render box with the GPU",
|
|
6
|
+
"Imported FBX rig is at 0.01 scale and lying on its side, and the action does nothing in Blender 4.4",
|
|
7
|
+
"Dump every bone, its roll and its vertex group from this armature so I can see why the mesh tears"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Animate a 3D rotating cube proof with Manim for my maths lecture",
|
|
11
|
+
"Build a three.js scene that loads a glTF model in the browser",
|
|
12
|
+
"Turn this PNG image sequence into an MP4 at 24 fps",
|
|
13
|
+
"Generate a 3D product render from a text prompt with an image model",
|
|
14
|
+
"Edit the drone footage into a 90-second travel video with music"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Batch edits and rendering
|
|
2
|
+
|
|
3
|
+
## Driver script (one Blender process per file)
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
#!/usr/bin/env bash
|
|
7
|
+
set -euo pipefail
|
|
8
|
+
mkdir -p out
|
|
9
|
+
for f in assets/*.blend; do
|
|
10
|
+
blender -b --factory-startup "$f" --python-exit-code 1 -P edit.py -- "$PWD/out/$(basename "$f")" \
|
|
11
|
+
&& echo "ok $f" || echo "FAILED $f"
|
|
12
|
+
done
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## edit.py pattern
|
|
16
|
+
|
|
17
|
+
```python
|
|
18
|
+
import bpy, sys
|
|
19
|
+
out = sys.argv[sys.argv.index("--") + 1]
|
|
20
|
+
|
|
21
|
+
changed = 0
|
|
22
|
+
for mat in bpy.data.materials:
|
|
23
|
+
if not mat.use_nodes:
|
|
24
|
+
continue
|
|
25
|
+
bsdf = next((n for n in mat.node_tree.nodes if n.type == 'BSDF_PRINCIPLED'), None)
|
|
26
|
+
if bsdf:
|
|
27
|
+
bsdf.inputs["Roughness"].default_value = 0.6
|
|
28
|
+
changed += 1
|
|
29
|
+
|
|
30
|
+
for ob in bpy.data.objects:
|
|
31
|
+
if ob.type == 'MESH' and not any(m.type == 'WEIGHTED_NORMAL' for m in ob.modifiers):
|
|
32
|
+
ob.modifiers.new("WeightedNormal", 'WEIGHTED_NORMAL')
|
|
33
|
+
|
|
34
|
+
print(f"RESULT changed_materials={changed}")
|
|
35
|
+
bpy.ops.wm.save_as_mainfile(filepath=out, copy=True)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Rules:
|
|
39
|
+
- Socket names (such as "Roughness") and node types can change between versions; check the API docs for the installed version and fail loudly if a name is missing.
|
|
40
|
+
- Prefer `bpy.data` edits over `bpy.ops`; when an operator is unavoidable, use `with bpy.context.temp_override(...)` to give it the context it needs.
|
|
41
|
+
- Use `bpy.ops.wm.save_as_mainfile(..., copy=True)` so the open file name is not changed and originals are not touched.
|
|
42
|
+
- Linked library data is read-only in the file that links it; edit the library file itself.
|
|
43
|
+
|
|
44
|
+
## Cycles GPU pre-render script
|
|
45
|
+
|
|
46
|
+
```python
|
|
47
|
+
import bpy
|
|
48
|
+
prefs = bpy.context.preferences.addons["cycles"].preferences
|
|
49
|
+
prefs.compute_device_type = "OPTIX" # or CUDA, HIP, METAL, ONEAPI, depending on hardware
|
|
50
|
+
prefs.get_devices()
|
|
51
|
+
for d in prefs.devices:
|
|
52
|
+
d.use = d.type != "CPU"
|
|
53
|
+
scn = bpy.context.scene
|
|
54
|
+
scn.render.engine = "CYCLES"
|
|
55
|
+
scn.cycles.device = "GPU"
|
|
56
|
+
scn.cycles.samples = 256
|
|
57
|
+
scn.cycles.use_denoising = True
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Use it with `blender -b shot.blend -P gpu.py -o /abs/renders/shot_#### -F PNG -a`. If no GPU device appears in `prefs.devices`, say so; do not silently fall back to a CPU render that will take hours.
|
|
61
|
+
|
|
62
|
+
## Render settings from Python
|
|
63
|
+
|
|
64
|
+
```python
|
|
65
|
+
r = bpy.context.scene.render
|
|
66
|
+
r.resolution_x, r.resolution_y, r.resolution_percentage = 1920, 1080, 100
|
|
67
|
+
r.image_settings.file_format = "PNG"
|
|
68
|
+
r.filepath = "//renders/shot_####"
|
|
69
|
+
bpy.context.scene.frame_start, bpy.context.scene.frame_end = 1, 240
|
|
70
|
+
bpy.ops.render.render(animation=True)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Encode the sequence afterwards
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
ffmpeg -framerate 24 -i renders/shot_%04d.png -c:v libx264 -crf 18 -pix_fmt yuv420p shot.mp4
|
|
77
|
+
```
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# bpy inspection snippets
|
|
2
|
+
|
|
3
|
+
Run with `blender -b file.blend --python-exit-code 1 -P inspect.py -- out.json`.
|
|
4
|
+
|
|
5
|
+
## Scene and objects
|
|
6
|
+
|
|
7
|
+
```python
|
|
8
|
+
import bpy, json, sys
|
|
9
|
+
out = sys.argv[sys.argv.index("--") + 1]
|
|
10
|
+
scn = bpy.context.scene
|
|
11
|
+
report = {
|
|
12
|
+
"blender": bpy.app.version_string,
|
|
13
|
+
"frame_range": [scn.frame_start, scn.frame_end], "fps": scn.render.fps / scn.render.fps_base,
|
|
14
|
+
"engine": scn.render.engine, "output": scn.render.filepath,
|
|
15
|
+
"objects": [{
|
|
16
|
+
"name": o.name, "type": o.type, "parent": o.parent.name if o.parent else None,
|
|
17
|
+
"location": list(o.location), "rotation": list(o.rotation_euler), "scale": list(o.scale),
|
|
18
|
+
"collections": [c.name for c in o.users_collection],
|
|
19
|
+
} for o in bpy.data.objects],
|
|
20
|
+
}
|
|
21
|
+
json.dump(report, open(out, "w"), indent=2)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Armature, bones and pose
|
|
25
|
+
|
|
26
|
+
```python
|
|
27
|
+
arm = bpy.data.objects["Armature"]
|
|
28
|
+
for b in arm.data.bones: # rest data (edit-bone values, read-only here)
|
|
29
|
+
print(b.name, b.parent.name if b.parent else None, tuple(b.head_local), tuple(b.tail_local),
|
|
30
|
+
b.use_deform, b.use_connect, b.inherit_scale)
|
|
31
|
+
for pb in arm.pose.bones: # pose data
|
|
32
|
+
print(pb.name, pb.rotation_mode, [c.type for c in pb.constraints], tuple(pb.matrix_basis.to_euler()))
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Bone roll is only exposed on edit bones: switch to Edit mode on the armature (`bpy.ops.object.mode_set(mode='EDIT')` with it active) and read `arm.data.edit_bones[name].roll`, then return to Object mode.
|
|
36
|
+
|
|
37
|
+
## Vertex groups versus deform bones
|
|
38
|
+
|
|
39
|
+
```python
|
|
40
|
+
mesh = bpy.data.objects["Body"]
|
|
41
|
+
deform = {b.name for b in arm.data.bones if b.use_deform}
|
|
42
|
+
groups = {g.name for g in mesh.vertex_groups}
|
|
43
|
+
print("groups without bone:", sorted(groups - deform))
|
|
44
|
+
print("deform bones without group:", sorted(deform - groups))
|
|
45
|
+
print("armature modifiers:", [(m.name, m.object.name if m.object else None) for m in mesh.modifiers if m.type == 'ARMATURE'])
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Actions and F-Curves (Blender 4.4+ layered actions)
|
|
49
|
+
|
|
50
|
+
Actions hold layers, layers hold strips, and a keyframe strip holds one channelbag per slot. `Action.fcurves` was removed in 5.0.
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
ad = arm.animation_data
|
|
54
|
+
act, slot = ad.action, ad.action_slot
|
|
55
|
+
print(act.name if act else None, slot.identifier if slot else None, [s.identifier for s in act.slots])
|
|
56
|
+
|
|
57
|
+
from bpy_extras import anim_utils
|
|
58
|
+
bag = anim_utils.action_get_channelbag_for_slot(act, slot) # None if the slot has no keys
|
|
59
|
+
for fc in bag.fcurves:
|
|
60
|
+
keys = fc.keyframe_points
|
|
61
|
+
print(fc.data_path, fc.array_index, len(keys), keys[0].co.x if keys else None, keys[-1].co.x if keys else None)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
If `action_get_channelbag_for_slot` is missing in the installed version, walk it directly: `act.layers[0].strips[0].channelbag(slot)`.
|
|
65
|
+
|
|
66
|
+
Remap bone names in data paths (after the user confirms the mapping):
|
|
67
|
+
|
|
68
|
+
```python
|
|
69
|
+
mapping = {"mixamorig:LeftArm": "upper_arm.L"}
|
|
70
|
+
for fc in bag.fcurves:
|
|
71
|
+
for src, dst in mapping.items():
|
|
72
|
+
token = f'pose.bones["{src}"]'
|
|
73
|
+
if fc.data_path.startswith(token):
|
|
74
|
+
fc.data_path = fc.data_path.replace(token, f'pose.bones["{dst}"]', 1)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Assign an action and its slot:
|
|
78
|
+
|
|
79
|
+
```python
|
|
80
|
+
ad = arm.animation_data or arm.animation_data_create()
|
|
81
|
+
ad.action = act
|
|
82
|
+
if ad.action_slot is None and act.slots:
|
|
83
|
+
ad.action_slot = act.slots[0]
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## NLA
|
|
87
|
+
|
|
88
|
+
```python
|
|
89
|
+
for t in ad.nla_tracks:
|
|
90
|
+
print(t.name, t.mute, [(s.name, s.action.name, s.frame_start, s.frame_end) for s in t.strips])
|
|
91
|
+
```
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Rig and retarget checks
|
|
2
|
+
|
|
3
|
+
Work top to bottom. For each, read the values with the inspection snippets; do not judge from a viewport screenshot alone.
|
|
4
|
+
|
|
5
|
+
| # | Symptom | Check | Typical fix |
|
|
6
|
+
|---|---|---|---|
|
|
7
|
+
| 1 | Character tiny, huge, lying down, or root motion in wrong units | Armature and mesh object `scale` not 1, or `rotation_euler.x` near 1.5708 (FBX import) | On a copy, apply rotation and scale (`transform_apply(location=False, rotation=True, scale=True)`), or re-import FBX with Apply Transform or a unit scale the user confirms; re-check location keys after |
|
|
8
|
+
| 2 | Every limb offset by the same amount after retarget | Rest poses differ (A-pose vs T-pose): compare `bone.matrix_local` of matching bones | Retarget with constraints in local or pose space and bake, or adjust the source rest pose to match before baking |
|
|
9
|
+
| 3 | Limbs twist or rotate around the wrong axis | Edit-bone `roll` differs for matching bones | Match roll on the target only if it is not yet skinned or the user accepts re-weighting; otherwise retarget in world or pose space |
|
|
10
|
+
| 4 | Some bones do not move | F-Curve data paths name bones that are not in the target | Rename bones or remap data paths with a confirmed mapping |
|
|
11
|
+
| 5 | Bones move but rotate wrongly or jitter | Curves on `rotation_euler` but `rotation_mode` is `QUATERNION`, or the reverse; quaternion sign flips between keys | Set `rotation_mode` to match the curves, or convert and bake; fix sign flips by negating the quaternion on flipped keys |
|
|
12
|
+
| 6 | Action assigned but nothing plays (4.4+) | `animation_data.action_slot` is None or its `target_id_type` does not match | Assign the right slot |
|
|
13
|
+
| 7 | NLA or another action overrides the keys | NLA tracks not muted, action influence, or tweak mode | Mute or remove tracks on a copy; push the action to an NLA strip deliberately |
|
|
14
|
+
| 8 | Pose ignores keys | Constraints (IK, Child Of, Copy Transforms) with influence 1 | Check each constraint's influence and target; bake visual transforms if the constraints are only for retargeting |
|
|
15
|
+
| 9 | Mesh tears or parts stay behind | Vertex groups with no matching deform bone, `use_deform` off, Armature modifier missing or on the wrong object, or modifier order (Armature after a Subdivision) | Fix names and flags; move the Armature modifier to the top of the stack |
|
|
16
|
+
| 10 | Creeping scale down a chain | `inherit_scale` and scale keys on parent bones | Remove scale keys that should not exist; set inherit scale as the rig design requires |
|
|
17
|
+
| 11 | Foot sliding after retarget | Different leg lengths between rigs | Scale root motion by the leg-length ratio, or use IK for feet and bake |
|
|
18
|
+
|
|
19
|
+
Verification after any fix:
|
|
20
|
+
|
|
21
|
+
1. Read the changed values back from the saved copy.
|
|
22
|
+
2. Render or capture three frames (first, middle, last of the action) from a fixed camera and compare with the source.
|
|
23
|
+
3. Report key counts per bone before and after a bake; a bake should not drop channels unexpectedly.
|