@soleur/opencode 0.0.0-stage → 3.354.2
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/.claude-plugin/agents.manifest.json +476 -0
- package/.claude-plugin/plugin.json +42 -0
- package/README.md +44 -2
- package/agents/community/.gitkeep +0 -0
- package/agents/engineering/cto.md +87 -0
- package/agents/engineering/design/ddd-architect.md +95 -0
- package/agents/engineering/discovery/agent-finder.md +214 -0
- package/agents/engineering/discovery/functional-discovery.md +182 -0
- package/agents/engineering/infra/infra-security.md +151 -0
- package/agents/engineering/infra/platform-strategist.md +109 -0
- package/agents/engineering/infra/terraform-architect.md +171 -0
- package/agents/engineering/prompt-engineer.md +37 -0
- package/agents/engineering/research/best-practices-researcher.md +115 -0
- package/agents/engineering/research/framework-docs-researcher.md +93 -0
- package/agents/engineering/research/git-history-analyzer.md +53 -0
- package/agents/engineering/research/learnings-researcher.md +285 -0
- package/agents/engineering/research/repo-research-analyst.md +118 -0
- package/agents/engineering/review/agent-native-reviewer.md +279 -0
- package/agents/engineering/review/architecture-strategist.md +61 -0
- package/agents/engineering/review/code-quality-analyst.md +92 -0
- package/agents/engineering/review/code-simplicity-reviewer.md +109 -0
- package/agents/engineering/review/data-integrity-guardian.md +82 -0
- package/agents/engineering/review/data-migration-expert.md +98 -0
- package/agents/engineering/review/deployment-verification-agent.md +183 -0
- package/agents/engineering/review/dhh-rails-reviewer.md +46 -0
- package/agents/engineering/review/kieran-rails-reviewer.md +87 -0
- package/agents/engineering/review/legacy-code-expert.md +55 -0
- package/agents/engineering/review/observability-coverage-reviewer.md +147 -0
- package/agents/engineering/review/pattern-recognition-specialist.md +59 -0
- package/agents/engineering/review/performance-oracle.md +130 -0
- package/agents/engineering/review/security-sentinel.md +167 -0
- package/agents/engineering/review/semgrep-sast.md +36 -0
- package/agents/engineering/review/test-design-reviewer.md +150 -0
- package/agents/engineering/review/user-impact-reviewer.md +70 -0
- package/agents/engineering/workflow/pr-comment-resolver.md +69 -0
- package/agents/finance/budget-analyst.md +29 -0
- package/agents/finance/cfo.md +44 -0
- package/agents/finance/financial-reporter.md +30 -0
- package/agents/finance/revenue-analyst.md +30 -0
- package/agents/legal/clo.md +115 -0
- package/agents/legal/legal-compliance-auditor.md +110 -0
- package/agents/legal/legal-document-generator.md +134 -0
- package/agents/marketing/analytics-analyst.md +25 -0
- package/agents/marketing/brand-architect.md +181 -0
- package/agents/marketing/cmo.md +76 -0
- package/agents/marketing/conversion-optimizer.md +19 -0
- package/agents/marketing/copywriter.md +20 -0
- package/agents/marketing/fact-checker.md +70 -0
- package/agents/marketing/growth-strategist.md +145 -0
- package/agents/marketing/paid-media-strategist.md +28 -0
- package/agents/marketing/pricing-strategist.md +17 -0
- package/agents/marketing/programmatic-seo-specialist.md +25 -0
- package/agents/marketing/retention-strategist.md +23 -0
- package/agents/marketing/seo-aeo-analyst.md +164 -0
- package/agents/operations/coo.md +50 -0
- package/agents/operations/ops-advisor.md +78 -0
- package/agents/operations/ops-provisioner.md +101 -0
- package/agents/operations/ops-research.md +52 -0
- package/agents/operations/service-automator.md +278 -0
- package/agents/product/business-validator.md +206 -0
- package/agents/product/competitive-intelligence.md +89 -0
- package/agents/product/cpo.md +63 -0
- package/agents/product/design/ux-design-lead.md +209 -0
- package/agents/product/spec-flow-analyzer.md +122 -0
- package/agents/sales/cro.md +44 -0
- package/agents/sales/deal-architect.md +29 -0
- package/agents/sales/outbound-strategist.md +29 -0
- package/agents/sales/pipeline-analyst.md +29 -0
- package/agents/support/cco.md +48 -0
- package/agents/support/community-manager.md +570 -0
- package/agents/support/ticket-triage.md +70 -0
- package/bin/soleur-opencode.js +29 -0
- package/commands/go.md +660 -0
- package/commands/help.md +273 -0
- package/commands/sync.md +977 -0
- package/commands/version.md +103 -0
- package/hooks/antigravity-hooks.json +84 -0
- package/hooks/antigravity-session-start.sh +15 -0
- package/hooks/bare-root-cwd-guard.sh +131 -0
- package/hooks/browser-snapshot-credential-guard.sh +200 -0
- package/hooks/codex-session-start.sh +9 -0
- package/hooks/compaction-state.sh +525 -0
- package/hooks/destructive-command-guard.sh +1387 -0
- package/hooks/devin-session-start.sh +90 -0
- package/hooks/ext-filter-detect.sh +171 -0
- package/hooks/hooks.json +133 -0
- package/hooks/lib/hook-tool-kind.sh +24 -0
- package/hooks/lib/log-rotation.sh +176 -0
- package/hooks/lib/shell-argv.pl +576 -0
- package/hooks/memory-backstop.sh +1114 -0
- package/hooks/operator-stage-approval.sh +391 -0
- package/hooks/stop-hook.sh +367 -0
- package/hooks/unkept-promise-hook.sh +383 -0
- package/hooks/version-banner.sh +127 -0
- package/hooks/welcome-hook.sh +50 -0
- package/install.js +29 -0
- package/lib/agent-registry.ts +154 -0
- package/lib/c4-canonical-cli.mjs +34 -0
- package/lib/c4-canonical.mjs +46 -0
- package/lib/c4-from-components.ts +554 -0
- package/lib/go-routing.ts +81 -0
- package/lib/grok-inspect-contract.ts +311 -0
- package/lib/harness-model-map.ts +101 -0
- package/lib/harness-parity.ts +726 -0
- package/lib/harness-tool-map.ts +180 -0
- package/lib/harness.ts +716 -0
- package/lib/heartbeat-live-reconcile.ts +1153 -0
- package/lib/heartbeat-manifest.ts +361 -0
- package/lib/kb-coverage.ts +252 -0
- package/lib/pr-merge-poll.ts +103 -0
- package/lib/workflow-fidelity.ts +388 -0
- package/opencode/INSTRUCTIONS.md +171 -0
- package/opencode/agents/engineering/cto.md +10 -0
- package/opencode/agents/engineering/design/ddd-architect.md +10 -0
- package/opencode/agents/engineering/discovery/agent-finder.md +10 -0
- package/opencode/agents/engineering/discovery/functional-discovery.md +10 -0
- package/opencode/agents/engineering/infra/infra-security.md +10 -0
- package/opencode/agents/engineering/infra/platform-strategist.md +10 -0
- package/opencode/agents/engineering/infra/terraform-architect.md +10 -0
- package/opencode/agents/engineering/prompt-engineer.md +10 -0
- package/opencode/agents/engineering/research/best-practices-researcher.md +10 -0
- package/opencode/agents/engineering/research/framework-docs-researcher.md +10 -0
- package/opencode/agents/engineering/research/git-history-analyzer.md +10 -0
- package/opencode/agents/engineering/research/learnings-researcher.md +10 -0
- package/opencode/agents/engineering/research/repo-research-analyst.md +10 -0
- package/opencode/agents/engineering/review/agent-native-reviewer.md +10 -0
- package/opencode/agents/engineering/review/architecture-strategist.md +10 -0
- package/opencode/agents/engineering/review/code-quality-analyst.md +10 -0
- package/opencode/agents/engineering/review/code-simplicity-reviewer.md +10 -0
- package/opencode/agents/engineering/review/data-integrity-guardian.md +10 -0
- package/opencode/agents/engineering/review/data-migration-expert.md +10 -0
- package/opencode/agents/engineering/review/deployment-verification-agent.md +10 -0
- package/opencode/agents/engineering/review/dhh-rails-reviewer.md +10 -0
- package/opencode/agents/engineering/review/kieran-rails-reviewer.md +10 -0
- package/opencode/agents/engineering/review/legacy-code-expert.md +10 -0
- package/opencode/agents/engineering/review/observability-coverage-reviewer.md +10 -0
- package/opencode/agents/engineering/review/pattern-recognition-specialist.md +10 -0
- package/opencode/agents/engineering/review/performance-oracle.md +10 -0
- package/opencode/agents/engineering/review/security-sentinel.md +10 -0
- package/opencode/agents/engineering/review/semgrep-sast.md +10 -0
- package/opencode/agents/engineering/review/test-design-reviewer.md +10 -0
- package/opencode/agents/engineering/review/user-impact-reviewer.md +10 -0
- package/opencode/agents/engineering/workflow/pr-comment-resolver.md +10 -0
- package/opencode/agents/finance/budget-analyst.md +10 -0
- package/opencode/agents/finance/cfo.md +10 -0
- package/opencode/agents/finance/financial-reporter.md +10 -0
- package/opencode/agents/finance/revenue-analyst.md +10 -0
- package/opencode/agents/legal/clo.md +10 -0
- package/opencode/agents/legal/legal-compliance-auditor.md +10 -0
- package/opencode/agents/legal/legal-document-generator.md +10 -0
- package/opencode/agents/marketing/analytics-analyst.md +10 -0
- package/opencode/agents/marketing/brand-architect.md +10 -0
- package/opencode/agents/marketing/cmo.md +10 -0
- package/opencode/agents/marketing/conversion-optimizer.md +10 -0
- package/opencode/agents/marketing/copywriter.md +10 -0
- package/opencode/agents/marketing/fact-checker.md +10 -0
- package/opencode/agents/marketing/growth-strategist.md +10 -0
- package/opencode/agents/marketing/paid-media-strategist.md +10 -0
- package/opencode/agents/marketing/pricing-strategist.md +10 -0
- package/opencode/agents/marketing/programmatic-seo-specialist.md +10 -0
- package/opencode/agents/marketing/retention-strategist.md +10 -0
- package/opencode/agents/marketing/seo-aeo-analyst.md +10 -0
- package/opencode/agents/operations/coo.md +10 -0
- package/opencode/agents/operations/ops-advisor.md +10 -0
- package/opencode/agents/operations/ops-provisioner.md +10 -0
- package/opencode/agents/operations/ops-research.md +10 -0
- package/opencode/agents/operations/service-automator.md +10 -0
- package/opencode/agents/product/business-validator.md +10 -0
- package/opencode/agents/product/competitive-intelligence.md +10 -0
- package/opencode/agents/product/cpo.md +10 -0
- package/opencode/agents/product/design/ux-design-lead.md +10 -0
- package/opencode/agents/product/spec-flow-analyzer.md +10 -0
- package/opencode/agents/sales/cro.md +10 -0
- package/opencode/agents/sales/deal-architect.md +10 -0
- package/opencode/agents/sales/outbound-strategist.md +10 -0
- package/opencode/agents/sales/pipeline-analyst.md +10 -0
- package/opencode/agents/support/cco.md +10 -0
- package/opencode/agents/support/community-manager.md +10 -0
- package/opencode/agents/support/ticket-triage.md +10 -0
- package/opencode/commands/go.md +10 -0
- package/opencode/commands/help.md +10 -0
- package/opencode/commands/sync.md +10 -0
- package/opencode/commands/version.md +11 -0
- package/opencode/opencode.json +8 -0
- package/opencode/plugin.ts +818 -0
- package/package.json +36 -4
- package/scripts/admin-merge-ready.sh +545 -0
- package/scripts/admin-merge-ready.test.sh +753 -0
- package/scripts/affected-tests.sh +908 -0
- package/scripts/affected-tests.test.sh +1797 -0
- package/scripts/alpha-metrics.sh +78 -0
- package/scripts/alpha-metrics.test.sh +115 -0
- package/scripts/ancestor-signal-helpers.baseline.txt +16 -0
- package/scripts/audit-flag-flip.sh +107 -0
- package/scripts/check-red-on-main.sh +316 -0
- package/scripts/ci-head-verdict.sh +411 -0
- package/scripts/cloud-detect.sh +193 -0
- package/scripts/delegation-verify.sh +657 -0
- package/scripts/delegation-verify.test.sh +1424 -0
- package/scripts/deploy-arm.sh +475 -0
- package/scripts/domain-model-drift.sh +419 -0
- package/scripts/emit-decision.sh +144 -0
- package/scripts/emit-decision.test.sh +144 -0
- package/scripts/ext-filter-divergence-corpus.txt +15 -0
- package/scripts/ext-filter-divergence.sh +189 -0
- package/scripts/generate-c4-from-components.ts +442 -0
- package/scripts/grok-fidelity-gate.sh +68 -0
- package/scripts/grok-pre-push-gate.sh +232 -0
- package/scripts/harness-discovery-smoke.ts +906 -0
- package/scripts/harness-parity-census.ts +92 -0
- package/scripts/inngest-luks-alert-armed-probe.ts +29 -0
- package/scripts/install-opencode-adapter.ts +509 -0
- package/scripts/lib/affected-tests/common.sh +365 -0
- package/scripts/lib/affected-tests/go.sh +157 -0
- package/scripts/lib/affected-tests/js.sh +188 -0
- package/scripts/lib/affected-tests/nx-turbo.sh +98 -0
- package/scripts/lib/affected-tests/python.sh +185 -0
- package/scripts/lib/context-sanitize.sh +49 -0
- package/scripts/lib/domain-model-lib.sh +180 -0
- package/scripts/lib/ext-filter-grammar.tsv +34 -0
- package/scripts/lib/operator-script.sh +1236 -0
- package/scripts/lib/proc.sh +580 -0
- package/scripts/lib/session-state.sh +748 -0
- package/scripts/lib/tmp-classify.sh +843 -0
- package/scripts/lib/wrapper-boundary.sh +47 -0
- package/scripts/lint-ratchet.py +1547 -0
- package/scripts/monitor-pr-checks.sh +441 -0
- package/scripts/pipeline-tally.sh +756 -0
- package/scripts/pipeline-tally.test.sh +740 -0
- package/scripts/plugin-version.sh +528 -0
- package/scripts/precommit-guard.sh +115 -0
- package/scripts/precommit-guard.test.sh +254 -0
- package/scripts/reconcile-live-heartbeats.ts +705 -0
- package/scripts/render-c4-model.sh +217 -0
- package/scripts/resolve-git-root.sh +55 -0
- package/scripts/resolve-regenerable-conflicts.sh +363 -0
- package/scripts/resolve-regenerable-conflicts.test.sh +780 -0
- package/scripts/ruff-requirements.txt +22 -0
- package/scripts/run-in-pid-namespace.sh +98 -0
- package/scripts/run-in-pid-namespace.test.sh +290 -0
- package/scripts/scan-ancestor-signal-helpers.py +556 -0
- package/scripts/scan-ancestor-signal-helpers.test.sh +670 -0
- package/scripts/setup-ralph-loop.sh +238 -0
- package/scripts/sync-cursor-name-map.ts +316 -0
- package/scripts/sync-grok-agent-compat.ts +188 -0
- package/scripts/sync-npm-package.ts +165 -0
- package/scripts/sync-opencode-adapter.ts +498 -0
- package/scripts/sync-pr-behind.sh +647 -0
- package/scripts/sync-pr-behind.test.sh +252 -0
- package/scripts/taste-profile-update.sh +180 -0
- package/scripts/taste-profile-update.test.sh +167 -0
- package/scripts/write-budget-marker.sh +23 -0
- package/scripts/write-kb-coverage.ts +113 -0
- package/skills/admin-ip-refresh/SKILL.md +81 -0
- package/skills/admin-ip-refresh/references/admin-ip-refresh-procedure.md +201 -0
- package/skills/agent-browser/SKILL.md +698 -0
- package/skills/agent-browser/scripts/playwright-mcp-profile-slot.sh +304 -0
- package/skills/agent-browser/scripts/playwright-mcp-redact-proxy.py +964 -0
- package/skills/agent-browser/scripts/redact-a11y-snapshot.py +443 -0
- package/skills/agent-browser/test/fixtures/capture-playwright-mcp-fixtures.py +217 -0
- package/skills/agent-browser/test/fixtures/fake-passthrough-proxy.py +24 -0
- package/skills/agent-browser/test/fixtures/fake-playwright-mcp.py +131 -0
- package/skills/agent-browser/test/fixtures/make-proxy-mutant.py +48 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/dialog-link-injection.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/empty-content.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-and-result.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-code-bool.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-code-string.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-message-tree.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-no-data.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-string.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-with-data.json +9 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/evaluate-escaped-object.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/invalid-utf8.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/link-result.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/list-two-results.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/meta-in-result.json +13 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/no-content.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/quoted-key.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/resource-block.json +18 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/result-and-method.json +11 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/result-string.json +3 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped-one-row.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/structured-content.json +13 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/tools-list-no-tools.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/tree-no-credential.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/two-text-blocks.json +14 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/unparsable-line.json +3 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-brace.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-link-substring.json +10 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/close.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/evaluate.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/find.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/framing.json +6 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/initialize.json +14 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate-link.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/roots-list-request.json +5 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/screenshot.json +17 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-filename.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-json.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-raw.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/tools-list.json +827 -0
- package/skills/agent-browser/test/fixtures/proxy-session-driver.py +138 -0
- package/skills/agent-browser/test/fixtures/session-facts.py +102 -0
- package/skills/agent-browser/test/playwright-mcp-lifetime.test.sh +1620 -0
- package/skills/agent-browser/test/playwright-mcp-redact-proxy.test.sh +1599 -0
- package/skills/agent-browser/test/redact-a11y-snapshot.test.sh +527 -0
- package/skills/agent-native-architecture/SKILL.md +479 -0
- package/skills/agent-native-architecture/references/action-parity-discipline.md +430 -0
- package/skills/agent-native-architecture/references/agent-execution-patterns.md +483 -0
- package/skills/agent-native-architecture/references/agent-native-testing.md +605 -0
- package/skills/agent-native-architecture/references/architecture-patterns.md +493 -0
- package/skills/agent-native-architecture/references/dynamic-context-injection.md +358 -0
- package/skills/agent-native-architecture/references/files-universal-interface.md +314 -0
- package/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +381 -0
- package/skills/agent-native-architecture/references/mcp-tool-design.md +524 -0
- package/skills/agent-native-architecture/references/mobile-patterns.md +897 -0
- package/skills/agent-native-architecture/references/product-implications.md +478 -0
- package/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +342 -0
- package/skills/agent-native-architecture/references/self-modification.md +294 -0
- package/skills/agent-native-architecture/references/shared-workspace-architecture.md +700 -0
- package/skills/agent-native-architecture/references/system-prompt-design.md +263 -0
- package/skills/agent-native-audit/SKILL.md +300 -0
- package/skills/agent-native-audit/workflows/agent-native-audit.workflow.js +423 -0
- package/skills/andrew-kane-gem-writer/SKILL.md +189 -0
- package/skills/andrew-kane-gem-writer/references/database-adapters.md +231 -0
- package/skills/andrew-kane-gem-writer/references/module-organization.md +121 -0
- package/skills/andrew-kane-gem-writer/references/rails-integration.md +183 -0
- package/skills/andrew-kane-gem-writer/references/resources.md +126 -0
- package/skills/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
- package/skills/architecture/SKILL.md +436 -0
- package/skills/architecture/references/adr-template.md +154 -0
- package/skills/architecture/references/likec4-reference.md +136 -0
- package/skills/architecture/references/nfr-reference.md +126 -0
- package/skills/archive-kb/SKILL.md +86 -0
- package/skills/archive-kb/scripts/archive-kb.sh +300 -0
- package/skills/archive-kb/test/archive-kb-partial-run.test.sh +276 -0
- package/skills/atdd-developer/SKILL.md +65 -0
- package/skills/brainstorm/SKILL.md +701 -0
- package/skills/brainstorm/references/brainstorm-brand-workshop.md +153 -0
- package/skills/brainstorm/references/brainstorm-domain-config.md +63 -0
- package/skills/brainstorm/references/brainstorm-validation-workshop.md +65 -0
- package/skills/brainstorm/references/ui-surface-terms.md +42 -0
- package/skills/brainstorm-techniques/SKILL.md +231 -0
- package/skills/brainstorm-techniques/references/decision-principles.md +150 -0
- package/skills/brainstorm-techniques/references/phase-boundaries.md +103 -0
- package/skills/brainstorm-techniques/references/standing-delegation.md +407 -0
- package/skills/brainstorm-techniques/references/technical-ruling-delegation.md +174 -0
- package/skills/campaign-calendar/SKILL.md +145 -0
- package/skills/cf-token-scope/SKILL.md +164 -0
- package/skills/cf-token-scope/references/widen-playbook.md +114 -0
- package/skills/cf-token-scope/scripts/cf-token-scope.sh +253 -0
- package/skills/changelog/SKILL.md +142 -0
- package/skills/code-to-prd/SKILL.md +66 -0
- package/skills/code-to-prd/references/banner-template.md +12 -0
- package/skills/code-to-prd/references/prd-template.md +41 -0
- package/skills/code-to-prd/scripts/code-to-prd.sh +634 -0
- package/skills/code-to-prd/test/code-to-prd.test.sh +447 -0
- package/skills/code-to-prd/test/fixture/.env.example +7 -0
- package/skills/code-to-prd/test/fixture/app/about/page.tsx +11 -0
- package/skills/code-to-prd/test/fixture/app/api/health/route.ts +10 -0
- package/skills/code-to-prd/test/fixture/app/page.tsx +14 -0
- package/skills/code-to-prd/test/fixture/next.config.mjs +3 -0
- package/skills/code-to-prd/test/fixture/package.json +6 -0
- package/skills/cohort-status/SKILL.md +62 -0
- package/skills/community/SKILL.md +210 -0
- package/skills/community/scripts/bsky-community.sh +644 -0
- package/skills/community/scripts/bsky-setup.sh +631 -0
- package/skills/community/scripts/community-router.sh +93 -0
- package/skills/community/scripts/discord-community.sh +487 -0
- package/skills/community/scripts/discord-setup.sh +784 -0
- package/skills/community/scripts/github-community.sh +706 -0
- package/skills/community/scripts/hn-community.sh +233 -0
- package/skills/community/scripts/lib/hmac-sha1-b64.sh +126 -0
- package/skills/community/scripts/linkedin-community.sh +750 -0
- package/skills/community/scripts/linkedin-setup.sh +758 -0
- package/skills/community/scripts/x-community.sh +890 -0
- package/skills/community/scripts/x-setup.sh +713 -0
- package/skills/community/test/community-argv.test.sh +2922 -0
- package/skills/community/test/github-community.test.sh +981 -0
- package/skills/competitive-analysis/SKILL.md +69 -0
- package/skills/competitive-analysis/references/peer-plugin-audit.md +218 -0
- package/skills/compound/SKILL.md +673 -0
- package/skills/compound/scripts/token-efficiency-report.sh +334 -0
- package/skills/compound/test/phase-16.test.sh +379 -0
- package/skills/compound-capture/SKILL.md +791 -0
- package/skills/compound-capture/assets/critical-pattern-template.md +37 -0
- package/skills/compound-capture/assets/resolution-template.md +116 -0
- package/skills/compound-capture/references/yaml-schema.md +67 -0
- package/skills/compound-capture/schema.yaml +181 -0
- package/skills/constraint-scaffold/SKILL.md +175 -0
- package/skills/constraint-scaffold/references/boundary-readme.template +35 -0
- package/skills/constraint-scaffold/references/constraint-gates-workflow.template +69 -0
- package/skills/constraint-scaffold/references/depcruise-config.template +230 -0
- package/skills/constraint-scaffold/references/fix-constraints-stage-a.template +240 -0
- package/skills/constraint-scaffold/references/fix-constraints-stage-b.template +313 -0
- package/skills/constraint-scaffold/references/shared-runner.template +135 -0
- package/skills/constraint-scaffold/scripts/constraint-scaffold.sh +589 -0
- package/skills/constraint-scaffold/test/bite-proof.test.sh +1338 -0
- package/skills/constraint-scaffold/test/boundary.test.sh +734 -0
- package/skills/constraint-scaffold/test/emit-fix-constraints.test.sh +193 -0
- package/skills/constraint-scaffold/test/generator.test.sh +93 -0
- package/skills/constraint-scaffold/test/parity.test.sh +285 -0
- package/skills/content-writer/SKILL.md +242 -0
- package/skills/content-writer/scripts/blog-jargon-scan.sh +42 -0
- package/skills/cron-delete/SKILL.md +56 -0
- package/skills/cron-list/SKILL.md +54 -0
- package/skills/deepen-plan/SKILL.md +937 -0
- package/skills/deepen-plan/workflows/deepen-plan.workflow.js +488 -0
- package/skills/deploy/SKILL.md +115 -0
- package/skills/deploy/references/hetzner-setup.md +67 -0
- package/skills/deploy/scripts/deploy.sh +37 -0
- package/skills/deploy-docs/SKILL.md +95 -0
- package/skills/dhh-rails-style/SKILL.md +203 -0
- package/skills/dhh-rails-style/references/architecture.md +717 -0
- package/skills/dhh-rails-style/references/controllers.md +323 -0
- package/skills/dhh-rails-style/references/frontend.md +556 -0
- package/skills/dhh-rails-style/references/gems.md +316 -0
- package/skills/dhh-rails-style/references/models.md +388 -0
- package/skills/dhh-rails-style/references/testing.md +354 -0
- package/skills/discord-content/SKILL.md +126 -0
- package/skills/docs-site/SKILL.md +214 -0
- package/skills/drain-labeled-backlog/SKILL.md +203 -0
- package/skills/drain-labeled-backlog/scripts/group-by-area.sh +208 -0
- package/skills/drain-labeled-backlog/workflows/drain-labeled-backlog.workflow.js +433 -0
- package/skills/drain-prs/SKILL.md +143 -0
- package/skills/drain-prs/scripts/triage-prs.sh +192 -0
- package/skills/drain-prs/test/argv-ceiling.test.sh +183 -0
- package/skills/dspy-ruby/SKILL.md +634 -0
- package/skills/dspy-ruby/assets/config-template.rb +359 -0
- package/skills/dspy-ruby/assets/module-template.rb +326 -0
- package/skills/dspy-ruby/assets/signature-template.rb +143 -0
- package/skills/dspy-ruby/references/core-concepts.md +268 -0
- package/skills/dspy-ruby/references/optimization.md +623 -0
- package/skills/dspy-ruby/references/providers.md +335 -0
- package/skills/eval-harness/README.md +194 -0
- package/skills/eval-harness/SKILL.md +157 -0
- package/skills/eval-harness/enums/go-routes.json +13 -0
- package/skills/eval-harness/enums/incident-threshold.json +5 -0
- package/skills/eval-harness/enums/lane.json +5 -0
- package/skills/eval-harness/enums/tool-selection.json +20 -0
- package/skills/eval-harness/enums/triage-levels.json +5 -0
- package/skills/eval-harness/gated-skills.json +34 -0
- package/skills/eval-harness/models.generated.json +5 -0
- package/skills/eval-harness/promptfooconfig-go-routing.yaml +35 -0
- package/skills/eval-harness/promptfooconfig-incident-threshold.yaml +32 -0
- package/skills/eval-harness/promptfooconfig-lane-inference.yaml +33 -0
- package/skills/eval-harness/promptfooconfig-ticket-triage.yaml +34 -0
- package/skills/eval-harness/promptfooconfig-tool-selection.yaml +33 -0
- package/skills/eval-harness/prompts/go-baseline.txt +6 -0
- package/skills/eval-harness/prompts/go-skill.txt +21 -0
- package/skills/eval-harness/prompts/incident-threshold-baseline.txt +6 -0
- package/skills/eval-harness/prompts/incident-threshold-skill.txt +12 -0
- package/skills/eval-harness/prompts/lane-inference-baseline.txt +6 -0
- package/skills/eval-harness/prompts/lane-inference-skill.txt +15 -0
- package/skills/eval-harness/prompts/tool-selection-baseline.txt +19 -0
- package/skills/eval-harness/prompts/tool-selection-skill.txt +22 -0
- package/skills/eval-harness/prompts/triage-baseline.txt +7 -0
- package/skills/eval-harness/prompts/triage-skill.txt +10 -0
- package/skills/eval-harness/scripts/eval-gate.cjs +318 -0
- package/skills/eval-harness/scripts/extract-block.cjs +87 -0
- package/skills/eval-harness/scripts/gate-classification.cjs +28 -0
- package/skills/eval-harness/scripts/gen-models.sh +41 -0
- package/skills/eval-harness/scripts/gen-skill-prompt.cjs +177 -0
- package/skills/eval-harness/scripts/measure-classification.cjs +30 -0
- package/skills/eval-harness/scripts/parse-label.cjs +93 -0
- package/skills/eval-harness/scripts/verdict.cjs +132 -0
- package/skills/eval-harness/tasks/go-routing.jsonl +8 -0
- package/skills/eval-harness/tasks/incident-threshold.jsonl +7 -0
- package/skills/eval-harness/tasks/lane-inference.jsonl +7 -0
- package/skills/eval-harness/tasks/ticket-triage.jsonl +6 -0
- package/skills/eval-harness/tasks/tool-selection.jsonl +15 -0
- package/skills/eval-harness/test/eval-gate.test.sh +132 -0
- package/skills/eval-harness/test/extract-block.test.sh +87 -0
- package/skills/eval-harness/test/gate-classification.test.sh +77 -0
- package/skills/eval-harness/test/gen-models.test.sh +75 -0
- package/skills/eval-harness/test/measure-classification.test.sh +74 -0
- package/skills/eval-harness/test/parse-label.test.sh +129 -0
- package/skills/eval-harness/test/registry-completeness.test.sh +109 -0
- package/skills/eval-harness/test/verdict.test.sh +123 -0
- package/skills/every-style-editor/SKILL.md +142 -0
- package/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
- package/skills/feature-tweet/SKILL.md +199 -0
- package/skills/feature-video/SKILL.md +412 -0
- package/skills/feature-video/scripts/check_deps.sh +281 -0
- package/skills/file-todos/SKILL.md +267 -0
- package/skills/file-todos/assets/todo-template.md +166 -0
- package/skills/fix-issue/SKILL.md +278 -0
- package/skills/fix-issue/references/agent-authored-exclusion.md +120 -0
- package/skills/fix-issue/references/exclude-label-jq-snippet.md +97 -0
- package/skills/flag-bootstrap/SETUP.md +142 -0
- package/skills/flag-create/SKILL.md +145 -0
- package/skills/flag-create/scripts/create.sh +273 -0
- package/skills/flag-delete/SKILL.md +167 -0
- package/skills/flag-delete/scripts/delete.sh +288 -0
- package/skills/flag-list/SKILL.md +99 -0
- package/skills/flag-list/scripts/list.sh +275 -0
- package/skills/flag-set-role/SKILL.md +229 -0
- package/skills/flag-set-role/scripts/flip.sh +774 -0
- package/skills/frontend-anti-slop/SKILL.md +106 -0
- package/skills/frontend-anti-slop/references/anti-patterns.md +199 -0
- package/skills/frontend-anti-slop/references/slop-rules.md +65 -0
- package/skills/frontend-anti-slop/scripts/tier1-scan.ts +525 -0
- package/skills/frontend-design/SKILL.md +77 -0
- package/skills/gdpr-gate/NOTICE +136 -0
- package/skills/gdpr-gate/SKILL.md +341 -0
- package/skills/gdpr-gate/references/fields.md +160 -0
- package/skills/gdpr-gate/references/layers/api-layer.md +355 -0
- package/skills/gdpr-gate/references/layers/auth-sessions.md +290 -0
- package/skills/gdpr-gate/references/layers/data-in-transit.md +331 -0
- package/skills/gdpr-gate/references/layers/data-lifecycle.md +341 -0
- package/skills/gdpr-gate/references/layers/frontend.md +249 -0
- package/skills/gdpr-gate/references/layers/testing-seeding.md +256 -0
- package/skills/gdpr-gate/references/leakage-vectors.md +248 -0
- package/skills/gdpr-gate/references/legacy/legal-consent-v1-prose.md +48 -0
- package/skills/gdpr-gate/references/legal-consent.md +140 -0
- package/skills/gdpr-gate/references/non-negotiables.md +60 -0
- package/skills/gdpr-gate/scripts/gdpr-gate.sh +271 -0
- package/skills/gdpr-gate/scripts/notice-frontmatter.sh +337 -0
- package/skills/gdpr-gate/scripts/path-denylist.txt +39 -0
- package/skills/gdpr-gate/scripts/repo-scan.sh +158 -0
- package/skills/gdpr-gate/scripts/vendor-drift-classify.sh +120 -0
- package/skills/gdpr-gate/scripts/vendor-pin-integrity.sh +237 -0
- package/skills/gemini-imagegen/SKILL.md +283 -0
- package/skills/gemini-imagegen/requirements.txt +5 -0
- package/skills/gemini-imagegen/scripts/_error_handling.py +146 -0
- package/skills/gemini-imagegen/scripts/compose_images.py +150 -0
- package/skills/gemini-imagegen/scripts/edit_image.py +137 -0
- package/skills/gemini-imagegen/scripts/gemini_images.py +256 -0
- package/skills/gemini-imagegen/scripts/generate_image.py +147 -0
- package/skills/gemini-imagegen/scripts/multi_turn_chat.py +223 -0
- package/skills/gemini-imagegen/scripts/test_error_handling.py +179 -0
- package/skills/git-worktree/SKILL.md +534 -0
- package/skills/git-worktree/scripts/git-repo-readiness-diag.sh +98 -0
- package/skills/git-worktree/scripts/worktree-manager.sh +4773 -0
- package/skills/git-worktree/test/create-from-origin-main.test.sh +116 -0
- package/skills/git-worktree/test/lease-protects-active.test.sh +1056 -0
- package/skills/git-worktree/test/no-repo-fail-loud.test.sh +88 -0
- package/skills/git-worktree/test/orphan-reaper-honest-count.test.sh +379 -0
- package/skills/git-worktree/test/reap-archive-persistence.test.sh +725 -0
- package/skills/git-worktree/test/stale-lock-sweep.test.sh +176 -0
- package/skills/go/SKILL.md +54 -0
- package/skills/growth/SKILL.md +164 -0
- package/skills/harvest-debt/SKILL.md +78 -0
- package/skills/harvest-debt/scripts/harvest-debt.sh +114 -0
- package/skills/heal-skill/SKILL.md +173 -0
- package/skills/help/SKILL.md +46 -0
- package/skills/incident/NOTICE +39 -0
- package/skills/incident/SKILL.md +395 -0
- package/skills/incident/scripts/dry-run.sh +448 -0
- package/skills/incident/scripts/redact-engine.py +412 -0
- package/skills/incident/scripts/redact-sentinel.sh +44 -0
- package/skills/incident/templates/pir.md +139 -0
- package/skills/incident/test/fixtures/dry-run-incident.json +26 -0
- package/skills/incident/test/fixtures/dry-run-secret-leak.json +26 -0
- package/skills/incident/test/fixtures/legacy-bash-scanner.sh +82 -0
- package/skills/incident/test/fixtures/positive-corpus.md +87 -0
- package/skills/incident/test/redact-sentinel.test.sh +1420 -0
- package/skills/invoice/SKILL.md +206 -0
- package/skills/kb-glossary/SKILL.md +71 -0
- package/skills/kb-glossary/references/glossary-format.md +111 -0
- package/skills/kb-glossary/references/rejected-request-register.md +115 -0
- package/skills/kb-search/SKILL.md +276 -0
- package/skills/kb-search/scripts/kb-search-cache.sh +123 -0
- package/skills/legal-audit/SKILL.md +161 -0
- package/skills/legal-generate/NOTICE +242 -0
- package/skills/legal-generate/SKILL.md +244 -0
- package/skills/legal-generate/references/templates/advisor-agreement/template.md +12 -0
- package/skills/legal-generate/references/templates/business-associate-agreement/template.md +112 -0
- package/skills/legal-generate/references/templates/cookie-notice/template.md +82 -0
- package/skills/legal-generate/references/templates/dpa-global/template.md +439 -0
- package/skills/legal-generate/references/templates/dpa-us/template.md +222 -0
- package/skills/legal-generate/references/templates/employee-offer-letter/template.md +75 -0
- package/skills/legal-generate/references/templates/master-services-agreement/template.md +252 -0
- package/skills/legal-generate/references/templates/mutual-nda/template.md +66 -0
- package/skills/legal-generate/references/templates/one-way-nda/template.md +38 -0
- package/skills/legal-generate/references/templates/privacy-policy-gdpr/template.md +427 -0
- package/skills/legal-generate/references/templates/privacy-policy-us/template.md +313 -0
- package/skills/legal-generate/references/templates/terms-of-use/template.md +75 -0
- package/skills/legal-generate/scripts/strip-vendor-credit.sh +96 -0
- package/skills/linear-fetch/SKILL.md +247 -0
- package/skills/linear-fetch/scripts/assert-no-linear-telemetry.sh +66 -0
- package/skills/linear-fetch/scripts/redact-linear-urls.sh +51 -0
- package/skills/linear-fetch/scripts/render-caller-template.sh +36 -0
- package/skills/linear-fetch/test/assert-no-linear-telemetry.test.sh +113 -0
- package/skills/linear-fetch/test/parity.test.sh +112 -0
- package/skills/linear-fetch/test/persist-safe-integration.test.sh +191 -0
- package/skills/linear-fetch/test/redact-linear-urls.test.sh +226 -0
- package/skills/merge-pr/SKILL.md +670 -0
- package/skills/model-launch-review/SKILL.md +255 -0
- package/skills/model-launch-review/scripts/audit-models.sh +501 -0
- package/skills/one-shot/SKILL.md +316 -0
- package/skills/one-shot/references/token-discipline.md +74 -0
- package/skills/operator-bootstrap/SKILL.md +412 -0
- package/skills/operator-bootstrap/template.sh +439 -0
- package/skills/operator-digest/SKILL.md +287 -0
- package/skills/operator-digest/assets/operator-digest.workflow.yml +175 -0
- package/skills/operator-digest/scripts/digest-scrub.sh +119 -0
- package/skills/operator-digest/scripts/provision-operator-digest-repo.sh +147 -0
- package/skills/operator-rephrase/SKILL.md +98 -0
- package/skills/pencil-setup/SKILL.md +201 -0
- package/skills/pencil-setup/scripts/check_deps.sh +556 -0
- package/skills/pencil-setup/scripts/copy_adapter.sh +80 -0
- package/skills/pencil-setup/scripts/package-lock.json +1172 -0
- package/skills/pencil-setup/scripts/package.json +14 -0
- package/skills/pencil-setup/scripts/pencil-error-enrichment.mjs +21 -0
- package/skills/pencil-setup/scripts/pencil-mcp-adapter.mjs +733 -0
- package/skills/pencil-setup/scripts/pencil-response-classify.mjs +38 -0
- package/skills/pencil-setup/scripts/pencil-save-gate.mjs +26 -0
- package/skills/pencil-setup/scripts/sanitize-filename.mjs +25 -0
- package/skills/plan/SKILL.md +1140 -0
- package/skills/plan/references/differential-migration-testing.md +185 -0
- package/skills/plan/references/plan-community-discovery.md +42 -0
- package/skills/plan/references/plan-founder-check.md +137 -0
- package/skills/plan/references/plan-functional-overlap.md +25 -0
- package/skills/plan/references/plan-host-fanout.md +51 -0
- package/skills/plan/references/plan-issue-templates.md +779 -0
- package/skills/plan/references/plan-network-outage-checklist.md +131 -0
- package/skills/plan/references/plan-scope-check.md +126 -0
- package/skills/plan/references/plan-sharp-edges.md +331 -0
- package/skills/plan/references/plan-signoff-lifecycle.md +12 -0
- package/skills/plan/references/webapp-cwv-observability.md +143 -0
- package/skills/plan-review/SKILL.md +91 -0
- package/skills/plan-review/lib/named-panel.mjs +58 -0
- package/skills/plan-review/workflows/plan-review.workflow.js +477 -0
- package/skills/postmerge/SKILL.md +642 -0
- package/skills/postmerge/references/deploy-status-debugging.md +141 -0
- package/skills/postmerge/references/graceful-degradation.md +20 -0
- package/skills/postmerge/references/sentry-error-count-delta.md +137 -0
- package/skills/preflight/SKILL.md +1553 -0
- package/skills/preflight/references/check-13-founder-check.md +286 -0
- package/skills/preflight/scripts/founder-check.py +1640 -0
- package/skills/preflight/scripts/parse-form-a.awk +107 -0
- package/skills/preflight/scripts/probe-verb-gate.sh +108 -0
- package/skills/product-roadmap/SKILL.md +357 -0
- package/skills/product-roadmap/scripts/roadmap-reconcile.sh +327 -0
- package/skills/provision-cloudflare/SKILL.md +67 -0
- package/skills/provision-cloudflare/scripts/provision-cloudflare.sh +271 -0
- package/skills/provision-doppler/SKILL.md +58 -0
- package/skills/provision-doppler/scripts/provision-doppler.sh +358 -0
- package/skills/provision-github/SKILL.md +59 -0
- package/skills/provision-github/scripts/provision-github.sh +300 -0
- package/skills/provision-hetzner/SKILL.md +76 -0
- package/skills/provision-hetzner/scripts/provision-hetzner.sh +262 -0
- package/skills/provision-hetzner/test/fixture/knowledge-base/legal/tenant-dpa-register.md +26 -0
- package/skills/provision-hetzner/test/fixture/provision-hetzner-dry-run.golden +34 -0
- package/skills/provision-hetzner/test/provision-hetzner-characterization.test.sh +227 -0
- package/skills/qa/SKILL.md +263 -0
- package/skills/qa/references/browser-preflight.md +22 -0
- package/skills/questionnaire-generate/SKILL.md +328 -0
- package/skills/questionnaire-generate/references/questionnaire.template +60 -0
- package/skills/rclone/SKILL.md +162 -0
- package/skills/rclone/scripts/check_setup.sh +63 -0
- package/skills/release-announce/SKILL.md +65 -0
- package/skills/release-docs/SKILL.md +92 -0
- package/skills/reproduce-bug/SKILL.md +358 -0
- package/skills/resolve-debt/SKILL.md +85 -0
- package/skills/resolve-debt/scripts/resolve-debt.py +584 -0
- package/skills/resolve-parallel/SKILL.md +45 -0
- package/skills/resolve-parallel/workflows/resolve-parallel.workflow.js +415 -0
- package/skills/resolve-pr-parallel/SKILL.md +68 -0
- package/skills/resolve-pr-parallel/workflows/resolve-pr-parallel.workflow.js +419 -0
- package/skills/resolve-todo-parallel/SKILL.md +57 -0
- package/skills/resolve-todo-parallel/workflows/resolve-todo-parallel.workflow.js +398 -0
- package/skills/review/SKILL.md +1620 -0
- package/skills/review/references/anti-slop-scanner-hook.md +40 -0
- package/skills/review/references/defect-classes-migrations.md +9 -0
- package/skills/review/references/generated-input-oracle-surfaces.md +15 -0
- package/skills/review/references/review-e2e-testing.md +116 -0
- package/skills/review/references/review-evidence-comment.md +36 -0
- package/skills/review/references/review-todo-structure.md +165 -0
- package/skills/review/references/risk-tier-and-fix-rounds.md +97 -0
- package/skills/review/references/semgrep-custom-rules.yaml +174 -0
- package/skills/review/references/ultrathink-phases.md +98 -0
- package/skills/review/references/wfs.md +6 -0
- package/skills/review/scripts/emit-review-trailer.sh +499 -0
- package/skills/review/scripts/ensure-semgrep.sh +99 -0
- package/skills/review/scripts/fix-round-seats.sh +197 -0
- package/skills/review/test/emit-review-trailer.test.sh +387 -0
- package/skills/review/test/ensure-semgrep.test.sh +111 -0
- package/skills/review/test/fix-round-seats.test.sh +237 -0
- package/skills/review/workflows/README.md +147 -0
- package/skills/review/workflows/review.workflow.js +667 -0
- package/skills/schedule/SKILL.md +796 -0
- package/skills/seo-aeo/SKILL.md +139 -0
- package/skills/seo-aeo/scripts/validate-csp.sh +233 -0
- package/skills/seo-aeo/scripts/validate-seo.sh +262 -0
- package/skills/ship/SKILL.md +3023 -0
- package/skills/ship/references/adr-ordinal-collision.md +47 -0
- package/skills/ship/references/affected-gate-contract.md +115 -0
- package/skills/ship/references/ci-run-diagnosis.md +29 -0
- package/skills/ship/references/ci-workflow-authoring.md +68 -0
- package/skills/ship/references/cleanup-merged-archival.md +39 -0
- package/skills/ship/references/counsel-review-clo-attestation.md +38 -0
- package/skills/ship/references/cto-ruling-armed-push.md +5 -0
- package/skills/ship/references/decision-challenges-render.md +71 -0
- package/skills/ship/references/delegated-act-authoring-form.md +7 -0
- package/skills/ship/references/detached-battery-verdict.md +13 -0
- package/skills/ship/references/epic-close-sweep.md +62 -0
- package/skills/ship/references/feature-tweet-draft.md +42 -0
- package/skills/ship/references/followthrough-issue-body-template.md +47 -0
- package/skills/ship/references/followthrough-stub-template.sh +92 -0
- package/skills/ship/references/merge-queue-dequeue.md +39 -0
- package/skills/ship/references/operator-holds.md +179 -0
- package/skills/ship/references/pipeline-tally-render.md +43 -0
- package/skills/ship/references/pr-overlap.md +153 -0
- package/skills/ship/references/queue-mode.md +7 -0
- package/skills/ship/references/ready-run-wait.md +36 -0
- package/skills/ship/references/red-on-main-quarantine.md +110 -0
- package/skills/ship/references/register-update-pr-pattern.md +88 -0
- package/skills/ship/references/settle-then-admin-merge.md +130 -0
- package/skills/ship/references/supabase-column-probe.md +13 -0
- package/skills/ship/scripts/auto-close-scan.sh +76 -0
- package/skills/ship/scripts/battery-owed.sh +403 -0
- package/skills/ship/scripts/hold-gate-eval.sh +410 -0
- package/skills/ship/scripts/net-issue-flow.sh +665 -0
- package/skills/ship/scripts/pr-overlap-preflight.sh +483 -0
- package/skills/ship/scripts/ship-pir-action-items-gate.sh +246 -0
- package/skills/ship/scripts/technical-ruling-gate.sh +444 -0
- package/skills/skill-creator/SKILL.md +299 -0
- package/skills/skill-creator/references/api-security.md +248 -0
- package/skills/skill-creator/references/authoring-levers.md +110 -0
- package/skills/skill-creator/references/be-clear-and-direct.md +587 -0
- package/skills/skill-creator/references/best-practices.md +431 -0
- package/skills/skill-creator/references/common-patterns.md +639 -0
- package/skills/skill-creator/references/core-principles.md +193 -0
- package/skills/skill-creator/references/executable-code.md +188 -0
- package/skills/skill-creator/references/iteration-and-testing.md +509 -0
- package/skills/skill-creator/references/official-spec.md +193 -0
- package/skills/skill-creator/references/recommended-structure.md +180 -0
- package/skills/skill-creator/references/skill-structure.md +396 -0
- package/skills/skill-creator/references/using-scripts.md +122 -0
- package/skills/skill-creator/references/using-templates.md +120 -0
- package/skills/skill-creator/references/workflows-and-validation.md +541 -0
- package/skills/skill-creator/scripts/init_skill.py +322 -0
- package/skills/skill-creator/scripts/package_skill.py +110 -0
- package/skills/skill-creator/scripts/quick_validate.py +64 -0
- package/skills/skill-creator/templates/router-skill.md +73 -0
- package/skills/skill-creator/templates/simple-skill.md +34 -0
- package/skills/skill-creator/workflows/add-reference.md +96 -0
- package/skills/skill-creator/workflows/add-script.md +104 -0
- package/skills/skill-creator/workflows/add-template.md +83 -0
- package/skills/skill-creator/workflows/add-workflow.md +128 -0
- package/skills/skill-creator/workflows/audit-skill.md +159 -0
- package/skills/skill-creator/workflows/create-domain-expertise-skill.md +623 -0
- package/skills/skill-creator/workflows/create-new-skill.md +207 -0
- package/skills/skill-creator/workflows/get-guidance.md +134 -0
- package/skills/skill-creator/workflows/upgrade-to-router.md +170 -0
- package/skills/skill-creator/workflows/verify-skill.md +226 -0
- package/skills/skill-security-scan/SKILL.md +145 -0
- package/skills/skill-security-scan/references/disclaimer.md +21 -0
- package/skills/skill-security-scan/references/first-party-allowlist.yaml +38 -0
- package/skills/skill-security-scan/references/override-artifact-schema.json +68 -0
- package/skills/skill-security-scan/references/override-mechanism.md +171 -0
- package/skills/skill-security-scan/references/redirect-domains.yaml +27 -0
- package/skills/skill-security-scan/references/regex-patterns.md +136 -0
- package/skills/skill-security-scan/references/rules/code-exec.yaml +70 -0
- package/skills/skill-security-scan/references/rules/filesystem-boundary.yaml +29 -0
- package/skills/skill-security-scan/references/rules/manifest.yaml +44 -0
- package/skills/skill-security-scan/references/rules/supply-chain.yaml +36 -0
- package/skills/skill-security-scan/references/scan-meta-schema.json +63 -0
- package/skills/skill-security-scan/references/test-fixtures/clean-soleur-style.skill.md +23 -0
- package/skills/skill-security-scan/references/test-fixtures/clean-third-party.skill.md +26 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-codeexec.skill.md +23 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-curl-pipe-bash.skill.md +69 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-prompt-injection.skill.md +17 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-telemetry-beacon.skill.md +23 -0
- package/skills/skill-security-scan/references/typosquat-targets.yaml +65 -0
- package/skills/skill-security-scan/scripts/check-codeexec.sh +41 -0
- package/skills/skill-security-scan/scripts/check-filesystem-boundary.sh +19 -0
- package/skills/skill-security-scan/scripts/check-prompt-injection.sh +95 -0
- package/skills/skill-security-scan/scripts/check-supply-chain.sh +219 -0
- package/skills/skill-security-scan/scripts/check-telemetry-surface.sh +126 -0
- package/skills/skill-security-scan/scripts/lib.sh +197 -0
- package/skills/skill-security-scan/scripts/parse-override.sh +231 -0
- package/skills/skill-security-scan/scripts/run-scan.sh +342 -0
- package/skills/skill-security-scan/scripts/run-self-test.sh +95 -0
- package/skills/skill-security-scan/test/argv-ceiling.test.sh +180 -0
- package/skills/skill-security-scan/test/meta-dir-reap.test.sh +411 -0
- package/skills/skill-security-scan/test/parse-override.test.sh +607 -0
- package/skills/skill-security-scan/test/redact-pii-ghs-shape.test.sh +251 -0
- package/skills/social-distribute/SKILL.md +485 -0
- package/skills/spec-templates/SKILL.md +274 -0
- package/skills/sync/SKILL.md +49 -0
- package/skills/test-browser/SKILL.md +464 -0
- package/skills/test-browser/references/feature-map.md +161 -0
- package/skills/test-fix-loop/SKILL.md +159 -0
- package/skills/test-fix-loop/references/determinism-checklist.md +154 -0
- package/skills/triage/SKILL.md +402 -0
- package/skills/trigger-cron/SKILL.md +136 -0
- package/skills/trigger-cron/scripts/trigger.sh +198 -0
- package/skills/user-set-role/SKILL.md +147 -0
- package/skills/user-set-role/scripts/set-role.sh +218 -0
- package/skills/user-story-writer/SKILL.md +77 -0
- package/skills/ux-audit/SKILL.md +251 -0
- package/skills/ux-audit/references/finding.schema.json +62 -0
- package/skills/ux-audit/references/route-list.yaml +95 -0
- package/skills/ux-audit/scripts/bot-fixture.ts +270 -0
- package/skills/ux-audit/scripts/bot-signin.ts +135 -0
- package/skills/ux-audit/scripts/dedup-hash.ts +46 -0
- package/skills/verification-scaffold/SKILL.md +73 -0
- package/skills/verification-scaffold/references/gitleaks.toml.template +13 -0
- package/skills/verification-scaffold/references/guardrail-audit.md +156 -0
- package/skills/verification-scaffold/references/guards/block-stash-hook.sh.template +72 -0
- package/skills/verification-scaffold/references/guards/commit-on-main-hook.sh.template +82 -0
- package/skills/verification-scaffold/references/guards/orphan-test-check.sh.template +102 -0
- package/skills/verification-scaffold/references/guards/precommit-guard.sh.template +115 -0
- package/skills/verification-scaffold/references/guards/secret-scan-hook.sh.template +176 -0
- package/skills/verification-scaffold/references/guards/verification-gates.yml.template +49 -0
- package/skills/verification-scaffold/references/guards/wrapper-boundary.sh.template +47 -0
- package/skills/verification-scaffold/references/guards.tsv +21 -0
- package/skills/verification-scaffold/references/verification-readme.template +55 -0
- package/skills/verification-scaffold/scripts/verification-scaffold.sh +785 -0
- package/skills/verification-scaffold/test/bite-proof.test.sh +159 -0
- package/skills/verification-scaffold/test/generator.test.sh +319 -0
- package/skills/verification-scaffold/test/manifest.test.sh +144 -0
- package/skills/work/SKILL.md +1480 -0
- package/skills/work/references/end-of-work-resume.md +7 -0
- package/skills/work/references/hook-test-main-cwd.md +24 -0
- package/skills/work/references/key-principles.md +83 -0
- package/skills/work/references/property-testing.md +122 -0
- package/skills/work/references/sql-security-definer-rpc-scaffold.sql +78 -0
- package/skills/work/references/work-agent-teams.md +97 -0
- package/skills/work/references/work-lifecycle-parallel.md +147 -0
- package/skills/work/references/work-lockfile-bumps.md +97 -0
- package/skills/work/references/work-scratch-sandboxes.md +212 -0
- package/skills/work/references/work-subagent-fanout.md +61 -0
- package/skills/work/references/work-test-harness-sharp-edges.md +73 -0
- package/skills/xcode-test/SKILL.md +360 -0
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
export const meta = {
|
|
2
|
+
name: 'agent-native-audit-workflow',
|
|
3
|
+
description:
|
|
4
|
+
'Workflow-backed soleur:agent-native-audit — deterministic parallel fan-out of 8 agent-native principle auditors (Explore sub-agents), each returning a 0-100 sub-score + structured findings, synthesized into one scored report with a weighted overall score and impact-ranked recommendations. Supports a single-principle run via args.',
|
|
5
|
+
// Same phase titles as the phase() calls below so progress groups line up.
|
|
6
|
+
phases: [
|
|
7
|
+
{ title: 'Scope', detail: 'load agent-native principles + resolve which principle audits to run' },
|
|
8
|
+
{ title: 'Audit', detail: '8 principle auditors (Explore), in parallel — each returns a 0-100 sub-score + findings' },
|
|
9
|
+
{ title: 'Synthesize', detail: 'weighted overall score, status tiers, impact-ranked Top-10 recommendations' },
|
|
10
|
+
],
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// API-BUDGET DISCLOSURE (hr-autonomous-loop-skill-api-budget-disclosure)
|
|
15
|
+
//
|
|
16
|
+
// This workflow fans out ONE Explore sub-agent per principle audit. A full run
|
|
17
|
+
// is 8 principle auditors in parallel + 1 synthesis agent = up to 9 agents
|
|
18
|
+
// (a single-principle run is 1 auditor + 1 synthesis = 2). Each agent is a live
|
|
19
|
+
// model call billed against the Anthropic session key. Under BSL-1.1 the
|
|
20
|
+
// software is provided WITHOUT WARRANTY and Soleur disclaims liability for any
|
|
21
|
+
// runtime/API cost incurred by these calls — the operator owns that spend.
|
|
22
|
+
// CONFIRM the auditor count (printed in the Audit phase log) before the fan-out
|
|
23
|
+
// proceeds; abort the session if the count is unexpected.
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Input. args may be a bare string (a single principle selector) or an object:
|
|
29
|
+
// { principle, target }
|
|
30
|
+
// principle: optional single-principle selector ('action parity', '5', 'crud', …);
|
|
31
|
+
// when set, only that one auditor runs (SKILL.md §"Single Principle Audit").
|
|
32
|
+
// target: optional human label for the project under review (report header only).
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
const principleArg = (typeof args === 'string' ? args : args?.principle) || ''
|
|
35
|
+
const projectLabel = (typeof args === 'object' && args?.target) || ''
|
|
36
|
+
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Principle registry. The 8 core agent-native principles audited by SKILL.md,
|
|
39
|
+
// each mapped to: a stable key, the canonical headline, the auditor's task
|
|
40
|
+
// brief (faithful to the source sub-agent prompt), the scoring DENOMINATOR
|
|
41
|
+
// MEANING (so the auditor knows what "X out of Y" counts), and an impact WEIGHT
|
|
42
|
+
// used to compute the weighted overall score. Parity is the foundational
|
|
43
|
+
// principle (agent-native-architecture SKILL.md: "Without it, nothing else
|
|
44
|
+
// matters") so it carries the heaviest weight.
|
|
45
|
+
//
|
|
46
|
+
// Auditors all run as Explore sub-agents (read-only enumeration of the codebase)
|
|
47
|
+
// per SKILL.md Step 2 (`subagent_type: Explore`).
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
const PRINCIPLES = {
|
|
50
|
+
'action-parity': {
|
|
51
|
+
title: 'Action Parity',
|
|
52
|
+
tenet: 'Whatever the user can do, the agent can do.',
|
|
53
|
+
weight: 3,
|
|
54
|
+
denom: 'count of user actions; numerator = those with a corresponding agent tool',
|
|
55
|
+
task: `Enumerate ALL user actions in the frontend (API calls, button clicks, form submissions): search API service files, fetch calls, form handlers, routes, and components for user interactions. Then find every agent tool definition and map user actions to agent capabilities. A user action is covered if a tool (or composition of primitives) lets the agent achieve the SAME outcome — not a 1:1 button-to-tool mapping. The anti-pattern is an "orphan UI action": something a user can do that the agent cannot achieve.`,
|
|
56
|
+
},
|
|
57
|
+
'tools-as-primitives': {
|
|
58
|
+
title: 'Tools as Primitives',
|
|
59
|
+
tenet: 'Tools provide capability, not behavior.',
|
|
60
|
+
weight: 2,
|
|
61
|
+
denom: 'count of agent tools; numerator = those that are proper primitives (not workflow-shaped)',
|
|
62
|
+
task: `Find and read ALL agent tool files. Classify each tool as PRIMITIVE (good — read/write/store/list/bash: enables capability without business logic) or WORKFLOW (bad — encodes business logic, makes decisions, orchestrates a choreographed sequence). The cardinal sin is a tool like process_feedback that categorizes/prioritizes/notifies internally: that is the agent executing your code instead of figuring things out. Flag every workflow-shaped tool that should be decomposed into primitives.`,
|
|
63
|
+
},
|
|
64
|
+
'context-injection': {
|
|
65
|
+
title: 'Context Injection',
|
|
66
|
+
tenet: 'System prompt includes dynamic context about app state.',
|
|
67
|
+
weight: 2,
|
|
68
|
+
denom: 'count of expected runtime context types; numerator = those actually injected',
|
|
69
|
+
task: `Find context-injection code (search for "context", "system prompt", "inject"). Read agent prompts and system messages. Enumerate what IS injected versus what SHOULD be: available resources (files, drafts, documents, data types), user preferences/settings, recent activity, the available-capabilities list (tools documented in user vocabulary), session history, and workspace state. The anti-pattern is "context starvation" — the agent does not know what resources exist in the app, so it asks "what feed?" instead of acting.`,
|
|
70
|
+
},
|
|
71
|
+
'shared-workspace': {
|
|
72
|
+
title: 'Shared Workspace',
|
|
73
|
+
tenet: 'Agent and user work in the same data space.',
|
|
74
|
+
weight: 2,
|
|
75
|
+
denom: 'count of data stores/tables/models; numerator = those the agent shares with the user (not isolated)',
|
|
76
|
+
task: `Identify all data stores / tables / models. For each, check whether the agent reads/writes the SAME store the user does, or a separate one. The anti-pattern is "sandbox isolation": the agent has its own data space (e.g. agent_output/ alongside user_files/) so its work never lands where the user sees it. Score how many stores are genuinely shared.`,
|
|
77
|
+
},
|
|
78
|
+
'crud-completeness': {
|
|
79
|
+
title: 'CRUD Completeness',
|
|
80
|
+
tenet: 'Every entity has full CRUD (Create, Read, Update, Delete).',
|
|
81
|
+
weight: 2,
|
|
82
|
+
denom: 'count of entities/models; numerator = those with all four agent CRUD operations',
|
|
83
|
+
task: `Identify all entities/models in the codebase. For EACH entity, check whether agent tools exist for Create, Read, Update, AND Delete. The anti-pattern is incomplete CRUD — the agent can create a journal entry but has no tool to update or delete it ("I don't have a tool for that"). Score per entity (full CRUD or not) and overall; list every entity's missing operations.`,
|
|
84
|
+
},
|
|
85
|
+
'ui-integration': {
|
|
86
|
+
title: 'UI Integration',
|
|
87
|
+
tenet: 'Agent actions are immediately reflected in the UI.',
|
|
88
|
+
weight: 2,
|
|
89
|
+
denom: 'count of agent write/mutation paths; numerator = those that propagate to the UI immediately',
|
|
90
|
+
task: `Check how agent writes/changes propagate to the frontend. Look for streaming updates (SSE, WebSocket), polling, shared state/services with reactive binding, event buses, or file watching. The anti-pattern is "silent actions": the agent changes state but the UI does not update, so the user never sees the result. Score how many agent mutation paths surface immediately in the UI.`,
|
|
91
|
+
},
|
|
92
|
+
'capability-discovery': {
|
|
93
|
+
title: 'Capability Discovery',
|
|
94
|
+
tenet: 'Users can discover what the agent can do.',
|
|
95
|
+
weight: 1,
|
|
96
|
+
denom: '7 discovery mechanisms (FIXED denominator)',
|
|
97
|
+
task: `Check for these SEVEN discovery mechanisms and score against all 7: (1) onboarding flow showing agent capabilities, (2) help documentation, (3) capability hints in the UI, (4) the agent self-describing in its responses, (5) suggested prompts/actions, (6) empty-state guidance, (7) slash commands such as /help or /tools. The denominator is always 7. Rate the quality of each that exists.`,
|
|
98
|
+
},
|
|
99
|
+
'prompt-native': {
|
|
100
|
+
title: 'Prompt-Native Features',
|
|
101
|
+
tenet: 'Features are prompts defining outcomes, not code.',
|
|
102
|
+
weight: 1,
|
|
103
|
+
denom: 'count of features/behaviors; numerator = those defined in prompts (not hardcoded)',
|
|
104
|
+
task: `Read all agent prompts. Classify each feature/behavior as defined in a PROMPT (good — outcomes described in natural language, behavior changes via prompt edit) or in CODE (bad — business logic hardcoded, behavior changes require a refactor). The test: to change how a feature behaves, do you edit prose or refactor code? Flag every code-defined feature that should be prompt-native.`,
|
|
105
|
+
},
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Selector → principle key. Faithful to SKILL.md §"Valid arguments". A bare or
|
|
109
|
+
// unrecognized selector means "run all 8".
|
|
110
|
+
const SELECTOR_TO_KEY = {
|
|
111
|
+
'1': 'action-parity', 'action parity': 'action-parity', 'parity': 'action-parity', 'action-parity': 'action-parity',
|
|
112
|
+
'2': 'tools-as-primitives', 'tools': 'tools-as-primitives', 'primitives': 'tools-as-primitives', 'tools-as-primitives': 'tools-as-primitives',
|
|
113
|
+
'3': 'context-injection', 'context': 'context-injection', 'injection': 'context-injection', 'context-injection': 'context-injection',
|
|
114
|
+
'4': 'shared-workspace', 'shared': 'shared-workspace', 'workspace': 'shared-workspace', 'shared-workspace': 'shared-workspace',
|
|
115
|
+
'5': 'crud-completeness', 'crud': 'crud-completeness', 'crud-completeness': 'crud-completeness',
|
|
116
|
+
'6': 'ui-integration', 'ui': 'ui-integration', 'integration': 'ui-integration', 'ui-integration': 'ui-integration',
|
|
117
|
+
'7': 'capability-discovery', 'discovery': 'capability-discovery', 'capability-discovery': 'capability-discovery',
|
|
118
|
+
'8': 'prompt-native', 'prompt': 'prompt-native', 'features': 'prompt-native', 'prompt-native': 'prompt-native',
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function selectPrinciples(raw) {
|
|
122
|
+
const key = SELECTOR_TO_KEY[String(raw).trim().toLowerCase()]
|
|
123
|
+
return key ? [key] : Object.keys(PRINCIPLES)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
// Schemas — validated at the tool-call layer, so agents retry on mismatch.
|
|
128
|
+
// additionalProperties:false everywhere: agents return DATA, not prose.
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
const AUDIT_SCHEMA = {
|
|
131
|
+
type: 'object',
|
|
132
|
+
required: ['scorePct', 'numerator', 'denominator', 'denominatorMeaning', 'summary', 'instances', 'gaps', 'recommendations'],
|
|
133
|
+
additionalProperties: false,
|
|
134
|
+
properties: {
|
|
135
|
+
scorePct: { type: 'integer', minimum: 0, maximum: 100, description: '0-100 compliance sub-score = round(100 * numerator / denominator)' },
|
|
136
|
+
numerator: { type: 'integer', minimum: 0, description: 'count satisfying the principle (e.g. user actions with a matching agent tool)' },
|
|
137
|
+
denominator: { type: 'integer', minimum: 0, description: 'total counted (e.g. user actions found); 0 only when the principle is not applicable to this codebase' },
|
|
138
|
+
denominatorMeaning: { type: 'string', description: 'what the X/Y counts in this codebase' },
|
|
139
|
+
summary: { type: 'string', description: 'one-paragraph verdict for this principle' },
|
|
140
|
+
instances: {
|
|
141
|
+
type: 'array',
|
|
142
|
+
description: 'the enumerated rows (user actions, tools, entities, stores, mechanisms, …) the score is computed over',
|
|
143
|
+
items: {
|
|
144
|
+
type: 'object',
|
|
145
|
+
required: ['name', 'location', 'compliant'],
|
|
146
|
+
additionalProperties: false,
|
|
147
|
+
properties: {
|
|
148
|
+
name: { type: 'string', description: 'the action / tool / entity / store / mechanism' },
|
|
149
|
+
location: { type: 'string', description: 'file path or area where it lives' },
|
|
150
|
+
compliant: { type: 'boolean', description: 'does this instance satisfy the principle?' },
|
|
151
|
+
note: { type: 'string', description: 'e.g. matched agent tool, missing CRUD op, isolated store, …' },
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
gaps: {
|
|
156
|
+
type: 'array',
|
|
157
|
+
description: 'specific anti-pattern instances (orphan UI action, workflow-shaped tool, silent action, missing CRUD op, isolated store, …)',
|
|
158
|
+
items: {
|
|
159
|
+
type: 'object',
|
|
160
|
+
required: ['gap', 'severity'],
|
|
161
|
+
additionalProperties: false,
|
|
162
|
+
properties: {
|
|
163
|
+
gap: { type: 'string' },
|
|
164
|
+
location: { type: 'string' },
|
|
165
|
+
severity: { type: 'string', enum: ['high', 'medium', 'low'] },
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
recommendations: {
|
|
170
|
+
type: 'array',
|
|
171
|
+
description: 'concrete fixes to raise this sub-score',
|
|
172
|
+
items: {
|
|
173
|
+
type: 'object',
|
|
174
|
+
required: ['action', 'impact', 'effort'],
|
|
175
|
+
additionalProperties: false,
|
|
176
|
+
properties: {
|
|
177
|
+
action: { type: 'string', description: 'imperative fix, e.g. "add delete_note tool"' },
|
|
178
|
+
impact: { type: 'string', enum: ['high', 'medium', 'low'] },
|
|
179
|
+
effort: { type: 'string', enum: ['high', 'medium', 'low'] },
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const SYNTH_SCHEMA = {
|
|
187
|
+
type: 'object',
|
|
188
|
+
required: ['narrative', 'strengths', 'topRecommendations'],
|
|
189
|
+
additionalProperties: false,
|
|
190
|
+
properties: {
|
|
191
|
+
narrative: { type: 'string', description: 'executive verdict on overall agent-native maturity' },
|
|
192
|
+
strengths: {
|
|
193
|
+
type: 'array',
|
|
194
|
+
description: "what's working excellently (top strengths across all principles)",
|
|
195
|
+
items: { type: 'string' },
|
|
196
|
+
},
|
|
197
|
+
topRecommendations: {
|
|
198
|
+
type: 'array',
|
|
199
|
+
description: 'Top-10 recommendations ranked by impact across all principles',
|
|
200
|
+
items: {
|
|
201
|
+
type: 'object',
|
|
202
|
+
required: ['priority', 'action', 'principle', 'effort'],
|
|
203
|
+
additionalProperties: false,
|
|
204
|
+
properties: {
|
|
205
|
+
priority: { type: 'integer', minimum: 1, description: '1 = highest impact' },
|
|
206
|
+
action: { type: 'string' },
|
|
207
|
+
principle: { type: 'string', description: 'which principle this raises' },
|
|
208
|
+
effort: { type: 'string', enum: ['high', 'medium', 'low'] },
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
// Prompt builders.
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
const targetClause = projectLabel
|
|
219
|
+
? `Project under review: "${projectLabel}". Audit the codebase at the current working directory.`
|
|
220
|
+
: `Audit the codebase at the current working directory.`
|
|
221
|
+
|
|
222
|
+
function auditPrompt(key) {
|
|
223
|
+
const p = PRINCIPLES[key]
|
|
224
|
+
return `You are a read-only agent-native architecture auditor for ONE principle: ${p.title} — "${p.tenet}"
|
|
225
|
+
${targetClause}
|
|
226
|
+
|
|
227
|
+
Your task:
|
|
228
|
+
${p.task}
|
|
229
|
+
|
|
230
|
+
Enumerate exhaustively (do NOT sample — read the actual source: API service files, route/component files, agent tool definitions, system prompts, data models/migrations, UI update plumbing — whichever this principle requires). Then produce a SPECIFIC numeric score.
|
|
231
|
+
|
|
232
|
+
Scoring contract:
|
|
233
|
+
- denominator = ${p.denom}.
|
|
234
|
+
- numerator = the subset that satisfies the principle.
|
|
235
|
+
- scorePct = round(100 * numerator / denominator). If denominator is 0 (principle genuinely not applicable to this codebase), set scorePct 0 and say so in summary.
|
|
236
|
+
- "instances" must contain the enumerated rows the score is computed over, each marked compliant true/false.
|
|
237
|
+
- "gaps" must call out the concrete anti-pattern instances by name and location.
|
|
238
|
+
- "recommendations" must be concrete, imperative fixes with impact + effort.
|
|
239
|
+
|
|
240
|
+
Be precise and conservative: every count must be defensible against the real code. Return the structured audit object.`
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function synthPrompt(audits) {
|
|
244
|
+
// Pass the auditors' DATA (scores, gaps, recs) to the synthesizer as the
|
|
245
|
+
// material for the executive report. No untrusted shell argv here — this
|
|
246
|
+
// agent only reasons and returns structured data.
|
|
247
|
+
const lines = audits.map(
|
|
248
|
+
(a) =>
|
|
249
|
+
`- ${a.title}: ${a.scorePct}% (${a.numerator}/${a.denominator} — ${a.denominatorMeaning}). ` +
|
|
250
|
+
`Gaps: ${a.gaps.length}. Top rec: ${a.recommendations[0]?.action || '(none)'}.`,
|
|
251
|
+
)
|
|
252
|
+
return `You are synthesizing an agent-native architecture review from completed per-principle audits.
|
|
253
|
+
${targetClause}
|
|
254
|
+
|
|
255
|
+
Per-principle results:
|
|
256
|
+
${lines.join('\n')}
|
|
257
|
+
|
|
258
|
+
Full per-principle detail (instances, gaps, recommendations) is in the audit data you have been given. Produce:
|
|
259
|
+
1. narrative — an executive verdict on overall agent-native maturity, grounded in the scores above (parity is foundational: "without it, nothing else matters").
|
|
260
|
+
2. strengths — the top things working excellently across principles.
|
|
261
|
+
3. topRecommendations — the Top-10 fixes ranked by impact (priority 1 = highest), each tagged with the principle it raises and an effort estimate. Front-load high-impact / low-effort wins.
|
|
262
|
+
|
|
263
|
+
Return the structured synthesis object. Do not restate every audit row — distill.`
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// ---------------------------------------------------------------------------
|
|
267
|
+
// Helpers (self-contained; no imports).
|
|
268
|
+
// ---------------------------------------------------------------------------
|
|
269
|
+
// Status tier per SKILL.md §"Status Legend": ✅ ≥80, ⚠️ 50-79, ❌ <50.
|
|
270
|
+
function statusTier(pct) {
|
|
271
|
+
if (pct >= 80) return 'excellent'
|
|
272
|
+
if (pct >= 50) return 'partial'
|
|
273
|
+
return 'needs-work'
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Budget floor: reserve headroom for the synthesis agent so a long audit
|
|
277
|
+
// fan-out never starves the report. NEVER silently skip — log if we degrade.
|
|
278
|
+
const SYNTH_FLOOR = 40_000 // output tokens to reserve past the audit fan-out
|
|
279
|
+
function synthBudgetOk() {
|
|
280
|
+
return !budget.total || budget.remaining() > SYNTH_FLOOR
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Weighted overall score: each principle contributes scorePct * weight. Parity
|
|
284
|
+
// is weighted heaviest because the source skill makes it foundational. An audit
|
|
285
|
+
// with denominator 0 (not applicable) is excluded from the weighting so an
|
|
286
|
+
// inapplicable principle does not drag the score to zero.
|
|
287
|
+
function weightedOverall(audits) {
|
|
288
|
+
let num = 0
|
|
289
|
+
let den = 0
|
|
290
|
+
for (const a of audits) {
|
|
291
|
+
if (a.denominator === 0) continue
|
|
292
|
+
const w = PRINCIPLES[a.key].weight
|
|
293
|
+
num += a.scorePct * w
|
|
294
|
+
den += w
|
|
295
|
+
}
|
|
296
|
+
return den ? Math.round(num / den) : 0
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// ---------------------------------------------------------------------------
|
|
300
|
+
// Run.
|
|
301
|
+
// ---------------------------------------------------------------------------
|
|
302
|
+
phase('Scope')
|
|
303
|
+
const keys = selectPrinciples(principleArg)
|
|
304
|
+
const singlePrinciple = keys.length === 1
|
|
305
|
+
// Budget disclosure / count confirmation (hr-autonomous-loop-skill-api-budget-disclosure):
|
|
306
|
+
// the auditor fan-out count is fixed by the selector and surfaced before fan-out.
|
|
307
|
+
log(
|
|
308
|
+
`Agent-native audit scope: ${keys.length} principle auditor(s)` +
|
|
309
|
+
`${singlePrinciple ? ` (single: ${PRINCIPLES[keys[0]].title})` : ' (full 8-principle pass)'} ` +
|
|
310
|
+
`→ ${keys.length} Explore agent(s) + 1 synthesis = ${keys.length + 1} agents billed to the session key. ` +
|
|
311
|
+
`Principles: ${keys.map((k) => PRINCIPLES[k].title).join(', ')}.`,
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
// Audit: 8 (or 1) Explore auditors in parallel — BARRIER. Each returns its
|
|
315
|
+
// 0-100 sub-score + findings. A failed auditor becomes null → filter(Boolean).
|
|
316
|
+
phase('Audit')
|
|
317
|
+
const auditResults = (
|
|
318
|
+
await parallel(
|
|
319
|
+
keys.map((key) => () =>
|
|
320
|
+
agent(auditPrompt(key), {
|
|
321
|
+
label: `audit:${key}`,
|
|
322
|
+
phase: 'Audit',
|
|
323
|
+
schema: AUDIT_SCHEMA,
|
|
324
|
+
agentType: 'Explore', // SKILL.md Step 2: subagent_type: Explore
|
|
325
|
+
}).then((r) => (r ? { key, title: PRINCIPLES[key].title, tenet: PRINCIPLES[key].tenet, ...r } : null)),
|
|
326
|
+
),
|
|
327
|
+
)
|
|
328
|
+
).filter(Boolean)
|
|
329
|
+
|
|
330
|
+
const failed = keys.filter((k) => !auditResults.some((a) => a.key === k))
|
|
331
|
+
if (failed.length) {
|
|
332
|
+
log(`⚠ ${failed.length} auditor(s) did not return: ${failed.map((k) => PRINCIPLES[k].title).join(', ')} — excluded from the overall score.`)
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// Per-principle scoreboard (deterministic; the SCRIPT owns the tiering + weighting).
|
|
336
|
+
const scoreboard = auditResults
|
|
337
|
+
.map((a) => ({
|
|
338
|
+
principle: a.title,
|
|
339
|
+
tenet: a.tenet,
|
|
340
|
+
scorePct: a.scorePct,
|
|
341
|
+
score: `${a.numerator}/${a.denominator}`,
|
|
342
|
+
status: statusTier(a.scorePct),
|
|
343
|
+
gapCount: a.gaps.length,
|
|
344
|
+
}))
|
|
345
|
+
// Stable, deterministic order: worst score first (most actionable on top), then by title.
|
|
346
|
+
.sort((x, y) => x.scorePct - y.scorePct || x.principle.localeCompare(y.principle))
|
|
347
|
+
|
|
348
|
+
const overallPct = weightedOverall(auditResults)
|
|
349
|
+
const overallStatus = statusTier(overallPct)
|
|
350
|
+
|
|
351
|
+
// Synthesize: one agent distills the executive report. Budget-floored so the
|
|
352
|
+
// fan-out never starves it; degrade to a deterministic summary if floored.
|
|
353
|
+
phase('Synthesize')
|
|
354
|
+
let synthesis = null
|
|
355
|
+
if (auditResults.length && synthBudgetOk()) {
|
|
356
|
+
synthesis = await agent(synthPrompt(auditResults), { label: 'synthesize', phase: 'Synthesize', schema: SYNTH_SCHEMA })
|
|
357
|
+
}
|
|
358
|
+
if (!synthesis) {
|
|
359
|
+
// Deterministic fallback so the report is always complete: rank every
|
|
360
|
+
// recommendation across principles by impact (high>medium>low) and take 10.
|
|
361
|
+
const impactRank = { high: 0, medium: 1, low: 2 }
|
|
362
|
+
const flat = []
|
|
363
|
+
for (const a of auditResults) {
|
|
364
|
+
for (const r of a.recommendations) flat.push({ ...r, principle: a.title })
|
|
365
|
+
}
|
|
366
|
+
flat.sort((x, y) => impactRank[x.impact] - impactRank[y.impact] || impactRank[x.effort] - impactRank[y.effort])
|
|
367
|
+
synthesis = {
|
|
368
|
+
narrative: !auditResults.length
|
|
369
|
+
? 'No auditors returned results.'
|
|
370
|
+
: `Deterministic synthesis (synthesis agent unavailable or budget-floored). Weighted overall agent-native score: ${overallPct}% (${overallStatus}).`,
|
|
371
|
+
strengths: auditResults
|
|
372
|
+
.filter((a) => a.scorePct >= 80)
|
|
373
|
+
.map((a) => `${a.title}: ${a.scorePct}% — ${a.summary}`),
|
|
374
|
+
topRecommendations: flat.slice(0, 10).map((r, i) => ({ priority: i + 1, action: r.action, principle: r.principle, effort: r.effort })),
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// ---------------------------------------------------------------------------
|
|
379
|
+
// Return a structured summary (counts + what was done/verified).
|
|
380
|
+
// ---------------------------------------------------------------------------
|
|
381
|
+
const report = {
|
|
382
|
+
project: projectLabel || '(current working directory)',
|
|
383
|
+
mode: singlePrinciple ? `single-principle: ${PRINCIPLES[keys[0]].title}` : 'full 8-principle audit',
|
|
384
|
+
overall: { scorePct: overallPct, status: overallStatus },
|
|
385
|
+
statusLegend: { excellent: '≥80%', partial: '50-79%', needsWork: '<50%' },
|
|
386
|
+
scoreboard,
|
|
387
|
+
counts: {
|
|
388
|
+
principlesRequested: keys.length,
|
|
389
|
+
auditorsReturned: auditResults.length,
|
|
390
|
+
auditorsFailed: failed.length,
|
|
391
|
+
totalInstancesEnumerated: auditResults.reduce((n, a) => n + a.instances.length, 0),
|
|
392
|
+
totalGaps: auditResults.reduce((n, a) => n + a.gaps.length, 0),
|
|
393
|
+
totalRecommendations: auditResults.reduce((n, a) => n + a.recommendations.length, 0),
|
|
394
|
+
excellent: scoreboard.filter((s) => s.status === 'excellent').length,
|
|
395
|
+
partial: scoreboard.filter((s) => s.status === 'partial').length,
|
|
396
|
+
needsWork: scoreboard.filter((s) => s.status === 'needs-work').length,
|
|
397
|
+
},
|
|
398
|
+
narrative: synthesis.narrative,
|
|
399
|
+
strengths: synthesis.strengths,
|
|
400
|
+
topRecommendations: synthesis.topRecommendations,
|
|
401
|
+
// Full per-principle detail for drill-down.
|
|
402
|
+
audits: auditResults.map((a) => ({
|
|
403
|
+
principle: a.title,
|
|
404
|
+
tenet: a.tenet,
|
|
405
|
+
scorePct: a.scorePct,
|
|
406
|
+
score: `${a.numerator}/${a.denominator}`,
|
|
407
|
+
denominatorMeaning: a.denominatorMeaning,
|
|
408
|
+
status: statusTier(a.scorePct),
|
|
409
|
+
summary: a.summary,
|
|
410
|
+
instances: a.instances,
|
|
411
|
+
gaps: a.gaps,
|
|
412
|
+
recommendations: a.recommendations,
|
|
413
|
+
})),
|
|
414
|
+
budget: { total: budget.total, spent: budget.spent() },
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
log(
|
|
418
|
+
`Done: ${auditResults.length}/${keys.length} principle audits → overall ${overallPct}% (${overallStatus}). ` +
|
|
419
|
+
`${report.counts.excellent} excellent / ${report.counts.partial} partial / ${report.counts.needsWork} needs-work, ` +
|
|
420
|
+
`${report.counts.totalGaps} gaps, ${report.counts.totalRecommendations} recommendations.`,
|
|
421
|
+
)
|
|
422
|
+
|
|
423
|
+
return report
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: andrew-kane-gem-writer
|
|
3
|
+
description: "This skill should be used when writing Ruby gems following Andrew Kane's patterns. It applies when creating new gems, refactoring existing gems, or designing gem APIs with clean, minimal, production-ready code."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- grok-harness-invoke:start -->
|
|
7
|
+
**Grok Build (`plugins/soleur/lib/harness.ts` `invokeSkill()`):** Read this SKILL.md in this process and run it to completion. A one-segment `soleur:<name>` in this document names a SKILL — on Grok Build, Read `plugins/soleur/skills/<name>/SKILL.md` in this process; it is not a nested tool_use. A multi-segment id such as `soleur:<domain>:<name>` names an AGENT: spawn it, never Read it, and on Grok Build spawn_subagent takes the id with its colons replaced by hyphens (`agentIdToGrokSubagentType`). **Claude Code:** Skill tool for a skill (`soleur:<name>`), Task tool with `subagent_type` for an agent. Forbidden is executing a subset, not the Read.
|
|
8
|
+
<!-- grok-harness-invoke:end -->
|
|
9
|
+
|
|
10
|
+
# Andrew Kane Gem Writer
|
|
11
|
+
|
|
12
|
+
Write Ruby gems following Andrew Kane's battle-tested patterns from 100+ gems with 374M+ downloads (Searchkick, PgHero, Chartkick, Strong Migrations, Lockbox, Ahoy, Blazer, Groupdate, Neighbor, Blind Index).
|
|
13
|
+
|
|
14
|
+
## Core Philosophy
|
|
15
|
+
|
|
16
|
+
**Simplicity over cleverness.** Zero or minimal dependencies. Explicit code over metaprogramming. Rails integration without Rails coupling. Every pattern serves production use cases.
|
|
17
|
+
|
|
18
|
+
## Entry Point Structure
|
|
19
|
+
|
|
20
|
+
Every gem follows this exact pattern in `lib/gemname.rb`:
|
|
21
|
+
|
|
22
|
+
```ruby
|
|
23
|
+
# 1. Dependencies (stdlib preferred)
|
|
24
|
+
require "forwardable"
|
|
25
|
+
|
|
26
|
+
# 2. Internal modules
|
|
27
|
+
require_relative "gemname/model"
|
|
28
|
+
require_relative "gemname/version"
|
|
29
|
+
|
|
30
|
+
# 3. Conditional Rails (CRITICAL - never require Rails directly)
|
|
31
|
+
require_relative "gemname/railtie" if defined?(Rails)
|
|
32
|
+
|
|
33
|
+
# 4. Module with config and errors
|
|
34
|
+
module GemName
|
|
35
|
+
class Error < StandardError; end
|
|
36
|
+
class InvalidConfigError < Error; end
|
|
37
|
+
|
|
38
|
+
class << self
|
|
39
|
+
attr_accessor :timeout, :logger
|
|
40
|
+
attr_writer :client
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
self.timeout = 10 # Defaults set immediately
|
|
44
|
+
end
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Class Macro DSL Pattern
|
|
48
|
+
|
|
49
|
+
The signature Kane pattern—single method call configures everything:
|
|
50
|
+
|
|
51
|
+
```ruby
|
|
52
|
+
# Usage
|
|
53
|
+
class Product < ApplicationRecord
|
|
54
|
+
searchkick word_start: [:name]
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Implementation
|
|
58
|
+
module GemName
|
|
59
|
+
module Model
|
|
60
|
+
def gemname(**options)
|
|
61
|
+
unknown = options.keys - KNOWN_KEYWORDS
|
|
62
|
+
raise ArgumentError, "unknown keywords: #{unknown.join(", ")}" if unknown.any?
|
|
63
|
+
|
|
64
|
+
mod = Module.new
|
|
65
|
+
mod.module_eval do
|
|
66
|
+
define_method :some_method do
|
|
67
|
+
# implementation
|
|
68
|
+
end unless method_defined?(:some_method)
|
|
69
|
+
end
|
|
70
|
+
include mod
|
|
71
|
+
|
|
72
|
+
class_eval do
|
|
73
|
+
cattr_reader :gemname_options, instance_reader: false
|
|
74
|
+
class_variable_set :@@gemname_options, options.dup
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Rails Integration
|
|
82
|
+
|
|
83
|
+
**Always use `ActiveSupport.on_load`—never require Rails gems directly:**
|
|
84
|
+
|
|
85
|
+
```ruby
|
|
86
|
+
# WRONG
|
|
87
|
+
require "active_record"
|
|
88
|
+
ActiveRecord::Base.include(MyGem::Model)
|
|
89
|
+
|
|
90
|
+
# CORRECT
|
|
91
|
+
ActiveSupport.on_load(:active_record) do
|
|
92
|
+
extend GemName::Model
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Use prepend for behavior modification
|
|
96
|
+
ActiveSupport.on_load(:active_record) do
|
|
97
|
+
ActiveRecord::Migration.prepend(GemName::Migration)
|
|
98
|
+
end
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Configuration Pattern
|
|
102
|
+
|
|
103
|
+
Use `class << self` with `attr_accessor`, not Configuration objects:
|
|
104
|
+
|
|
105
|
+
```ruby
|
|
106
|
+
module GemName
|
|
107
|
+
class << self
|
|
108
|
+
attr_accessor :timeout, :logger
|
|
109
|
+
attr_writer :master_key
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def self.master_key
|
|
113
|
+
@master_key ||= ENV["GEMNAME_MASTER_KEY"]
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
self.timeout = 10
|
|
117
|
+
self.logger = nil
|
|
118
|
+
end
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Error Handling
|
|
122
|
+
|
|
123
|
+
Simple hierarchy with informative messages:
|
|
124
|
+
|
|
125
|
+
```ruby
|
|
126
|
+
module GemName
|
|
127
|
+
class Error < StandardError; end
|
|
128
|
+
class ConfigError < Error; end
|
|
129
|
+
class ValidationError < Error; end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Validate early with ArgumentError
|
|
133
|
+
def initialize(key:)
|
|
134
|
+
raise ArgumentError, "Key must be 32 bytes" unless key&.bytesize == 32
|
|
135
|
+
end
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Testing (Minitest Only)
|
|
139
|
+
|
|
140
|
+
```ruby
|
|
141
|
+
# test/test_helper.rb
|
|
142
|
+
require "bundler/setup"
|
|
143
|
+
Bundler.require(:default)
|
|
144
|
+
require "minitest/autorun"
|
|
145
|
+
require "minitest/pride"
|
|
146
|
+
|
|
147
|
+
# test/model_test.rb
|
|
148
|
+
class ModelTest < Minitest::Test
|
|
149
|
+
def test_basic_functionality
|
|
150
|
+
assert_equal expected, actual
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Gemspec Pattern
|
|
156
|
+
|
|
157
|
+
Zero runtime dependencies when possible:
|
|
158
|
+
|
|
159
|
+
```ruby
|
|
160
|
+
Gem::Specification.new do |spec|
|
|
161
|
+
spec.name = "gemname"
|
|
162
|
+
spec.version = GemName::VERSION
|
|
163
|
+
spec.required_ruby_version = ">= 3.1"
|
|
164
|
+
spec.files = Dir["*.{md,txt}", "{lib}/**/*"]
|
|
165
|
+
spec.require_path = "lib"
|
|
166
|
+
# NO add_dependency lines - dev deps go in Gemfile
|
|
167
|
+
end
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Anti-Patterns to Avoid
|
|
171
|
+
|
|
172
|
+
- `method_missing` (use `define_method` instead)
|
|
173
|
+
- Configuration objects (use class accessors)
|
|
174
|
+
- `@@class_variables` (use `class << self`)
|
|
175
|
+
- Requiring Rails gems directly
|
|
176
|
+
- Many runtime dependencies
|
|
177
|
+
- Committing Gemfile.lock in gems
|
|
178
|
+
- RSpec (use Minitest)
|
|
179
|
+
- Heavy DSLs (prefer explicit Ruby)
|
|
180
|
+
|
|
181
|
+
## Reference Files
|
|
182
|
+
|
|
183
|
+
For deeper patterns, see:
|
|
184
|
+
|
|
185
|
+
- **[references/module-organization.md](references/module-organization.md)** - Directory layouts, method decomposition
|
|
186
|
+
- **[references/rails-integration.md](references/rails-integration.md)** - Railtie, Engine, on_load patterns
|
|
187
|
+
- **[references/database-adapters.md](references/database-adapters.md)** - Multi-database support patterns
|
|
188
|
+
- **[references/testing-patterns.md](references/testing-patterns.md)** - Multi-version testing, CI setup
|
|
189
|
+
- **[references/resources.md](references/resources.md)** - Links to Kane's repos and articles
|