@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,498 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* Generate the OpenCode adapter tree from the canonical tree.
|
|
4
|
+
*
|
|
5
|
+
* bun plugins/soleur/scripts/sync-opencode-adapter.ts
|
|
6
|
+
* bun plugins/soleur/scripts/sync-opencode-adapter.ts --check
|
|
7
|
+
*
|
|
8
|
+
* OpenCode registers skills straight from the canonical tree through the `skills` config
|
|
9
|
+
* key (measurement §2.0), so — unlike Cursor — **no skill tree is generated**. Only
|
|
10
|
+
* agents and commands need a generated front door, because:
|
|
11
|
+
*
|
|
12
|
+
* - agents are discovered from a path, register as `mode: primary` unless
|
|
13
|
+
* `mode: subagent` is emitted, and ignore frontmatter `name:` (§3.0). A primary
|
|
14
|
+
* agent is unreachable from the `subagent` tool, so the field is the whole gate.
|
|
15
|
+
* - commands register from `commands/<name>.md` by filename stem and take
|
|
16
|
+
* `$ARGUMENTS` (§4.0).
|
|
17
|
+
*
|
|
18
|
+
* `--check` prints nothing but `opencode-adapter ok` when the committed tree matches a
|
|
19
|
+
* fresh walk; a drift, a missing stub, a stale extra, or a canonical agent with no stub
|
|
20
|
+
* exits 1 and names the path. There is no second checker.
|
|
21
|
+
*
|
|
22
|
+
* **Paths naming this checkout are emitted as `__SOLEUR_PLUGIN_ROOT__`, never absolute.**
|
|
23
|
+
* The tree is committed, so an absolute path would be wrong on every other machine and
|
|
24
|
+
* would make `--check` machine-dependent. `scripts/install-opencode-adapter.ts`
|
|
25
|
+
* resolves the token at install time.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from "fs";
|
|
29
|
+
import { dirname, join, relative, resolve } from "path";
|
|
30
|
+
import { parse as parseYaml } from "yaml";
|
|
31
|
+
import { pathToAgentId } from "../lib/agent-registry";
|
|
32
|
+
|
|
33
|
+
/** Directory this generator owns, relative to the plugin root. */
|
|
34
|
+
export const ADAPTER_DIR = "opencode";
|
|
35
|
+
|
|
36
|
+
/** Stands in for the plugin checkout in every emitted path. Resolved by the installer. */
|
|
37
|
+
export const PLUGIN_ROOT_TOKEN = "__SOLEUR_PLUGIN_ROOT__";
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Hand-written files inside `ADAPTER_DIR`. The generator asserts each one EXISTS but never
|
|
41
|
+
* emits it, never drift-checks its bytes and never deletes it.
|
|
42
|
+
*
|
|
43
|
+
* `opencode/plugin.ts` is the reason this set exists: it carries the hook dispatch logic, which
|
|
44
|
+
* has to be unit-tested by import — and a template string in this file cannot be imported. So
|
|
45
|
+
* the module is source, the generated stubs around it are not, and the drift check must be able
|
|
46
|
+
* to tell them apart without losing the "a committed tree is present" guarantee.
|
|
47
|
+
*/
|
|
48
|
+
export const ADAPTER_SOURCE_FILES: readonly string[] = [`${ADAPTER_DIR}/plugin.ts`];
|
|
49
|
+
|
|
50
|
+
function isAdapterSource(path: string): boolean {
|
|
51
|
+
return ADAPTER_SOURCE_FILES.includes(path);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const PLUGIN_ROOT = resolve(dirname(import.meta.filename), "..");
|
|
55
|
+
|
|
56
|
+
export interface CanonicalAgent {
|
|
57
|
+
/** Repo-relative canonical path, e.g. `agents/engineering/cto.md`. */
|
|
58
|
+
path: string;
|
|
59
|
+
/** Canonical registry id, e.g. `soleur:engineering:cto`. */
|
|
60
|
+
id: string;
|
|
61
|
+
description: string;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function frontmatter(path: string): Record<string, unknown> {
|
|
65
|
+
const raw = readFileSync(path, "utf-8");
|
|
66
|
+
const match = raw.match(/^---\n([\s\S]*?)\n---\n?/);
|
|
67
|
+
if (!match) return {};
|
|
68
|
+
try {
|
|
69
|
+
return (parseYaml(match[1]) ?? {}) as Record<string, unknown>;
|
|
70
|
+
} catch (error) {
|
|
71
|
+
// A YAML error with no path is unactionable; the generator walks ~70 files and the first
|
|
72
|
+
// broken one must say which. `--check` and a write both exit non-zero with this text.
|
|
73
|
+
throw new Error(`invalid YAML frontmatter in ${path}: ${String(error)}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function frontmatterString(path: string, key: string): string {
|
|
78
|
+
const value = frontmatter(path)[key];
|
|
79
|
+
return typeof value === "string" ? value : "";
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** YAML-safe double-quoted scalar. Descriptions carry `:` and `;` and must not break the parser. */
|
|
83
|
+
function yamlQuote(value: string): string {
|
|
84
|
+
const escaped = value
|
|
85
|
+
.replace(/\\/g, "\\\\")
|
|
86
|
+
.replace(/"/g, '\\"')
|
|
87
|
+
.replace(/\n/g, "\\n")
|
|
88
|
+
.replace(/\r/g, "\\r")
|
|
89
|
+
.replace(/\t/g, "\\t")
|
|
90
|
+
.replace(/[\u0000-\u001f\u007f\u2028\u2029]/g, (c) => `\\u${c.charCodeAt(0).toString(16).padStart(4, "0")}`);
|
|
91
|
+
return `"${escaped}"`;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Walk `<root>/agents/**` and return entries sorted by canonical id (deterministic output). */
|
|
95
|
+
export function walkAgents(root: string): CanonicalAgent[] {
|
|
96
|
+
const agentsDir = join(root, "agents");
|
|
97
|
+
const found: CanonicalAgent[] = [];
|
|
98
|
+
const visit = (dir: string): void => {
|
|
99
|
+
for (const entry of readdirSync(dir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
100
|
+
const full = join(dir, entry.name);
|
|
101
|
+
if (entry.isDirectory()) {
|
|
102
|
+
visit(full);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (!entry.name.endsWith(".md")) continue;
|
|
106
|
+
const repoRelative = `agents/${relative(agentsDir, full).split("\\").join("/")}`;
|
|
107
|
+
found.push({
|
|
108
|
+
path: repoRelative,
|
|
109
|
+
id: pathToAgentId(repoRelative),
|
|
110
|
+
description: frontmatterString(full, "description"),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
visit(agentsDir);
|
|
115
|
+
return found.sort((a, b) => a.id.localeCompare(b.id));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function walkCommands(root: string): string[] {
|
|
119
|
+
const commandsDir = join(root, "commands");
|
|
120
|
+
return readdirSync(commandsDir, { withFileTypes: true })
|
|
121
|
+
.filter((entry) => entry.isFile() && entry.name.endsWith(".md"))
|
|
122
|
+
.map((entry) => entry.name.replace(/\.md$/, ""))
|
|
123
|
+
.sort();
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function agentStub(agent: CanonicalAgent): string {
|
|
127
|
+
return [
|
|
128
|
+
"---",
|
|
129
|
+
"mode: subagent",
|
|
130
|
+
`description: ${yamlQuote(agent.description)}`,
|
|
131
|
+
// No `model:` line, deliberately. Canonical agents carry Claude Code SKU aliases
|
|
132
|
+
// (`sonnet`, `opus`) or the literal `inherit`; neither is an OpenCode `provider/model`
|
|
133
|
+
// id, and measurement §3.1 shows an agent carrying `model: inherit` is dropped from
|
|
134
|
+
// `GET /api/agent` entirely — the first draft emitted it and all 67 stubs were invisible.
|
|
135
|
+
// Omitting the key is what actually expresses "inherits the session model".
|
|
136
|
+
"---",
|
|
137
|
+
"",
|
|
138
|
+
`Stub for the canonical agent \`${agent.id}\`. OpenCode derives an agent's id from this`,
|
|
139
|
+
"file's path, so the canonical `name:` frontmatter is deliberately not repeated here.",
|
|
140
|
+
"",
|
|
141
|
+
`Read and follow the canonical agent definition at \`${PLUGIN_ROOT_TOKEN}/${agent.path}\`,`,
|
|
142
|
+
"then work as that agent.",
|
|
143
|
+
"",
|
|
144
|
+
].join("\n");
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function commandStub(name: string, description: string, record: Record<string, unknown>): string {
|
|
148
|
+
const lines = ["---"];
|
|
149
|
+
if (description !== "") lines.push(`description: ${yamlQuote(description)}`);
|
|
150
|
+
// Carried so the canonical "operator-typed only" intent is not dropped on the stub. The key
|
|
151
|
+
// is measured honored on this harness for skills (§2.3: 8 of 9 registered `autoinvoke:
|
|
152
|
+
// false`); its effect on commands is unmeasured, and unknown frontmatter keys are ignored
|
|
153
|
+
// (§4.0 registers by filename stem), so carrying it is safe in either world.
|
|
154
|
+
if (record["disable-model-invocation"] === true) lines.push("disable-model-invocation: true");
|
|
155
|
+
lines.push(
|
|
156
|
+
"---",
|
|
157
|
+
"",
|
|
158
|
+
`Run the canonical \`${name}\` command. Its full definition lives at`,
|
|
159
|
+
`\`${PLUGIN_ROOT_TOKEN}/commands/${name}.md\`; read and follow it.`,
|
|
160
|
+
"",
|
|
161
|
+
"Arguments passed to this command are:",
|
|
162
|
+
"",
|
|
163
|
+
"$ARGUMENTS",
|
|
164
|
+
"",
|
|
165
|
+
);
|
|
166
|
+
return lines.join("\n");
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* The two config keys the adapter contributes, as one definition: this file emits the fragment
|
|
171
|
+
* with the token standing in for the checkout, and `install-opencode-adapter.ts` unions the SAME
|
|
172
|
+
* values (token resolved) into the operator's config. Two shapes written twice drift apart
|
|
173
|
+
* silently — `test/opencode-adapter-install.test.ts` now pins the two copies to each other.
|
|
174
|
+
*/
|
|
175
|
+
export function configFragmentValues(root: string): { skills: string[]; instructions: string[] } {
|
|
176
|
+
return {
|
|
177
|
+
skills: [join(root, "skills")],
|
|
178
|
+
instructions: [join(root, ADAPTER_DIR, "INSTRUCTIONS.md")],
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function configFragment(): string {
|
|
183
|
+
return `${JSON.stringify(configFragmentValues(PLUGIN_ROOT_TOKEN), null, 2)}\n`;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function instructions(): string {
|
|
187
|
+
return [
|
|
188
|
+
"# Soleur on OpenCode — routing",
|
|
189
|
+
"",
|
|
190
|
+
"Generated by `scripts/sync-opencode-adapter.ts`. Do not edit by hand.",
|
|
191
|
+
"",
|
|
192
|
+
"## Skills",
|
|
193
|
+
"",
|
|
194
|
+
"Soleur skills register from the canonical tree through the `skills` config key, so this",
|
|
195
|
+
"harness has no generated skill tree. A skill id is the **bare directory basename**",
|
|
196
|
+
"(`plan`, `one-shot`, `work`): there is no `soleur:` namespace here (measurement §2.3).",
|
|
197
|
+
"",
|
|
198
|
+
"Canonical Soleur prose is written for Claude Code and says `soleur:<name>`. On this",
|
|
199
|
+
"harness that prefix is dropped: invoke `soleur:plan` as `plan`. An agent-read document",
|
|
200
|
+
"keeps the canonical form; an operator-typed or tool-invoked reference is bare.",
|
|
201
|
+
"",
|
|
202
|
+
"## Agents",
|
|
203
|
+
"",
|
|
204
|
+
"An agent id is derived from its file path, not from frontmatter `name:`, so",
|
|
205
|
+
"`soleur:engineering:cto` is spawned as `engineering/cto` (measurement §3.0). Every",
|
|
206
|
+
"Soleur agent is generated with `mode: subagent`; without that field an agent registers",
|
|
207
|
+
"as primary and the `subagent` tool cannot reach it.",
|
|
208
|
+
"",
|
|
209
|
+
"Spawn subagents through the **`subagent`** tool. It takes the path-derived id",
|
|
210
|
+
"(`engineering/cto`), a one-line `description`, and a complete `prompt` — the child sees",
|
|
211
|
+
"nothing but that prompt. Foreground waits for the result; `background: true` returns",
|
|
212
|
+
"immediately and notifies the parent when the child finishes.",
|
|
213
|
+
"",
|
|
214
|
+
"**Nesting depth is one.** A spawned child must not spawn further children: when a skill's",
|
|
215
|
+
"step says *the leader spawns X*, the leader is the session that invoked the skill. A child",
|
|
216
|
+
"that finds it needs a specialist reports back instead of delegating.",
|
|
217
|
+
"",
|
|
218
|
+
"## Commands",
|
|
219
|
+
"",
|
|
220
|
+
"`/go`, `/help`, `/sync` and `/version` register from the **config directory's** `commands/`",
|
|
221
|
+
"(`install-opencode-adapter.ts` copies `opencode/commands/*.md` there). The committed tree's",
|
|
222
|
+
"`opencode/commands/` is the source the installer copies, not a discovery root. If `/go` is",
|
|
223
|
+
"absent, the adapter is not installed: run",
|
|
224
|
+
"`bun \"${CLAUDE_PLUGIN_ROOT}/scripts/install-opencode-adapter.ts\" --check` (see *Paths and",
|
|
225
|
+
"entry points* below for the token) — it names what is missing (measurement §4.0).",
|
|
226
|
+
"",
|
|
227
|
+
"A stub's body carries the literal text `$ARGUMENTS`. OpenCode's docs say the token is",
|
|
228
|
+
"replaced with the invocation's arguments (§4.0 is docs-sourced, not measured); the stub is",
|
|
229
|
+
"written on that basis. If the token is still present when the command runs, read it as the",
|
|
230
|
+
"arguments you were given — the stub's job is to route you, not to parse them.",
|
|
231
|
+
"",
|
|
232
|
+
"## Paths and entry points",
|
|
233
|
+
"",
|
|
234
|
+
"Soleur's canonical prose calls scripts as `bash \"${CLAUDE_PLUGIN_ROOT}/<path>\"`, with the",
|
|
235
|
+
"token substituted at delivery time on Claude Code. **Nothing on this harness substitutes",
|
|
236
|
+
"it**, so a copied call reaches the shell with the token expanded to nothing, collapses to a",
|
|
237
|
+
"workdir-relative path, and surfaces as `source=none verified=false` in the `go` gate rather",
|
|
238
|
+
"than as anything that looks like a missing variable.",
|
|
239
|
+
"",
|
|
240
|
+
"The resolved root for this install is the line below — the installer rewrites it when it",
|
|
241
|
+
"copies this file:",
|
|
242
|
+
"",
|
|
243
|
+
" " + PLUGIN_ROOT_TOKEN,
|
|
244
|
+
"",
|
|
245
|
+
"Before running any canonical `bash` call, type that absolute path in place of the token. It",
|
|
246
|
+
"is the prefix for every path in the plugin (`skills/`, `agents/`, `commands/`, `hooks/`,",
|
|
247
|
+
"`scripts/`) and the prefix of the `skills` entry in `opencode.json`, so either source",
|
|
248
|
+
"disambiguates the other. Do not export or default a variable for it: the value is a literal",
|
|
249
|
+
"path here. A `subagent` child does not inherit your shell environment, so hand it the",
|
|
250
|
+
"absolute path in its prompt rather than assuming a variable exists.",
|
|
251
|
+
"",
|
|
252
|
+
"## Tools",
|
|
253
|
+
"",
|
|
254
|
+
"Canonical Soleur prose names Claude Code tools. This table is the translation, and the",
|
|
255
|
+
"property it is held to is that **every** name Soleur's agent-read corpus uses has a row",
|
|
256
|
+
"here (`test/harness-tool-map.test.ts`). The OpenCode side is the V2 built-in set",
|
|
257
|
+
"(measurement §12.8); V1 called the shell tool `bash` and V2 calls it `shell`.",
|
|
258
|
+
"",
|
|
259
|
+
"| Soleur instruction | OpenCode execution |",
|
|
260
|
+
"| --- | --- |",
|
|
261
|
+
"| Read / Glob / Grep | `read`, `glob`, `grep` |",
|
|
262
|
+
"| Write / Edit / MultiEdit | `write` for a new file, `edit` for a change (`replaceAll` replaces every match, which is all `MultiEdit` ever was); `patch` adds, moves or deletes several files in one call on the models that expose it |",
|
|
263
|
+
"| Bash / Shell | `shell`. Set `workdir` instead of putting `cd` in the command, `timeout` in milliseconds, and `background: true` for a long-running process |",
|
|
264
|
+
"| Skill `soleur:<name>` | The `skill` tool with the **bare** id: load `soleur:plan` as `plan`. The id must be in the advertised set, so a wrong one fails loudly instead of silently loading nothing |",
|
|
265
|
+
"| Task / Agent / spawn_subagent | The `subagent` tool with the path-derived id (`engineering/cto`) |",
|
|
266
|
+
"| AskUserQuestion | `question` — a real blocking prompt with a free-form answer always available |",
|
|
267
|
+
"| TodoWrite / TodoRead | No `todo` tool exists. Track the steps in the skill's own Markdown, or in a scratch file in the project |",
|
|
268
|
+
"| Monitor / AwaitShell / TaskOutput | `shell` with `background: true` returns immediately and notifies the session when the process finishes, retaining the full output in a managed file. There is no await/poll primitive and no background output reader; for a wait-until-event watch, run a bounded `shell` poll loop and keep progress visible |",
|
|
269
|
+
"| WebSearch / WebFetch / ToolSearch | `websearch`, `webfetch`. No tool-search tool exists: the built-in set is advertised up front, so name the tool the step wants |",
|
|
270
|
+
"| SendMessage / ListAgents | No equivalent. `subagent` starts a child and, in the background form, notifies on completion — there is no message-without-a-turn and no enumeration. Pass the returned `sessionID` to continue that same child |",
|
|
271
|
+
"| TaskCreate / TaskGet / TaskList / TaskUpdate / TaskStop | No equivalent, and no inventory of running children exists. Track steps in the skill's own Markdown or a project file |",
|
|
272
|
+
"| RemoteTrigger / PushNotification / ScheduleWakeup / CronCreate / CronDelete / CronList | No equivalent. Report the unsupported gate rather than simulating it — a scheduled or push-triggered step that silently does not fire is worse than one that refuses |",
|
|
273
|
+
"| NotebookEdit | No equivalent; edit the file with `edit` |",
|
|
274
|
+
"| Workflow scripts | Translate the orchestration into `subagent` calls; do not execute Claude tool calls as shell JavaScript |",
|
|
275
|
+
"",
|
|
276
|
+
"A gate with no OpenCode equivalent is stated as unsupported above, never silently",
|
|
277
|
+
"skipped — the same posture the hook ledger takes. A step that cannot fire must say so.",
|
|
278
|
+
"",
|
|
279
|
+
"## Hooks and completion",
|
|
280
|
+
"",
|
|
281
|
+
"The plugin module `plugin.ts` (installed as `<configdir>/plugins/soleur-plugin.ts`) is the hook",
|
|
282
|
+
"carrier. `.claude/hooks/opencode-dispositions.tsv` is its ledger: one row per canonical",
|
|
283
|
+
"registration, every row carrying a disposition, so a gate with no equivalent here is",
|
|
284
|
+
"**reported, never silently skipped**.",
|
|
285
|
+
"",
|
|
286
|
+
"OpenCode V2 has **no Stop hook**. Every hook surface communicates only by mutating the event",
|
|
287
|
+
"object it is handed, and `ctx.event.subscribe` is a one-way iterator with no return channel,",
|
|
288
|
+
"so no hook can defer a stop, force a continuation, or veto a completion. Soleur's completion",
|
|
289
|
+
"marker is therefore **advisory** on this harness: a session that goes quiet is observed and",
|
|
290
|
+
"nothing more. The structural checks inside the invoked skill are the contract, and the marker",
|
|
291
|
+
"is a report, not a gate.",
|
|
292
|
+
"",
|
|
293
|
+
"The guards are real, and they reuse the canonical scripts unchanged. A shell call is handed to",
|
|
294
|
+
"`browser-snapshot-credential-guard.sh` and `destructive-command-guard.sh` in the order",
|
|
295
|
+
"`hooks.json` registers them, and the decision is written onto the permission event: a `deny`",
|
|
296
|
+
"becomes `effect = \"deny\"` and a guard's `ask` becomes `effect = \"ask\"`, a real prompt. The tool",
|
|
297
|
+
"then reports `permission.rejected` carrying the guard's reason, which the model reads. Neither",
|
|
298
|
+
"value is downgraded — `deny` blocks, `ask` waits (measurement §12.2).",
|
|
299
|
+
"",
|
|
300
|
+
"The shell tool's wire name here is **`shell`**, not `bash`; the plugin maps both to Claude's",
|
|
301
|
+
"`Bash` before handing the call to a guard (measurement §12.1). Code-mode `execute` calls carry",
|
|
302
|
+
"JavaScript rather than a command and are not decided by the Bash guards — a limitation this",
|
|
303
|
+
"harness shares with the guard scripts' own input contract.",
|
|
304
|
+
"",
|
|
305
|
+
"**One canonical gate is absent here, and its consequence is a refusal you cannot talk around.**",
|
|
306
|
+
"`hooks/operator-stage-approval.sh` is what mints the digest-bound approval receipt a staged",
|
|
307
|
+
"`--apply` consumes, and no OpenCode surface can both rewrite the command and ask in the same",
|
|
308
|
+
"decision (ADR-264). So `plugins/soleur/scripts/lib/operator-script.sh`'s `soleur_op_stage_gate`",
|
|
309
|
+
"finds no receipt and exits **75** (`SOLEUR_BOOTSTRAP_APPROVAL_REQUIRED`). The typed-`yes`",
|
|
310
|
+
"fallback is gated on `-t 0`/`-t 1` **and** `soleur_op_in_agent_harness`, which recognises only",
|
|
311
|
+
"`CLAUDECODE`/`CLAUDE_CODE_ENTRYPOINT` — neither is set under OpenCode — so that arm is open",
|
|
312
|
+
"here whenever the spawned shell has a tty, and a terminal confirmation from an agent is not",
|
|
313
|
+
"evidence of a person. **No receipt can be minted on this harness**, so a staged `--apply`",
|
|
314
|
+
"refuses rather than approving. Nothing is approved silently.",
|
|
315
|
+
"",
|
|
316
|
+
"A degraded hook decision — a shell call whose `workdir` could not be correlated, or a runtime",
|
|
317
|
+
"with no `tool.execute.before` surface — is announced on stderr **and** written to the event log",
|
|
318
|
+
"when `SOLEUR_OPENCODE_EVENT_LOG` names a file (its parent directory must exist; unset means no",
|
|
319
|
+
"log). Whether your terminal surfaces plugin stderr is not something this adapter measured, so",
|
|
320
|
+
"arm the log when you need certainty. A `shell` call whose `workdir` cannot be used is",
|
|
321
|
+
"**prompted** rather than run unchecked — the guards still run, against the session directory,",
|
|
322
|
+
"and only their declining becomes the prompt.",
|
|
323
|
+
"",
|
|
324
|
+
"The post-compaction re-read is **armed, not guaranteed**, unlike Codex and Devin:",
|
|
325
|
+
"`ctx.session.hook(\"compaction\")` sets state and the next `ctx.session.hook(\"context\")`",
|
|
326
|
+
"re-injects the rule corpus plus the re-read directive. §12.3 captured that `context` fire",
|
|
327
|
+
"once; §14.0 records a later probe where it did **not** fire, unreconciled (#10587). No",
|
|
328
|
+
"compaction-support claim is published from this. Operationally: after a compaction you",
|
|
329
|
+
"notice, re-read `AGENTS.rules.md` yourself rather than assuming the injection happened.",
|
|
330
|
+
"What is not reproduced at all is `compaction-state.sh`'s transcript-bounded window",
|
|
331
|
+
"bookkeeping, which counts `compact_boundary` records in a Claude Code transcript this",
|
|
332
|
+
"harness has no equivalent of.",
|
|
333
|
+
"",
|
|
334
|
+
"## Uninstall / removal",
|
|
335
|
+
"",
|
|
336
|
+
"There is **no `--uninstall` flag** on `install-opencode-adapter.ts` today (tracked in",
|
|
337
|
+
"#10591 item 4), so removal is done by hand against the config dir the installer wrote to.",
|
|
338
|
+
"Four things were created; remove all four, because a partial removal is worse than none:",
|
|
339
|
+
"",
|
|
340
|
+
"1. **The generated `agents/` and `commands/` stubs.** These directories are **shared** with",
|
|
341
|
+
" the operator, so delete only the files whose body names the canonical plugin path (the",
|
|
342
|
+
" stubs' signature) — never the whole directory.",
|
|
343
|
+
"2. **`<configdir>/soleur/`** — the installed instructions tree.",
|
|
344
|
+
"3. **`<configdir>/plugins/soleur-plugin.ts`** — the hook carrier. Leaving it behind keeps",
|
|
345
|
+
" Soleur live after you meant to remove it: it still registers the Bash guards and still",
|
|
346
|
+
" re-injects the rule corpus on every session. It does **not** fail closed by itself — the",
|
|
347
|
+
" `guard-did-not-run` deny fires only when a guard *script* cannot be spawned (the checkout",
|
|
348
|
+
" moved or was removed, or `__SOLEUR_PLUGIN_ROOT__` never resolved), which is a checkout",
|
|
349
|
+
" problem rather than a leftover-file one.",
|
|
350
|
+
"4. **The `skills` and `instructions` entries the installer added to `<configdir>/opencode.json`.**",
|
|
351
|
+
" Edit the file and drop those two keys; leaving them behind points OpenCode at a tree that",
|
|
352
|
+
" no longer exists.",
|
|
353
|
+
"",
|
|
354
|
+
"Do **not** use `install-opencode-adapter.ts --check` to confirm removal. It is an",
|
|
355
|
+
"idempotence check for an *installed* adapter: it reports `MISSING` for every path it expects",
|
|
356
|
+
"and exits 1, so a correct removal is indistinguishable from a broken install. Verify by hand",
|
|
357
|
+
"instead — the four paths above are absent, and a fresh OpenCode session no longer",
|
|
358
|
+
"re-injects the Soleur rule corpus or emits a `[soleur] guard-run-failure` line.",
|
|
359
|
+
"",
|
|
360
|
+
].join("\n");
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Every file this generator owns, keyed by plugin-root-relative path.
|
|
365
|
+
* The map is the whole truth: `--check` compares the committed tree against it.
|
|
366
|
+
*/
|
|
367
|
+
export function expectedOpenCodeAdapter(root: string): Map<string, string> {
|
|
368
|
+
const files = new Map<string, string>();
|
|
369
|
+
for (const agent of walkAgents(root)) {
|
|
370
|
+
// The stub path IS the id: `agents/engineering/cto.md` → `opencode/agents/engineering/cto.md`
|
|
371
|
+
// → id `engineering/cto` (measurement §3.0). Renaming it silently changes the id.
|
|
372
|
+
files.set(`${ADAPTER_DIR}/agents/${agent.path.slice("agents/".length)}`, agentStub(agent));
|
|
373
|
+
}
|
|
374
|
+
for (const name of walkCommands(root)) {
|
|
375
|
+
const record = frontmatter(join(root, "commands", `${name}.md`));
|
|
376
|
+
const description = typeof record["description"] === "string" ? record["description"] : "";
|
|
377
|
+
files.set(`${ADAPTER_DIR}/commands/${name}.md`, commandStub(name, description, record));
|
|
378
|
+
}
|
|
379
|
+
files.set(`${ADAPTER_DIR}/opencode.json`, configFragment());
|
|
380
|
+
files.set(`${ADAPTER_DIR}/INSTRUCTIONS.md`, instructions());
|
|
381
|
+
return files;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/** Committed files under `opencode/`, plugin-root-relative. */
|
|
385
|
+
function committedOpenCodeAdapter(root: string): string[] {
|
|
386
|
+
const adapterDir = join(root, ADAPTER_DIR);
|
|
387
|
+
const found: string[] = [];
|
|
388
|
+
const visit = (dir: string): void => {
|
|
389
|
+
let entries;
|
|
390
|
+
try {
|
|
391
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
392
|
+
} catch {
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
396
|
+
const full = join(dir, entry.name);
|
|
397
|
+
if (entry.isDirectory()) {
|
|
398
|
+
visit(full);
|
|
399
|
+
continue;
|
|
400
|
+
}
|
|
401
|
+
if (entry.name === ".gitkeep") continue;
|
|
402
|
+
found.push(`${ADAPTER_DIR}/${relative(adapterDir, full).split("\\").join("/")}`);
|
|
403
|
+
}
|
|
404
|
+
};
|
|
405
|
+
visit(adapterDir);
|
|
406
|
+
return found.sort();
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/** Drift between the committed tree and a fresh walk. Empty means clean. */
|
|
410
|
+
export function openCodeAdapterProblems(root: string): string[] {
|
|
411
|
+
const expected = expectedOpenCodeAdapter(root);
|
|
412
|
+
const problems: string[] = [];
|
|
413
|
+
for (const [path, content] of expected) {
|
|
414
|
+
const full = join(root, path);
|
|
415
|
+
try {
|
|
416
|
+
if (readFileSync(full, "utf-8") !== content) problems.push(`DRIFT: ${path}`);
|
|
417
|
+
} catch {
|
|
418
|
+
problems.push(`MISSING: ${path}`);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
// A source file is not compared byte-for-byte, but its absence is a defect: a tree that
|
|
422
|
+
// dropped its hook module would otherwise pass with every generated stub intact.
|
|
423
|
+
for (const path of ADAPTER_SOURCE_FILES) {
|
|
424
|
+
if (!existsSync(join(root, path))) problems.push(`MISSING-SOURCE: ${path}`);
|
|
425
|
+
}
|
|
426
|
+
for (const path of committedOpenCodeAdapter(root)) {
|
|
427
|
+
if (!expected.has(path) && !isAdapterSource(path)) problems.push(`EXTRA: ${path}`);
|
|
428
|
+
}
|
|
429
|
+
return problems.sort();
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/** Write the whole tree, then report the post-write check (which catches stale extras). */
|
|
433
|
+
export function writeOpenCodeAdapter(root: string): string[] {
|
|
434
|
+
const expected = expectedOpenCodeAdapter(root);
|
|
435
|
+
for (const [path, content] of expected) {
|
|
436
|
+
const full = join(root, path);
|
|
437
|
+
mkdirSync(dirname(full), { recursive: true });
|
|
438
|
+
writeFileSync(full, content);
|
|
439
|
+
}
|
|
440
|
+
// A file the generator no longer emits is not removed by writing; surface it so a stale
|
|
441
|
+
// stub cannot sit in the tree looking supported.
|
|
442
|
+
for (const path of committedOpenCodeAdapter(root)) {
|
|
443
|
+
if (!expected.has(path) && !isAdapterSource(path)) rmSync(join(root, path), { force: true });
|
|
444
|
+
}
|
|
445
|
+
return openCodeAdapterProblems(root);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
export function parseRoot(argv: readonly string[]): string {
|
|
449
|
+
const index = argv.indexOf("--root");
|
|
450
|
+
if (index === -1) return PLUGIN_ROOT;
|
|
451
|
+
const value = argv[index + 1];
|
|
452
|
+
if (value === undefined) throw new Error("--root requires a directory");
|
|
453
|
+
return resolve(value);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
const USAGE = [
|
|
457
|
+
"Usage: bun plugins/soleur/scripts/sync-opencode-adapter.ts [--root DIR] [--check] [--help]",
|
|
458
|
+
"",
|
|
459
|
+
" --root DIR plugin root to walk (default: this checkout)",
|
|
460
|
+
" --check compare the committed tree against a fresh walk; write nothing",
|
|
461
|
+
" --help, -h print this text and exit 0 without writing",
|
|
462
|
+
].join("\n");
|
|
463
|
+
|
|
464
|
+
/**
|
|
465
|
+
* Every argument must be known. Silently ignoring an unknown flag means a typo (`--chek`)
|
|
466
|
+
* takes the WRITE path while the operator believes they asked for a check — the direction that
|
|
467
|
+
* destroys a tree. Exit 2 is the usage-error convention, distinct from a drift's exit 1.
|
|
468
|
+
*/
|
|
469
|
+
function validateArgs(argv: readonly string[]): void {
|
|
470
|
+
const withValue = new Set(["--root"]);
|
|
471
|
+
const known = new Set([...withValue, "--check", "--help", "-h"]);
|
|
472
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
473
|
+
const arg = argv[i];
|
|
474
|
+
if (arg === "--help" || arg === "-h") {
|
|
475
|
+
console.log(USAGE);
|
|
476
|
+
process.exit(0);
|
|
477
|
+
}
|
|
478
|
+
if (!known.has(arg)) {
|
|
479
|
+
console.error(`unknown argument: ${arg}\n${USAGE}`);
|
|
480
|
+
process.exit(2);
|
|
481
|
+
}
|
|
482
|
+
if (withValue.has(arg)) i += 1; // the value is consumed; its own leading dash is never validated
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
function main(): void {
|
|
487
|
+
const argv = process.argv.slice(2);
|
|
488
|
+
validateArgs(argv);
|
|
489
|
+
const root = parseRoot(argv);
|
|
490
|
+
const problems = argv.includes("--check") ? openCodeAdapterProblems(root) : writeOpenCodeAdapter(root);
|
|
491
|
+
if (problems.length > 0) {
|
|
492
|
+
for (const problem of problems) console.error(problem);
|
|
493
|
+
process.exit(1);
|
|
494
|
+
}
|
|
495
|
+
if (argv.includes("--check")) console.log("opencode-adapter ok");
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
if (import.meta.main) main();
|