@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,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR merge-state polling helpers — BEHIND detection and resync contract.
|
|
3
|
+
*
|
|
4
|
+
* Ship Phase 7 embeds the full poll loop; this module is the portable spec
|
|
5
|
+
* Grok Build agents use when polling outside Monitor tool (ad-hoc CI watch,
|
|
6
|
+
* PR babysit, post-merge verify prep).
|
|
7
|
+
*
|
|
8
|
+
* Failure mode (#6347 session): Grok polled `statusCheckRollup` pending/failed
|
|
9
|
+
* but ignored `mergeStateStatus: BEHIND` — burned 17 ticks while main moved.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { Harness } from "./harness";
|
|
13
|
+
|
|
14
|
+
/** GitHub `mergeStateStatus` values we act on during poll loops. */
|
|
15
|
+
export const MERGE_STATE_BEHIND = "BEHIND" as const;
|
|
16
|
+
export const MERGE_STATE_DIRTY = "DIRTY" as const;
|
|
17
|
+
export const MERGE_STATE_BLOCKED = "BLOCKED" as const;
|
|
18
|
+
export const MERGE_STATE_CLEAN = "CLEAN" as const;
|
|
19
|
+
|
|
20
|
+
export const MAX_BEHIND_SYNCS_DEFAULT = 6;
|
|
21
|
+
|
|
22
|
+
/** Sentinel for drift-guarded docs/scripts. */
|
|
23
|
+
export const PR_BEHIND_SYNC_SENTINEL = "pr-behind-sync-protocol";
|
|
24
|
+
|
|
25
|
+
/** `gh pr view` jq template — MUST include mergeStateStatus, not just checks. */
|
|
26
|
+
export const PR_VIEW_POLL_JQ =
|
|
27
|
+
'"\\(.state) \\(.mergeStateStatus)"';
|
|
28
|
+
|
|
29
|
+
export function formatPrPollState(state: string, mergeStateStatus: string): string {
|
|
30
|
+
return `${state} ${mergeStateStatus}`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function isBehindPollState(pollLine: string): boolean {
|
|
34
|
+
return pollLine.includes(MERGE_STATE_BEHIND);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function isTerminalPollState(pollLine: string): boolean {
|
|
38
|
+
return /^(MERGED|CLOSED)\b/.test(pollLine.trim());
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function isDirtyPollState(pollLine: string): boolean {
|
|
42
|
+
return pollLine.includes(MERGE_STATE_DIRTY);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* When true, stop CI-only polling and resync branch with origin/main first.
|
|
47
|
+
* BEHIND: auto-merge will not fire until head catches up to base.
|
|
48
|
+
* DIRTY: GitHub computed a conflict; locally-clean DIRTY (kb-index) still resyncs.
|
|
49
|
+
*/
|
|
50
|
+
export function shouldResyncBeforePoll(mergeStateStatus: string): boolean {
|
|
51
|
+
return (
|
|
52
|
+
mergeStateStatus === MERGE_STATE_BEHIND ||
|
|
53
|
+
mergeStateStatus === MERGE_STATE_DIRTY
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Harness-specific BEHIND/DIRTY resync instructions. The script discriminates:
|
|
59
|
+
* DIRTY auto-syncs only when `git merge-tree` proves the local merge clean
|
|
60
|
+
* (kb-index class); a real conflict exits 6 for manual resolution.
|
|
61
|
+
*/
|
|
62
|
+
export function behindSyncInstructions(harness: Harness): string {
|
|
63
|
+
// ADR-179: the installed plugin root, never a repo-relative path (a customer
|
|
64
|
+
// repo has no plugins/soleur/ tree).
|
|
65
|
+
const script = 'bash "${CLAUDE_PLUGIN_ROOT}/scripts/sync-pr-behind.sh"';
|
|
66
|
+
switch (harness) {
|
|
67
|
+
case "grok":
|
|
68
|
+
return [
|
|
69
|
+
"**BEHIND/DIRTY resync (Grok Build)**",
|
|
70
|
+
`- When \`gh pr view --jq '.mergeStateStatus'\` returns \`BEHIND\` or \`DIRTY\`, **STOP** CI-only polling.`,
|
|
71
|
+
`- Exception (first): when \`main\` has a merge queue and the PR is armed (the Phase 7 poll prints \`[ship.phase7.queue_wait]\`) the PR is waiting for GitHub to enqueue it — keep polling; never run the sync script, update-branch or --admin it until \`[ship.phase7.queue_wait_expired]\`, a push line, MERGED, a dequeue or any poll exit. This holds for a BEHIND reading only (a conflicting DIRTY PR still needs its sync). The script itself answers \`kind=queue_wait\` (exit 0, nothing synced) for that PR: a wait, not a failure.`,
|
|
72
|
+
`- Otherwise, from the PR worktree: \`${script} <PR-number>\` (fetch → merge origin/main → push). Use the Phase 7 loop; never write your own poll loop or wrap the script in one.`,
|
|
73
|
+
`- \`DIRTY\` auto-syncs only when the local merge is clean; a real conflict exits for manual resolution.`,
|
|
74
|
+
`- Match AwaitShell \`pattern\`: \`BEHIND detected|auto-sync.*pushed|BEHIND resolved|BEHIND unchanged|merge conflict|\\[pr-behind-sync\\] kind=|\\[ship\\.phase7\\.\`.`,
|
|
75
|
+
`- Exit 11 is a no-op: \`kind=noop\` is GitHub state lag. \`kind=queued\` means the PR is IN the merge queue and nothing was pushed (a push dequeues it): it exits 0 here and 11 only with \`--step\` — keep polling for MERGED, never push, update-branch or --admin it; re-poll, then re-run. \`kind=queue_wait\` (an armed BEHIND PR on a merge-queue repo, nothing synced) is a wait, not a failure: exit 0 here and exit 14 only under a flagless \`--step\`. Exit 13 (\`kind=dequeued\`) means it left the queue unmerged (a failed merge_group run or a removal; auto-merge may still read armed) — follow the recovery on that line. Exit 12 (\`kind=wrong_branch\`) means this worktree is not the PR's branch — cd to it. Any other \`kind=\` line names its next action.`,
|
|
76
|
+
`- Re-poll after push; do NOT ask the operator to update the branch.`,
|
|
77
|
+
].join("\n");
|
|
78
|
+
|
|
79
|
+
case "claude":
|
|
80
|
+
return [
|
|
81
|
+
"**BEHIND/DIRTY resync (Claude Code)**",
|
|
82
|
+
`- When mergeStateStatus is \`BEHIND\` or \`DIRTY\`, the ship Phase 7 Monitor loop calls \`sync-pr-behind.sh <PR-number> --step\` once per attempt (the Phase 7 fence's call, never yours; the script refuses a flagless \`--step\` on an armed BEHIND PR of a merge-queue repo: \`kind=queue_wait\`, exit 14, nothing synced). Never write your own poll loop — use that one. The standalone entry is \`${script} <PR-number>\`: it refuses an armed PR on a merge-queue repo with \`kind=queue_wait\` (exit 0, a wait, not a failure); DIRTY auto-syncs only when locally clean.`,
|
|
83
|
+
`- FORBIDDEN: heartbeating on pending checks while BEHIND or DIRTY — auto-merge is blocked — unless the script reported \`kind=queued\` (exit 11 with \`--step\`): a PR in the merge queue is not blocked, the queue merges it, so keep heartbeating and never sync it; likewise when \`main\` has a merge queue and the PR is armed (the Phase 7 poll prints \`[ship.phase7.queue_wait]\`) on a BEHIND reading (a conflicting DIRTY PR still syncs) — GitHub enqueues it, in force until \`[ship.phase7.queue_wait_expired]\`, a push line, MERGED, a dequeue or any poll exit; \`kind=dequeued\` (exit 13) stops the poll with the recovery.`,
|
|
84
|
+
].join("\n");
|
|
85
|
+
|
|
86
|
+
case "cursor":
|
|
87
|
+
return [
|
|
88
|
+
"**BEHIND/DIRTY resync (Cursor CLI)**",
|
|
89
|
+
"- No wait primitive has been measured on the Cursor CLI.",
|
|
90
|
+
"- This run cannot finish that gate.",
|
|
91
|
+
"- Continue that merge on a harness that already has a wait, or stop.",
|
|
92
|
+
"- Do not invent a wait. Do not hand the wait to the operator.",
|
|
93
|
+
"- This stop does not make the plugin supported.",
|
|
94
|
+
].join("\n");
|
|
95
|
+
|
|
96
|
+
default:
|
|
97
|
+
return [
|
|
98
|
+
"**BEHIND/DIRTY resync**",
|
|
99
|
+
`- Exception (first): when \`main\` has a merge queue and the PR is armed (the Phase 7 poll prints \`[ship.phase7.queue_wait]\`) the PR is waiting for GitHub to enqueue it — keep polling; never merge origin/main into it, resync-push, update-branch or --admin it (a fix commit for a red check is fine) until \`[ship.phase7.queue_wait_expired]\`, a push line, MERGED, a dequeue or any poll exit. This holds for a BEHIND reading only (a conflicting DIRTY PR still needs its sync). The script itself answers \`kind=queue_wait\` (exit 0, nothing synced) for that PR: a wait, not a failure.`,
|
|
100
|
+
`- Otherwise, mergeStateStatus \`BEHIND\` or \`DIRTY\` → run \`${script} <PR-number>\` from the PR worktree (fetch → merge origin/main → push; DIRTY only when the local merge is clean; it refuses an armed BEHIND PR on a merge-queue repo with \`kind=queue_wait\`, so never hand-merge instead). Use the Phase 7 loop; never write your own poll loop — on a harness without a Monitor tool, run that block itself inside the waiting subagent or shell.`,
|
|
101
|
+
].join("\n");
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow fidelity contract — prevents Grok Build (and Claude) agents from
|
|
3
|
+
* cherry-picking pipeline steps after `/go` routes to a registered skill, or
|
|
4
|
+
* stopping mid-chain when a lifecycle skill is invoked standalone.
|
|
5
|
+
*
|
|
6
|
+
* Failure mode (#6325 session): `/go` routed to one-shot; the parent ran
|
|
7
|
+
* worktree setup + inline implementation and stopped — skipping plan, review, ship.
|
|
8
|
+
* Extension (#6320 lifecycle): same bypass at `/brainstorm`, `/plan`, `/work` entry.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { Harness } from "./harness";
|
|
12
|
+
import { cursorSkillSlash } from "../scripts/sync-cursor-name-map";
|
|
13
|
+
|
|
14
|
+
/** Skills that own a multi-phase pipeline — must be invoked, never inlined. */
|
|
15
|
+
export const PIPELINE_SKILLS = [
|
|
16
|
+
"one-shot",
|
|
17
|
+
"brainstorm",
|
|
18
|
+
"drain-labeled-backlog",
|
|
19
|
+
"drain-prs",
|
|
20
|
+
] as const;
|
|
21
|
+
|
|
22
|
+
export type PipelineSkill = (typeof PIPELINE_SKILLS)[number];
|
|
23
|
+
|
|
24
|
+
/** Exploration handoff after brainstorm completes (shortcut: one-shot when reqs clear). */
|
|
25
|
+
export const BRAINSTORM_CHILD_SKILLS = ["plan", "one-shot"] as const;
|
|
26
|
+
|
|
27
|
+
/** Planning prefix before the shared implementation tail. */
|
|
28
|
+
export const PLAN_PIPELINE_PREFIX = ["plan", "deepen-plan"] as const;
|
|
29
|
+
|
|
30
|
+
/** Shared implementation tail — one-shot Steps 3–8 and standalone `/work` Phase 4. */
|
|
31
|
+
export const IMPLEMENTATION_TAIL = [
|
|
32
|
+
"work",
|
|
33
|
+
"review",
|
|
34
|
+
"qa",
|
|
35
|
+
"compound",
|
|
36
|
+
"ship",
|
|
37
|
+
] as const;
|
|
38
|
+
|
|
39
|
+
/** Child skills one-shot must invoke in order (Steps 1–7). */
|
|
40
|
+
export const ONE_SHOT_CHILD_SKILLS = [
|
|
41
|
+
...PLAN_PIPELINE_PREFIX,
|
|
42
|
+
...IMPLEMENTATION_TAIL,
|
|
43
|
+
] as const;
|
|
44
|
+
|
|
45
|
+
/** Standalone skills with mandatory successor invokes (not full orchestrators). */
|
|
46
|
+
export const HANDOFF_SKILLS = ["plan", "work", "review", "compound", "ship"] as const;
|
|
47
|
+
|
|
48
|
+
export type HandoffSkill = (typeof HANDOFF_SKILLS)[number];
|
|
49
|
+
|
|
50
|
+
/** Post-merge production verification — ship Step 3.8, one-shot Step 8 prerequisite. */
|
|
51
|
+
export const POST_MERGE_VERIFICATION_SKILLS = ["postmerge"] as const;
|
|
52
|
+
|
|
53
|
+
/** Emitted only after merge + release workflows + postmerge verification (one-shot Step 8). */
|
|
54
|
+
export const ONE_SHOT_DONE_MARKER = "<promise>DONE</promise>";
|
|
55
|
+
|
|
56
|
+
/** Sentinel markers skills/docs must retain — drift-guarded in tests. */
|
|
57
|
+
export const GO_POST_ROUTE_SENTINEL = "go-post-route";
|
|
58
|
+
export const ONE_SHOT_ANTI_BYPASS_SENTINEL = "one-shot-anti-bypass-protocol";
|
|
59
|
+
export const GROK_PRE_PUSH_GATE_SENTINEL = "grok-pre-push-gate";
|
|
60
|
+
|
|
61
|
+
/** Repo-relative path — run from root before `git push` under Grok Build. */
|
|
62
|
+
export const GROK_PRE_PUSH_GATE_SCRIPT = "plugins/soleur/scripts/grok-pre-push-gate.sh";
|
|
63
|
+
export const BRAINSTORM_ANTI_BYPASS_SENTINEL = "brainstorm-anti-bypass-protocol";
|
|
64
|
+
export const PLAN_ANTI_BYPASS_SENTINEL = "plan-anti-bypass-protocol";
|
|
65
|
+
export const WORK_ANTI_BYPASS_SENTINEL = "work-anti-bypass-protocol";
|
|
66
|
+
export const LIFECYCLE_HANDOFF_SENTINEL = "lifecycle-handoff-protocol";
|
|
67
|
+
export const SHIP_MERGE_DEPLOY_SENTINEL = "ship-merge-deploy-protocol";
|
|
68
|
+
export const POSTMERGE_HARNESS_SENTINEL = "postmerge-harness-protocol";
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Grok has no Skill or Monitor tool. Do not invent matchers for them.
|
|
72
|
+
* Distinct from an untrusted session (no live grok --trust token on the
|
|
73
|
+
* 2026-09-11 host). Drain-prs Grok polling is AwaitShell, not Monitor.
|
|
74
|
+
*/
|
|
75
|
+
export const GROK_HOOK_SKIP_NO_TOOL = "SOLEUR_HOOK_SKIP reason=no-tool";
|
|
76
|
+
export const GROK_HOOK_SKIP_UNTRUSTED = "SOLEUR_HOOK_SKIP reason=untrusted-session";
|
|
77
|
+
|
|
78
|
+
/** Re-export for workflow tests — BEHIND resync lives in pr-merge-poll.ts. */
|
|
79
|
+
export { PR_BEHIND_SYNC_SENTINEL } from "./pr-merge-poll";
|
|
80
|
+
|
|
81
|
+
export function isPipelineSkill(skill: string): skill is PipelineSkill {
|
|
82
|
+
return (PIPELINE_SKILLS as readonly string[]).includes(skill);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function isHandoffSkill(skill: string): skill is HandoffSkill {
|
|
86
|
+
return (HANDOFF_SKILLS as readonly string[]).includes(skill);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Map /go routing labels to soleur skill names (soleur: prefix stripped at dispatch). */
|
|
90
|
+
export const GO_SKILL_ROUTES: Record<string, string> = {
|
|
91
|
+
fix: "one-shot",
|
|
92
|
+
implement: "one-shot",
|
|
93
|
+
drain: "drain-labeled-backlog",
|
|
94
|
+
"drain-prs": "drain-prs",
|
|
95
|
+
review: "review",
|
|
96
|
+
incident: "incident",
|
|
97
|
+
questionnaire: "questionnaire-generate",
|
|
98
|
+
glossary: "kb-glossary",
|
|
99
|
+
default: "brainstorm",
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
export function resolveGoSkillRoute(label: string): string {
|
|
103
|
+
return GO_SKILL_ROUTES[label] ?? GO_SKILL_ROUTES.default;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function isOneShotRoute(label: string): boolean {
|
|
107
|
+
return resolveGoSkillRoute(label) === "one-shot";
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function isBrainstormRoute(label: string): boolean {
|
|
111
|
+
return resolveGoSkillRoute(label) === "brainstorm";
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Mandatory successors when a handoff skill runs standalone (no parent orchestrator). */
|
|
115
|
+
export function mandatorySuccessors(skill: string): readonly string[] {
|
|
116
|
+
switch (skill) {
|
|
117
|
+
case "brainstorm":
|
|
118
|
+
return BRAINSTORM_CHILD_SKILLS;
|
|
119
|
+
case "plan":
|
|
120
|
+
return ["work"];
|
|
121
|
+
case "work":
|
|
122
|
+
return ["review", "compound", "ship"];
|
|
123
|
+
case "review":
|
|
124
|
+
return ["compound"];
|
|
125
|
+
case "compound":
|
|
126
|
+
return ["ship"];
|
|
127
|
+
case "ship":
|
|
128
|
+
return [...POST_MERGE_VERIFICATION_SKILLS];
|
|
129
|
+
default:
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* The operator-typed / adapter-rendered form of one skill on one harness. The cursor
|
|
136
|
+
* arm is `formatSkillRef`-only until `detectHarness` returns `cursor`. `formatSkillInvocation`
|
|
137
|
+
* does not share that arm in slice 1. Docs name skills as `soleur:<name>` and
|
|
138
|
+
* leave THIS to the adapter (ADR-226); every fidelity string below goes through it so no
|
|
139
|
+
* harness receives another harness's form (arch F3, #8299).
|
|
140
|
+
*/
|
|
141
|
+
export function formatSkillRef(skill: string, harness: Harness): string {
|
|
142
|
+
switch (harness) {
|
|
143
|
+
case "codex":
|
|
144
|
+
return `$soleur:${skill}`;
|
|
145
|
+
case "grok":
|
|
146
|
+
return `/${skill}`;
|
|
147
|
+
case "devin":
|
|
148
|
+
return `/soleur:${skill}`;
|
|
149
|
+
case "antigravity":
|
|
150
|
+
return `/soleur:${skill}`;
|
|
151
|
+
case "cursor":
|
|
152
|
+
return cursorSkillSlash(skill);
|
|
153
|
+
case "opencode":
|
|
154
|
+
// The bare id is OpenCode's registration key (measurements §2.3): it has no namespaced form.
|
|
155
|
+
return skill;
|
|
156
|
+
default:
|
|
157
|
+
return `soleur:${skill}`;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* The declared TRANSITION set — every edge a session may legally take, including
|
|
163
|
+
* back-edges.
|
|
164
|
+
*
|
|
165
|
+
* DELIBERATELY SEPARATE FROM `mandatorySuccessors()`, which is not a transition
|
|
166
|
+
* set: its result is rendered into the prompt as
|
|
167
|
+
* "When standalone, invoke next: /X, /Y" (see `workflowFidelityInstructions`).
|
|
168
|
+
* A permitted transition is legal-if-taken; a mandatory successor is a directive.
|
|
169
|
+
* Putting `plan` into `work`'s successors to express the `work -> plan` back-edge
|
|
170
|
+
* would instruct the model to re-enter planning after EVERY work run.
|
|
171
|
+
*
|
|
172
|
+
* The four back-edges are operator-approved: `review -> work` (review produced
|
|
173
|
+
* findings that need implementing), `ship -> work` (a pre-merge gate —
|
|
174
|
+
* preflight/QA — failed), `postmerge -> work` (post-merge verification failed;
|
|
175
|
+
* declared 2026-09-19 on #8325 — 7 sessions took it, 5 re-entered
|
|
176
|
+
* `work -> review -> compound -> ship -> postmerge` in full, 2 ended at `work`,
|
|
177
|
+
* none skipped `ship`) and `work -> plan` (implementation invalidated the
|
|
178
|
+
* plan). The first, second and fourth were approved on #8302.
|
|
179
|
+
*
|
|
180
|
+
* `plan -> ship` is deliberately ABSENT. It is the path that lets a session skip
|
|
181
|
+
* `review` entirely, which surfaces only after merge — the operator-facing loss
|
|
182
|
+
* this edge set exists to make visible. Its absence is asserted directly in
|
|
183
|
+
* `workflow-fidelity.test.ts`, because nothing else in the suite would notice if
|
|
184
|
+
* it were added.
|
|
185
|
+
*
|
|
186
|
+
* This is a bundled TypeScript const, NOT a runtime read of
|
|
187
|
+
* `.claude/phase-surface-map.json`. The plugin ships as `./plugins/soleur`
|
|
188
|
+
* (`.claude-plugin/marketplace.json`) and does not carry `.claude/`, so a runtime
|
|
189
|
+
* read returns nothing on a customer install — and `mandatorySuccessors()` would
|
|
190
|
+
* then silently emit no next-step directive at all. The JSON is a derived view
|
|
191
|
+
* kept honest by a parity test; the same reasoning already produced the bundled
|
|
192
|
+
* web copy at `apps/web-platform/server/phase-surface-map.ts`. See ADR-229.
|
|
193
|
+
*/
|
|
194
|
+
export const DECLARED_TRANSITIONS: Readonly<Record<string, readonly string[]>> = {
|
|
195
|
+
brainstorm: ["plan", "one-shot"],
|
|
196
|
+
plan: ["work"],
|
|
197
|
+
work: ["review", "compound", "ship", "plan"],
|
|
198
|
+
review: ["compound", "work"],
|
|
199
|
+
compound: ["ship"],
|
|
200
|
+
ship: ["postmerge", "work"],
|
|
201
|
+
postmerge: ["work"],
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Node skills that another node's SKILL.md invokes as a designed SUB-STEP of
|
|
206
|
+
* its own run, keyed by the invoking node. Each entry names the section that
|
|
207
|
+
* makes the call (pinned per entry by the anchor test in workflow-fidelity.test.ts):
|
|
208
|
+
* - brainstorm: runs `compound` to capture learnings, then hands off to
|
|
209
|
+
* `plan`, so the log shows `brainstorm compound plan` for the handoff.
|
|
210
|
+
* - plan: §Exit Gate step 1 runs `compound` (direct invocation only; in a
|
|
211
|
+
* pipeline the gate is skipped and the entry is simply unused — sound
|
|
212
|
+
* either way, since `plan -> work` is the only pair it can declare).
|
|
213
|
+
* - postmerge: §Phase 6 (Update Issue and Compound) runs `compound`.
|
|
214
|
+
* - ship: §Phase 2 (Capture Learnings) runs `compound` inside ship.
|
|
215
|
+
* §Phase 1.5 (Review Evidence Gate: the missing-evidence option and the
|
|
216
|
+
* `sequential-fallback` re-run) and §Phase 5.5 (Pre-Ship Review Gates ->
|
|
217
|
+
* Code Review Completion Gate) run `review` inside ship. These are
|
|
218
|
+
* interactive arms only; headless aborts instead (PR #8627). The log
|
|
219
|
+
* records starts only, so the classifier collapses ANY review whose
|
|
220
|
+
* previous kept node is ship, whatever invoked it; see ADR-229's
|
|
221
|
+
* 2026-09-23 re-baseline for what that masks.
|
|
222
|
+
* The classifier drops a record whose skill is a sub-step of the PREVIOUS KEPT
|
|
223
|
+
* node before pairing, so `plan compound work` pairs as `plan -> work`. This is
|
|
224
|
+
* NOT an edge: no `K -> compound` edge is declared for any key K, and because
|
|
225
|
+
* the collapse joins K to its NEXT node, `plan compound ship` surfaces as the
|
|
226
|
+
* review skip `plan -> ship` instead of hiding behind the declared
|
|
227
|
+
* `compound -> ship` (#8399). `review: ["compound"]` is the entry the rules
|
|
228
|
+
* below forbid: `compound` is a declared successor of `review`, so the collapse
|
|
229
|
+
* would turn `review compound work` into the declared `review -> work`.
|
|
230
|
+
* Mirrored in .claude/workflow-transitions.json under `sub_steps`
|
|
231
|
+
* (parity-pinned). See ADR-229 (amended 2026-09-21, #8399; 2026-09-23, PR #8627).
|
|
232
|
+
*
|
|
233
|
+
* To add an entry: the key and every value must be DECLARED_TRANSITIONS nodes
|
|
234
|
+
* (a non-node is removed by the classifier's node filter first, so the entry
|
|
235
|
+
* would be dead); a value must not be a declared successor of its key (the
|
|
236
|
+
* collapse would silently delete a declared pair from `pairs`). An entry also
|
|
237
|
+
* hands the value's outgoing edges to the key: any successor of the key that is
|
|
238
|
+
* not a successor of the value becomes a declared pair after the collapse, so
|
|
239
|
+
* measure which pairs vanish before adding one. Edit this const first, then
|
|
240
|
+
* mirror it in the JSON view (and its `_comment` amendment list), then update in
|
|
241
|
+
* the same PR: the exact-set pin, the `ANCHORS` heading list and its heading
|
|
242
|
+
* total in workflow-fidelity.test.ts (a new KEY also moves the view key-set pin
|
|
243
|
+
* there and `LOOP_KEYS` in the classifier suite), a case in
|
|
244
|
+
* scripts/classify-workflow-transitions.test.sh (plus its `MIN_CASES` floor),
|
|
245
|
+
* and ADR-229's Status line, a re-baseline bullet and its Verification counts.
|
|
246
|
+
* Run `bun test plugins/soleur/test/workflow-fidelity.test.ts`.
|
|
247
|
+
*/
|
|
248
|
+
export const DECLARED_SUB_STEPS: Readonly<Record<string, readonly string[]>> = {
|
|
249
|
+
brainstorm: ["compound"],
|
|
250
|
+
plan: ["compound"],
|
|
251
|
+
postmerge: ["compound"],
|
|
252
|
+
ship: ["compound", "review"],
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
/** Edges declared FROM `skill`. Unknown nodes declare nothing. */
|
|
256
|
+
export function declaredTransitions(skill: string): readonly string[] {
|
|
257
|
+
return DECLARED_TRANSITIONS[skill] ?? [];
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/** Whether `from -> to` is a declared edge. */
|
|
261
|
+
export function isDeclaredTransition(from: string, to: string): boolean {
|
|
262
|
+
return declaredTransitions(from).includes(to);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function formatSkillList(skills: readonly string[], harness: Harness): string {
|
|
266
|
+
return skills.map((s) => `\`${formatSkillRef(s, harness)}\``).join(", ");
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Markdown block appended to harness routing instructions.
|
|
271
|
+
* Cite in go.md Step 2.1 (`<!-- workflow-fidelity:block:go-post-route:start -->`).
|
|
272
|
+
*/
|
|
273
|
+
export function workflowFidelityInstructions(harness: Harness): string {
|
|
274
|
+
if (harness === "cursor") {
|
|
275
|
+
return [
|
|
276
|
+
"**Workflow fidelity (Cursor CLI)**",
|
|
277
|
+
"- Read the canonical file the stub names, relative to the plugin root, and follow that file.",
|
|
278
|
+
`- \`${formatSkillRef("go", harness)}\` and \`${formatSkillRef("sync", harness)}\` stay bare. Every other name is prefixed, including \`${formatSkillRef("plan", harness)}\`, \`${formatSkillRef("help", harness)}\`, and \`${formatSkillRef("review", harness)}\`.`,
|
|
279
|
+
"- Slice 1 does not run hooks and does not classify the session as cursor.",
|
|
280
|
+
].join("\n");
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
const invokeSurface =
|
|
284
|
+
harness === "codex"
|
|
285
|
+
? "skill loading (skills.read when available; otherwise read the installed SKILL.md and execute its full workflow)"
|
|
286
|
+
: harness === "grok"
|
|
287
|
+
? "slash command (`/brainstorm`, `/one-shot`, `/plan`, `/work`, `/review`, `/ship`, …)"
|
|
288
|
+
: harness === "antigravity"
|
|
289
|
+
? "slash command or reading SKILL.md (`/soleur:brainstorm`, `/soleur:one-shot`, …)"
|
|
290
|
+
: harness === "claude"
|
|
291
|
+
? "Skill tool (`soleur:<skill>`)"
|
|
292
|
+
: harness === "opencode"
|
|
293
|
+
? "**skill** tool with the bare id (`soleur:plan` → `plan`, `soleur:one-shot` → `one-shot`, …)"
|
|
294
|
+
: "registered skill invocation";
|
|
295
|
+
|
|
296
|
+
const brainstormNext = formatSkillList(BRAINSTORM_CHILD_SKILLS, harness);
|
|
297
|
+
const workTail = formatSkillList(
|
|
298
|
+
["review", "qa", "compound", "ship"] as const,
|
|
299
|
+
harness,
|
|
300
|
+
);
|
|
301
|
+
|
|
302
|
+
const ref = (skill: string): string => `\`${formatSkillRef(skill, harness)}\``;
|
|
303
|
+
const go = ref("go");
|
|
304
|
+
|
|
305
|
+
const nextActionLine =
|
|
306
|
+
harness === "grok"
|
|
307
|
+
? "- After `/go` routes to a pipeline skill (`one-shot`, `brainstorm`, `drain-*`), your **next action** MUST be to Read that skill's SKILL.md in this process and run it to completion (Grok has no nested Skill tool). Forbidden is executing a subset or writing product code before the child skill finishes — not the Read itself."
|
|
308
|
+
: `- After ${go} routes to a pipeline skill (\`one-shot\`, \`brainstorm\`, \`drain-*\`), your **next action** MUST be that skill's ${invokeSurface} — not reading SKILL.md and executing steps selectively.`;
|
|
309
|
+
|
|
310
|
+
const lines = [
|
|
311
|
+
"**Workflow fidelity (never bypass)**",
|
|
312
|
+
nextActionLine,
|
|
313
|
+
`- **FORBIDDEN after routing to \`brainstorm\`:** product code (Write/Edit/Shell); ending after spec/brainstorm doc without handoff. **REQUIRED next:** ${brainstormNext}.`,
|
|
314
|
+
`- **FORBIDDEN after routing to \`one-shot\`:** inline implementation before Steps 1–8 complete; ending after push/draft PR; reporting "done" without \`${ONE_SHOT_DONE_MARKER}\`.`,
|
|
315
|
+
`- **FORBIDDEN on standalone \`plan\` / \`work\`:** implementing or pushing without the mandated successor chain. \`plan\` → ${ref("work")}; \`work\` → ${workTail}.`,
|
|
316
|
+
`- **Merge → deploy (never ask the operator):** after ${ref("ship")} queues merge, YOU poll through release workflows and invoke ${ref("postmerge")} — do not ask "want me to monitor?" or end the turn at MERGED.`,
|
|
317
|
+
`- **Parking finished work is not a hand-off:** a stop is legitimate only for something you cannot clear — an in-flight CI run or agent, authorization for an irreversible production action (\`hr-menu-option-ack-not-prod-write-auth\`), cost/scope, an outward-facing effect, or a genuine requirements fork. Handing a reviewed, green PR back for a merge/review/ship is none of those: \`rf-never-skip-qa-review-before-merging\` requires carrying it to MERGED in-session, and "review-gated" means ${ref("review")} RAN and its findings were fixed, never that a person approves. Claude Code blocks this at its Stop hook; you have no hook, so this line is your copy of the rule.`,
|
|
318
|
+
`- **\`${ONE_SHOT_DONE_MARKER}\` gate:** emit ONLY after merge + release workflows + ${ref("postmerge")} verification complete — not at draft PR, not at merge alone.`,
|
|
319
|
+
`- **Deliverables:** brainstorm = artifacts + handoff; plan = plan file + ${ref("work")}; work/one-shot = **merged PR + healthy deploy**. Draft PRs are checkpoints only.`,
|
|
320
|
+
"- Skill exit summaries (`## Work Phase Complete`, `## Review Phase Complete`) are **continuation gates**, not turn boundaries.",
|
|
321
|
+
];
|
|
322
|
+
|
|
323
|
+
if (harness === "grok") {
|
|
324
|
+
lines.push(
|
|
325
|
+
`- **Before \`git push\`:** run \`bash ${GROK_PRE_PUSH_GATE_SCRIPT}\` from repo root (local CI parity: \`test-all.sh\` + fast required checks + \`grok-fidelity\`). Abort push on non-zero exit; do not wait for CI.`,
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
return lines.join("\n");
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Strengthen skill invocation text for pipeline and handoff skills. Every skill named in the
|
|
334
|
+
* suffix is rendered in the ACTIVE harness's form. `harness` is REQUIRED, not defaulted: a
|
|
335
|
+
* default of "grok" would reproduce the pre-ADR-226 strings (`/postmerge`, `/ship`) for any
|
|
336
|
+
* caller that forgot it — the exact defect this function was changed to remove, and one that
|
|
337
|
+
* would have recurred silently. A required parameter makes forgetting a type error — the grok arm reads exactly as before, and
|
|
338
|
+
* `invokeSkill("ship")` on Codex names `$soleur:postmerge`, never `/postmerge` (arch F3).
|
|
339
|
+
*/
|
|
340
|
+
export function pipelineInvocationSuffix(skill: string, harness: Harness): string {
|
|
341
|
+
const ref = (s: string): string => formatSkillRef(s, harness);
|
|
342
|
+
if (skill === "one-shot") {
|
|
343
|
+
return (
|
|
344
|
+
` Run **all** Steps 0–8 to completion. ` +
|
|
345
|
+
`Do NOT implement product code inline. ` +
|
|
346
|
+
`Poll merge→deploy yourself; invoke ${ref("postmerge")} after ${ref("ship")}. ` +
|
|
347
|
+
`Emit \`${ONE_SHOT_DONE_MARKER}\` only after postmerge completes.`
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
if (skill === "brainstorm") {
|
|
351
|
+
return (
|
|
352
|
+
" Run the full brainstorm pipeline to completion. " +
|
|
353
|
+
"Do NOT write product code. " +
|
|
354
|
+
`Hand off via ${ref("plan")} or ${ref("one-shot")} when exploration is done.`
|
|
355
|
+
);
|
|
356
|
+
}
|
|
357
|
+
if (skill === "plan") {
|
|
358
|
+
return (
|
|
359
|
+
" Run the full plan pipeline. " +
|
|
360
|
+
`Do NOT implement product code inline — invoke ${ref("work")} when the plan artifact is ready.`
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
if (skill === "work") {
|
|
364
|
+
return (
|
|
365
|
+
` Run implementation then the post-work tail (${ref("review")} → ${ref("compound")} → ${ref("ship")} → ${ref("postmerge")}). ` +
|
|
366
|
+
"Do NOT stop after push — merged PR + deploy verification is the deliverable."
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
if (skill === "ship") {
|
|
370
|
+
return (
|
|
371
|
+
` Poll merge and release workflows to completion; invoke ${ref("postmerge")} before cleanup. ` +
|
|
372
|
+
"Do NOT ask the operator to monitor — you own the wait."
|
|
373
|
+
);
|
|
374
|
+
}
|
|
375
|
+
if (skill === "postmerge") {
|
|
376
|
+
return " Run all postmerge phases through Phase 7 report — production health gate.";
|
|
377
|
+
}
|
|
378
|
+
if (isPipelineSkill(skill)) {
|
|
379
|
+
return " Run the skill's full pipeline — do not stop after the first phase.";
|
|
380
|
+
}
|
|
381
|
+
if (isHandoffSkill(skill)) {
|
|
382
|
+
const next = mandatorySuccessors(skill);
|
|
383
|
+
if (next.length > 0) {
|
|
384
|
+
return ` When standalone, invoke next: ${next.map(ref).join(", ")} — do not end the turn at artifacts.`;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return "";
|
|
388
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# Soleur on OpenCode — routing
|
|
2
|
+
|
|
3
|
+
Generated by `scripts/sync-opencode-adapter.ts`. Do not edit by hand.
|
|
4
|
+
|
|
5
|
+
## Skills
|
|
6
|
+
|
|
7
|
+
Soleur skills register from the canonical tree through the `skills` config key, so this
|
|
8
|
+
harness has no generated skill tree. A skill id is the **bare directory basename**
|
|
9
|
+
(`plan`, `one-shot`, `work`): there is no `soleur:` namespace here (measurement §2.3).
|
|
10
|
+
|
|
11
|
+
Canonical Soleur prose is written for Claude Code and says `soleur:<name>`. On this
|
|
12
|
+
harness that prefix is dropped: invoke `soleur:plan` as `plan`. An agent-read document
|
|
13
|
+
keeps the canonical form; an operator-typed or tool-invoked reference is bare.
|
|
14
|
+
|
|
15
|
+
## Agents
|
|
16
|
+
|
|
17
|
+
An agent id is derived from its file path, not from frontmatter `name:`, so
|
|
18
|
+
`soleur:engineering:cto` is spawned as `engineering/cto` (measurement §3.0). Every
|
|
19
|
+
Soleur agent is generated with `mode: subagent`; without that field an agent registers
|
|
20
|
+
as primary and the `subagent` tool cannot reach it.
|
|
21
|
+
|
|
22
|
+
Spawn subagents through the **`subagent`** tool. It takes the path-derived id
|
|
23
|
+
(`engineering/cto`), a one-line `description`, and a complete `prompt` — the child sees
|
|
24
|
+
nothing but that prompt. Foreground waits for the result; `background: true` returns
|
|
25
|
+
immediately and notifies the parent when the child finishes.
|
|
26
|
+
|
|
27
|
+
**Nesting depth is one.** A spawned child must not spawn further children: when a skill's
|
|
28
|
+
step says *the leader spawns X*, the leader is the session that invoked the skill. A child
|
|
29
|
+
that finds it needs a specialist reports back instead of delegating.
|
|
30
|
+
|
|
31
|
+
## Commands
|
|
32
|
+
|
|
33
|
+
`/go`, `/help`, `/sync` and `/version` register from the **config directory's** `commands/`
|
|
34
|
+
(`install-opencode-adapter.ts` copies `opencode/commands/*.md` there). The committed tree's
|
|
35
|
+
`opencode/commands/` is the source the installer copies, not a discovery root. If `/go` is
|
|
36
|
+
absent, the adapter is not installed: run
|
|
37
|
+
`bun "${CLAUDE_PLUGIN_ROOT}/scripts/install-opencode-adapter.ts" --check` (see *Paths and
|
|
38
|
+
entry points* below for the token) — it names what is missing (measurement §4.0).
|
|
39
|
+
|
|
40
|
+
A stub's body carries the literal text `$ARGUMENTS`. OpenCode's docs say the token is
|
|
41
|
+
replaced with the invocation's arguments (§4.0 is docs-sourced, not measured); the stub is
|
|
42
|
+
written on that basis. If the token is still present when the command runs, read it as the
|
|
43
|
+
arguments you were given — the stub's job is to route you, not to parse them.
|
|
44
|
+
|
|
45
|
+
## Paths and entry points
|
|
46
|
+
|
|
47
|
+
Soleur's canonical prose calls scripts as `bash "${CLAUDE_PLUGIN_ROOT}/<path>"`, with the
|
|
48
|
+
token substituted at delivery time on Claude Code. **Nothing on this harness substitutes
|
|
49
|
+
it**, so a copied call reaches the shell with the token expanded to nothing, collapses to a
|
|
50
|
+
workdir-relative path, and surfaces as `source=none verified=false` in the `go` gate rather
|
|
51
|
+
than as anything that looks like a missing variable.
|
|
52
|
+
|
|
53
|
+
The resolved root for this install is the line below — the installer rewrites it when it
|
|
54
|
+
copies this file:
|
|
55
|
+
|
|
56
|
+
__SOLEUR_PLUGIN_ROOT__
|
|
57
|
+
|
|
58
|
+
Before running any canonical `bash` call, type that absolute path in place of the token. It
|
|
59
|
+
is the prefix for every path in the plugin (`skills/`, `agents/`, `commands/`, `hooks/`,
|
|
60
|
+
`scripts/`) and the prefix of the `skills` entry in `opencode.json`, so either source
|
|
61
|
+
disambiguates the other. Do not export or default a variable for it: the value is a literal
|
|
62
|
+
path here. A `subagent` child does not inherit your shell environment, so hand it the
|
|
63
|
+
absolute path in its prompt rather than assuming a variable exists.
|
|
64
|
+
|
|
65
|
+
## Tools
|
|
66
|
+
|
|
67
|
+
Canonical Soleur prose names Claude Code tools. This table is the translation, and the
|
|
68
|
+
property it is held to is that **every** name Soleur's agent-read corpus uses has a row
|
|
69
|
+
here (`test/harness-tool-map.test.ts`). The OpenCode side is the V2 built-in set
|
|
70
|
+
(measurement §12.8); V1 called the shell tool `bash` and V2 calls it `shell`.
|
|
71
|
+
|
|
72
|
+
| Soleur instruction | OpenCode execution |
|
|
73
|
+
| --- | --- |
|
|
74
|
+
| Read / Glob / Grep | `read`, `glob`, `grep` |
|
|
75
|
+
| 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 |
|
|
76
|
+
| Bash / Shell | `shell`. Set `workdir` instead of putting `cd` in the command, `timeout` in milliseconds, and `background: true` for a long-running process |
|
|
77
|
+
| 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 |
|
|
78
|
+
| Task / Agent / spawn_subagent | The `subagent` tool with the path-derived id (`engineering/cto`) |
|
|
79
|
+
| AskUserQuestion | `question` — a real blocking prompt with a free-form answer always available |
|
|
80
|
+
| TodoWrite / TodoRead | No `todo` tool exists. Track the steps in the skill's own Markdown, or in a scratch file in the project |
|
|
81
|
+
| 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 |
|
|
82
|
+
| 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 |
|
|
83
|
+
| 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 |
|
|
84
|
+
| 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 |
|
|
85
|
+
| 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 |
|
|
86
|
+
| NotebookEdit | No equivalent; edit the file with `edit` |
|
|
87
|
+
| Workflow scripts | Translate the orchestration into `subagent` calls; do not execute Claude tool calls as shell JavaScript |
|
|
88
|
+
|
|
89
|
+
A gate with no OpenCode equivalent is stated as unsupported above, never silently
|
|
90
|
+
skipped — the same posture the hook ledger takes. A step that cannot fire must say so.
|
|
91
|
+
|
|
92
|
+
## Hooks and completion
|
|
93
|
+
|
|
94
|
+
The plugin module `plugin.ts` (installed as `<configdir>/plugins/soleur-plugin.ts`) is the hook
|
|
95
|
+
carrier. `.claude/hooks/opencode-dispositions.tsv` is its ledger: one row per canonical
|
|
96
|
+
registration, every row carrying a disposition, so a gate with no equivalent here is
|
|
97
|
+
**reported, never silently skipped**.
|
|
98
|
+
|
|
99
|
+
OpenCode V2 has **no Stop hook**. Every hook surface communicates only by mutating the event
|
|
100
|
+
object it is handed, and `ctx.event.subscribe` is a one-way iterator with no return channel,
|
|
101
|
+
so no hook can defer a stop, force a continuation, or veto a completion. Soleur's completion
|
|
102
|
+
marker is therefore **advisory** on this harness: a session that goes quiet is observed and
|
|
103
|
+
nothing more. The structural checks inside the invoked skill are the contract, and the marker
|
|
104
|
+
is a report, not a gate.
|
|
105
|
+
|
|
106
|
+
The guards are real, and they reuse the canonical scripts unchanged. A shell call is handed to
|
|
107
|
+
`browser-snapshot-credential-guard.sh` and `destructive-command-guard.sh` in the order
|
|
108
|
+
`hooks.json` registers them, and the decision is written onto the permission event: a `deny`
|
|
109
|
+
becomes `effect = "deny"` and a guard's `ask` becomes `effect = "ask"`, a real prompt. The tool
|
|
110
|
+
then reports `permission.rejected` carrying the guard's reason, which the model reads. Neither
|
|
111
|
+
value is downgraded — `deny` blocks, `ask` waits (measurement §12.2).
|
|
112
|
+
|
|
113
|
+
The shell tool's wire name here is **`shell`**, not `bash`; the plugin maps both to Claude's
|
|
114
|
+
`Bash` before handing the call to a guard (measurement §12.1). Code-mode `execute` calls carry
|
|
115
|
+
JavaScript rather than a command and are not decided by the Bash guards — a limitation this
|
|
116
|
+
harness shares with the guard scripts' own input contract.
|
|
117
|
+
|
|
118
|
+
**One canonical gate is absent here, and its consequence is a refusal you cannot talk around.**
|
|
119
|
+
`hooks/operator-stage-approval.sh` is what mints the digest-bound approval receipt a staged
|
|
120
|
+
`--apply` consumes, and no OpenCode surface can both rewrite the command and ask in the same
|
|
121
|
+
decision (ADR-264). So `plugins/soleur/scripts/lib/operator-script.sh`'s `soleur_op_stage_gate`
|
|
122
|
+
finds no receipt and exits **75** (`SOLEUR_BOOTSTRAP_APPROVAL_REQUIRED`). The typed-`yes`
|
|
123
|
+
fallback is gated on `-t 0`/`-t 1` **and** `soleur_op_in_agent_harness`, which recognises only
|
|
124
|
+
`CLAUDECODE`/`CLAUDE_CODE_ENTRYPOINT` — neither is set under OpenCode — so that arm is open
|
|
125
|
+
here whenever the spawned shell has a tty, and a terminal confirmation from an agent is not
|
|
126
|
+
evidence of a person. **No receipt can be minted on this harness**, so a staged `--apply`
|
|
127
|
+
refuses rather than approving. Nothing is approved silently.
|
|
128
|
+
|
|
129
|
+
A degraded hook decision — a shell call whose `workdir` could not be correlated, or a runtime
|
|
130
|
+
with no `tool.execute.before` surface — is announced on stderr **and** written to the event log
|
|
131
|
+
when `SOLEUR_OPENCODE_EVENT_LOG` names a file (its parent directory must exist; unset means no
|
|
132
|
+
log). Whether your terminal surfaces plugin stderr is not something this adapter measured, so
|
|
133
|
+
arm the log when you need certainty. A `shell` call whose `workdir` cannot be used is
|
|
134
|
+
**prompted** rather than run unchecked — the guards still run, against the session directory,
|
|
135
|
+
and only their declining becomes the prompt.
|
|
136
|
+
|
|
137
|
+
The post-compaction re-read is **armed, not guaranteed**, unlike Codex and Devin:
|
|
138
|
+
`ctx.session.hook("compaction")` sets state and the next `ctx.session.hook("context")`
|
|
139
|
+
re-injects the rule corpus plus the re-read directive. §12.3 captured that `context` fire
|
|
140
|
+
once; §14.0 records a later probe where it did **not** fire, unreconciled (#10587). No
|
|
141
|
+
compaction-support claim is published from this. Operationally: after a compaction you
|
|
142
|
+
notice, re-read `AGENTS.rules.md` yourself rather than assuming the injection happened.
|
|
143
|
+
What is not reproduced at all is `compaction-state.sh`'s transcript-bounded window
|
|
144
|
+
bookkeeping, which counts `compact_boundary` records in a Claude Code transcript this
|
|
145
|
+
harness has no equivalent of.
|
|
146
|
+
|
|
147
|
+
## Uninstall / removal
|
|
148
|
+
|
|
149
|
+
There is **no `--uninstall` flag** on `install-opencode-adapter.ts` today (tracked in
|
|
150
|
+
#10591 item 4), so removal is done by hand against the config dir the installer wrote to.
|
|
151
|
+
Four things were created; remove all four, because a partial removal is worse than none:
|
|
152
|
+
|
|
153
|
+
1. **The generated `agents/` and `commands/` stubs.** These directories are **shared** with
|
|
154
|
+
the operator, so delete only the files whose body names the canonical plugin path (the
|
|
155
|
+
stubs' signature) — never the whole directory.
|
|
156
|
+
2. **`<configdir>/soleur/`** — the installed instructions tree.
|
|
157
|
+
3. **`<configdir>/plugins/soleur-plugin.ts`** — the hook carrier. Leaving it behind keeps
|
|
158
|
+
Soleur live after you meant to remove it: it still registers the Bash guards and still
|
|
159
|
+
re-injects the rule corpus on every session. It does **not** fail closed by itself — the
|
|
160
|
+
`guard-did-not-run` deny fires only when a guard *script* cannot be spawned (the checkout
|
|
161
|
+
moved or was removed, or `__SOLEUR_PLUGIN_ROOT__` never resolved), which is a checkout
|
|
162
|
+
problem rather than a leftover-file one.
|
|
163
|
+
4. **The `skills` and `instructions` entries the installer added to `<configdir>/opencode.json`.**
|
|
164
|
+
Edit the file and drop those two keys; leaving them behind points OpenCode at a tree that
|
|
165
|
+
no longer exists.
|
|
166
|
+
|
|
167
|
+
Do **not** use `install-opencode-adapter.ts --check` to confirm removal. It is an
|
|
168
|
+
idempotence check for an *installed* adapter: it reports `MISSING` for every path it expects
|
|
169
|
+
and exits 1, so a correct removal is indistinguishable from a broken install. Verify by hand
|
|
170
|
+
instead — the four paths above are absent, and a fresh OpenCode session no longer
|
|
171
|
+
re-injects the Soleur rule corpus or emits a `[soleur] guard-run-failure` line.
|